@getpaseo/server 0.1.98 → 0.1.100

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 (59) hide show
  1. package/dist/server/server/agent/agent-manager.js +2 -2
  2. package/dist/server/server/agent/agent-sdk-types.d.ts +11 -6
  3. package/dist/server/server/agent/provider-registry.d.ts +6 -3
  4. package/dist/server/server/agent/provider-registry.js +49 -22
  5. package/dist/server/server/agent/provider-snapshot-manager.js +26 -14
  6. package/dist/server/server/agent/providers/acp-agent.d.ts +23 -3
  7. package/dist/server/server/agent/providers/acp-agent.js +139 -9
  8. package/dist/server/server/agent/providers/claude/agent.d.ts +2 -2
  9. package/dist/server/server/agent/providers/claude/agent.js +41 -77
  10. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +3 -2
  11. package/dist/server/server/agent/providers/codex-app-server-agent.js +6 -25
  12. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +2 -1
  13. package/dist/server/server/agent/providers/copilot-acp-agent.js +11 -31
  14. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +0 -1
  15. package/dist/server/server/agent/providers/generic-acp-agent.js +2 -108
  16. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts +2 -3
  17. package/dist/server/server/agent/providers/mock-load-test-agent.js +5 -5
  18. package/dist/server/server/agent/providers/mock-slow-provider.d.ts +2 -3
  19. package/dist/server/server/agent/providers/mock-slow-provider.js +2 -5
  20. package/dist/server/server/agent/providers/opencode/server-manager.d.ts +14 -11
  21. package/dist/server/server/agent/providers/opencode/server-manager.js +149 -91
  22. package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts +6 -5
  23. package/dist/server/server/agent/providers/opencode/test-server-manager.js +13 -3
  24. package/dist/server/server/agent/providers/opencode/test-utils/{test-opencode-runtime.d.ts → test-opencode-harness.d.ts} +11 -11
  25. package/dist/server/server/agent/providers/opencode/test-utils/{test-opencode-runtime.js → test-opencode-harness.js} +23 -10
  26. package/dist/server/server/agent/providers/opencode-agent.d.ts +13 -6
  27. package/dist/server/server/agent/providers/opencode-agent.js +74 -137
  28. package/dist/server/server/agent/providers/pi/agent.d.ts +4 -4
  29. package/dist/server/server/agent/providers/pi/agent.js +13 -76
  30. package/dist/server/server/agent/providers/pi/cli-runtime.d.ts +3 -0
  31. package/dist/server/server/agent/providers/pi/cli-runtime.js +8 -5
  32. package/dist/server/server/agent/providers/pi/rpc-types.d.ts +2 -1
  33. package/dist/server/server/agent/providers/pi/runtime.d.ts +1 -1
  34. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.d.ts +1 -1
  35. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.js +1 -1
  36. package/dist/server/server/session/agent-config/agent-config-session.d.ts +50 -0
  37. package/dist/server/server/session/agent-config/agent-config-session.js +98 -0
  38. package/dist/server/server/session/chat/chat-schedule-loop-session.d.ts +120 -0
  39. package/dist/server/server/session/chat/chat-schedule-loop-session.js +489 -0
  40. package/dist/server/server/session/checkout/checkout-session.d.ts +142 -0
  41. package/dist/server/server/session/checkout/checkout-session.js +925 -0
  42. package/dist/server/server/session/daemon/daemon-session.d.ts +50 -0
  43. package/dist/server/server/session/daemon/daemon-session.js +98 -0
  44. package/dist/server/server/session/files/workspace-files-session.d.ts +43 -0
  45. package/dist/server/server/session/files/workspace-files-session.js +218 -0
  46. package/dist/server/server/session/project-config/project-config-session.d.ts +34 -0
  47. package/dist/server/server/session/project-config/project-config-session.js +125 -0
  48. package/dist/server/server/session/provider/provider-catalog-session.d.ts +74 -0
  49. package/dist/server/server/session/provider/provider-catalog-session.js +339 -0
  50. package/dist/server/server/session/voice/voice-session.d.ts +166 -0
  51. package/dist/server/server/session/voice/voice-session.js +893 -0
  52. package/dist/server/server/{voice → session/voice}/voice-turn-controller.d.ts +2 -2
  53. package/dist/server/server/{voice → session/voice}/voice-turn-controller.js +2 -2
  54. package/dist/server/server/session.d.ts +13 -208
  55. package/dist/server/server/session.js +2132 -5105
  56. package/dist/server/utils/checkout-git.d.ts +6 -0
  57. package/package.json +5 -5
  58. package/dist/server/server/agent/providers/opencode/runtime.d.ts +0 -28
  59. package/dist/server/server/agent/providers/opencode/runtime.js +0 -5
@@ -1,7 +1,7 @@
1
1
  import { type AgentDefinition, type McpServerConfig as ClaudeSdkMcpServerConfig, type SDKMessage } from "@anthropic-ai/claude-agent-sdk";
2
2
  import type { Logger } from "pino";
3
3
  import { type ClaudeQueryFactory } from "./query.js";
4
- import { type AgentCapabilityFlags, type AgentClient, type AgentCreateSessionOptions, type AgentFeature, type AgentLaunchContext, type AgentMetadata, type AgentModelDefinition, type AgentPersistenceHandle, type AgentSession, type AgentSessionConfig, type AgentTimelineItem, type ImportableProviderSession, type ImportProviderSessionContext, type ImportProviderSessionInput, type ListImportableSessionsOptions, type ListModelsOptions, type McpServerConfig } from "../../agent-sdk-types.js";
4
+ import { type AgentCapabilityFlags, type AgentClient, type AgentCreateSessionOptions, type AgentFeature, type AgentLaunchContext, type AgentMetadata, type AgentPersistenceHandle, type AgentSession, type AgentSessionConfig, type AgentTimelineItem, type FetchCatalogOptions, type ImportableProviderSession, type ImportProviderSessionContext, type ImportProviderSessionInput, type ListImportableSessionsOptions, type McpServerConfig, type ProviderCatalog } from "../../agent-sdk-types.js";
5
5
  import { type ProviderRuntimeSettings } from "../../provider-launch-config.js";
6
6
  export declare function normalizeClaudeAskUserQuestionRequestInput(toolName: string, input: AgentMetadata): AgentMetadata;
7
7
  export declare function normalizeClaudeAskUserQuestionUpdatedInput(updatedInput: AgentMetadata | undefined, fallbackInput: AgentMetadata | undefined): AgentMetadata;
@@ -39,7 +39,7 @@ export declare class ClaudeAgentClient implements AgentClient {
39
39
  constructor(options: ClaudeAgentClientOptions);
40
40
  createSession(config: AgentSessionConfig, launchContext?: AgentLaunchContext, options?: AgentCreateSessionOptions): Promise<AgentSession>;
41
41
  resumeSession(handle: AgentPersistenceHandle, overrides?: Partial<AgentSessionConfig>, launchContext?: AgentLaunchContext): Promise<AgentSession>;
42
- listModels(_options: ListModelsOptions): Promise<AgentModelDefinition[]>;
42
+ fetchCatalog(_options: FetchCatalogOptions): Promise<ProviderCatalog>;
43
43
  listFeatures(config: AgentSessionConfig): Promise<AgentFeature[]>;
44
44
  listImportableSessions(options?: ListImportableSessionsOptions): Promise<ImportableProviderSession[]>;
45
45
  importSession(input: ImportProviderSessionInput, context: ImportProviderSessionContext): Promise<import("../../agent-sdk-types.js").ImportedProviderSession>;
@@ -9,7 +9,7 @@ import { getClaudeModelsWithSettings, normalizeClaudeRuntimeModelId } from "./mo
9
9
  import { parsePartialJsonObject } from "./partial-json.js";
10
10
  import { ClaudeSidechainTracker } from "./sidechain-tracker.js";
11
11
  import { buildClaudeFeatures, claudeModelSupportsFastMode } from "./feature-definitions.js";
12
- import { buildBinaryDiagnosticRows, buildCommandResolutionDiagnosticRows, formatDiagnosticStatus, formatProviderDiagnostic, formatProviderDiagnosticError, toDiagnosticErrorMessage, } from "../diagnostic-utils.js";
12
+ import { buildBinaryDiagnosticRows, buildCommandResolutionDiagnosticRows, formatProviderDiagnostic, formatProviderDiagnosticError, } from "../diagnostic-utils.js";
13
13
  import { appendOrReplaceGrowingAssistantMessage, runProviderTurn } from "../provider-runner.js";
14
14
  import { renderPromptAttachmentAsText } from "../../prompt-attachments.js";
15
15
  import { claudeQuery } from "./query.js";
@@ -1032,9 +1032,10 @@ export class ClaudeAgentClient {
1032
1032
  resolveBinary: this.resolveBinary,
1033
1033
  });
1034
1034
  }
1035
- async listModels(_options) {
1035
+ async fetchCatalog(_options) {
1036
1036
  // Claude exposes a global catalog here; cwd/force are intentionally irrelevant.
1037
- return await getClaudeModelsWithSettings(this.logger, this.configDir);
1037
+ const models = await getClaudeModelsWithSettings(this.logger, this.configDir);
1038
+ return { models, modes: DEFAULT_MODES };
1038
1039
  }
1039
1040
  async listFeatures(config) {
1040
1041
  const claudeConfig = this.assertConfig(config);
@@ -1079,28 +1080,9 @@ export class ClaudeAgentClient {
1079
1080
  defaultBinary: "claude",
1080
1081
  });
1081
1082
  const availability = await checkProviderLaunchAvailable(launch);
1082
- const available = availability.available;
1083
- const auth = available
1083
+ const auth = availability.available
1084
1084
  ? await resolveClaudeAuth(launch, availability, this.runtimeSettings)
1085
1085
  : null;
1086
- let modelsValue = "Not checked";
1087
- let status = formatDiagnosticStatus(available);
1088
- if (available) {
1089
- try {
1090
- const models = await this.listModels({
1091
- cwd: os.homedir(),
1092
- force: false,
1093
- });
1094
- modelsValue = String(models.length);
1095
- }
1096
- catch (error) {
1097
- modelsValue = `Error - ${toDiagnosticErrorMessage(error)}`;
1098
- status = formatDiagnosticStatus(available, {
1099
- source: "model fetch",
1100
- cause: error,
1101
- });
1102
- }
1103
- }
1104
1086
  return {
1105
1087
  diagnostic: formatProviderDiagnostic("Claude Code", [
1106
1088
  ...(await buildCommandResolutionDiagnosticRows(launch, {
@@ -1108,8 +1090,6 @@ export class ClaudeAgentClient {
1108
1090
  })),
1109
1091
  ...(await buildBinaryDiagnosticRows(launch, availability)),
1110
1092
  ...(auth ? [{ label: "Auth", value: auth }] : []),
1111
- { label: "Models", value: modelsValue },
1112
- { label: "Status", value: status },
1113
1093
  ]),
1114
1094
  };
1115
1095
  }
@@ -1272,23 +1252,6 @@ function readLegacyResultUsageTokens(usage) {
1272
1252
  const usageRecord = toObjectRecord(usage);
1273
1253
  return usageRecord ? readUsageTokenTotal(usageRecord) : undefined;
1274
1254
  }
1275
- function readCurrentContextUsage(value) {
1276
- const record = toObjectRecord(value);
1277
- if (!record) {
1278
- return undefined;
1279
- }
1280
- const totalTokens = record.totalTokens;
1281
- if (typeof totalTokens !== "number" || !Number.isFinite(totalTokens) || totalTokens < 0) {
1282
- return undefined;
1283
- }
1284
- const maxTokens = record.maxTokens;
1285
- return {
1286
- totalTokens,
1287
- ...(typeof maxTokens === "number" && Number.isFinite(maxTokens) && maxTokens > 0
1288
- ? { maxTokens }
1289
- : {}),
1290
- };
1291
- }
1292
1255
  function isClaudeSubagentToolName(name) {
1293
1256
  return name === "Task" || name === "Agent";
1294
1257
  }
@@ -1300,6 +1263,7 @@ class ClaudeContextUsageState {
1300
1263
  beginTurn() {
1301
1264
  this.streamRequestInputTokens = undefined;
1302
1265
  this.streamRequestOutputTokens = undefined;
1266
+ this.compactedContextWindowUsedTokens = undefined;
1303
1267
  }
1304
1268
  setInitialContextWindowMaxTokens(contextWindowMaxTokens) {
1305
1269
  this.contextWindowMaxTokens = contextWindowMaxTokens;
@@ -1311,11 +1275,6 @@ class ClaudeContextUsageState {
1311
1275
  }
1312
1276
  return this.contextWindowMaxTokens;
1313
1277
  }
1314
- recordCurrentContextUsage(usage) {
1315
- if (usage?.maxTokens !== undefined) {
1316
- this.contextWindowMaxTokens = usage.maxTokens;
1317
- }
1318
- }
1319
1278
  buildStreamUsageEvent(event) {
1320
1279
  const streamEvent = toObjectRecord(event);
1321
1280
  if (!streamEvent) {
@@ -1346,7 +1305,7 @@ class ClaudeContextUsageState {
1346
1305
  }
1347
1306
  return this.createUsageUpdatedEvent(usedTokens);
1348
1307
  }
1349
- buildResultUsage(message, modelUsage, currentContextUsage) {
1308
+ buildResultUsage(message, modelUsage) {
1350
1309
  try {
1351
1310
  if (!message.usage) {
1352
1311
  return undefined;
@@ -1358,7 +1317,6 @@ class ClaudeContextUsageState {
1358
1317
  totalCostUsd: message.total_cost_usd,
1359
1318
  };
1360
1319
  const modelContextWindowMaxTokens = this.recordModelUsage(modelUsage ?? message.modelUsage);
1361
- this.recordCurrentContextUsage(currentContextUsage);
1362
1320
  if (this.contextWindowMaxTokens !== undefined) {
1363
1321
  usage.contextWindowMaxTokens = this.contextWindowMaxTokens;
1364
1322
  }
@@ -1367,13 +1325,14 @@ class ClaudeContextUsageState {
1367
1325
  }
1368
1326
  const activeResultUsageTokens = readActiveUsageTokens(message.usage) ??
1369
1327
  (this.completedResultTurns === 0 ? readLegacyResultUsageTokens(message.usage) : undefined);
1370
- const usedTokens = currentContextUsage?.totalTokens ?? this.streamUsedTokens() ?? activeResultUsageTokens;
1328
+ const usedTokens = this.streamUsedTokens() ?? activeResultUsageTokens ?? this.compactedContextWindowUsedTokens;
1371
1329
  if (usedTokens !== undefined) {
1372
1330
  usage.contextWindowUsedTokens = usedTokens;
1373
1331
  }
1374
1332
  return usage;
1375
1333
  }
1376
1334
  finally {
1335
+ this.compactedContextWindowUsedTokens = undefined;
1377
1336
  this.completedResultTurns += 1;
1378
1337
  }
1379
1338
  }
@@ -1382,7 +1341,8 @@ class ClaudeContextUsageState {
1382
1341
  typeof this.streamRequestOutputTokens !== "number") {
1383
1342
  return undefined;
1384
1343
  }
1385
- return this.streamRequestInputTokens + this.streamRequestOutputTokens;
1344
+ const usedTokens = this.streamRequestInputTokens + this.streamRequestOutputTokens;
1345
+ return usedTokens > 0 ? usedTokens : undefined;
1386
1346
  }
1387
1347
  createUsageUpdatedEvent(contextWindowUsedTokens) {
1388
1348
  const usage = {
@@ -1397,6 +1357,23 @@ class ClaudeContextUsageState {
1397
1357
  usage,
1398
1358
  };
1399
1359
  }
1360
+ buildCompactionUsageEvent(postTokens) {
1361
+ this.streamRequestInputTokens = undefined;
1362
+ this.streamRequestOutputTokens = undefined;
1363
+ this.compactedContextWindowUsedTokens = postTokens;
1364
+ const usage = {};
1365
+ if (this.contextWindowMaxTokens !== undefined) {
1366
+ usage.contextWindowMaxTokens = this.contextWindowMaxTokens;
1367
+ }
1368
+ if (postTokens !== undefined) {
1369
+ usage.contextWindowUsedTokens = postTokens;
1370
+ }
1371
+ return {
1372
+ type: "usage_updated",
1373
+ provider: "claude",
1374
+ usage,
1375
+ };
1376
+ }
1400
1377
  }
1401
1378
  class ClaudeAgentSession {
1402
1379
  constructor(config, options) {
@@ -2679,7 +2656,7 @@ class ClaudeAgentSession {
2679
2656
  if (await this.handleMissingResumedConversation(message, activeQuery)) {
2680
2657
  return true;
2681
2658
  }
2682
- await this.routeSdkMessageFromPump(message, activeQuery);
2659
+ await this.routeSdkMessageFromPump(message);
2683
2660
  return false;
2684
2661
  };
2685
2662
  const drainActiveQuery = async () => {
@@ -2747,7 +2724,7 @@ class ClaudeAgentSession {
2747
2724
  message.type === "tool_progress" ||
2748
2725
  (message.type === "system" && message.subtype === "task_notification"));
2749
2726
  }
2750
- async routeSdkMessageFromPump(message, activeQuery) {
2727
+ async routeSdkMessageFromPump(message) {
2751
2728
  if (this.shouldSuppressStaleResult(message)) {
2752
2729
  return;
2753
2730
  }
@@ -2770,7 +2747,7 @@ class ClaudeAgentSession {
2770
2747
  identifiers,
2771
2748
  rawEvent: message,
2772
2749
  }, "provider.claude.parsed_event");
2773
- const events = await this.buildPumpedMessageEvents(message, activeQuery, identifiers.messageId, turnId);
2750
+ const events = await this.buildPumpedMessageEvents(message, identifiers.messageId, turnId);
2774
2751
  if (events.length === 0) {
2775
2752
  return;
2776
2753
  }
@@ -2793,14 +2770,10 @@ class ClaudeAgentSession {
2793
2770
  }
2794
2771
  this.dispatchEvents(events);
2795
2772
  }
2796
- async buildPumpedMessageEvents(message, activeQuery, messageIdHint, turnId) {
2797
- const currentContextUsage = message.type === "result" && message.subtype === "success"
2798
- ? await this.queryCurrentContextUsage(activeQuery)
2799
- : undefined;
2773
+ async buildPumpedMessageEvents(message, messageIdHint, turnId) {
2800
2774
  const messageEvents = this.translateMessageToEvents(message, {
2801
2775
  suppressAssistantText: true,
2802
2776
  suppressReasoning: true,
2803
- currentContextUsage,
2804
2777
  });
2805
2778
  const assistantTimelineEvents = this.timelineAssembler
2806
2779
  .consume({
@@ -2815,16 +2788,6 @@ class ClaudeAgentSession {
2815
2788
  }));
2816
2789
  return [...messageEvents, ...assistantTimelineEvents];
2817
2790
  }
2818
- async queryCurrentContextUsage(activeQuery) {
2819
- try {
2820
- const usage = await withTimeout(activeQuery.getContextUsage(), 3000, "timeout");
2821
- return readCurrentContextUsage(usage);
2822
- }
2823
- catch (error) {
2824
- this.logger.debug({ err: error }, "Claude context usage query failed");
2825
- return undefined;
2826
- }
2827
- }
2828
2791
  async handleMissingResumedConversation(message, activeQuery) {
2829
2792
  const staleResumeError = this.readMissingResumedConversationError(message);
2830
2793
  if (!staleResumeError) {
@@ -2915,9 +2878,7 @@ class ClaudeAgentSession {
2915
2878
  this.appendStreamEventEvents(message, events, options);
2916
2879
  break;
2917
2880
  case "result":
2918
- this.appendResultEvents(message, events, {
2919
- currentContextUsage: options?.currentContextUsage,
2920
- });
2881
+ this.appendResultEvents(message, events);
2921
2882
  break;
2922
2883
  default:
2923
2884
  break;
@@ -2983,6 +2944,7 @@ class ClaudeAgentSession {
2983
2944
  },
2984
2945
  provider: "claude",
2985
2946
  });
2947
+ events.push(this.contextUsage.buildCompactionUsageEvent(compactMetadata?.postTokens));
2986
2948
  return;
2987
2949
  }
2988
2950
  if (message.subtype === "task_notification") {
@@ -3087,8 +3049,8 @@ class ClaudeAgentSession {
3087
3049
  events.push({ type: "timeline", item, provider: "claude" });
3088
3050
  }
3089
3051
  }
3090
- appendResultEvents(message, events, options) {
3091
- const usage = this.convertUsage(message, message.modelUsage, options?.currentContextUsage);
3052
+ appendResultEvents(message, events) {
3053
+ const usage = this.convertUsage(message, message.modelUsage);
3092
3054
  if (message.subtype === "success") {
3093
3055
  // Built-in slash commands (e.g. /voice, /usage, "Unknown command: …")
3094
3056
  // run client-side in the Claude CLI with no model turn — output_tokens
@@ -3232,8 +3194,8 @@ class ClaudeAgentSession {
3232
3194
  }
3233
3195
  return null;
3234
3196
  }
3235
- convertUsage(message, modelUsage, currentContextUsage) {
3236
- return this.contextUsage.buildResultUsage(message, modelUsage, currentContextUsage);
3197
+ convertUsage(message, modelUsage) {
3198
+ return this.contextUsage.buildResultUsage(message, modelUsage);
3237
3199
  }
3238
3200
  enqueueTimeline(item) {
3239
3201
  this.pushEvent({ type: "timeline", item, provider: "claude" });
@@ -3919,7 +3881,9 @@ function readCompactionMetadata(source) {
3919
3881
  const trigger = typeof metadata.trigger === "string" ? metadata.trigger : undefined;
3920
3882
  const preTokensRaw = metadata.preTokens ?? metadata.pre_tokens;
3921
3883
  const preTokens = typeof preTokensRaw === "number" ? preTokensRaw : undefined;
3922
- return { trigger, preTokens };
3884
+ const postTokensRaw = metadata.postTokens ?? metadata.post_tokens;
3885
+ const postTokens = typeof postTokensRaw === "number" ? postTokensRaw : undefined;
3886
+ return { trigger, preTokens, postTokens };
3923
3887
  }
3924
3888
  return null;
3925
3889
  }
@@ -1,4 +1,4 @@
1
- import { type AgentCapabilityFlags, type AgentClient, type AgentCreateSessionOptions, type AgentFeature, type AgentLaunchContext, type AgentMode, type AgentModelDefinition, type AgentPersistenceHandle, type AgentPermissionRequest, type AgentPermissionResponse, type AgentPermissionResult, type AgentProviderNotice, type AgentPromptContentBlock, type AgentPromptInput, type AgentRunOptions, type AgentRunResult, type AgentRuntimeInfo, type AgentSession, type AgentSessionConfig, type AgentSlashCommand, type AgentStreamEvent, type AgentTimelineItem, type ToolCallTimelineItem, type AgentUsage, type ImportableProviderSession, type ImportProviderSessionContext, type ImportProviderSessionInput, type ListImportableSessionsOptions, type ListModelsOptions } from "../agent-sdk-types.js";
1
+ import { type AgentCapabilityFlags, type AgentClient, type AgentCreateSessionOptions, type AgentFeature, type AgentLaunchContext, type AgentMode, type AgentPersistenceHandle, type AgentPermissionRequest, type AgentPermissionResponse, type AgentPermissionResult, type AgentProviderNotice, type AgentPromptContentBlock, type AgentPromptInput, type AgentRunOptions, type AgentRunResult, type AgentRuntimeInfo, type AgentSession, type AgentSessionConfig, type AgentSlashCommand, type AgentStreamEvent, type AgentTimelineItem, type ToolCallTimelineItem, type AgentUsage, type FetchCatalogOptions, type ImportableProviderSession, type ImportProviderSessionContext, type ImportProviderSessionInput, type ListImportableSessionsOptions, type ProviderCatalog } from "../agent-sdk-types.js";
2
2
  import type { Logger } from "pino";
3
3
  import type { ChildProcessWithoutNullStreams } from "node:child_process";
4
4
  import { type ProviderRuntimeSettings } from "../provider-launch-config.js";
@@ -295,7 +295,8 @@ export declare class CodexAppServerAgentClient implements AgentClient {
295
295
  }, overrides?: Partial<AgentSessionConfig>, launchContext?: AgentLaunchContext): Promise<AgentSession>;
296
296
  listImportableSessions(options?: ListImportableSessionsOptions): Promise<ImportableProviderSession[]>;
297
297
  importSession(input: ImportProviderSessionInput, context: ImportProviderSessionContext): Promise<import("../agent-sdk-types.js").ImportedProviderSession>;
298
- listModels(_options: ListModelsOptions): Promise<AgentModelDefinition[]>;
298
+ fetchCatalog(_options: FetchCatalogOptions): Promise<ProviderCatalog>;
299
+ private fetchModelsFromAppServer;
299
300
  archiveNativeSession(handle: AgentPersistenceHandle): Promise<void>;
300
301
  unarchiveNativeSession(handle: AgentPersistenceHandle): Promise<void>;
301
302
  isAvailable(): Promise<boolean>;
@@ -1,6 +1,5 @@
1
1
  import { getAgentStreamEventTurnId, } from "../agent-sdk-types.js";
2
2
  import { importSessionFromPersistence } from "../provider-session-import.js";
3
- import { homedir } from "node:os";
4
3
  import { randomUUID } from "node:crypto";
5
4
  import * as fsSync from "node:fs";
6
5
  import fs from "node:fs/promises";
@@ -21,7 +20,7 @@ import { CodexAppServerClient, parseCodexThreadForkResponse, parseCodexThreadRol
21
20
  import { revertCodexConversation } from "./codex/rewind.js";
22
21
  import { renderProviderImageOutputAsAssistantMarkdown, } from "./provider-image-output.js";
23
22
  import { normalizeProviderReplayTimestamp } from "../provider-history-timestamps.js";
24
- import { formatDiagnosticStatus, formatProviderDiagnostic, formatProviderDiagnosticError, buildBinaryDiagnosticRows, buildCommandResolutionDiagnosticRows, resolveBinaryVersion, toDiagnosticErrorMessage, } from "./diagnostic-utils.js";
23
+ import { formatProviderDiagnostic, formatProviderDiagnosticError, buildBinaryDiagnosticRows, buildCommandResolutionDiagnosticRows, resolveBinaryVersion, } from "./diagnostic-utils.js";
25
24
  import { runProviderTurn } from "./provider-runner.js";
26
25
  import { SETTING_APPLIES_NEXT_TURN_NOTICE } from "../provider-notices.js";
27
26
  function assertChildWithPipes(child) {
@@ -4376,7 +4375,11 @@ export class CodexAppServerAgentClient {
4376
4375
  resumeSession: this.resumeSession.bind(this),
4377
4376
  });
4378
4377
  }
4379
- async listModels(_options) {
4378
+ async fetchCatalog(_options) {
4379
+ const models = await this.fetchModelsFromAppServer();
4380
+ return { models, modes: CODEX_MODES };
4381
+ }
4382
+ async fetchModelsFromAppServer() {
4380
4383
  // Codex model/list is global to the app server in this flow; cwd/force are intentionally ignored.
4381
4384
  const child = await this.spawnAppServer();
4382
4385
  const client = new CodexAppServerClient(child, this.logger);
@@ -4454,34 +4457,12 @@ export class CodexAppServerAgentClient {
4454
4457
  try {
4455
4458
  const launch = await resolveCodexLaunch(this.runtimeSettings);
4456
4459
  const availability = await checkCodexLaunchAvailable(launch);
4457
- const available = availability.available;
4458
4460
  const entries = [
4459
4461
  ...(await buildCommandResolutionDiagnosticRows(launch, {
4460
4462
  knownBinaryNames: ["codex"],
4461
4463
  })),
4462
4464
  ...(await buildBinaryDiagnosticRows(launch, availability)),
4463
4465
  ];
4464
- let status = formatDiagnosticStatus(available);
4465
- if (!available) {
4466
- entries.push({ label: "Models", value: "Not checked" });
4467
- }
4468
- else {
4469
- try {
4470
- const models = await this.listModels({ cwd: homedir(), force: false });
4471
- entries.push({ label: "Models", value: String(models.length) });
4472
- }
4473
- catch (error) {
4474
- entries.push({
4475
- label: "Models",
4476
- value: `Error - ${toDiagnosticErrorMessage(error)}`,
4477
- });
4478
- status = formatDiagnosticStatus(available, {
4479
- source: "model fetch",
4480
- cause: error,
4481
- });
4482
- }
4483
- }
4484
- entries.push({ label: "Status", value: status });
4485
4466
  return {
4486
4467
  diagnostic: formatProviderDiagnostic("Codex", entries),
4487
4468
  };
@@ -2,8 +2,9 @@ import type { Logger } from "pino";
2
2
  import type { SessionConfigOption } from "@agentclientprotocol/sdk";
3
3
  import type { AgentMode } from "../agent-sdk-types.js";
4
4
  import { type ProviderRuntimeSettings } from "../provider-launch-config.js";
5
- import { ACPAgentClient, type ACPBeforeModeWriteResult, type ACPProviderModeWriteResult, type ACPProviderModeWriterContext, type SessionStateResponse } from "./acp-agent.js";
5
+ import { ACPAgentClient, type ACPConfigFeatureOption, type ACPBeforeModeWriteResult, type ACPProviderModeWriteResult, type ACPProviderModeWriterContext, type SessionStateResponse } from "./acp-agent.js";
6
6
  export declare const COPILOT_ALLOW_ALL_MODE_ID = "allow-all";
7
+ export declare const COPILOT_AGENT_FEATURE_OPTION: ACPConfigFeatureOption;
7
8
  export declare const COPILOT_MODES: AgentMode[];
8
9
  interface CopilotACPAgentClientOptions {
9
10
  logger: Logger;
@@ -1,7 +1,6 @@
1
- import { homedir } from "node:os";
2
1
  import { checkProviderLaunchAvailable, resolveProviderLaunch, } from "../provider-launch-config.js";
3
2
  import { ACPAgentClient, } from "./acp-agent.js";
4
- import { formatDiagnosticStatus, formatProviderDiagnostic, formatProviderDiagnosticError, buildBinaryDiagnosticRows, buildCommandResolutionDiagnosticRows, toDiagnosticErrorMessage, } from "./diagnostic-utils.js";
3
+ import { formatProviderDiagnostic, formatProviderDiagnosticError, buildBinaryDiagnosticRows, buildCommandResolutionDiagnosticRows, } from "./diagnostic-utils.js";
5
4
  const COPILOT_CAPABILITIES = {
6
5
  supportsStreaming: true,
7
6
  supportsSessionPersistence: true,
@@ -21,6 +20,15 @@ export const COPILOT_ALLOW_ALL_MODE_ID = "allow-all";
21
20
  const COPILOT_ALLOW_ALL_CONFIG_ID = "allow_all";
22
21
  const COPILOT_ALLOW_ALL_ON = "on";
23
22
  const COPILOT_ALLOW_ALL_OFF = "off";
23
+ export const COPILOT_AGENT_FEATURE_OPTION = {
24
+ id: "agent",
25
+ configId: "agent",
26
+ category: "_agent",
27
+ label: "Agent",
28
+ description: "Use a Copilot custom agent profile",
29
+ tooltip: "Select Copilot agent",
30
+ emptyOptionLabel: "Default",
31
+ };
24
32
  export const COPILOT_MODES = [
25
33
  {
26
34
  id: COPILOT_AGENT_MODE_ID,
@@ -48,6 +56,7 @@ export class CopilotACPAgentClient extends ACPAgentClient {
48
56
  defaultModes: COPILOT_MODES,
49
57
  sessionResponseTransformer: transformCopilotSessionResponse,
50
58
  configOptionsTransformer: transformCopilotConfigOptions,
59
+ configFeatureOptions: [COPILOT_AGENT_FEATURE_OPTION],
51
60
  modeIdTransformer: transformCopilotModeId,
52
61
  providerModeWriter: writeCopilotProviderMode,
53
62
  beforeModeWriter: beforeCopilotModeWriter,
@@ -64,41 +73,12 @@ export class CopilotACPAgentClient extends ACPAgentClient {
64
73
  defaultBinary: "copilot",
65
74
  });
66
75
  const availability = await checkProviderLaunchAvailable(launch);
67
- const available = availability.available;
68
- let modelsValue = "Not checked";
69
- let status = formatDiagnosticStatus(available);
70
- if (available) {
71
- try {
72
- const models = await this.listModels({ cwd: homedir(), force: false });
73
- modelsValue = String(models.length);
74
- }
75
- catch (error) {
76
- modelsValue = `Error - ${toDiagnosticErrorMessage(error)}`;
77
- status = formatDiagnosticStatus(available, {
78
- source: "model fetch",
79
- cause: error,
80
- });
81
- }
82
- if (!modelsValue.startsWith("Error -")) {
83
- try {
84
- await this.listModes({ cwd: homedir(), force: false });
85
- }
86
- catch (error) {
87
- status = formatDiagnosticStatus(available, {
88
- source: "mode fetch",
89
- cause: error,
90
- });
91
- }
92
- }
93
- }
94
76
  return {
95
77
  diagnostic: formatProviderDiagnostic("Copilot", [
96
78
  ...(await buildCommandResolutionDiagnosticRows(launch, {
97
79
  knownBinaryNames: ["copilot"],
98
80
  })),
99
81
  ...(await buildBinaryDiagnosticRows(launch, availability)),
100
- { label: "Models", value: modelsValue },
101
- { label: "Status", value: status },
102
82
  ]),
103
83
  };
104
84
  }
@@ -28,7 +28,6 @@ export declare class GenericACPAgentClient extends ACPAgentClient {
28
28
  diagnostic: string;
29
29
  }>;
30
30
  private resolveConfiguredLaunch;
31
- private runDiagnosticACPProbe;
32
31
  }
33
32
  export interface CommandInvocation {
34
33
  command: string;
@@ -1,10 +1,7 @@
1
- import { homedir } from "node:os";
2
1
  import { z } from "zod";
3
2
  import { checkProviderLaunchAvailable, resolveProviderLaunch } from "../provider-launch-config.js";
4
- import { ACPAgentClient, DEFAULT_ACP_CAPABILITIES, deriveModelDefinitionsFromACP, deriveModesFromACP, } from "./acp-agent.js";
5
- import { formatDiagnosticStatus, formatProviderDiagnostic, formatProviderDiagnosticError, buildBinaryDiagnosticRows, toDiagnosticErrorMessage, } from "./diagnostic-utils.js";
6
- const ACP_DIAGNOSTIC_INITIALIZE_TIMEOUT_MS = 8000;
7
- const ACP_DIAGNOSTIC_SESSION_TIMEOUT_MS = 8000;
3
+ import { ACPAgentClient, DEFAULT_ACP_CAPABILITIES } from "./acp-agent.js";
4
+ import { formatProviderDiagnostic, formatProviderDiagnosticError, buildBinaryDiagnosticRows, } from "./diagnostic-utils.js";
8
5
  export const GenericACPProviderParamsSchema = z
9
6
  .object({
10
7
  supportsMcpServers: z.boolean().optional(),
@@ -43,17 +40,7 @@ export class GenericACPAgentClient extends ACPAgentClient {
43
40
  try {
44
41
  const launch = await this.resolveConfiguredLaunch();
45
42
  const availability = await checkProviderLaunchAvailable(launch);
46
- const available = availability.available;
47
43
  const versionProbe = buildVersionProbeCommand(this.command);
48
- const probeResult = available
49
- ? await this.runDiagnosticACPProbe()
50
- : {
51
- status: formatDiagnosticStatus(false),
52
- initialize: "Not checked",
53
- session: "Not checked",
54
- models: "Not checked",
55
- modes: "Not checked",
56
- };
57
44
  return {
58
45
  diagnostic: formatProviderDiagnostic(providerName, [
59
46
  { label: "Provider ID", value: this.providerId ?? "unknown" },
@@ -70,11 +57,6 @@ export class GenericACPAgentClient extends ACPAgentClient {
70
57
  label: "Version command",
71
58
  value: formatCommand(versionProbe.command, versionProbe.args),
72
59
  },
73
- { label: "ACP initialize", value: probeResult.initialize },
74
- { label: "ACP session/new", value: probeResult.session },
75
- { label: "Models", value: probeResult.models },
76
- { label: "Modes", value: probeResult.modes },
77
- { label: "Status", value: probeResult.status },
78
60
  ]),
79
61
  };
80
62
  }
@@ -90,50 +72,6 @@ export class GenericACPAgentClient extends ACPAgentClient {
90
72
  defaultBinary: this.command[0],
91
73
  });
92
74
  }
93
- async runDiagnosticACPProbe() {
94
- let initializeValue = "Not checked";
95
- let sessionValue = "Not checked";
96
- try {
97
- const probe = await this.spawnProcess({
98
- NO_BROWSER: "true",
99
- NO_OPEN_BROWSER: "1",
100
- GEMINI_CLI_NO_BROWSER: "true",
101
- CI: "1",
102
- }, {
103
- initializeTimeoutMs: ACP_DIAGNOSTIC_INITIALIZE_TIMEOUT_MS,
104
- });
105
- try {
106
- initializeValue = formatInitializeResult(probe.initialize);
107
- const response = await withTimeout(probe.connection.newSession({
108
- cwd: homedir(),
109
- mcpServers: [],
110
- }), ACP_DIAGNOSTIC_SESSION_TIMEOUT_MS, "ACP session/new");
111
- sessionValue = response.sessionId ? `ok (${response.sessionId})` : "ok";
112
- const transformed = this.transformSessionResponse(response);
113
- return {
114
- status: formatDiagnosticStatus(true),
115
- initialize: initializeValue,
116
- session: sessionValue,
117
- ...summarizeSessionState(this.provider, transformed),
118
- };
119
- }
120
- finally {
121
- await this.closeProbe(probe);
122
- }
123
- }
124
- catch (error) {
125
- return {
126
- status: formatDiagnosticStatus(true, {
127
- source: "ACP probe",
128
- cause: error,
129
- }),
130
- initialize: formatProbeError(initializeValue, error),
131
- session: initializeValue === "Not checked" ? "Not checked" : formatProbeError(sessionValue, error),
132
- models: "Not checked",
133
- modes: "Not checked",
134
- };
135
- }
136
- }
137
75
  }
138
76
  function buildGenericACPCapabilities(options) {
139
77
  const params = parseGenericACPProviderParams(options.providerParams);
@@ -200,48 +138,4 @@ function takePackageSpecPrefix(args) {
200
138
  }
201
139
  return prefix;
202
140
  }
203
- function formatInitializeResult(initialize) {
204
- const agentInfo = isAgentInfo(initialize.agentInfo)
205
- ? `${initialize.agentInfo.name}${initialize.agentInfo.version ? ` ${initialize.agentInfo.version}` : ""}`
206
- : "ok";
207
- return `ok (protocol ${initialize.protocolVersion}, ${agentInfo})`;
208
- }
209
- function isAgentInfo(value) {
210
- return (typeof value === "object" &&
211
- value !== null &&
212
- "name" in value &&
213
- typeof Reflect.get(value, "name") === "string");
214
- }
215
- function summarizeSessionState(provider, response) {
216
- const models = deriveModelDefinitionsFromACP(provider, response.models, response.configOptions);
217
- const { modes } = deriveModesFromACP([], response.modes, response.configOptions);
218
- return {
219
- models: `${models.length}`,
220
- modes: modes.length > 0 ? modes.map((mode) => mode.label || mode.id).join(", ") : "none reported",
221
- };
222
- }
223
- function formatProbeError(currentValue, error) {
224
- if (currentValue !== "Not checked") {
225
- return currentValue;
226
- }
227
- return `Error - ${toDiagnosticErrorMessage(error)}`;
228
- }
229
- async function withTimeout(promise, timeoutMs, label) {
230
- let timeout = null;
231
- try {
232
- return await Promise.race([
233
- promise,
234
- new Promise((_, reject) => {
235
- timeout = setTimeout(() => {
236
- reject(new Error(`${label} timed out after ${timeoutMs}ms`));
237
- }, timeoutMs);
238
- }),
239
- ]);
240
- }
241
- finally {
242
- if (timeout) {
243
- clearTimeout(timeout);
244
- }
245
- }
246
- }
247
141
  //# sourceMappingURL=generic-acp-agent.js.map
@@ -1,5 +1,5 @@
1
1
  import type { Logger } from "pino";
2
- import type { AgentCapabilityFlags, AgentClient, AgentFeature, AgentLaunchContext, AgentMode, AgentModelDefinition, AgentPersistenceHandle, AgentPermissionRequest, AgentPermissionResponse, AgentPermissionResult, AgentPromptInput, AgentProvider, AgentRunOptions, AgentRunResult, AgentRuntimeInfo, AgentSession, AgentSessionConfig, AgentStreamEvent, ImportableProviderSession, ImportProviderSessionContext, ImportProviderSessionInput, ListModesOptions, ListModelsOptions } from "../agent-sdk-types.js";
2
+ import type { AgentCapabilityFlags, AgentClient, AgentFeature, AgentLaunchContext, AgentMode, AgentPersistenceHandle, AgentPermissionRequest, AgentPermissionResponse, AgentPermissionResult, AgentPromptInput, AgentProvider, AgentRunOptions, AgentRunResult, AgentRuntimeInfo, AgentSession, AgentSessionConfig, AgentStreamEvent, FetchCatalogOptions, ImportableProviderSession, ImportProviderSessionContext, ImportProviderSessionInput, ProviderCatalog } from "../agent-sdk-types.js";
3
3
  export declare const MOCK_LOAD_TEST_PROVIDER_ID = "mock";
4
4
  export declare const MOCK_LOAD_TEST_DEFAULT_MODEL_ID = "five-minute-stream";
5
5
  export declare class MockLoadTestAgentClient implements AgentClient {
@@ -9,8 +9,7 @@ export declare class MockLoadTestAgentClient implements AgentClient {
9
9
  constructor(logger?: Logger | undefined);
10
10
  createSession(config: AgentSessionConfig, _launchContext?: AgentLaunchContext): Promise<AgentSession>;
11
11
  resumeSession(handle: AgentPersistenceHandle, overrides?: Partial<AgentSessionConfig>, _launchContext?: AgentLaunchContext): Promise<AgentSession>;
12
- listModels(_options: ListModelsOptions): Promise<AgentModelDefinition[]>;
13
- listModes(_options: ListModesOptions): Promise<AgentMode[]>;
12
+ fetchCatalog(_options: FetchCatalogOptions): Promise<ProviderCatalog>;
14
13
  listImportableSessions(): Promise<ImportableProviderSession[]>;
15
14
  importSession(input: ImportProviderSessionInput, context: ImportProviderSessionContext): Promise<import("../agent-sdk-types.js").ImportedProviderSession>;
16
15
  isAvailable(): Promise<boolean>;
@@ -379,11 +379,11 @@ export class MockLoadTestAgentClient {
379
379
  logger: this.logger,
380
380
  });
381
381
  }
382
- async listModels(_options) {
383
- return MODELS;
384
- }
385
- async listModes(_options) {
386
- return getAgentProviderDefinition(MOCK_LOAD_TEST_PROVIDER_ID).modes;
382
+ async fetchCatalog(_options) {
383
+ return {
384
+ models: MODELS,
385
+ modes: getAgentProviderDefinition(MOCK_LOAD_TEST_PROVIDER_ID).modes,
386
+ };
387
387
  }
388
388
  async listImportableSessions() {
389
389
  return [];