@getpaseo/server 0.1.74 → 0.1.76
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/scripts/supervisor-entrypoint.js +2 -21
- package/dist/scripts/supervisor-entrypoint.js.map +1 -1
- package/dist/scripts/supervisor-log-config.js +31 -0
- package/dist/scripts/supervisor-log-config.js.map +1 -0
- package/dist/server/client/daemon-client.d.ts +13 -2
- package/dist/server/client/daemon-client.d.ts.map +1 -1
- package/dist/server/client/daemon-client.js +36 -0
- package/dist/server/client/daemon-client.js.map +1 -1
- package/dist/server/server/agent/agent-manager.d.ts +5 -1
- package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
- package/dist/server/server/agent/agent-manager.js +152 -22
- package/dist/server/server/agent/agent-manager.js.map +1 -1
- package/dist/server/server/agent/agent-prompt.d.ts.map +1 -1
- package/dist/server/server/agent/agent-prompt.js +27 -0
- package/dist/server/server/agent/agent-prompt.js.map +1 -1
- package/dist/server/server/agent/agent-sdk-types.d.ts +5 -0
- package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
- package/dist/server/server/agent/agent-sdk-types.js +10 -0
- package/dist/server/server/agent/agent-sdk-types.js.map +1 -1
- package/dist/server/server/agent/foreground-run-state.d.ts +1 -1
- package/dist/server/server/agent/foreground-run-state.d.ts.map +1 -1
- package/dist/server/server/agent/foreground-run-state.js +2 -4
- package/dist/server/server/agent/foreground-run-state.js.map +1 -1
- package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
- package/dist/server/server/agent/mcp-server.js +74 -3
- package/dist/server/server/agent/mcp-server.js.map +1 -1
- package/dist/server/server/agent/provider-history-timestamps.d.ts +2 -0
- package/dist/server/server/agent/provider-history-timestamps.d.ts.map +1 -0
- package/dist/server/server/agent/provider-history-timestamps.js +16 -0
- package/dist/server/server/agent/provider-history-timestamps.js.map +1 -0
- package/dist/server/server/agent/provider-manifest.d.ts +1 -1
- package/dist/server/server/agent/provider-manifest.d.ts.map +1 -1
- package/dist/server/server/agent/provider-manifest.js +17 -3
- package/dist/server/server/agent/provider-manifest.js.map +1 -1
- package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
- package/dist/server/server/agent/provider-registry.js +66 -32
- package/dist/server/server/agent/provider-registry.js.map +1 -1
- package/dist/server/server/agent/provider-snapshot-manager.d.ts +2 -6
- package/dist/server/server/agent/provider-snapshot-manager.d.ts.map +1 -1
- package/dist/server/server/agent/provider-snapshot-manager.js +43 -32
- package/dist/server/server/agent/provider-snapshot-manager.js.map +1 -1
- package/dist/server/server/agent/providers/acp-agent.d.ts +42 -2
- package/dist/server/server/agent/providers/acp-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/acp-agent.js +182 -28
- package/dist/server/server/agent/providers/acp-agent.js.map +1 -1
- package/dist/server/server/agent/providers/claude/agent.d.ts +1 -1
- package/dist/server/server/agent/providers/claude/agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude/agent.js +191 -62
- package/dist/server/server/agent/providers/claude/agent.js.map +1 -1
- package/dist/server/server/agent/providers/claude/models.d.ts +2 -0
- package/dist/server/server/agent/providers/claude/models.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude/models.js +78 -0
- package/dist/server/server/agent/providers/claude/models.js.map +1 -1
- package/dist/server/server/agent/providers/codex/app-server-transport.d.ts +8 -1
- package/dist/server/server/agent/providers/codex/app-server-transport.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex/app-server-transport.js +32 -1
- package/dist/server/server/agent/providers/codex/app-server-transport.js.map +1 -1
- package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex/tool-call-mapper.js +36 -7
- package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +1 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +28 -4
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.js +487 -80
- package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
- package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +10 -1
- package/dist/server/server/agent/providers/copilot-acp-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/copilot-acp-agent.js +114 -7
- package/dist/server/server/agent/providers/copilot-acp-agent.js.map +1 -1
- package/dist/server/server/agent/providers/cursor-acp-agent.d.ts +21 -0
- package/dist/server/server/agent/providers/cursor-acp-agent.d.ts.map +1 -0
- package/dist/server/server/agent/providers/cursor-acp-agent.js +85 -0
- package/dist/server/server/agent/providers/cursor-acp-agent.js.map +1 -0
- package/dist/server/server/agent/providers/generic-acp-agent.d.ts +13 -0
- package/dist/server/server/agent/providers/generic-acp-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/generic-acp-agent.js +209 -2
- package/dist/server/server/agent/providers/generic-acp-agent.js.map +1 -1
- package/dist/server/server/agent/providers/opencode-agent.d.ts +7 -7
- package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/opencode-agent.js +121 -109
- package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
- package/dist/server/server/agent/providers/pi-direct-agent.d.ts +2 -2
- package/dist/server/server/agent/providers/pi-direct-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/pi-direct-agent.js +16 -15
- package/dist/server/server/agent/providers/pi-direct-agent.js.map +1 -1
- package/dist/server/server/agent/providers/pi-session-recovery-policy.d.ts +22 -0
- package/dist/server/server/agent/providers/pi-session-recovery-policy.d.ts.map +1 -0
- package/dist/server/server/agent/providers/pi-session-recovery-policy.js +51 -0
- package/dist/server/server/agent/providers/pi-session-recovery-policy.js.map +1 -0
- package/dist/server/server/agent/providers/provider-runner.d.ts +1 -1
- package/dist/server/server/agent/providers/provider-runner.d.ts.map +1 -1
- package/dist/server/server/agent/providers/provider-runner.js +2 -1
- package/dist/server/server/agent/providers/provider-runner.js.map +1 -1
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts +1 -1
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts.map +1 -1
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js +2 -1
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js.map +1 -1
- package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -1
- package/dist/server/server/agent/stt-manager.d.ts +5 -1
- package/dist/server/server/agent/stt-manager.d.ts.map +1 -1
- package/dist/server/server/agent/stt-manager.js +3 -2
- package/dist/server/server/agent/stt-manager.js.map +1 -1
- package/dist/server/server/agent/timeline-projection.d.ts.map +1 -1
- package/dist/server/server/agent/timeline-projection.js +9 -0
- package/dist/server/server/agent/timeline-projection.js.map +1 -1
- package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts +40 -0
- package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts.map +1 -0
- package/dist/server/server/auto-archive-on-merge/archive-if-safe.js +80 -0
- package/dist/server/server/auto-archive-on-merge/archive-if-safe.js.map +1 -0
- package/dist/server/server/auto-archive-on-merge/index.d.ts +8 -0
- package/dist/server/server/auto-archive-on-merge/index.d.ts.map +1 -0
- package/dist/server/server/auto-archive-on-merge/index.js +15 -0
- package/dist/server/server/auto-archive-on-merge/index.js.map +1 -0
- package/dist/server/server/bootstrap.d.ts +6 -0
- package/dist/server/server/bootstrap.d.ts.map +1 -1
- package/dist/server/server/bootstrap.js +74 -38
- package/dist/server/server/bootstrap.js.map +1 -1
- package/dist/server/server/checkout/status-projection.d.ts.map +1 -1
- package/dist/server/server/checkout/status-projection.js +5 -1
- package/dist/server/server/checkout/status-projection.js.map +1 -1
- package/dist/server/server/config.d.ts.map +1 -1
- package/dist/server/server/config.js +3 -1
- package/dist/server/server/config.js.map +1 -1
- package/dist/server/server/daemon-config-store.js +1 -0
- package/dist/server/server/daemon-config-store.js.map +1 -1
- package/dist/server/server/dictation/dictation-stream-manager.d.ts +2 -0
- package/dist/server/server/dictation/dictation-stream-manager.d.ts.map +1 -1
- package/dist/server/server/dictation/dictation-stream-manager.js +2 -1
- package/dist/server/server/dictation/dictation-stream-manager.js.map +1 -1
- package/dist/server/server/logger.js +1 -1
- package/dist/server/server/logger.js.map +1 -1
- package/dist/server/server/loop/rpc-schemas.d.ts +96 -96
- package/dist/server/server/loop-service.d.ts +18 -18
- package/dist/server/server/paseo-worktree-service.d.ts +3 -1
- package/dist/server/server/paseo-worktree-service.d.ts.map +1 -1
- package/dist/server/server/paseo-worktree-service.js +55 -18
- package/dist/server/server/paseo-worktree-service.js.map +1 -1
- package/dist/server/server/persisted-config.d.ts +25 -0
- package/dist/server/server/persisted-config.d.ts.map +1 -1
- package/dist/server/server/persisted-config.js +3 -0
- package/dist/server/server/persisted-config.js.map +1 -1
- package/dist/server/server/relay-transport.d.ts +2 -1
- package/dist/server/server/relay-transport.d.ts.map +1 -1
- package/dist/server/server/relay-transport.js +26 -4
- package/dist/server/server/relay-transport.js.map +1 -1
- package/dist/server/server/schedule/service.d.ts.map +1 -1
- package/dist/server/server/schedule/service.js +14 -1
- package/dist/server/server/schedule/service.js.map +1 -1
- package/dist/server/server/session.d.ts +9 -0
- package/dist/server/server/session.d.ts.map +1 -1
- package/dist/server/server/session.js +281 -50
- package/dist/server/server/session.js.map +1 -1
- package/dist/server/server/speech/providers/local/config.d.ts +5 -0
- package/dist/server/server/speech/providers/local/config.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/config.js +35 -0
- package/dist/server/server/speech/providers/local/config.js.map +1 -1
- package/dist/server/server/speech/speech-config-resolver.d.ts.map +1 -1
- package/dist/server/server/speech/speech-config-resolver.js +1 -0
- package/dist/server/server/speech/speech-config-resolver.js.map +1 -1
- package/dist/server/server/speech/speech-runtime.d.ts +2 -0
- package/dist/server/server/speech/speech-runtime.d.ts.map +1 -1
- package/dist/server/server/speech/speech-runtime.js +2 -0
- package/dist/server/server/speech/speech-runtime.js.map +1 -1
- package/dist/server/server/voice/voice-turn-controller.d.ts +1 -0
- package/dist/server/server/voice/voice-turn-controller.d.ts.map +1 -1
- package/dist/server/server/voice/voice-turn-controller.js +1 -1
- package/dist/server/server/voice/voice-turn-controller.js.map +1 -1
- package/dist/server/server/websocket-server.d.ts.map +1 -1
- package/dist/server/server/websocket-server.js +7 -0
- package/dist/server/server/websocket-server.js.map +1 -1
- package/dist/server/server/workspace-git-service.d.ts +6 -1
- package/dist/server/server/workspace-git-service.d.ts.map +1 -1
- package/dist/server/server/workspace-git-service.js +27 -4
- package/dist/server/server/workspace-git-service.js.map +1 -1
- package/dist/server/server/workspace-reconciliation-service.d.ts +4 -2
- package/dist/server/server/workspace-reconciliation-service.d.ts.map +1 -1
- package/dist/server/server/workspace-reconciliation-service.js +112 -14
- package/dist/server/server/workspace-reconciliation-service.js.map +1 -1
- package/dist/server/server/workspace-registry.d.ts +6 -1
- package/dist/server/server/workspace-registry.d.ts.map +1 -1
- package/dist/server/server/workspace-registry.js +11 -0
- package/dist/server/server/workspace-registry.js.map +1 -1
- package/dist/server/server/worktree-session.d.ts.map +1 -1
- package/dist/server/server/worktree-session.js +1 -0
- package/dist/server/server/worktree-session.js.map +1 -1
- package/dist/server/services/github-service.d.ts +46 -0
- package/dist/server/services/github-service.d.ts.map +1 -1
- package/dist/server/services/github-service.js +274 -5
- package/dist/server/services/github-service.js.map +1 -1
- package/dist/server/shared/messages.d.ts +3427 -290
- package/dist/server/shared/messages.d.ts.map +1 -1
- package/dist/server/shared/messages.js +93 -3
- package/dist/server/shared/messages.js.map +1 -1
- package/dist/server/shared/terminal-input-mode.d.ts +26 -0
- package/dist/server/shared/terminal-input-mode.d.ts.map +1 -0
- package/dist/server/shared/terminal-input-mode.js +151 -0
- package/dist/server/shared/terminal-input-mode.js.map +1 -0
- package/dist/server/terminal/terminal-session-controller.d.ts.map +1 -1
- package/dist/server/terminal/terminal-session-controller.js +12 -2
- package/dist/server/terminal/terminal-session-controller.js.map +1 -1
- package/dist/server/terminal/terminal.d.ts +1 -0
- package/dist/server/terminal/terminal.d.ts.map +1 -1
- package/dist/server/terminal/terminal.js +16 -3
- package/dist/server/terminal/terminal.js.map +1 -1
- package/dist/server/terminal/worker-terminal-manager.d.ts.map +1 -1
- package/dist/server/terminal/worker-terminal-manager.js +8 -0
- package/dist/server/terminal/worker-terminal-manager.js.map +1 -1
- package/dist/server/utils/checkout-git.d.ts +4 -1
- package/dist/server/utils/checkout-git.d.ts.map +1 -1
- package/dist/server/utils/checkout-git.js +85 -29
- package/dist/server/utils/checkout-git.js.map +1 -1
- package/dist/server/utils/directory-suggestions.d.ts.map +1 -1
- package/dist/server/utils/directory-suggestions.js +51 -14
- package/dist/server/utils/directory-suggestions.js.map +1 -1
- package/dist/server/utils/executable.d.ts.map +1 -1
- package/dist/server/utils/executable.js +6 -3
- package/dist/server/utils/executable.js.map +1 -1
- package/dist/server/utils/run-git-command.d.ts +2 -0
- package/dist/server/utils/run-git-command.d.ts.map +1 -1
- package/dist/server/utils/run-git-command.js +41 -1
- package/dist/server/utils/run-git-command.js.map +1 -1
- package/dist/server/utils/worktree.js +1 -1
- package/dist/server/utils/worktree.js.map +1 -1
- package/dist/src/server/agent/agent-sdk-types.js +10 -0
- package/dist/src/server/agent/agent-sdk-types.js.map +1 -1
- package/dist/src/server/agent/provider-manifest.js +17 -3
- package/dist/src/server/agent/provider-manifest.js.map +1 -1
- package/dist/src/server/persisted-config.js +3 -0
- package/dist/src/server/persisted-config.js.map +1 -1
- package/dist/src/shared/messages.js +93 -3
- package/dist/src/shared/messages.js.map +1 -1
- package/dist/src/utils/executable.js +6 -3
- package/dist/src/utils/executable.js.map +1 -1
- package/package.json +3 -3
|
@@ -5,20 +5,26 @@ import os from "node:os";
|
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { mapClaudeCanceledToolCall, mapClaudeCompletedToolCall, mapClaudeFailedToolCall, mapClaudeRunningToolCall, } from "./tool-call-mapper.js";
|
|
7
7
|
import { mapTaskNotificationSystemRecordToToolCall, mapTaskNotificationUserContentToToolCall, } from "./task-notification-tool-call.js";
|
|
8
|
-
import {
|
|
8
|
+
import { getClaudeModelsWithSettings, normalizeClaudeRuntimeModelId } from "./models.js";
|
|
9
9
|
import { parsePartialJsonObject } from "./partial-json.js";
|
|
10
10
|
import { ClaudeSidechainTracker } from "./sidechain-tracker.js";
|
|
11
11
|
import { formatDiagnosticStatus, formatProviderDiagnostic, formatProviderDiagnosticError, toDiagnosticErrorMessage, } from "../diagnostic-utils.js";
|
|
12
12
|
import { appendOrReplaceGrowingAssistantMessage, runProviderTurn } from "../provider-runner.js";
|
|
13
13
|
import { renderPromptAttachmentAsText } from "../../prompt-attachments.js";
|
|
14
14
|
import { claudeQuery } from "./query.js";
|
|
15
|
+
import { normalizeProviderReplayTimestamp } from "../../provider-history-timestamps.js";
|
|
16
|
+
import { getAgentStreamEventTurnId, } from "../../agent-sdk-types.js";
|
|
15
17
|
import { createProviderEnv, createProviderEnvSpec, } from "../../provider-launch-config.js";
|
|
16
18
|
import { findExecutable, isCommandAvailable } from "../../../../utils/executable.js";
|
|
17
19
|
import { withTimeout } from "../../../../utils/promise-timeout.js";
|
|
18
20
|
import { execCommand } from "../../../../utils/spawn.js";
|
|
19
21
|
import { getOrchestratorModeInstructions } from "../../orchestrator-instructions.js";
|
|
20
22
|
const fsPromises = promises;
|
|
21
|
-
const CLAUDE_SETTING_SOURCES = [
|
|
23
|
+
const CLAUDE_SETTING_SOURCES = [
|
|
24
|
+
"user",
|
|
25
|
+
"project",
|
|
26
|
+
"local",
|
|
27
|
+
];
|
|
22
28
|
function readNonEmptyString(value) {
|
|
23
29
|
return typeof value === "string" && value.trim().length > 0 ? value : null;
|
|
24
30
|
}
|
|
@@ -90,6 +96,11 @@ const DEFAULT_MODES = [
|
|
|
90
96
|
label: "Always Ask",
|
|
91
97
|
description: "Prompts for permission the first time a tool is used",
|
|
92
98
|
},
|
|
99
|
+
{
|
|
100
|
+
id: "auto",
|
|
101
|
+
label: "Auto mode",
|
|
102
|
+
description: "Uses a model classifier to review permission prompts automatically",
|
|
103
|
+
},
|
|
93
104
|
{
|
|
94
105
|
id: "acceptEdits",
|
|
95
106
|
label: "Accept File Edits",
|
|
@@ -433,6 +444,34 @@ function isMcpServersRecord(value) {
|
|
|
433
444
|
function isPermissionMode(value) {
|
|
434
445
|
return typeof value === "string" && VALID_CLAUDE_MODES.has(value);
|
|
435
446
|
}
|
|
447
|
+
function isTruthyEnvValue(value) {
|
|
448
|
+
const normalized = value?.trim().toLowerCase();
|
|
449
|
+
return (normalized !== undefined &&
|
|
450
|
+
normalized.length > 0 &&
|
|
451
|
+
normalized !== "0" &&
|
|
452
|
+
normalized !== "false" &&
|
|
453
|
+
normalized !== "no" &&
|
|
454
|
+
normalized !== "off");
|
|
455
|
+
}
|
|
456
|
+
function detectIneligibleAutoModeTransport(env) {
|
|
457
|
+
if (isTruthyEnvValue(env.CLAUDE_CODE_USE_BEDROCK)) {
|
|
458
|
+
return "Bedrock";
|
|
459
|
+
}
|
|
460
|
+
if (isTruthyEnvValue(env.CLAUDE_CODE_USE_VERTEX)) {
|
|
461
|
+
return "Vertex";
|
|
462
|
+
}
|
|
463
|
+
return null;
|
|
464
|
+
}
|
|
465
|
+
function assertClaudeAutoModeEligible(mode, env) {
|
|
466
|
+
if (mode !== "auto") {
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
469
|
+
const transport = detectIneligibleAutoModeTransport(env);
|
|
470
|
+
if (transport === null) {
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
throw new Error(`Claude Auto mode requires the Anthropic API and is not supported when Claude Code uses ${transport}. Select another permission mode or unset the ${transport === "Bedrock" ? "CLAUDE_CODE_USE_BEDROCK" : "CLAUDE_CODE_USE_VERTEX"} environment variable.`);
|
|
474
|
+
}
|
|
436
475
|
function coerceSessionMetadata(metadata) {
|
|
437
476
|
if (!isMetadata(metadata)) {
|
|
438
477
|
return {};
|
|
@@ -837,7 +876,6 @@ export function readEventIdentifiers(message) {
|
|
|
837
876
|
]),
|
|
838
877
|
};
|
|
839
878
|
}
|
|
840
|
-
const claudeDebug = process.env.PASEO_CLAUDE_DEBUG === "1";
|
|
841
879
|
export class ClaudeAgentClient {
|
|
842
880
|
constructor(options) {
|
|
843
881
|
this.provider = "claude";
|
|
@@ -853,6 +891,7 @@ export class ClaudeAgentClient {
|
|
|
853
891
|
return new ClaudeAgentSession(claudeConfig, {
|
|
854
892
|
defaults: this.defaults,
|
|
855
893
|
runtimeSettings: this.runtimeSettings,
|
|
894
|
+
agentId: launchContext?.agentId,
|
|
856
895
|
launchEnv: launchContext?.env,
|
|
857
896
|
persistSession: options?.persistSession,
|
|
858
897
|
logger: this.logger,
|
|
@@ -876,6 +915,7 @@ export class ClaudeAgentClient {
|
|
|
876
915
|
defaults: this.defaults,
|
|
877
916
|
runtimeSettings: this.runtimeSettings,
|
|
878
917
|
handle,
|
|
918
|
+
agentId: launchContext?.agentId,
|
|
879
919
|
launchEnv: launchContext?.env,
|
|
880
920
|
logger: this.logger,
|
|
881
921
|
queryFactory: this.queryFactory,
|
|
@@ -883,8 +923,8 @@ export class ClaudeAgentClient {
|
|
|
883
923
|
});
|
|
884
924
|
}
|
|
885
925
|
async listModels(_options) {
|
|
886
|
-
// Claude exposes a
|
|
887
|
-
return
|
|
926
|
+
// Claude exposes a global catalog here; cwd/force are intentionally irrelevant.
|
|
927
|
+
return await getClaudeModelsWithSettings(this.logger);
|
|
888
928
|
}
|
|
889
929
|
async listPersistedAgents(options) {
|
|
890
930
|
const configDir = process.env.CLAUDE_CONFIG_DIR ?? path.join(os.homedir(), ".claude");
|
|
@@ -1202,10 +1242,11 @@ class ClaudeAgentSession {
|
|
|
1202
1242
|
};
|
|
1203
1243
|
this.config = config;
|
|
1204
1244
|
this.launchEnv = options.launchEnv;
|
|
1245
|
+
this.agentId = options.agentId;
|
|
1205
1246
|
this.defaults = options.defaults;
|
|
1206
1247
|
this.runtimeSettings = options.runtimeSettings;
|
|
1207
1248
|
this.persistSession = options.persistSession;
|
|
1208
|
-
this.logger = options.logger;
|
|
1249
|
+
this.logger = options.logger.child({ agentId: this.agentId });
|
|
1209
1250
|
this.queryFactory = options.queryFactory;
|
|
1210
1251
|
this.resolveBinary = options.resolveBinary;
|
|
1211
1252
|
const handle = options.handle;
|
|
@@ -1357,8 +1398,13 @@ class ClaudeAgentSession {
|
|
|
1357
1398
|
const history = this.persistedHistory;
|
|
1358
1399
|
this.persistedHistory = [];
|
|
1359
1400
|
this.historyPending = false;
|
|
1360
|
-
for (const
|
|
1361
|
-
yield {
|
|
1401
|
+
for (const entry of history) {
|
|
1402
|
+
yield {
|
|
1403
|
+
type: "timeline",
|
|
1404
|
+
item: entry.item,
|
|
1405
|
+
provider: "claude",
|
|
1406
|
+
timestamp: entry.timestamp,
|
|
1407
|
+
};
|
|
1362
1408
|
}
|
|
1363
1409
|
}
|
|
1364
1410
|
async getAvailableModes() {
|
|
@@ -1374,6 +1420,7 @@ class ClaudeAgentSession {
|
|
|
1374
1420
|
throw new Error(`Invalid mode '${modeId}' for Claude provider. Valid modes: ${validModesList}`);
|
|
1375
1421
|
}
|
|
1376
1422
|
const normalized = isPermissionMode(modeId) ? modeId : "default";
|
|
1423
|
+
assertClaudeAutoModeEligible(normalized, this.buildSdkEnv(this.config.extra?.claude));
|
|
1377
1424
|
const previousMode = this.currentMode;
|
|
1378
1425
|
const activeQuery = await this.ensureQuery();
|
|
1379
1426
|
await activeQuery.setPermissionMode(normalized);
|
|
@@ -1494,12 +1541,15 @@ class ClaudeAgentSession {
|
|
|
1494
1541
|
}
|
|
1495
1542
|
async close() {
|
|
1496
1543
|
this.logger.trace({
|
|
1497
|
-
|
|
1544
|
+
agentId: this.agentId,
|
|
1545
|
+
provider: "claude",
|
|
1546
|
+
sessionId: this.claudeSessionId,
|
|
1547
|
+
turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
|
|
1498
1548
|
turnState: this.turnState,
|
|
1499
1549
|
hasQuery: Boolean(this.query),
|
|
1500
1550
|
hasInput: Boolean(this.input),
|
|
1501
1551
|
hasActiveForegroundTurnId: Boolean(this.activeForegroundTurnId),
|
|
1502
|
-
}, "
|
|
1552
|
+
}, "provider.claude.session_close.start");
|
|
1503
1553
|
this.closed = true;
|
|
1504
1554
|
this.rejectAllPendingPermissions(new Error("Claude session closed"));
|
|
1505
1555
|
this.cancelCurrentTurn?.();
|
|
@@ -1530,7 +1580,12 @@ class ClaudeAgentSession {
|
|
|
1530
1580
|
}
|
|
1531
1581
|
}
|
|
1532
1582
|
}
|
|
1533
|
-
this.logger.trace({
|
|
1583
|
+
this.logger.trace({
|
|
1584
|
+
agentId: this.agentId,
|
|
1585
|
+
provider: "claude",
|
|
1586
|
+
sessionId: this.claudeSessionId,
|
|
1587
|
+
turnState: this.turnState,
|
|
1588
|
+
}, "provider.claude.session_close.complete");
|
|
1534
1589
|
}
|
|
1535
1590
|
async listCommands() {
|
|
1536
1591
|
const q = await this.ensureQuery();
|
|
@@ -1670,9 +1725,9 @@ class ClaudeAgentSession {
|
|
|
1670
1725
|
pushUnique(historyIds[idx]);
|
|
1671
1726
|
}
|
|
1672
1727
|
for (let idx = this.persistedHistory.length - 1; idx >= 0; idx -= 1) {
|
|
1673
|
-
const
|
|
1674
|
-
if (item
|
|
1675
|
-
pushUnique(item.messageId);
|
|
1728
|
+
const entry = this.persistedHistory[idx];
|
|
1729
|
+
if (entry?.item.type === "user_message") {
|
|
1730
|
+
pushUnique(entry.item.messageId);
|
|
1676
1731
|
}
|
|
1677
1732
|
}
|
|
1678
1733
|
for (let idx = this.userMessageIds.length - 1; idx >= 0; idx -= 1) {
|
|
@@ -1763,14 +1818,33 @@ class ClaudeAgentSession {
|
|
|
1763
1818
|
}
|
|
1764
1819
|
async awaitWithTimeout(promise, label) {
|
|
1765
1820
|
if (!promise) {
|
|
1766
|
-
this.logger.trace({
|
|
1821
|
+
this.logger.trace({
|
|
1822
|
+
agentId: this.agentId,
|
|
1823
|
+
provider: "claude",
|
|
1824
|
+
sessionId: this.claudeSessionId,
|
|
1825
|
+
turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
|
|
1826
|
+
label,
|
|
1827
|
+
}, "provider.claude.query_operation.skip");
|
|
1767
1828
|
return;
|
|
1768
1829
|
}
|
|
1769
1830
|
const startedAt = Date.now();
|
|
1770
|
-
this.logger.trace({
|
|
1831
|
+
this.logger.trace({
|
|
1832
|
+
agentId: this.agentId,
|
|
1833
|
+
provider: "claude",
|
|
1834
|
+
sessionId: this.claudeSessionId,
|
|
1835
|
+
turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
|
|
1836
|
+
label,
|
|
1837
|
+
}, "provider.claude.query_operation.start");
|
|
1771
1838
|
try {
|
|
1772
1839
|
await withTimeout(promise, 3000, "timeout");
|
|
1773
|
-
this.logger.trace({
|
|
1840
|
+
this.logger.trace({
|
|
1841
|
+
agentId: this.agentId,
|
|
1842
|
+
provider: "claude",
|
|
1843
|
+
sessionId: this.claudeSessionId,
|
|
1844
|
+
turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
|
|
1845
|
+
label,
|
|
1846
|
+
durationMs: Date.now() - startedAt,
|
|
1847
|
+
}, "provider.claude.query_operation.settled");
|
|
1774
1848
|
}
|
|
1775
1849
|
catch (error) {
|
|
1776
1850
|
this.logger.warn({ err: error, label }, "Claude query operation did not settle cleanly");
|
|
@@ -1790,11 +1864,8 @@ class ClaudeAgentSession {
|
|
|
1790
1864
|
.filter((entry) => typeof entry === "string" && entry.length > 0)
|
|
1791
1865
|
.join("\n\n");
|
|
1792
1866
|
}
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
const appendedSystemPrompt = this.buildAppendedSystemPrompt();
|
|
1796
|
-
const extraClaudeOptions = this.config.extra?.claude;
|
|
1797
|
-
const sdkEnv = createProviderEnv({
|
|
1867
|
+
buildSdkEnv(extraClaudeOptions) {
|
|
1868
|
+
return createProviderEnv({
|
|
1798
1869
|
baseEnv: process.env,
|
|
1799
1870
|
runtimeSettings: this.runtimeSettings,
|
|
1800
1871
|
overlays: [
|
|
@@ -1807,6 +1878,13 @@ class ClaudeAgentSession {
|
|
|
1807
1878
|
this.launchEnv,
|
|
1808
1879
|
],
|
|
1809
1880
|
});
|
|
1881
|
+
}
|
|
1882
|
+
async buildOptions() {
|
|
1883
|
+
const { thinking, effort } = this.resolveThinkingConfig();
|
|
1884
|
+
const appendedSystemPrompt = this.buildAppendedSystemPrompt();
|
|
1885
|
+
const extraClaudeOptions = this.config.extra?.claude;
|
|
1886
|
+
const sdkEnv = this.buildSdkEnv(extraClaudeOptions);
|
|
1887
|
+
assertClaudeAutoModeEligible(this.currentMode, sdkEnv);
|
|
1810
1888
|
const claudeBinary = await this.resolveBinary();
|
|
1811
1889
|
this.logger.debug({
|
|
1812
1890
|
claudeBinary,
|
|
@@ -2107,7 +2185,13 @@ class ClaudeAgentSession {
|
|
|
2107
2185
|
return;
|
|
2108
2186
|
}
|
|
2109
2187
|
const pump = this.runQueryPump().catch((error) => {
|
|
2110
|
-
this.logger.trace({
|
|
2188
|
+
this.logger.trace({
|
|
2189
|
+
agentId: this.agentId,
|
|
2190
|
+
provider: "claude",
|
|
2191
|
+
sessionId: this.claudeSessionId,
|
|
2192
|
+
turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
|
|
2193
|
+
err: error,
|
|
2194
|
+
}, "provider.claude.query_pump.exit_unexpected");
|
|
2111
2195
|
});
|
|
2112
2196
|
this.queryPumpPromise = pump;
|
|
2113
2197
|
void pump.finally(() => {
|
|
@@ -2122,21 +2206,28 @@ class ClaudeAgentSession {
|
|
|
2122
2206
|
activeQuery = await this.ensureQuery();
|
|
2123
2207
|
}
|
|
2124
2208
|
catch (error) {
|
|
2125
|
-
this.logger.trace({
|
|
2209
|
+
this.logger.trace({
|
|
2210
|
+
agentId: this.agentId,
|
|
2211
|
+
provider: "claude",
|
|
2212
|
+
sessionId: this.claudeSessionId,
|
|
2213
|
+
turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
|
|
2214
|
+
err: error,
|
|
2215
|
+
}, "provider.claude.query_pump.init_failed");
|
|
2126
2216
|
this.failActiveTurns(error instanceof Error ? error.message : "Claude stream failed");
|
|
2127
2217
|
return;
|
|
2128
2218
|
}
|
|
2129
2219
|
let consecutiveInterruptAbortRecoveries = 0;
|
|
2130
2220
|
const logRawMessage = (message) => {
|
|
2131
|
-
if (!claudeDebug) {
|
|
2132
|
-
return;
|
|
2133
|
-
}
|
|
2134
2221
|
this.logger.trace({
|
|
2135
|
-
|
|
2222
|
+
agentId: this.agentId,
|
|
2223
|
+
provider: "claude",
|
|
2224
|
+
sessionId: this.claudeSessionId,
|
|
2225
|
+
turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
|
|
2136
2226
|
messageType: message.type,
|
|
2137
2227
|
messageSubtype: "subtype" in message ? message.subtype : undefined,
|
|
2138
2228
|
messageUuid: "uuid" in message ? message.uuid : undefined,
|
|
2139
|
-
|
|
2229
|
+
rawEvent: message,
|
|
2230
|
+
}, "provider.claude.raw_event");
|
|
2140
2231
|
};
|
|
2141
2232
|
const handlePumpedMessage = async (message) => {
|
|
2142
2233
|
logRawMessage(message);
|
|
@@ -2234,13 +2325,15 @@ class ClaudeAgentSession {
|
|
|
2234
2325
|
}
|
|
2235
2326
|
const turnId = this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? null;
|
|
2236
2327
|
const identifiers = readEventIdentifiers(message);
|
|
2237
|
-
|
|
2238
|
-
this.
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
2328
|
+
this.logger.trace({
|
|
2329
|
+
agentId: this.agentId,
|
|
2330
|
+
provider: "claude",
|
|
2331
|
+
sessionId: this.claudeSessionId,
|
|
2332
|
+
turnId: turnId ?? undefined,
|
|
2333
|
+
messageType: message.type,
|
|
2334
|
+
identifiers,
|
|
2335
|
+
rawEvent: message,
|
|
2336
|
+
}, "provider.claude.parsed_event");
|
|
2244
2337
|
const messageEvents = this.translateMessageToEvents(message, {
|
|
2245
2338
|
suppressAssistantText: true,
|
|
2246
2339
|
suppressReasoning: true,
|
|
@@ -2284,7 +2377,6 @@ class ClaudeAgentSession {
|
|
|
2284
2377
|
return false;
|
|
2285
2378
|
}
|
|
2286
2379
|
this.logger.warn({
|
|
2287
|
-
claudeSessionId: this.claudeSessionId,
|
|
2288
2380
|
error: staleResumeError,
|
|
2289
2381
|
}, "Claude resumed session no longer exists; invalidating persisted session");
|
|
2290
2382
|
this.failActiveTurns(staleResumeError);
|
|
@@ -2307,7 +2399,12 @@ class ClaudeAgentSession {
|
|
|
2307
2399
|
async interruptActiveTurn() {
|
|
2308
2400
|
const queryToInterrupt = this.query;
|
|
2309
2401
|
if (!queryToInterrupt || typeof queryToInterrupt.interrupt !== "function") {
|
|
2310
|
-
this.logger.trace(
|
|
2402
|
+
this.logger.trace({
|
|
2403
|
+
agentId: this.agentId,
|
|
2404
|
+
provider: "claude",
|
|
2405
|
+
sessionId: this.claudeSessionId,
|
|
2406
|
+
turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
|
|
2407
|
+
}, "provider.claude.interrupt.no_query");
|
|
2311
2408
|
return;
|
|
2312
2409
|
}
|
|
2313
2410
|
this.pendingInterruptAbort = true;
|
|
@@ -2415,29 +2512,7 @@ class ClaudeAgentSession {
|
|
|
2415
2512
|
return;
|
|
2416
2513
|
}
|
|
2417
2514
|
if (message.subtype === "task_notification") {
|
|
2418
|
-
|
|
2419
|
-
// arrive without parent_tool_use_id but with tool_use_id pointing at the
|
|
2420
|
-
// parent's Task call, so they slip past the sidechain router and pollute
|
|
2421
|
-
// the parent timeline. Drop them here; eventually thread them into the
|
|
2422
|
-
// parent Task tool call's sub_agent log instead.
|
|
2423
|
-
const taskUseId = message.tool_use_id;
|
|
2424
|
-
const cachedTool = taskUseId ? this.toolUseCache.get(taskUseId) : undefined;
|
|
2425
|
-
if (cachedTool?.name === "Task") {
|
|
2426
|
-
return;
|
|
2427
|
-
}
|
|
2428
|
-
const taskNotificationItem = mapTaskNotificationSystemRecordToToolCall(message);
|
|
2429
|
-
if (taskNotificationItem) {
|
|
2430
|
-
events.push({
|
|
2431
|
-
type: "timeline",
|
|
2432
|
-
item: taskNotificationItem,
|
|
2433
|
-
provider: "claude",
|
|
2434
|
-
});
|
|
2435
|
-
}
|
|
2436
|
-
const usage = readUsageFromTaskNotification(message);
|
|
2437
|
-
if (typeof usage === "number") {
|
|
2438
|
-
this.lastContextWindowUsedTokens = usage;
|
|
2439
|
-
events.push(this.createUsageUpdatedEvent(usage));
|
|
2440
|
-
}
|
|
2515
|
+
this.appendTaskNotificationEvents(message, events);
|
|
2441
2516
|
return;
|
|
2442
2517
|
}
|
|
2443
2518
|
if (message.subtype === "task_progress") {
|
|
@@ -2448,6 +2523,31 @@ class ClaudeAgentSession {
|
|
|
2448
2523
|
}
|
|
2449
2524
|
}
|
|
2450
2525
|
}
|
|
2526
|
+
appendTaskNotificationEvents(message, events) {
|
|
2527
|
+
// TODO: subagent timelines are best-effort. Subagent task_notifications
|
|
2528
|
+
// arrive without parent_tool_use_id but with tool_use_id pointing at the
|
|
2529
|
+
// parent's Task call, so they slip past the sidechain router and pollute
|
|
2530
|
+
// the parent timeline. Drop them here; eventually thread them into the
|
|
2531
|
+
// parent Task tool call's sub_agent log instead.
|
|
2532
|
+
const taskUseId = message.tool_use_id;
|
|
2533
|
+
const cachedTool = taskUseId ? this.toolUseCache.get(taskUseId) : undefined;
|
|
2534
|
+
if (cachedTool?.name === "Task") {
|
|
2535
|
+
return;
|
|
2536
|
+
}
|
|
2537
|
+
const taskNotificationItem = mapTaskNotificationSystemRecordToToolCall(message);
|
|
2538
|
+
if (taskNotificationItem) {
|
|
2539
|
+
events.push({
|
|
2540
|
+
type: "timeline",
|
|
2541
|
+
item: taskNotificationItem,
|
|
2542
|
+
provider: "claude",
|
|
2543
|
+
});
|
|
2544
|
+
}
|
|
2545
|
+
const usage = readUsageFromTaskNotification(message);
|
|
2546
|
+
if (typeof usage === "number") {
|
|
2547
|
+
this.lastContextWindowUsedTokens = usage;
|
|
2548
|
+
events.push(this.createUsageUpdatedEvent(usage));
|
|
2549
|
+
}
|
|
2550
|
+
}
|
|
2451
2551
|
appendUserMessageEvents(message, events) {
|
|
2452
2552
|
if (isSyntheticUserEntry(message)) {
|
|
2453
2553
|
return;
|
|
@@ -2521,6 +2621,24 @@ class ClaudeAgentSession {
|
|
|
2521
2621
|
appendResultEvents(message, events) {
|
|
2522
2622
|
const usage = this.convertUsage(message, message.modelUsage);
|
|
2523
2623
|
if (message.subtype === "success") {
|
|
2624
|
+
// Built-in slash commands (e.g. /voice, /usage, "Unknown command: …")
|
|
2625
|
+
// run client-side in the Claude CLI with no model turn — output_tokens
|
|
2626
|
+
// is 0 and the user-visible text is carried in `result`. Surface it as
|
|
2627
|
+
// an assistant message so the turn doesn't end silently. Normal turns
|
|
2628
|
+
// have output_tokens > 0 and their text is already in the stream.
|
|
2629
|
+
const resultText = typeof message.result === "string" ? message.result.trim() : "";
|
|
2630
|
+
const outputTokens = message.usage?.output_tokens;
|
|
2631
|
+
if (resultText.length > 0 && outputTokens === 0) {
|
|
2632
|
+
events.push({
|
|
2633
|
+
type: "timeline",
|
|
2634
|
+
provider: "claude",
|
|
2635
|
+
item: {
|
|
2636
|
+
type: "assistant_message",
|
|
2637
|
+
text: resultText,
|
|
2638
|
+
messageId: message.uuid,
|
|
2639
|
+
},
|
|
2640
|
+
});
|
|
2641
|
+
}
|
|
2524
2642
|
events.push({ type: "turn_completed", provider: "claude", usage });
|
|
2525
2643
|
return;
|
|
2526
2644
|
}
|
|
@@ -2759,6 +2877,13 @@ class ClaudeAgentSession {
|
|
|
2759
2877
|
notifySubscribers(event) {
|
|
2760
2878
|
const turnId = this.activeForegroundTurnId ?? this.autonomousTurn?.id;
|
|
2761
2879
|
const tagged = turnId ? { ...event, turnId } : event;
|
|
2880
|
+
this.logger.trace({
|
|
2881
|
+
agentId: this.agentId,
|
|
2882
|
+
provider: "claude",
|
|
2883
|
+
sessionId: this.claudeSessionId,
|
|
2884
|
+
turnId: getAgentStreamEventTurnId(tagged),
|
|
2885
|
+
event: tagged,
|
|
2886
|
+
}, "provider.claude.event_emit");
|
|
2762
2887
|
for (const callback of this.subscribers) {
|
|
2763
2888
|
try {
|
|
2764
2889
|
callback(tagged);
|
|
@@ -2830,9 +2955,13 @@ class ClaudeAgentSession {
|
|
|
2830
2955
|
if (entry.type === "user" && typeof entry.uuid === "string") {
|
|
2831
2956
|
this.rememberUserMessageId(entry.uuid);
|
|
2832
2957
|
}
|
|
2958
|
+
const historyTimestamp = normalizeProviderReplayTimestamp(entry.timestamp);
|
|
2833
2959
|
const items = this.convertHistoryEntry(entry);
|
|
2834
2960
|
if (items.length > 0) {
|
|
2835
|
-
timeline.push(...items)
|
|
2961
|
+
timeline.push(...items.map((item) => ({
|
|
2962
|
+
item,
|
|
2963
|
+
timestamp: historyTimestamp ?? undefined,
|
|
2964
|
+
})));
|
|
2836
2965
|
}
|
|
2837
2966
|
}
|
|
2838
2967
|
resolveHistoryPath(sessionId) {
|