botmux 2.52.0 → 2.54.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/README.en.md +22 -269
- package/README.md +21 -300
- package/dist/adapters/backend/session-backend-selector.d.ts +5 -1
- package/dist/adapters/backend/session-backend-selector.d.ts.map +1 -1
- package/dist/adapters/backend/session-backend-selector.js +15 -1
- package/dist/adapters/backend/session-backend-selector.js.map +1 -1
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +3 -0
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/backend/types.d.ts +22 -0
- package/dist/adapters/backend/types.d.ts.map +1 -1
- package/dist/adapters/backend/types.js +7 -1
- package/dist/adapters/backend/types.js.map +1 -1
- package/dist/adapters/backend/zellij-backend.d.ts +132 -0
- package/dist/adapters/backend/zellij-backend.d.ts.map +1 -0
- package/dist/adapters/backend/zellij-backend.js +375 -0
- package/dist/adapters/backend/zellij-backend.js.map +1 -0
- package/dist/adapters/backend/zellij-observe-backend.d.ts +62 -0
- package/dist/adapters/backend/zellij-observe-backend.d.ts.map +1 -0
- package/dist/adapters/backend/zellij-observe-backend.js +218 -0
- package/dist/adapters/backend/zellij-observe-backend.js.map +1 -0
- package/dist/adapters/cli/claude-code.d.ts +39 -5
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +53 -31
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/registry.d.ts +2 -1
- package/dist/adapters/cli/registry.d.ts.map +1 -1
- package/dist/adapters/cli/registry.js +3 -1
- package/dist/adapters/cli/registry.js.map +1 -1
- package/dist/adapters/cli/seed.d.ts +29 -0
- package/dist/adapters/cli/seed.d.ts.map +1 -0
- package/dist/adapters/cli/seed.js +63 -0
- package/dist/adapters/cli/seed.js.map +1 -0
- package/dist/adapters/cli/types.d.ts +17 -1
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/bot-registry.d.ts +1 -1
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +79 -49
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +7 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +8 -0
- package/dist/config.js.map +1 -1
- package/dist/core/ask-hook/registry.d.ts.map +1 -1
- package/dist/core/ask-hook/registry.js +4 -0
- package/dist/core/ask-hook/registry.js.map +1 -1
- package/dist/core/command-handler.d.ts +4 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +100 -8
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dispatch.d.ts +33 -0
- package/dist/core/dispatch.d.ts.map +1 -1
- package/dist/core/dispatch.js +26 -0
- package/dist/core/dispatch.js.map +1 -1
- package/dist/core/pending-response.d.ts +31 -0
- package/dist/core/pending-response.d.ts.map +1 -0
- package/dist/core/pending-response.js +87 -0
- package/dist/core/pending-response.js.map +1 -0
- package/dist/core/session-discovery.d.ts +13 -4
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +5 -5
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/session-manager.d.ts +10 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +59 -19
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/types.d.ts +8 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +2 -2
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +89 -15
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/core/zellij-adopt-discovery.d.ts +28 -0
- package/dist/core/zellij-adopt-discovery.d.ts.map +1 -0
- package/dist/core/zellij-adopt-discovery.js +276 -0
- package/dist/core/zellij-adopt-discovery.js.map +1 -0
- package/dist/core/zellij-session-discovery.d.ts +73 -0
- package/dist/core/zellij-session-discovery.d.ts.map +1 -0
- package/dist/core/zellij-session-discovery.js +259 -0
- package/dist/core/zellij-session-discovery.js.map +1 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +70 -4
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/web/i18n.js +1 -1
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +1 -0
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard/web/workflows.js +1 -1
- package/dist/dashboard/web/workflows.js.map +1 -1
- package/dist/dashboard-web/app.js +3 -3
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +12 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +13 -1
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +7 -1
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +92 -2
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +78 -6
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +8 -1
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +28 -0
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/grant-command.d.ts +13 -0
- package/dist/im/lark/grant-command.d.ts.map +1 -1
- package/dist/im/lark/grant-command.js +93 -0
- package/dist/im/lark/grant-command.js.map +1 -1
- package/dist/services/codex-app-threads.d.ts +20 -0
- package/dist/services/codex-app-threads.d.ts.map +1 -0
- package/dist/services/codex-app-threads.js +165 -0
- package/dist/services/codex-app-threads.js.map +1 -0
- package/dist/services/pending-response-transaction-store.d.ts +12 -0
- package/dist/services/pending-response-transaction-store.d.ts.map +1 -0
- package/dist/services/pending-response-transaction-store.js +52 -0
- package/dist/services/pending-response-transaction-store.js.map +1 -0
- package/dist/services/session-store.d.ts.map +1 -1
- package/dist/services/session-store.js +15 -1
- package/dist/services/session-store.js.map +1 -1
- package/dist/setup/bot-config-editor.d.ts +1 -1
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +5 -4
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/setup/ensure-zellij.d.ts +48 -0
- package/dist/setup/ensure-zellij.d.ts.map +1 -0
- package/dist/setup/ensure-zellij.js +93 -0
- package/dist/setup/ensure-zellij.js.map +1 -0
- package/dist/types.d.ts +14 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/anchor-serializer.d.ts +3 -2
- package/dist/utils/anchor-serializer.d.ts.map +1 -1
- package/dist/utils/anchor-serializer.js +20 -5
- package/dist/utils/anchor-serializer.js.map +1 -1
- package/dist/utils/transient-snapshot.js +2 -2
- package/dist/utils/transient-snapshot.js.map +1 -1
- package/dist/worker.js +235 -32
- package/dist/worker.js.map +1 -1
- package/dist/workflows/attempt-resume.d.ts +1 -1
- package/dist/workflows/attempt-resume.d.ts.map +1 -1
- package/dist/workflows/attempt-resume.js +1 -1
- package/dist/workflows/attempt-resume.js.map +1 -1
- package/dist/workflows/events/payloads.d.ts +20 -20
- package/dist/workflows/events/schema.d.ts +48 -48
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/registry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C;;gEAEgE;AAChE,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA2BlD;AAID,sFAAsF;AACtF,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAO5F;AAED,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/registry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C;;gEAEgE;AAChE,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA2BlD;AAID,sFAAsF;AACtF,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAO5F;AAED,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,CAAC;AAE7R,qDAAqD;AACrD,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAiBjF"}
|
|
@@ -3,6 +3,7 @@ import { existsSync } from 'node:fs';
|
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
4
|
import { isAbsolute, join } from 'node:path';
|
|
5
5
|
import { createClaudeCodeAdapter } from './claude-code.js';
|
|
6
|
+
import { createSeedAdapter } from './seed.js';
|
|
6
7
|
import { createAidenAdapter } from './aiden.js';
|
|
7
8
|
import { createCocoAdapter } from './coco.js';
|
|
8
9
|
import { createCodexAdapter } from './codex.js';
|
|
@@ -60,11 +61,12 @@ export async function createCliAdapter(id, pathOverride) {
|
|
|
60
61
|
adapterCache.set(key, adapter);
|
|
61
62
|
return adapter;
|
|
62
63
|
}
|
|
63
|
-
export { createClaudeCodeAdapter, createAidenAdapter, createCocoAdapter, createCodexAdapter, createCodexAppAdapter, createCursorAdapter, createGeminiAdapter, createOpenCodeAdapter, createAntigravityAdapter, createMtrAdapter, createHermesAdapter, createMiraAdapter };
|
|
64
|
+
export { createClaudeCodeAdapter, createSeedAdapter, createAidenAdapter, createCocoAdapter, createCodexAdapter, createCodexAppAdapter, createCursorAdapter, createGeminiAdapter, createOpenCodeAdapter, createAntigravityAdapter, createMtrAdapter, createHermesAdapter, createMiraAdapter };
|
|
64
65
|
/** Synchronous version for use in worker process. */
|
|
65
66
|
export function createCliAdapterSync(id, pathOverride) {
|
|
66
67
|
switch (id.toLowerCase()) {
|
|
67
68
|
case 'claude-code': return createClaudeCodeAdapter(pathOverride);
|
|
69
|
+
case 'seed': return createSeedAdapter(pathOverride);
|
|
68
70
|
case 'aiden': return createAidenAdapter(pathOverride);
|
|
69
71
|
case 'coco': return createCocoAdapter(pathOverride);
|
|
70
72
|
case 'codex': return createCodexAdapter(pathOverride);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/adapters/cli/registry.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/adapters/cli/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { CliAdapter } from './types.js';
|
|
2
|
+
/** Seed CLI (`@bytedance-seed/claude-code`, binary `seed`) is a ByteDance fork
|
|
3
|
+
* of Claude Code: identical flags, slash commands, and on-disk session layout
|
|
4
|
+
* (per-project JSONL transcripts, `sessions/<pid>.json`, `tasks/` fd locks,
|
|
5
|
+
* keybindings.json, settings.json hooks). It differs only in the binary name,
|
|
6
|
+
* its ByteCloud / SuperRelay auth, and its data root — which it isolates to a
|
|
7
|
+
* `.claude-runtime` directory *inside its own install package* (rather than
|
|
8
|
+
* `~/.claude`), respecting `CLAUDE_CONFIG_DIR` when set.
|
|
9
|
+
*
|
|
10
|
+
* So Seed reuses the entire Claude-family adapter; the only work here is
|
|
11
|
+
* locating that `.claude-runtime` so botmux watches exactly where Seed writes. */
|
|
12
|
+
/** Derive Seed's `.claude-runtime` data root from the resolved binary.
|
|
13
|
+
*
|
|
14
|
+
* `which seed` returns an ephemeral fnm/nvm shim (e.g.
|
|
15
|
+
* `/run/user/.../fnm_multishells/<pid>_.../bin/seed`); realpath follows the
|
|
16
|
+
* symlink chain to the package's `dist/cli.js`, whose package root is two
|
|
17
|
+
* levels up. `.claude-runtime` sits at that package root. Deriving from the
|
|
18
|
+
* binary on every spawn means a node/fnm switch (which moves the binary)
|
|
19
|
+
* auto-tracks to the matching runtime dir — and it equals the path a bare
|
|
20
|
+
* `seed` uses by default, so botmux-spawned and hand-started Seed sessions
|
|
21
|
+
* share one config (settings, history, cross-resume).
|
|
22
|
+
*
|
|
23
|
+
* Falls back to `~/.claude-runtime` only if realpath fails (unusual install
|
|
24
|
+
* layout) — Seed still runs, but the JSONL bridge may target the wrong dir;
|
|
25
|
+
* we log so it's diagnosable rather than silently degraded. */
|
|
26
|
+
export declare function deriveSeedDataDir(bin: string): string;
|
|
27
|
+
export declare function createSeedAdapter(pathOverride?: string): CliAdapter;
|
|
28
|
+
export declare const create: typeof createSeedAdapter;
|
|
29
|
+
//# sourceMappingURL=seed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/seed.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;;;;;;;mFASmF;AAEnF;;;;;;;;;;;;;gEAagE;AAChE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAUrD;AAED,wBAAgB,iBAAiB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAkBnE;AAED,eAAO,MAAM,MAAM,0BAAoB,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { realpathSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { resolveCommand } from './registry.js';
|
|
5
|
+
import { createClaudeFamilyAdapter } from './claude-code.js';
|
|
6
|
+
import { logger } from '../../utils/logger.js';
|
|
7
|
+
/** Seed CLI (`@bytedance-seed/claude-code`, binary `seed`) is a ByteDance fork
|
|
8
|
+
* of Claude Code: identical flags, slash commands, and on-disk session layout
|
|
9
|
+
* (per-project JSONL transcripts, `sessions/<pid>.json`, `tasks/` fd locks,
|
|
10
|
+
* keybindings.json, settings.json hooks). It differs only in the binary name,
|
|
11
|
+
* its ByteCloud / SuperRelay auth, and its data root — which it isolates to a
|
|
12
|
+
* `.claude-runtime` directory *inside its own install package* (rather than
|
|
13
|
+
* `~/.claude`), respecting `CLAUDE_CONFIG_DIR` when set.
|
|
14
|
+
*
|
|
15
|
+
* So Seed reuses the entire Claude-family adapter; the only work here is
|
|
16
|
+
* locating that `.claude-runtime` so botmux watches exactly where Seed writes. */
|
|
17
|
+
/** Derive Seed's `.claude-runtime` data root from the resolved binary.
|
|
18
|
+
*
|
|
19
|
+
* `which seed` returns an ephemeral fnm/nvm shim (e.g.
|
|
20
|
+
* `/run/user/.../fnm_multishells/<pid>_.../bin/seed`); realpath follows the
|
|
21
|
+
* symlink chain to the package's `dist/cli.js`, whose package root is two
|
|
22
|
+
* levels up. `.claude-runtime` sits at that package root. Deriving from the
|
|
23
|
+
* binary on every spawn means a node/fnm switch (which moves the binary)
|
|
24
|
+
* auto-tracks to the matching runtime dir — and it equals the path a bare
|
|
25
|
+
* `seed` uses by default, so botmux-spawned and hand-started Seed sessions
|
|
26
|
+
* share one config (settings, history, cross-resume).
|
|
27
|
+
*
|
|
28
|
+
* Falls back to `~/.claude-runtime` only if realpath fails (unusual install
|
|
29
|
+
* layout) — Seed still runs, but the JSONL bridge may target the wrong dir;
|
|
30
|
+
* we log so it's diagnosable rather than silently degraded. */
|
|
31
|
+
export function deriveSeedDataDir(bin) {
|
|
32
|
+
try {
|
|
33
|
+
const real = realpathSync(bin); // <pkg>/dist/cli.js
|
|
34
|
+
const pkgRoot = dirname(dirname(real)); // <pkg>
|
|
35
|
+
return join(pkgRoot, '.claude-runtime');
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
const fallback = join(homedir(), '.claude-runtime');
|
|
39
|
+
logger.warn(`[seed] could not resolve .claude-runtime from binary "${bin}" (${err instanceof Error ? err.message : String(err)}); falling back to ${fallback}`);
|
|
40
|
+
return fallback;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function createSeedAdapter(pathOverride) {
|
|
44
|
+
const bin = resolveCommand(pathOverride ?? 'seed');
|
|
45
|
+
const dataDir = deriveSeedDataDir(bin);
|
|
46
|
+
return createClaudeFamilyAdapter({
|
|
47
|
+
id: 'seed',
|
|
48
|
+
resumeBin: 'seed',
|
|
49
|
+
dataDir,
|
|
50
|
+
// Seed keeps `.claude.json` inside its data root (CLAUDE_CONFIG_DIR layout),
|
|
51
|
+
// unlike Claude Code which puts it at `~/.claude.json`.
|
|
52
|
+
stateJsonPath: join(dataDir, '.claude.json'),
|
|
53
|
+
// Pin CLAUDE_CONFIG_DIR to Seed's own default so the dir botmux watches and
|
|
54
|
+
// the dir Seed writes to are provably identical — and still equal to what a
|
|
55
|
+
// hand-started `seed` resolves, preserving config alignment.
|
|
56
|
+
spawnEnv: { CLAUDE_CONFIG_DIR: dataDir },
|
|
57
|
+
// Seed's model set is gateway-defined (ByteCloud / SuperRelay), not the
|
|
58
|
+
// Anthropic aliases — skip the setup model prompt; users pick via /model.
|
|
59
|
+
modelChoices: undefined,
|
|
60
|
+
}, bin);
|
|
61
|
+
}
|
|
62
|
+
export const create = createSeedAdapter;
|
|
63
|
+
//# sourceMappingURL=seed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../src/adapters/cli/seed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAG/C;;;;;;;;;mFASmF;AAEnF;;;;;;;;;;;;;gEAagE;AAChE,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAU,oBAAoB;QAC7D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAG,QAAQ;QAClD,OAAO,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,yDAAyD,GAAG,MAAM,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;QAChK,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,YAAqB;IACrD,MAAM,GAAG,GAAG,cAAc,CAAC,YAAY,IAAI,MAAM,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,yBAAyB,CAAC;QAC/B,EAAE,EAAE,MAAM;QACV,SAAS,EAAE,MAAM;QACjB,OAAO;QACP,6EAA6E;QAC7E,wDAAwD;QACxD,aAAa,EAAE,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC;QAC5C,4EAA4E;QAC5E,4EAA4E;QAC5E,6DAA6D;QAC7D,QAAQ,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE;QACxC,wEAAwE;QACxE,0EAA0E;QAC1E,YAAY,EAAE,SAAS;KACxB,EAAE,GAAG,CAAC,CAAC;AACV,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,iBAAiB,CAAC"}
|
|
@@ -151,6 +151,22 @@ export interface CliAdapter {
|
|
|
151
151
|
* presented as-is; the setup prompt always appends an "Other / custom"
|
|
152
152
|
* free-text option, so this list is curation, not a hard whitelist. */
|
|
153
153
|
readonly modelChoices?: readonly string[];
|
|
154
|
+
/** Claude-family CLIs only (claude-code, seed). The data root holding
|
|
155
|
+
* `projects/<hash>/<id>.jsonl`, `sessions/<pid>.json`, `tasks/`,
|
|
156
|
+
* `keybindings.json` and `settings.json`. When set, the worker drives the
|
|
157
|
+
* JSONL submit-confirmation, bridge fallback and pid resolution against this
|
|
158
|
+
* dir (instead of hardcoding `~/.claude`). undefined → not Claude-family. */
|
|
159
|
+
readonly claudeDataDir?: string;
|
|
160
|
+
/** Claude-family CLIs only. Path to the `.claude.json` folder-trust / state
|
|
161
|
+
* file (pre-accepted at spawn so a fresh workingDir doesn't block on the
|
|
162
|
+
* interactive trust dialog). `~/.claude.json` for Claude Code; inside the
|
|
163
|
+
* data root for forks that set CLAUDE_CONFIG_DIR. */
|
|
164
|
+
readonly claudeStateJsonPath?: string;
|
|
165
|
+
/** Extra env merged into the spawned child's environment. Used by Claude-family
|
|
166
|
+
* forks to point the CLI at its data root (e.g. Seed's `CLAUDE_CONFIG_DIR`).
|
|
167
|
+
* Keys placed here are also forwarded through the tmux backend (see
|
|
168
|
+
* BOTMUX_INJECTED_ENV_KEYS). undefined → inherit the worker env unchanged. */
|
|
169
|
+
readonly spawnEnv?: Readonly<Record<string, string>>;
|
|
154
170
|
}
|
|
155
|
-
export type CliId = 'claude-code' | 'aiden' | 'coco' | 'codex' | 'codex-app' | 'cursor' | 'gemini' | 'opencode' | 'antigravity' | 'mtr' | 'hermes' | 'mira';
|
|
171
|
+
export type CliId = 'claude-code' | 'seed' | 'aiden' | 'coco' | 'codex' | 'codex-app' | 'cursor' | 'gemini' | 'opencode' | 'antigravity' | 'mtr' | 'hermes' | 'mira';
|
|
156
172
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/types.ts"],"names":[],"mappings":"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"}
|
package/dist/bot-registry.d.ts
CHANGED
|
@@ -44,7 +44,7 @@ export interface BotConfig {
|
|
|
44
44
|
* such as --yolo or --dangerously-*. Missing/false preserves legacy behavior.
|
|
45
45
|
*/
|
|
46
46
|
disableCliBypass?: boolean;
|
|
47
|
-
backendType?: 'pty' | 'tmux';
|
|
47
|
+
backendType?: 'pty' | 'tmux' | 'zellij';
|
|
48
48
|
workingDir?: string;
|
|
49
49
|
workingDirs?: string[];
|
|
50
50
|
allowedUsers?: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot-registry.d.ts","sourceRoot":"","sources":["../src/bot-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,yBAAyB,CAAC;AAIhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,EAA0B,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEtE,MAAM,WAAW,UAAU;IACzB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,6HAA6H;IAC7H,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"bot-registry.d.ts","sourceRoot":"","sources":["../src/bot-registry.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AA64HA;;;;;;;;;;;GAWG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,qBAAqB,EAAE,SAAS,CAAC,EAC9F,KAAK,EAAE,MAAM,EACb,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,2BAA2B,EAAE,UAAU,GAAG,IAAI,CAAC,GACzF,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA+F7B"}
|
package/dist/cli.js
CHANGED
|
@@ -26,7 +26,7 @@ import { createInterface } from 'node:readline';
|
|
|
26
26
|
import { createRequire } from 'node:module';
|
|
27
27
|
import { createHmac, randomBytes } from 'node:crypto';
|
|
28
28
|
import { validateWorkingDir } from './core/working-dir.js';
|
|
29
|
-
import { parseDispatchBotSpec, buildDispatchMessages, buildRepoPrimeText, buildReportContent, eligibleAutoMentionAliases, offTopicSubBotTopic } from './core/dispatch.js';
|
|
29
|
+
import { parseDispatchBotSpec, buildDispatchMessages, buildRepoPrimeText, buildReportContent, eligibleAutoMentionAliases, offTopicSubBotTopic, resolveReportTarget } from './core/dispatch.js';
|
|
30
30
|
import { enableAutostart, disableAutostart, autostartStatus, refreshAutostart } from './autostart.js';
|
|
31
31
|
import { tmuxEnv } from './setup/ensure-tmux.js';
|
|
32
32
|
import { writeBotsJsonAtomic as writeBotsAtomic } from './setup/bots-store.js';
|
|
@@ -232,6 +232,12 @@ function ecosystemConfig() {
|
|
|
232
232
|
// ad-hoc (e.g. `BOTMUX_MEMORY_DIAG_INTERVAL_MS=5000`) when chasing an
|
|
233
233
|
// RSS regression — turned off in master so logs stay quiet.
|
|
234
234
|
BOTMUX_MEMORY_DIAG_INTERVAL_MS: process.env.BOTMUX_MEMORY_DIAG_INTERVAL_MS ?? '0',
|
|
235
|
+
// Quiet restart (dev): when set, restore registers sessions but skips the
|
|
236
|
+
// tmux eager re-fork so restarts don't re-push unfinished-session cards.
|
|
237
|
+
// Pass the shell value through explicitly (default '0') so it overrides
|
|
238
|
+
// any stale value carried by the long-lived pm2 god daemon — letting an
|
|
239
|
+
// unset shell var truly turn quiet-restart back off.
|
|
240
|
+
BOTMUX_QUIET_RESTART: process.env.BOTMUX_QUIET_RESTART ?? '0',
|
|
235
241
|
},
|
|
236
242
|
}));
|
|
237
243
|
apps.push({
|
|
@@ -615,7 +621,7 @@ async function promptBotConfig(rl) {
|
|
|
615
621
|
return null;
|
|
616
622
|
}
|
|
617
623
|
console.log('✅ 凭证有效(tenant_access_token 已成功获取)\n');
|
|
618
|
-
console.log('支持的 CLI: 1) claude-code 2) aiden 3) coco 4) codex 5) cursor 6) gemini 7) opencode 8) antigravity 9) mtr 10) hermes 11) codex-app 12) mira');
|
|
624
|
+
console.log('支持的 CLI: 1) claude-code 2) aiden 3) coco 4) codex 5) cursor 6) gemini 7) opencode 8) antigravity 9) mtr 10) hermes 11) codex-app 12) mira 13) seed');
|
|
619
625
|
const cliChoice = await ask(rl, 'CLI 适配器 [1]: ');
|
|
620
626
|
let cliId;
|
|
621
627
|
try {
|
|
@@ -705,7 +711,7 @@ async function promptEditBotConfig(rl, bot) {
|
|
|
705
711
|
'留空保留当前值。',
|
|
706
712
|
]);
|
|
707
713
|
input.larkAppSecret = await ask(rl, `LARK_APP_SECRET [保留当前值]: `);
|
|
708
|
-
console.log('\n支持的 CLI: 1) claude-code 2) aiden 3) coco 4) codex 5) cursor 6) gemini 7) opencode 8) antigravity 9) mtr 10) hermes 11) codex-app 12) mira');
|
|
714
|
+
console.log('\n支持的 CLI: 1) claude-code 2) aiden 3) coco 4) codex 5) cursor 6) gemini 7) opencode 8) antigravity 9) mtr 10) hermes 11) codex-app 12) mira 13) seed');
|
|
709
715
|
printInputHelp('CLI 适配器', [
|
|
710
716
|
'选择 botmux 需要套用哪一种 CLI 参数协议和会话恢复方式。',
|
|
711
717
|
'留空保留当前值;可以输入序号,也可以直接输入适配器 ID。',
|
|
@@ -741,8 +747,8 @@ async function promptEditBotConfig(rl, bot) {
|
|
|
741
747
|
input.model = cliChanged && result === undefined ? null : result;
|
|
742
748
|
}
|
|
743
749
|
printInputHelp('会话后端 backendType', [
|
|
744
|
-
'可选。pty 更轻量;tmux 支持 adopt 和 Web Terminal
|
|
745
|
-
'留空保留当前值;输入 -
|
|
750
|
+
'可选。pty 更轻量;tmux 支持 adopt 和 Web Terminal 附着;zellij 为实验后端(pty-under-zellij,需 zellij >= 0.44)。',
|
|
751
|
+
'留空保留当前值;输入 - 回到自动检测;接受 pty / tmux / zellij。',
|
|
746
752
|
]);
|
|
747
753
|
input.backendType = await ask(rl, `会话后端 backendType [${formatOptionalValue(bot.backendType)}]: `);
|
|
748
754
|
printInputHelp('默认工作目录', [
|
|
@@ -1504,6 +1510,9 @@ function loadSessions() {
|
|
|
1504
1510
|
return sessions;
|
|
1505
1511
|
}
|
|
1506
1512
|
/** Save a single session back to its appropriate file based on larkAppId. */
|
|
1513
|
+
function loadSessionFresh(session) {
|
|
1514
|
+
return loadSessions().get(session.sessionId);
|
|
1515
|
+
}
|
|
1507
1516
|
function saveSession(session) {
|
|
1508
1517
|
const dataDir = resolveDataDir();
|
|
1509
1518
|
const fileName = session.larkAppId ? `sessions-${session.larkAppId}.json` : 'sessions.json';
|
|
@@ -1516,7 +1525,7 @@ function saveSession(session) {
|
|
|
1516
1525
|
}
|
|
1517
1526
|
catch { /* start fresh */ }
|
|
1518
1527
|
}
|
|
1519
|
-
data[session.sessionId] = session;
|
|
1528
|
+
data[session.sessionId] = mergePendingResponseState(session, data[session.sessionId]);
|
|
1520
1529
|
// Clean up entries where file key doesn't match the entry's sessionId (data corruption)
|
|
1521
1530
|
for (const [key, val] of Object.entries(data)) {
|
|
1522
1531
|
if (val && typeof val === 'object' && 'sessionId' in val && val.sessionId !== key) {
|
|
@@ -2632,6 +2641,7 @@ function argValues(args, ...flags) {
|
|
|
2632
2641
|
// daemon's bridge fallback path can produce identical cards. cmdSend
|
|
2633
2642
|
// keeps using `buildCardBodyElements` and `hasMarkdown` from there.
|
|
2634
2643
|
import { buildCardBodyElements, hasMarkdown, brandFooterSegment } from './im/lark/md-card.js';
|
|
2644
|
+
import { claimPendingResponseCard, isPendingResponseCardOpen, markPendingResponseCardPatchedIfCurrent, mergePendingResponseState, shouldUseCardForSend } from './core/pending-response.js';
|
|
2635
2645
|
import { resolveBrandLabel } from './bot-registry.js';
|
|
2636
2646
|
import { config } from './config.js';
|
|
2637
2647
|
import { resolveQuoteTarget, validateMentionDecision } from './services/send-policy.js';
|
|
@@ -2757,7 +2767,7 @@ async function cmdSend(rest) {
|
|
|
2757
2767
|
registerBot(cfg);
|
|
2758
2768
|
}
|
|
2759
2769
|
catch { /* */ }
|
|
2760
|
-
const { sendMessage, replyMessage, uploadImage, uploadFile, MessageWithdrawnError } = await import('./im/lark/client.js');
|
|
2770
|
+
const { sendMessage, replyMessage, uploadImage, uploadFile, deleteMessage, MessageWithdrawnError } = await import('./im/lark/client.js');
|
|
2761
2771
|
const appId = s.larkAppId;
|
|
2762
2772
|
// Effective target chat for top-level mode (defaults to session's chat)
|
|
2763
2773
|
const targetChatId = overrideChatId ?? s.chatId;
|
|
@@ -2818,6 +2828,28 @@ async function cmdSend(rest) {
|
|
|
2818
2828
|
const dispatch = (content, msgType) => (sendTopLevel || isChatScope)
|
|
2819
2829
|
? sendMessage(appId, targetChatId, content, msgType)
|
|
2820
2830
|
: replyMessage(appId, s.rootMessageId, content, msgType, true);
|
|
2831
|
+
const recordBridgeSendMarker = (sentAtMs, messageId) => {
|
|
2832
|
+
try {
|
|
2833
|
+
const markerDir = join(resolveDataDir(), 'turn-sends');
|
|
2834
|
+
if (!existsSync(markerDir))
|
|
2835
|
+
mkdirSync(markerDir, { recursive: true });
|
|
2836
|
+
const line = JSON.stringify({ sentAtMs, messageId }) + '\n';
|
|
2837
|
+
appendFileSync(join(markerDir, `${sid}.jsonl`), line);
|
|
2838
|
+
}
|
|
2839
|
+
catch { /* best-effort: marker miss only causes a redundant fallback message */ }
|
|
2840
|
+
};
|
|
2841
|
+
const shouldRecordBridgeMarker = !sendTopLevel && !overrideChatId;
|
|
2842
|
+
const dispatchOrPatchPending = async (content, msgType) => {
|
|
2843
|
+
const pendingCardId = msgType === 'interactive' ? claimPendingResponseCard(s) : undefined;
|
|
2844
|
+
const sentId = await dispatchPrimary(content, msgType);
|
|
2845
|
+
const latest = pendingCardId ? loadSessionFresh(s) : undefined;
|
|
2846
|
+
if (pendingCardId && latest?.pendingResponseCardId === pendingCardId) {
|
|
2847
|
+
deleteMessage(appId, pendingCardId)
|
|
2848
|
+
.then(() => { markPendingResponseCardPatchedIfCurrent(latest, pendingCardId); saveSession(latest); })
|
|
2849
|
+
.catch((err) => logger.warn(`[send:${sid.substring(0, 8)}] failed to withdraw pending card after explicit send: ${err?.message ?? err}`));
|
|
2850
|
+
}
|
|
2851
|
+
return sentId;
|
|
2852
|
+
};
|
|
2821
2853
|
// Quote chain (普通群): the primary message replies to the turn's target so
|
|
2822
2854
|
// Lark renders a 引用 chain. --quote overrides, --no-quote opts out. Thread
|
|
2823
2855
|
// scope and --top-level never quote. Withdrawn target → fall back to plain.
|
|
@@ -2978,8 +3010,14 @@ async function cmdSend(rest) {
|
|
|
2978
3010
|
knownBotOpenIds,
|
|
2979
3011
|
});
|
|
2980
3012
|
// Decide: interactive card (renders markdown) vs. post (plain text).
|
|
2981
|
-
//
|
|
2982
|
-
|
|
3013
|
+
// An open pending response card takes precedence over --text so the
|
|
3014
|
+
// placeholder can close cleanly; otherwise explicit --card / --text wins.
|
|
3015
|
+
const useCard = shouldUseCardForSend({
|
|
3016
|
+
forceCard,
|
|
3017
|
+
forceText,
|
|
3018
|
+
hasMarkdown: hasMarkdown(text),
|
|
3019
|
+
hasOpenPendingResponseCard: isPendingResponseCardOpen(s),
|
|
3020
|
+
});
|
|
2983
3021
|
const mentionMap = new Map();
|
|
2984
3022
|
for (const m of mentions)
|
|
2985
3023
|
if (m.name)
|
|
@@ -3073,7 +3111,7 @@ async function cmdSend(rest) {
|
|
|
3073
3111
|
config: { update_multi: true },
|
|
3074
3112
|
body: { direction: 'vertical', elements },
|
|
3075
3113
|
});
|
|
3076
|
-
messageId = await
|
|
3114
|
+
messageId = await dispatchOrPatchPending(cardJson, 'interactive');
|
|
3077
3115
|
}
|
|
3078
3116
|
else {
|
|
3079
3117
|
// Plain-text path: build post content, paragraph per line.
|
|
@@ -3123,23 +3161,11 @@ async function cmdSend(rest) {
|
|
|
3123
3161
|
const postJson = JSON.stringify({ zh_cn: { title: '', content: postContent } });
|
|
3124
3162
|
messageId = await dispatchPrimary(postJson, 'post');
|
|
3125
3163
|
}
|
|
3126
|
-
// Bridge fallback marker — append-only jsonl per session.
|
|
3127
|
-
//
|
|
3128
|
-
//
|
|
3129
|
-
|
|
3130
|
-
|
|
3131
|
-
if (!sendTopLevel && !overrideChatId) {
|
|
3132
|
-
try {
|
|
3133
|
-
const markerDir = join(resolveDataDir(), 'turn-sends');
|
|
3134
|
-
if (!existsSync(markerDir))
|
|
3135
|
-
mkdirSync(markerDir, { recursive: true });
|
|
3136
|
-
// sentAtMs was captured pre-dispatch (see above). messageId is the
|
|
3137
|
-
// confirmed Lark message id from the now-successful dispatch.
|
|
3138
|
-
const line = JSON.stringify({ sentAtMs, messageId }) + '\n';
|
|
3139
|
-
appendFileSync(join(markerDir, `${sid}.jsonl`), line);
|
|
3140
|
-
}
|
|
3141
|
-
catch { /* best-effort: marker miss only causes a redundant fallback message */ }
|
|
3142
|
-
}
|
|
3164
|
+
// Bridge fallback marker — append-only jsonl per session. Same-thread
|
|
3165
|
+
// sends always suppress transcript fallback; detoured sends suppress only
|
|
3166
|
+
// when they closed a pending response card for this turn.
|
|
3167
|
+
if (shouldRecordBridgeMarker)
|
|
3168
|
+
recordBridgeSendMarker(sentAtMs, messageId);
|
|
3143
3169
|
// Send file attachments as separate messages
|
|
3144
3170
|
const fileIds = [];
|
|
3145
3171
|
for (const fp of files) {
|
|
@@ -3430,8 +3456,12 @@ async function cmdReport(rest) {
|
|
|
3430
3456
|
console.error(`session ${sid} 缺少 larkAppId`);
|
|
3431
3457
|
process.exit(1);
|
|
3432
3458
|
}
|
|
3433
|
-
// Resolve the
|
|
3434
|
-
// (keyed by this sub-bot's thread root)
|
|
3459
|
+
// Resolve where the report goes + who to @. Same-machine: the dispatch registry
|
|
3460
|
+
// (keyed by this sub-bot's thread root) carries the orchestrator's exact coords.
|
|
3461
|
+
// CROSS-MACHINE: the orchestrator is on another machine, so its registry isn't
|
|
3462
|
+
// on THIS one — resolveReportTarget falls back to this sub-bot's own session
|
|
3463
|
+
// (report top-level into its chat, @ the dispatcher via creatorOpenId). See
|
|
3464
|
+
// resolveReportTarget / Session.creatorOpenId.
|
|
3435
3465
|
const regPath = join(resolveDataDir(), 'orchestrate-dispatch.json');
|
|
3436
3466
|
let reg = {};
|
|
3437
3467
|
try {
|
|
@@ -3440,17 +3470,15 @@ async function cmdReport(rest) {
|
|
|
3440
3470
|
}
|
|
3441
3471
|
catch { /* */ }
|
|
3442
3472
|
const entry = s.rootMessageId ? reg[s.rootMessageId] : undefined;
|
|
3443
|
-
|
|
3444
|
-
|
|
3445
|
-
|
|
3446
|
-
|
|
3447
|
-
|
|
3448
|
-
|
|
3449
|
-
|
|
3450
|
-
|
|
3451
|
-
|
|
3452
|
-
if (!entry || !orchOpenId) {
|
|
3453
|
-
console.error('当前会话不是被 botmux dispatch 派活的子项目会话(缺少主编排坐标)。\n' +
|
|
3473
|
+
const tgt = resolveReportTarget({
|
|
3474
|
+
registryEntry: entry,
|
|
3475
|
+
sessionChatId: s.chatId,
|
|
3476
|
+
creatorOpenId: s.creatorOpenId,
|
|
3477
|
+
ownerOpenId: s.ownerOpenId,
|
|
3478
|
+
quoteTargetSenderOpenId: s.quoteTargetSenderOpenId,
|
|
3479
|
+
});
|
|
3480
|
+
if (!tgt.orchOpenId || !tgt.orchChatId) {
|
|
3481
|
+
console.error('找不到主编排坐标:本会话没记录派活者(creatorOpenId/ownerOpenId 都空)或缺 chatId——大概不是被 botmux dispatch 派活的会话。\n' +
|
|
3454
3482
|
'若确需回报,请改用 `botmux send` 或显式 @ 对应的人/ bot。');
|
|
3455
3483
|
process.exit(1);
|
|
3456
3484
|
}
|
|
@@ -3462,23 +3490,25 @@ async function cmdReport(rest) {
|
|
|
3462
3490
|
catch { /* */ }
|
|
3463
3491
|
const { sendMessage, replyMessage } = await import('./im/lark/client.js');
|
|
3464
3492
|
const appId = s.larkAppId;
|
|
3465
|
-
const paras = buildReportContent({ orchOpenId, content });
|
|
3493
|
+
const paras = buildReportContent({ orchOpenId: tgt.orchOpenId, content });
|
|
3466
3494
|
const postJson = JSON.stringify({ zh_cn: { title: '', content: paras } });
|
|
3467
3495
|
try {
|
|
3468
3496
|
let msgId;
|
|
3469
|
-
if (
|
|
3470
|
-
// Orchestrator
|
|
3471
|
-
|
|
3497
|
+
if (tgt.orchScope === 'chat' || !tgt.orchRoot) {
|
|
3498
|
+
// Orchestrator at chat scope, or cross-machine fallback → post top-level
|
|
3499
|
+
// into the chat (the sub-topic's chat = the orchestrator's chat).
|
|
3500
|
+
msgId = await sendMessage(appId, tgt.orchChatId, postJson, 'post');
|
|
3472
3501
|
}
|
|
3473
3502
|
else {
|
|
3474
|
-
//
|
|
3475
|
-
// session (anchored on orchRoot)
|
|
3476
|
-
msgId = await replyMessage(appId,
|
|
3503
|
+
// Same-machine thread-scope orchestrator → reply into its thread so its
|
|
3504
|
+
// existing context-rich session (anchored on orchRoot) receives the report.
|
|
3505
|
+
msgId = await replyMessage(appId, tgt.orchRoot, postJson, 'post', true);
|
|
3477
3506
|
}
|
|
3478
3507
|
console.log(JSON.stringify({
|
|
3479
3508
|
success: true,
|
|
3480
|
-
reportedTo:
|
|
3481
|
-
orchestrator: orchOpenId,
|
|
3509
|
+
reportedTo: tgt.orchRoot || tgt.orchChatId,
|
|
3510
|
+
orchestrator: tgt.orchOpenId,
|
|
3511
|
+
viaRegistry: !!entry,
|
|
3482
3512
|
messageId: msgId,
|
|
3483
3513
|
}));
|
|
3484
3514
|
}
|