- agents.spec.ts: rewritten around the new surface — wizard starting
points (blank / import / template), template prefill and submit,
duplicate prefill, agent card actions menu, team creation with agent
members, and the inactive-persona / team-referenced-persona guards via
the mock bridge
- mesh-compute.spec.ts, smoke.spec.ts: replace the retired
"New agent > Custom agent" menu path with the wizard's blank starting
point; the system prompt now fills the top-level agent-instructions
field instead of the Advanced section
- persona-env-vars.spec.ts: env-vars editor and model/provider tests
target the create-agent form (agent-runtime / agent-llm-provider ids)
- onboarding.spec.ts: the Fizz welcome guide is identified by name — no
persona_id backing record anymore
- config-bridge-screenshots.spec.ts: provenance copy is now
"Inherited from agent profile"
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Agents are now the only concept users touch. Persona records remain a
pack-internal primitive; nothing in the UI creates, lists, or edits them.
- Agents grid: UnifiedAgentsSection renders one card per managed agent in
a single flat grid with a new AgentActionsMenu (Edit, Duplicate, Add to
channel, Export, Remove). Persona-keyed grouping, persona cards, and
the persona profile-panel path are deleted (unifiedAgentGroups,
AgentGroupRows, ManagedAgentRow, PersonaActionsMenu, PersonaIdentity,
PersonaCatalog*, PersonaLibraryEntryPoints, usePersonaActions, and the
persona dialog state helpers)
- Create Agent wizard: new CreateAgentStartDialog (blank, built-in
template, or import from file) hands an AgentDraft to CreateAgentDialog;
submit only creates a managed agent — no persona record. PersonaDialog
is gone; batch import creates agents directly; the system prompt is a
top-level "Agent instructions" field with model/provider fields shared
via AgentModelProviderFields
- Duplicate opens the wizard prefilled from the source agent record's
pinned fields (prompt, model, provider, env vars, avatar, runtime)
- Teams: TeamDialog picks managed agents and stores pubkeys via the
unified TeamCardMember model (pack persona members render read-only);
TeamsSection, import/export, and AddTeamToChannelDialog resolve members
from agent_pubkeys plus pack persona_ids, deploying pack personas
through the existing persona path
- Channel deploy: AddChannelBotDialog lists managed agents
(AddChannelBotAgentsSection + useInChannelAgentPubkeys) and attaches
existing agents instead of spawning persona instances; QuickBotBar and
the persona section/runtime-override helpers are deleted. The dialog
also prevents open-autofocus: focus landing on the first agent chip
opened its tooltip, so the first Escape dismissed the tooltip layer
instead of closing the dialog
- Sharing: PersonaShareDialog, catalog-visibility localStorage, and the
standalone catalog dialog are removed — Export in the card menu is the
sharing path
- Copy sweep: remaining user-visible "persona" strings renamed (config
provenance is "Inherited from agent profile", delete/import/toast copy,
ModelPicker, EnvVarsEditor); profile panel actions are agent-centric
and the profilePersona route param is gone; channel templates resolve
agent pubkeys, persona ids, or builtin template ids polymorphically;
the Fizz welcome guide spawns from its AgentTemplate
- shared/api: AgentTemplate type, agentPubkeys on team types, provider on
CreateManagedAgentInput, listAgentTemplates/exportAgentToJson bindings;
e2eBridge mocks the new surface for the Playwright suites; colocated
unit tests (.test.mjs) updated alongside their sources
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Backend half of removing personas from the UI. User-created agents no
longer have a backing persona record; persona records are quarantined to
team packs, which genuinely need them for directory install/sync and
writeback.
- types.rs, team_events.rs: add agent_pubkeys to TeamRecord, the
create/update team inputs, and the kind:30176 payload. The field is
additive — events published by older clients parse with empty agent
membership (round-trip and tolerance tests included)
- commands/teams.rs: normalize and validate agent pubkeys on team
create/update; team export resolves agent members into the interchange
member shape alongside persona members; pack install/sync materialize
pack personas as stopped agents so they appear in the grid immediately
- commands/personas/mod.rs: inbound kind:30176 reconcile applies
agent_pubkeys from remote events
- managed_agents/flatten.rs (new): idempotent boot migration —
materialize a stopped agent for every active persona without one,
rewrite non-pack team persona members to agent pubkeys, pin persona
config onto linked agents and clear persona_id, then deactivate the
flattened non-pack personas (records stay on disk/relay for rollback).
flatten_tests.rs covers materialization, team rewrite, pack
quarantine, and re-run idempotency
- managed_agents/personas.rs: stop seeding built-in personas as records;
the same data is now a static AgentTemplate list, and merge_personas
only demotes stale is_builtin flags
- commands/agent_templates.rs (new): list_agent_templates and
export_agent_to_json — agent-record export to the .persona.json
interchange format (env vars excluded, matching persona export)
- commands/agents.rs: create_managed_agent accepts an explicit provider
so templates and duplicates can pin the LLM provider at create time
- lib.rs: run the flatten migration post-identity, before event sync, so
rewritten teams/personas are what get reconciled and published;
register the new template commands
- team_repair.rs, personas/writeback.rs, inbound_tests.rs,
personas/tests.rs: fixtures and merge-semantics tests updated for the
new fields and the removal of built-in seeding; the shared test UUID
constant avoids a digit run the secret scanner reads as a card number
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
These predate the agents-first work but fail desktop-tauri-clippy
(-D warnings) and therefore block `just ci`, so they land first as a
standalone mechanical cleanup.
- agent_models.rs: drop the vestigial preserve_first_separator parameter
from title_case_model_suffix — both branches were identical
(if_same_then_else)
- config_bridge/claude.rs: build RuntimeFileConfig via struct-literal
init in the test helper (field_reassign_with_default)
- config_bridge/reader.rs: annotate build_model_field with
too_many_arguments and resolve_with_override with type_complexity —
pre-existing shapes, allowed rather than refactored to keep this
change mechanical
- runtime.rs: use slice::contains instead of iter().any
(manual_contains)
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>