@getpaseo/server 0.1.97 → 0.1.99

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dist/server/server/agent/agent-manager.d.ts +11 -3
  2. package/dist/server/server/agent/agent-manager.js +96 -24
  3. package/dist/server/server/agent/agent-prompt.d.ts +1 -1
  4. package/dist/server/server/agent/agent-prompt.js +3 -10
  5. package/dist/server/server/agent/agent-sdk-types.d.ts +20 -9
  6. package/dist/server/server/agent/create-agent/create.d.ts +2 -0
  7. package/dist/server/server/agent/create-agent/create.js +8 -7
  8. package/dist/server/server/agent/lifecycle-command.d.ts +15 -1
  9. package/dist/server/server/agent/lifecycle-command.js +9 -2
  10. package/dist/server/server/agent/mcp-server.js +254 -115
  11. package/dist/server/server/agent/provider-notices.d.ts +3 -0
  12. package/dist/server/server/agent/provider-notices.js +5 -0
  13. package/dist/server/server/agent/provider-registry.d.ts +8 -3
  14. package/dist/server/server/agent/provider-registry.js +58 -25
  15. package/dist/server/server/agent/provider-snapshot-manager.d.ts +3 -0
  16. package/dist/server/server/agent/provider-snapshot-manager.js +37 -16
  17. package/dist/server/server/agent/providers/acp-agent.d.ts +5 -3
  18. package/dist/server/server/agent/providers/acp-agent.js +32 -19
  19. package/dist/server/server/agent/providers/claude/agent.d.ts +2 -2
  20. package/dist/server/server/agent/providers/claude/agent.js +261 -167
  21. package/dist/server/server/agent/providers/claude/models.js +7 -3
  22. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +6 -4
  23. package/dist/server/server/agent/providers/codex-app-server-agent.js +48 -25
  24. package/dist/server/server/agent/providers/copilot-acp-agent.js +4 -31
  25. package/dist/server/server/agent/providers/diagnostic-utils.d.ts +9 -0
  26. package/dist/server/server/agent/providers/diagnostic-utils.js +188 -0
  27. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +0 -1
  28. package/dist/server/server/agent/providers/generic-acp-agent.js +2 -108
  29. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts +2 -3
  30. package/dist/server/server/agent/providers/mock-load-test-agent.js +5 -5
  31. package/dist/server/server/agent/providers/mock-slow-provider.d.ts +2 -3
  32. package/dist/server/server/agent/providers/mock-slow-provider.js +3 -6
  33. package/dist/server/server/agent/providers/opencode/server-manager.d.ts +29 -2
  34. package/dist/server/server/agent/providers/opencode/server-manager.js +83 -17
  35. package/dist/server/server/agent/providers/opencode-agent.d.ts +6 -3
  36. package/dist/server/server/agent/providers/opencode-agent.js +61 -107
  37. package/dist/server/server/agent/providers/pi/agent.d.ts +2 -3
  38. package/dist/server/server/agent/providers/pi/agent.js +11 -63
  39. package/dist/server/server/agent/providers/pi/cli-runtime.js +2 -2
  40. package/dist/server/server/agent/providers/pi/runtime.d.ts +1 -1
  41. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.d.ts +1 -1
  42. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.js +1 -1
  43. package/dist/server/server/bootstrap.d.ts +2 -0
  44. package/dist/server/server/bootstrap.js +32 -2
  45. package/dist/server/server/managed-processes/managed-processes.d.ts +76 -0
  46. package/dist/server/server/managed-processes/managed-processes.js +326 -0
  47. package/dist/server/server/resolve-worktree-creation-intent.d.ts +3 -0
  48. package/dist/server/server/resolve-worktree-creation-intent.js +3 -3
  49. package/dist/server/server/session/agent-config/agent-config-session.d.ts +50 -0
  50. package/dist/server/server/session/agent-config/agent-config-session.js +98 -0
  51. package/dist/server/server/session/chat/chat-schedule-loop-session.d.ts +120 -0
  52. package/dist/server/server/session/chat/chat-schedule-loop-session.js +489 -0
  53. package/dist/server/server/session/checkout/checkout-session.d.ts +142 -0
  54. package/dist/server/server/session/checkout/checkout-session.js +925 -0
  55. package/dist/server/server/session/daemon/daemon-session.d.ts +50 -0
  56. package/dist/server/server/session/daemon/daemon-session.js +98 -0
  57. package/dist/server/server/session/files/workspace-files-session.d.ts +43 -0
  58. package/dist/server/server/session/files/workspace-files-session.js +218 -0
  59. package/dist/server/server/session/project-config/project-config-session.d.ts +34 -0
  60. package/dist/server/server/session/project-config/project-config-session.js +125 -0
  61. package/dist/server/server/session/provider/provider-catalog-session.d.ts +74 -0
  62. package/dist/server/server/session/provider/provider-catalog-session.js +339 -0
  63. package/dist/server/server/session/voice/voice-session.d.ts +166 -0
  64. package/dist/server/server/session/voice/voice-session.js +893 -0
  65. package/dist/server/server/{voice → session/voice}/voice-turn-controller.d.ts +2 -2
  66. package/dist/server/server/{voice → session/voice}/voice-turn-controller.js +2 -2
  67. package/dist/server/server/session.d.ts +23 -207
  68. package/dist/server/server/session.js +2319 -5102
  69. package/dist/server/server/speech/providers/openai/runtime.js +3 -4
  70. package/dist/server/server/websocket-server.d.ts +1 -0
  71. package/dist/server/server/websocket-server.js +11 -0
  72. package/dist/server/server/workspace-archive-service.js +2 -3
  73. package/dist/server/server/workspace-directory.js +5 -5
  74. package/dist/server/server/workspace-reconciliation-service.js +2 -2
  75. package/dist/server/server/worktree-core.d.ts +1 -0
  76. package/dist/server/server/worktree-core.js +5 -1
  77. package/dist/server/services/quota-fetcher/manifest.d.ts +4 -0
  78. package/dist/server/services/quota-fetcher/manifest.js +47 -0
  79. package/dist/server/services/quota-fetcher/provider.d.ts +17 -0
  80. package/dist/server/services/quota-fetcher/provider.js +2 -0
  81. package/dist/server/services/quota-fetcher/providers/claude.d.ts +26 -0
  82. package/dist/server/services/quota-fetcher/providers/claude.js +217 -0
  83. package/dist/server/services/quota-fetcher/providers/codex.d.ts +23 -0
  84. package/dist/server/services/quota-fetcher/providers/codex.js +211 -0
  85. package/dist/server/services/quota-fetcher/providers/copilot.d.ts +17 -0
  86. package/dist/server/services/quota-fetcher/providers/copilot.js +75 -0
  87. package/dist/server/services/quota-fetcher/providers/cursor.d.ts +17 -0
  88. package/dist/server/services/quota-fetcher/providers/cursor.js +123 -0
  89. package/dist/server/services/quota-fetcher/providers/grok.d.ts +18 -0
  90. package/dist/server/services/quota-fetcher/providers/grok.js +89 -0
  91. package/dist/server/services/quota-fetcher/providers/kimi.d.ts +20 -0
  92. package/dist/server/services/quota-fetcher/providers/kimi.js +89 -0
  93. package/dist/server/services/quota-fetcher/providers/zai.d.ts +17 -0
  94. package/dist/server/services/quota-fetcher/providers/zai.js +58 -0
  95. package/dist/server/services/quota-fetcher/service.d.ts +28 -0
  96. package/dist/server/services/quota-fetcher/service.js +58 -0
  97. package/dist/server/services/quota-fetcher/usage.d.ts +22 -0
  98. package/dist/server/services/quota-fetcher/usage.js +49 -0
  99. package/dist/server/utils/checkout-git.d.ts +6 -0
  100. package/dist/server/utils/directory-suggestions.js +98 -2
  101. package/package.json +5 -5
@@ -1,7 +1,7 @@
1
1
  import { AGENT_LIFECYCLE_STATUSES, type AgentLifecycleStatus } from "@getpaseo/protocol/agent-lifecycle";
2
2
  import type { Logger } from "pino";
3
3
  import type { TerminalManager } from "../../terminal/terminal-manager.js";
4
- import { type AgentCapabilityFlags, type AgentClient, type AgentFeature, type AgentSlashCommand, type AgentMode, type AgentPermissionRequest, type AgentPermissionResponse, type AgentPermissionResult, type AgentPersistenceHandle, type AgentPromptInput, type AgentProvider, type AgentRunOptions, type AgentRunResult, type AgentSession, type AgentSessionConfig, type AgentStreamEvent, type AgentTimelineItem, type AgentUsage, type AgentRuntimeInfo, type ImportableProviderSession, type ListImportableSessionsOptions } from "./agent-sdk-types.js";
4
+ import { type AgentCapabilityFlags, type AgentClient, type AgentFeature, type AgentSlashCommand, type AgentMode, type AgentPermissionRequest, type AgentPermissionResponse, type AgentPermissionResult, type AgentPersistenceHandle, type AgentProviderNotice, type AgentPromptInput, type AgentProvider, type AgentRunOptions, type AgentRunResult, type AgentSession, type AgentSessionConfig, type AgentStreamEvent, type AgentTimelineItem, type AgentUsage, type AgentRuntimeInfo, type ImportableProviderSession, type ListImportableSessionsOptions } from "./agent-sdk-types.js";
5
5
  import type { StoredAgentRecord, AgentStorage } from "./agent-storage.js";
6
6
  import type { AgentTimelineFetchOptions, AgentTimelineFetchResult, AgentTimelineRow, AgentTimelineStore } from "./agent-timeline-store-types.js";
7
7
  import { type ForegroundTurnWaiter } from "./foreground-run-state.js";
@@ -266,12 +266,19 @@ export declare class AgentManager {
266
266
  private markRecordArchived;
267
267
  private fireAgentArchived;
268
268
  private dispatchArchivedStoredAgent;
269
- setAgentMode(agentId: string, modeId: string): Promise<void>;
269
+ setAgentMode(agentId: string, modeId: string): Promise<AgentProviderNotice | null>;
270
270
  setAgentModel(agentId: string, modelId: string | null): Promise<void>;
271
- setAgentThinkingOption(agentId: string, thinkingOptionId: string | null): Promise<void>;
271
+ setAgentThinkingOption(agentId: string, thinkingOptionId: string | null): Promise<AgentProviderNotice | null>;
272
272
  setAgentFeature(agentId: string, featureId: string, value: unknown): Promise<void>;
273
273
  setTitle(agentId: string, title: string): Promise<void>;
274
274
  setLabels(agentId: string, labels: Record<string, string>): Promise<void>;
275
+ private writeLabels;
276
+ private writeStoredMetadata;
277
+ detachAgent(agentId: string): Promise<{
278
+ record: StoredAgentRecord;
279
+ live: boolean;
280
+ previousParentAgentId: string | null;
281
+ }>;
275
282
  notifyAgentState(agentId: string): void;
276
283
  clearAgentAttention(agentId: string): Promise<void>;
277
284
  archiveSnapshot(agentId: string, archivedAt: string): Promise<StoredAgentRecord>;
@@ -373,6 +380,7 @@ export declare class AgentManager {
373
380
  private getConfiguredProviderIds;
374
381
  private requireClient;
375
382
  archiveNativeSessionBestEffort(provider: AgentProvider, persistence: AgentPersistenceHandle | null | undefined): Promise<void>;
383
+ private unarchiveNativeSession;
376
384
  private requireAgent;
377
385
  private requireSessionAgent;
378
386
  }
@@ -2,7 +2,7 @@ import { randomUUID } from "node:crypto";
2
2
  import { resolve } from "node:path";
3
3
  import { stat } from "node:fs/promises";
4
4
  import { AGENT_LIFECYCLE_STATUSES, } from "@getpaseo/protocol/agent-lifecycle";
5
- import { isDelegatedAgent, PARENT_AGENT_ID_LABEL } from "@getpaseo/protocol/agent-labels";
5
+ import { getParentAgentIdFromLabels, isDelegatedAgent, PARENT_AGENT_ID_LABEL, } from "@getpaseo/protocol/agent-labels";
6
6
  import { z } from "zod";
7
7
  import { getAgentStreamEventTurnId, } from "./agent-sdk-types.js";
8
8
  import { buildArchivedAgentRecord } from "./agent-archive.js";
@@ -109,6 +109,18 @@ function validateAgentId(agentId, source) {
109
109
  }
110
110
  return result.data;
111
111
  }
112
+ function applyLabelPatch(labels, patch) {
113
+ const nextLabels = { ...labels };
114
+ for (const [key, value] of Object.entries(patch)) {
115
+ if (value === null) {
116
+ delete nextLabels[key];
117
+ }
118
+ else {
119
+ nextLabels[key] = value;
120
+ }
121
+ }
122
+ return nextLabels;
123
+ }
112
124
  function buildExplicitTimelineSeedForRegister(now, options) {
113
125
  const hasTimeline = Boolean(options?.timeline?.length);
114
126
  const hasTimelineRows = Boolean(options?.timelineRows?.length);
@@ -676,9 +688,8 @@ export class AgentManager {
676
688
  }
677
689
  // Children created via the MCP `create_agent` tool carry the parent-agent-id
678
690
  // label pointing back at the caller. Archiving the parent cascades to those
679
- // children so subagent fleets don't outlive their orchestrator. Handoff agents
680
- // launched the same way are caught by this cascade see docs/agent-lifecycle.md
681
- // for the accepted limitation.
691
+ // children so subagent fleets don't outlive their orchestrator. Detached
692
+ // handoff agents omit this label, so they stand outside the cascade.
682
693
  async cascadeArchiveChildren(parentAgentId) {
683
694
  const registry = this.registry;
684
695
  if (!registry) {
@@ -768,7 +779,7 @@ export class AgentManager {
768
779
  }
769
780
  async setAgentMode(agentId, modeId) {
770
781
  const agent = this.requireSessionAgent(agentId);
771
- await agent.session.setMode(modeId);
782
+ const notice = (await agent.session.setMode(modeId)) ?? null;
772
783
  const currentMode = (await agent.session.getCurrentMode()) ?? modeId;
773
784
  agent.config.modeId = currentMode ?? undefined;
774
785
  agent.currentModeId = currentMode;
@@ -778,6 +789,7 @@ export class AgentManager {
778
789
  }
779
790
  this.touchUpdatedAt(agent);
780
791
  this.emitState(agent);
792
+ return notice;
781
793
  }
782
794
  async setAgentModel(agentId, modelId) {
783
795
  const agent = this.requireSessionAgent(agentId);
@@ -797,8 +809,9 @@ export class AgentManager {
797
809
  const normalizedThinkingOptionId = typeof thinkingOptionId === "string" && thinkingOptionId.trim().length > 0
798
810
  ? thinkingOptionId
799
811
  : null;
812
+ let notice = null;
800
813
  if (agent.session.setThinkingOption) {
801
- await agent.session.setThinkingOption(normalizedThinkingOptionId);
814
+ notice = (await agent.session.setThinkingOption(normalizedThinkingOptionId)) ?? null;
802
815
  }
803
816
  agent.config.thinkingOptionId = normalizedThinkingOptionId ?? undefined;
804
817
  if (agent.runtimeInfo) {
@@ -809,6 +822,7 @@ export class AgentManager {
809
822
  }
810
823
  this.touchUpdatedAt(agent);
811
824
  this.emitState(agent);
825
+ return notice;
812
826
  }
813
827
  async setAgentFeature(agentId, featureId, value) {
814
828
  const agent = this.requireAgent(agentId);
@@ -837,10 +851,68 @@ export class AgentManager {
837
851
  }
838
852
  async setLabels(agentId, labels) {
839
853
  const agent = this.requireAgent(agentId);
840
- agent.labels = { ...agent.labels, ...labels };
841
- this.touchUpdatedAt(agent);
842
- await this.persistSnapshot(agent);
843
- this.emitState(agent, { persist: false });
854
+ await this.writeLabels(agent.id, labels);
855
+ }
856
+ async writeLabels(agentId, patch) {
857
+ const liveAgent = this.agents.get(agentId);
858
+ if (liveAgent) {
859
+ liveAgent.labels = applyLabelPatch(liveAgent.labels, patch);
860
+ this.touchUpdatedAt(liveAgent);
861
+ await this.persistSnapshot(liveAgent);
862
+ this.emitState(liveAgent, { persist: false });
863
+ const record = this.registry ? await this.registry.get(agentId) : null;
864
+ return { record, live: true };
865
+ }
866
+ const nextRecord = await this.writeStoredMetadata(agentId, { labels: patch });
867
+ return { record: nextRecord, live: false };
868
+ }
869
+ async writeStoredMetadata(agentId, patch) {
870
+ const registry = this.requireRegistry();
871
+ const record = await registry.get(agentId);
872
+ if (!record) {
873
+ throw new Error(`Agent not found: ${agentId}`);
874
+ }
875
+ const nextRecord = {
876
+ ...record,
877
+ ...(patch.title ? { title: patch.title } : {}),
878
+ ...(patch.labels ? { labels: applyLabelPatch(record.labels, patch.labels) } : {}),
879
+ updatedAt: this.nextStoredUpdatedAt(record),
880
+ };
881
+ await registry.upsert(nextRecord);
882
+ return nextRecord;
883
+ }
884
+ async detachAgent(agentId) {
885
+ const registry = this.requireRegistry();
886
+ const liveAgent = this.agents.get(agentId);
887
+ if (liveAgent) {
888
+ const previousParentAgentId = getParentAgentIdFromLabels(liveAgent.labels);
889
+ if (!previousParentAgentId) {
890
+ await this.persistSnapshot(liveAgent);
891
+ const record = await registry.get(agentId);
892
+ if (!record) {
893
+ throw new Error(`Agent not found in storage after detach: ${agentId}`);
894
+ }
895
+ return { record, live: true, previousParentAgentId: null };
896
+ }
897
+ const { record } = await this.writeLabels(agentId, { [PARENT_AGENT_ID_LABEL]: null });
898
+ if (!record) {
899
+ throw new Error(`Agent not found in storage after detach: ${agentId}`);
900
+ }
901
+ return { record, live: true, previousParentAgentId };
902
+ }
903
+ const record = await registry.get(agentId);
904
+ if (!record) {
905
+ throw new Error(`Agent not found: ${agentId}`);
906
+ }
907
+ const previousParentAgentId = getParentAgentIdFromLabels(record.labels);
908
+ if (!previousParentAgentId) {
909
+ return { record, live: false, previousParentAgentId: null };
910
+ }
911
+ const result = await this.writeLabels(agentId, { [PARENT_AGENT_ID_LABEL]: null });
912
+ if (!result.record) {
913
+ throw new Error(`Agent not found in storage after detach: ${agentId}`);
914
+ }
915
+ return { record: result.record, live: false, previousParentAgentId };
844
916
  }
845
917
  notifyAgentState(agentId) {
846
918
  const agent = this.agents.get(agentId);
@@ -888,9 +960,11 @@ export class AgentManager {
888
960
  if (!record || !record.archivedAt) {
889
961
  return false;
890
962
  }
963
+ await this.unarchiveNativeSession(record.provider, record.persistence);
891
964
  await registry.upsert({
892
965
  ...record,
893
966
  archivedAt: null,
967
+ updatedAt: new Date().toISOString(),
894
968
  });
895
969
  if (this.getAgent(agentId)) {
896
970
  this.notifyAgentState(agentId);
@@ -914,21 +988,11 @@ export class AgentManager {
914
988
  await this.setTitle(agentId, updates.title);
915
989
  }
916
990
  if (updates.labels) {
917
- await this.setLabels(agentId, updates.labels);
991
+ await this.writeLabels(agentId, updates.labels);
918
992
  }
919
993
  return;
920
994
  }
921
- const registry = this.requireRegistry();
922
- const existing = await registry.get(agentId);
923
- if (!existing) {
924
- throw new Error(`Agent not found: ${agentId}`);
925
- }
926
- await registry.upsert({
927
- ...existing,
928
- ...(updates.title ? { title: updates.title } : {}),
929
- ...(updates.labels ? { labels: { ...existing.labels, ...updates.labels } } : {}),
930
- updatedAt: this.nextStoredUpdatedAt(existing),
931
- });
995
+ await this.writeStoredMetadata(agentId, updates);
932
996
  }
933
997
  async runAgent(agentId, prompt, options) {
934
998
  const events = this.streamAgent(agentId, prompt, options);
@@ -2516,8 +2580,8 @@ export class AgentManager {
2516
2580
  const client = this.clients.get(normalized.provider);
2517
2581
  if (client) {
2518
2582
  try {
2519
- const models = await client.listModels({ cwd: normalized.cwd, force: false });
2520
- const defaultModel = models.find((model) => model.isDefault) ?? models[0];
2583
+ const catalog = await client.fetchCatalog({ cwd: normalized.cwd, force: false });
2584
+ const defaultModel = catalog.models.find((model) => model.isDefault) ?? catalog.models[0];
2521
2585
  if (defaultModel) {
2522
2586
  normalized.model = defaultModel.id;
2523
2587
  }
@@ -2619,6 +2683,14 @@ export class AgentManager {
2619
2683
  this.logger.warn({ error, provider, sessionId: persistence.sessionId }, "Failed to archive native session (best-effort)");
2620
2684
  }
2621
2685
  }
2686
+ async unarchiveNativeSession(provider, persistence) {
2687
+ if (!persistence)
2688
+ return;
2689
+ const client = this.clients.get(provider);
2690
+ if (!client?.unarchiveNativeSession)
2691
+ return;
2692
+ await client.unarchiveNativeSession(persistence);
2693
+ }
2622
2694
  requireAgent(id) {
2623
2695
  const normalizedId = validateAgentId(id, "requireAgent");
2624
2696
  const agent = this.agents.get(normalizedId);
@@ -15,7 +15,7 @@ export declare function startAgentRun(agentManager: AgentRunController, agentId:
15
15
  * Shared across Session (app/WS), MCP, and CLI so every surface that acts on
16
16
  * an archived agent unarchives it the same way.
17
17
  */
18
- export declare function unarchiveAgentState(agentStorage: AgentStorage, agentManager: AgentManager, agentId: string): Promise<boolean>;
18
+ export declare function unarchiveAgentState(_agentStorage: AgentStorage, agentManager: AgentManager, agentId: string): Promise<boolean>;
19
19
  /**
20
20
  * Wrap a body in <paseo-system>…</paseo-system> so the receiving agent
21
21
  * recognizes the prompt as system-injected context — not a user turn.
@@ -55,17 +55,10 @@ export function startAgentRun(agentManager, agentId, prompt, logger, options) {
55
55
  * Shared across Session (app/WS), MCP, and CLI so every surface that acts on
56
56
  * an archived agent unarchives it the same way.
57
57
  */
58
- export async function unarchiveAgentState(agentStorage, agentManager, agentId) {
59
- const record = await agentStorage.get(agentId);
60
- if (!record || !record.archivedAt) {
58
+ export async function unarchiveAgentState(_agentStorage, agentManager, agentId) {
59
+ const unarchived = await agentManager.unarchiveSnapshot(agentId);
60
+ if (!unarchived)
61
61
  return false;
62
- }
63
- const updatedAt = new Date().toISOString();
64
- await agentStorage.upsert({
65
- ...record,
66
- archivedAt: null,
67
- updatedAt,
68
- });
69
62
  agentManager.notifyAgentState(agentId);
70
63
  return true;
71
64
  }
@@ -1,5 +1,7 @@
1
1
  import type { Options as ClaudeAgentOptions } from "@anthropic-ai/claude-agent-sdk";
2
+ import type { AgentProviderNotice } from "@getpaseo/protocol/agent-types";
2
3
  import type { AgentAttachment } from "@getpaseo/protocol/messages";
4
+ export type { AgentProviderNotice };
3
5
  export type AgentProvider = string;
4
6
  export interface AgentMetadata {
5
7
  [key: string]: unknown;
@@ -543,7 +545,7 @@ export interface AgentSession {
543
545
  getRuntimeInfo(): Promise<AgentRuntimeInfo>;
544
546
  getAvailableModes(): Promise<AgentMode[]>;
545
547
  getCurrentMode(): Promise<string | null>;
546
- setMode(modeId: string): Promise<void>;
548
+ setMode(modeId: string): Promise<void | AgentProviderNotice>;
547
549
  getPendingPermissions(): AgentPermissionRequest[];
548
550
  respondToPermission(requestId: string, response: AgentPermissionResponse): Promise<AgentPermissionResult | void>;
549
551
  describePersistence(): AgentPersistenceHandle | null;
@@ -551,7 +553,7 @@ export interface AgentSession {
551
553
  close(): Promise<void>;
552
554
  listCommands?(): Promise<AgentSlashCommand[]>;
553
555
  setModel?(modelId: string | null): Promise<void>;
554
- setThinkingOption?(thinkingOptionId: string | null): Promise<void>;
556
+ setThinkingOption?(thinkingOptionId: string | null): Promise<void | AgentProviderNotice>;
555
557
  setFeature?(featureId: string, value: unknown): Promise<void>;
556
558
  revertConversation?(input: {
557
559
  messageId: string;
@@ -576,21 +578,26 @@ export interface AgentSession {
576
578
  }): Promise<void>;
577
579
  } | null;
578
580
  }
579
- export interface ListModelsOptions {
581
+ export interface FetchCatalogOptions {
580
582
  cwd: string;
581
583
  force: boolean;
582
584
  }
583
- export interface ListModesOptions {
584
- cwd: string;
585
- force: boolean;
585
+ export interface ProviderCatalog {
586
+ models: AgentModelDefinition[];
587
+ modes: AgentMode[];
586
588
  }
587
589
  export interface AgentClient {
588
590
  readonly provider: AgentProvider;
589
591
  readonly capabilities: AgentCapabilityFlags;
590
592
  createSession(config: AgentSessionConfig, launchContext?: AgentLaunchContext, options?: AgentCreateSessionOptions): Promise<AgentSession>;
591
593
  resumeSession(handle: AgentPersistenceHandle, overrides?: Partial<AgentSessionConfig>, launchContext?: AgentLaunchContext): Promise<AgentSession>;
592
- listModels(options: ListModelsOptions): Promise<AgentModelDefinition[]>;
593
- listModes?(options: ListModesOptions): Promise<AgentMode[]>;
594
+ /**
595
+ * Discover models and modes together. Implementations may use one upstream
596
+ * process, separate upstream calls, static modes, or private helpers; callers
597
+ * outside the provider do not get separate runtime model/mode probes.
598
+ * The registry is responsible for merging configured model overrides.
599
+ */
600
+ fetchCatalog(options: FetchCatalogOptions): Promise<ProviderCatalog>;
594
601
  resolveCreateConfig?(input: ResolveAgentCreateConfigInput): ResolveAgentCreateConfigResult;
595
602
  isCreateConfigUnattended?(input: AgentCreateConfigUnattendedInput): boolean;
596
603
  listCommands?(config: AgentSessionConfig): Promise<AgentSlashCommand[]>;
@@ -610,6 +617,11 @@ export interface AgentClient {
610
617
  * Called when Paseo archives an agent so the provider's own UI reflects the same state.
611
618
  */
612
619
  archiveNativeSession?(handle: AgentPersistenceHandle): Promise<void>;
620
+ /**
621
+ * Unarchive a persisted session in the native provider.
622
+ * Called before Paseo clears its archived flag so provider resume can succeed.
623
+ */
624
+ unarchiveNativeSession?(handle: AgentPersistenceHandle): Promise<void>;
613
625
  /**
614
626
  * Release any provider-owned resources held by this client (background
615
627
  * processes, sockets, cached subprocesses, etc.). Called when the daemon
@@ -617,5 +629,4 @@ export interface AgentClient {
617
629
  */
618
630
  shutdown?(): Promise<void>;
619
631
  }
620
- export {};
621
632
  //# sourceMappingURL=agent-sdk-types.d.ts.map
@@ -48,6 +48,7 @@ export interface CreateAgentFromMcpInput {
48
48
  title: string;
49
49
  initialPrompt: string;
50
50
  cwd?: string;
51
+ workspaceId?: string;
51
52
  thinking?: string;
52
53
  features?: Record<string, unknown>;
53
54
  labels?: Record<string, string>;
@@ -63,6 +64,7 @@ export interface CreateAgentFromMcpInput {
63
64
  } | null;
64
65
  worktree?: {
65
66
  worktreeName?: string;
67
+ branchName?: string;
66
68
  baseBranch?: string;
67
69
  refName?: string;
68
70
  action?: "branch-off" | "checkout";
@@ -90,15 +90,15 @@ async function resolveMcpCreateAgent(dependencies, input) {
90
90
  worktree: input.worktree,
91
91
  initialPrompt: input.initialPrompt,
92
92
  });
93
- // A child agent created in its parent's working tree belongs to the parent's
94
- // workspace. When a new worktree is created the child lives in that fresh
95
- // workspace, so it is stamped with the new worktree's workspaceId instead
96
- // (mirrors the session path) keeping the agent discoverable by
97
- // workspaceId-scoped archive. With neither a parent nor a worktree, the agent
98
- // mints its own workspace; ownership is never resolved from cwd.
93
+ // MCP callers resolve workspace ownership before this point. Worktree
94
+ // creation wins because the new agent lives in the fresh worktree workspace.
95
+ // Otherwise use the explicit workspace id, then the parent workspace for
96
+ // direct internal callers. Ownership is never resolved from cwd.
99
97
  const workspaceId = setupContinuation
100
98
  ? createdWorkspaceId
101
- : (parentAgent?.workspaceId ?? (await ensureWorkspaceForMcpCreate(dependencies, resolvedCwd)));
99
+ : (input.workspaceId ??
100
+ parentAgent?.workspaceId ??
101
+ (await ensureWorkspaceForMcpCreate(dependencies, resolvedCwd)));
102
102
  const { modeId: resolvedMode, featureValues: resolvedFeatures } = await dependencies.providerSnapshotManager.resolveCreateConfig({
103
103
  cwd: resolvedCwd,
104
104
  provider,
@@ -224,6 +224,7 @@ async function resolveMcpCwd(params) {
224
224
  input: {
225
225
  cwd: params.cwd,
226
226
  worktreeSlug: worktree.worktreeName,
227
+ branchName: worktree.branchName,
227
228
  refName: worktree.refName,
228
229
  action: worktree.action,
229
230
  githubPrNumber: worktree.githubPrNumber,
@@ -1,6 +1,7 @@
1
1
  import type { Logger } from "pino";
2
2
  import type { ManagedAgent } from "./agent-manager.js";
3
3
  import type { StoredAgentRecord } from "./agent-storage.js";
4
+ import type { AgentProviderNotice } from "./agent-sdk-types.js";
4
5
  export type LifecycleAgentSnapshot = Pick<ManagedAgent, "id" | "cwd" | "lifecycle">;
5
6
  export interface LifecycleAgentManager {
6
7
  getAgent(agentId: string): LifecycleAgentSnapshot | null;
@@ -13,8 +14,13 @@ export interface LifecycleAgentManager {
13
14
  archiveSnapshot(agentId: string, archivedAt: string): Promise<StoredAgentRecord>;
14
15
  closeAgent(agentId: string): Promise<void>;
15
16
  setLabels(agentId: string, labels: Record<string, string>): Promise<void>;
17
+ detachAgent(agentId: string): Promise<{
18
+ record: StoredAgentRecord;
19
+ live: boolean;
20
+ previousParentAgentId: string | null;
21
+ }>;
16
22
  notifyAgentState(agentId: string): void;
17
- setAgentMode(agentId: string, modeId: string): Promise<void>;
23
+ setAgentMode(agentId: string, modeId: string): Promise<AgentProviderNotice | null>;
18
24
  updateAgentMetadata(agentId: string, updates: {
19
25
  title?: string;
20
26
  labels?: Record<string, string>;
@@ -50,10 +56,18 @@ export declare function updateAgentCommand(dependencies: Pick<AgentLifecycleComm
50
56
  name?: string;
51
57
  labels?: Record<string, string>;
52
58
  }): Promise<UpdateAgentResult>;
59
+ export interface DetachAgentResult {
60
+ agentId: string;
61
+ record: StoredAgentRecord;
62
+ live: boolean;
63
+ previousParentAgentId: string | null;
64
+ }
65
+ export declare function detachAgentCommand(dependencies: Pick<AgentLifecycleCommandDependencies, "agentManager">, agentId: string): Promise<DetachAgentResult>;
53
66
  export declare function setAgentModeCommand(dependencies: Pick<AgentLifecycleCommandDependencies, "agentManager">, input: {
54
67
  agentId: string;
55
68
  modeId: string;
56
69
  }): Promise<{
57
70
  modeId: string;
71
+ notice: AgentProviderNotice | null;
58
72
  }>;
59
73
  //# sourceMappingURL=lifecycle-command.d.ts.map
@@ -67,9 +67,16 @@ export async function updateAgentCommand(dependencies, input) {
67
67
  error: null,
68
68
  };
69
69
  }
70
+ export async function detachAgentCommand(dependencies, agentId) {
71
+ const result = await dependencies.agentManager.detachAgent(agentId);
72
+ return {
73
+ agentId,
74
+ ...result,
75
+ };
76
+ }
70
77
  export async function setAgentModeCommand(dependencies, input) {
71
- await dependencies.agentManager.setAgentMode(input.agentId, input.modeId);
72
- return { modeId: input.modeId };
78
+ const notice = await dependencies.agentManager.setAgentMode(input.agentId, input.modeId);
79
+ return { modeId: input.modeId, notice };
73
80
  }
74
81
  async function archiveStoredAgent(dependencies, agentId) {
75
82
  const existing = await dependencies.agentStorage.get(agentId);