shennian 0.2.4 → 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 +0 -1
- package/dist/src/agents/codex.js +13 -4
- 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 +13 -54
- package/dist/src/agents/model-registry/parsers.d.ts +3 -1
- package/dist/src/agents/model-registry/parsers.js +92 -2
- 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 +2 -2
- package/dist/src/agents/model-registry.js +2 -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 +0 -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 +33 -7
- 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 +356 -40
- package/dist/src/native-fusion/service.d.ts +0 -1
- package/dist/src/native-fusion/service.js +14 -5
- 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 +0 -1
- 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 +5 -2
- 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 +0 -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 -155
- 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 -281
- 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 -400
- package/dist/src/__tests__/e2e-relay.js.map +0 -1
- package/dist/src/__tests__/fs-handler.test.d.ts +0 -2
- package/dist/src/__tests__/fs-handler.test.d.ts.map +0 -1
- package/dist/src/__tests__/fs-handler.test.js +0 -19
- package/dist/src/__tests__/fs-handler.test.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 -292
- 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 -253
- 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 -685
- 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
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
// @arch docs/architecture/cli/model-discovery.md
|
|
2
2
|
// @test src/__tests__/model-switching.test.ts
|
|
3
|
-
import { spawn } from 'node:child_process';
|
|
4
3
|
import { createInterface } from 'node:readline';
|
|
5
|
-
import { resolveBuiltinCommand } from '../command-spec.js';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
4
|
+
import { resolveBuiltinCommand, spawnResolvedCommand } from '../command-spec.js';
|
|
5
|
+
import { fallbackClaudeAliasModels, fallbackGeminiModels, parseCodexAppServerModels, parseCursorModels, parseOpenClawModels, } from './parsers.js';
|
|
6
|
+
import { runResolvedCommand } from './runner.js';
|
|
8
7
|
import { DISCOVERY_WORKDIR } from './types.js';
|
|
9
8
|
function sendAppServerRpc(proc, pending, id, method, params, timeoutMs) {
|
|
10
9
|
if (!proc.stdin)
|
|
@@ -24,8 +23,8 @@ function sendAppServerRpc(proc, pending, id, method, params, timeoutMs) {
|
|
|
24
23
|
});
|
|
25
24
|
});
|
|
26
25
|
}
|
|
27
|
-
async function discoverCodexModelsViaAppServer() {
|
|
28
|
-
const proc =
|
|
26
|
+
async function discoverCodexModelsViaAppServer(spec) {
|
|
27
|
+
const proc = spawnResolvedCommand(spec, ['app-server', '--listen', 'stdio://'], {
|
|
29
28
|
cwd: DISCOVERY_WORKDIR,
|
|
30
29
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
31
30
|
env: { ...process.env, NO_COLOR: '1' },
|
|
@@ -88,71 +87,32 @@ async function discoverCursorModels() {
|
|
|
88
87
|
const spec = resolveBuiltinCommand('cursor');
|
|
89
88
|
if (!spec)
|
|
90
89
|
return [];
|
|
91
|
-
const result = await
|
|
90
|
+
const result = await runResolvedCommand(spec, ['--list-models']);
|
|
92
91
|
return parseCursorModels(result.stdout);
|
|
93
92
|
}
|
|
94
93
|
async function discoverOpenClawModels() {
|
|
95
94
|
const spec = resolveBuiltinCommand('openclaw');
|
|
96
95
|
if (!spec)
|
|
97
96
|
return [];
|
|
98
|
-
const result = await
|
|
97
|
+
const result = await runResolvedCommand(spec, ['models', 'list', '--json']);
|
|
99
98
|
return parseOpenClawModels(result.stdout);
|
|
100
99
|
}
|
|
101
100
|
async function discoverClaudeModels() {
|
|
102
|
-
|
|
103
|
-
if (!spec)
|
|
101
|
+
if (!resolveBuiltinCommand('claude'))
|
|
104
102
|
return [];
|
|
105
|
-
|
|
106
|
-
startupArgs,
|
|
107
|
-
readyPatterns: [/[>❯]/, /claude/i],
|
|
108
|
-
closePatterns: [/esc/i, /confirm/i, /default/i],
|
|
109
|
-
timeoutMs: 12_000,
|
|
110
|
-
});
|
|
111
|
-
const primaryRaw = await runDiscovery(['--bare', '--dangerously-skip-permissions']);
|
|
112
|
-
const primaryModels = parseClaudeModels(primaryRaw);
|
|
113
|
-
if (primaryModels.length > 0)
|
|
114
|
-
return primaryModels;
|
|
115
|
-
const clean = primaryRaw.toLowerCase();
|
|
116
|
-
const bareUnsupported = clean.includes('--bare') &&
|
|
117
|
-
(clean.includes('unknown option') ||
|
|
118
|
-
clean.includes('unknown argument') ||
|
|
119
|
-
clean.includes('unexpected argument') ||
|
|
120
|
-
clean.includes('unrecognized option'));
|
|
121
|
-
if (!bareUnsupported)
|
|
122
|
-
return primaryModels;
|
|
123
|
-
const fallbackRaw = await runDiscovery(['--dangerously-skip-permissions']);
|
|
124
|
-
return parseClaudeModels(fallbackRaw);
|
|
103
|
+
return fallbackClaudeAliasModels();
|
|
125
104
|
}
|
|
126
105
|
async function discoverCodexModels() {
|
|
127
106
|
const spec = resolveBuiltinCommand('codex');
|
|
128
107
|
if (!spec)
|
|
129
108
|
return [];
|
|
130
|
-
const appServerModels = await discoverCodexModelsViaAppServer().catch(() => []);
|
|
131
|
-
|
|
132
|
-
return appServerModels;
|
|
133
|
-
const raw = await runPtyCommand(spec, {
|
|
134
|
-
startupArgs: ['--no-alt-screen', '-C', DISCOVERY_WORKDIR],
|
|
135
|
-
preOpenPromptPatterns: [/update available!/i, /skip until next version/i, /release notes:/i],
|
|
136
|
-
preOpenPromptInput: '\u001b[B\r',
|
|
137
|
-
readyPatterns: [/(?:^|\s)\/model\b/i, /codex/i],
|
|
138
|
-
closePatterns: [/enter to select/i, /dismiss/i, /select model/i],
|
|
139
|
-
timeoutMs: 45_000,
|
|
140
|
-
scrollAfterOpenMs: 2500,
|
|
141
|
-
scrollCount: 15,
|
|
142
|
-
scrollIntervalMs: 500,
|
|
143
|
-
});
|
|
144
|
-
return parseCodexModels(raw);
|
|
109
|
+
const appServerModels = await discoverCodexModelsViaAppServer(spec).catch(() => []);
|
|
110
|
+
return appServerModels;
|
|
145
111
|
}
|
|
146
112
|
async function discoverGeminiModels() {
|
|
147
|
-
|
|
148
|
-
if (!spec)
|
|
113
|
+
if (!resolveBuiltinCommand('gemini'))
|
|
149
114
|
return [];
|
|
150
|
-
|
|
151
|
-
readyPatterns: [/[>❯]/, /gemini/i],
|
|
152
|
-
closePatterns: [/enter to select/i, /select model/i, /\besc\b/i],
|
|
153
|
-
timeoutMs: 16_000,
|
|
154
|
-
});
|
|
155
|
-
return parseGeminiModels(raw);
|
|
115
|
+
return fallbackGeminiModels();
|
|
156
116
|
}
|
|
157
117
|
async function discoverPiModels(context) {
|
|
158
118
|
if (!context.serverUrl || !context.authToken)
|
|
@@ -199,4 +159,3 @@ export async function discoverModelsForAgent(agent, context) {
|
|
|
199
159
|
}
|
|
200
160
|
return discoverBuiltinModels(agent.type, context);
|
|
201
161
|
}
|
|
202
|
-
//# sourceMappingURL=discovery.js.map
|
|
@@ -3,7 +3,9 @@ export declare function stripAnsi(text: string): string;
|
|
|
3
3
|
export declare function parseCursorModels(raw: string): ModelInfo[];
|
|
4
4
|
export declare function parseOpenClawModels(raw: string): ModelInfo[];
|
|
5
5
|
export declare function parseClaudeModels(raw: string): ModelInfo[];
|
|
6
|
+
export declare function parseClaudeBinaryModels(raw: string): ModelInfo[];
|
|
7
|
+
export declare function fallbackClaudeAliasModels(): ModelInfo[];
|
|
6
8
|
export declare function parseCodexModels(raw: string): ModelInfo[];
|
|
7
9
|
export declare function parseCodexAppServerModels(raw: unknown): ModelInfo[];
|
|
8
10
|
export declare function parseGeminiModels(raw: string): ModelInfo[];
|
|
9
|
-
|
|
11
|
+
export declare function fallbackGeminiModels(): ModelInfo[];
|
|
@@ -138,6 +138,78 @@ export function parseClaudeModels(raw) {
|
|
|
138
138
|
}
|
|
139
139
|
return uniqueModels(fallback);
|
|
140
140
|
}
|
|
141
|
+
function compareVersionNumbers(a, b) {
|
|
142
|
+
const length = Math.max(a.length, b.length);
|
|
143
|
+
for (let index = 0; index < length; index++) {
|
|
144
|
+
const left = a[index] ?? -1;
|
|
145
|
+
const right = b[index] ?? -1;
|
|
146
|
+
if (left === right)
|
|
147
|
+
continue;
|
|
148
|
+
return left - right;
|
|
149
|
+
}
|
|
150
|
+
return 0;
|
|
151
|
+
}
|
|
152
|
+
function extractClaudeFamilyVersion(id, family) {
|
|
153
|
+
const match = id.match(new RegExp(`^claude-${family}-([0-9]+(?:-[0-9]+)*)$`, 'i'));
|
|
154
|
+
if (!match?.[1])
|
|
155
|
+
return null;
|
|
156
|
+
const parts = match[1]
|
|
157
|
+
.split('-')
|
|
158
|
+
.map((part) => Number.parseInt(part, 10))
|
|
159
|
+
.filter((part) => Number.isFinite(part));
|
|
160
|
+
if (parts.length === 0 || parts.length > 2)
|
|
161
|
+
return null;
|
|
162
|
+
return parts;
|
|
163
|
+
}
|
|
164
|
+
function formatClaudeVersion(version) {
|
|
165
|
+
if (!version?.length)
|
|
166
|
+
return undefined;
|
|
167
|
+
return `v${version.join('.')}`;
|
|
168
|
+
}
|
|
169
|
+
export function parseClaudeBinaryModels(raw) {
|
|
170
|
+
const clean = stripAnsi(raw);
|
|
171
|
+
const aliasMap = {
|
|
172
|
+
default: 'Default (recommended)',
|
|
173
|
+
sonnet: 'Sonnet',
|
|
174
|
+
opus: 'Opus',
|
|
175
|
+
haiku: 'Haiku',
|
|
176
|
+
};
|
|
177
|
+
const familyVersions = new Map();
|
|
178
|
+
for (const family of ['sonnet', 'opus', 'haiku']) {
|
|
179
|
+
for (const match of clean.matchAll(new RegExp(`\\bclaude-${family}-[0-9.-]+\\b`, 'gi'))) {
|
|
180
|
+
const normalized = match[0].trim().toLowerCase().replace(/\./g, '-').replace(/-+$/g, '');
|
|
181
|
+
const version = extractClaudeFamilyVersion(normalized, family);
|
|
182
|
+
if (!version)
|
|
183
|
+
continue;
|
|
184
|
+
const current = familyVersions.get(family);
|
|
185
|
+
if (!current || compareVersionNumbers(current, version) < 0) {
|
|
186
|
+
familyVersions.set(family, version);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
const models = [];
|
|
191
|
+
for (const alias of ['default', 'sonnet', 'opus', 'haiku']) {
|
|
192
|
+
if (!new RegExp(`\\b${alias}\\b`, 'i').test(clean))
|
|
193
|
+
continue;
|
|
194
|
+
const version = (alias === 'default' ? familyVersions.get('sonnet') : familyVersions.get(alias)) ?? null;
|
|
195
|
+
models.push({
|
|
196
|
+
id: alias,
|
|
197
|
+
name: aliasMap[alias],
|
|
198
|
+
description: formatClaudeVersion(version),
|
|
199
|
+
provider: 'anthropic',
|
|
200
|
+
isDefault: alias === 'default',
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
return uniqueModels(models);
|
|
204
|
+
}
|
|
205
|
+
export function fallbackClaudeAliasModels() {
|
|
206
|
+
return [
|
|
207
|
+
{ id: 'default', name: 'Default (recommended)', provider: 'anthropic', isDefault: true },
|
|
208
|
+
{ id: 'sonnet', name: 'Sonnet', provider: 'anthropic' },
|
|
209
|
+
{ id: 'opus', name: 'Opus', provider: 'anthropic' },
|
|
210
|
+
{ id: 'haiku', name: 'Haiku', provider: 'anthropic' },
|
|
211
|
+
];
|
|
212
|
+
}
|
|
141
213
|
export function parseCodexModels(raw) {
|
|
142
214
|
const clean = stripAnsi(raw);
|
|
143
215
|
const models = [];
|
|
@@ -162,6 +234,9 @@ export function parseCodexAppServerModels(raw) {
|
|
|
162
234
|
? raw
|
|
163
235
|
: {};
|
|
164
236
|
const currentModel = typeof data.config?.model === 'string' ? data.config.model : undefined;
|
|
237
|
+
const currentReasoningEffort = typeof data.config?.model_reasoning_effort === 'string'
|
|
238
|
+
? data.config.model_reasoning_effort
|
|
239
|
+
: undefined;
|
|
165
240
|
const models = [];
|
|
166
241
|
for (const entry of data.data ?? []) {
|
|
167
242
|
if (typeof entry !== 'object' || entry === null)
|
|
@@ -212,12 +287,21 @@ export function parseCodexAppServerModels(raw) {
|
|
|
212
287
|
name: displayName || prettifyCodexModel(id),
|
|
213
288
|
description,
|
|
214
289
|
provider: 'openai',
|
|
215
|
-
isDefault:
|
|
290
|
+
isDefault: currentModel ? currentModel === id : item.isDefault === true,
|
|
216
291
|
supportedReasoningEfforts,
|
|
217
292
|
defaultReasoningEffort,
|
|
218
293
|
additionalSpeedTiers,
|
|
219
294
|
});
|
|
220
295
|
}
|
|
296
|
+
if (currentModel && !models.some((model) => model.id === currentModel)) {
|
|
297
|
+
models.unshift({
|
|
298
|
+
id: currentModel,
|
|
299
|
+
name: prettifyCodexModel(currentModel),
|
|
300
|
+
provider: 'openai',
|
|
301
|
+
isDefault: true,
|
|
302
|
+
defaultReasoningEffort: currentReasoningEffort,
|
|
303
|
+
});
|
|
304
|
+
}
|
|
221
305
|
return uniqueModels(models);
|
|
222
306
|
}
|
|
223
307
|
export function parseGeminiModels(raw) {
|
|
@@ -256,4 +340,10 @@ export function parseGeminiModels(raw) {
|
|
|
256
340
|
}
|
|
257
341
|
return uniqueModels(models);
|
|
258
342
|
}
|
|
259
|
-
|
|
343
|
+
export function fallbackGeminiModels() {
|
|
344
|
+
return [
|
|
345
|
+
{ id: 'gemini-2.5-pro', name: 'Gemini 2.5 Pro', provider: 'google', isDefault: true },
|
|
346
|
+
{ id: 'gemini-2.5-flash', name: 'Gemini 2.5 Flash', provider: 'google' },
|
|
347
|
+
{ id: 'auto-gemini-2.5', name: 'Auto Gemini 2.5', provider: 'google' },
|
|
348
|
+
];
|
|
349
|
+
}
|
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export declare function
|
|
1
|
+
import type { ResolvedCommandSpec } from '../command-spec.js';
|
|
2
|
+
export declare function runResolvedCommand(spec: ResolvedCommandSpec, args: string[], timeoutMs?: number): Promise<{
|
|
3
3
|
stdout: string;
|
|
4
4
|
stderr: string;
|
|
5
5
|
exitCode: number | null;
|
|
6
6
|
}>;
|
|
7
|
-
export declare function runPtyCommand(spec: {
|
|
8
|
-
command: string;
|
|
9
|
-
args: string[];
|
|
10
|
-
}, options: PtyOptions): Promise<string>;
|
|
11
|
-
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
// @arch docs/architecture/cli/model-discovery.md
|
|
2
2
|
// @test src/__tests__/model-switching.test.ts
|
|
3
|
-
import {
|
|
4
|
-
import { stripAnsi } from './parsers.js';
|
|
3
|
+
import { spawnResolvedCommand } from '../command-spec.js';
|
|
5
4
|
import { DISCOVERY_WORKDIR } from './types.js';
|
|
6
|
-
export function
|
|
5
|
+
export function runResolvedCommand(spec, args, timeoutMs = 15_000) {
|
|
7
6
|
return new Promise((resolve, reject) => {
|
|
8
|
-
const proc =
|
|
7
|
+
const proc = spawnResolvedCommand(spec, args, {
|
|
9
8
|
cwd: DISCOVERY_WORKDIR,
|
|
10
9
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
11
10
|
env: { ...process.env, NO_COLOR: '1' },
|
|
@@ -28,133 +27,3 @@ export function runCommand(command, args, timeoutMs = 15_000) {
|
|
|
28
27
|
});
|
|
29
28
|
});
|
|
30
29
|
}
|
|
31
|
-
// Lazy-load node-pty so platforms where native compilation fails still work
|
|
32
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
33
|
-
let ptySpawnRef;
|
|
34
|
-
async function loadPtySpawn() {
|
|
35
|
-
if (ptySpawnRef)
|
|
36
|
-
return ptySpawnRef;
|
|
37
|
-
try {
|
|
38
|
-
const pty = await import('@homebridge/node-pty-prebuilt-multiarch');
|
|
39
|
-
ptySpawnRef = pty.spawn;
|
|
40
|
-
return ptySpawnRef;
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
return undefined;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
export async function runPtyCommand(spec, options) {
|
|
47
|
-
const ptySpawn = await loadPtySpawn();
|
|
48
|
-
if (!ptySpawn)
|
|
49
|
-
return '';
|
|
50
|
-
const initialDelayMs = options.initialDelayMs ?? 2500;
|
|
51
|
-
const timeoutMs = options.timeoutMs ?? 20_000;
|
|
52
|
-
const scrollCount = options.scrollCount ?? 0;
|
|
53
|
-
const scrollIntervalMs = options.scrollIntervalMs ?? 400;
|
|
54
|
-
const scrollAfterOpenMs = options.scrollAfterOpenMs ?? 2000;
|
|
55
|
-
const preOpenPromptPatterns = options.preOpenPromptPatterns ?? [];
|
|
56
|
-
const preOpenPromptInput = options.preOpenPromptInput ?? '';
|
|
57
|
-
return new Promise((resolve) => {
|
|
58
|
-
const proc = ptySpawn(spec.command, [...spec.args, ...(options.startupArgs ?? [])], {
|
|
59
|
-
name: 'xterm-256color',
|
|
60
|
-
cols: 200,
|
|
61
|
-
rows: 120,
|
|
62
|
-
cwd: DISCOVERY_WORKDIR,
|
|
63
|
-
env: {
|
|
64
|
-
...process.env,
|
|
65
|
-
TERM: 'xterm-256color',
|
|
66
|
-
COLUMNS: '200',
|
|
67
|
-
LINES: '120',
|
|
68
|
-
NO_COLOR: '1',
|
|
69
|
-
},
|
|
70
|
-
});
|
|
71
|
-
let output = '';
|
|
72
|
-
let opened = false;
|
|
73
|
-
let scrolling = false;
|
|
74
|
-
let closing = false;
|
|
75
|
-
let finished = false;
|
|
76
|
-
let handledPreOpenPrompt = false;
|
|
77
|
-
const cleanup = () => {
|
|
78
|
-
if (finished)
|
|
79
|
-
return;
|
|
80
|
-
finished = true;
|
|
81
|
-
clearTimeout(forceOpenTimer);
|
|
82
|
-
clearTimeout(forceCloseTimer);
|
|
83
|
-
resolve(output);
|
|
84
|
-
};
|
|
85
|
-
const doClose = () => {
|
|
86
|
-
if (closing)
|
|
87
|
-
return;
|
|
88
|
-
closing = true;
|
|
89
|
-
proc.write('\u001b');
|
|
90
|
-
setTimeout(() => {
|
|
91
|
-
proc.write('\u0003');
|
|
92
|
-
proc.kill();
|
|
93
|
-
}, 300);
|
|
94
|
-
};
|
|
95
|
-
const doScroll = () => {
|
|
96
|
-
if (scrollCount <= 0)
|
|
97
|
-
return;
|
|
98
|
-
scrolling = true;
|
|
99
|
-
let remaining = scrollCount;
|
|
100
|
-
const tick = () => {
|
|
101
|
-
if (remaining <= 0 || closing || finished) {
|
|
102
|
-
scrolling = false;
|
|
103
|
-
setTimeout(doClose, 500);
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
proc.write('\u001b[B');
|
|
107
|
-
remaining--;
|
|
108
|
-
setTimeout(tick, scrollIntervalMs);
|
|
109
|
-
};
|
|
110
|
-
tick();
|
|
111
|
-
};
|
|
112
|
-
const afterOpen = () => {
|
|
113
|
-
if (scrollCount > 0) {
|
|
114
|
-
setTimeout(doScroll, scrollAfterOpenMs);
|
|
115
|
-
}
|
|
116
|
-
};
|
|
117
|
-
const forceOpenTimer = setTimeout(() => {
|
|
118
|
-
if (!opened) {
|
|
119
|
-
opened = true;
|
|
120
|
-
proc.write('/model\r');
|
|
121
|
-
afterOpen();
|
|
122
|
-
}
|
|
123
|
-
}, initialDelayMs);
|
|
124
|
-
const forceCloseTimer = setTimeout(doClose, timeoutMs);
|
|
125
|
-
const maybeOpen = () => {
|
|
126
|
-
const clean = stripAnsi(output);
|
|
127
|
-
if (!handledPreOpenPrompt && preOpenPromptPatterns.some((pattern) => pattern.test(clean))) {
|
|
128
|
-
handledPreOpenPrompt = true;
|
|
129
|
-
if (preOpenPromptInput) {
|
|
130
|
-
proc.write(preOpenPromptInput);
|
|
131
|
-
}
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
if (opened)
|
|
135
|
-
return;
|
|
136
|
-
if (options.readyPatterns.some((pattern) => pattern.test(clean))) {
|
|
137
|
-
opened = true;
|
|
138
|
-
proc.write('/model\r');
|
|
139
|
-
afterOpen();
|
|
140
|
-
}
|
|
141
|
-
};
|
|
142
|
-
const maybeClose = () => {
|
|
143
|
-
if (!opened || closing || scrolling || scrollCount > 0)
|
|
144
|
-
return;
|
|
145
|
-
const clean = stripAnsi(output);
|
|
146
|
-
if (options.closePatterns.some((pattern) => pattern.test(clean))) {
|
|
147
|
-
doClose();
|
|
148
|
-
}
|
|
149
|
-
};
|
|
150
|
-
proc.onData((chunk) => {
|
|
151
|
-
output += chunk;
|
|
152
|
-
if (!finished) {
|
|
153
|
-
maybeOpen();
|
|
154
|
-
maybeClose();
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
proc.onExit(cleanup);
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
//# sourceMappingURL=runner.js.map
|
|
@@ -4,4 +4,3 @@ import type { DiscoveryContext } from './types.js';
|
|
|
4
4
|
export declare function getCachedAgentInfos(detectedAgents: DetectedAgent[]): AgentInfo[];
|
|
5
5
|
export declare function refreshAgentInfos(detectedAgents: DetectedAgent[], context: DiscoveryContext): Promise<AgentInfo[]>;
|
|
6
6
|
export declare function resolveAgentInfos(detectedAgents: DetectedAgent[], context: DiscoveryContext): Promise<AgentInfo[]>;
|
|
7
|
-
//# sourceMappingURL=service.d.ts.map
|
|
@@ -39,21 +39,24 @@ export async function resolveAgentInfos(detectedAgents, context) {
|
|
|
39
39
|
models = cached.models;
|
|
40
40
|
}
|
|
41
41
|
else {
|
|
42
|
+
let discovered = null;
|
|
42
43
|
try {
|
|
43
|
-
|
|
44
|
+
discovered = uniqueModels(await discoverModelsForAgent(agent, context));
|
|
44
45
|
models = discovered.length > 0 ? discovered : cached?.models ?? agent.models ?? [];
|
|
45
46
|
}
|
|
46
47
|
catch {
|
|
47
48
|
models = cached?.models ?? agent.models ?? [];
|
|
48
49
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
50
|
+
if (discovered && discovered.length > 0) {
|
|
51
|
+
const nextEntry = {
|
|
52
|
+
version: agent.version,
|
|
53
|
+
refreshedAt: Date.now(),
|
|
54
|
+
models,
|
|
55
|
+
};
|
|
56
|
+
if (JSON.stringify(cached) !== JSON.stringify(nextEntry)) {
|
|
57
|
+
cache.agents[agent.type] = nextEntry;
|
|
58
|
+
changed = true;
|
|
59
|
+
}
|
|
57
60
|
}
|
|
58
61
|
}
|
|
59
62
|
infos.push({
|
|
@@ -66,4 +69,3 @@ export async function resolveAgentInfos(detectedAgents, context) {
|
|
|
66
69
|
}
|
|
67
70
|
return infos;
|
|
68
71
|
}
|
|
69
|
-
//# sourceMappingURL=service.js.map
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export { getCachedAgentInfos, refreshAgentInfos, resolveAgentInfos } from './model-registry/service.js';
|
|
2
|
-
import { parseClaudeModels, parseCodexModels, parseCodexAppServerModels, parseCursorModels, parseGeminiModels, parseOpenClawModels, stripAnsi } from './model-registry/parsers.js';
|
|
2
|
+
import { parseClaudeBinaryModels, parseClaudeModels, parseCodexModels, parseCodexAppServerModels, parseCursorModels, parseGeminiModels, parseOpenClawModels, stripAnsi } from './model-registry/parsers.js';
|
|
3
3
|
/** Used by Vitest / `model-switching-e2e.ts` — not a stable public API. */
|
|
4
4
|
export declare const modelSwitchingTestExports: {
|
|
5
|
+
readonly parseClaudeBinaryModels: typeof parseClaudeBinaryModels;
|
|
5
6
|
readonly parseClaudeModels: typeof parseClaudeModels;
|
|
6
7
|
readonly parseCodexModels: typeof parseCodexModels;
|
|
7
8
|
readonly parseCodexAppServerModels: typeof parseCodexAppServerModels;
|
|
@@ -10,4 +11,3 @@ export declare const modelSwitchingTestExports: {
|
|
|
10
11
|
readonly parseGeminiModels: typeof parseGeminiModels;
|
|
11
12
|
readonly stripAnsi: typeof stripAnsi;
|
|
12
13
|
};
|
|
13
|
-
//# sourceMappingURL=model-registry.d.ts.map
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
// @arch docs/architecture/cli/model-discovery.md
|
|
2
2
|
// @test src/__tests__/model-switching.test.ts
|
|
3
3
|
export { getCachedAgentInfos, refreshAgentInfos, resolveAgentInfos } from './model-registry/service.js';
|
|
4
|
-
import { parseClaudeModels, parseCodexModels, parseCodexAppServerModels, parseCursorModels, parseGeminiModels, parseOpenClawModels, stripAnsi, } from './model-registry/parsers.js';
|
|
4
|
+
import { parseClaudeBinaryModels, parseClaudeModels, parseCodexModels, parseCodexAppServerModels, parseCursorModels, parseGeminiModels, parseOpenClawModels, stripAnsi, } from './model-registry/parsers.js';
|
|
5
5
|
/** Used by Vitest / `model-switching-e2e.ts` — not a stable public API. */
|
|
6
6
|
export const modelSwitchingTestExports = {
|
|
7
|
+
parseClaudeBinaryModels,
|
|
7
8
|
parseClaudeModels,
|
|
8
9
|
parseCodexModels,
|
|
9
10
|
parseCodexAppServerModels,
|
|
@@ -12,4 +13,3 @@ export const modelSwitchingTestExports = {
|
|
|
12
13
|
parseGeminiModels,
|
|
13
14
|
stripAnsi,
|
|
14
15
|
};
|
|
15
|
-
//# sourceMappingURL=model-registry.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
1
|
import { randomUUID } from 'node:crypto';
|
|
3
2
|
import { AgentAdapter, registerAgent } from './adapter.js';
|
|
3
|
+
import { resolveBuiltinCommand, spawnResolvedCommand } from './command-spec.js';
|
|
4
4
|
/** Best-effort parse of `openclaw agent --json` stdout; shape may vary by version. */
|
|
5
5
|
function extractResponseText(parsed) {
|
|
6
6
|
if (parsed == null)
|
|
@@ -116,8 +116,13 @@ export class OpenClawAdapter extends AgentAdapter {
|
|
|
116
116
|
await this.killProcess();
|
|
117
117
|
}
|
|
118
118
|
spawnAgent(extraArgs) {
|
|
119
|
+
const spec = resolveBuiltinCommand('openclaw');
|
|
120
|
+
if (!spec) {
|
|
121
|
+
this.emit('error', new Error('Command "openclaw" not found. Is OpenClaw CLI installed?'));
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
119
124
|
const args = ['agent', '--local', '--json', ...extraArgs];
|
|
120
|
-
const proc =
|
|
125
|
+
const proc = spawnResolvedCommand(spec, args, {
|
|
121
126
|
cwd: this.workDir ?? undefined,
|
|
122
127
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
123
128
|
env: { ...process.env },
|
|
@@ -190,8 +195,13 @@ export class OpenClawAdapter extends AgentAdapter {
|
|
|
190
195
|
}
|
|
191
196
|
async runAgentCommand(extraArgs) {
|
|
192
197
|
return new Promise((resolve) => {
|
|
198
|
+
const spec = resolveBuiltinCommand('openclaw');
|
|
199
|
+
if (!spec) {
|
|
200
|
+
resolve({ ok: false, error: 'Command "openclaw" not found. Is OpenClaw CLI installed?' });
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
193
203
|
const args = ['agent', '--local', '--json', ...extraArgs];
|
|
194
|
-
const proc =
|
|
204
|
+
const proc = spawnResolvedCommand(spec, args, {
|
|
195
205
|
cwd: this.workDir ?? undefined,
|
|
196
206
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
197
207
|
env: { ...process.env },
|
|
@@ -261,4 +271,3 @@ export class OpenClawAdapter extends AgentAdapter {
|
|
|
261
271
|
}
|
|
262
272
|
}
|
|
263
273
|
registerAgent('openclaw', () => new OpenClawAdapter());
|
|
264
|
-
//# sourceMappingURL=openclaw.js.map
|
package/dist/src/agents/pi.d.ts
CHANGED
package/dist/src/agents/pi.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
1
|
import chalk from 'chalk';
|
|
3
2
|
import { loadConfig, saveConfig } from '../config/index.js';
|
|
3
|
+
import { spawnCommandString } from '../agents/command-spec.js';
|
|
4
4
|
function getCapsModels(caps) {
|
|
5
5
|
if (caps.models?.length)
|
|
6
6
|
return caps.models;
|
|
@@ -12,11 +12,8 @@ function getCapsModels(caps) {
|
|
|
12
12
|
* Runs `<command> /caps` and returns the parsed caps JSON.
|
|
13
13
|
*/
|
|
14
14
|
async function probeCaps(command) {
|
|
15
|
-
const parts = splitCommand(command);
|
|
16
|
-
const bin = parts[0];
|
|
17
|
-
const args = [...parts.slice(1), '/caps'];
|
|
18
15
|
return new Promise((resolve, reject) => {
|
|
19
|
-
const proc =
|
|
16
|
+
const proc = spawnCommandString(command, ['/caps'], { stdio: ['ignore', 'pipe', 'pipe'] });
|
|
20
17
|
let stdout = '';
|
|
21
18
|
let stderr = '';
|
|
22
19
|
proc.stdout?.on('data', (d) => { stdout += d.toString(); });
|
|
@@ -54,33 +51,6 @@ async function probeCaps(command) {
|
|
|
54
51
|
}, 5000);
|
|
55
52
|
});
|
|
56
53
|
}
|
|
57
|
-
function splitCommand(cmd) {
|
|
58
|
-
const args = [];
|
|
59
|
-
let current = '';
|
|
60
|
-
let inSingle = false;
|
|
61
|
-
let inDouble = false;
|
|
62
|
-
for (const ch of cmd) {
|
|
63
|
-
if (ch === "'" && !inDouble) {
|
|
64
|
-
inSingle = !inSingle;
|
|
65
|
-
continue;
|
|
66
|
-
}
|
|
67
|
-
if (ch === '"' && !inSingle) {
|
|
68
|
-
inDouble = !inDouble;
|
|
69
|
-
continue;
|
|
70
|
-
}
|
|
71
|
-
if (ch === ' ' && !inSingle && !inDouble) {
|
|
72
|
-
if (current) {
|
|
73
|
-
args.push(current);
|
|
74
|
-
current = '';
|
|
75
|
-
}
|
|
76
|
-
continue;
|
|
77
|
-
}
|
|
78
|
-
current += ch;
|
|
79
|
-
}
|
|
80
|
-
if (current)
|
|
81
|
-
args.push(current);
|
|
82
|
-
return args;
|
|
83
|
-
}
|
|
84
54
|
export function registerAgentCommand(program) {
|
|
85
55
|
const agent = program
|
|
86
56
|
.command('agent')
|
|
@@ -159,4 +129,3 @@ export function registerAgentCommand(program) {
|
|
|
159
129
|
console.log(chalk.yellow(' Refresh Agents in the app to hot-reload this daemon, or restart the daemon as a fallback.'));
|
|
160
130
|
});
|
|
161
131
|
}
|
|
162
|
-
//# sourceMappingURL=agent.js.map
|
|
@@ -14,6 +14,12 @@ export declare function resolveServiceLaunchSpec(input: {
|
|
|
14
14
|
}): ServiceLaunchSpec;
|
|
15
15
|
export declare function buildWindowsLauncherCommand(spec: ServiceLaunchSpec, logFile: string): string;
|
|
16
16
|
export declare function buildWindowsStartupVbs(cmdPath: string): string;
|
|
17
|
+
export declare function buildWindowsScheduledTaskXml(input: {
|
|
18
|
+
userId: string;
|
|
19
|
+
command: string;
|
|
20
|
+
arguments: string[];
|
|
21
|
+
}): string;
|
|
22
|
+
export declare function captureEnvForService(): Record<string, string>;
|
|
17
23
|
/**
|
|
18
24
|
* Save current env vars so the daemon can load them at startup.
|
|
19
25
|
* This is critical for launchd/systemd which start with minimal env.
|
|
@@ -27,4 +33,3 @@ export declare function startDaemonProcess(): void;
|
|
|
27
33
|
export declare function installService(): boolean;
|
|
28
34
|
export declare function registerDaemonCommand(program: Command): void;
|
|
29
35
|
export {};
|
|
30
|
-
//# sourceMappingURL=daemon.d.ts.map
|