@harness-mix/cli 0.2.3 → 0.3.0
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/CHANGELOG.md +24 -0
- package/README.md +469 -467
- package/docs/harness-management.md +1 -1
- package/docs/multi-agent-collaboration.md +3 -1
- package/docs/native-acp.md +138 -127
- package/output/native-build/desktop-controller.mjs +1 -1
- package/output/native-build/renderer-extension.js +172 -23
- package/package.json +13 -9
- package/scripts/acp-image-test.cjs +69 -0
- package/scripts/adapters-test.cjs +25 -0
- package/scripts/antigravity-adapter-test.cjs +647 -626
- package/scripts/codex-accounts-test.cjs +34 -0
- package/scripts/codex-adapter-test.cjs +238 -127
- package/scripts/collaboration-test.cjs +577 -262
- package/scripts/collaboration-ui-smoke.cjs +25 -3
- package/scripts/e2e-delegate.cjs +1 -1
- package/scripts/e2e-hermes-image.cjs +60 -0
- package/scripts/jsonl-stdin-test.cjs +40 -31
- package/scripts/kiro-cursor-adapters-test.cjs +124 -100
- package/scripts/native-acp-depth-test.cjs +30 -5
- package/scripts/native-update-apply-test.cjs +269 -215
- package/scripts/native-update.cjs +78 -0
- package/scripts/native-vendor-adapters-test.cjs +196 -154
- package/scripts/openclaw-adapter-test.cjs +121 -3
- package/scripts/openclaw-mcp-probe.cjs +100 -0
- package/scripts/openclaw-mcp-tool-probe.cjs +55 -0
- package/scripts/openclaw-thinking-probe.cjs +73 -0
- package/scripts/salvage-rollout-writes.cjs +72 -0
- package/scripts/storage-verification-test.cjs +11 -0
- package/scripts/zcode-adapter-test.cjs +329 -0
- package/scripts/zcode-live-probe.cjs +66 -0
- package/src/main/adapters/antigravity.js +1428 -1418
- package/src/main/adapters/claude.js +15 -7
- package/src/main/adapters/codex-app-server.js +29 -11
- package/src/main/adapters/codex.js +690 -649
- package/src/main/adapters/native-acp-command.js +51 -48
- package/src/main/adapters/native-acp.js +47 -12
- package/src/main/adapters/omp.js +7 -2
- package/src/main/adapters/openclaw.js +534 -343
- package/src/main/adapters/pi-family.js +35 -8
- package/src/main/adapters/qoder.js +12 -8
- package/src/main/adapters/zcode.js +925 -10
- package/src/main/host/collaboration-tools.js +1 -1
- package/src/main/host/collaboration.js +971 -714
- package/src/main/host/jsonl.js +130 -120
- package/src/main/host/runtime.js +9 -3
- package/src/main/host/verification-gates.js +14 -2
- package/src/main/native/codex-accounts.js +15 -4
- package/src/main/native/config.js +9 -9
- package/src/main/native/launcher.js +252 -237
- package/src/main/native/process-utils.js +157 -57
- package/src/main/native/protocol.js +1227 -1187
- package/src/main/native/update-state.js +123 -110
- package/src/main/native/updater.js +460 -394
- package/src/native-ui/desktop-control/dist/renderer-cdp-control-session.js +3 -1
- package/src/native-ui/desktop-control/dist/renderer-cdp-control-session.js.map +1 -1
- package/src/native-ui/desktop-control/dist/tsconfig.tsbuildinfo +1 -1
- package/src/native-ui/desktop-control/src/renderer-cdp-control-session.ts +358 -358
- package/src/native-ui/renderer-extension/dist/types/renderer-binding-probe.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-collab-cards.d.ts +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-collab-cards.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-model-client.d.ts +29 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-model-client.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-team-cards.d.ts +4 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-team-cards.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/tsconfig.tsbuildinfo +1 -1
- package/src/native-ui/renderer-extension/src/renderer-binding-probe.ts +3224 -3181
- package/src/native-ui/renderer-extension/src/renderer-collab-cards.ts +25 -0
- package/src/native-ui/renderer-extension/src/renderer-model-client.ts +27 -0
- package/src/native-ui/renderer-extension/src/renderer-team-cards.ts +93 -13
- package/src/native-ui/renderer-extension/src/settings/connections-page.ts +2 -2
- package/src/native-ui/renderer-extension/test/renderer-model-client.test.ts +47 -1
|
@@ -13,7 +13,10 @@ const manifest = {
|
|
|
13
13
|
capabilities: { collaborationTools: true, streaming: true, thinking: true, tools: true, approvals: true, questions: true, models: true, thinkingLevels: true, permissionModes: true, resume: true, fork: true, forkFromMessage: true, compaction: true, usage: true, contextUsage: true, attachments: true },
|
|
14
14
|
};
|
|
15
15
|
|
|
16
|
-
/** Claude Code 原生权限模式(SDK PermissionMode
|
|
16
|
+
/** Claude Code 原生权限模式(SDK PermissionMode 配置值全集),与其 TUI/Desktop 一致。
|
|
17
|
+
* 实测校准(本机 claude 2.1.220 `--help` 与 code.claude.com/docs/en/permission-modes):
|
|
18
|
+
* CLI 旗标选项为 acceptEdits/auto/bypassPermissions/manual/dontAsk/plan,其中 manual 只是
|
|
19
|
+
* default 的 CLI 别名(SDK/钩子配置值仍为 default),auto/dontAsk 为新增档;此处按 SDK 配置值列出。 */
|
|
17
20
|
const CLAUDE_PERMISSION_MODES = [
|
|
18
21
|
{ id: "default", label: "默认(询问)", description: "编辑和其他受保护操作前询问" },
|
|
19
22
|
{ id: "plan", label: "规划模式", description: "探索并制定计划;批准计划后退出规划" },
|
|
@@ -457,12 +460,17 @@ function create() {
|
|
|
457
460
|
if (!session?.query) return base;
|
|
458
461
|
try {
|
|
459
462
|
const commands = await session.query.supportedCommands();
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
463
|
+
const seen = new Set(['compact']); // 与既有 id(含原生 compact)去重
|
|
464
|
+
const mapped = [];
|
|
465
|
+
for (const c of commands) {
|
|
466
|
+
if (!c?.name || seen.has(c.name)) continue;
|
|
467
|
+
seen.add(c.name);
|
|
468
|
+
mapped.push({
|
|
469
|
+
id: c.name, label: '/' + c.name, action: 'insert', text: '/' + c.name + ' ',
|
|
470
|
+
description: `${c.description ?? ''}${c.argumentHint ? `(参数:${c.argumentHint})` : ''}`,
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
return [...base, ...mapped];
|
|
466
474
|
} catch { return base; }
|
|
467
475
|
},
|
|
468
476
|
async executeCommand(session, id, hooks) {
|
|
@@ -2,6 +2,14 @@ const { JsonlProcess, cliSpawn } = require('../host/jsonl');
|
|
|
2
2
|
|
|
3
3
|
const shared = new Map();
|
|
4
4
|
|
|
5
|
+
// codex 拒绝在缺失的 CODEX_HOME 下启动、或握手被外部因素(杀软扫描/磁盘/版本握手)挂住时,
|
|
6
|
+
// initialize 永不返回。没有这个上限,thread/start 会永久 pending,Desktop 端表现为
|
|
7
|
+
// 新对话"一直在执行"却没有会话产生。测试可用 env 覆盖。
|
|
8
|
+
function handshakeTimeoutMs() {
|
|
9
|
+
const raw = Number(process.env.HARNESS_MIX_CODEX_HANDSHAKE_TIMEOUT_MS);
|
|
10
|
+
return Number.isFinite(raw) && raw >= 100 ? raw : 20_000;
|
|
11
|
+
}
|
|
12
|
+
|
|
5
13
|
/**
|
|
6
14
|
* A single native Codex app-server connection shared by every Codex thread.
|
|
7
15
|
* app-server owns thread/session persistence; this class only routes JSON-RPC
|
|
@@ -25,17 +33,27 @@ class CodexAppServer {
|
|
|
25
33
|
onDiagnostic: (line) => this.#diagnostic(line),
|
|
26
34
|
onExit: (error) => this.#exit(error),
|
|
27
35
|
});
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
this.process.
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
let rejectHandshake;
|
|
37
|
+
const handshakeGuard = new Promise((_unused, reject) => { rejectHandshake = reject; });
|
|
38
|
+
const handshakeTimer = setTimeout(() => {
|
|
39
|
+
this.stop();
|
|
40
|
+
rejectHandshake(new Error(`Codex app-server 未在 ${Math.round(handshakeTimeoutMs() / 1000)} 秒内完成初始化握手,已终止进程`));
|
|
41
|
+
}, handshakeTimeoutMs());
|
|
42
|
+
handshakeTimer.unref?.();
|
|
43
|
+
this.ready = Promise.race([
|
|
44
|
+
this.process.request('initialize', {
|
|
45
|
+
clientInfo: { name: 'harness-mix', title: 'Harness Mix', version: '0.1.0' },
|
|
46
|
+
capabilities: {
|
|
47
|
+
experimentalApi: true,
|
|
48
|
+
requestAttestation: false,
|
|
49
|
+
mcpServerOpenaiFormElicitation: false,
|
|
50
|
+
},
|
|
51
|
+
}).then((result) => {
|
|
52
|
+
this.process.notify('initialized', {});
|
|
53
|
+
return result;
|
|
54
|
+
}),
|
|
55
|
+
handshakeGuard,
|
|
56
|
+
]).finally(() => clearTimeout(handshakeTimer));
|
|
39
57
|
}
|
|
40
58
|
|
|
41
59
|
static async acquire(diagnostic, codexHome) {
|