@agentdeck/bridge 0.2.2 → 0.2.3

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.
Files changed (383) hide show
  1. package/assets/fonts/IBMPlexSans-Bold.ttf +0 -0
  2. package/assets/fonts/IBMPlexSans-Regular.ttf +0 -0
  3. package/assets/fonts/JetBrainsMono-Bold.ttf +0 -0
  4. package/assets/fonts/JetBrainsMono-Regular.ttf +0 -0
  5. package/assets/fonts/LICENSES.md +22 -0
  6. package/dist/adapters/claude-code.d.ts +6 -0
  7. package/dist/adapters/claude-code.d.ts.map +1 -1
  8. package/dist/adapters/claude-code.js +8 -0
  9. package/dist/adapters/claude-code.js.map +1 -1
  10. package/dist/adapters/openclaw.d.ts +24 -0
  11. package/dist/adapters/openclaw.d.ts.map +1 -1
  12. package/dist/adapters/openclaw.js +291 -35
  13. package/dist/adapters/openclaw.js.map +1 -1
  14. package/dist/adapters/opencode-adapter.d.ts +59 -0
  15. package/dist/adapters/opencode-adapter.d.ts.map +1 -1
  16. package/dist/adapters/opencode-adapter.js +297 -35
  17. package/dist/adapters/opencode-adapter.js.map +1 -1
  18. package/dist/adb-reverse.d.ts +1 -1
  19. package/dist/adb-reverse.js +1 -1
  20. package/dist/antigravity-local.d.ts +1 -0
  21. package/dist/antigravity-local.d.ts.map +1 -1
  22. package/dist/antigravity-local.js +33 -0
  23. package/dist/antigravity-local.js.map +1 -1
  24. package/dist/apme/adapters/claude-hook.d.ts.map +1 -1
  25. package/dist/apme/adapters/claude-hook.js +5 -0
  26. package/dist/apme/adapters/claude-hook.js.map +1 -1
  27. package/dist/apme/adapters/codex-hook.d.ts +17 -0
  28. package/dist/apme/adapters/codex-hook.d.ts.map +1 -0
  29. package/dist/apme/adapters/codex-hook.js +95 -0
  30. package/dist/apme/adapters/codex-hook.js.map +1 -0
  31. package/dist/apme/adapters/codex-turn-manager.d.ts +86 -0
  32. package/dist/apme/adapters/codex-turn-manager.d.ts.map +1 -0
  33. package/dist/apme/adapters/codex-turn-manager.js +496 -0
  34. package/dist/apme/adapters/codex-turn-manager.js.map +1 -0
  35. package/dist/apme/adapters/openclaw-hook.d.ts +99 -0
  36. package/dist/apme/adapters/openclaw-hook.d.ts.map +1 -0
  37. package/dist/apme/adapters/openclaw-hook.js +234 -0
  38. package/dist/apme/adapters/openclaw-hook.js.map +1 -0
  39. package/dist/apme/adapters/opencode-hook.d.ts +56 -0
  40. package/dist/apme/adapters/opencode-hook.d.ts.map +1 -0
  41. package/dist/apme/adapters/opencode-hook.js +182 -0
  42. package/dist/apme/adapters/opencode-hook.js.map +1 -0
  43. package/dist/apme/adapters/timeline.d.ts.map +1 -1
  44. package/dist/apme/adapters/timeline.js +6 -1
  45. package/dist/apme/adapters/timeline.js.map +1 -1
  46. package/dist/apme/antigravity-transcript.d.ts +18 -0
  47. package/dist/apme/antigravity-transcript.d.ts.map +1 -0
  48. package/dist/apme/antigravity-transcript.js +94 -0
  49. package/dist/apme/antigravity-transcript.js.map +1 -0
  50. package/dist/apme/classify-turn.d.ts +13 -0
  51. package/dist/apme/classify-turn.d.ts.map +1 -0
  52. package/dist/apme/classify-turn.js +49 -0
  53. package/dist/apme/classify-turn.js.map +1 -0
  54. package/dist/apme/claude-transcript-reader.d.ts +10 -0
  55. package/dist/apme/claude-transcript-reader.d.ts.map +1 -1
  56. package/dist/apme/claude-transcript-reader.js +35 -0
  57. package/dist/apme/claude-transcript-reader.js.map +1 -1
  58. package/dist/apme/collector.d.ts +129 -6
  59. package/dist/apme/collector.d.ts.map +1 -1
  60. package/dist/apme/collector.js +470 -23
  61. package/dist/apme/collector.js.map +1 -1
  62. package/dist/apme/dashboard-html.d.ts.map +1 -1
  63. package/dist/apme/dashboard-html.js +87 -11
  64. package/dist/apme/dashboard-html.js.map +1 -1
  65. package/dist/apme/http.d.ts.map +1 -1
  66. package/dist/apme/http.js +43 -6
  67. package/dist/apme/http.js.map +1 -1
  68. package/dist/apme/index.d.ts +26 -5
  69. package/dist/apme/index.d.ts.map +1 -1
  70. package/dist/apme/index.js +135 -9
  71. package/dist/apme/index.js.map +1 -1
  72. package/dist/apme/pareto.d.ts +39 -0
  73. package/dist/apme/pareto.d.ts.map +1 -0
  74. package/dist/apme/pareto.js +59 -0
  75. package/dist/apme/pareto.js.map +1 -0
  76. package/dist/apme/recommend.d.ts +3 -0
  77. package/dist/apme/recommend.d.ts.map +1 -1
  78. package/dist/apme/recommend.js +43 -1
  79. package/dist/apme/recommend.js.map +1 -1
  80. package/dist/apme/runner.d.ts +92 -4
  81. package/dist/apme/runner.d.ts.map +1 -1
  82. package/dist/apme/runner.js +586 -70
  83. package/dist/apme/runner.js.map +1 -1
  84. package/dist/apme/sample-to-timeline.d.ts +26 -0
  85. package/dist/apme/sample-to-timeline.d.ts.map +1 -0
  86. package/dist/apme/sample-to-timeline.js +95 -0
  87. package/dist/apme/sample-to-timeline.js.map +1 -0
  88. package/dist/apme/scorers/index.d.ts +47 -0
  89. package/dist/apme/scorers/index.d.ts.map +1 -0
  90. package/dist/apme/scorers/index.js +96 -0
  91. package/dist/apme/scorers/index.js.map +1 -0
  92. package/dist/apme/settings.d.ts +14 -10
  93. package/dist/apme/settings.d.ts.map +1 -1
  94. package/dist/apme/settings.js +34 -8
  95. package/dist/apme/settings.js.map +1 -1
  96. package/dist/apme/store.d.ts +33 -1
  97. package/dist/apme/store.d.ts.map +1 -1
  98. package/dist/apme/store.js +334 -25
  99. package/dist/apme/store.js.map +1 -1
  100. package/dist/awaiting-overlay.d.ts +99 -0
  101. package/dist/awaiting-overlay.d.ts.map +1 -0
  102. package/dist/awaiting-overlay.js +148 -0
  103. package/dist/awaiting-overlay.js.map +1 -0
  104. package/dist/ble-sync-spawn.d.ts +63 -0
  105. package/dist/ble-sync-spawn.d.ts.map +1 -0
  106. package/dist/ble-sync-spawn.js +196 -0
  107. package/dist/ble-sync-spawn.js.map +1 -0
  108. package/dist/bridge-core.d.ts +24 -1
  109. package/dist/bridge-core.d.ts.map +1 -1
  110. package/dist/bridge-core.js +157 -24
  111. package/dist/bridge-core.js.map +1 -1
  112. package/dist/broadcast.d.ts +3 -0
  113. package/dist/broadcast.d.ts.map +1 -0
  114. package/dist/broadcast.js +122 -0
  115. package/dist/broadcast.js.map +1 -0
  116. package/dist/check-deps.d.ts.map +1 -1
  117. package/dist/check-deps.js +25 -9
  118. package/dist/check-deps.js.map +1 -1
  119. package/dist/cli.d.ts +15 -1
  120. package/dist/cli.d.ts.map +1 -1
  121. package/dist/cli.js +1021 -93
  122. package/dist/cli.js.map +1 -1
  123. package/dist/codex-auth.d.ts +21 -0
  124. package/dist/codex-auth.d.ts.map +1 -1
  125. package/dist/codex-auth.js +52 -1
  126. package/dist/codex-auth.js.map +1 -1
  127. package/dist/codex-output-parser.d.ts +8 -0
  128. package/dist/codex-output-parser.d.ts.map +1 -1
  129. package/dist/codex-output-parser.js +110 -25
  130. package/dist/codex-output-parser.js.map +1 -1
  131. package/dist/codex-rate-limits.d.ts +16 -0
  132. package/dist/codex-rate-limits.d.ts.map +1 -0
  133. package/dist/codex-rate-limits.js +197 -0
  134. package/dist/codex-rate-limits.js.map +1 -0
  135. package/dist/codex-rollout-response.d.ts +31 -0
  136. package/dist/codex-rollout-response.d.ts.map +1 -0
  137. package/dist/codex-rollout-response.js +135 -0
  138. package/dist/codex-rollout-response.js.map +1 -0
  139. package/dist/daemon-server.d.ts +85 -0
  140. package/dist/daemon-server.d.ts.map +1 -1
  141. package/dist/daemon-server.js +1627 -159
  142. package/dist/daemon-server.js.map +1 -1
  143. package/dist/daemon.js +15 -6
  144. package/dist/daemon.js.map +1 -1
  145. package/dist/display-dim.d.ts +9 -0
  146. package/dist/display-dim.d.ts.map +1 -0
  147. package/dist/display-dim.js +53 -0
  148. package/dist/display-dim.js.map +1 -0
  149. package/dist/display-monitor.d.ts +15 -2
  150. package/dist/display-monitor.d.ts.map +1 -1
  151. package/dist/display-monitor.js +104 -26
  152. package/dist/display-monitor.js.map +1 -1
  153. package/dist/esp32-serial.d.ts +160 -1
  154. package/dist/esp32-serial.d.ts.map +1 -1
  155. package/dist/esp32-serial.js +950 -153
  156. package/dist/esp32-serial.js.map +1 -1
  157. package/dist/fallback-task-timeline.d.ts +42 -0
  158. package/dist/fallback-task-timeline.d.ts.map +1 -0
  159. package/dist/fallback-task-timeline.js +112 -0
  160. package/dist/fallback-task-timeline.js.map +1 -0
  161. package/dist/foundation-models-helper.d.ts +11 -0
  162. package/dist/foundation-models-helper.d.ts.map +1 -0
  163. package/dist/foundation-models-helper.js +241 -0
  164. package/dist/foundation-models-helper.js.map +1 -0
  165. package/dist/hook-migration.js +1 -1
  166. package/dist/hook-migration.js.map +1 -1
  167. package/dist/hook-server.d.ts +2 -3
  168. package/dist/hook-server.d.ts.map +1 -1
  169. package/dist/hook-server.js +22 -10
  170. package/dist/hook-server.js.map +1 -1
  171. package/dist/idotmatrix/idotmatrix-daemon-sync.d.ts +33 -0
  172. package/dist/idotmatrix/idotmatrix-daemon-sync.d.ts.map +1 -0
  173. package/dist/idotmatrix/idotmatrix-daemon-sync.js +164 -0
  174. package/dist/idotmatrix/idotmatrix-daemon-sync.js.map +1 -0
  175. package/dist/idotmatrix/idotmatrix-discover.d.ts +18 -0
  176. package/dist/idotmatrix/idotmatrix-discover.d.ts.map +1 -0
  177. package/dist/idotmatrix/idotmatrix-discover.js +85 -0
  178. package/dist/idotmatrix/idotmatrix-discover.js.map +1 -0
  179. package/dist/idotmatrix/idotmatrix-settings.d.ts +20 -0
  180. package/dist/idotmatrix/idotmatrix-settings.d.ts.map +1 -0
  181. package/dist/idotmatrix/idotmatrix-settings.js +57 -0
  182. package/dist/idotmatrix/idotmatrix-settings.js.map +1 -0
  183. package/dist/index.d.ts.map +1 -1
  184. package/dist/index.js +215 -179
  185. package/dist/index.js.map +1 -1
  186. package/dist/log-stream.d.ts +15 -16
  187. package/dist/log-stream.d.ts.map +1 -1
  188. package/dist/log-stream.js +18 -96
  189. package/dist/log-stream.js.map +1 -1
  190. package/dist/logger.d.ts.map +1 -1
  191. package/dist/logger.js +12 -3
  192. package/dist/logger.js.map +1 -1
  193. package/dist/mdns.d.ts +17 -0
  194. package/dist/mdns.d.ts.map +1 -1
  195. package/dist/mdns.js +52 -18
  196. package/dist/mdns.js.map +1 -1
  197. package/dist/modules/adb-module.d.ts +1 -1
  198. package/dist/modules/adb-module.d.ts.map +1 -1
  199. package/dist/modules/adb-module.js +4 -3
  200. package/dist/modules/adb-module.js.map +1 -1
  201. package/dist/modules/broadcast-module.d.ts +17 -0
  202. package/dist/modules/broadcast-module.d.ts.map +1 -0
  203. package/dist/modules/broadcast-module.js +26 -0
  204. package/dist/modules/broadcast-module.js.map +1 -0
  205. package/dist/modules/idotmatrix-module.d.ts +9 -0
  206. package/dist/modules/idotmatrix-module.d.ts.map +1 -0
  207. package/dist/modules/idotmatrix-module.js +46 -0
  208. package/dist/modules/idotmatrix-module.js.map +1 -0
  209. package/dist/modules/index.d.ts +3 -1
  210. package/dist/modules/index.d.ts.map +1 -1
  211. package/dist/modules/index.js +9 -3
  212. package/dist/modules/index.js.map +1 -1
  213. package/dist/modules/pixoo-module.d.ts.map +1 -1
  214. package/dist/modules/pixoo-module.js +14 -4
  215. package/dist/modules/pixoo-module.js.map +1 -1
  216. package/dist/modules/serial-module.d.ts +4 -0
  217. package/dist/modules/serial-module.d.ts.map +1 -1
  218. package/dist/modules/serial-module.js +14 -12
  219. package/dist/modules/serial-module.js.map +1 -1
  220. package/dist/modules/timebox-module.d.ts +9 -0
  221. package/dist/modules/timebox-module.d.ts.map +1 -0
  222. package/dist/modules/timebox-module.js +46 -0
  223. package/dist/modules/timebox-module.js.map +1 -0
  224. package/dist/modules/types.d.ts +4 -2
  225. package/dist/modules/types.d.ts.map +1 -1
  226. package/dist/openclaw-session.d.ts +18 -0
  227. package/dist/openclaw-session.d.ts.map +1 -0
  228. package/dist/openclaw-session.js +34 -0
  229. package/dist/openclaw-session.js.map +1 -0
  230. package/dist/output-parser.d.ts +30 -0
  231. package/dist/output-parser.d.ts.map +1 -1
  232. package/dist/output-parser.js +125 -9
  233. package/dist/output-parser.js.map +1 -1
  234. package/dist/passive-observer.d.ts +26 -0
  235. package/dist/passive-observer.d.ts.map +1 -1
  236. package/dist/passive-observer.js +258 -49
  237. package/dist/passive-observer.js.map +1 -1
  238. package/dist/permission-resolver.d.ts +47 -0
  239. package/dist/permission-resolver.d.ts.map +1 -0
  240. package/dist/permission-resolver.js +103 -0
  241. package/dist/permission-resolver.js.map +1 -0
  242. package/dist/pixoo/micro-glyphs.d.ts +49 -0
  243. package/dist/pixoo/micro-glyphs.d.ts.map +1 -0
  244. package/dist/pixoo/micro-glyphs.js +276 -0
  245. package/dist/pixoo/micro-glyphs.js.map +1 -0
  246. package/dist/pixoo/pixoo-bridge.d.ts +2 -2
  247. package/dist/pixoo/pixoo-bridge.d.ts.map +1 -1
  248. package/dist/pixoo/pixoo-bridge.js +93 -25
  249. package/dist/pixoo/pixoo-bridge.js.map +1 -1
  250. package/dist/pixoo/pixoo-camera.d.ts +19 -3
  251. package/dist/pixoo/pixoo-camera.d.ts.map +1 -1
  252. package/dist/pixoo/pixoo-camera.js +62 -27
  253. package/dist/pixoo/pixoo-camera.js.map +1 -1
  254. package/dist/pixoo/pixoo-client.d.ts +13 -3
  255. package/dist/pixoo/pixoo-client.d.ts.map +1 -1
  256. package/dist/pixoo/pixoo-client.js +51 -22
  257. package/dist/pixoo/pixoo-client.js.map +1 -1
  258. package/dist/pixoo/pixoo-discover.d.ts +37 -0
  259. package/dist/pixoo/pixoo-discover.d.ts.map +1 -0
  260. package/dist/pixoo/pixoo-discover.js +105 -0
  261. package/dist/pixoo/pixoo-discover.js.map +1 -0
  262. package/dist/pixoo/pixoo-renderer.d.ts +8 -3
  263. package/dist/pixoo/pixoo-renderer.d.ts.map +1 -1
  264. package/dist/pixoo/pixoo-renderer.js +189 -60
  265. package/dist/pixoo/pixoo-renderer.js.map +1 -1
  266. package/dist/pixoo/pixoo-settings.d.ts +6 -0
  267. package/dist/pixoo/pixoo-settings.d.ts.map +1 -1
  268. package/dist/pixoo/pixoo-settings.js +9 -0
  269. package/dist/pixoo/pixoo-settings.js.map +1 -1
  270. package/dist/pixoo/pixoo-sprites.d.ts +60 -11
  271. package/dist/pixoo/pixoo-sprites.d.ts.map +1 -1
  272. package/dist/pixoo/pixoo-sprites.js +512 -209
  273. package/dist/pixoo/pixoo-sprites.js.map +1 -1
  274. package/dist/pty-manager.d.ts.map +1 -1
  275. package/dist/pty-manager.js +8 -2
  276. package/dist/pty-manager.js.map +1 -1
  277. package/dist/session-activity.d.ts +14 -0
  278. package/dist/session-activity.d.ts.map +1 -0
  279. package/dist/session-activity.js +160 -0
  280. package/dist/session-activity.js.map +1 -0
  281. package/dist/session-aggregator.d.ts +17 -0
  282. package/dist/session-aggregator.d.ts.map +1 -1
  283. package/dist/session-aggregator.js +48 -9
  284. package/dist/session-aggregator.js.map +1 -1
  285. package/dist/session-registry.d.ts +71 -3
  286. package/dist/session-registry.d.ts.map +1 -1
  287. package/dist/session-registry.js +137 -8
  288. package/dist/session-registry.js.map +1 -1
  289. package/dist/session-timeline-relay.d.ts.map +1 -1
  290. package/dist/session-timeline-relay.js +13 -4
  291. package/dist/session-timeline-relay.js.map +1 -1
  292. package/dist/session-transcript-timeline.d.ts +49 -0
  293. package/dist/session-transcript-timeline.d.ts.map +1 -0
  294. package/dist/session-transcript-timeline.js +276 -0
  295. package/dist/session-transcript-timeline.js.map +1 -0
  296. package/dist/state-machine.d.ts +6 -1
  297. package/dist/state-machine.d.ts.map +1 -1
  298. package/dist/state-machine.js +86 -28
  299. package/dist/state-machine.js.map +1 -1
  300. package/dist/timebox/timebox-daemon-sync.d.ts +19 -0
  301. package/dist/timebox/timebox-daemon-sync.d.ts.map +1 -0
  302. package/dist/timebox/timebox-daemon-sync.js +135 -0
  303. package/dist/timebox/timebox-daemon-sync.js.map +1 -0
  304. package/dist/timebox/timebox-discover.d.ts +19 -0
  305. package/dist/timebox/timebox-discover.d.ts.map +1 -0
  306. package/dist/timebox/timebox-discover.js +87 -0
  307. package/dist/timebox/timebox-discover.js.map +1 -0
  308. package/dist/timebox/timebox-settings.d.ts +32 -0
  309. package/dist/timebox/timebox-settings.d.ts.map +1 -0
  310. package/dist/timebox/timebox-settings.js +80 -0
  311. package/dist/timebox/timebox-settings.js.map +1 -0
  312. package/dist/timeline-store.d.ts +63 -3
  313. package/dist/timeline-store.d.ts.map +1 -1
  314. package/dist/timeline-store.js +292 -14
  315. package/dist/timeline-store.js.map +1 -1
  316. package/dist/timeline-summarizer.d.ts.map +1 -1
  317. package/dist/timeline-summarizer.js +29 -5
  318. package/dist/timeline-summarizer.js.map +1 -1
  319. package/dist/tui/ansi.d.ts +0 -4
  320. package/dist/tui/ansi.d.ts.map +1 -1
  321. package/dist/tui/ansi.js +14 -7
  322. package/dist/tui/ansi.js.map +1 -1
  323. package/dist/tui/dashboard.d.ts +1 -0
  324. package/dist/tui/dashboard.d.ts.map +1 -1
  325. package/dist/tui/dashboard.js +24 -7
  326. package/dist/tui/dashboard.js.map +1 -1
  327. package/dist/tui/renderer.d.ts +36 -0
  328. package/dist/tui/renderer.d.ts.map +1 -1
  329. package/dist/tui/renderer.js +303 -119
  330. package/dist/tui/renderer.js.map +1 -1
  331. package/dist/tui/terrarium.d.ts.map +1 -1
  332. package/dist/tui/terrarium.js +37 -49
  333. package/dist/tui/terrarium.js.map +1 -1
  334. package/dist/types.d.ts +2 -2
  335. package/dist/types.d.ts.map +1 -1
  336. package/dist/types.js +2 -2
  337. package/dist/types.js.map +1 -1
  338. package/dist/usage-api.d.ts.map +1 -1
  339. package/dist/usage-api.js +7 -1
  340. package/dist/usage-api.js.map +1 -1
  341. package/dist/usage-event.d.ts +10 -3
  342. package/dist/usage-event.d.ts.map +1 -1
  343. package/dist/usage-event.js +74 -12
  344. package/dist/usage-event.js.map +1 -1
  345. package/dist/utility-proxy.d.ts.map +1 -1
  346. package/dist/utility-proxy.js +8 -0
  347. package/dist/utility-proxy.js.map +1 -1
  348. package/dist/utils/project-name.d.ts +3 -0
  349. package/dist/utils/project-name.d.ts.map +1 -1
  350. package/dist/utils/project-name.js +44 -2
  351. package/dist/utils/project-name.js.map +1 -1
  352. package/dist/windows-service.d.ts +26 -0
  353. package/dist/windows-service.d.ts.map +1 -0
  354. package/dist/windows-service.js +145 -0
  355. package/dist/windows-service.js.map +1 -0
  356. package/dist/ws-server.d.ts +22 -1
  357. package/dist/ws-server.d.ts.map +1 -1
  358. package/dist/ws-server.js +89 -4
  359. package/dist/ws-server.js.map +1 -1
  360. package/fm-helper/AgentDeckFMHelper.swift +112 -0
  361. package/package.json +9 -3
  362. package/scripts/build-fm-helper.mjs +26 -0
  363. package/LICENSE +0 -21
  364. package/dist/apme/tuner.d.ts +0 -64
  365. package/dist/apme/tuner.d.ts.map +0 -1
  366. package/dist/apme/tuner.js +0 -297
  367. package/dist/apme/tuner.js.map +0 -1
  368. package/dist/d200h/hid-protocol.d.ts +0 -62
  369. package/dist/d200h/hid-protocol.d.ts.map +0 -1
  370. package/dist/d200h/hid-protocol.js +0 -124
  371. package/dist/d200h/hid-protocol.js.map +0 -1
  372. package/dist/d200h/image-renderer.d.ts +0 -36
  373. package/dist/d200h/image-renderer.d.ts.map +0 -1
  374. package/dist/d200h/image-renderer.js +0 -487
  375. package/dist/d200h/image-renderer.js.map +0 -1
  376. package/dist/modules/d200h-module.d.ts +0 -43
  377. package/dist/modules/d200h-module.d.ts.map +0 -1
  378. package/dist/modules/d200h-module.js +0 -360
  379. package/dist/modules/d200h-module.js.map +0 -1
  380. package/dist/modules/d200h-renderer.d.ts +0 -7
  381. package/dist/modules/d200h-renderer.d.ts.map +0 -1
  382. package/dist/modules/d200h-renderer.js +0 -321
  383. package/dist/modules/d200h-renderer.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"}