@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,409 @@
|
|
|
1
|
+
import { tool } from '@opencode-ai/plugin';
|
|
2
|
+
import { loadPluginConfig } from './config.js';
|
|
3
|
+
import { createTelegramTransport } from '../transport/telegram/index.js';
|
|
4
|
+
import { createWebTransport } from '../transport/web/index.js';
|
|
5
|
+
import { selectAuthStrategy } from '../connectivity/auth/select.js';
|
|
6
|
+
import { createFileBackedState } from '../core/state.js';
|
|
7
|
+
import { createRelay } from '../core/relay.js';
|
|
8
|
+
import { createBackendRegistry } from '../core/agent/registry.js';
|
|
9
|
+
import { normalizeOpencodeEvent } from '../core/agent/opencode-normalizer.js';
|
|
10
|
+
import { createCardBus } from '../core/card-bus.js';
|
|
11
|
+
import { startPushNotifications } from '../core/push.js';
|
|
12
|
+
import { tryBecomePrimary } from '../core/primary-election.js';
|
|
13
|
+
import { createScheduler } from '../core/scheduler.js';
|
|
14
|
+
import { createChannelsStore } from '../core/channels.js';
|
|
15
|
+
import { createLogger } from '../utils/logger.js';
|
|
16
|
+
import { readFileSync } from 'node:fs';
|
|
17
|
+
import { fileURLToPath } from 'node:url';
|
|
18
|
+
import { dirname, join } from 'node:path';
|
|
19
|
+
import { createV1ControlPlane, createV2ControlPlane } from './control-plane.js';
|
|
20
|
+
// Read from package.json at runtime (tsc emits unbundled JS, so ../../package.json
|
|
21
|
+
// resolves from both src/plugin and dist/plugin) — never hardcode a version here.
|
|
22
|
+
const VERSION = (() => {
|
|
23
|
+
try {
|
|
24
|
+
const pkgPath = join(dirname(fileURLToPath(import.meta.url)), '../../package.json');
|
|
25
|
+
return JSON.parse(readFileSync(pkgPath, 'utf-8')).version;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return 'unknown';
|
|
29
|
+
}
|
|
30
|
+
})();
|
|
31
|
+
const log = createLogger('plugin');
|
|
32
|
+
// opencode 1.17 runs plugins in a worker thread. Any unhandled rejection or
|
|
33
|
+
// uncaught exception in our long-lived services (web server, telegram polling,
|
|
34
|
+
// timers) would otherwise crash that worker — opencode reports "Worker has been
|
|
35
|
+
// terminated", the web transport dies (→ 502 at the tunnel), and opencode's own
|
|
36
|
+
// session reads start failing. Absorb them here: log and keep the worker alive.
|
|
37
|
+
// We deliberately NEVER call process.exit (opencode issue #27557: plugins that
|
|
38
|
+
// exit on rejection take the host down with them).
|
|
39
|
+
let guardsInstalled = false;
|
|
40
|
+
function installProcessGuards() {
|
|
41
|
+
if (guardsInstalled)
|
|
42
|
+
return;
|
|
43
|
+
guardsInstalled = true;
|
|
44
|
+
process.on('unhandledRejection', (reason) => {
|
|
45
|
+
log.warn(`unhandledRejection absorbed: ${reason?.stack ?? String(reason)}`);
|
|
46
|
+
});
|
|
47
|
+
process.on('uncaughtException', (err) => {
|
|
48
|
+
log.warn(`uncaughtException absorbed: ${err?.stack ?? String(err)}`);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
export const PLUGIN_ID = 'ocrc';
|
|
52
|
+
/**
|
|
53
|
+
* Dual-export (development plan §7.1/§7.2, officially sanctioned upstream):
|
|
54
|
+
* V1 hosts invoke `server` (the classic plugin function); V2 hosts invoke
|
|
55
|
+
* `setup`. Both funnel into startCore() — the host-agnostic core (state,
|
|
56
|
+
* CardBus, relay, transports, push) is shared; only the ControlPlane adapter
|
|
57
|
+
* differs.
|
|
58
|
+
*/
|
|
59
|
+
const v2Setup = async (ctx, options) => {
|
|
60
|
+
installProcessGuards();
|
|
61
|
+
log.info(`v${VERSION} starting (V2 setup)`);
|
|
62
|
+
// Transient-process gate (V2): `opencode run` is a one-shot client that also
|
|
63
|
+
// loads plugins. Letting it host transports means a TG poller / web server
|
|
64
|
+
// that die when the run exits — flapping the bot and 409-conflicting with
|
|
65
|
+
// the resident service's poller. There is no ctx marker distinguishing
|
|
66
|
+
// serve from run (both report app.channel="latest", app.name="cli" —
|
|
67
|
+
// verified on 2.0.15), so gate on the CLI subcommand instead. Long-lived
|
|
68
|
+
// processes (serve, TUI, service) proceed to the election; only the run
|
|
69
|
+
// one-shot stands down. Revisit if V2 ships a proper role marker.
|
|
70
|
+
const subcommand = process.argv[2];
|
|
71
|
+
if (subcommand === 'run') {
|
|
72
|
+
log.info('transient V2 run process — transports owned by the resident service; standing down');
|
|
73
|
+
return async () => { };
|
|
74
|
+
}
|
|
75
|
+
const config = loadPluginConfig(options ?? ctx.options);
|
|
76
|
+
const primary = tryBecomePrimary();
|
|
77
|
+
if (!primary.isPrimary) {
|
|
78
|
+
log.info('PASSIVE instance — web/bot/events owned by another opencode instance; standing down');
|
|
79
|
+
return () => primary.release();
|
|
80
|
+
}
|
|
81
|
+
const plane = createV2ControlPlane(ctx);
|
|
82
|
+
const hooks = await startCore(plane, config, primary);
|
|
83
|
+
// V2's setup contract returns a cleanup function.
|
|
84
|
+
return () => hooks.dispose();
|
|
85
|
+
};
|
|
86
|
+
export const remoteControlPlugin = (async (ctx, options) => {
|
|
87
|
+
installProcessGuards();
|
|
88
|
+
// Dual-load guard: hosts that support both entry styles may invoke `server`
|
|
89
|
+
// with a V2-shaped context (no SDK client, event.subscribe iterator). Such a
|
|
90
|
+
// call can only mean a V2 host — delegate to the V2 path instead of crashing
|
|
91
|
+
// on missing ctx.serverUrl/client.
|
|
92
|
+
const anyCtx = ctx;
|
|
93
|
+
if (anyCtx && typeof anyCtx === 'object' && !anyCtx.client && typeof anyCtx.event?.subscribe === 'function') {
|
|
94
|
+
log.info('V2-shaped context on the V1 entry — delegating to setup path');
|
|
95
|
+
return v2Setup(anyCtx, options ?? anyCtx.options);
|
|
96
|
+
}
|
|
97
|
+
log.info(`v${VERSION} starting`);
|
|
98
|
+
const config = loadPluginConfig(options);
|
|
99
|
+
const primary = tryBecomePrimary();
|
|
100
|
+
if (!primary.isPrimary) {
|
|
101
|
+
log.info('PASSIVE instance — web/bot/events owned by another opencode instance; standing down');
|
|
102
|
+
return {
|
|
103
|
+
// Minimal inert hooks: do nothing, so this workspace's plugin never
|
|
104
|
+
// competes for the web port or the Telegram bot. The PRIMARY instance's
|
|
105
|
+
// global event stream already covers this workspace.
|
|
106
|
+
event: async () => { },
|
|
107
|
+
dispose: async () => { primary.release(); },
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
const plane = createV1ControlPlane(ctx);
|
|
111
|
+
return startCore(plane, config, primary);
|
|
112
|
+
});
|
|
113
|
+
/**
|
|
114
|
+
* Host-agnostic core startup. Everything below is shared between V1 and V2
|
|
115
|
+
* hosts; every host-specific access goes through the ControlPlane.
|
|
116
|
+
*/
|
|
117
|
+
async function startCore(plane, config, primary) {
|
|
118
|
+
log.info(`transport=${config.transport}, web=${config.webEnabled}, port=${config.webPort}, baseUrl=${plane.serverUrl ?? '(in-process)'}`);
|
|
119
|
+
try {
|
|
120
|
+
const state = createFileBackedState(config.statePath);
|
|
121
|
+
const cardBus = createCardBus();
|
|
122
|
+
const backend = plane.backend;
|
|
123
|
+
// The opencode plugin serves a single backend; wrap it so the relay's
|
|
124
|
+
// per-session routing has a registry to resolve against.
|
|
125
|
+
const registry = createBackendRegistry({ backends: [{ id: backend.id, backend }], state });
|
|
126
|
+
const relay = createRelay({
|
|
127
|
+
cardBus,
|
|
128
|
+
registry,
|
|
129
|
+
state,
|
|
130
|
+
chatTimeoutMs: config.chatTimeoutMs,
|
|
131
|
+
tuiVisible: config.tuiVisible,
|
|
132
|
+
});
|
|
133
|
+
// P2b-M7: cross-channel scheduled prompts. Due schedules dispatch through
|
|
134
|
+
// the same relay as any message; store persists at ~/.ocrc/schedules.json.
|
|
135
|
+
const scheduler = createScheduler({
|
|
136
|
+
path: `${config.statePath.replace(/[^/]+$/, '')}schedules.json`,
|
|
137
|
+
dispatch: async (msg) => { await relay(msg); },
|
|
138
|
+
});
|
|
139
|
+
scheduler.start();
|
|
140
|
+
// M9: bot-channel settings at ~/.ocrc/channels.json — consumed by the TG
|
|
141
|
+
// transport (reply granularity / workspace scope) and the web channels API.
|
|
142
|
+
const channels = createChannelsStore(`${config.statePath.replace(/[^/]+$/, '')}channels.json`);
|
|
143
|
+
const tgChannel = () => channels.get('tg-default');
|
|
144
|
+
// M9: the channels panel can disable a channel (enabled=false) — the
|
|
145
|
+
// transport is then not created at all (takes effect on restart).
|
|
146
|
+
const tgChannelCfg = channels.get('tg-default');
|
|
147
|
+
const tgEnabled = tgChannelCfg?.enabled ?? true;
|
|
148
|
+
let tgTransport;
|
|
149
|
+
const transports = [];
|
|
150
|
+
if (tgEnabled) {
|
|
151
|
+
tgTransport = createTelegramTransport({
|
|
152
|
+
token: config.telegramBotToken,
|
|
153
|
+
allowedUserIds: config.allowedUserIds,
|
|
154
|
+
backend,
|
|
155
|
+
state,
|
|
156
|
+
baseUrl: plane.serverUrl,
|
|
157
|
+
tgChunkSoftLimit: config.tgChunkSoftLimit,
|
|
158
|
+
scheduler,
|
|
159
|
+
channels: tgChannel,
|
|
160
|
+
});
|
|
161
|
+
transports.push(tgTransport);
|
|
162
|
+
tgTransport.onMessage(relay);
|
|
163
|
+
}
|
|
164
|
+
let webTransport;
|
|
165
|
+
if (config.webEnabled) {
|
|
166
|
+
const auth = selectAuthStrategy({
|
|
167
|
+
mode: config.webAuth,
|
|
168
|
+
token: config.webToken,
|
|
169
|
+
devEmail: config.webCfAccessDevEmail,
|
|
170
|
+
devBypass: config.webCfAccessDevBypass,
|
|
171
|
+
host: config.webHost,
|
|
172
|
+
cfAccess: {
|
|
173
|
+
team: config.webCfAccessTeam,
|
|
174
|
+
aud: config.webCfAccessAud,
|
|
175
|
+
devBypass: config.webCfAccessDevBypass,
|
|
176
|
+
devEmail: config.webCfAccessDevEmail,
|
|
177
|
+
host: config.webHost,
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
webTransport = createWebTransport({
|
|
181
|
+
host: config.webHost,
|
|
182
|
+
port: config.webPort,
|
|
183
|
+
registry,
|
|
184
|
+
auth,
|
|
185
|
+
staticRoot: config.webStaticRoot,
|
|
186
|
+
scheduler,
|
|
187
|
+
channels,
|
|
188
|
+
telegramStatus: () => tgTransport?.status?.() ?? { connected: false },
|
|
189
|
+
});
|
|
190
|
+
webTransport.onMessage(relay);
|
|
191
|
+
transports.push(webTransport);
|
|
192
|
+
}
|
|
193
|
+
// Start transports in background — bot.launch() blocks on polling and must not hold up plugin init.
|
|
194
|
+
// The event hook must be returned immediately so opencode can dispatch events.
|
|
195
|
+
// Each transport retries independently with exponential backoff (base 1s, cap
|
|
196
|
+
// 30s — same pattern as opencode/global-events.ts), so a boot-time failure
|
|
197
|
+
// (Telegram unreachable, web port briefly taken) recovers instead of leaving
|
|
198
|
+
// the transport permanently dead, and one failing transport never blocks another.
|
|
199
|
+
let shuttingDown = false;
|
|
200
|
+
const startTransport = (t) => {
|
|
201
|
+
const run = async () => {
|
|
202
|
+
let attempt = 0;
|
|
203
|
+
while (!shuttingDown) {
|
|
204
|
+
try {
|
|
205
|
+
await t.start({ cardBus, state });
|
|
206
|
+
log.info(`transport ${t.name} started`);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
if (shuttingDown)
|
|
211
|
+
return;
|
|
212
|
+
const delay = Math.min(1000 * 2 ** attempt, 30000);
|
|
213
|
+
attempt++;
|
|
214
|
+
log.warn(`transport ${t.name} start failed (retry ${attempt} in ${delay}ms): ${err.message}`);
|
|
215
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
void run();
|
|
220
|
+
};
|
|
221
|
+
for (const t of transports)
|
|
222
|
+
startTransport(t);
|
|
223
|
+
// Push notifications — driven by the plugin event hook
|
|
224
|
+
const push = startPushNotifications({ cardBus, backend, state });
|
|
225
|
+
// Poll the TUI-selected session to keep the current agent in sync.
|
|
226
|
+
// V2 hosts have no TUI navigation — the plane omits getSession there.
|
|
227
|
+
const pollTimer = plane.getSession
|
|
228
|
+
? setInterval(async () => {
|
|
229
|
+
const sid = state.getTuiSelectedSession();
|
|
230
|
+
if (!sid)
|
|
231
|
+
return;
|
|
232
|
+
try {
|
|
233
|
+
const data = await plane.getSession(sid);
|
|
234
|
+
if (data?.agent)
|
|
235
|
+
state.setCurrentAgent(data.agent);
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
// best effort
|
|
239
|
+
}
|
|
240
|
+
}, 15000)
|
|
241
|
+
: undefined;
|
|
242
|
+
// Unified event dispatch. On V1, driven primarily by the per-instance
|
|
243
|
+
// `event` hook (opencode pushes events — reliable in the worker) and
|
|
244
|
+
// supplemented by the global stream for OTHER workspaces only. On V2,
|
|
245
|
+
// driven entirely by the control plane's mapped event iterator.
|
|
246
|
+
async function dispatchEvent(ev) {
|
|
247
|
+
const eventType = ev.type;
|
|
248
|
+
if (!eventType)
|
|
249
|
+
return;
|
|
250
|
+
// Feed all events to push notification engine (fire-and-forget, but never
|
|
251
|
+
// let a rejection escape to the global guard).
|
|
252
|
+
void Promise.resolve(push.handleEvent(ev)).catch((err) => log.warn('push.handleEvent failed', err));
|
|
253
|
+
switch (eventType) {
|
|
254
|
+
case 'permission.asked':
|
|
255
|
+
case 'permission.replied':
|
|
256
|
+
case 'permission.updated':
|
|
257
|
+
tgTransport?.handlePluginPermissionEvent({ type: eventType, properties: ev.properties }).catch((err) => log.error('handlePluginPermissionEvent failed', err));
|
|
258
|
+
break;
|
|
259
|
+
case 'tui.session.select': {
|
|
260
|
+
const sid = ev?.properties?.sessionID;
|
|
261
|
+
if (typeof sid === 'string' && sid) {
|
|
262
|
+
state.setTuiSelectedSession(sid);
|
|
263
|
+
log.info(`[plugin] TUI session select: ${sid.slice(-8)}`);
|
|
264
|
+
}
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
case 'question.asked': {
|
|
268
|
+
const p = ev?.properties ?? {};
|
|
269
|
+
const sid = typeof p.sessionID === 'string' ? p.sessionID : '';
|
|
270
|
+
const requestId = typeof p.id === 'string' ? p.id : '';
|
|
271
|
+
if (sid && requestId) {
|
|
272
|
+
// Stable id so the resolved republish (below) upserts in place.
|
|
273
|
+
cardBus.publish({
|
|
274
|
+
kind: 'question', sessionId: sid, requestId, id: `question:${requestId}`,
|
|
275
|
+
questions: Array.isArray(p.questions) ? p.questions : [],
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
tgTransport?.handlePluginQuestionEvent({ type: eventType, properties: p }).catch((err) => log.error('handlePluginQuestionEvent failed', err));
|
|
279
|
+
break;
|
|
280
|
+
}
|
|
281
|
+
case 'question.replied':
|
|
282
|
+
case 'question.rejected': {
|
|
283
|
+
const p = ev?.properties ?? {};
|
|
284
|
+
const sid = typeof p.sessionID === 'string' ? p.sessionID : '';
|
|
285
|
+
const requestId = typeof p.requestID === 'string' ? p.requestID : '';
|
|
286
|
+
if (sid && requestId) {
|
|
287
|
+
cardBus.publish({
|
|
288
|
+
kind: 'question', sessionId: sid, requestId, id: `question:${requestId}`,
|
|
289
|
+
questions: [],
|
|
290
|
+
resolved: eventType === 'question.replied' ? 'replied' : 'rejected',
|
|
291
|
+
answers: Array.isArray(p.answers) ? p.answers : undefined,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
// External resolution (TUI/other device) — let TG close its wizard.
|
|
295
|
+
tgTransport?.handlePluginQuestionEvent({ type: eventType, properties: p }).catch((err) => log.error('handlePluginQuestionEvent failed', err));
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
case 'session.deleted': {
|
|
299
|
+
// Free per-session memory (card buffer, costs, delivery marks, aborts).
|
|
300
|
+
const sid = ev?.properties?.sessionID ?? ev?.properties?.info?.id;
|
|
301
|
+
if (typeof sid === 'string' && sid) {
|
|
302
|
+
cardBus.drop(sid);
|
|
303
|
+
state.dropSession(sid);
|
|
304
|
+
log.info(`[plugin] session deleted, evicted: ${sid.slice(-8)}`);
|
|
305
|
+
}
|
|
306
|
+
break;
|
|
307
|
+
}
|
|
308
|
+
case 'session.idle':
|
|
309
|
+
case 'session.error':
|
|
310
|
+
case 'session.created':
|
|
311
|
+
case 'session.updated':
|
|
312
|
+
case 'session.status':
|
|
313
|
+
case 'message.part.updated':
|
|
314
|
+
case 'message.part.delta':
|
|
315
|
+
case 'message.updated':
|
|
316
|
+
case 'message.part.removed':
|
|
317
|
+
case 'message.removed':
|
|
318
|
+
case 'command.executed':
|
|
319
|
+
try {
|
|
320
|
+
const ae = normalizeOpencodeEvent(ev);
|
|
321
|
+
if (ae)
|
|
322
|
+
await relay.handleEvent(ae);
|
|
323
|
+
}
|
|
324
|
+
catch (err) {
|
|
325
|
+
log.error('relay.handleEvent failed', err);
|
|
326
|
+
}
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
// Wire the host's event sources through the control plane. V1: global SSE
|
|
331
|
+
// for other workspaces (own-workspace events arrive via the returned hook).
|
|
332
|
+
// V2: the mapped ctx.event.subscribe iterator for ALL workspaces.
|
|
333
|
+
const stopEvents = plane.wireEvents(dispatchEvent);
|
|
334
|
+
const v1EventHook = plane.eventHook?.(dispatchEvent);
|
|
335
|
+
return {
|
|
336
|
+
...(v1EventHook ? { event: v1EventHook } : {}),
|
|
337
|
+
tool: {
|
|
338
|
+
'rc-status': tool({
|
|
339
|
+
description: 'Show ocrc plugin status',
|
|
340
|
+
args: {},
|
|
341
|
+
async execute() {
|
|
342
|
+
const s = push.stats();
|
|
343
|
+
const lines = [
|
|
344
|
+
`ocrc v${VERSION}`,
|
|
345
|
+
`Telegram: ${tgTransport ? 'active' : 'inactive'}`,
|
|
346
|
+
`Web: ${config.webEnabled ? `listening :${config.webPort}` : 'disabled'}`,
|
|
347
|
+
`Generating: ${state.hasActiveGeneration() ? 'yes' : 'no'}`,
|
|
348
|
+
`Pushes/hr: ${s.pushesLastHour} (tracked sessions: ${s.trackedSessions})`,
|
|
349
|
+
];
|
|
350
|
+
return lines.join('\n');
|
|
351
|
+
},
|
|
352
|
+
}),
|
|
353
|
+
notify: tool({
|
|
354
|
+
description: 'Send the user a push notification (e.g. when a long task or tests finish).',
|
|
355
|
+
args: { message: tool.schema.string().describe('The notification text to push to the user') },
|
|
356
|
+
async execute(args, context) {
|
|
357
|
+
const sid = context?.sessionID || state.getLastSessionId();
|
|
358
|
+
cardBus.publish({
|
|
359
|
+
kind: 'info',
|
|
360
|
+
title: 'Notification',
|
|
361
|
+
sections: [{ body: `🔔 ${args.message}` }],
|
|
362
|
+
...(sid ? { sessionId: sid } : {}),
|
|
363
|
+
});
|
|
364
|
+
return 'notification sent';
|
|
365
|
+
},
|
|
366
|
+
}),
|
|
367
|
+
},
|
|
368
|
+
dispose: async () => {
|
|
369
|
+
log.info('plugin disposing, stopping transports...');
|
|
370
|
+
shuttingDown = true;
|
|
371
|
+
scheduler.stop();
|
|
372
|
+
stopEvents();
|
|
373
|
+
if (pollTimer)
|
|
374
|
+
clearInterval(pollTimer);
|
|
375
|
+
push.stop();
|
|
376
|
+
await Promise.allSettled(transports.map((t) => t.stop()));
|
|
377
|
+
// Flush debounced state writes (100ms debounce would otherwise be lost on exit).
|
|
378
|
+
try {
|
|
379
|
+
await state.flush();
|
|
380
|
+
}
|
|
381
|
+
catch { /* best effort */ }
|
|
382
|
+
primary.release();
|
|
383
|
+
log.info('plugin disposed');
|
|
384
|
+
},
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
catch (err) {
|
|
388
|
+
primary.release();
|
|
389
|
+
throw err;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
/** Registry wrapper kept out of startCore's flow for readability. */
|
|
393
|
+
export { v2Setup as ocrcV2Setup };
|
|
394
|
+
/**
|
|
395
|
+
* Dual export:
|
|
396
|
+
* - V1 hosts call the default export as a function (classic plugin contract,
|
|
397
|
+
* works through the install bridge) — `remoteControlPlugin` IS that function.
|
|
398
|
+
* - V2 hosts read the default export's `setup` member.
|
|
399
|
+
* A function with attached members satisfies both: callable for V1, member-
|
|
400
|
+
* addressable for V2. (The upstream migration doc also accepts a plain object
|
|
401
|
+
* `{id, server, setup}` on V1 ≥1.18.29; the callable form additionally keeps
|
|
402
|
+
* pre-1.18.29 V1 hosts and the install bridge working.)
|
|
403
|
+
* See docs/v2-api-notes.md §1 for the official dual-host statement.
|
|
404
|
+
*/
|
|
405
|
+
const dualEntry = remoteControlPlugin;
|
|
406
|
+
dualEntry.id = PLUGIN_ID;
|
|
407
|
+
dualEntry.setup = v2Setup;
|
|
408
|
+
export default dualEntry;
|
|
409
|
+
//# sourceMappingURL=entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry.js","sourceRoot":"","sources":["../../src/plugin/entry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
function textOfContent(content) {
|
|
2
|
+
if (!Array.isArray(content))
|
|
3
|
+
return '';
|
|
4
|
+
return content
|
|
5
|
+
.map((c) => (c && typeof c === 'object' && typeof c.text === 'string' ? c.text : ''))
|
|
6
|
+
.filter(Boolean)
|
|
7
|
+
.join('\n')
|
|
8
|
+
.trim();
|
|
9
|
+
}
|
|
10
|
+
export function createV2EventMapper() {
|
|
11
|
+
/** tool-call id → tool name (from session.tool.input.started). */
|
|
12
|
+
const toolNames = new Map();
|
|
13
|
+
return {
|
|
14
|
+
map(raw) {
|
|
15
|
+
const type = raw?.type;
|
|
16
|
+
if (!type)
|
|
17
|
+
return [];
|
|
18
|
+
const d = (raw.data ?? {});
|
|
19
|
+
const sid = typeof d.sessionID === 'string' ? d.sessionID : undefined;
|
|
20
|
+
switch (type) {
|
|
21
|
+
// ── permissions (field renames) ─────────────────────────────────────
|
|
22
|
+
case 'permission.asked':
|
|
23
|
+
if (!sid || !d.id)
|
|
24
|
+
return [];
|
|
25
|
+
return [{
|
|
26
|
+
type: 'permission.asked',
|
|
27
|
+
properties: {
|
|
28
|
+
id: d.id,
|
|
29
|
+
sessionID: sid,
|
|
30
|
+
permission: d.action,
|
|
31
|
+
patterns: d.resources,
|
|
32
|
+
title: d.action,
|
|
33
|
+
args: d.metadata,
|
|
34
|
+
metadata: d.metadata,
|
|
35
|
+
},
|
|
36
|
+
}];
|
|
37
|
+
case 'permission.replied':
|
|
38
|
+
if (!d.requestID && !d.id)
|
|
39
|
+
return [];
|
|
40
|
+
return [{
|
|
41
|
+
type: 'permission.replied',
|
|
42
|
+
properties: {
|
|
43
|
+
permissionID: d.requestID ?? d.id,
|
|
44
|
+
requestID: d.requestID ?? d.id,
|
|
45
|
+
sessionID: sid,
|
|
46
|
+
response: d.reply,
|
|
47
|
+
reply: d.reply,
|
|
48
|
+
},
|
|
49
|
+
}];
|
|
50
|
+
// ── streaming: text ──────────────────────────────────────────────────
|
|
51
|
+
case 'session.text.delta': {
|
|
52
|
+
if (!sid || !d.assistantMessageID || typeof d.ordinal !== 'number' || typeof d.delta !== 'string')
|
|
53
|
+
return [];
|
|
54
|
+
return [{
|
|
55
|
+
type: 'message.part.delta',
|
|
56
|
+
properties: {
|
|
57
|
+
sessionID: sid,
|
|
58
|
+
messageID: d.assistantMessageID,
|
|
59
|
+
partID: `${d.assistantMessageID}:${d.ordinal}`,
|
|
60
|
+
field: 'text',
|
|
61
|
+
delta: d.delta,
|
|
62
|
+
},
|
|
63
|
+
}];
|
|
64
|
+
}
|
|
65
|
+
case 'session.text.ended': {
|
|
66
|
+
if (!sid || !d.assistantMessageID || typeof d.ordinal !== 'number')
|
|
67
|
+
return [];
|
|
68
|
+
return [{
|
|
69
|
+
type: 'message.part.updated',
|
|
70
|
+
properties: {
|
|
71
|
+
sessionID: sid,
|
|
72
|
+
part: {
|
|
73
|
+
id: `${d.assistantMessageID}:${d.ordinal}`,
|
|
74
|
+
type: 'text',
|
|
75
|
+
text: typeof d.text === 'string' ? d.text : '',
|
|
76
|
+
messageID: d.assistantMessageID,
|
|
77
|
+
sessionID: sid,
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
}];
|
|
81
|
+
}
|
|
82
|
+
// ── streaming: tools (name from input.started registry) ─────────────
|
|
83
|
+
case 'session.tool.input.started': {
|
|
84
|
+
if (!sid || !d.id)
|
|
85
|
+
return [];
|
|
86
|
+
if (typeof d.name === 'string') {
|
|
87
|
+
toolNames.set(d.id, d.name);
|
|
88
|
+
if (toolNames.size > 500) {
|
|
89
|
+
// bound the registry; oldest entries are long-finished calls
|
|
90
|
+
const first = toolNames.keys().next().value;
|
|
91
|
+
if (first !== undefined)
|
|
92
|
+
toolNames.delete(first);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const name = (typeof d.name === 'string' ? d.name : undefined) ?? toolNames.get(d.id) ?? 'tool';
|
|
96
|
+
return [{
|
|
97
|
+
type: 'message.part.updated',
|
|
98
|
+
properties: {
|
|
99
|
+
sessionID: sid,
|
|
100
|
+
part: { id: d.id, type: 'tool', tool: name, messageID: d.assistantMessageID, sessionID: sid, state: { status: 'running', input: {} } },
|
|
101
|
+
},
|
|
102
|
+
}];
|
|
103
|
+
}
|
|
104
|
+
case 'session.tool.called': {
|
|
105
|
+
if (!sid || !d.id)
|
|
106
|
+
return [];
|
|
107
|
+
return [{
|
|
108
|
+
type: 'message.part.updated',
|
|
109
|
+
properties: {
|
|
110
|
+
sessionID: sid,
|
|
111
|
+
part: { id: d.id, type: 'tool', tool: d.id ? toolNames.get(d.id) ?? 'tool' : 'tool', messageID: d.assistantMessageID, sessionID: sid, state: { status: 'running', input: d.input ?? {} } },
|
|
112
|
+
},
|
|
113
|
+
}];
|
|
114
|
+
}
|
|
115
|
+
case 'session.tool.success': {
|
|
116
|
+
if (!sid || !d.id)
|
|
117
|
+
return [];
|
|
118
|
+
return [{
|
|
119
|
+
type: 'message.part.updated',
|
|
120
|
+
properties: {
|
|
121
|
+
sessionID: sid,
|
|
122
|
+
part: { id: d.id, type: 'tool', tool: toolNames.get(d.id) ?? 'tool', messageID: d.assistantMessageID, sessionID: sid, state: { status: 'done', input: {}, output: textOfContent(d.content) } },
|
|
123
|
+
},
|
|
124
|
+
}];
|
|
125
|
+
}
|
|
126
|
+
case 'session.tool.failed': {
|
|
127
|
+
if (!sid || !d.id)
|
|
128
|
+
return [];
|
|
129
|
+
const message = d.error?.message ?? 'tool failed';
|
|
130
|
+
return [{
|
|
131
|
+
type: 'message.part.updated',
|
|
132
|
+
properties: {
|
|
133
|
+
sessionID: sid,
|
|
134
|
+
part: { id: d.id, type: 'tool', tool: toolNames.get(d.id) ?? 'tool', messageID: d.assistantMessageID, sessionID: sid, state: { status: 'error', input: {}, output: message } },
|
|
135
|
+
},
|
|
136
|
+
}];
|
|
137
|
+
}
|
|
138
|
+
// ── turn lifecycle ───────────────────────────────────────────────────
|
|
139
|
+
case 'session.idle':
|
|
140
|
+
if (!sid)
|
|
141
|
+
return [];
|
|
142
|
+
return [{ type: 'session.idle', properties: { sessionID: sid } }];
|
|
143
|
+
case 'session.execution.started':
|
|
144
|
+
if (!sid)
|
|
145
|
+
return [];
|
|
146
|
+
return [{ type: 'session.status', properties: { sessionID: sid, status: { type: 'busy' } } }];
|
|
147
|
+
case 'session.execution.succeeded':
|
|
148
|
+
case 'session.execution.interrupted':
|
|
149
|
+
if (!sid)
|
|
150
|
+
return [];
|
|
151
|
+
return [{ type: 'session.idle', properties: { sessionID: sid } }];
|
|
152
|
+
case 'session.execution.failed': {
|
|
153
|
+
if (!sid)
|
|
154
|
+
return [];
|
|
155
|
+
const message = d.error?.message;
|
|
156
|
+
const out = [{ type: 'session.status', properties: { sessionID: sid, status: { type: 'idle' } } }];
|
|
157
|
+
if (message)
|
|
158
|
+
out.push({ type: 'session.error', properties: { sessionID: sid, error: { message } } });
|
|
159
|
+
return out;
|
|
160
|
+
}
|
|
161
|
+
// ── session registry feeders (web/TG session lists) ──────────────────
|
|
162
|
+
case 'session.created':
|
|
163
|
+
if (!sid)
|
|
164
|
+
return [];
|
|
165
|
+
return [{
|
|
166
|
+
type: 'session.created',
|
|
167
|
+
properties: { sessionID: sid, info: { id: sid, sessionID: sid, directory: raw.location?.directory } },
|
|
168
|
+
}];
|
|
169
|
+
case 'session.deleted':
|
|
170
|
+
if (!sid)
|
|
171
|
+
return [];
|
|
172
|
+
return [{ type: 'session.deleted', properties: { sessionID: sid } }];
|
|
173
|
+
// ── interactive questions: V2 payloads are field-identical to V1 ─────
|
|
174
|
+
case 'question.v2.asked': {
|
|
175
|
+
const q = d;
|
|
176
|
+
return (q?.id && q?.questions) ? [{ type: 'question.asked', properties: q }] : [];
|
|
177
|
+
}
|
|
178
|
+
case 'question.v2.replied': {
|
|
179
|
+
const q = d;
|
|
180
|
+
return (sid && q?.requestID) ? [{ type: 'question.replied', properties: q }] : [];
|
|
181
|
+
}
|
|
182
|
+
case 'question.v2.rejected': {
|
|
183
|
+
const q = d;
|
|
184
|
+
return (sid && q?.requestID) ? [{ type: 'question.rejected', properties: q }] : [];
|
|
185
|
+
}
|
|
186
|
+
// Everything else (usage, vcs, mcp, pty, ...) is not core-relevant yet.
|
|
187
|
+
default:
|
|
188
|
+
return [];
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=event-map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-map.js","sourceRoot":"","sources":["../../../src/plugin/v2/event-map.ts"],"names":[],"mappings":"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"}
|