shennian 0.2.0 → 0.2.5
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/bin/shennian.d.ts +0 -1
- package/dist/bin/shennian.js +0 -1
- package/dist/src/agents/adapter.d.ts +0 -1
- package/dist/src/agents/adapter.js +0 -1
- package/dist/src/agents/claude.d.ts +1 -1
- package/dist/src/agents/claude.js +12 -6
- package/dist/src/agents/codex.d.ts +18 -1
- package/dist/src/agents/codex.js +372 -13
- package/dist/src/agents/command-spec.d.ts +28 -3
- package/dist/src/agents/command-spec.js +251 -10
- package/dist/src/agents/cursor.d.ts +0 -1
- package/dist/src/agents/cursor.js +2 -4
- package/dist/src/agents/custom.d.ts +0 -6
- package/dist/src/agents/custom.js +4 -40
- package/dist/src/agents/detect.d.ts +0 -1
- package/dist/src/agents/detect.js +0 -1
- package/dist/src/agents/gemini.d.ts +0 -1
- package/dist/src/agents/gemini.js +7 -3
- package/dist/src/agents/model-registry/cache.d.ts +0 -1
- package/dist/src/agents/model-registry/cache.js +0 -1
- package/dist/src/agents/model-registry/discovery.d.ts +0 -1
- package/dist/src/agents/model-registry/discovery.js +90 -48
- package/dist/src/agents/model-registry/parsers.d.ts +4 -1
- package/dist/src/agents/model-registry/parsers.js +168 -1
- package/dist/src/agents/model-registry/runner.d.ts +2 -7
- package/dist/src/agents/model-registry/runner.js +3 -134
- package/dist/src/agents/model-registry/service.d.ts +0 -1
- package/dist/src/agents/model-registry/service.js +12 -10
- package/dist/src/agents/model-registry/types.d.ts +0 -1
- package/dist/src/agents/model-registry/types.js +0 -1
- package/dist/src/agents/model-registry.d.ts +3 -2
- package/dist/src/agents/model-registry.js +3 -2
- package/dist/src/agents/openclaw.d.ts +0 -1
- package/dist/src/agents/openclaw.js +13 -4
- package/dist/src/agents/pi.d.ts +0 -1
- package/dist/src/agents/pi.js +0 -1
- package/dist/src/commands/agent.d.ts +0 -1
- package/dist/src/commands/agent.js +2 -33
- package/dist/src/commands/daemon.d.ts +6 -1
- package/dist/src/commands/daemon.js +153 -18
- package/dist/src/commands/pair-qr.d.ts +0 -1
- package/dist/src/commands/pair-qr.js +0 -1
- package/dist/src/commands/pair.d.ts +0 -1
- package/dist/src/commands/pair.js +0 -1
- package/dist/src/commands/upgrade.d.ts +0 -1
- package/dist/src/commands/upgrade.js +0 -1
- package/dist/src/config/index.d.ts +0 -1
- package/dist/src/config/index.js +0 -1
- package/dist/src/fs/handler.d.ts +0 -1
- package/dist/src/fs/handler.js +18 -1
- package/dist/src/fs/security.d.ts +0 -1
- package/dist/src/fs/security.js +5 -1
- package/dist/src/index.d.ts +0 -1
- package/dist/src/index.js +36 -8
- package/dist/src/log-reporter.d.ts +0 -1
- package/dist/src/log-reporter.js +2 -20
- package/dist/src/native-fusion/parsers.d.ts +0 -1
- package/dist/src/native-fusion/parsers.js +407 -44
- package/dist/src/native-fusion/service.d.ts +0 -1
- package/dist/src/native-fusion/service.js +16 -10
- package/dist/src/native-fusion/state.d.ts +0 -1
- package/dist/src/native-fusion/state.js +0 -1
- package/dist/src/native-fusion/types.d.ts +0 -1
- package/dist/src/native-fusion/types.js +0 -1
- package/dist/src/region.d.ts +0 -1
- package/dist/src/region.js +0 -1
- package/dist/src/relay/client.d.ts +11 -2
- package/dist/src/relay/client.js +22 -4
- package/dist/src/session/handlers/agents.d.ts +0 -1
- package/dist/src/session/handlers/agents.js +0 -1
- package/dist/src/session/handlers/chat.d.ts +0 -1
- package/dist/src/session/handlers/chat.js +49 -8
- package/dist/src/session/handlers/control.d.ts +0 -1
- package/dist/src/session/handlers/control.js +0 -1
- package/dist/src/session/handlers/fs.d.ts +0 -1
- package/dist/src/session/handlers/fs.js +37 -3
- package/dist/src/session/manager.d.ts +1 -1
- package/dist/src/session/manager.js +23 -4
- package/dist/src/session/store.d.ts +0 -1
- package/dist/src/session/store.js +0 -1
- package/dist/src/session/types.d.ts +6 -1
- package/dist/src/session/types.js +0 -1
- package/dist/src/upgrade/engine.d.ts +0 -1
- package/dist/src/upgrade/engine.js +0 -1
- package/package.json +3 -2
- package/dist/bin/shennian.d.ts.map +0 -1
- package/dist/bin/shennian.js.map +0 -1
- package/dist/src/__experiments__/probe-debug.d.ts +0 -2
- package/dist/src/__experiments__/probe-debug.d.ts.map +0 -1
- package/dist/src/__experiments__/probe-debug.js +0 -66
- package/dist/src/__experiments__/probe-debug.js.map +0 -1
- package/dist/src/__experiments__/probe-final-benchmark.d.ts +0 -3
- package/dist/src/__experiments__/probe-final-benchmark.d.ts.map +0 -1
- package/dist/src/__experiments__/probe-final-benchmark.js +0 -234
- package/dist/src/__experiments__/probe-final-benchmark.js.map +0 -1
- package/dist/src/__experiments__/probe-models-final.d.ts +0 -19
- package/dist/src/__experiments__/probe-models-final.d.ts.map +0 -1
- package/dist/src/__experiments__/probe-models-final.js +0 -250
- package/dist/src/__experiments__/probe-models-final.js.map +0 -1
- package/dist/src/__experiments__/probe-models.d.ts +0 -7
- package/dist/src/__experiments__/probe-models.d.ts.map +0 -1
- package/dist/src/__experiments__/probe-models.js +0 -251
- package/dist/src/__experiments__/probe-models.js.map +0 -1
- package/dist/src/__tests__/agents-e2e.d.ts +0 -21
- package/dist/src/__tests__/agents-e2e.d.ts.map +0 -1
- package/dist/src/__tests__/agents-e2e.js +0 -146
- package/dist/src/__tests__/agents-e2e.js.map +0 -1
- package/dist/src/__tests__/claude-adapter.test.d.ts +0 -2
- package/dist/src/__tests__/claude-adapter.test.d.ts.map +0 -1
- package/dist/src/__tests__/claude-adapter.test.js +0 -75
- package/dist/src/__tests__/claude-adapter.test.js.map +0 -1
- package/dist/src/__tests__/codex-adapter.test.d.ts +0 -2
- package/dist/src/__tests__/codex-adapter.test.d.ts.map +0 -1
- package/dist/src/__tests__/codex-adapter.test.js +0 -224
- package/dist/src/__tests__/codex-adapter.test.js.map +0 -1
- package/dist/src/__tests__/config.test.d.ts +0 -2
- package/dist/src/__tests__/config.test.d.ts.map +0 -1
- package/dist/src/__tests__/config.test.js +0 -60
- package/dist/src/__tests__/config.test.js.map +0 -1
- package/dist/src/__tests__/cursor-adapter.test.d.ts +0 -2
- package/dist/src/__tests__/cursor-adapter.test.d.ts.map +0 -1
- package/dist/src/__tests__/cursor-adapter.test.js +0 -69
- package/dist/src/__tests__/cursor-adapter.test.js.map +0 -1
- package/dist/src/__tests__/custom-agent-flow.test.d.ts +0 -2
- package/dist/src/__tests__/custom-agent-flow.test.d.ts.map +0 -1
- package/dist/src/__tests__/custom-agent-flow.test.js +0 -244
- package/dist/src/__tests__/custom-agent-flow.test.js.map +0 -1
- package/dist/src/__tests__/daemon-autostart.test.d.ts +0 -2
- package/dist/src/__tests__/daemon-autostart.test.d.ts.map +0 -1
- package/dist/src/__tests__/daemon-autostart.test.js +0 -60
- package/dist/src/__tests__/daemon-autostart.test.js.map +0 -1
- package/dist/src/__tests__/e2e-relay.d.ts +0 -19
- package/dist/src/__tests__/e2e-relay.d.ts.map +0 -1
- package/dist/src/__tests__/e2e-relay.js +0 -256
- package/dist/src/__tests__/e2e-relay.js.map +0 -1
- package/dist/src/__tests__/model-discovery.test.d.ts +0 -2
- package/dist/src/__tests__/model-discovery.test.d.ts.map +0 -1
- package/dist/src/__tests__/model-discovery.test.js +0 -47
- package/dist/src/__tests__/model-discovery.test.js.map +0 -1
- package/dist/src/__tests__/model-switching.test.d.ts +0 -2
- package/dist/src/__tests__/model-switching.test.d.ts.map +0 -1
- package/dist/src/__tests__/model-switching.test.js +0 -253
- package/dist/src/__tests__/model-switching.test.js.map +0 -1
- package/dist/src/__tests__/native-fusion-parsers.test.d.ts +0 -2
- package/dist/src/__tests__/native-fusion-parsers.test.d.ts.map +0 -1
- package/dist/src/__tests__/native-fusion-parsers.test.js +0 -216
- package/dist/src/__tests__/native-fusion-parsers.test.js.map +0 -1
- package/dist/src/__tests__/native-fusion-service.test.d.ts +0 -2
- package/dist/src/__tests__/native-fusion-service.test.d.ts.map +0 -1
- package/dist/src/__tests__/native-fusion-service.test.js +0 -157
- package/dist/src/__tests__/native-fusion-service.test.js.map +0 -1
- package/dist/src/__tests__/native-session-sync.test.d.ts +0 -2
- package/dist/src/__tests__/native-session-sync.test.d.ts.map +0 -1
- package/dist/src/__tests__/native-session-sync.test.js +0 -198
- package/dist/src/__tests__/native-session-sync.test.js.map +0 -1
- package/dist/src/__tests__/pair-qr.test.d.ts +0 -2
- package/dist/src/__tests__/pair-qr.test.d.ts.map +0 -1
- package/dist/src/__tests__/pair-qr.test.js +0 -13
- package/dist/src/__tests__/pair-qr.test.js.map +0 -1
- package/dist/src/__tests__/pi-context.test.d.ts +0 -2
- package/dist/src/__tests__/pi-context.test.d.ts.map +0 -1
- package/dist/src/__tests__/pi-context.test.js +0 -261
- package/dist/src/__tests__/pi-context.test.js.map +0 -1
- package/dist/src/__tests__/session-manager.test.d.ts +0 -2
- package/dist/src/__tests__/session-manager.test.d.ts.map +0 -1
- package/dist/src/__tests__/session-manager.test.js +0 -592
- package/dist/src/__tests__/session-manager.test.js.map +0 -1
- package/dist/src/__tests__/session-store.test.d.ts +0 -2
- package/dist/src/__tests__/session-store.test.d.ts.map +0 -1
- package/dist/src/__tests__/session-store.test.js +0 -106
- package/dist/src/__tests__/session-store.test.js.map +0 -1
- package/dist/src/agents/adapter.d.ts.map +0 -1
- package/dist/src/agents/adapter.js.map +0 -1
- package/dist/src/agents/claude.d.ts.map +0 -1
- package/dist/src/agents/claude.js.map +0 -1
- package/dist/src/agents/codex.d.ts.map +0 -1
- package/dist/src/agents/codex.js.map +0 -1
- package/dist/src/agents/command-spec.d.ts.map +0 -1
- package/dist/src/agents/command-spec.js.map +0 -1
- package/dist/src/agents/cursor.d.ts.map +0 -1
- package/dist/src/agents/cursor.js.map +0 -1
- package/dist/src/agents/custom.d.ts.map +0 -1
- package/dist/src/agents/custom.js.map +0 -1
- package/dist/src/agents/detect.d.ts.map +0 -1
- package/dist/src/agents/detect.js.map +0 -1
- package/dist/src/agents/gemini.d.ts.map +0 -1
- package/dist/src/agents/gemini.js.map +0 -1
- package/dist/src/agents/model-registry/cache.d.ts.map +0 -1
- package/dist/src/agents/model-registry/cache.js.map +0 -1
- package/dist/src/agents/model-registry/discovery.d.ts.map +0 -1
- package/dist/src/agents/model-registry/discovery.js.map +0 -1
- package/dist/src/agents/model-registry/parsers.d.ts.map +0 -1
- package/dist/src/agents/model-registry/parsers.js.map +0 -1
- package/dist/src/agents/model-registry/runner.d.ts.map +0 -1
- package/dist/src/agents/model-registry/runner.js.map +0 -1
- package/dist/src/agents/model-registry/service.d.ts.map +0 -1
- package/dist/src/agents/model-registry/service.js.map +0 -1
- package/dist/src/agents/model-registry/types.d.ts.map +0 -1
- package/dist/src/agents/model-registry/types.js.map +0 -1
- package/dist/src/agents/model-registry.d.ts.map +0 -1
- package/dist/src/agents/model-registry.js.map +0 -1
- package/dist/src/agents/openclaw.d.ts.map +0 -1
- package/dist/src/agents/openclaw.js.map +0 -1
- package/dist/src/agents/pi.d.ts.map +0 -1
- package/dist/src/agents/pi.js.map +0 -1
- package/dist/src/commands/agent.d.ts.map +0 -1
- package/dist/src/commands/agent.js.map +0 -1
- package/dist/src/commands/daemon.d.ts.map +0 -1
- package/dist/src/commands/daemon.js.map +0 -1
- package/dist/src/commands/pair-qr.d.ts.map +0 -1
- package/dist/src/commands/pair-qr.js.map +0 -1
- package/dist/src/commands/pair.d.ts.map +0 -1
- package/dist/src/commands/pair.js.map +0 -1
- package/dist/src/commands/upgrade.d.ts.map +0 -1
- package/dist/src/commands/upgrade.js.map +0 -1
- package/dist/src/config/index.d.ts.map +0 -1
- package/dist/src/config/index.js.map +0 -1
- package/dist/src/fs/handler.d.ts.map +0 -1
- package/dist/src/fs/handler.js.map +0 -1
- package/dist/src/fs/multimodal.d.ts +0 -5
- package/dist/src/fs/multimodal.d.ts.map +0 -1
- package/dist/src/fs/multimodal.js +0 -39
- package/dist/src/fs/multimodal.js.map +0 -1
- package/dist/src/fs/security.d.ts.map +0 -1
- package/dist/src/fs/security.js.map +0 -1
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js.map +0 -1
- package/dist/src/log-reporter.d.ts.map +0 -1
- package/dist/src/log-reporter.js.map +0 -1
- package/dist/src/native-fusion/parsers.d.ts.map +0 -1
- package/dist/src/native-fusion/parsers.js.map +0 -1
- package/dist/src/native-fusion/service.d.ts.map +0 -1
- package/dist/src/native-fusion/service.js.map +0 -1
- package/dist/src/native-fusion/state.d.ts.map +0 -1
- package/dist/src/native-fusion/state.js.map +0 -1
- package/dist/src/native-fusion/types.d.ts.map +0 -1
- package/dist/src/native-fusion/types.js.map +0 -1
- package/dist/src/native-sync/discover.d.ts +0 -6
- package/dist/src/native-sync/discover.d.ts.map +0 -1
- package/dist/src/native-sync/discover.js +0 -69
- package/dist/src/native-sync/discover.js.map +0 -1
- package/dist/src/native-sync/parsers.d.ts +0 -3
- package/dist/src/native-sync/parsers.d.ts.map +0 -1
- package/dist/src/native-sync/parsers.js +0 -373
- package/dist/src/native-sync/parsers.js.map +0 -1
- package/dist/src/native-sync/service.d.ts +0 -16
- package/dist/src/native-sync/service.d.ts.map +0 -1
- package/dist/src/native-sync/service.js +0 -95
- package/dist/src/native-sync/service.js.map +0 -1
- package/dist/src/native-sync/state.d.ts +0 -6
- package/dist/src/native-sync/state.d.ts.map +0 -1
- package/dist/src/native-sync/state.js +0 -34
- package/dist/src/native-sync/state.js.map +0 -1
- package/dist/src/native-sync/types.d.ts +0 -23
- package/dist/src/native-sync/types.d.ts.map +0 -1
- package/dist/src/native-sync/types.js +0 -4
- package/dist/src/native-sync/types.js.map +0 -1
- package/dist/src/region.d.ts.map +0 -1
- package/dist/src/region.js.map +0 -1
- package/dist/src/relay/client.d.ts.map +0 -1
- package/dist/src/relay/client.js.map +0 -1
- package/dist/src/session/handlers/agents.d.ts.map +0 -1
- package/dist/src/session/handlers/agents.js.map +0 -1
- package/dist/src/session/handlers/chat.d.ts.map +0 -1
- package/dist/src/session/handlers/chat.js.map +0 -1
- package/dist/src/session/handlers/control.d.ts.map +0 -1
- package/dist/src/session/handlers/control.js.map +0 -1
- package/dist/src/session/handlers/fs.d.ts.map +0 -1
- package/dist/src/session/handlers/fs.js.map +0 -1
- package/dist/src/session/handlers/queue.d.ts +0 -4
- package/dist/src/session/handlers/queue.d.ts.map +0 -1
- package/dist/src/session/handlers/queue.js +0 -66
- package/dist/src/session/handlers/queue.js.map +0 -1
- package/dist/src/session/manager.d.ts.map +0 -1
- package/dist/src/session/manager.js.map +0 -1
- package/dist/src/session/store.d.ts.map +0 -1
- package/dist/src/session/store.js.map +0 -1
- package/dist/src/session/types.d.ts.map +0 -1
- package/dist/src/session/types.js.map +0 -1
- package/dist/src/upgrade/engine.d.ts.map +0 -1
- package/dist/src/upgrade/engine.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
package/dist/bin/shennian.d.ts
CHANGED
package/dist/bin/shennian.js
CHANGED
|
@@ -33,4 +33,3 @@ export declare function registerAgent(type: AgentType, factory: () => AgentAdapt
|
|
|
33
33
|
export declare function unregisterAgent(type: AgentType): void;
|
|
34
34
|
export declare function createAgent(type: AgentType): AgentAdapter | null;
|
|
35
35
|
export declare function getRegisteredAgents(): AgentType[];
|
|
36
|
-
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AgentAdapter } from './adapter.js';
|
|
2
|
+
export declare function normalizeClaudeModelId(modelId?: string | null): string;
|
|
2
3
|
export declare class ClaudeAdapter extends AgentAdapter {
|
|
3
4
|
readonly type: "claude";
|
|
4
5
|
private process;
|
|
@@ -22,4 +23,3 @@ export declare class ClaudeAdapter extends AgentAdapter {
|
|
|
22
23
|
private emitEvent;
|
|
23
24
|
private killProcess;
|
|
24
25
|
}
|
|
25
|
-
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
1
|
import { createInterface } from 'node:readline';
|
|
3
2
|
import { randomUUID } from 'node:crypto';
|
|
4
3
|
import { AgentAdapter, registerAgent } from './adapter.js';
|
|
4
|
+
import { resolveBuiltinCommand, spawnResolvedCommand } from './command-spec.js';
|
|
5
|
+
export function normalizeClaudeModelId(modelId) {
|
|
6
|
+
const trimmed = modelId?.trim();
|
|
7
|
+
return trimmed || 'default';
|
|
8
|
+
}
|
|
5
9
|
export class ClaudeAdapter extends AgentAdapter {
|
|
6
10
|
type = 'claude';
|
|
7
11
|
process = null;
|
|
@@ -27,9 +31,7 @@ export class ClaudeAdapter extends AgentAdapter {
|
|
|
27
31
|
if (process.getuid?.() !== 0) {
|
|
28
32
|
args.push('--dangerously-skip-permissions');
|
|
29
33
|
}
|
|
30
|
-
|
|
31
|
-
args.push('--model', modelId);
|
|
32
|
-
}
|
|
34
|
+
args.push('--model', normalizeClaudeModelId(modelId));
|
|
33
35
|
if (this.agentSessionId) {
|
|
34
36
|
args.push('--resume', this.agentSessionId);
|
|
35
37
|
}
|
|
@@ -50,7 +52,12 @@ export class ClaudeAdapter extends AgentAdapter {
|
|
|
50
52
|
await this.killProcess();
|
|
51
53
|
}
|
|
52
54
|
spawnAndParse(args) {
|
|
53
|
-
const
|
|
55
|
+
const spec = resolveBuiltinCommand('claude');
|
|
56
|
+
if (!spec) {
|
|
57
|
+
this.emit('error', new Error('Command "claude" not found. Is Claude Code CLI installed?'));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const proc = spawnResolvedCommand(spec, args, {
|
|
54
61
|
cwd: this.workDir ?? undefined,
|
|
55
62
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
56
63
|
env: { ...process.env },
|
|
@@ -225,4 +232,3 @@ export class ClaudeAdapter extends AgentAdapter {
|
|
|
225
232
|
}
|
|
226
233
|
}
|
|
227
234
|
registerAgent('claude', () => new ClaudeAdapter());
|
|
228
|
-
//# sourceMappingURL=claude.js.map
|
|
@@ -11,22 +11,39 @@ export declare class CodexAdapter extends AgentAdapter {
|
|
|
11
11
|
private textTail;
|
|
12
12
|
private terminalState;
|
|
13
13
|
private forceCloseTimer;
|
|
14
|
+
private stderrBuf;
|
|
15
|
+
private rpcSeq;
|
|
16
|
+
private pendingRequests;
|
|
17
|
+
private appServerReady;
|
|
18
|
+
private activeTurnId;
|
|
19
|
+
private namedThread;
|
|
20
|
+
private deltaItemIds;
|
|
21
|
+
private lastTransientStatus;
|
|
14
22
|
start(_sessionId: string, workDir: string, agentSessionId?: string | null): Promise<void>;
|
|
15
23
|
send(text: string, modelId?: string): Promise<void>;
|
|
16
24
|
resume(agentSessionId: string): Promise<void>;
|
|
17
25
|
stop(): Promise<void>;
|
|
18
26
|
private spawnCodex;
|
|
27
|
+
private spawnAppServer;
|
|
28
|
+
private ensureAppServer;
|
|
29
|
+
private initializeAppServer;
|
|
30
|
+
private sendRpc;
|
|
31
|
+
private handleAppServerMessage;
|
|
32
|
+
private handleAppServerCompletedItem;
|
|
33
|
+
private handleAppServerUsage;
|
|
19
34
|
private handleCodexItemLine;
|
|
20
35
|
private handleStreamEvent;
|
|
21
36
|
private emitEvent;
|
|
22
37
|
private killProcess;
|
|
38
|
+
private rejectAllPending;
|
|
23
39
|
private handleProcessClose;
|
|
24
40
|
private emitFinalIfOpen;
|
|
25
41
|
private emitErrorIfOpen;
|
|
26
42
|
private resetRunState;
|
|
43
|
+
private emitTransientStatus;
|
|
27
44
|
private resetTextState;
|
|
28
45
|
private emitText;
|
|
29
46
|
private scheduleProcessClose;
|
|
30
47
|
private clearForceCloseTimer;
|
|
31
48
|
}
|
|
32
|
-
|
|
49
|
+
export declare function normalizeCodexModelId(modelId?: string | null): string | undefined;
|
package/dist/src/agents/codex.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// @arch docs/architecture/cli/agent-adapters.md
|
|
2
2
|
// @test src/__tests__/codex-adapter.test.ts
|
|
3
|
-
import { spawn } from 'node:child_process';
|
|
4
3
|
import { createInterface } from 'node:readline';
|
|
5
4
|
import { randomUUID } from 'node:crypto';
|
|
6
5
|
import { AgentAdapter, registerAgent } from './adapter.js';
|
|
6
|
+
import { resolveBuiltinCommand, spawnResolvedCommand } from './command-spec.js';
|
|
7
7
|
export class CodexAdapter extends AgentAdapter {
|
|
8
8
|
type = 'codex';
|
|
9
9
|
process = null;
|
|
@@ -16,6 +16,14 @@ export class CodexAdapter extends AgentAdapter {
|
|
|
16
16
|
textTail = '';
|
|
17
17
|
terminalState = 'open';
|
|
18
18
|
forceCloseTimer = null;
|
|
19
|
+
stderrBuf = '';
|
|
20
|
+
rpcSeq = 1;
|
|
21
|
+
pendingRequests = new Map();
|
|
22
|
+
appServerReady = null;
|
|
23
|
+
activeTurnId = null;
|
|
24
|
+
namedThread = false;
|
|
25
|
+
deltaItemIds = new Set();
|
|
26
|
+
lastTransientStatus = '';
|
|
19
27
|
async start(_sessionId, workDir, agentSessionId) {
|
|
20
28
|
this.workDir = workDir;
|
|
21
29
|
this.seq = 0;
|
|
@@ -23,27 +31,50 @@ export class CodexAdapter extends AgentAdapter {
|
|
|
23
31
|
this.agentSessionId = agentSessionId;
|
|
24
32
|
}
|
|
25
33
|
async send(text, modelId) {
|
|
26
|
-
|
|
34
|
+
if (this.activeTurnId) {
|
|
35
|
+
await this.killProcess();
|
|
36
|
+
}
|
|
37
|
+
const codexModelId = normalizeCodexModelId(modelId);
|
|
27
38
|
this.runId = randomUUID();
|
|
28
39
|
this.seq = 0;
|
|
29
40
|
this.resetRunState();
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
41
|
+
await this.ensureAppServer(codexModelId);
|
|
42
|
+
const threadId = this.agentSessionId;
|
|
43
|
+
if (!threadId)
|
|
44
|
+
throw new Error('codex app-server did not create a thread');
|
|
45
|
+
this.emitEvent({ state: 'start', agentSessionId: threadId });
|
|
46
|
+
if (!this.namedThread) {
|
|
47
|
+
await this.sendRpc('thread/name/set', {
|
|
48
|
+
threadId,
|
|
49
|
+
name: makeThreadTitle(text),
|
|
50
|
+
}).catch(() => { });
|
|
51
|
+
this.namedThread = true;
|
|
36
52
|
}
|
|
53
|
+
const response = await this.sendRpc('turn/start', {
|
|
54
|
+
threadId,
|
|
55
|
+
input: [{ type: 'text', text, text_elements: [] }],
|
|
56
|
+
approvalPolicy: 'never',
|
|
57
|
+
sandboxPolicy: { type: 'dangerFullAccess' },
|
|
58
|
+
...(codexModelId ? { model: codexModelId } : {}),
|
|
59
|
+
});
|
|
60
|
+
this.activeTurnId = response.turn?.id ?? null;
|
|
37
61
|
}
|
|
38
62
|
async resume(agentSessionId) {
|
|
63
|
+
await this.killProcess();
|
|
39
64
|
this.agentSessionId = agentSessionId;
|
|
65
|
+
this.namedThread = true;
|
|
40
66
|
this.resetTextState();
|
|
41
67
|
}
|
|
42
68
|
async stop() {
|
|
43
69
|
await this.killProcess();
|
|
44
70
|
}
|
|
45
71
|
spawnCodex(args) {
|
|
46
|
-
const
|
|
72
|
+
const spec = resolveBuiltinCommand('codex');
|
|
73
|
+
if (!spec) {
|
|
74
|
+
this.emit('error', new Error('Command "codex" not found. Is OpenAI Codex CLI installed?'));
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const proc = spawnResolvedCommand(spec, args, {
|
|
47
78
|
cwd: this.workDir ?? undefined,
|
|
48
79
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
49
80
|
env: { ...process.env },
|
|
@@ -84,6 +115,263 @@ export class CodexAdapter extends AgentAdapter {
|
|
|
84
115
|
}
|
|
85
116
|
});
|
|
86
117
|
}
|
|
118
|
+
spawnAppServer() {
|
|
119
|
+
const spec = resolveBuiltinCommand('codex');
|
|
120
|
+
if (!spec) {
|
|
121
|
+
this.emit('error', new Error('Command "codex" not found. Is OpenAI Codex CLI installed?'));
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const proc = spawnResolvedCommand(spec, ['app-server', '--listen', 'stdio://'], {
|
|
125
|
+
cwd: this.workDir ?? undefined,
|
|
126
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
127
|
+
env: { ...process.env, NO_COLOR: '1' },
|
|
128
|
+
});
|
|
129
|
+
this.process = proc;
|
|
130
|
+
this.stderrBuf = '';
|
|
131
|
+
const rl = createInterface({ input: proc.stdout });
|
|
132
|
+
rl.on('line', (line) => {
|
|
133
|
+
if (!line.trim())
|
|
134
|
+
return;
|
|
135
|
+
let msg;
|
|
136
|
+
try {
|
|
137
|
+
msg = JSON.parse(line);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
this.handleAppServerMessage(msg);
|
|
143
|
+
});
|
|
144
|
+
proc.stderr?.on('data', (chunk) => {
|
|
145
|
+
this.stderrBuf += chunk.toString();
|
|
146
|
+
});
|
|
147
|
+
proc.on('close', (code) => {
|
|
148
|
+
if (this.process !== proc)
|
|
149
|
+
return;
|
|
150
|
+
const hadActiveTurn = this.activeTurnId != null;
|
|
151
|
+
this.process = null;
|
|
152
|
+
this.appServerReady = null;
|
|
153
|
+
this.activeTurnId = null;
|
|
154
|
+
this.rejectAllPending(new Error(normalizeCodexStderr(this.stderrBuf) || `codex app-server exited with code ${code}`));
|
|
155
|
+
if (this.terminalState === 'open' && hadActiveTurn) {
|
|
156
|
+
this.handleProcessClose(code, this.stderrBuf);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
proc.on('error', (err) => {
|
|
160
|
+
if (this.process !== proc)
|
|
161
|
+
return;
|
|
162
|
+
this.process = null;
|
|
163
|
+
this.rejectAllPending(err);
|
|
164
|
+
if (err.code === 'ENOENT') {
|
|
165
|
+
this.emit('error', new Error('Command "codex" not found. Is OpenAI Codex CLI installed?'));
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
this.emit('error', err);
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
async ensureAppServer(modelId) {
|
|
173
|
+
if (this.appServerReady)
|
|
174
|
+
return this.appServerReady;
|
|
175
|
+
this.spawnAppServer();
|
|
176
|
+
this.appServerReady = this.initializeAppServer(modelId).catch(async (error) => {
|
|
177
|
+
this.appServerReady = null;
|
|
178
|
+
await this.killProcess();
|
|
179
|
+
throw error;
|
|
180
|
+
});
|
|
181
|
+
return this.appServerReady;
|
|
182
|
+
}
|
|
183
|
+
async initializeAppServer(modelId) {
|
|
184
|
+
const codexModelId = normalizeCodexModelId(modelId);
|
|
185
|
+
await this.sendRpc('initialize', {
|
|
186
|
+
clientInfo: { name: 'shennian', title: 'Shennian', version: '0.0.0' },
|
|
187
|
+
capabilities: { experimentalApi: true },
|
|
188
|
+
});
|
|
189
|
+
if (this.agentSessionId) {
|
|
190
|
+
const response = await this.sendRpc('thread/resume', {
|
|
191
|
+
threadId: this.agentSessionId,
|
|
192
|
+
cwd: this.workDir,
|
|
193
|
+
approvalPolicy: 'never',
|
|
194
|
+
sandbox: 'danger-full-access',
|
|
195
|
+
persistExtendedHistory: true,
|
|
196
|
+
...(codexModelId ? { model: codexModelId } : {}),
|
|
197
|
+
});
|
|
198
|
+
this.agentSessionId = response.thread?.id ?? this.agentSessionId;
|
|
199
|
+
this.namedThread = !!response.thread?.name;
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
const response = await this.sendRpc('thread/start', {
|
|
203
|
+
cwd: this.workDir,
|
|
204
|
+
approvalPolicy: 'never',
|
|
205
|
+
sandbox: 'danger-full-access',
|
|
206
|
+
serviceName: 'Shennian',
|
|
207
|
+
experimentalRawEvents: false,
|
|
208
|
+
persistExtendedHistory: true,
|
|
209
|
+
...(codexModelId ? { model: codexModelId } : {}),
|
|
210
|
+
});
|
|
211
|
+
const threadId = response.thread?.id;
|
|
212
|
+
if (!threadId)
|
|
213
|
+
throw new Error('codex app-server thread/start returned no thread id');
|
|
214
|
+
this.agentSessionId = threadId;
|
|
215
|
+
this.namedThread = !!response.thread?.name;
|
|
216
|
+
}
|
|
217
|
+
sendRpc(method, params, timeoutMs = 60_000) {
|
|
218
|
+
const proc = this.process;
|
|
219
|
+
if (!proc?.stdin)
|
|
220
|
+
return Promise.reject(new Error('codex app-server is not running'));
|
|
221
|
+
const id = this.rpcSeq++;
|
|
222
|
+
const payload = JSON.stringify({ id, method, params });
|
|
223
|
+
return new Promise((resolve, reject) => {
|
|
224
|
+
const timer = setTimeout(() => {
|
|
225
|
+
this.pendingRequests.delete(id);
|
|
226
|
+
reject(new Error(`codex app-server request timed out: ${method}`));
|
|
227
|
+
}, timeoutMs);
|
|
228
|
+
this.pendingRequests.set(id, { resolve, reject, timer });
|
|
229
|
+
proc.stdin.write(`${payload}\n`, (error) => {
|
|
230
|
+
if (!error)
|
|
231
|
+
return;
|
|
232
|
+
clearTimeout(timer);
|
|
233
|
+
this.pendingRequests.delete(id);
|
|
234
|
+
reject(error);
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
handleAppServerMessage(msg) {
|
|
239
|
+
if (msg.id != null) {
|
|
240
|
+
const pending = this.pendingRequests.get(msg.id);
|
|
241
|
+
if (pending) {
|
|
242
|
+
clearTimeout(pending.timer);
|
|
243
|
+
this.pendingRequests.delete(msg.id);
|
|
244
|
+
if (msg.error) {
|
|
245
|
+
pending.reject(new Error(msg.error.message || `codex app-server error ${msg.error.code ?? ''}`.trim()));
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
pending.resolve(msg.result);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
if (!msg.method)
|
|
253
|
+
return;
|
|
254
|
+
const params = msg.params ?? {};
|
|
255
|
+
switch (msg.method) {
|
|
256
|
+
case 'item/agentMessage/delta': {
|
|
257
|
+
const itemId = typeof params.itemId === 'string' ? params.itemId : '';
|
|
258
|
+
if (itemId)
|
|
259
|
+
this.deltaItemIds.add(itemId);
|
|
260
|
+
if (typeof params.delta === 'string')
|
|
261
|
+
this.emitText(params.delta);
|
|
262
|
+
break;
|
|
263
|
+
}
|
|
264
|
+
case 'item/completed':
|
|
265
|
+
this.handleAppServerCompletedItem(params);
|
|
266
|
+
break;
|
|
267
|
+
case 'thread/tokenUsage/updated':
|
|
268
|
+
this.handleAppServerUsage(params);
|
|
269
|
+
break;
|
|
270
|
+
case 'turn/completed': {
|
|
271
|
+
const turn = typeof params.turn === 'object' && params.turn !== null
|
|
272
|
+
? params.turn
|
|
273
|
+
: null;
|
|
274
|
+
const turnId = typeof turn?.id === 'string' ? turn.id : null;
|
|
275
|
+
if (!this.activeTurnId || turnId === this.activeTurnId) {
|
|
276
|
+
this.activeTurnId = null;
|
|
277
|
+
this.emitFinalIfOpen();
|
|
278
|
+
}
|
|
279
|
+
break;
|
|
280
|
+
}
|
|
281
|
+
case 'error': {
|
|
282
|
+
const message = extractAppServerErrorMessage(params);
|
|
283
|
+
if (isTransientCodexErrorMessage(message)) {
|
|
284
|
+
this.emitTransientStatus(message);
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
this.emitErrorIfOpen(message);
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
handleAppServerCompletedItem(params) {
|
|
293
|
+
const item = typeof params.item === 'object' && params.item !== null
|
|
294
|
+
? params.item
|
|
295
|
+
: null;
|
|
296
|
+
if (!item || typeof item.type !== 'string')
|
|
297
|
+
return;
|
|
298
|
+
switch (item.type) {
|
|
299
|
+
case 'agentMessage': {
|
|
300
|
+
const id = typeof item.id === 'string' ? item.id : '';
|
|
301
|
+
if (id && this.deltaItemIds.has(id))
|
|
302
|
+
return;
|
|
303
|
+
if (typeof item.text === 'string')
|
|
304
|
+
this.emitText(item.text, 'block');
|
|
305
|
+
break;
|
|
306
|
+
}
|
|
307
|
+
case 'commandExecution': {
|
|
308
|
+
const command = typeof item.command === 'string' ? item.command : '';
|
|
309
|
+
const output = typeof item.aggregatedOutput === 'string' ? item.aggregatedOutput : '';
|
|
310
|
+
if (command) {
|
|
311
|
+
this.emitEvent({ state: 'tool-call', name: 'command_execution', args: { command } });
|
|
312
|
+
}
|
|
313
|
+
this.emitEvent({
|
|
314
|
+
state: 'tool-result',
|
|
315
|
+
name: 'command_execution',
|
|
316
|
+
result: [output, item.exitCode != null ? `\n(exit ${item.exitCode})` : ''].join('').trim(),
|
|
317
|
+
});
|
|
318
|
+
break;
|
|
319
|
+
}
|
|
320
|
+
case 'mcpToolCall':
|
|
321
|
+
case 'dynamicToolCall': {
|
|
322
|
+
const tool = typeof item.tool === 'string' ? item.tool : item.type;
|
|
323
|
+
const args = typeof item.arguments === 'object' && item.arguments !== null
|
|
324
|
+
? item.arguments
|
|
325
|
+
: {};
|
|
326
|
+
this.emitEvent({ state: 'tool-call', name: tool, args });
|
|
327
|
+
this.emitEvent({
|
|
328
|
+
state: 'tool-result',
|
|
329
|
+
name: tool,
|
|
330
|
+
result: safeStringify(item.error ?? item.result ?? item.contentItems ?? ''),
|
|
331
|
+
});
|
|
332
|
+
break;
|
|
333
|
+
}
|
|
334
|
+
case 'fileChange': {
|
|
335
|
+
const changes = Array.isArray(item.changes) ? item.changes : [];
|
|
336
|
+
const summary = changes
|
|
337
|
+
.map((change) => {
|
|
338
|
+
if (typeof change !== 'object' || change === null)
|
|
339
|
+
return '';
|
|
340
|
+
const c = change;
|
|
341
|
+
const path = typeof c.path === 'string' ? c.path : typeof c.file === 'string' ? c.file : '';
|
|
342
|
+
const kind = typeof c.kind === 'string' ? c.kind : typeof c.type === 'string' ? c.type : 'change';
|
|
343
|
+
return path ? `${kind}: ${path}` : '';
|
|
344
|
+
})
|
|
345
|
+
.filter(Boolean)
|
|
346
|
+
.join('\n');
|
|
347
|
+
if (summary)
|
|
348
|
+
this.emitText(summary, 'block');
|
|
349
|
+
break;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
handleAppServerUsage(params) {
|
|
354
|
+
const tokenUsage = typeof params.tokenUsage === 'object' && params.tokenUsage !== null
|
|
355
|
+
? params.tokenUsage
|
|
356
|
+
: null;
|
|
357
|
+
const last = typeof tokenUsage?.last === 'object' && tokenUsage.last !== null
|
|
358
|
+
? tokenUsage.last
|
|
359
|
+
: null;
|
|
360
|
+
const total = typeof tokenUsage?.total === 'object' && tokenUsage.total !== null
|
|
361
|
+
? tokenUsage.total
|
|
362
|
+
: null;
|
|
363
|
+
const usage = last ?? total;
|
|
364
|
+
if (!usage)
|
|
365
|
+
return;
|
|
366
|
+
const input = typeof usage.inputTokens === 'number' ? usage.inputTokens : undefined;
|
|
367
|
+
const output = typeof usage.outputTokens === 'number' ? usage.outputTokens : undefined;
|
|
368
|
+
if (input != null || output != null) {
|
|
369
|
+
this.pendingUsage = {
|
|
370
|
+
inputTokens: input ?? 0,
|
|
371
|
+
outputTokens: output ?? 0,
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
}
|
|
87
375
|
handleCodexItemLine(obj) {
|
|
88
376
|
const item = obj.item;
|
|
89
377
|
if (!item?.type)
|
|
@@ -273,8 +561,12 @@ export class CodexAdapter extends AgentAdapter {
|
|
|
273
561
|
}
|
|
274
562
|
async killProcess() {
|
|
275
563
|
const proc = this.process;
|
|
276
|
-
|
|
564
|
+
this.appServerReady = null;
|
|
565
|
+
this.activeTurnId = null;
|
|
566
|
+
if (!proc) {
|
|
567
|
+
this.rejectAllPending(new Error('codex app-server stopped'));
|
|
277
568
|
return;
|
|
569
|
+
}
|
|
278
570
|
this.process = null;
|
|
279
571
|
this.clearForceCloseTimer();
|
|
280
572
|
proc.kill('SIGTERM');
|
|
@@ -285,6 +577,14 @@ export class CodexAdapter extends AgentAdapter {
|
|
|
285
577
|
resolve();
|
|
286
578
|
}, 3000);
|
|
287
579
|
});
|
|
580
|
+
this.rejectAllPending(new Error('codex app-server stopped'));
|
|
581
|
+
}
|
|
582
|
+
rejectAllPending(error) {
|
|
583
|
+
for (const [id, pending] of this.pendingRequests.entries()) {
|
|
584
|
+
clearTimeout(pending.timer);
|
|
585
|
+
pending.reject(error);
|
|
586
|
+
this.pendingRequests.delete(id);
|
|
587
|
+
}
|
|
288
588
|
}
|
|
289
589
|
handleProcessClose(code, stderrBuf) {
|
|
290
590
|
const stderr = normalizeCodexStderr(stderrBuf);
|
|
@@ -311,21 +611,29 @@ export class CodexAdapter extends AgentAdapter {
|
|
|
311
611
|
usage: this.pendingUsage,
|
|
312
612
|
agentSessionId: this.agentSessionId ?? undefined,
|
|
313
613
|
});
|
|
314
|
-
this.scheduleProcessClose();
|
|
315
614
|
}
|
|
316
615
|
emitErrorIfOpen(message) {
|
|
317
616
|
if (this.terminalState !== 'open')
|
|
318
617
|
return;
|
|
319
618
|
this.terminalState = 'error';
|
|
320
|
-
this.emitEvent({ state: 'error', message });
|
|
619
|
+
this.emitEvent({ state: 'error', message: formatCodexErrorMessage(message) });
|
|
321
620
|
this.scheduleProcessClose();
|
|
322
621
|
}
|
|
323
622
|
resetRunState() {
|
|
324
623
|
this.pendingUsage = undefined;
|
|
325
624
|
this.terminalState = 'open';
|
|
625
|
+
this.deltaItemIds.clear();
|
|
626
|
+
this.lastTransientStatus = '';
|
|
326
627
|
this.clearForceCloseTimer();
|
|
327
628
|
this.resetTextState();
|
|
328
629
|
}
|
|
630
|
+
emitTransientStatus(message) {
|
|
631
|
+
const formatted = formatTransientCodexStatus(message);
|
|
632
|
+
if (!formatted || formatted === this.lastTransientStatus || this.terminalState !== 'open')
|
|
633
|
+
return;
|
|
634
|
+
this.lastTransientStatus = formatted;
|
|
635
|
+
this.emitEvent({ state: 'delta', text: `${formatted}\n`, thinking: true });
|
|
636
|
+
}
|
|
329
637
|
resetTextState() {
|
|
330
638
|
this.hasEmittedText = false;
|
|
331
639
|
this.textTail = '';
|
|
@@ -371,6 +679,58 @@ export class CodexAdapter extends AgentAdapter {
|
|
|
371
679
|
this.forceCloseTimer = null;
|
|
372
680
|
}
|
|
373
681
|
}
|
|
682
|
+
function makeThreadTitle(text) {
|
|
683
|
+
const firstLine = normalizeTitleText(text).split('\n').find((line) => line.trim()) ?? 'Shennian';
|
|
684
|
+
const title = firstLine.trim().slice(0, 80);
|
|
685
|
+
return title || 'Shennian';
|
|
686
|
+
}
|
|
687
|
+
function normalizeTitleText(text) {
|
|
688
|
+
return text
|
|
689
|
+
.replace(/!\[[^\]]*]\([^)]+\)/g, '')
|
|
690
|
+
.replace(/\s+/g, ' ')
|
|
691
|
+
.trim();
|
|
692
|
+
}
|
|
693
|
+
export function normalizeCodexModelId(modelId) {
|
|
694
|
+
const trimmed = modelId?.trim();
|
|
695
|
+
if (!trimmed)
|
|
696
|
+
return undefined;
|
|
697
|
+
return trimmed.toLowerCase() === 'openai' ? undefined : trimmed;
|
|
698
|
+
}
|
|
699
|
+
function extractAppServerErrorMessage(params) {
|
|
700
|
+
if (typeof params.message === 'string' && params.message.trim())
|
|
701
|
+
return params.message.trim();
|
|
702
|
+
const error = params.error;
|
|
703
|
+
if (typeof error === 'string' && error.trim())
|
|
704
|
+
return error.trim();
|
|
705
|
+
if (typeof error === 'object' && error !== null) {
|
|
706
|
+
const message = error.message;
|
|
707
|
+
if (typeof message === 'string' && message.trim())
|
|
708
|
+
return message.trim();
|
|
709
|
+
}
|
|
710
|
+
return 'codex app-server error';
|
|
711
|
+
}
|
|
712
|
+
function isTransientCodexErrorMessage(message) {
|
|
713
|
+
return /\bReconnecting\.\.\.\s*\d+\/\d+/i.test(message);
|
|
714
|
+
}
|
|
715
|
+
function formatTransientCodexStatus(message) {
|
|
716
|
+
const match = message.match(/\bReconnecting\.\.\.\s*(\d+\/\d+)/i);
|
|
717
|
+
if (!match)
|
|
718
|
+
return '';
|
|
719
|
+
return `Codex API 暂时不可用,正在重试 ${match[1]}...`;
|
|
720
|
+
}
|
|
721
|
+
function formatCodexErrorMessage(message) {
|
|
722
|
+
const statusMatch = message.match(/unexpected status\s+(\d+)\s+([^:,]+)(?::\s*([^,]+))?(?:,\s*url:\s*([^,\s]+))?(?:,\s*request id:\s*([^\s,]+))?/i);
|
|
723
|
+
if (!statusMatch)
|
|
724
|
+
return message;
|
|
725
|
+
const [, status, statusText, detail, url, requestId] = statusMatch;
|
|
726
|
+
const parts = [
|
|
727
|
+
`Codex API 返回 ${status} ${statusText.trim()}`,
|
|
728
|
+
detail?.trim() ? `:${detail.trim()}` : '',
|
|
729
|
+
url ? `\n上游地址:${url}` : '',
|
|
730
|
+
requestId ? `\nrequest id:${requestId}` : '',
|
|
731
|
+
];
|
|
732
|
+
return parts.join('');
|
|
733
|
+
}
|
|
374
734
|
const GIT_DIRECTIVE_LINE_RE = /^\s*::git-[a-z-]+\{[^\n]*\}\s*$/gm;
|
|
375
735
|
function stripGitDirectiveArtifacts(text) {
|
|
376
736
|
if (!text)
|
|
@@ -432,4 +792,3 @@ function looksLikeFatalCodexStderr(stderr) {
|
|
|
432
792
|
].some((pattern) => pattern.test(stderr));
|
|
433
793
|
}
|
|
434
794
|
registerAgent('codex', () => new CodexAdapter());
|
|
435
|
-
//# sourceMappingURL=codex.js.map
|
|
@@ -1,11 +1,36 @@
|
|
|
1
|
+
import { type ChildProcess, type SpawnOptions, type SpawnSyncOptions } from 'node:child_process';
|
|
1
2
|
import type { BuiltinAgentType } from '@shennian/wire';
|
|
2
3
|
export type CommandSpec = {
|
|
3
4
|
command: string;
|
|
4
5
|
args: string[];
|
|
5
6
|
display: string;
|
|
6
7
|
};
|
|
8
|
+
export type ResolvedCommandKind = 'native' | 'cmd-shim' | 'wsl-bridge';
|
|
9
|
+
export type ResolvedCommandSpec = CommandSpec & {
|
|
10
|
+
kind: ResolvedCommandKind;
|
|
11
|
+
path: string;
|
|
12
|
+
};
|
|
13
|
+
type LaunchSpec = {
|
|
14
|
+
command: string;
|
|
15
|
+
args: string[];
|
|
16
|
+
cwd?: string;
|
|
17
|
+
};
|
|
7
18
|
export declare function resetCommandSpecCache(): void;
|
|
19
|
+
export declare function getProcessPlatform(): NodeJS.Platform;
|
|
20
|
+
export declare function windowsPathToWsl(input: string): string | undefined;
|
|
8
21
|
export declare function commandExists(command: string): boolean;
|
|
9
|
-
export declare function resolveBuiltinCommand(type: BuiltinAgentType):
|
|
10
|
-
export declare function
|
|
11
|
-
|
|
22
|
+
export declare function resolveBuiltinCommand(type: BuiltinAgentType): ResolvedCommandSpec | null;
|
|
23
|
+
export declare function buildLaunchSpec(spec: ResolvedCommandSpec, runtimeArgs: string[], cwd?: string): LaunchSpec;
|
|
24
|
+
export declare function spawnResolvedCommand(spec: ResolvedCommandSpec, runtimeArgs: string[], options?: Omit<SpawnOptions, 'cwd'> & {
|
|
25
|
+
cwd?: string;
|
|
26
|
+
}): ChildProcess;
|
|
27
|
+
export declare function spawnResolvedCommandSync(spec: ResolvedCommandSpec, runtimeArgs: string[], options?: Omit<SpawnSyncOptions, 'cwd'> & {
|
|
28
|
+
cwd?: string;
|
|
29
|
+
}): import("child_process").SpawnSyncReturns<string | NonSharedBuffer>;
|
|
30
|
+
export declare function parseCommandString(command: string): string[];
|
|
31
|
+
export declare function buildCommandStringLaunchSpec(commandString: string, runtimeArgs: string[], cwd?: string): LaunchSpec;
|
|
32
|
+
export declare function spawnCommandString(commandString: string, runtimeArgs: string[], options?: Omit<SpawnOptions, 'cwd'> & {
|
|
33
|
+
cwd?: string;
|
|
34
|
+
}): ChildProcess;
|
|
35
|
+
export declare function getCommandVersion(spec: ResolvedCommandSpec, flag?: string): string | undefined;
|
|
36
|
+
export {};
|