@bd7pil/ocrc 0.9.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/LICENSE +34 -0
- package/README.md +330 -0
- package/dist/cli/host-backends.js +216 -0
- package/dist/cli/host-backends.js.map +1 -0
- package/dist/cli/host.js +185 -0
- package/dist/cli/host.js.map +1 -0
- package/dist/cli/index.js +67 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.js +68 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/install.js +220 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/pair.js +11 -0
- package/dist/cli/pair.js.map +1 -0
- package/dist/cli/uninstall.js +75 -0
- package/dist/cli/uninstall.js.map +1 -0
- package/dist/connectivity/auth/cf-access.js +20 -0
- package/dist/connectivity/auth/cf-access.js.map +1 -0
- package/dist/connectivity/auth/index.js +2 -0
- package/dist/connectivity/auth/index.js.map +1 -0
- package/dist/connectivity/auth/select.js +19 -0
- package/dist/connectivity/auth/select.js.map +1 -0
- package/dist/connectivity/auth/token.js +157 -0
- package/dist/connectivity/auth/token.js.map +1 -0
- package/dist/connectivity/exposure/cloudflared.js +77 -0
- package/dist/connectivity/exposure/cloudflared.js.map +1 -0
- package/dist/connectivity/exposure/index.js +2 -0
- package/dist/connectivity/exposure/index.js.map +1 -0
- package/dist/connectivity/exposure/providers.js +49 -0
- package/dist/connectivity/exposure/providers.js.map +1 -0
- package/dist/connectivity/pairing.js +29 -0
- package/dist/connectivity/pairing.js.map +1 -0
- package/dist/core/agent/acp-backend.js +539 -0
- package/dist/core/agent/acp-backend.js.map +1 -0
- package/dist/core/agent/acp-connect.js +92 -0
- package/dist/core/agent/acp-connect.js.map +1 -0
- package/dist/core/agent/acp-normalizer.js +81 -0
- package/dist/core/agent/acp-normalizer.js.map +1 -0
- package/dist/core/agent/acp-replay.js +89 -0
- package/dist/core/agent/acp-replay.js.map +1 -0
- package/dist/core/agent/acp-store.js +129 -0
- package/dist/core/agent/acp-store.js.map +1 -0
- package/dist/core/agent/backend.js +2 -0
- package/dist/core/agent/backend.js.map +1 -0
- package/dist/core/agent/diff-util.js +70 -0
- package/dist/core/agent/diff-util.js.map +1 -0
- package/dist/core/agent/event.js +12 -0
- package/dist/core/agent/event.js.map +1 -0
- package/dist/core/agent/opencode-backend.js +598 -0
- package/dist/core/agent/opencode-backend.js.map +1 -0
- package/dist/core/agent/opencode-normalizer.js +69 -0
- package/dist/core/agent/opencode-normalizer.js.map +1 -0
- package/dist/core/agent/registry.js +55 -0
- package/dist/core/agent/registry.js.map +1 -0
- package/dist/core/agent/v2-backend.js +176 -0
- package/dist/core/agent/v2-backend.js.map +1 -0
- package/dist/core/card-bus.js +74 -0
- package/dist/core/card-bus.js.map +1 -0
- package/dist/core/channels.js +95 -0
- package/dist/core/channels.js.map +1 -0
- package/dist/core/history.js +91 -0
- package/dist/core/history.js.map +1 -0
- package/dist/core/list-files.js +50 -0
- package/dist/core/list-files.js.map +1 -0
- package/dist/core/opencode-events.js +29 -0
- package/dist/core/opencode-events.js.map +1 -0
- package/dist/core/primary-election.js +91 -0
- package/dist/core/primary-election.js.map +1 -0
- package/dist/core/push.js +152 -0
- package/dist/core/push.js.map +1 -0
- package/dist/core/relay.js +400 -0
- package/dist/core/relay.js.map +1 -0
- package/dist/core/scheduler.js +150 -0
- package/dist/core/scheduler.js.map +1 -0
- package/dist/core/state.js +222 -0
- package/dist/core/state.js.map +1 -0
- package/dist/core/stream-accumulator.js +76 -0
- package/dist/core/stream-accumulator.js.map +1 -0
- package/dist/core/structured-card.js +2 -0
- package/dist/core/structured-card.js.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/opencode/global-events.js +57 -0
- package/dist/opencode/global-events.js.map +1 -0
- package/dist/opencode/list-sessions.js +122 -0
- package/dist/opencode/list-sessions.js.map +1 -0
- package/dist/opencode/submit.js +39 -0
- package/dist/opencode/submit.js.map +1 -0
- package/dist/opencode/workspaces.js +51 -0
- package/dist/opencode/workspaces.js.map +1 -0
- package/dist/plugin/config.js +128 -0
- package/dist/plugin/config.js.map +1 -0
- package/dist/plugin/control-plane.js +133 -0
- package/dist/plugin/control-plane.js.map +1 -0
- package/dist/plugin/entry.js +409 -0
- package/dist/plugin/entry.js.map +1 -0
- package/dist/plugin/v2/event-map.js +193 -0
- package/dist/plugin/v2/event-map.js.map +1 -0
- package/dist/plugin/v2/types.js +15 -0
- package/dist/plugin/v2/types.js.map +1 -0
- package/dist/transport/interface.js +2 -0
- package/dist/transport/interface.js.map +1 -0
- package/dist/transport/telegram/esc.js +9 -0
- package/dist/transport/telegram/esc.js.map +1 -0
- package/dist/transport/telegram/handlers/info-commands.js +101 -0
- package/dist/transport/telegram/handlers/info-commands.js.map +1 -0
- package/dist/transport/telegram/handlers.js +1348 -0
- package/dist/transport/telegram/handlers.js.map +1 -0
- package/dist/transport/telegram/i18n/en.js +538 -0
- package/dist/transport/telegram/i18n/en.js.map +1 -0
- package/dist/transport/telegram/i18n/index.js +83 -0
- package/dist/transport/telegram/i18n/index.js.map +1 -0
- package/dist/transport/telegram/i18n/zh.js +538 -0
- package/dist/transport/telegram/i18n/zh.js.map +1 -0
- package/dist/transport/telegram/index.js +792 -0
- package/dist/transport/telegram/index.js.map +1 -0
- package/dist/transport/telegram/main-keyboard.js +36 -0
- package/dist/transport/telegram/main-keyboard.js.map +1 -0
- package/dist/transport/telegram/managers/abort-suppression-manager.js +33 -0
- package/dist/transport/telegram/managers/abort-suppression-manager.js.map +1 -0
- package/dist/transport/telegram/managers/external-input-suppression-manager.js +51 -0
- package/dist/transport/telegram/managers/external-input-suppression-manager.js.map +1 -0
- package/dist/transport/telegram/managers/interaction-manager.js +254 -0
- package/dist/transport/telegram/managers/interaction-manager.js.map +1 -0
- package/dist/transport/telegram/managers/permission-manager.js +242 -0
- package/dist/transport/telegram/managers/permission-manager.js.map +1 -0
- package/dist/transport/telegram/managers/question-manager.js +191 -0
- package/dist/transport/telegram/managers/question-manager.js.map +1 -0
- package/dist/transport/telegram/managers/rename-manager.js +56 -0
- package/dist/transport/telegram/managers/rename-manager.js.map +1 -0
- package/dist/transport/telegram/menus.js +77 -0
- package/dist/transport/telegram/menus.js.map +1 -0
- package/dist/transport/telegram/permission-flow.js +156 -0
- package/dist/transport/telegram/permission-flow.js.map +1 -0
- package/dist/transport/telegram/question-flow.js +224 -0
- package/dist/transport/telegram/question-flow.js.map +1 -0
- package/dist/transport/telegram/render/block-parser.js +365 -0
- package/dist/transport/telegram/render/block-parser.js.map +1 -0
- package/dist/transport/telegram/render/block-plain-text.js +87 -0
- package/dist/transport/telegram/render/block-plain-text.js.map +1 -0
- package/dist/transport/telegram/render/block-splitter.js +152 -0
- package/dist/transport/telegram/render/block-splitter.js.map +1 -0
- package/dist/transport/telegram/render/chunker.js +71 -0
- package/dist/transport/telegram/render/chunker.js.map +1 -0
- package/dist/transport/telegram/render/limits.js +13 -0
- package/dist/transport/telegram/render/limits.js.map +1 -0
- package/dist/transport/telegram/render/markdown-normalizer.js +102 -0
- package/dist/transport/telegram/render/markdown-normalizer.js.map +1 -0
- package/dist/transport/telegram/render/markdown-to-telegram-v2.js +116 -0
- package/dist/transport/telegram/render/markdown-to-telegram-v2.js.map +1 -0
- package/dist/transport/telegram/render/part-signature.js +14 -0
- package/dist/transport/telegram/render/part-signature.js.map +1 -0
- package/dist/transport/telegram/render/pipeline.js +23 -0
- package/dist/transport/telegram/render/pipeline.js.map +1 -0
- package/dist/transport/telegram/render/rich-blocks.js +311 -0
- package/dist/transport/telegram/render/rich-blocks.js.map +1 -0
- package/dist/transport/telegram/render/text-splitter.js +64 -0
- package/dist/transport/telegram/render/text-splitter.js.map +1 -0
- package/dist/transport/telegram/render/types.js +2 -0
- package/dist/transport/telegram/render/types.js.map +1 -0
- package/dist/transport/telegram/renderer.js +305 -0
- package/dist/transport/telegram/renderer.js.map +1 -0
- package/dist/transport/telegram/streaming/duration-formatter.js +68 -0
- package/dist/transport/telegram/streaming/duration-formatter.js.map +1 -0
- package/dist/transport/telegram/streaming/finalize-assistant-response.js +37 -0
- package/dist/transport/telegram/streaming/finalize-assistant-response.js.map +1 -0
- package/dist/transport/telegram/streaming/response-streamer.js +400 -0
- package/dist/transport/telegram/streaming/response-streamer.js.map +1 -0
- package/dist/transport/telegram/streaming/running-tool-tracker.js +150 -0
- package/dist/transport/telegram/streaming/running-tool-tracker.js.map +1 -0
- package/dist/transport/telegram/streaming/stream-throttle.js +57 -0
- package/dist/transport/telegram/streaming/stream-throttle.js.map +1 -0
- package/dist/transport/telegram/streaming/tool-call-streamer.js +390 -0
- package/dist/transport/telegram/streaming/tool-call-streamer.js.map +1 -0
- package/dist/transport/telegram/streaming-render.js +182 -0
- package/dist/transport/telegram/streaming-render.js.map +1 -0
- package/dist/transport/telegram/types/interaction.js +2 -0
- package/dist/transport/telegram/types/interaction.js.map +1 -0
- package/dist/transport/telegram/types/model.js +25 -0
- package/dist/transport/telegram/types/model.js.map +1 -0
- package/dist/transport/telegram/types/permission.js +2 -0
- package/dist/transport/telegram/types/permission.js.map +1 -0
- package/dist/transport/telegram/types/question.js +2 -0
- package/dist/transport/telegram/types/question.js.map +1 -0
- package/dist/transport/telegram/types/rename.js +2 -0
- package/dist/transport/telegram/types/rename.js.map +1 -0
- package/dist/transport/telegram/types/scheduled-task.js +23 -0
- package/dist/transport/telegram/types/scheduled-task.js.map +1 -0
- package/dist/transport/telegram/types/session.js +2 -0
- package/dist/transport/telegram/types/session.js.map +1 -0
- package/dist/transport/telegram/ui.js +28 -0
- package/dist/transport/telegram/ui.js.map +1 -0
- package/dist/transport/web/index.js +148 -0
- package/dist/transport/web/index.js.map +1 -0
- package/dist/transport/web/middleware/cf-access.js +104 -0
- package/dist/transport/web/middleware/cf-access.js.map +1 -0
- package/dist/transport/web/opencode-config.js +15 -0
- package/dist/transport/web/opencode-config.js.map +1 -0
- package/dist/transport/web/routes/abort.js +12 -0
- package/dist/transport/web/routes/abort.js.map +1 -0
- package/dist/transport/web/routes/approval.js +16 -0
- package/dist/transport/web/routes/approval.js.map +1 -0
- package/dist/transport/web/routes/catalog.js +11 -0
- package/dist/transport/web/routes/catalog.js.map +1 -0
- package/dist/transport/web/routes/channels.js +53 -0
- package/dist/transport/web/routes/channels.js.map +1 -0
- package/dist/transport/web/routes/commands.js +15 -0
- package/dist/transport/web/routes/commands.js.map +1 -0
- package/dist/transport/web/routes/context.js +17 -0
- package/dist/transport/web/routes/context.js.map +1 -0
- package/dist/transport/web/routes/controls.js +34 -0
- package/dist/transport/web/routes/controls.js.map +1 -0
- package/dist/transport/web/routes/create-session.js +21 -0
- package/dist/transport/web/routes/create-session.js.map +1 -0
- package/dist/transport/web/routes/diff.js +7 -0
- package/dist/transport/web/routes/diff.js.map +1 -0
- package/dist/transport/web/routes/files.js +22 -0
- package/dist/transport/web/routes/files.js.map +1 -0
- package/dist/transport/web/routes/logs.js +9 -0
- package/dist/transport/web/routes/logs.js.map +1 -0
- package/dist/transport/web/routes/m8.js +69 -0
- package/dist/transport/web/routes/m8.js.map +1 -0
- package/dist/transport/web/routes/mcp.js +7 -0
- package/dist/transport/web/routes/mcp.js.map +1 -0
- package/dist/transport/web/routes/message.js +32 -0
- package/dist/transport/web/routes/message.js.map +1 -0
- package/dist/transport/web/routes/overrides.js +20 -0
- package/dist/transport/web/routes/overrides.js.map +1 -0
- package/dist/transport/web/routes/question.js +32 -0
- package/dist/transport/web/routes/question.js.map +1 -0
- package/dist/transport/web/routes/rename.js +12 -0
- package/dist/transport/web/routes/rename.js.map +1 -0
- package/dist/transport/web/routes/schedules.js +28 -0
- package/dist/transport/web/routes/schedules.js.map +1 -0
- package/dist/transport/web/routes/session.js +20 -0
- package/dist/transport/web/routes/session.js.map +1 -0
- package/dist/transport/web/routes/sessions.js +25 -0
- package/dist/transport/web/routes/sessions.js.map +1 -0
- package/dist/transport/web/routes/subagents.js +11 -0
- package/dist/transport/web/routes/subagents.js.map +1 -0
- package/dist/transport/web/routes/suggestions.js +7 -0
- package/dist/transport/web/routes/suggestions.js.map +1 -0
- package/dist/transport/web/routes/todo.js +7 -0
- package/dist/transport/web/routes/todo.js.map +1 -0
- package/dist/transport/web/routes/version.js +5 -0
- package/dist/transport/web/routes/version.js.map +1 -0
- package/dist/transport/web/routes/workspaces.js +7 -0
- package/dist/transport/web/routes/workspaces.js.map +1 -0
- package/dist/transport/web/server.js +111 -0
- package/dist/transport/web/server.js.map +1 -0
- package/dist/transport/web/session-summary.js +46 -0
- package/dist/transport/web/session-summary.js.map +1 -0
- package/dist/transport/web/ws-hub.js +83 -0
- package/dist/transport/web/ws-hub.js.map +1 -0
- package/dist/utils/logger.js +105 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/markdown.js +129 -0
- package/dist/utils/markdown.js.map +1 -0
- package/dist/utils/paths.js +18 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/version.js +44 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +91 -0
- package/web/dist/_app/env.js +1 -0
- package/web/dist/_app/immutable/assets/0.DxN3RsuG.css +1 -0
- package/web/dist/_app/immutable/assets/2.BNuGfmZP.css +1 -0
- package/web/dist/_app/immutable/assets/3.CTDprntu.css +1 -0
- package/web/dist/_app/immutable/chunks/BUpwHpMJ.js +1 -0
- package/web/dist/_app/immutable/chunks/BjY4dxcB.js +2 -0
- package/web/dist/_app/immutable/chunks/C2FuqD3s.js +1 -0
- package/web/dist/_app/immutable/chunks/CUHGq08X.js +2 -0
- package/web/dist/_app/immutable/chunks/CWj6FrbW.js +1 -0
- package/web/dist/_app/immutable/chunks/ClvoqtGj.js +1 -0
- package/web/dist/_app/immutable/chunks/DIEDQ_hk.js +1 -0
- package/web/dist/_app/immutable/entry/app.BoRpcVMj.js +2 -0
- package/web/dist/_app/immutable/entry/start.Cj-PQNTq.js +1 -0
- package/web/dist/_app/immutable/nodes/0.y9YEms5p.js +3 -0
- package/web/dist/_app/immutable/nodes/1.CPhhiRM2.js +1 -0
- package/web/dist/_app/immutable/nodes/2.B_c84Mc9.js +1 -0
- package/web/dist/_app/immutable/nodes/3.ClTd0J3D.js +64 -0
- package/web/dist/_app/version.json +1 -0
- package/web/dist/apple-touch-icon.png +0 -0
- package/web/dist/favicon.png +0 -0
- package/web/dist/favicon.svg +17 -0
- package/web/dist/icon-192.png +0 -0
- package/web/dist/icon-512-maskable.png +0 -0
- package/web/dist/icon-512.png +0 -0
- package/web/dist/index.html +73 -0
- package/web/dist/manifest.webmanifest +28 -0
- package/web/dist/service-worker.js +1 -0
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
import { createAcpNormalizer } from './acp-normalizer.js';
|
|
2
|
+
import { buildDiffEntry } from './diff-util.js';
|
|
3
|
+
import { buildReplayCards } from './acp-replay.js';
|
|
4
|
+
import { createLogger } from '../../utils/logger.js';
|
|
5
|
+
const log = createLogger('acp-backend');
|
|
6
|
+
export function createAcpBackend(deps) {
|
|
7
|
+
const { id, cwd, store } = deps;
|
|
8
|
+
const normalizer = createAcpNormalizer();
|
|
9
|
+
const listeners = new Set();
|
|
10
|
+
/** Sessions established in THIS process (so we know when to resume from the store). */
|
|
11
|
+
const sessions = new Set();
|
|
12
|
+
/** cwd of kimi-owned sessions OCRC didn't create — discovered via session/list
|
|
13
|
+
* (e.g. sessions you started in the kimi TUI). Lets us resume/open them. */
|
|
14
|
+
const nativeDirs = new Map();
|
|
15
|
+
/** Session ids the user deleted — kimi has no session/delete, so we filter these
|
|
16
|
+
* out of session/list re-discovery (also persisted in the store). */
|
|
17
|
+
const tombstones = new Set();
|
|
18
|
+
/** Pending permission requests keyed by `${sessionId}:${toolCallId}`. */
|
|
19
|
+
const pendingPerms = new Map();
|
|
20
|
+
/** Latest TODO list per session (ACP `plan`, full-replace) — served via getTodos. */
|
|
21
|
+
const plans = new Map();
|
|
22
|
+
/** Files edited per session, keyed by path (tool_call diff content) — served via getDiff. */
|
|
23
|
+
const edits = new Map();
|
|
24
|
+
/** Sessions being history-loaded: their replayed session/update stream is buffered
|
|
25
|
+
* here (→ buildReplayCards) instead of emitted as live events. */
|
|
26
|
+
const replayBuffers = new Map();
|
|
27
|
+
/** In-flight history loads per session — concurrent getHistory calls SHARE one
|
|
28
|
+
* load instead of racing on replayBuffers (see loadHistory). */
|
|
29
|
+
const historyLoads = new Map();
|
|
30
|
+
/** Switchable mode + model per session (ACP modes + config options). `modelConfigId`
|
|
31
|
+
* is the config option id setModel must target. Served via getControls. */
|
|
32
|
+
const controls = new Map();
|
|
33
|
+
/** Flatten ACP select options (which may be a flat list or grouped) to {value,name}. */
|
|
34
|
+
function flattenSelectOptions(opts) {
|
|
35
|
+
if (!Array.isArray(opts))
|
|
36
|
+
return [];
|
|
37
|
+
const out = [];
|
|
38
|
+
for (const o of opts) {
|
|
39
|
+
if (o && Array.isArray(o.options))
|
|
40
|
+
out.push(...o.options); // a group
|
|
41
|
+
else if (o && o.value != null)
|
|
42
|
+
out.push(o);
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
/** Merge an ACP modes block + config options (from a session response or an update)
|
|
47
|
+
* into the stored SessionControls for a session. */
|
|
48
|
+
function captureControls(sid, src) {
|
|
49
|
+
if (!src)
|
|
50
|
+
return;
|
|
51
|
+
const c = controls.get(sid) ?? {};
|
|
52
|
+
if (src.modes) {
|
|
53
|
+
c.mode = {
|
|
54
|
+
current: src.modes.currentModeId,
|
|
55
|
+
options: (src.modes.availableModes ?? []).map((m) => ({ id: m.id, name: m.name })),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (Array.isArray(src.configOptions)) {
|
|
59
|
+
const model = src.configOptions.find((o) => o.category === 'model')
|
|
60
|
+
?? src.configOptions.find((o) => o.type === 'select');
|
|
61
|
+
if (model?.id) {
|
|
62
|
+
c.modelConfigId = model.id;
|
|
63
|
+
c.model = {
|
|
64
|
+
current: model.currentValue,
|
|
65
|
+
options: flattenSelectOptions(model.options)
|
|
66
|
+
.filter((o) => o.value != null)
|
|
67
|
+
.map((o) => ({ id: o.value, name: o.name ?? o.value })),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
controls.set(sid, c);
|
|
72
|
+
}
|
|
73
|
+
/** Map an OCRC decision → the ACP optionId by the option's `kind`. */
|
|
74
|
+
function optionForDecision(options, decision) {
|
|
75
|
+
if (decision === 'reject') {
|
|
76
|
+
const o = options.find((o) => o.kind === 'reject_once' || o.kind === 'reject_always' || /reject|deny|no/i.test(o.name ?? ''));
|
|
77
|
+
return o?.optionId ?? null;
|
|
78
|
+
}
|
|
79
|
+
const wantKind = decision === 'always' ? 'allow_always' : 'allow_once';
|
|
80
|
+
const o = options.find((o) => o.kind === wantKind)
|
|
81
|
+
?? options.find((o) => o.kind?.startsWith('allow'))
|
|
82
|
+
?? options.find((o) => /allow|approve|yes|once/i.test(o.name ?? ''));
|
|
83
|
+
return o?.optionId ?? null;
|
|
84
|
+
}
|
|
85
|
+
const capabilities = {
|
|
86
|
+
liveMirror: false, // ACP agents have no concurrent local TUI session to mirror
|
|
87
|
+
tuiSelect: false,
|
|
88
|
+
workspaces: true, // OCRC persists per-session directories (see store)
|
|
89
|
+
freeformWorkspace: true, // new sessions take a user-entered directory
|
|
90
|
+
diff: true, // working-dir file list accumulated from tool_call diff content
|
|
91
|
+
todos: true, // TODO list from ACP `plan` updates
|
|
92
|
+
catalog: false, // models come per-session from newSession, not a global catalog
|
|
93
|
+
mcp: true, // the agent's own MCP servers, surfaced via discoverMcp (e.g. kimi mcp.json)
|
|
94
|
+
commands: true, // populated from available_commands_update; run via slash-prompt
|
|
95
|
+
sessionControls: true, // mode (session/set_mode) + model (session/set_config_option)
|
|
96
|
+
imageInput: true, // kimi advertises promptCapabilities.image (verified live)
|
|
97
|
+
};
|
|
98
|
+
// Latest slash-commands the agent advertised (available_commands_update).
|
|
99
|
+
let commands = [];
|
|
100
|
+
/** Per-session timestamp of the last tool_call_update that mapped to 'error'. */
|
|
101
|
+
const lastToolFailedAt = new Map();
|
|
102
|
+
/**
|
|
103
|
+
* Session-takeover recovery. If another agent process (e.g. the kimi CLI
|
|
104
|
+
* resuming the session) steals the session mid-turn, it kills our in-flight
|
|
105
|
+
* tool calls and this connection stops receiving the session's live updates.
|
|
106
|
+
* Signature: the turn settles within STEAL_SETTLE_MS of an externally-failed
|
|
107
|
+
* tool call (a normal failed tool is followed by more model output, so the
|
|
108
|
+
* turn settles much later). Recovery: re-issue session/load — it replays the
|
|
109
|
+
* native history into the store (filling what we missed) AND re-subscribes
|
|
110
|
+
* this connection to live updates (verified live: a fresh session/load
|
|
111
|
+
* receives updates driven by other processes).
|
|
112
|
+
*/
|
|
113
|
+
const STEAL_SETTLE_MS = 2500;
|
|
114
|
+
const RESYNC_DELAY_MS = 3000;
|
|
115
|
+
function resyncIfStolen(sessionId) {
|
|
116
|
+
const failedAt = lastToolFailedAt.get(sessionId) ?? 0;
|
|
117
|
+
if (!failedAt || Date.now() - failedAt > STEAL_SETTLE_MS)
|
|
118
|
+
return;
|
|
119
|
+
log.warn(`turn settled abruptly after an externally-failed tool call — session …${sessionId.slice(-8)} may have been taken over by another agent process; re-subscribing`);
|
|
120
|
+
const t = setTimeout(() => {
|
|
121
|
+
void loadHistory(sessionId)
|
|
122
|
+
.then(() => emit({
|
|
123
|
+
kind: 'notice',
|
|
124
|
+
sessionId,
|
|
125
|
+
title: 'Session continued outside OCRC',
|
|
126
|
+
body: 'This turn was taken over by another agent process (e.g. the kimi CLI resuming the session). Live updates are re-attached — reopen the session to see the full history.',
|
|
127
|
+
}))
|
|
128
|
+
.catch((err) => log.warn(`post-takeover resync failed: ${String(err)}`));
|
|
129
|
+
}, RESYNC_DELAY_MS);
|
|
130
|
+
t.unref?.();
|
|
131
|
+
}
|
|
132
|
+
function emit(e) {
|
|
133
|
+
for (const fn of listeners) {
|
|
134
|
+
try {
|
|
135
|
+
fn(e);
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
log.warn(`onEvent listener threw: ${String(err)}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Our ACP client: connection drives these as the agent streams.
|
|
143
|
+
const client = {
|
|
144
|
+
async sessionUpdate({ sessionId, update }) {
|
|
145
|
+
// History replay (session/load): buffer the replayed stream for getHistory, and
|
|
146
|
+
// do NOT emit it as live events.
|
|
147
|
+
const replay = replayBuffers.get(sessionId);
|
|
148
|
+
if (replay) {
|
|
149
|
+
replay.push(update);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (update.sessionUpdate === 'available_commands_update' && Array.isArray(update.availableCommands)) {
|
|
153
|
+
commands = update.availableCommands.map((c) => ({ name: c.name, description: c.description ?? '' }));
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
// plan: the agent's TODO list (full replace each update). Served via getTodos;
|
|
157
|
+
// not a streaming part, so consume it here and stop.
|
|
158
|
+
if (update.sessionUpdate === 'plan') {
|
|
159
|
+
const entries = Array.isArray(update.entries) ? update.entries : [];
|
|
160
|
+
plans.set(sessionId, entries.map((e) => ({
|
|
161
|
+
content: e.content ?? e.text ?? e.title ?? '',
|
|
162
|
+
status: e.status ?? 'pending',
|
|
163
|
+
})));
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
// Mode/model switches (ACP session controls) → stored for getControls. Not a
|
|
167
|
+
// streaming part, so consume here and stop.
|
|
168
|
+
if (update.sessionUpdate === 'current_mode_update' && update.currentModeId) {
|
|
169
|
+
const c = controls.get(sessionId) ?? {};
|
|
170
|
+
c.mode = { current: update.currentModeId, options: c.mode?.options ?? [] };
|
|
171
|
+
controls.set(sessionId, c);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (update.sessionUpdate === 'config_option_update' && Array.isArray(update.configOptions)) {
|
|
175
|
+
captureControls(sessionId, { configOptions: update.configOptions });
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
// tool_call diff content → accumulate per-file edits (served via getDiff).
|
|
179
|
+
// Still falls through to the normalizer so the tool card streams as usual.
|
|
180
|
+
if (update.sessionUpdate === 'tool_call' || update.sessionUpdate === 'tool_call_update') {
|
|
181
|
+
// kimi-code 0.18 ships the TODO list as a tool_call carrying rawInput.todos
|
|
182
|
+
// (older agents send an ACP `plan` update — handled above). Either → getTodos.
|
|
183
|
+
const todos = update.rawInput?.todos;
|
|
184
|
+
if (Array.isArray(todos)) {
|
|
185
|
+
plans.set(sessionId, todos.map((t) => ({
|
|
186
|
+
content: t.content ?? t.title ?? t.text ?? '',
|
|
187
|
+
status: t.status ?? 'pending',
|
|
188
|
+
})));
|
|
189
|
+
}
|
|
190
|
+
for (const it of Array.isArray(update.content) ? update.content : []) {
|
|
191
|
+
if (it && it.type === 'diff' && it.path) {
|
|
192
|
+
let m = edits.get(sessionId);
|
|
193
|
+
if (!m) {
|
|
194
|
+
m = new Map();
|
|
195
|
+
edits.set(sessionId, m);
|
|
196
|
+
}
|
|
197
|
+
m.set(it.path, { oldText: it.oldText, newText: it.newText });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
const ae = normalizer.normalize(sessionId, update);
|
|
202
|
+
if (ae) {
|
|
203
|
+
// Track externally-failed tool calls: a tool_call_update mapping to
|
|
204
|
+
// 'error' is the signature of another agent process (e.g. the kimi CLI
|
|
205
|
+
// resuming the session) killing our in-flight tool mid-turn.
|
|
206
|
+
if (ae.kind === 'part' && ae.part.type === 'tool' && ae.part.status === 'error') {
|
|
207
|
+
lastToolFailedAt.set(sessionId, Date.now());
|
|
208
|
+
}
|
|
209
|
+
emit(ae);
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
async requestPermission({ sessionId, toolCall, options }) {
|
|
213
|
+
const key = `${sessionId}:${toolCall.toolCallId}`;
|
|
214
|
+
const req = { sessionId, requestId: toolCall.toolCallId, title: toolCall.title, options };
|
|
215
|
+
let chosen = null;
|
|
216
|
+
try {
|
|
217
|
+
if (deps.onPermission) {
|
|
218
|
+
// Whichever resolves first wins: onPermission returning an optionId
|
|
219
|
+
// directly, or the host calling resolvePermission(key) out-of-band.
|
|
220
|
+
chosen = await new Promise((resolve) => {
|
|
221
|
+
pendingPerms.set(key, { resolve, options });
|
|
222
|
+
deps.onPermission(req).then(resolve).catch(() => resolve(null));
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
finally {
|
|
227
|
+
pendingPerms.delete(key);
|
|
228
|
+
}
|
|
229
|
+
if (chosen)
|
|
230
|
+
return { outcome: { outcome: 'selected', optionId: chosen } };
|
|
231
|
+
return { outcome: { outcome: 'cancelled' } };
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
// Lazy single connection. Dropped on connect failure or agent exit so the
|
|
235
|
+
// next call reconnects instead of reusing a rejected promise or dead conn.
|
|
236
|
+
let connP;
|
|
237
|
+
function connection() {
|
|
238
|
+
if (!connP) {
|
|
239
|
+
const p = deps.connect(client);
|
|
240
|
+
connP = p;
|
|
241
|
+
p.then(({ onDisconnect }) => onDisconnect?.(() => { if (connP === p)
|
|
242
|
+
connP = undefined; }), () => { if (connP === p)
|
|
243
|
+
connP = undefined; });
|
|
244
|
+
}
|
|
245
|
+
return connP;
|
|
246
|
+
}
|
|
247
|
+
/** Working dir of a session: OCRC store, else native (TUI) cwd, else host default. */
|
|
248
|
+
function dirOf(sid) { return store?.directoryOf(sid) || nativeDirs.get(sid) || cwd; }
|
|
249
|
+
/** Rebuild a session's history by replaying it via session/load (kimi re-streams its
|
|
250
|
+
* past updates; we buffer them and build cards). For native/unstreamed sessions
|
|
251
|
+
* OCRC has no recorded cards for. Caches the result so later opens are instant.
|
|
252
|
+
* Concurrent loads for the SAME session share one in-flight promise: a second
|
|
253
|
+
* load would overwrite the first's replay buffer and its finally would then
|
|
254
|
+
* delete the buffer mid-replay (half history + replayed updates leaking out as
|
|
255
|
+
* live events). Updates arriving while a load is in flight append to the ONE
|
|
256
|
+
* buffer, so they land in the rebuilt cards instead of being swallowed. */
|
|
257
|
+
async function loadHistory(sid) {
|
|
258
|
+
const inflight = historyLoads.get(sid);
|
|
259
|
+
if (inflight)
|
|
260
|
+
return inflight;
|
|
261
|
+
const p = doLoadHistory(sid);
|
|
262
|
+
historyLoads.set(sid, p);
|
|
263
|
+
const cleanup = () => { if (historyLoads.get(sid) === p)
|
|
264
|
+
historyLoads.delete(sid); };
|
|
265
|
+
p.then(cleanup, cleanup);
|
|
266
|
+
return p;
|
|
267
|
+
}
|
|
268
|
+
async function doLoadHistory(sid) {
|
|
269
|
+
const { conn } = await connection();
|
|
270
|
+
if (!conn.loadSession)
|
|
271
|
+
return [];
|
|
272
|
+
const buffer = [];
|
|
273
|
+
replayBuffers.set(sid, buffer);
|
|
274
|
+
try {
|
|
275
|
+
await conn.loadSession({ sessionId: sid, cwd: dirOf(sid), mcpServers: [] });
|
|
276
|
+
sessions.add(sid);
|
|
277
|
+
}
|
|
278
|
+
catch (err) {
|
|
279
|
+
log.warn(`history loadSession failed: ${String(err)}`);
|
|
280
|
+
}
|
|
281
|
+
finally {
|
|
282
|
+
replayBuffers.delete(sid);
|
|
283
|
+
}
|
|
284
|
+
const now = Date.now();
|
|
285
|
+
const cards = buildReplayCards(sid, buffer, now);
|
|
286
|
+
if (store)
|
|
287
|
+
for (const c of cards)
|
|
288
|
+
store.recordCard(sid, c, now);
|
|
289
|
+
return cards;
|
|
290
|
+
}
|
|
291
|
+
async function ensureSession(sessionId, conn) {
|
|
292
|
+
if (sessions.has(sessionId))
|
|
293
|
+
return;
|
|
294
|
+
// Persisted/native session (host restart, or created in the kimi TUI) → resume
|
|
295
|
+
// it in ITS OWN directory so the agent re-establishes context, then prompt it.
|
|
296
|
+
const sdir = dirOf(sessionId);
|
|
297
|
+
if (conn.resumeSession) {
|
|
298
|
+
try {
|
|
299
|
+
const r = await conn.resumeSession({ sessionId, cwd: sdir, mcpServers: [] });
|
|
300
|
+
captureControls(sessionId, r);
|
|
301
|
+
sessions.add(sessionId);
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
catch (err) {
|
|
305
|
+
log.warn(`resumeSession failed: ${String(err)}`);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
if (conn.loadSession) {
|
|
309
|
+
try {
|
|
310
|
+
const r = await conn.loadSession({ sessionId, cwd: sdir, mcpServers: [] });
|
|
311
|
+
captureControls(sessionId, r);
|
|
312
|
+
sessions.add(sessionId);
|
|
313
|
+
}
|
|
314
|
+
catch { /* not loadable */ }
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
async function prompt(sessionId, input) {
|
|
318
|
+
const { conn } = await connection();
|
|
319
|
+
await ensureSession(sessionId, conn);
|
|
320
|
+
// ACP `prompt` resolves only at stopReason — kick it off in the background
|
|
321
|
+
// and surface completion/error as idle/error events (the relay's contract).
|
|
322
|
+
const blocks = [];
|
|
323
|
+
if (input.text)
|
|
324
|
+
blocks.push({ type: 'text', text: input.text });
|
|
325
|
+
for (const img of input.images ?? [])
|
|
326
|
+
blocks.push({ type: 'image', data: img.data, mimeType: img.mimeType });
|
|
327
|
+
conn.prompt({ sessionId, prompt: blocks.length ? blocks : [{ type: 'text', text: input.text }] })
|
|
328
|
+
.then(() => { emit({ kind: 'idle', sessionId }); normalizer.reset(sessionId); resyncIfStolen(sessionId); })
|
|
329
|
+
.catch((err) => {
|
|
330
|
+
emit({ kind: 'error', sessionId, message: err?.message ?? String(err) });
|
|
331
|
+
normalizer.reset(sessionId);
|
|
332
|
+
resyncIfStolen(sessionId);
|
|
333
|
+
});
|
|
334
|
+
// Resolve immediately: the turn was accepted, the response streams via events.
|
|
335
|
+
}
|
|
336
|
+
async function abort(sessionId) {
|
|
337
|
+
try {
|
|
338
|
+
const { conn } = await connection();
|
|
339
|
+
await conn.cancel({ sessionId });
|
|
340
|
+
}
|
|
341
|
+
catch (err) {
|
|
342
|
+
log.warn(`abort failed: ${String(err)}`);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
async function createSession(opts) {
|
|
346
|
+
const dir = opts.directory || cwd;
|
|
347
|
+
const { conn } = await connection();
|
|
348
|
+
const res = await conn.newSession({ cwd: dir, mcpServers: [] });
|
|
349
|
+
captureControls(res.sessionId, res);
|
|
350
|
+
sessions.add(res.sessionId);
|
|
351
|
+
store?.create(res.sessionId, opts.title ?? '', dir);
|
|
352
|
+
return { id: res.sessionId };
|
|
353
|
+
}
|
|
354
|
+
/** Session ids known across restarts: the persistent store ∪ this process. */
|
|
355
|
+
function knownIds() {
|
|
356
|
+
const ids = new Set(sessions);
|
|
357
|
+
if (store)
|
|
358
|
+
for (const s of store.list())
|
|
359
|
+
ids.add(s.id);
|
|
360
|
+
return [...ids];
|
|
361
|
+
}
|
|
362
|
+
async function listSessions() {
|
|
363
|
+
return knownIds().map((id) => ({ id }));
|
|
364
|
+
}
|
|
365
|
+
/** Enumerate kimi's OWN sessions (incl. TUI-created) via session/list, which is
|
|
366
|
+
* per-cwd — so query every directory OCRC knows about, plus the host default. */
|
|
367
|
+
async function listNativeSummaries() {
|
|
368
|
+
let conn;
|
|
369
|
+
try {
|
|
370
|
+
conn = (await connection()).conn;
|
|
371
|
+
}
|
|
372
|
+
catch {
|
|
373
|
+
return [];
|
|
374
|
+
}
|
|
375
|
+
if (!conn.listSessions)
|
|
376
|
+
return [];
|
|
377
|
+
const dirs = new Set([cwd]);
|
|
378
|
+
for (const d of store?.listDirectories() ?? [])
|
|
379
|
+
dirs.add(d.directory);
|
|
380
|
+
for (const sid of sessions) {
|
|
381
|
+
const d = store?.directoryOf(sid);
|
|
382
|
+
if (d)
|
|
383
|
+
dirs.add(d);
|
|
384
|
+
}
|
|
385
|
+
for (const d of deps.discoverDirs?.() ?? [])
|
|
386
|
+
dirs.add(d); // agent-native dirs (e.g. kimi TUI)
|
|
387
|
+
const out = [];
|
|
388
|
+
for (const dir of dirs) {
|
|
389
|
+
try {
|
|
390
|
+
const res = await conn.listSessions({ cwd: dir });
|
|
391
|
+
for (const s of res?.sessions ?? []) {
|
|
392
|
+
if (tombstones.has(s.sessionId) || store?.isTombstoned(s.sessionId))
|
|
393
|
+
continue; // user-deleted
|
|
394
|
+
const d = s.cwd || dir;
|
|
395
|
+
nativeDirs.set(s.sessionId, d);
|
|
396
|
+
out.push({ id: s.sessionId, title: s.title ?? '', lastActiveAt: s.updatedAt ? Date.parse(s.updatedAt) : 0, unread: false, directory: d });
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
catch { /* this dir isn't listable — skip */ }
|
|
400
|
+
}
|
|
401
|
+
return out;
|
|
402
|
+
}
|
|
403
|
+
async function listSessionSummaries() {
|
|
404
|
+
const storeRows = store
|
|
405
|
+
? store.list().map((s) => ({ id: s.id, title: s.title, lastActiveAt: s.updatedAt, unread: false, directory: s.directory || cwd }))
|
|
406
|
+
: [...sessions].map((id) => ({ id, title: '', lastActiveAt: 0, unread: false, directory: cwd }));
|
|
407
|
+
const native = await listNativeSummaries().catch(() => []);
|
|
408
|
+
// Merge: native (kimi-owned, incl. TUI sessions) first, OCRC store overrides
|
|
409
|
+
// (richer title/dir for sessions OCRC created). Dedup by id.
|
|
410
|
+
const byId = new Map();
|
|
411
|
+
for (const n of native)
|
|
412
|
+
byId.set(n.id, n);
|
|
413
|
+
for (const s of storeRows)
|
|
414
|
+
byId.set(s.id, s);
|
|
415
|
+
return [...byId.values()];
|
|
416
|
+
}
|
|
417
|
+
async function deleteSession(sessionId) {
|
|
418
|
+
const { conn } = await connection();
|
|
419
|
+
if (conn.deleteSession) {
|
|
420
|
+
try {
|
|
421
|
+
await conn.deleteSession({ sessionId });
|
|
422
|
+
}
|
|
423
|
+
catch { /* best-effort */ }
|
|
424
|
+
}
|
|
425
|
+
sessions.delete(sessionId);
|
|
426
|
+
nativeDirs.delete(sessionId);
|
|
427
|
+
plans.delete(sessionId);
|
|
428
|
+
edits.delete(sessionId);
|
|
429
|
+
tombstones.add(sessionId); // kimi has no session/delete → hide from re-discovery
|
|
430
|
+
store?.tombstone(sessionId);
|
|
431
|
+
normalizer.drop(sessionId);
|
|
432
|
+
}
|
|
433
|
+
async function resolvePermission(sessionId, requestId, decision) {
|
|
434
|
+
const key = `${sessionId}:${requestId}`;
|
|
435
|
+
const pending = pendingPerms.get(key);
|
|
436
|
+
if (!pending) {
|
|
437
|
+
log.warn(`resolvePermission: no pending request ${key}`);
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
440
|
+
pending.resolve(optionForDecision(pending.options, decision));
|
|
441
|
+
}
|
|
442
|
+
// ── degraded reads (no ACP equivalent; UI gates via capabilities) ───────────
|
|
443
|
+
const backend = {
|
|
444
|
+
id,
|
|
445
|
+
capabilities,
|
|
446
|
+
prompt,
|
|
447
|
+
abort,
|
|
448
|
+
hasSession: async (sid) => sessions.has(sid) || (store?.has(sid) ?? false) || nativeDirs.has(sid),
|
|
449
|
+
listSessions,
|
|
450
|
+
listSessionSummaries,
|
|
451
|
+
createSession,
|
|
452
|
+
deleteSession,
|
|
453
|
+
renameSession: async (sid, title) => { store?.rename(sid, title); },
|
|
454
|
+
getSessionMeta: async () => ({}),
|
|
455
|
+
getContext: async (sid) => ({ directory: dirOf(sid) }),
|
|
456
|
+
// History is OCRC-persisted (ACP doesn't replay it): return stored cards.
|
|
457
|
+
getHistory: async (sid) => {
|
|
458
|
+
const cached = store?.getCards(sid);
|
|
459
|
+
if (cached && cached.length)
|
|
460
|
+
return cached;
|
|
461
|
+
return loadHistory(sid); // native/unstreamed session → replay via session/load
|
|
462
|
+
},
|
|
463
|
+
getMessageBlocks: async () => [],
|
|
464
|
+
// Working-dir diff = the files the agent edited this session (from tool_call
|
|
465
|
+
// diff content), each rendered to a normalized DiffEntry (red/green lines).
|
|
466
|
+
getDiff: async (sid) => [...(edits.get(sid)?.entries() ?? [])].map(([path, e]) => buildDiffEntry(path, e.oldText ?? '', e.newText ?? '')),
|
|
467
|
+
// TODO list from ACP `plan` updates; summarizeTodos consumes {content,status}.
|
|
468
|
+
getTodos: async (sid) => plans.get(sid) ?? [],
|
|
469
|
+
// Switchable mode + model (captured from session responses + *_update events).
|
|
470
|
+
getControls: async (sid) => {
|
|
471
|
+
const c = controls.get(sid);
|
|
472
|
+
return c ? { mode: c.mode, model: c.model } : {};
|
|
473
|
+
},
|
|
474
|
+
setMode: async (sid, modeId) => {
|
|
475
|
+
const { conn } = await connection();
|
|
476
|
+
await conn.setSessionMode?.({ sessionId: sid, modeId });
|
|
477
|
+
const c = controls.get(sid) ?? {};
|
|
478
|
+
c.mode = { current: modeId, options: c.mode?.options ?? [] }; // optimistic
|
|
479
|
+
controls.set(sid, c);
|
|
480
|
+
},
|
|
481
|
+
setModel: async (sid, modelId) => {
|
|
482
|
+
const c = controls.get(sid);
|
|
483
|
+
if (!c?.modelConfigId)
|
|
484
|
+
throw new Error('session exposes no model config option');
|
|
485
|
+
const { conn } = await connection();
|
|
486
|
+
await conn.setSessionConfigOption?.({ sessionId: sid, configId: c.modelConfigId, value: modelId });
|
|
487
|
+
c.model = { current: modelId, options: c.model?.options ?? [] }; // optimistic
|
|
488
|
+
controls.set(sid, c);
|
|
489
|
+
},
|
|
490
|
+
getSessionsStatus: async () => ({}),
|
|
491
|
+
ping: async () => { try {
|
|
492
|
+
await connection();
|
|
493
|
+
return true;
|
|
494
|
+
}
|
|
495
|
+
catch {
|
|
496
|
+
return false;
|
|
497
|
+
} },
|
|
498
|
+
getAgents: async () => [],
|
|
499
|
+
getModels: async () => [],
|
|
500
|
+
getMcp: async () => deps.discoverMcp?.() ?? [],
|
|
501
|
+
// Known directories (from persisted sessions) plus the host default cwd, so
|
|
502
|
+
// the picker always offers at least the default. name = basename.
|
|
503
|
+
listWorkspaces: async () => {
|
|
504
|
+
const dirs = new Map();
|
|
505
|
+
const add = (directory, sessionCount, lastActiveAt) => {
|
|
506
|
+
if (!directory)
|
|
507
|
+
return;
|
|
508
|
+
const name = directory.split('/').filter(Boolean).pop() ?? directory;
|
|
509
|
+
dirs.set(directory, { directory, name, sessionCount, lastActiveAt });
|
|
510
|
+
};
|
|
511
|
+
for (const d of store?.listDirectories() ?? [])
|
|
512
|
+
add(d.directory, d.sessionCount, d.lastActiveAt);
|
|
513
|
+
// agent-native workdirs (e.g. kimi TUI folders) so the picker offers them all
|
|
514
|
+
for (const d of deps.discoverDirs?.() ?? [])
|
|
515
|
+
if (!dirs.has(d))
|
|
516
|
+
add(d, 0, 0);
|
|
517
|
+
for (const d of nativeDirs.values())
|
|
518
|
+
if (!dirs.has(d))
|
|
519
|
+
add(d, 0, 0);
|
|
520
|
+
if (!dirs.has(cwd))
|
|
521
|
+
add(cwd, 0, 0);
|
|
522
|
+
return [...dirs.values()];
|
|
523
|
+
},
|
|
524
|
+
listCommands: async () => commands,
|
|
525
|
+
runCommand: async (sessionId, command, args) => {
|
|
526
|
+
// ACP has no dedicated command RPC; agents accept slash-commands as prompt
|
|
527
|
+
// text. Submit `/name [args]` as a turn (streams + idle via the event path).
|
|
528
|
+
const text = `/${command}${args ? ' ' + args : ''}`;
|
|
529
|
+
await prompt(sessionId, { text });
|
|
530
|
+
},
|
|
531
|
+
resolvePermission,
|
|
532
|
+
onEvent(handler) {
|
|
533
|
+
listeners.add(handler);
|
|
534
|
+
return () => listeners.delete(handler);
|
|
535
|
+
},
|
|
536
|
+
};
|
|
537
|
+
return backend;
|
|
538
|
+
}
|
|
539
|
+
//# sourceMappingURL=acp-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-backend.js","sourceRoot":"","sources":["../../../src/core/agent/acp-backend.ts"],"names":[],"mappings":"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"}
|