@agentdeck/bridge 0.1.0 → 0.2.1
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 +21 -0
- package/dist/adapters/claude-code.d.ts +11 -27
- package/dist/adapters/claude-code.d.ts.map +1 -1
- package/dist/adapters/claude-code.js +29 -123
- package/dist/adapters/claude-code.js.map +1 -1
- package/dist/adapters/codex-cli.d.ts +21 -0
- package/dist/adapters/codex-cli.d.ts.map +1 -0
- package/dist/adapters/codex-cli.js +53 -0
- package/dist/adapters/codex-cli.js.map +1 -0
- package/dist/adapters/index.d.ts +4 -0
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +13 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/monitor.d.ts +34 -0
- package/dist/adapters/monitor.d.ts.map +1 -0
- package/dist/adapters/monitor.js +86 -0
- package/dist/adapters/monitor.js.map +1 -0
- package/dist/adapters/openclaw.d.ts +36 -2
- package/dist/adapters/openclaw.d.ts.map +1 -1
- package/dist/adapters/openclaw.js +329 -59
- package/dist/adapters/openclaw.js.map +1 -1
- package/dist/adapters/opencode-adapter.d.ts +48 -0
- package/dist/adapters/opencode-adapter.d.ts.map +1 -0
- package/dist/adapters/opencode-adapter.js +345 -0
- package/dist/adapters/opencode-adapter.js.map +1 -0
- package/dist/adapters/pty-adapter.d.ts +56 -0
- package/dist/adapters/pty-adapter.d.ts.map +1 -0
- package/dist/adapters/pty-adapter.js +143 -0
- package/dist/adapters/pty-adapter.js.map +1 -0
- package/dist/adb-reverse.d.ts +25 -0
- package/dist/adb-reverse.d.ts.map +1 -0
- package/dist/adb-reverse.js +129 -0
- package/dist/adb-reverse.js.map +1 -0
- package/dist/antigravity-local.d.ts +7 -0
- package/dist/antigravity-local.d.ts.map +1 -0
- package/dist/antigravity-local.js +153 -0
- package/dist/antigravity-local.js.map +1 -0
- package/dist/apme/adapters/claude-hook.d.ts +15 -0
- package/dist/apme/adapters/claude-hook.d.ts.map +1 -0
- package/dist/apme/adapters/claude-hook.js +85 -0
- package/dist/apme/adapters/claude-hook.js.map +1 -0
- package/dist/apme/adapters/claude-pty.d.ts +28 -0
- package/dist/apme/adapters/claude-pty.d.ts.map +1 -0
- package/dist/apme/adapters/claude-pty.js +88 -0
- package/dist/apme/adapters/claude-pty.js.map +1 -0
- package/dist/apme/adapters/timeline.d.ts +16 -0
- package/dist/apme/adapters/timeline.d.ts.map +1 -0
- package/dist/apme/adapters/timeline.js +66 -0
- package/dist/apme/adapters/timeline.js.map +1 -0
- package/dist/apme/classifier.d.ts +53 -0
- package/dist/apme/classifier.d.ts.map +1 -0
- package/dist/apme/classifier.js +266 -0
- package/dist/apme/classifier.js.map +1 -0
- package/dist/apme/claude-transcript-reader.d.ts +38 -0
- package/dist/apme/claude-transcript-reader.d.ts.map +1 -0
- package/dist/apme/claude-transcript-reader.js +127 -0
- package/dist/apme/claude-transcript-reader.js.map +1 -0
- package/dist/apme/collector.d.ts +108 -0
- package/dist/apme/collector.d.ts.map +1 -0
- package/dist/apme/collector.js +659 -0
- package/dist/apme/collector.js.map +1 -0
- package/dist/apme/dashboard-html.d.ts +9 -0
- package/dist/apme/dashboard-html.d.ts.map +1 -0
- package/dist/apme/dashboard-html.js +416 -0
- package/dist/apme/dashboard-html.js.map +1 -0
- package/dist/apme/http.d.ts +19 -0
- package/dist/apme/http.d.ts.map +1 -0
- package/dist/apme/http.js +210 -0
- package/dist/apme/http.js.map +1 -0
- package/dist/apme/hw-sampler.d.ts +30 -0
- package/dist/apme/hw-sampler.d.ts.map +1 -0
- package/dist/apme/hw-sampler.js +106 -0
- package/dist/apme/hw-sampler.js.map +1 -0
- package/dist/apme/index.d.ts +43 -0
- package/dist/apme/index.d.ts.map +1 -0
- package/dist/apme/index.js +75 -0
- package/dist/apme/index.js.map +1 -0
- package/dist/apme/outcome.d.ts +48 -0
- package/dist/apme/outcome.d.ts.map +1 -0
- package/dist/apme/outcome.js +232 -0
- package/dist/apme/outcome.js.map +1 -0
- package/dist/apme/recommend.d.ts +32 -0
- package/dist/apme/recommend.d.ts.map +1 -0
- package/dist/apme/recommend.js +41 -0
- package/dist/apme/recommend.js.map +1 -0
- package/dist/apme/runner.d.ts +94 -0
- package/dist/apme/runner.d.ts.map +1 -0
- package/dist/apme/runner.js +812 -0
- package/dist/apme/runner.js.map +1 -0
- package/dist/apme/settings.d.ts +65 -0
- package/dist/apme/settings.d.ts.map +1 -0
- package/dist/apme/settings.js +97 -0
- package/dist/apme/settings.js.map +1 -0
- package/dist/apme/store.d.ts +99 -0
- package/dist/apme/store.d.ts.map +1 -0
- package/dist/apme/store.js +911 -0
- package/dist/apme/store.js.map +1 -0
- package/dist/apme/tuner.d.ts +64 -0
- package/dist/apme/tuner.d.ts.map +1 -0
- package/dist/apme/tuner.js +297 -0
- package/dist/apme/tuner.js.map +1 -0
- package/dist/apme/types.d.ts +11 -0
- package/dist/apme/types.d.ts.map +1 -0
- package/dist/apme/types.js +10 -0
- package/dist/apme/types.js.map +1 -0
- package/dist/auth.d.ts +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +15 -5
- package/dist/auth.js.map +1 -1
- package/dist/bridge-core.d.ts +162 -0
- package/dist/bridge-core.d.ts.map +1 -0
- package/dist/bridge-core.js +627 -0
- package/dist/bridge-core.js.map +1 -0
- package/dist/check-deps.d.ts +3 -1
- package/dist/check-deps.d.ts.map +1 -1
- package/dist/check-deps.js +34 -13
- package/dist/check-deps.js.map +1 -1
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1235 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex-auth.d.ts +10 -0
- package/dist/codex-auth.d.ts.map +1 -0
- package/dist/codex-auth.js +63 -0
- package/dist/codex-auth.js.map +1 -0
- package/dist/codex-output-parser.d.ts +21 -0
- package/dist/codex-output-parser.d.ts.map +1 -0
- package/dist/codex-output-parser.js +253 -0
- package/dist/codex-output-parser.js.map +1 -0
- package/dist/d200h/hid-protocol.d.ts +62 -0
- package/dist/d200h/hid-protocol.d.ts.map +1 -0
- package/dist/d200h/hid-protocol.js +124 -0
- package/dist/d200h/hid-protocol.js.map +1 -0
- package/dist/d200h/image-renderer.d.ts +36 -0
- package/dist/d200h/image-renderer.d.ts.map +1 -0
- package/dist/d200h/image-renderer.js +487 -0
- package/dist/d200h/image-renderer.js.map +1 -0
- package/dist/daemon-server.d.ts +19 -0
- package/dist/daemon-server.d.ts.map +1 -0
- package/dist/daemon-server.js +1168 -0
- package/dist/daemon-server.js.map +1 -0
- package/dist/daemon-ws-client.d.ts +82 -0
- package/dist/daemon-ws-client.d.ts.map +1 -0
- package/dist/daemon-ws-client.js +179 -0
- package/dist/daemon-ws-client.js.map +1 -0
- package/dist/daemon.d.ts +10 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +56 -0
- package/dist/daemon.js.map +1 -0
- package/dist/display-monitor.d.ts +25 -0
- package/dist/display-monitor.d.ts.map +1 -0
- package/dist/display-monitor.js +143 -0
- package/dist/display-monitor.js.map +1 -0
- package/dist/esp32-serial.d.ts +112 -0
- package/dist/esp32-serial.d.ts.map +1 -0
- package/dist/esp32-serial.js +502 -0
- package/dist/esp32-serial.js.map +1 -0
- package/dist/gateway-probe.d.ts +12 -0
- package/dist/gateway-probe.d.ts.map +1 -0
- package/dist/gateway-probe.js +39 -0
- package/dist/gateway-probe.js.map +1 -0
- package/dist/hook-migration.d.ts +2 -0
- package/dist/hook-migration.d.ts.map +1 -0
- package/dist/hook-migration.js +104 -0
- package/dist/hook-migration.js.map +1 -0
- package/dist/hook-server.d.ts +29 -0
- package/dist/hook-server.d.ts.map +1 -1
- package/dist/hook-server.js +366 -8
- package/dist/hook-server.js.map +1 -1
- package/dist/index.d.ts +20 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1304 -562
- package/dist/index.js.map +1 -1
- package/dist/log-stream.d.ts +26 -0
- package/dist/log-stream.d.ts.map +1 -0
- package/dist/log-stream.js +111 -0
- package/dist/log-stream.js.map +1 -0
- package/dist/logger.d.ts +9 -2
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +36 -5
- package/dist/logger.js.map +1 -1
- package/dist/mdns.d.ts +15 -1
- package/dist/mdns.d.ts.map +1 -1
- package/dist/mdns.js +143 -28
- package/dist/mdns.js.map +1 -1
- package/dist/mlx-probe.d.ts +14 -0
- package/dist/mlx-probe.d.ts.map +1 -0
- package/dist/mlx-probe.js +44 -0
- package/dist/mlx-probe.js.map +1 -0
- package/dist/model-catalog.d.ts +5 -3
- package/dist/model-catalog.d.ts.map +1 -1
- package/dist/model-catalog.js +45 -29
- package/dist/model-catalog.js.map +1 -1
- package/dist/modules/adb-module.d.ts +14 -0
- package/dist/modules/adb-module.d.ts.map +1 -0
- package/dist/modules/adb-module.js +36 -0
- package/dist/modules/adb-module.js.map +1 -0
- package/dist/modules/d200h-module.d.ts +43 -0
- package/dist/modules/d200h-module.d.ts.map +1 -0
- package/dist/modules/d200h-module.js +360 -0
- package/dist/modules/d200h-module.js.map +1 -0
- package/dist/modules/d200h-renderer.d.ts +7 -0
- package/dist/modules/d200h-renderer.d.ts.map +1 -0
- package/dist/modules/d200h-renderer.js +321 -0
- package/dist/modules/d200h-renderer.js.map +1 -0
- package/dist/modules/index.d.ts +23 -0
- package/dist/modules/index.d.ts.map +1 -0
- package/dist/modules/index.js +65 -0
- package/dist/modules/index.js.map +1 -0
- package/dist/modules/mdns-module.d.ts +12 -0
- package/dist/modules/mdns-module.d.ts.map +1 -0
- package/dist/modules/mdns-module.js +21 -0
- package/dist/modules/mdns-module.js.map +1 -0
- package/dist/modules/pixoo-module.d.ts +8 -0
- package/dist/modules/pixoo-module.d.ts.map +1 -0
- package/dist/modules/pixoo-module.js +24 -0
- package/dist/modules/pixoo-module.js.map +1 -0
- package/dist/modules/serial-module.d.ts +18 -0
- package/dist/modules/serial-module.d.ts.map +1 -0
- package/dist/modules/serial-module.js +47 -0
- package/dist/modules/serial-module.js.map +1 -0
- package/dist/modules/types.d.ts +39 -0
- package/dist/modules/types.d.ts.map +1 -0
- package/dist/modules/types.js +2 -0
- package/dist/modules/types.js.map +1 -0
- package/dist/ollama-probe.d.ts +13 -0
- package/dist/ollama-probe.d.ts.map +1 -0
- package/dist/ollama-probe.js +46 -0
- package/dist/ollama-probe.js.map +1 -0
- package/dist/opencode-client.d.ts +126 -0
- package/dist/opencode-client.d.ts.map +1 -0
- package/dist/opencode-client.js +181 -0
- package/dist/opencode-client.js.map +1 -0
- package/dist/output-parser.d.ts +3 -0
- package/dist/output-parser.d.ts.map +1 -1
- package/dist/output-parser.js +29 -3
- package/dist/output-parser.js.map +1 -1
- package/dist/passive-observer.d.ts +38 -0
- package/dist/passive-observer.d.ts.map +1 -0
- package/dist/passive-observer.js +632 -0
- package/dist/passive-observer.js.map +1 -0
- package/dist/pixoo/pixoo-bridge.d.ts +50 -0
- package/dist/pixoo/pixoo-bridge.d.ts.map +1 -0
- package/dist/pixoo/pixoo-bridge.js +280 -0
- package/dist/pixoo/pixoo-bridge.js.map +1 -0
- package/dist/pixoo/pixoo-camera.d.ts +80 -0
- package/dist/pixoo/pixoo-camera.d.ts.map +1 -0
- package/dist/pixoo/pixoo-camera.js +271 -0
- package/dist/pixoo/pixoo-camera.js.map +1 -0
- package/dist/pixoo/pixoo-client.d.ts +67 -0
- package/dist/pixoo/pixoo-client.d.ts.map +1 -0
- package/dist/pixoo/pixoo-client.js +335 -0
- package/dist/pixoo/pixoo-client.js.map +1 -0
- package/dist/pixoo/pixoo-font.d.ts +24 -0
- package/dist/pixoo/pixoo-font.d.ts.map +1 -0
- package/dist/pixoo/pixoo-font.js +121 -0
- package/dist/pixoo/pixoo-font.js.map +1 -0
- package/dist/pixoo/pixoo-renderer.d.ts +32 -0
- package/dist/pixoo/pixoo-renderer.d.ts.map +1 -0
- package/dist/pixoo/pixoo-renderer.js +696 -0
- package/dist/pixoo/pixoo-renderer.js.map +1 -0
- package/dist/pixoo/pixoo-settings.d.ts +10 -0
- package/dist/pixoo/pixoo-settings.d.ts.map +1 -0
- package/dist/pixoo/pixoo-settings.js +47 -0
- package/dist/pixoo/pixoo-settings.js.map +1 -0
- package/dist/pixoo/pixoo-sprites.d.ts +187 -0
- package/dist/pixoo/pixoo-sprites.d.ts.map +1 -0
- package/dist/pixoo/pixoo-sprites.js +926 -0
- package/dist/pixoo/pixoo-sprites.js.map +1 -0
- package/dist/pty-manager.d.ts +1 -1
- package/dist/pty-manager.d.ts.map +1 -1
- package/dist/pty-manager.js +36 -15
- package/dist/pty-manager.js.map +1 -1
- package/dist/session-aggregator.d.ts +41 -0
- package/dist/session-aggregator.d.ts.map +1 -0
- package/dist/session-aggregator.js +76 -0
- package/dist/session-aggregator.js.map +1 -0
- package/dist/session-focus-relay.d.ts +35 -0
- package/dist/session-focus-relay.d.ts.map +1 -0
- package/dist/session-focus-relay.js +127 -0
- package/dist/session-focus-relay.js.map +1 -0
- package/dist/session-registry.d.ts +88 -1
- package/dist/session-registry.d.ts.map +1 -1
- package/dist/session-registry.js +222 -15
- package/dist/session-registry.js.map +1 -1
- package/dist/session-timeline-relay.d.ts +27 -0
- package/dist/session-timeline-relay.d.ts.map +1 -0
- package/dist/session-timeline-relay.js +124 -0
- package/dist/session-timeline-relay.js.map +1 -0
- package/dist/state-machine.d.ts +1 -0
- package/dist/state-machine.d.ts.map +1 -1
- package/dist/state-machine.js +14 -0
- package/dist/state-machine.js.map +1 -1
- package/dist/terminal-status.d.ts +28 -0
- package/dist/terminal-status.d.ts.map +1 -0
- package/dist/terminal-status.js +152 -0
- package/dist/terminal-status.js.map +1 -0
- package/dist/timeline-store.d.ts +22 -0
- package/dist/timeline-store.d.ts.map +1 -0
- package/dist/timeline-store.js +79 -0
- package/dist/timeline-store.js.map +1 -0
- package/dist/timeline-summarizer.d.ts +14 -0
- package/dist/timeline-summarizer.d.ts.map +1 -0
- package/dist/timeline-summarizer.js +154 -0
- package/dist/timeline-summarizer.js.map +1 -0
- package/dist/tts.d.ts +25 -0
- package/dist/tts.d.ts.map +1 -0
- package/dist/tts.js +99 -0
- package/dist/tts.js.map +1 -0
- package/dist/tui/ansi.d.ts +92 -0
- package/dist/tui/ansi.d.ts.map +1 -0
- package/dist/tui/ansi.js +181 -0
- package/dist/tui/ansi.js.map +1 -0
- package/dist/tui/dashboard.d.ts +35 -0
- package/dist/tui/dashboard.d.ts.map +1 -0
- package/dist/tui/dashboard.js +436 -0
- package/dist/tui/dashboard.js.map +1 -0
- package/dist/tui/gauge.d.ts +15 -0
- package/dist/tui/gauge.d.ts.map +1 -0
- package/dist/tui/gauge.js +82 -0
- package/dist/tui/gauge.js.map +1 -0
- package/dist/tui/renderer.d.ts +15 -0
- package/dist/tui/renderer.d.ts.map +1 -0
- package/dist/tui/renderer.js +758 -0
- package/dist/tui/renderer.js.map +1 -0
- package/dist/tui/screen.d.ts +27 -0
- package/dist/tui/screen.d.ts.map +1 -0
- package/dist/tui/screen.js +109 -0
- package/dist/tui/screen.js.map +1 -0
- package/dist/tui/terrarium.d.ts +96 -0
- package/dist/tui/terrarium.d.ts.map +1 -0
- package/dist/tui/terrarium.js +912 -0
- package/dist/tui/terrarium.js.map +1 -0
- package/dist/types.d.ts +4 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -2
- package/dist/types.js.map +1 -1
- package/dist/usage-api.d.ts +9 -2
- package/dist/usage-api.d.ts.map +1 -1
- package/dist/usage-api.js +224 -42
- package/dist/usage-api.js.map +1 -1
- package/dist/usage-event.d.ts +12 -0
- package/dist/usage-event.d.ts.map +1 -0
- package/dist/usage-event.js +78 -0
- package/dist/usage-event.js.map +1 -0
- package/dist/usage-tracker.d.ts +4 -0
- package/dist/usage-tracker.d.ts.map +1 -1
- package/dist/usage-tracker.js +17 -0
- package/dist/usage-tracker.js.map +1 -1
- package/dist/utility-proxy.d.ts +30 -0
- package/dist/utility-proxy.d.ts.map +1 -0
- package/dist/utility-proxy.js +217 -0
- package/dist/utility-proxy.js.map +1 -0
- package/dist/utils/project-name.d.ts +22 -0
- package/dist/utils/project-name.d.ts.map +1 -0
- package/dist/utils/project-name.js +72 -0
- package/dist/utils/project-name.js.map +1 -0
- package/dist/version-check.d.ts +26 -0
- package/dist/version-check.d.ts.map +1 -0
- package/dist/version-check.js +225 -0
- package/dist/version-check.js.map +1 -0
- package/dist/voice-assistant.d.ts +63 -0
- package/dist/voice-assistant.d.ts.map +1 -0
- package/dist/voice-assistant.js +406 -0
- package/dist/voice-assistant.js.map +1 -0
- package/dist/voice.d.ts +2 -0
- package/dist/voice.d.ts.map +1 -1
- package/dist/voice.js +26 -1
- package/dist/voice.js.map +1 -1
- package/dist/wake-word.d.ts +35 -0
- package/dist/wake-word.d.ts.map +1 -0
- package/dist/wake-word.js +225 -0
- package/dist/wake-word.js.map +1 -0
- package/dist/whisper-server-manager.d.ts +1 -1
- package/dist/whisper-server-manager.js +1 -1
- package/dist/wifi-config.d.ts +24 -0
- package/dist/wifi-config.d.ts.map +1 -0
- package/dist/wifi-config.js +84 -0
- package/dist/wifi-config.js.map +1 -0
- package/dist/ws-server.d.ts +12 -0
- package/dist/ws-server.d.ts.map +1 -1
- package/dist/ws-server.js +81 -3
- package/dist/ws-server.js.map +1 -1
- package/package.json +21 -13
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { WsServer } from '../ws-server.js';
|
|
2
|
+
import type { BridgeEvent } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Context passed to device modules during initialization.
|
|
5
|
+
*/
|
|
6
|
+
export interface BridgeContext {
|
|
7
|
+
port: number;
|
|
8
|
+
authToken: string;
|
|
9
|
+
projectName: string;
|
|
10
|
+
wsServer: WsServer;
|
|
11
|
+
broadcastSse?: (evt: BridgeEvent) => void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Pluggable device module interface.
|
|
15
|
+
* Modules wrap optional device integrations (mDNS, ADB, ESP32 serial, Pixoo).
|
|
16
|
+
*/
|
|
17
|
+
export interface DeviceModule {
|
|
18
|
+
readonly name: string;
|
|
19
|
+
/**
|
|
20
|
+
* Check whether this module should activate.
|
|
21
|
+
* @param config 'auto' = detect, true = force on, false = force off
|
|
22
|
+
*/
|
|
23
|
+
shouldActivate(config: 'auto' | boolean): Promise<boolean>;
|
|
24
|
+
/** Start the module. Called only if shouldActivate returned true. */
|
|
25
|
+
start(ctx: BridgeContext): Promise<void>;
|
|
26
|
+
/** Stop the module and clean up resources. */
|
|
27
|
+
stop(): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Per-module configuration: 'auto' (detect), true (force on), false (force off).
|
|
31
|
+
*/
|
|
32
|
+
export interface ModuleConfigs {
|
|
33
|
+
mdns?: 'auto' | boolean;
|
|
34
|
+
adb?: 'auto' | boolean;
|
|
35
|
+
serial?: 'auto' | boolean;
|
|
36
|
+
pixoo?: 'auto' | boolean;
|
|
37
|
+
d200h?: 'auto' | boolean;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/modules/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;CAC3C;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3D,qEAAqE;IACrE,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzC,8CAA8C;IAC9C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/modules/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface OllamaModel {
|
|
2
|
+
name: string;
|
|
3
|
+
size: number;
|
|
4
|
+
sizeVram: number;
|
|
5
|
+
}
|
|
6
|
+
export interface OllamaStatus {
|
|
7
|
+
available: boolean;
|
|
8
|
+
models: OllamaModel[];
|
|
9
|
+
}
|
|
10
|
+
export declare class OllamaProbe {
|
|
11
|
+
getStatus(): Promise<OllamaStatus>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=ollama-probe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama-probe.d.ts","sourceRoot":"","sources":["../src/ollama-probe.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAID,qBAAa,WAAW;IAChB,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;CAiDzC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { debug } from './logger.js';
|
|
2
|
+
const OLLAMA_BASE = 'http://127.0.0.1:11434';
|
|
3
|
+
export class OllamaProbe {
|
|
4
|
+
async getStatus() {
|
|
5
|
+
try {
|
|
6
|
+
// Installed models via /api/tags — always consistent (no flicker)
|
|
7
|
+
const tagsRes = await fetch(`${OLLAMA_BASE}/api/tags`, {
|
|
8
|
+
signal: AbortSignal.timeout(2000),
|
|
9
|
+
});
|
|
10
|
+
if (!tagsRes.ok) {
|
|
11
|
+
return { available: false, models: [] };
|
|
12
|
+
}
|
|
13
|
+
const tagsData = (await tagsRes.json());
|
|
14
|
+
const installed = tagsData.models ?? [];
|
|
15
|
+
if (installed.length === 0) {
|
|
16
|
+
return { available: true, models: [] };
|
|
17
|
+
}
|
|
18
|
+
// Running models via /api/ps — enrich with VRAM info for loaded models
|
|
19
|
+
let vramMap = new Map();
|
|
20
|
+
try {
|
|
21
|
+
const psRes = await fetch(`${OLLAMA_BASE}/api/ps`, {
|
|
22
|
+
signal: AbortSignal.timeout(3000),
|
|
23
|
+
});
|
|
24
|
+
if (psRes.ok) {
|
|
25
|
+
const psData = (await psRes.json());
|
|
26
|
+
for (const m of psData.models ?? []) {
|
|
27
|
+
if (m.name)
|
|
28
|
+
vramMap.set(m.name, m.size_vram ?? 0);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch { /* ps failure is non-fatal */ }
|
|
33
|
+
const models = installed.map((m) => ({
|
|
34
|
+
name: m.name ?? 'unknown',
|
|
35
|
+
size: m.size ?? 0,
|
|
36
|
+
sizeVram: vramMap.get(m.name ?? '') ?? 0,
|
|
37
|
+
}));
|
|
38
|
+
debug('OllamaProbe', `available, ${models.length} installed model(s), ${vramMap.size} loaded`);
|
|
39
|
+
return { available: true, models };
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return { available: false, models: [] };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=ollama-probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama-probe.js","sourceRoot":"","sources":["../src/ollama-probe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAapC,MAAM,WAAW,GAAG,wBAAwB,CAAC;AAE7C,MAAM,OAAO,WAAW;IACtB,KAAK,CAAC,SAAS;QACb,IAAI,CAAC;YACH,kEAAkE;YAClE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,WAAW,EAAE;gBACrD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;gBAChB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YAC1C,CAAC;YAED,MAAM,QAAQ,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAGlC,CAAC;YAEL,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;YACxC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YACzC,CAAC;YAED,uEAAuE;YACvE,IAAI,OAAO,GAAwB,IAAI,GAAG,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,SAAS,EAAE;oBACjD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;iBAClC,CAAC,CAAC;gBACH,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;oBACb,MAAM,MAAM,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAG9B,CAAC;oBACL,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;wBACpC,IAAI,CAAC,CAAC,IAAI;4BAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;oBACpD,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAC,6BAA6B,CAAC,CAAC;YAEzC,MAAM,MAAM,GAAkB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClD,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,SAAS;gBACzB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;gBACjB,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC;aACzC,CAAC,CAAC,CAAC;YAEJ,KAAK,CAAC,aAAa,EAAE,cAAc,MAAM,CAAC,MAAM,wBAAwB,OAAO,CAAC,IAAI,SAAS,CAAC,CAAC;YAC/F,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAC1C,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode HTTP API client + SSE event subscriber.
|
|
3
|
+
*
|
|
4
|
+
* Connects to an OpenCode server (`opencode serve`) for structured
|
|
5
|
+
* session management, messaging, and real-time event streaming.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
export interface OpenCodeHealthResponse {
|
|
9
|
+
healthy: boolean;
|
|
10
|
+
version: string;
|
|
11
|
+
}
|
|
12
|
+
export interface OpenCodeSessionInfo {
|
|
13
|
+
id: string;
|
|
14
|
+
slug: string;
|
|
15
|
+
projectID: string;
|
|
16
|
+
directory: string;
|
|
17
|
+
title: string;
|
|
18
|
+
version: string;
|
|
19
|
+
summary?: {
|
|
20
|
+
additions: number;
|
|
21
|
+
deletions: number;
|
|
22
|
+
files: number;
|
|
23
|
+
};
|
|
24
|
+
time: {
|
|
25
|
+
created: number;
|
|
26
|
+
updated: number;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export interface OpenCodeSessionStatus {
|
|
30
|
+
type: 'idle' | 'busy';
|
|
31
|
+
}
|
|
32
|
+
export interface OpenCodeTokens {
|
|
33
|
+
total: number;
|
|
34
|
+
input: number;
|
|
35
|
+
output: number;
|
|
36
|
+
reasoning: number;
|
|
37
|
+
cache: {
|
|
38
|
+
read: number;
|
|
39
|
+
write: number;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export interface OpenCodeMessageInfo {
|
|
43
|
+
id: string;
|
|
44
|
+
sessionID: string;
|
|
45
|
+
role: 'user' | 'assistant';
|
|
46
|
+
time: {
|
|
47
|
+
created: number;
|
|
48
|
+
completed?: number;
|
|
49
|
+
};
|
|
50
|
+
modelID?: string;
|
|
51
|
+
providerID?: string;
|
|
52
|
+
cost?: number;
|
|
53
|
+
tokens?: OpenCodeTokens;
|
|
54
|
+
finish?: string;
|
|
55
|
+
agent?: string;
|
|
56
|
+
variant?: string;
|
|
57
|
+
}
|
|
58
|
+
export interface OpenCodeMessagePart {
|
|
59
|
+
id: string;
|
|
60
|
+
sessionID: string;
|
|
61
|
+
messageID: string;
|
|
62
|
+
type: 'step-start' | 'step-finish' | 'text' | 'reasoning' | 'tool';
|
|
63
|
+
snapshot?: string;
|
|
64
|
+
reason?: string;
|
|
65
|
+
cost?: number;
|
|
66
|
+
tokens?: OpenCodeTokens;
|
|
67
|
+
text?: string;
|
|
68
|
+
tool?: string;
|
|
69
|
+
callID?: string;
|
|
70
|
+
state?: {
|
|
71
|
+
status: string;
|
|
72
|
+
input?: Record<string, unknown>;
|
|
73
|
+
output?: string;
|
|
74
|
+
};
|
|
75
|
+
time?: {
|
|
76
|
+
start?: number;
|
|
77
|
+
end?: number;
|
|
78
|
+
};
|
|
79
|
+
metadata?: Record<string, unknown>;
|
|
80
|
+
}
|
|
81
|
+
export interface OpenCodeSSEEvent {
|
|
82
|
+
directory?: string;
|
|
83
|
+
payload: {
|
|
84
|
+
type: string;
|
|
85
|
+
properties: Record<string, unknown>;
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
export declare class OpenCodeClient extends EventEmitter {
|
|
89
|
+
private serverUrl;
|
|
90
|
+
private directory;
|
|
91
|
+
private abortController;
|
|
92
|
+
private reconnectTimer;
|
|
93
|
+
private reconnectDelay;
|
|
94
|
+
private shutdownRequested;
|
|
95
|
+
private static readonly MAX_RECONNECT_DELAY;
|
|
96
|
+
constructor(serverUrl: string, directory: string);
|
|
97
|
+
private headers;
|
|
98
|
+
private get;
|
|
99
|
+
private post;
|
|
100
|
+
health(): Promise<OpenCodeHealthResponse>;
|
|
101
|
+
listSessions(limit?: number): Promise<OpenCodeSessionInfo[]>;
|
|
102
|
+
createSession(title?: string): Promise<OpenCodeSessionInfo>;
|
|
103
|
+
getSession(sessionID: string): Promise<OpenCodeSessionInfo>;
|
|
104
|
+
getSessionStatus(): Promise<Record<string, OpenCodeSessionStatus>>;
|
|
105
|
+
sendMessage(sessionID: string, text: string, options?: {
|
|
106
|
+
model?: string;
|
|
107
|
+
agent?: string;
|
|
108
|
+
}): Promise<{
|
|
109
|
+
info: OpenCodeMessageInfo;
|
|
110
|
+
parts: OpenCodeMessagePart[];
|
|
111
|
+
}>;
|
|
112
|
+
abortSession(sessionID: string): Promise<void>;
|
|
113
|
+
respondPermission(sessionID: string, permissionID: string, response: boolean): Promise<void>;
|
|
114
|
+
replyQuestion(requestID: string, answers: Record<string, string>): Promise<void>;
|
|
115
|
+
rejectQuestion(requestID: string): Promise<void>;
|
|
116
|
+
/**
|
|
117
|
+
* Subscribe to the SSE event stream.
|
|
118
|
+
* Emits 'sse' events with OpenCodeSSEEvent payloads.
|
|
119
|
+
* Auto-reconnects on disconnect.
|
|
120
|
+
*/
|
|
121
|
+
subscribe(): Promise<void>;
|
|
122
|
+
private scheduleReconnect;
|
|
123
|
+
disconnect(): void;
|
|
124
|
+
get url(): string;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=opencode-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-client.d.ts","sourceRoot":"","sources":["../src/opencode-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAOtC,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,YAAY,GAAG,aAAa,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAEnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,cAAc,CAAC;IAExB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAID,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACrC,CAAC;CACH;AAID,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,iBAAiB,CAAS;IAElC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAU;gBAEzC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAShD,OAAO,CAAC,OAAO;YAOD,GAAG;YAaH,IAAI;IAeZ,MAAM,IAAI,OAAO,CAAC,sBAAsB,CAAC;IAIzC,YAAY,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAIxD,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAI3D,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAI3D,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAIlE,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3C,OAAO,CAAC;QAAE,IAAI,EAAE,mBAAmB,CAAC;QAAC,KAAK,EAAE,mBAAmB,EAAE,CAAA;KAAE,CAAC;IAQjE,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,IAAI,CAAC;IAMV,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhF,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtD;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IA4DhC,OAAO,CAAC,iBAAiB;IAezB,UAAU,IAAI,IAAI;IAUlB,IAAI,GAAG,IAAI,MAAM,CAEhB;CACF"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode HTTP API client + SSE event subscriber.
|
|
3
|
+
*
|
|
4
|
+
* Connects to an OpenCode server (`opencode serve`) for structured
|
|
5
|
+
* session management, messaging, and real-time event streaming.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
import { debug } from './logger.js';
|
|
9
|
+
const log = (...args) => debug('opencode:client', ...args);
|
|
10
|
+
// ===== Client =====
|
|
11
|
+
export class OpenCodeClient extends EventEmitter {
|
|
12
|
+
serverUrl;
|
|
13
|
+
directory;
|
|
14
|
+
abortController = null;
|
|
15
|
+
reconnectTimer = null;
|
|
16
|
+
reconnectDelay = 1000;
|
|
17
|
+
shutdownRequested = false;
|
|
18
|
+
static MAX_RECONNECT_DELAY = 30_000;
|
|
19
|
+
constructor(serverUrl, directory) {
|
|
20
|
+
super();
|
|
21
|
+
// Normalize URL (remove trailing slash)
|
|
22
|
+
this.serverUrl = serverUrl.replace(/\/$/, '');
|
|
23
|
+
this.directory = directory;
|
|
24
|
+
}
|
|
25
|
+
// ===== HTTP Helpers =====
|
|
26
|
+
headers() {
|
|
27
|
+
return {
|
|
28
|
+
'Content-Type': 'application/json',
|
|
29
|
+
'x-opencode-directory': this.directory,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
async get(path, params) {
|
|
33
|
+
const url = new URL(path, this.serverUrl);
|
|
34
|
+
if (params) {
|
|
35
|
+
for (const [k, v] of Object.entries(params)) {
|
|
36
|
+
url.searchParams.set(k, v);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
url.searchParams.set('directory', this.directory);
|
|
40
|
+
const resp = await fetch(url.toString(), { headers: this.headers() });
|
|
41
|
+
if (!resp.ok)
|
|
42
|
+
throw new Error(`GET ${path} failed: ${resp.status} ${resp.statusText}`);
|
|
43
|
+
return resp.json();
|
|
44
|
+
}
|
|
45
|
+
async post(path, body) {
|
|
46
|
+
const url = new URL(path, this.serverUrl);
|
|
47
|
+
url.searchParams.set('directory', this.directory);
|
|
48
|
+
const resp = await fetch(url.toString(), {
|
|
49
|
+
method: 'POST',
|
|
50
|
+
headers: this.headers(),
|
|
51
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
52
|
+
});
|
|
53
|
+
if (!resp.ok)
|
|
54
|
+
throw new Error(`POST ${path} failed: ${resp.status} ${resp.statusText}`);
|
|
55
|
+
const text = await resp.text();
|
|
56
|
+
return text ? JSON.parse(text) : undefined;
|
|
57
|
+
}
|
|
58
|
+
// ===== API Methods =====
|
|
59
|
+
async health() {
|
|
60
|
+
return this.get('/global/health');
|
|
61
|
+
}
|
|
62
|
+
async listSessions(limit = 20) {
|
|
63
|
+
return this.get('/session', { limit: String(limit) });
|
|
64
|
+
}
|
|
65
|
+
async createSession(title) {
|
|
66
|
+
return this.post('/session', title ? { title } : {});
|
|
67
|
+
}
|
|
68
|
+
async getSession(sessionID) {
|
|
69
|
+
return this.get(`/session/${sessionID}`);
|
|
70
|
+
}
|
|
71
|
+
async getSessionStatus() {
|
|
72
|
+
return this.get('/session/status');
|
|
73
|
+
}
|
|
74
|
+
async sendMessage(sessionID, text, options) {
|
|
75
|
+
return this.post(`/session/${sessionID}/message`, {
|
|
76
|
+
parts: [{ type: 'text', text }],
|
|
77
|
+
...(options?.model ? { model: options.model } : {}),
|
|
78
|
+
...(options?.agent ? { agent: options.agent } : {}),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async abortSession(sessionID) {
|
|
82
|
+
await this.post(`/session/${sessionID}/abort`);
|
|
83
|
+
}
|
|
84
|
+
async respondPermission(sessionID, permissionID, response) {
|
|
85
|
+
await this.post(`/session/${sessionID}/permissions/${permissionID}`, {
|
|
86
|
+
response: response ? 'allow' : 'deny',
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
async replyQuestion(requestID, answers) {
|
|
90
|
+
await this.post(`/question/${requestID}/reply`, { answers });
|
|
91
|
+
}
|
|
92
|
+
async rejectQuestion(requestID) {
|
|
93
|
+
await this.post(`/question/${requestID}/reject`);
|
|
94
|
+
}
|
|
95
|
+
// ===== SSE Event Stream =====
|
|
96
|
+
/**
|
|
97
|
+
* Subscribe to the SSE event stream.
|
|
98
|
+
* Emits 'sse' events with OpenCodeSSEEvent payloads.
|
|
99
|
+
* Auto-reconnects on disconnect.
|
|
100
|
+
*/
|
|
101
|
+
async subscribe() {
|
|
102
|
+
if (this.shutdownRequested)
|
|
103
|
+
return;
|
|
104
|
+
this.abortController?.abort();
|
|
105
|
+
this.abortController = new AbortController();
|
|
106
|
+
const url = new URL('/global/event', this.serverUrl);
|
|
107
|
+
url.searchParams.set('directory', this.directory);
|
|
108
|
+
try {
|
|
109
|
+
const resp = await fetch(url.toString(), {
|
|
110
|
+
headers: { Accept: 'text/event-stream' },
|
|
111
|
+
signal: this.abortController.signal,
|
|
112
|
+
});
|
|
113
|
+
if (!resp.ok || !resp.body) {
|
|
114
|
+
throw new Error(`SSE connect failed: ${resp.status}`);
|
|
115
|
+
}
|
|
116
|
+
// Reset reconnect delay on successful connection
|
|
117
|
+
this.reconnectDelay = 1000;
|
|
118
|
+
log('SSE connected to', this.serverUrl);
|
|
119
|
+
const reader = resp.body.getReader();
|
|
120
|
+
const decoder = new TextDecoder();
|
|
121
|
+
let buffer = '';
|
|
122
|
+
while (!this.shutdownRequested) {
|
|
123
|
+
const { done, value } = await reader.read();
|
|
124
|
+
if (done)
|
|
125
|
+
break;
|
|
126
|
+
buffer += decoder.decode(value, { stream: true });
|
|
127
|
+
const lines = buffer.split('\n');
|
|
128
|
+
buffer = lines.pop() ?? '';
|
|
129
|
+
for (const line of lines) {
|
|
130
|
+
if (!line.startsWith('data: '))
|
|
131
|
+
continue;
|
|
132
|
+
const jsonStr = line.slice(6).trim();
|
|
133
|
+
if (!jsonStr)
|
|
134
|
+
continue;
|
|
135
|
+
try {
|
|
136
|
+
const event = JSON.parse(jsonStr);
|
|
137
|
+
this.emit('sse', event);
|
|
138
|
+
}
|
|
139
|
+
catch (e) {
|
|
140
|
+
log('SSE parse error:', e);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
if (this.shutdownRequested)
|
|
147
|
+
return;
|
|
148
|
+
if (err instanceof Error && err.name === 'AbortError')
|
|
149
|
+
return;
|
|
150
|
+
log('SSE error:', err);
|
|
151
|
+
}
|
|
152
|
+
// Schedule reconnect
|
|
153
|
+
if (!this.shutdownRequested) {
|
|
154
|
+
this.scheduleReconnect();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
scheduleReconnect() {
|
|
158
|
+
if (this.reconnectTimer)
|
|
159
|
+
return;
|
|
160
|
+
log(`SSE reconnecting in ${this.reconnectDelay}ms`);
|
|
161
|
+
this.reconnectTimer = setTimeout(() => {
|
|
162
|
+
this.reconnectTimer = null;
|
|
163
|
+
this.subscribe().catch((err) => log('SSE reconnect failed:', err));
|
|
164
|
+
}, this.reconnectDelay);
|
|
165
|
+
this.reconnectDelay = Math.min(this.reconnectDelay * 2, OpenCodeClient.MAX_RECONNECT_DELAY);
|
|
166
|
+
}
|
|
167
|
+
// ===== Lifecycle =====
|
|
168
|
+
disconnect() {
|
|
169
|
+
this.shutdownRequested = true;
|
|
170
|
+
if (this.reconnectTimer) {
|
|
171
|
+
clearTimeout(this.reconnectTimer);
|
|
172
|
+
this.reconnectTimer = null;
|
|
173
|
+
}
|
|
174
|
+
this.abortController?.abort();
|
|
175
|
+
this.abortController = null;
|
|
176
|
+
}
|
|
177
|
+
get url() {
|
|
178
|
+
return this.serverUrl;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=opencode-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-client.js","sourceRoot":"","sources":["../src/opencode-client.ts"],"names":[],"mappings":"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"}
|
package/dist/output-parser.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export declare class OutputParser extends EventEmitter {
|
|
|
7
7
|
private optionTimer;
|
|
8
8
|
private projectName;
|
|
9
9
|
private modelName;
|
|
10
|
+
private effortLevel;
|
|
10
11
|
private seenFirstIdle;
|
|
11
12
|
private pendingModeSwitch;
|
|
12
13
|
private modeSwitchTimer;
|
|
@@ -31,6 +32,7 @@ export declare class OutputParser extends EventEmitter {
|
|
|
31
32
|
private parseRemoteUrl;
|
|
32
33
|
private parseProjectName;
|
|
33
34
|
private parseModelInfo;
|
|
35
|
+
private parseEffortLevel;
|
|
34
36
|
private parseUserPrompt;
|
|
35
37
|
private parseUsageInfo;
|
|
36
38
|
private parseModeSwitchLine;
|
|
@@ -60,6 +62,7 @@ export declare class OutputParser extends EventEmitter {
|
|
|
60
62
|
private resetInteractiveCooldown;
|
|
61
63
|
getProjectName(): string | null;
|
|
62
64
|
getModelName(): string | null;
|
|
65
|
+
getEffortLevel(): string | null;
|
|
63
66
|
reset(): void;
|
|
64
67
|
}
|
|
65
68
|
//# sourceMappingURL=output-parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output-parser.d.ts","sourceRoot":"","sources":["../src/output-parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"output-parser.d.ts","sourceRoot":"","sources":["../src/output-parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AA+HtC,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,WAAW,CAA8C;IACjE,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,WAAW,CAAuB;IAG1C,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,eAAe,CAA8C;IAErE,OAAO,CAAC,oBAAoB,CAA8C;IAC1E,OAAO,CAAC,mBAAmB,CAAuB;IAElD,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,WAAW,CAAM;IAGzB,OAAO,CAAC,mBAAmB,CAA8C;IACzE,OAAO,CAAC,SAAS,CAAuB;IAExC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAqB3B,OAAO,CAAC,WAAW;IA8BnB,0FAA0F;IAC1F,OAAO,CAAC,eAAe;IAqEvB,wDAAwD;IACxD,OAAO,CAAC,kBAAkB;IAgE1B,6CAA6C;IAC7C,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,cAAc;IA8RtB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,cAAc;IA+BtB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,eAAe;IA6BvB,OAAO,CAAC,cAAc;IAuCtB,OAAO,CAAC,mBAAmB;IAmB3B,iFAAiF;IACjF,oBAAoB,IAAI,IAAI;IAa5B,sEAAsE;IACtE,OAAO,CAAC,sBAAsB;IAuB9B,8DAA8D;IAC9D,OAAO,CAAC,gBAAgB;IAoBxB,qDAAqD;IACrD,OAAO,CAAC,aAAa;IAYrB,+FAA+F;IAC/F,OAAO,CAAC,mBAAmB;IAK3B,oFAAoF;IACpF,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,YAAY;IAmIpB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAwDxB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,gBAAgB;IAIxB,kGAAkG;IAClG,wBAAwB,IAAI,IAAI;IAOhC,OAAO,CAAC,wBAAwB;IAIhC,cAAc,IAAI,MAAM,GAAG,IAAI;IAC/B,YAAY,IAAI,MAAM,GAAG,IAAI;IAC7B,cAAc,IAAI,MAAM,GAAG,IAAI;IAE/B,KAAK,IAAI,IAAI;CAyBd"}
|
package/dist/output-parser.js
CHANGED
|
@@ -44,7 +44,13 @@ const MODE_ACCEPT = /⏵⏵?\s*accept\s*edits?\s*on/i;
|
|
|
44
44
|
const MODE_DEFAULT = /\?\s*for\s*shortcuts/;
|
|
45
45
|
// Model info line: "Sonnet 4.6 · Claude Max" or "Claude 4 Sonnet (id) · api.anthropic.com"
|
|
46
46
|
// ANSI stripping can remove inter-word spaces (e.g. "Opus4.6·ClaudeMax")
|
|
47
|
-
const MODEL_INFO = /((?:Opus|Sonnet|Haiku)\
|
|
47
|
+
const MODEL_INFO = /((?:Opus|Sonnet|Haiku)[ \t]*[\d.]+|Claude[ \t]*[\d.]+[ \t]*(?:Opus|Sonnet|Haiku))(?:[ \t]*(?:\([^)]+\))?[ \t]*[·•][ \t]*(.+))?/i;
|
|
48
|
+
// Effort level: "/model" UI shows "High effort ← → to adjust" during selection
|
|
49
|
+
// and "with high effort" in the confirmation line.
|
|
50
|
+
// Claude Code 2.1+ adds per-model variants: Opus 4.7 exposes default/max/xhigh/
|
|
51
|
+
// high/medium/low; Opus 4.6 adds "fast". Older builds only had high/medium/low.
|
|
52
|
+
// Keep the whitelist explicit so unrelated "<word> effort" phrases don't match.
|
|
53
|
+
const EFFORT_LEVEL = /\b(max|xhigh|high|medium|low|default|fast)\s+effort\b/i;
|
|
48
54
|
const SPINNER_DEBOUNCE_MS = 2000;
|
|
49
55
|
const IDLE_DEBOUNCE_MS = 300;
|
|
50
56
|
const OPTION_DEBOUNCE_MS = 150;
|
|
@@ -113,6 +119,7 @@ export class OutputParser extends EventEmitter {
|
|
|
113
119
|
optionTimer = null;
|
|
114
120
|
projectName = null;
|
|
115
121
|
modelName = null;
|
|
122
|
+
effortLevel = null;
|
|
116
123
|
// Don't trigger spinner until we've seen the first idle prompt
|
|
117
124
|
// This prevents Claude's startup banner (which contains ✻) from falsely triggering PROCESSING
|
|
118
125
|
seenFirstIdle = false;
|
|
@@ -331,6 +338,7 @@ export class OutputParser extends EventEmitter {
|
|
|
331
338
|
// like "Opus 4.6" match MODEL_INFO and overwrite the real model name
|
|
332
339
|
if (!OPTION_NUMBERED.test(chunk)) {
|
|
333
340
|
this.parseModelInfo(chunk);
|
|
341
|
+
this.parseEffortLevel(chunk);
|
|
334
342
|
}
|
|
335
343
|
this.parseUserPrompt(chunk);
|
|
336
344
|
this.parseUsageInfo(chunk);
|
|
@@ -505,7 +513,11 @@ export class OutputParser extends EventEmitter {
|
|
|
505
513
|
// "❯ \n" → nonWs "❯" (idle), "❯ No" → nonWs "❯No" (cursor move over option)
|
|
506
514
|
const nonWsContent = chunk.replace(/\s/g, '');
|
|
507
515
|
const isGenuineIdle = hasIdlePrompt && (nonWsContent === '❯' || nonWsContent === '>');
|
|
508
|
-
|
|
516
|
+
// Bare idle prompt line: "❯ " (+ whitespace) on its own line within a larger chunk.
|
|
517
|
+
// Catches combined chunks where confirmation text precedes the idle prompt,
|
|
518
|
+
// e.g. "Set model to Default...\n\n❯ \n" from /model selection.
|
|
519
|
+
const hasBareIdlePrompt = /^[❯>][ \t\u00A0]+$/m.test(chunk);
|
|
520
|
+
if (!isGenuineIdle && !hasBareIdlePrompt) {
|
|
509
521
|
debug('Parser', 'cursor-only redraw detected — debouncing buffer re-parse');
|
|
510
522
|
this.resetIdleTimer();
|
|
511
523
|
this.resetOptionTimer();
|
|
@@ -530,9 +542,10 @@ export class OutputParser extends EventEmitter {
|
|
|
530
542
|
}, OPTION_DEBOUNCE_MS);
|
|
531
543
|
return;
|
|
532
544
|
}
|
|
533
|
-
// Genuine idle prompt
|
|
545
|
+
// Genuine idle prompt or bare idle line — clear navigable state, fall through
|
|
534
546
|
this.lastNavigableEmit = false;
|
|
535
547
|
this.lastCursorIndex = 0;
|
|
548
|
+
this.resetOptionTimer(); // cancel stale timer from ANSI reposition handler
|
|
536
549
|
}
|
|
537
550
|
// --- Cursor-only ANSI repositioning (no ❯ in chunk) ---
|
|
538
551
|
// ink may reposition cursor via ANSI sequences without rewriting ❯ character.
|
|
@@ -660,6 +673,17 @@ export class OutputParser extends EventEmitter {
|
|
|
660
673
|
}
|
|
661
674
|
}
|
|
662
675
|
}
|
|
676
|
+
parseEffortLevel(chunk) {
|
|
677
|
+
const match = chunk.match(EFFORT_LEVEL);
|
|
678
|
+
if (match && match[1]) {
|
|
679
|
+
const level = match[1].toLowerCase();
|
|
680
|
+
if (level !== this.effortLevel) {
|
|
681
|
+
this.effortLevel = level;
|
|
682
|
+
debug('Parser', `effort_level: ${level}`);
|
|
683
|
+
this.emit('effort_level', { level });
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
}
|
|
663
687
|
parseUserPrompt(chunk) {
|
|
664
688
|
// Don't match prompts before first idle — startup banner contains "❯ Try ..." suggestions
|
|
665
689
|
if (!this.seenFirstIdle)
|
|
@@ -1061,6 +1085,7 @@ export class OutputParser extends EventEmitter {
|
|
|
1061
1085
|
}
|
|
1062
1086
|
getProjectName() { return this.projectName; }
|
|
1063
1087
|
getModelName() { return this.modelName; }
|
|
1088
|
+
getEffortLevel() { return this.effortLevel; }
|
|
1064
1089
|
reset() {
|
|
1065
1090
|
this.buffer = '';
|
|
1066
1091
|
this.pendingAnsi = '';
|
|
@@ -1069,6 +1094,7 @@ export class OutputParser extends EventEmitter {
|
|
|
1069
1094
|
this.pendingModeSwitch = false;
|
|
1070
1095
|
this.projectName = null;
|
|
1071
1096
|
this.modelName = null;
|
|
1097
|
+
this.effortLevel = null;
|
|
1072
1098
|
this.lastSuggestedPrompt = null;
|
|
1073
1099
|
this.lastNavigableEmit = false;
|
|
1074
1100
|
this.lastCursorIndex = 0;
|