@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.
- package/dist/server/server/agent/agent-manager.js +2 -2
- package/dist/server/server/agent/agent-sdk-types.d.ts +11 -6
- package/dist/server/server/agent/provider-registry.d.ts +6 -3
- package/dist/server/server/agent/provider-registry.js +49 -22
- package/dist/server/server/agent/provider-snapshot-manager.js +26 -14
- package/dist/server/server/agent/providers/acp-agent.d.ts +23 -3
- package/dist/server/server/agent/providers/acp-agent.js +139 -9
- package/dist/server/server/agent/providers/claude/agent.d.ts +2 -2
- package/dist/server/server/agent/providers/claude/agent.js +41 -77
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +3 -2
- package/dist/server/server/agent/providers/codex-app-server-agent.js +6 -25
- package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +2 -1
- package/dist/server/server/agent/providers/copilot-acp-agent.js +11 -31
- package/dist/server/server/agent/providers/generic-acp-agent.d.ts +0 -1
- package/dist/server/server/agent/providers/generic-acp-agent.js +2 -108
- package/dist/server/server/agent/providers/mock-load-test-agent.d.ts +2 -3
- package/dist/server/server/agent/providers/mock-load-test-agent.js +5 -5
- package/dist/server/server/agent/providers/mock-slow-provider.d.ts +2 -3
- package/dist/server/server/agent/providers/mock-slow-provider.js +2 -5
- package/dist/server/server/agent/providers/opencode/server-manager.d.ts +14 -11
- package/dist/server/server/agent/providers/opencode/server-manager.js +149 -91
- package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts +6 -5
- package/dist/server/server/agent/providers/opencode/test-server-manager.js +13 -3
- package/dist/server/server/agent/providers/opencode/test-utils/{test-opencode-runtime.d.ts → test-opencode-harness.d.ts} +11 -11
- package/dist/server/server/agent/providers/opencode/test-utils/{test-opencode-runtime.js → test-opencode-harness.js} +23 -10
- package/dist/server/server/agent/providers/opencode-agent.d.ts +13 -6
- package/dist/server/server/agent/providers/opencode-agent.js +74 -137
- package/dist/server/server/agent/providers/pi/agent.d.ts +4 -4
- package/dist/server/server/agent/providers/pi/agent.js +13 -76
- package/dist/server/server/agent/providers/pi/cli-runtime.d.ts +3 -0
- package/dist/server/server/agent/providers/pi/cli-runtime.js +8 -5
- package/dist/server/server/agent/providers/pi/rpc-types.d.ts +2 -1
- package/dist/server/server/agent/providers/pi/runtime.d.ts +1 -1
- package/dist/server/server/agent/providers/pi/test-utils/fake-pi.d.ts +1 -1
- package/dist/server/server/agent/providers/pi/test-utils/fake-pi.js +1 -1
- package/dist/server/server/session/agent-config/agent-config-session.d.ts +50 -0
- package/dist/server/server/session/agent-config/agent-config-session.js +98 -0
- package/dist/server/server/session/chat/chat-schedule-loop-session.d.ts +120 -0
- package/dist/server/server/session/chat/chat-schedule-loop-session.js +489 -0
- package/dist/server/server/session/checkout/checkout-session.d.ts +142 -0
- package/dist/server/server/session/checkout/checkout-session.js +925 -0
- package/dist/server/server/session/daemon/daemon-session.d.ts +50 -0
- package/dist/server/server/session/daemon/daemon-session.js +98 -0
- package/dist/server/server/session/files/workspace-files-session.d.ts +43 -0
- package/dist/server/server/session/files/workspace-files-session.js +218 -0
- package/dist/server/server/session/project-config/project-config-session.d.ts +34 -0
- package/dist/server/server/session/project-config/project-config-session.js +125 -0
- package/dist/server/server/session/provider/provider-catalog-session.d.ts +74 -0
- package/dist/server/server/session/provider/provider-catalog-session.js +339 -0
- package/dist/server/server/session/voice/voice-session.d.ts +166 -0
- package/dist/server/server/session/voice/voice-session.js +893 -0
- package/dist/server/server/{voice → session/voice}/voice-turn-controller.d.ts +2 -2
- package/dist/server/server/{voice → session/voice}/voice-turn-controller.js +2 -2
- package/dist/server/server/session.d.ts +13 -208
- package/dist/server/server/session.js +2132 -5105
- package/dist/server/utils/checkout-git.d.ts +6 -0
- package/package.json +5 -5
- package/dist/server/server/agent/providers/opencode/runtime.d.ts +0 -28
- 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
|
|
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
|
-
|
|
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,
|
|
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
|
|
1035
|
+
async fetchCatalog(_options) {
|
|
1036
1036
|
// Claude exposes a global catalog here; cwd/force are intentionally irrelevant.
|
|
1037
|
-
|
|
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
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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
|
|
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,
|
|
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,
|
|
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
|
|
3091
|
-
const usage = this.convertUsage(message, message.modelUsage
|
|
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
|
|
3236
|
-
return this.contextUsage.buildResultUsage(message, modelUsage
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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 {
|
|
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
|
|
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 {
|
|
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
|
}
|
|
@@ -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
|
|
5
|
-
import {
|
|
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,
|
|
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
|
-
|
|
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
|
|
383
|
-
return
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
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 [];
|