@agentdeck/bridge 0.2.2 → 1.0.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/assets/fm-helper/agentdeck-fm-helper +0 -0
- package/assets/fonts/IBMPlexSans-Bold.ttf +0 -0
- package/assets/fonts/IBMPlexSans-Regular.ttf +0 -0
- package/assets/fonts/JetBrainsMono-Bold.ttf +0 -0
- package/assets/fonts/JetBrainsMono-Regular.ttf +0 -0
- package/assets/fonts/LICENSES.md +22 -0
- package/dist/adapters/claude-code.d.ts +6 -0
- package/dist/adapters/claude-code.d.ts.map +1 -1
- package/dist/adapters/claude-code.js +8 -0
- package/dist/adapters/claude-code.js.map +1 -1
- package/dist/adapters/openclaw.d.ts +24 -0
- package/dist/adapters/openclaw.d.ts.map +1 -1
- package/dist/adapters/openclaw.js +291 -35
- package/dist/adapters/openclaw.js.map +1 -1
- package/dist/adapters/opencode-adapter.d.ts +59 -0
- package/dist/adapters/opencode-adapter.d.ts.map +1 -1
- package/dist/adapters/opencode-adapter.js +297 -35
- package/dist/adapters/opencode-adapter.js.map +1 -1
- package/dist/adb-reverse.d.ts +1 -1
- package/dist/adb-reverse.js +1 -1
- package/dist/antigravity-local.d.ts +1 -0
- package/dist/antigravity-local.d.ts.map +1 -1
- package/dist/antigravity-local.js +33 -0
- package/dist/antigravity-local.js.map +1 -1
- package/dist/apme/adapters/claude-hook.d.ts.map +1 -1
- package/dist/apme/adapters/claude-hook.js +5 -0
- package/dist/apme/adapters/claude-hook.js.map +1 -1
- package/dist/apme/adapters/codex-hook.d.ts +17 -0
- package/dist/apme/adapters/codex-hook.d.ts.map +1 -0
- package/dist/apme/adapters/codex-hook.js +95 -0
- package/dist/apme/adapters/codex-hook.js.map +1 -0
- package/dist/apme/adapters/codex-turn-manager.d.ts +86 -0
- package/dist/apme/adapters/codex-turn-manager.d.ts.map +1 -0
- package/dist/apme/adapters/codex-turn-manager.js +496 -0
- package/dist/apme/adapters/codex-turn-manager.js.map +1 -0
- package/dist/apme/adapters/openclaw-hook.d.ts +99 -0
- package/dist/apme/adapters/openclaw-hook.d.ts.map +1 -0
- package/dist/apme/adapters/openclaw-hook.js +234 -0
- package/dist/apme/adapters/openclaw-hook.js.map +1 -0
- package/dist/apme/adapters/opencode-hook.d.ts +56 -0
- package/dist/apme/adapters/opencode-hook.d.ts.map +1 -0
- package/dist/apme/adapters/opencode-hook.js +182 -0
- package/dist/apme/adapters/opencode-hook.js.map +1 -0
- package/dist/apme/adapters/timeline.d.ts.map +1 -1
- package/dist/apme/adapters/timeline.js +6 -1
- package/dist/apme/adapters/timeline.js.map +1 -1
- package/dist/apme/antigravity-transcript.d.ts +18 -0
- package/dist/apme/antigravity-transcript.d.ts.map +1 -0
- package/dist/apme/antigravity-transcript.js +94 -0
- package/dist/apme/antigravity-transcript.js.map +1 -0
- package/dist/apme/classify-turn.d.ts +13 -0
- package/dist/apme/classify-turn.d.ts.map +1 -0
- package/dist/apme/classify-turn.js +49 -0
- package/dist/apme/classify-turn.js.map +1 -0
- package/dist/apme/claude-transcript-reader.d.ts +10 -0
- package/dist/apme/claude-transcript-reader.d.ts.map +1 -1
- package/dist/apme/claude-transcript-reader.js +35 -0
- package/dist/apme/claude-transcript-reader.js.map +1 -1
- package/dist/apme/collector.d.ts +133 -6
- package/dist/apme/collector.d.ts.map +1 -1
- package/dist/apme/collector.js +471 -23
- package/dist/apme/collector.js.map +1 -1
- package/dist/apme/dashboard-html.d.ts.map +1 -1
- package/dist/apme/dashboard-html.js +117 -11
- package/dist/apme/dashboard-html.js.map +1 -1
- package/dist/apme/http.d.ts.map +1 -1
- package/dist/apme/http.js +52 -6
- package/dist/apme/http.js.map +1 -1
- package/dist/apme/index.d.ts +26 -5
- package/dist/apme/index.d.ts.map +1 -1
- package/dist/apme/index.js +146 -9
- package/dist/apme/index.js.map +1 -1
- package/dist/apme/judge-detect.d.ts +26 -0
- package/dist/apme/judge-detect.d.ts.map +1 -0
- package/dist/apme/judge-detect.js +69 -0
- package/dist/apme/judge-detect.js.map +1 -0
- package/dist/apme/pareto.d.ts +39 -0
- package/dist/apme/pareto.d.ts.map +1 -0
- package/dist/apme/pareto.js +59 -0
- package/dist/apme/pareto.js.map +1 -0
- package/dist/apme/recommend.d.ts +3 -0
- package/dist/apme/recommend.d.ts.map +1 -1
- package/dist/apme/recommend.js +43 -1
- package/dist/apme/recommend.js.map +1 -1
- package/dist/apme/runner.d.ts +99 -4
- package/dist/apme/runner.d.ts.map +1 -1
- package/dist/apme/runner.js +743 -72
- package/dist/apme/runner.js.map +1 -1
- package/dist/apme/sample-to-timeline.d.ts +26 -0
- package/dist/apme/sample-to-timeline.d.ts.map +1 -0
- package/dist/apme/sample-to-timeline.js +95 -0
- package/dist/apme/sample-to-timeline.js.map +1 -0
- package/dist/apme/scorers/index.d.ts +47 -0
- package/dist/apme/scorers/index.d.ts.map +1 -0
- package/dist/apme/scorers/index.js +96 -0
- package/dist/apme/scorers/index.js.map +1 -0
- package/dist/apme/settings.d.ts +17 -11
- package/dist/apme/settings.d.ts.map +1 -1
- package/dist/apme/settings.js +30 -9
- package/dist/apme/settings.js.map +1 -1
- package/dist/apme/store.d.ts +33 -1
- package/dist/apme/store.d.ts.map +1 -1
- package/dist/apme/store.js +334 -25
- package/dist/apme/store.js.map +1 -1
- package/dist/awaiting-overlay.d.ts +112 -0
- package/dist/awaiting-overlay.d.ts.map +1 -0
- package/dist/awaiting-overlay.js +179 -0
- package/dist/awaiting-overlay.js.map +1 -0
- package/dist/ble-sync-spawn.d.ts +63 -0
- package/dist/ble-sync-spawn.d.ts.map +1 -0
- package/dist/ble-sync-spawn.js +196 -0
- package/dist/ble-sync-spawn.js.map +1 -0
- package/dist/bridge-core.d.ts +34 -1
- package/dist/bridge-core.d.ts.map +1 -1
- package/dist/bridge-core.js +207 -24
- package/dist/bridge-core.js.map +1 -1
- package/dist/broadcast.d.ts +3 -0
- package/dist/broadcast.d.ts.map +1 -0
- package/dist/broadcast.js +122 -0
- package/dist/broadcast.js.map +1 -0
- package/dist/check-deps.d.ts.map +1 -1
- package/dist/check-deps.js +25 -9
- package/dist/check-deps.js.map +1 -1
- package/dist/claude-permission-rules.d.ts +55 -0
- package/dist/claude-permission-rules.d.ts.map +1 -0
- package/dist/claude-permission-rules.js +197 -0
- package/dist/claude-permission-rules.js.map +1 -0
- package/dist/cli.d.ts +15 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1030 -93
- package/dist/cli.js.map +1 -1
- package/dist/codex-auth.d.ts +21 -0
- package/dist/codex-auth.d.ts.map +1 -1
- package/dist/codex-auth.js +52 -1
- package/dist/codex-auth.js.map +1 -1
- package/dist/codex-output-parser.d.ts +8 -0
- package/dist/codex-output-parser.d.ts.map +1 -1
- package/dist/codex-output-parser.js +110 -25
- package/dist/codex-output-parser.js.map +1 -1
- package/dist/codex-rate-limits.d.ts +16 -0
- package/dist/codex-rate-limits.d.ts.map +1 -0
- package/dist/codex-rate-limits.js +197 -0
- package/dist/codex-rate-limits.js.map +1 -0
- package/dist/codex-rollout-response.d.ts +31 -0
- package/dist/codex-rollout-response.d.ts.map +1 -0
- package/dist/codex-rollout-response.js +135 -0
- package/dist/codex-rollout-response.js.map +1 -0
- package/dist/d200h/image-renderer.d.ts +4 -16
- package/dist/d200h/image-renderer.d.ts.map +1 -1
- package/dist/d200h/image-renderer.js +46 -212
- package/dist/d200h/image-renderer.js.map +1 -1
- package/dist/daemon-server.d.ts +85 -0
- package/dist/daemon-server.d.ts.map +1 -1
- package/dist/daemon-server.js +1975 -159
- package/dist/daemon-server.js.map +1 -1
- package/dist/daemon.js +15 -6
- package/dist/daemon.js.map +1 -1
- package/dist/display-dim.d.ts +9 -0
- package/dist/display-dim.d.ts.map +1 -0
- package/dist/display-dim.js +53 -0
- package/dist/display-dim.js.map +1 -0
- package/dist/display-monitor.d.ts +15 -2
- package/dist/display-monitor.d.ts.map +1 -1
- package/dist/display-monitor.js +104 -26
- package/dist/display-monitor.js.map +1 -1
- package/dist/esp32-serial.d.ts +190 -1
- package/dist/esp32-serial.d.ts.map +1 -1
- package/dist/esp32-serial.js +1090 -156
- package/dist/esp32-serial.js.map +1 -1
- package/dist/fallback-task-timeline.d.ts +42 -0
- package/dist/fallback-task-timeline.d.ts.map +1 -0
- package/dist/fallback-task-timeline.js +119 -0
- package/dist/fallback-task-timeline.js.map +1 -0
- package/dist/foundation-models-helper.d.ts +11 -0
- package/dist/foundation-models-helper.d.ts.map +1 -0
- package/dist/foundation-models-helper.js +241 -0
- package/dist/foundation-models-helper.js.map +1 -0
- package/dist/hook-migration.js +1 -1
- package/dist/hook-migration.js.map +1 -1
- package/dist/hook-server.d.ts +2 -3
- package/dist/hook-server.d.ts.map +1 -1
- package/dist/hook-server.js +23 -10
- package/dist/hook-server.js.map +1 -1
- package/dist/idotmatrix/idotmatrix-daemon-sync.d.ts +33 -0
- package/dist/idotmatrix/idotmatrix-daemon-sync.d.ts.map +1 -0
- package/dist/idotmatrix/idotmatrix-daemon-sync.js +164 -0
- package/dist/idotmatrix/idotmatrix-daemon-sync.js.map +1 -0
- package/dist/idotmatrix/idotmatrix-discover.d.ts +18 -0
- package/dist/idotmatrix/idotmatrix-discover.d.ts.map +1 -0
- package/dist/idotmatrix/idotmatrix-discover.js +85 -0
- package/dist/idotmatrix/idotmatrix-discover.js.map +1 -0
- package/dist/idotmatrix/idotmatrix-settings.d.ts +20 -0
- package/dist/idotmatrix/idotmatrix-settings.d.ts.map +1 -0
- package/dist/idotmatrix/idotmatrix-settings.js +57 -0
- package/dist/idotmatrix/idotmatrix-settings.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +217 -179
- package/dist/index.js.map +1 -1
- package/dist/log-stream.d.ts +15 -16
- package/dist/log-stream.d.ts.map +1 -1
- package/dist/log-stream.js +18 -96
- package/dist/log-stream.js.map +1 -1
- package/dist/logger.d.ts +3 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +18 -5
- package/dist/logger.js.map +1 -1
- package/dist/mdns.d.ts +17 -0
- package/dist/mdns.d.ts.map +1 -1
- package/dist/mdns.js +52 -18
- package/dist/mdns.js.map +1 -1
- package/dist/model-catalog.d.ts +1 -1
- package/dist/model-catalog.d.ts.map +1 -1
- package/dist/model-catalog.js +2 -4
- package/dist/model-catalog.js.map +1 -1
- package/dist/modules/adb-module.d.ts +1 -1
- package/dist/modules/adb-module.d.ts.map +1 -1
- package/dist/modules/adb-module.js +4 -3
- package/dist/modules/adb-module.js.map +1 -1
- package/dist/modules/broadcast-module.d.ts +17 -0
- package/dist/modules/broadcast-module.d.ts.map +1 -0
- package/dist/modules/broadcast-module.js +26 -0
- package/dist/modules/broadcast-module.js.map +1 -0
- package/dist/modules/d200h-module.d.ts +22 -0
- package/dist/modules/d200h-module.d.ts.map +1 -1
- package/dist/modules/d200h-module.js +200 -65
- package/dist/modules/d200h-module.js.map +1 -1
- package/dist/modules/idotmatrix-module.d.ts +9 -0
- package/dist/modules/idotmatrix-module.d.ts.map +1 -0
- package/dist/modules/idotmatrix-module.js +46 -0
- package/dist/modules/idotmatrix-module.js.map +1 -0
- package/dist/modules/index.d.ts +3 -1
- package/dist/modules/index.d.ts.map +1 -1
- package/dist/modules/index.js +9 -3
- package/dist/modules/index.js.map +1 -1
- package/dist/modules/pixoo-module.d.ts.map +1 -1
- package/dist/modules/pixoo-module.js +14 -4
- package/dist/modules/pixoo-module.js.map +1 -1
- package/dist/modules/serial-module.d.ts +4 -0
- package/dist/modules/serial-module.d.ts.map +1 -1
- package/dist/modules/serial-module.js +14 -12
- package/dist/modules/serial-module.js.map +1 -1
- package/dist/modules/timebox-module.d.ts +9 -0
- package/dist/modules/timebox-module.d.ts.map +1 -0
- package/dist/modules/timebox-module.js +46 -0
- package/dist/modules/timebox-module.js.map +1 -0
- package/dist/modules/trmnl-module.d.ts +38 -0
- package/dist/modules/trmnl-module.d.ts.map +1 -0
- package/dist/modules/trmnl-module.js +111 -0
- package/dist/modules/trmnl-module.js.map +1 -0
- package/dist/modules/types.d.ts +4 -2
- package/dist/modules/types.d.ts.map +1 -1
- package/dist/observed-steering.d.ts +93 -0
- package/dist/observed-steering.d.ts.map +1 -0
- package/dist/observed-steering.js +247 -0
- package/dist/observed-steering.js.map +1 -0
- package/dist/openclaw-session.d.ts +18 -0
- package/dist/openclaw-session.d.ts.map +1 -0
- package/dist/openclaw-session.js +34 -0
- package/dist/openclaw-session.js.map +1 -0
- package/dist/opencode-steering.d.ts +36 -0
- package/dist/opencode-steering.d.ts.map +1 -0
- package/dist/opencode-steering.js +84 -0
- package/dist/opencode-steering.js.map +1 -0
- package/dist/output-parser.d.ts +30 -0
- package/dist/output-parser.d.ts.map +1 -1
- package/dist/output-parser.js +172 -18
- package/dist/output-parser.js.map +1 -1
- package/dist/passive-observer.d.ts +32 -0
- package/dist/passive-observer.d.ts.map +1 -1
- package/dist/passive-observer.js +288 -49
- package/dist/passive-observer.js.map +1 -1
- package/dist/permission-resolver.d.ts +55 -0
- package/dist/permission-resolver.d.ts.map +1 -0
- package/dist/permission-resolver.js +112 -0
- package/dist/permission-resolver.js.map +1 -0
- package/dist/pixoo/micro-glyphs.d.ts +18 -0
- package/dist/pixoo/micro-glyphs.d.ts.map +1 -0
- package/dist/pixoo/micro-glyphs.js +143 -0
- package/dist/pixoo/micro-glyphs.js.map +1 -0
- package/dist/pixoo/official-dot-glyphs.generated.d.ts +8 -0
- package/dist/pixoo/official-dot-glyphs.generated.d.ts.map +1 -0
- package/dist/pixoo/official-dot-glyphs.generated.js +247 -0
- package/dist/pixoo/official-dot-glyphs.generated.js.map +1 -0
- package/dist/pixoo/pixoo-bridge.d.ts +16 -8
- package/dist/pixoo/pixoo-bridge.d.ts.map +1 -1
- package/dist/pixoo/pixoo-bridge.js +127 -35
- package/dist/pixoo/pixoo-bridge.js.map +1 -1
- package/dist/pixoo/pixoo-camera.d.ts +19 -3
- package/dist/pixoo/pixoo-camera.d.ts.map +1 -1
- package/dist/pixoo/pixoo-camera.js +62 -27
- package/dist/pixoo/pixoo-camera.js.map +1 -1
- package/dist/pixoo/pixoo-client.d.ts +13 -3
- package/dist/pixoo/pixoo-client.d.ts.map +1 -1
- package/dist/pixoo/pixoo-client.js +51 -22
- package/dist/pixoo/pixoo-client.js.map +1 -1
- package/dist/pixoo/pixoo-discover.d.ts +37 -0
- package/dist/pixoo/pixoo-discover.d.ts.map +1 -0
- package/dist/pixoo/pixoo-discover.js +105 -0
- package/dist/pixoo/pixoo-discover.js.map +1 -0
- package/dist/pixoo/pixoo-renderer.d.ts +27 -3
- package/dist/pixoo/pixoo-renderer.d.ts.map +1 -1
- package/dist/pixoo/pixoo-renderer.js +533 -135
- package/dist/pixoo/pixoo-renderer.js.map +1 -1
- package/dist/pixoo/pixoo-settings.d.ts +6 -0
- package/dist/pixoo/pixoo-settings.d.ts.map +1 -1
- package/dist/pixoo/pixoo-settings.js +9 -0
- package/dist/pixoo/pixoo-settings.js.map +1 -1
- package/dist/pixoo/pixoo-sprites.d.ts +84 -11
- package/dist/pixoo/pixoo-sprites.d.ts.map +1 -1
- package/dist/pixoo/pixoo-sprites.js +620 -209
- package/dist/pixoo/pixoo-sprites.js.map +1 -1
- package/dist/pty-manager.d.ts.map +1 -1
- package/dist/pty-manager.js +8 -2
- package/dist/pty-manager.js.map +1 -1
- package/dist/review-runner.d.ts +113 -0
- package/dist/review-runner.d.ts.map +1 -0
- package/dist/review-runner.js +428 -0
- package/dist/review-runner.js.map +1 -0
- package/dist/session-activity.d.ts +14 -0
- package/dist/session-activity.d.ts.map +1 -0
- package/dist/session-activity.js +160 -0
- package/dist/session-activity.js.map +1 -0
- package/dist/session-aggregator.d.ts +25 -0
- package/dist/session-aggregator.d.ts.map +1 -1
- package/dist/session-aggregator.js +48 -9
- package/dist/session-aggregator.js.map +1 -1
- package/dist/session-focus-relay.d.ts.map +1 -1
- package/dist/session-focus-relay.js +7 -1
- package/dist/session-focus-relay.js.map +1 -1
- package/dist/session-registry.d.ts +74 -3
- package/dist/session-registry.d.ts.map +1 -1
- package/dist/session-registry.js +140 -8
- package/dist/session-registry.js.map +1 -1
- package/dist/session-timeline-relay.d.ts.map +1 -1
- package/dist/session-timeline-relay.js +13 -4
- package/dist/session-timeline-relay.js.map +1 -1
- package/dist/session-transcript-timeline.d.ts +49 -0
- package/dist/session-transcript-timeline.d.ts.map +1 -0
- package/dist/session-transcript-timeline.js +276 -0
- package/dist/session-transcript-timeline.js.map +1 -0
- package/dist/state-machine.d.ts +6 -1
- package/dist/state-machine.d.ts.map +1 -1
- package/dist/state-machine.js +86 -28
- package/dist/state-machine.js.map +1 -1
- package/dist/timebox/timebox-daemon-sync.d.ts +19 -0
- package/dist/timebox/timebox-daemon-sync.d.ts.map +1 -0
- package/dist/timebox/timebox-daemon-sync.js +135 -0
- package/dist/timebox/timebox-daemon-sync.js.map +1 -0
- package/dist/timebox/timebox-discover.d.ts +19 -0
- package/dist/timebox/timebox-discover.d.ts.map +1 -0
- package/dist/timebox/timebox-discover.js +87 -0
- package/dist/timebox/timebox-discover.js.map +1 -0
- package/dist/timebox/timebox-settings.d.ts +32 -0
- package/dist/timebox/timebox-settings.d.ts.map +1 -0
- package/dist/timebox/timebox-settings.js +80 -0
- package/dist/timebox/timebox-settings.js.map +1 -0
- package/dist/timeline-store.d.ts +112 -3
- package/dist/timeline-store.d.ts.map +1 -1
- package/dist/timeline-store.js +460 -14
- package/dist/timeline-store.js.map +1 -1
- package/dist/timeline-summarizer.d.ts.map +1 -1
- package/dist/timeline-summarizer.js +29 -5
- package/dist/timeline-summarizer.js.map +1 -1
- package/dist/trmnl/byos-server.d.ts +39 -0
- package/dist/trmnl/byos-server.d.ts.map +1 -0
- package/dist/trmnl/byos-server.js +301 -0
- package/dist/trmnl/byos-server.js.map +1 -0
- package/dist/trmnl/frame-cache.d.ts +37 -0
- package/dist/trmnl/frame-cache.d.ts.map +1 -0
- package/dist/trmnl/frame-cache.js +157 -0
- package/dist/trmnl/frame-cache.js.map +1 -0
- package/dist/trmnl/image-renderer.d.ts +27 -0
- package/dist/trmnl/image-renderer.d.ts.map +1 -0
- package/dist/trmnl/image-renderer.js +235 -0
- package/dist/trmnl/image-renderer.js.map +1 -0
- package/dist/trmnl/trmnl-settings.d.ts +96 -0
- package/dist/trmnl/trmnl-settings.d.ts.map +1 -0
- package/dist/trmnl/trmnl-settings.js +177 -0
- package/dist/trmnl/trmnl-settings.js.map +1 -0
- package/dist/trmnl/trmnl-telemetry.d.ts +47 -0
- package/dist/trmnl/trmnl-telemetry.d.ts.map +1 -0
- package/dist/trmnl/trmnl-telemetry.js +56 -0
- package/dist/trmnl/trmnl-telemetry.js.map +1 -0
- package/dist/tui/ansi.d.ts +0 -4
- package/dist/tui/ansi.d.ts.map +1 -1
- package/dist/tui/ansi.js +14 -7
- package/dist/tui/ansi.js.map +1 -1
- package/dist/tui/dashboard.d.ts +1 -0
- package/dist/tui/dashboard.d.ts.map +1 -1
- package/dist/tui/dashboard.js +38 -11
- package/dist/tui/dashboard.js.map +1 -1
- package/dist/tui/renderer.d.ts +36 -0
- package/dist/tui/renderer.d.ts.map +1 -1
- package/dist/tui/renderer.js +355 -121
- package/dist/tui/renderer.js.map +1 -1
- package/dist/tui/terrarium.d.ts.map +1 -1
- package/dist/tui/terrarium.js +44 -51
- package/dist/tui/terrarium.js.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -2
- package/dist/types.js.map +1 -1
- package/dist/usage-api.d.ts.map +1 -1
- package/dist/usage-api.js +7 -1
- package/dist/usage-api.js.map +1 -1
- package/dist/usage-event.d.ts +10 -3
- package/dist/usage-event.d.ts.map +1 -1
- package/dist/usage-event.js +98 -13
- package/dist/usage-event.js.map +1 -1
- package/dist/utility-proxy.d.ts.map +1 -1
- package/dist/utility-proxy.js +8 -0
- package/dist/utility-proxy.js.map +1 -1
- package/dist/utils/project-name.d.ts +3 -0
- package/dist/utils/project-name.d.ts.map +1 -1
- package/dist/utils/project-name.js +44 -2
- package/dist/utils/project-name.js.map +1 -1
- package/dist/version-check.d.ts.map +1 -1
- package/dist/version-check.js +1 -17
- package/dist/version-check.js.map +1 -1
- package/dist/windows-service.d.ts +26 -0
- package/dist/windows-service.d.ts.map +1 -0
- package/dist/windows-service.js +145 -0
- package/dist/windows-service.js.map +1 -0
- package/dist/ws-server.d.ts +17 -3
- package/dist/ws-server.d.ts.map +1 -1
- package/dist/ws-server.js +78 -8
- package/dist/ws-server.js.map +1 -1
- package/fm-helper/AgentDeckFMHelper.swift +112 -0
- package/package.json +10 -4
- package/scripts/build-fm-helper.mjs +26 -0
- package/LICENSE +0 -21
- package/dist/apme/tuner.d.ts +0 -64
- package/dist/apme/tuner.d.ts.map +0 -1
- package/dist/apme/tuner.js +0 -297
- package/dist/apme/tuner.js.map +0 -1
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CodexTurnManager — turn-boundary reconstruction for Codex CLI sessions.
|
|
3
|
+
*
|
|
4
|
+
* Two signal sources are wired into one state machine:
|
|
5
|
+
*
|
|
6
|
+
* 1. **Hook mode** (primary) — `~/.codex/config.toml` lifecycle hooks send
|
|
7
|
+
* `codex_user_prompt_submit` / `codex_tool_start` / `codex_tool_end` /
|
|
8
|
+
* `codex_stop` to the daemon. These are unambiguous turn boundaries.
|
|
9
|
+
* APME span ingestion for hooks happens in `bridge/src/index.ts`'s
|
|
10
|
+
* hook branch via `codexHookToSpans` — this manager only adds the
|
|
11
|
+
* timeline-visible entries (chat_start / tool_request / chat_response /
|
|
12
|
+
* chat_end) so the dashboard sees them.
|
|
13
|
+
*
|
|
14
|
+
* 2. **PTY-parser fallback** (legacy / hook-miss path) — when no codex_*
|
|
15
|
+
* hook has fired in the last 30 s, the manager falls back to the
|
|
16
|
+
* pre-hook PTY-only logic: spinner_start opens a turn, prompt-source
|
|
17
|
+
* idle (with deferred close + status-line false-positive guard +
|
|
18
|
+
* tool-silence latch + PTY tail snapshot) closes it.
|
|
19
|
+
*
|
|
20
|
+
* The 30 s "hook-fresh" window demotes parser signals to no-ops while
|
|
21
|
+
* hooks are flowing, which eliminates the seven-state-variable race we
|
|
22
|
+
* landed seven Codex review iterations on. If hooks stop firing (Codex
|
|
23
|
+
* Ink-TUI repaint glitch), parser fallback re-engages automatically.
|
|
24
|
+
*
|
|
25
|
+
* Extracted from `bridge/src/index.ts wireAgentApme` so the codex segment
|
|
26
|
+
* can be unit-tested with fake collector / fake ringbuffer / fake adapter.
|
|
27
|
+
*/
|
|
28
|
+
import { cleanRawText, prepareMarkdownDetail } from '@agentdeck/shared';
|
|
29
|
+
import { extractTopicHintWithKind, promptSnippetFallback } from '@agentdeck/shared';
|
|
30
|
+
import { timelineEntryToSpans } from './timeline.js';
|
|
31
|
+
import { classifyAndEnqueueTurn } from '../classify-turn.js';
|
|
32
|
+
// PTY parser deferred-close window. The parser fires `idle{source: prompt}`
|
|
33
|
+
// on any `›\s` match — including the status line shown mid-processing — so
|
|
34
|
+
// we wait this long before committing chat_end. A new spinner_start within
|
|
35
|
+
// the window cancels the close, which is how we differentiate spurious
|
|
36
|
+
// mid-turn idles from real turn ends.
|
|
37
|
+
const CODEX_IDLE_CLOSE_DELAY_MS = 1500;
|
|
38
|
+
// Upper bound on the tool-silence flag's lifetime when the parser sees a
|
|
39
|
+
// timeout-source idle after a tool_action. If Codex finishes the final
|
|
40
|
+
// tool and prints the response WITHOUT re-engaging the spinner, no
|
|
41
|
+
// spinner_start arrives to clear the flag and any prompt-idle is
|
|
42
|
+
// suppressed. After this window we clear the flag defensively and replay
|
|
43
|
+
// the suppressed idle as an immediate close.
|
|
44
|
+
const CODEX_TOOL_SILENCE_MAX_MS = 15_000;
|
|
45
|
+
// How recent a hook must be for the manager to consider hook signals
|
|
46
|
+
// authoritative and demote PTY parser signals to no-ops. Any longer and
|
|
47
|
+
// we re-arm the parser fallback in case hooks have stopped firing.
|
|
48
|
+
const CODEX_HOOK_FRESHNESS_MS = 30_000;
|
|
49
|
+
export class CodexTurnManager {
|
|
50
|
+
core;
|
|
51
|
+
apme;
|
|
52
|
+
ptyRingBuffer;
|
|
53
|
+
sessionId;
|
|
54
|
+
agentType;
|
|
55
|
+
// ── PTY-mode turn-boundary state (legacy) ──
|
|
56
|
+
chatStart = null;
|
|
57
|
+
lastPromptText = null;
|
|
58
|
+
idleCloseTimer = null;
|
|
59
|
+
inToolSilence = false;
|
|
60
|
+
toolActiveSinceLastSpinner = false;
|
|
61
|
+
toolSilenceTimer = null;
|
|
62
|
+
pendingPromptIdle = false;
|
|
63
|
+
pendingTailSnapshot = null;
|
|
64
|
+
// ── Hook-mode tracking ──
|
|
65
|
+
hookActive = false;
|
|
66
|
+
lastHookTs = 0;
|
|
67
|
+
constructor(core, apme, ptyRingBuffer, sessionId, agentType) {
|
|
68
|
+
this.core = core;
|
|
69
|
+
this.apme = apme;
|
|
70
|
+
this.ptyRingBuffer = ptyRingBuffer;
|
|
71
|
+
this.sessionId = sessionId;
|
|
72
|
+
this.agentType = agentType;
|
|
73
|
+
}
|
|
74
|
+
// ── Public entry points ────────────────────────────────────────────
|
|
75
|
+
/** Process a codex_* hook event. Hooks are authoritative — they own
|
|
76
|
+
* the turn boundaries while fresh. APME span ingestion already happens
|
|
77
|
+
* in `bridge/src/index.ts` via `codexHookToSpans`; this method only
|
|
78
|
+
* adds the timeline-visible entries the dashboard renders. */
|
|
79
|
+
onHookEvent(evt) {
|
|
80
|
+
this.hookActive = true;
|
|
81
|
+
this.lastHookTs = Date.now();
|
|
82
|
+
if (evt.event === 'codex_user_prompt_submit') {
|
|
83
|
+
const prompt = extractPrompt(evt.data ?? {});
|
|
84
|
+
this.openTimelineChatStart(prompt || undefined);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (evt.event === 'codex_tool_start') {
|
|
88
|
+
const data = (evt.data ?? {});
|
|
89
|
+
const tool = typeof data.tool_name === 'string' && data.tool_name ? data.tool_name : 'tool';
|
|
90
|
+
const args = formatToolArgs(data.tool_input);
|
|
91
|
+
const raw = args ? `${tool} ${args}` : tool;
|
|
92
|
+
this.openTimelineChatStart();
|
|
93
|
+
this.toolActiveSinceLastSpinner = true;
|
|
94
|
+
this.addTimelineEntry({
|
|
95
|
+
ts: Date.now(),
|
|
96
|
+
type: 'tool_request',
|
|
97
|
+
raw: raw.length > 500 ? raw.slice(0, 497) + '...' : raw,
|
|
98
|
+
detail: args && args.length > 0 ? args.slice(0, 1000) : undefined,
|
|
99
|
+
agentType: 'codex-cli',
|
|
100
|
+
...(this.chatStart !== null ? { startedAt: this.chatStart } : {}),
|
|
101
|
+
});
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (evt.event === 'codex_tool_end') {
|
|
105
|
+
// Tool finished — stale `›` chunks no longer mean mid-tool.
|
|
106
|
+
this.inToolSilence = false;
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (evt.event === 'codex_stop') {
|
|
110
|
+
// Hook is authoritative — close synchronously. PTY-side timers /
|
|
111
|
+
// pending state get cleared so a late parser idle can't double-fire.
|
|
112
|
+
if (this.idleCloseTimer) {
|
|
113
|
+
clearTimeout(this.idleCloseTimer);
|
|
114
|
+
this.idleCloseTimer = null;
|
|
115
|
+
}
|
|
116
|
+
this.exitToolSilence();
|
|
117
|
+
this.pendingPromptIdle = false;
|
|
118
|
+
this.pendingTailSnapshot = null;
|
|
119
|
+
this.toolActiveSinceLastSpinner = false;
|
|
120
|
+
if (this.chatStart !== null) {
|
|
121
|
+
this.closeTurn(this.chatStart);
|
|
122
|
+
}
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/** Process a PTY parser event. While a hook is fresh, this is a no-op
|
|
127
|
+
* for turn-boundary signals (hook owns them). Outside the freshness
|
|
128
|
+
* window we run the legacy PTY-only state machine. */
|
|
129
|
+
onParserEvent(evt) {
|
|
130
|
+
if (this.hookFresh())
|
|
131
|
+
return;
|
|
132
|
+
if (evt.event === 'spinner_start') {
|
|
133
|
+
// Two cases:
|
|
134
|
+
// 1. A prompt-idle was suppressed by tool-silence and now spinner
|
|
135
|
+
// is starting fresh — that's the user submitting the NEXT
|
|
136
|
+
// prompt, so the previous turn really did end. Close it
|
|
137
|
+
// synchronously before opening the new one (using the tail
|
|
138
|
+
// snapshot taken at latch time so the response doesn't pick
|
|
139
|
+
// up turn N+1's input).
|
|
140
|
+
// 2. No pending suppression — Codex is just continuing the same
|
|
141
|
+
// turn (e.g. resuming after a bash result). Cancel any pending
|
|
142
|
+
// deferred close (status-line false positive) and keep the
|
|
143
|
+
// existing chat_start.
|
|
144
|
+
if (this.pendingPromptIdle && this.chatStart !== null) {
|
|
145
|
+
const prevStart = this.chatStart;
|
|
146
|
+
const snapshot = this.pendingTailSnapshot;
|
|
147
|
+
this.closeTurn(prevStart, snapshot ?? undefined);
|
|
148
|
+
}
|
|
149
|
+
this.pendingPromptIdle = false;
|
|
150
|
+
this.pendingTailSnapshot = null;
|
|
151
|
+
if (this.idleCloseTimer) {
|
|
152
|
+
clearTimeout(this.idleCloseTimer);
|
|
153
|
+
this.idleCloseTimer = null;
|
|
154
|
+
}
|
|
155
|
+
this.exitToolSilence();
|
|
156
|
+
this.toolActiveSinceLastSpinner = false;
|
|
157
|
+
this.ensureChatStart();
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (evt.event === 'tool_action') {
|
|
161
|
+
const data = (evt.data ?? {});
|
|
162
|
+
const tool = typeof data.tool === 'string' && data.tool ? data.tool : 'tool';
|
|
163
|
+
const args = typeof data.args === 'string' ? data.args : '';
|
|
164
|
+
const raw = args ? `${tool} ${args}` : tool;
|
|
165
|
+
this.ensureChatStart();
|
|
166
|
+
this.toolActiveSinceLastSpinner = true;
|
|
167
|
+
// Parser path: APME ingestion has to come from us (no hook adapter
|
|
168
|
+
// upstream). addEntryAndIngest fires both the timeline entry and
|
|
169
|
+
// the `tool_call` span via timelineEntryToSpans → ingestSpan →
|
|
170
|
+
// ingestHook PreToolUse, incrementing turns.tool_calls.
|
|
171
|
+
this.addEntryAndIngest({
|
|
172
|
+
ts: Date.now(),
|
|
173
|
+
type: 'tool_request',
|
|
174
|
+
raw: raw.length > 500 ? raw.slice(0, 497) + '...' : raw,
|
|
175
|
+
detail: args && args !== raw ? args.slice(0, 1000) : undefined,
|
|
176
|
+
agentType: 'codex-cli',
|
|
177
|
+
...(this.chatStart !== null ? { startedAt: this.chatStart } : {}),
|
|
178
|
+
});
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (evt.event === 'idle') {
|
|
182
|
+
const idleSource = evt.data?.source;
|
|
183
|
+
if (idleSource === 'timeout') {
|
|
184
|
+
// Synthetic idle from spinner-data silence. Only treat as mid-tool
|
|
185
|
+
// if a tool actually ran in this thinking segment — end-of-turn
|
|
186
|
+
// quiet (final response with no further spinning) also produces
|
|
187
|
+
// a timeout idle and must NOT block the next prompt-idle close.
|
|
188
|
+
if (this.toolActiveSinceLastSpinner) {
|
|
189
|
+
this.inToolSilence = true;
|
|
190
|
+
// Bound the silence: if no spinner_start arrives within the
|
|
191
|
+
// grace window, Codex finished the tool and ended the turn
|
|
192
|
+
// without re-engaging the spinner (e.g. tool output IS the
|
|
193
|
+
// final response). On timer fire we clear the flag and replay
|
|
194
|
+
// any suppressed prompt-idle as an immediate close.
|
|
195
|
+
if (this.toolSilenceTimer)
|
|
196
|
+
clearTimeout(this.toolSilenceTimer);
|
|
197
|
+
this.toolSilenceTimer = setTimeout(() => {
|
|
198
|
+
this.toolSilenceTimer = null;
|
|
199
|
+
this.inToolSilence = false;
|
|
200
|
+
if (this.pendingPromptIdle) {
|
|
201
|
+
const snapshot = this.pendingTailSnapshot;
|
|
202
|
+
this.pendingPromptIdle = false;
|
|
203
|
+
this.pendingTailSnapshot = null;
|
|
204
|
+
if (this.chatStart !== null) {
|
|
205
|
+
// Close immediately rather than via scheduleClose: we
|
|
206
|
+
// already waited the full silence window, and any
|
|
207
|
+
// further deferral would let a quickly-typed next
|
|
208
|
+
// prompt cancel the close entirely.
|
|
209
|
+
this.closeTurn(this.chatStart, snapshot ?? undefined);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}, CODEX_TOOL_SILENCE_MAX_MS);
|
|
213
|
+
}
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
if (idleSource !== 'prompt')
|
|
217
|
+
return;
|
|
218
|
+
if (this.chatStart === null)
|
|
219
|
+
return;
|
|
220
|
+
if (this.inToolSilence) {
|
|
221
|
+
// Latch this prompt-idle, with a PTY tail snapshot pinned to
|
|
222
|
+
// *this* moment. Either the auto-clear timer will replay it
|
|
223
|
+
// (turn really ended without re-spinning) or the next
|
|
224
|
+
// spinner_start will close turn N before opening N+1. Both
|
|
225
|
+
// paths use the snapshot — the live tail by then would be
|
|
226
|
+
// contaminated with N+1's input/processing.
|
|
227
|
+
this.pendingPromptIdle = true;
|
|
228
|
+
this.pendingTailSnapshot = this.ptyRingBuffer.getTail(5000);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
// Defer the close. A new spinner_start within the delay cancels
|
|
232
|
+
// this timer, which is how we reject status-line false positives
|
|
233
|
+
// (the status row also matches IDLE_PROMPT) without a wall-clock
|
|
234
|
+
// guard that would also drop real fast turns.
|
|
235
|
+
this.scheduleClose(this.chatStart);
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/** Clear timers so a session shutdown leaves no lingering work. */
|
|
240
|
+
cleanup() {
|
|
241
|
+
if (this.idleCloseTimer) {
|
|
242
|
+
clearTimeout(this.idleCloseTimer);
|
|
243
|
+
this.idleCloseTimer = null;
|
|
244
|
+
}
|
|
245
|
+
if (this.toolSilenceTimer) {
|
|
246
|
+
clearTimeout(this.toolSilenceTimer);
|
|
247
|
+
this.toolSilenceTimer = null;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// ── Internal helpers ───────────────────────────────────────────────
|
|
251
|
+
hookFresh() {
|
|
252
|
+
return this.hookActive && (Date.now() - this.lastHookTs) < CODEX_HOOK_FRESHNESS_MS;
|
|
253
|
+
}
|
|
254
|
+
makeCtx() {
|
|
255
|
+
return {
|
|
256
|
+
sessionId: this.sessionId,
|
|
257
|
+
agentType: this.agentType,
|
|
258
|
+
traceId: this.apme.collector.getRunId(this.sessionId) ?? this.sessionId,
|
|
259
|
+
cwd: process.cwd(),
|
|
260
|
+
activeTurnId: this.apme.collector.getActiveTurnId(this.sessionId) ?? undefined,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
addTimelineEntry(entry) {
|
|
264
|
+
this.core.bridgeTimeline.addEntry(entry);
|
|
265
|
+
}
|
|
266
|
+
/** Add a timeline entry AND feed it through APME ingestion. Use this
|
|
267
|
+
* on the PTY-fallback path where no upstream hook adapter has done
|
|
268
|
+
* the ingestion. */
|
|
269
|
+
addEntryAndIngest(entry) {
|
|
270
|
+
this.core.bridgeTimeline.addEntry(entry);
|
|
271
|
+
const ctx = this.makeCtx();
|
|
272
|
+
for (const span of timelineEntryToSpans(ctx, entry)) {
|
|
273
|
+
this.apme.collector.ingestSpan(this.sessionId, span);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/** Hook-path chat_start opener: timeline entry only. The APME turn
|
|
277
|
+
* was opened upstream by codexHookToSpans → ingestSpan(turn_start)
|
|
278
|
+
* in the index.ts hook branch. Re-ingesting here would close the
|
|
279
|
+
* just-opened turn and immediately reopen another. */
|
|
280
|
+
openTimelineChatStart(text) {
|
|
281
|
+
if (this.chatStart !== null) {
|
|
282
|
+
// Upsert prompt text into the existing entry if we now have it.
|
|
283
|
+
if (text && !this.lastPromptText) {
|
|
284
|
+
this.lastPromptText = text;
|
|
285
|
+
const raw = text.length > 500 ? text.slice(0, 497) + '...' : text;
|
|
286
|
+
const detail = text.length > 100
|
|
287
|
+
? (text.length > 1000 ? text.slice(0, 997) + '...' : text)
|
|
288
|
+
: undefined;
|
|
289
|
+
this.core.bridgeTimeline.upsertEntry({
|
|
290
|
+
ts: this.chatStart,
|
|
291
|
+
type: 'chat_start',
|
|
292
|
+
raw,
|
|
293
|
+
...(detail ? { detail } : {}),
|
|
294
|
+
agentType: 'codex-cli',
|
|
295
|
+
startedAt: this.chatStart,
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
return this.chatStart;
|
|
299
|
+
}
|
|
300
|
+
const now = Date.now();
|
|
301
|
+
this.chatStart = now;
|
|
302
|
+
this.lastPromptText = text || null;
|
|
303
|
+
const raw = text
|
|
304
|
+
? (text.length > 500 ? text.slice(0, 497) + '...' : text)
|
|
305
|
+
: 'Codex turn started';
|
|
306
|
+
const detail = text && text.length > 100
|
|
307
|
+
? (text.length > 1000 ? text.slice(0, 997) + '...' : text)
|
|
308
|
+
: undefined;
|
|
309
|
+
this.addTimelineEntry({
|
|
310
|
+
ts: now,
|
|
311
|
+
type: 'chat_start',
|
|
312
|
+
raw,
|
|
313
|
+
...(detail ? { detail } : {}),
|
|
314
|
+
agentType: 'codex-cli',
|
|
315
|
+
startedAt: now,
|
|
316
|
+
});
|
|
317
|
+
return now;
|
|
318
|
+
}
|
|
319
|
+
/** PTY-path chat_start opener: timeline entry AND APME ingestion. */
|
|
320
|
+
ensureChatStart(text) {
|
|
321
|
+
if (this.chatStart !== null) {
|
|
322
|
+
if (text && !this.lastPromptText) {
|
|
323
|
+
this.lastPromptText = text;
|
|
324
|
+
const raw = text.length > 500 ? text.slice(0, 497) + '...' : text;
|
|
325
|
+
const detail = text.length > 100
|
|
326
|
+
? (text.length > 1000 ? text.slice(0, 997) + '...' : text)
|
|
327
|
+
: undefined;
|
|
328
|
+
this.core.bridgeTimeline.upsertEntry({
|
|
329
|
+
ts: this.chatStart,
|
|
330
|
+
type: 'chat_start',
|
|
331
|
+
raw,
|
|
332
|
+
...(detail ? { detail } : {}),
|
|
333
|
+
agentType: 'codex-cli',
|
|
334
|
+
startedAt: this.chatStart,
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
return this.chatStart;
|
|
338
|
+
}
|
|
339
|
+
const now = Date.now();
|
|
340
|
+
this.chatStart = now;
|
|
341
|
+
this.lastPromptText = text || null;
|
|
342
|
+
const raw = text
|
|
343
|
+
? (text.length > 500 ? text.slice(0, 497) + '...' : text)
|
|
344
|
+
: 'Codex turn started';
|
|
345
|
+
const detail = text && text.length > 100
|
|
346
|
+
? (text.length > 1000 ? text.slice(0, 997) + '...' : text)
|
|
347
|
+
: undefined;
|
|
348
|
+
this.addEntryAndIngest({
|
|
349
|
+
ts: now,
|
|
350
|
+
type: 'chat_start',
|
|
351
|
+
raw,
|
|
352
|
+
...(detail ? { detail } : {}),
|
|
353
|
+
agentType: 'codex-cli',
|
|
354
|
+
startedAt: now,
|
|
355
|
+
});
|
|
356
|
+
return now;
|
|
357
|
+
}
|
|
358
|
+
/** Close the turn that started at `startedAt`: extract the response
|
|
359
|
+
* tail (live ringbuffer or passed snapshot), emit chat_response +
|
|
360
|
+
* chat_end timeline entries, and ingest the response span. The
|
|
361
|
+
* snapshot path is used when closing in response to a delayed signal
|
|
362
|
+
* (auto-clear timer or next spinner_start) — by that point the live
|
|
363
|
+
* ringbuffer contains turn N+1 content that would contaminate N's
|
|
364
|
+
* response. */
|
|
365
|
+
closeTurn(startedAt, tailSnapshot) {
|
|
366
|
+
if (this.chatStart !== startedAt)
|
|
367
|
+
return;
|
|
368
|
+
const endedAt = Date.now();
|
|
369
|
+
this.chatStart = null;
|
|
370
|
+
this.lastPromptText = null;
|
|
371
|
+
const tail = tailSnapshot ?? this.ptyRingBuffer.getTail(5000);
|
|
372
|
+
const lines = tail.split('\n').map(l => l.trim()).filter(Boolean);
|
|
373
|
+
const clean = lines.filter(l => !/^[✢✳✶✻✽⏸⏵❯─>]/.test(l) &&
|
|
374
|
+
!/planmode|plan\s*mode|shift\+tab|accept\s*edits/i.test(l) &&
|
|
375
|
+
!/\?\s*for\s*shortcuts/.test(l));
|
|
376
|
+
const response = clean.slice(-5).join('\n');
|
|
377
|
+
if (response.length > 2) {
|
|
378
|
+
const respRaw = response.length > 200 ? response.slice(0, 197) + '...' : response;
|
|
379
|
+
// chat_response routes through addEntryAndIngest so a turn_response
|
|
380
|
+
// span calls setTurnResponse on APME's active turn (works in both
|
|
381
|
+
// hook and PTY modes — the chat_response timeline → ingestSpan
|
|
382
|
+
// path attaches to whichever turn the collector currently has
|
|
383
|
+
// open).
|
|
384
|
+
this.addEntryAndIngest({
|
|
385
|
+
ts: endedAt - 1,
|
|
386
|
+
type: 'chat_response',
|
|
387
|
+
raw: cleanRawText(respRaw),
|
|
388
|
+
detail: prepareMarkdownDetail(response.slice(0, 3000)) || undefined,
|
|
389
|
+
agentType: 'codex-cli',
|
|
390
|
+
startedAt,
|
|
391
|
+
endedAt,
|
|
392
|
+
});
|
|
393
|
+
void classifyAndEnqueueTurn(this.apme, this.sessionId);
|
|
394
|
+
}
|
|
395
|
+
// Finalize the APME turn row: flushes endedAt + buffered tool_calls /
|
|
396
|
+
// file counters to the store. Order matters — setTurnResponse and
|
|
397
|
+
// classifyAndEnqueueTurn above need the turn to still be ACTIVE
|
|
398
|
+
// (they read from sessionToTurn). After this call the turn moves
|
|
399
|
+
// into sessionToLastTurnId; setLastClosedTurnResponse from any
|
|
400
|
+
// late chat_end fallback would target this turn.
|
|
401
|
+
this.apme.collector.closeTurnForSession(this.sessionId);
|
|
402
|
+
const duration = Math.round((endedAt - startedAt) / 1000);
|
|
403
|
+
// Same kind-classification as wireClaudeCodeTimeline / openclaw adapter.
|
|
404
|
+
// 'topic' → real heuristic; fallback / generic label → 'none' so client
|
|
405
|
+
// suppresses the (likely-redundant) detail pane.
|
|
406
|
+
const respHint = response ? extractTopicHintWithKind(response) : { hint: null, kind: null };
|
|
407
|
+
const promptHint = this.lastPromptText ? extractTopicHintWithKind(this.lastPromptText) : { hint: null, kind: null };
|
|
408
|
+
let label;
|
|
409
|
+
let summaryKind;
|
|
410
|
+
if (respHint.kind === 'topic' && respHint.hint) {
|
|
411
|
+
label = respHint.hint;
|
|
412
|
+
summaryKind = 'heuristic';
|
|
413
|
+
}
|
|
414
|
+
else if (promptHint.kind === 'topic' && promptHint.hint) {
|
|
415
|
+
label = promptHint.hint;
|
|
416
|
+
summaryKind = 'heuristic';
|
|
417
|
+
}
|
|
418
|
+
else if (respHint.hint || promptHint.hint) {
|
|
419
|
+
label = (respHint.hint || promptHint.hint);
|
|
420
|
+
summaryKind = 'none';
|
|
421
|
+
}
|
|
422
|
+
else {
|
|
423
|
+
label = promptSnippetFallback(this.lastPromptText, 60) ?? 'Codex turn completed';
|
|
424
|
+
summaryKind = 'none';
|
|
425
|
+
}
|
|
426
|
+
// chat_end is timeline-only (display marker for duration + topic).
|
|
427
|
+
// The `turn_response` mapping with `fallback_to_last_closed` would
|
|
428
|
+
// otherwise attach this response to the previously closed turn —
|
|
429
|
+
// wrong target. Response already on current turn from chat_response.
|
|
430
|
+
this.addTimelineEntry({
|
|
431
|
+
ts: endedAt,
|
|
432
|
+
type: 'chat_end',
|
|
433
|
+
raw: `${label} · ${duration}s`,
|
|
434
|
+
detail: response.length > 2 ? prepareMarkdownDetail(response.slice(0, 1000)) || undefined : undefined,
|
|
435
|
+
agentType: 'codex-cli',
|
|
436
|
+
startedAt,
|
|
437
|
+
endedAt,
|
|
438
|
+
summaryKind,
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
scheduleClose(startedAt, tailSnapshot) {
|
|
442
|
+
if (this.idleCloseTimer)
|
|
443
|
+
clearTimeout(this.idleCloseTimer);
|
|
444
|
+
this.idleCloseTimer = setTimeout(() => {
|
|
445
|
+
this.idleCloseTimer = null;
|
|
446
|
+
this.closeTurn(startedAt, tailSnapshot);
|
|
447
|
+
}, CODEX_IDLE_CLOSE_DELAY_MS);
|
|
448
|
+
}
|
|
449
|
+
exitToolSilence() {
|
|
450
|
+
this.inToolSilence = false;
|
|
451
|
+
if (this.toolSilenceTimer) {
|
|
452
|
+
clearTimeout(this.toolSilenceTimer);
|
|
453
|
+
this.toolSilenceTimer = null;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
// ── Local helpers ────────────────────────────────────────────────────
|
|
458
|
+
function extractPrompt(data) {
|
|
459
|
+
const fromMessage = (() => {
|
|
460
|
+
const msg = data.message;
|
|
461
|
+
if (msg && typeof msg === 'object') {
|
|
462
|
+
const content = msg.content;
|
|
463
|
+
return typeof content === 'string' ? content : '';
|
|
464
|
+
}
|
|
465
|
+
return '';
|
|
466
|
+
})();
|
|
467
|
+
if (fromMessage)
|
|
468
|
+
return fromMessage;
|
|
469
|
+
if (typeof data.prompt === 'string')
|
|
470
|
+
return data.prompt;
|
|
471
|
+
if (typeof data.user_prompt === 'string')
|
|
472
|
+
return data.user_prompt;
|
|
473
|
+
return '';
|
|
474
|
+
}
|
|
475
|
+
function formatToolArgs(input) {
|
|
476
|
+
if (typeof input === 'string')
|
|
477
|
+
return input;
|
|
478
|
+
if (input && typeof input === 'object') {
|
|
479
|
+
// Codex hook payloads typically pack the bash command in `command` or
|
|
480
|
+
// `cmd`. Best-effort extraction; fall through to JSON for everything
|
|
481
|
+
// else so the tool args are still visible on the timeline.
|
|
482
|
+
const obj = input;
|
|
483
|
+
if (typeof obj.command === 'string')
|
|
484
|
+
return obj.command;
|
|
485
|
+
if (typeof obj.cmd === 'string')
|
|
486
|
+
return obj.cmd;
|
|
487
|
+
try {
|
|
488
|
+
return JSON.stringify(obj);
|
|
489
|
+
}
|
|
490
|
+
catch {
|
|
491
|
+
return '';
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
return '';
|
|
495
|
+
}
|
|
496
|
+
//# sourceMappingURL=codex-turn-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-turn-manager.js","sourceRoot":"","sources":["../../../src/apme/adapters/codex-turn-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw Gateway event → TelemetrySpan adapter.
|
|
3
|
+
*
|
|
4
|
+
* OpenClaw is a chat-style remote agent reached over a WebSocket Gateway
|
|
5
|
+
* (`shared/src/gateway-protocol.ts`). Unlike Claude Code (Stop hook +
|
|
6
|
+
* PostToolUse TodoWrite) and Codex CLI (hook system), OpenClaw never emits a
|
|
7
|
+
* structured "task complete" signal — it streams `chat.delta` chunks during
|
|
8
|
+
* generation and a single `chat.final` per assistant turn. With nothing
|
|
9
|
+
* stronger to anchor a task to, OpenClaw previously fell back to
|
|
10
|
+
* `session_end` only, collapsing every chat session to a single APME task
|
|
11
|
+
* and defeating per-task evaluation.
|
|
12
|
+
*
|
|
13
|
+
* # Boundary signal: idle_gap (90 s)
|
|
14
|
+
*
|
|
15
|
+
* The chosen boundary is **idle_gap**: after `chat.final`, if the user
|
|
16
|
+
* doesn't send a new `chat.send` within 90 seconds, treat the conversation
|
|
17
|
+
* as one closed task. Rationale, derived from inspecting the chat-final /
|
|
18
|
+
* chat-delta fixture set (`tests/parity/gateway-frames/`) and the four
|
|
19
|
+
* scenario classes that ship in the audit plan:
|
|
20
|
+
*
|
|
21
|
+
* (a) Single Q/A → 1 final, no follow-up → idle_gap fires once.
|
|
22
|
+
* (b) Multi-turn collab → user keeps replying within 90 s → 1 task
|
|
23
|
+
* (collaboration stays together).
|
|
24
|
+
* (c) Long task w/ Qs → same as (b), user clarifications keep the
|
|
25
|
+
* idle timer reset until the agent fully closes
|
|
26
|
+
* the topic.
|
|
27
|
+
* (d) Abrupt new topic → if the pivot happens within 90 s of the
|
|
28
|
+
* previous final, this v1 will lump both into
|
|
29
|
+
* one task. Acceptable v1 limitation —
|
|
30
|
+
* user-driven `manual` boundary or longer
|
|
31
|
+
* silence between topics splits them. A future
|
|
32
|
+
* topic-shift embedder is the obvious next step.
|
|
33
|
+
*
|
|
34
|
+
* 90 s is conservative: long enough that genuine multi-turn debugging
|
|
35
|
+
* stays together, short enough that a real "I'm done, walking away"
|
|
36
|
+
* gesture closes the task within a normal coffee break. The threshold is
|
|
37
|
+
* exposed as `OPENCLAW_IDLE_GAP_MS` so a downstream consumer can override
|
|
38
|
+
* for a hot-research session if needed.
|
|
39
|
+
*
|
|
40
|
+
* # Alternative boundaries considered (rejected for v1)
|
|
41
|
+
*
|
|
42
|
+
* - `chat.final` per turn: too granular — every user/assistant turn pair
|
|
43
|
+
* would be its own task. Defeats the "what did the agent accomplish"
|
|
44
|
+
* framing — evaluation should span the work, not the words.
|
|
45
|
+
* - Embedding-based topic shift: cost-heavy + cold-start fragile. Not v1.
|
|
46
|
+
* - Gateway `taskCompleted` event: no such event in `GatewayEventPayload`
|
|
47
|
+
* union. Adding it requires the OpenClaw server to emit it, which the
|
|
48
|
+
* bridge can't unilaterally do.
|
|
49
|
+
*
|
|
50
|
+
* # Wiring
|
|
51
|
+
*
|
|
52
|
+
* `bridge/src/adapters/openclaw.ts` calls `openclawChatEventToSpans(ctx,
|
|
53
|
+
* payload)` from its `chat` event branch and forwards the resulting spans
|
|
54
|
+
* to `apme.collector.ingestSpan`. The idle timer is owned by the OpenClaw
|
|
55
|
+
* adapter (not this module) because it needs access to the active session
|
|
56
|
+
* id and an actual `setTimeout`. This module is pure — given a payload it
|
|
57
|
+
* returns the spans the adapter should currently emit, no side effects.
|
|
58
|
+
*/
|
|
59
|
+
import type { AdapterContext, TelemetrySpan, ChatEventPayload, SessionToolPayload, SessionMessagePayload } from '@agentdeck/shared';
|
|
60
|
+
/** Default idle-gap threshold after `chat.final` before we close the task. */
|
|
61
|
+
export declare const OPENCLAW_IDLE_GAP_MS = 90000;
|
|
62
|
+
/**
|
|
63
|
+
* Convert a Gateway `chat` event payload into the spans the APME collector
|
|
64
|
+
* should ingest right now. Does NOT emit the idle-gap `task_boundary` —
|
|
65
|
+
* that's owned by the adapter's timer (it needs setTimeout + per-session
|
|
66
|
+
* state). Callers should also fire `emitIdleGapTaskBoundary(...)` when the
|
|
67
|
+
* idle timer expires.
|
|
68
|
+
*/
|
|
69
|
+
export declare function openclawChatEventToSpans(ctx: AdapterContext, payload: ChatEventPayload): TelemetrySpan[];
|
|
70
|
+
/**
|
|
71
|
+
* Convert a Gateway `session.tool` event into spans. This granular per-tool
|
|
72
|
+
* stream carries the tool INPUT/OUTPUT that the coarse `chat.final` tools array
|
|
73
|
+
* lacks — and it was previously silently dropped (openclaw.ts default case), so
|
|
74
|
+
* the sample's tool trajectory had no detail. A `running`/`pending` status maps
|
|
75
|
+
* to a `tool_call` (opens a pending ToolEvent); a terminal status maps to a
|
|
76
|
+
* `tool_result` (resolves it). Pure — no side effects.
|
|
77
|
+
*/
|
|
78
|
+
export declare function openclawSessionToolToSpans(ctx: AdapterContext, payload: SessionToolPayload): TelemetrySpan[];
|
|
79
|
+
/**
|
|
80
|
+
* Convert a Gateway `session.out-of-band message` into a turn span. User
|
|
81
|
+
* messages open a turn (turn_start); assistant messages set the response
|
|
82
|
+
* (turn_response). Previously dropped, so gateway-initiated turns (cron,
|
|
83
|
+
* automations) had no captured prompt/response in the sample.
|
|
84
|
+
*/
|
|
85
|
+
export declare function openclawSessionMessageToSpans(ctx: AdapterContext, payload: SessionMessagePayload): TelemetrySpan[];
|
|
86
|
+
/**
|
|
87
|
+
* Build the spans the adapter should emit when its idle-gap timer expires.
|
|
88
|
+
* Returned as a function (not a constant) because the timestamp is "now"
|
|
89
|
+
* at expiry, not "now" at adapter construction.
|
|
90
|
+
*/
|
|
91
|
+
export declare function openclawIdleGapTaskBoundary(ctx: AdapterContext): TelemetrySpan;
|
|
92
|
+
/**
|
|
93
|
+
* Build the user-prompt span the adapter should emit on `chat.send`. Kept
|
|
94
|
+
* here for symmetry with `claude-hook.ts::claudeHookToSpans` and so future
|
|
95
|
+
* test fixtures can exercise the boundary detector without spinning a real
|
|
96
|
+
* Gateway connection.
|
|
97
|
+
*/
|
|
98
|
+
export declare function openclawChatSendToSpan(ctx: AdapterContext, prompt: string): TelemetrySpan;
|
|
99
|
+
//# sourceMappingURL=openclaw-hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-hook.d.ts","sourceRoot":"","sources":["../../../src/apme/adapters/openclaw-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AAGH,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EAEb,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,mBAAmB,CAAC;AAG3B,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAE3C;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,GACxB,aAAa,EAAE,CA+DjB;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,kBAAkB,GAC1B,aAAa,EAAE,CA2BjB;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,qBAAqB,GAC7B,aAAa,EAAE,CAqBjB;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,cAAc,GAAG,aAAa,CAc9E;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,GACb,aAAa,CAcf"}
|