@agentdeck/bridge 0.1.0 → 0.2.1

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