@xopcai/xopc 0.0.122 → 0.0.124

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 (273) hide show
  1. package/README.md +28 -11
  2. package/README.zh-CN.md +28 -11
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/telegram/xopc.extension.json +1 -1
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CK3s5cJo.js → agent-avatar-dicebear-B5uSVAyJ.js} +1 -1
  6. package/dist/gateway/static/root/assets/agents-BjIxt67Z.js +2 -0
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-CWsNHtTs.js → app-management-settings-panel-CYCONLIL.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-C4b8y6iZ.js → appearance-settings-Clw3ryKg.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-QICTeGjX.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-DAtNW3Ia.js → archive-plugin-CXUGRp2i.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-Dm-RY54y.js → attachment-load-Cmiub3Wg.js} +1 -1
  12. package/dist/gateway/static/root/assets/{automation-suggestion-card-BKHewSVT.js → automation-suggestion-card-CU0-4nQ-.js} +1 -1
  13. package/dist/gateway/static/root/assets/automations-page-Car-jtiz.js +1 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-BG6Xnk71.js → binary-plugins-0Izz-N3p.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-DfndiO3h.js → block-editor-C1Kv0IkJ.js} +28 -28
  16. package/dist/gateway/static/root/assets/browser-settings-page-CMeBJzlS.js +8 -0
  17. package/dist/gateway/static/root/assets/{capability-presets-api-Cx93GLdw.js → capability-presets-api-BmQTM9Il.js} +1 -1
  18. package/dist/gateway/static/root/assets/capability-presets-settings-panel-DZEJEoCF.js +1 -0
  19. package/dist/gateway/static/root/assets/{channel-recipient-api-DdPTtEs8.js → channel-recipient-api-BeA2aVor.js} +1 -1
  20. package/dist/gateway/static/root/assets/channels-settings-kkW-xFau.js +1 -0
  21. package/dist/gateway/static/root/assets/connectors-page-BvaQvO5F.js +2 -0
  22. package/dist/gateway/static/root/assets/{directory-picker-path-field-D835EHJd.js → directory-picker-path-field-2rjzUu57.js} +1 -1
  23. package/dist/gateway/static/root/assets/{dreaming-settings-CCa1F7Fg.js → dreaming-settings-DnHO686d.js} +1 -1
  24. package/dist/gateway/static/root/assets/{extension-debug-page-W2ITCPSA.js → extension-debug-page-BGLRuWVN.js} +1 -1
  25. package/dist/gateway/static/root/assets/{extension-page-DrvUytvn.js → extension-page-D978ePp9.js} +1 -1
  26. package/dist/gateway/static/root/assets/{extension-settings-page-qM8aLT5u.js → extension-settings-page-B6Ih4Swx.js} +1 -1
  27. package/dist/gateway/static/root/assets/{fetch-ovkvM8KQ.js → fetch-BU5S0Sn7.js} +1 -1
  28. package/dist/gateway/static/root/assets/{gateway-config-api-BB3biuD0.js → gateway-config-api-BIPGwrl1.js} +1 -1
  29. package/dist/gateway/static/root/assets/gateway-settings-CMEA3r5u.js +1 -0
  30. package/dist/gateway/static/root/assets/{gateway-startup-retry-CanQ8UcR.js → gateway-startup-retry-Cd0Zz30N.js} +1 -1
  31. package/dist/gateway/static/root/assets/{goal-create-dialog-CNqNdEkQ.js → goal-create-dialog-B-KHKeXN.js} +1 -1
  32. package/dist/gateway/static/root/assets/goal-detail-page-BxrSoWdj.js +1 -0
  33. package/dist/gateway/static/root/assets/{goals-config-api-BBOX6mUl.js → goals-config-api-B95KdGMj.js} +1 -1
  34. package/dist/gateway/static/root/assets/{goals-page-BP1kfvWv.js → goals-page-BTJzIl28.js} +2 -2
  35. package/dist/gateway/static/root/assets/{goals-settings-Bh3A7OZV.js → goals-settings-BJyEuLLm.js} +1 -1
  36. package/dist/gateway/static/root/assets/heartbeat-settings-wkOjYNQT.js +1 -0
  37. package/dist/gateway/static/root/assets/index-BLaXr6Ev.css +1 -0
  38. package/dist/gateway/static/root/assets/index-c_9TVr_C.js +191 -0
  39. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-B4TKJHla.js → keyboard-shortcuts-settings-BT8T4DyC.js} +1 -1
  40. package/dist/gateway/static/root/assets/logs-page-CrxBJUgI.js +2 -0
  41. package/dist/gateway/static/root/assets/{markdown-split-DcFtdLci.js → markdown-split-Dv66bO2b.js} +1 -1
  42. package/dist/gateway/static/root/assets/{media-plugins-B6SmeLVB.js → media-plugins-BhIQU5yS.js} +1 -1
  43. package/dist/gateway/static/root/assets/messages-O6TAtdFC.js +3 -0
  44. package/dist/gateway/static/root/assets/models-hub-panel-DOOpz6y1.js +2 -0
  45. package/dist/gateway/static/root/assets/notes-page-Br16pK9v.js +1 -0
  46. package/dist/gateway/static/root/assets/notes-workbench-PSJAi0ZC.js +2 -0
  47. package/dist/gateway/static/root/assets/{preview-open-alternatives-C29O19s7.js → preview-open-alternatives-DGzet1d7.js} +1 -1
  48. package/dist/gateway/static/root/assets/project-detail-page-CIGGgKuw.js +1 -0
  49. package/dist/gateway/static/root/assets/projects-page-B2grhsBt.js +1 -0
  50. package/dist/gateway/static/root/assets/remote-access-hub-CXMORxBD.js +1 -0
  51. package/dist/gateway/static/root/assets/{save-bar-controls-B4ad9GfB.js → save-bar-controls-Cqgb-jqa.js} +1 -1
  52. package/dist/gateway/static/root/assets/{schedule-field-DdYncfLR.js → schedule-field-DVZcI8Yt.js} +1 -1
  53. package/dist/gateway/static/root/assets/{schema-form-BMTrDE-7.js → schema-form-Bj7sOxC8.js} +1 -1
  54. package/dist/gateway/static/root/assets/sessions-page-Bi2wkBzU.js +1 -0
  55. package/dist/gateway/static/root/assets/settings-advanced-gate-B1L3G4IA.js +1 -0
  56. package/dist/gateway/static/root/assets/{settings-collapsible-section-MwTW2eK4.js → settings-collapsible-section-BmXn-8N6.js} +1 -1
  57. package/dist/gateway/static/root/assets/{settings-form-section-Dg6LBbcr.js → settings-form-section-BnqYMWHR.js} +1 -1
  58. package/dist/gateway/static/root/assets/settings-page-BfRSHJmO.js +1 -0
  59. package/dist/gateway/static/root/assets/{settings-page-layout-BX4T-OLF.js → settings-page-layout-CdWZU1hd.js} +1 -1
  60. package/dist/gateway/static/root/assets/{setup-status-panel-Ce1pcFtR.js → setup-status-panel-CWtPM7RK.js} +1 -1
  61. package/dist/gateway/static/root/assets/{share-preview-page-DWE-dUFh.js → share-preview-page-IB1v8i86.js} +1 -1
  62. package/dist/gateway/static/root/assets/shares-settings-ngbsBgij.js +1 -0
  63. package/dist/gateway/static/root/assets/skill-reload-api-BIe442Gv.js +1 -0
  64. package/dist/gateway/static/root/assets/skills-page-BfchZRVa.js +2 -0
  65. package/dist/gateway/static/root/assets/{system-settings-panel-Dd6Y35Cm.js → system-settings-panel-BxQ384RC.js} +1 -1
  66. package/dist/gateway/static/root/assets/{typed-models-lib-Cx6XV5A2.js → typed-models-lib-BkcpvFYO.js} +1 -1
  67. package/dist/gateway/static/root/assets/{use-channel-catalog-D4sMbmy7.js → use-channel-catalog-Cd0FaEQ4.js} +1 -1
  68. package/dist/gateway/static/root/assets/{user-profile-settings-panel-Bx-hjMQc.js → user-profile-settings-panel-DQ7NnRSY.js} +1 -1
  69. package/dist/gateway/static/root/assets/{utils-D7b_vZnv.js → utils-YKhVf7Ka.js} +1 -1
  70. package/dist/gateway/static/root/assets/voice-api-key-field-C5Ov8Uk_.js +1 -0
  71. package/dist/gateway/static/root/assets/{workflow-run-setup-panel--TdohF5N.js → workflow-run-setup-panel-BYD9BtOq.js} +2 -2
  72. package/dist/gateway/static/root/assets/{workflow-start-dialog-B0lavx_o.js → workflow-start-dialog-BNJVCWoS.js} +1 -1
  73. package/dist/gateway/static/root/assets/workflows-page-BYF29ANm.js +18 -0
  74. package/dist/gateway/static/root/index.html +5 -5
  75. package/dist/package.js +1 -1
  76. package/dist/src/agent/agent-manager.d.ts +6 -1
  77. package/dist/src/agent/agent-manager.js +28 -12
  78. package/dist/src/agent/agent-manager.js.map +1 -1
  79. package/dist/src/agent/context/workspace-templates/AGENTS.md +1 -1
  80. package/dist/src/agent/embedded/xopc-tools-bridge.js +11 -7
  81. package/dist/src/agent/embedded/xopc-tools-bridge.js.map +1 -1
  82. package/dist/src/agent/lifecycle/progress.js +3 -1
  83. package/dist/src/agent/lifecycle/progress.js.map +1 -1
  84. package/dist/src/agent/lifecycle/timeout-wrapper.d.ts +2 -2
  85. package/dist/src/agent/lifecycle/timeout-wrapper.js +4 -4
  86. package/dist/src/agent/lifecycle/timeout-wrapper.js.map +1 -1
  87. package/dist/src/agent/memory/summary-generator.d.ts +1 -1
  88. package/dist/src/agent/memory/summary-generator.js +1 -2
  89. package/dist/src/agent/memory/summary-generator.js.map +1 -1
  90. package/dist/src/agent/middleware/index.d.ts +1 -1
  91. package/dist/src/agent/middleware/self-verify.d.ts +44 -14
  92. package/dist/src/agent/middleware/self-verify.js +214 -44
  93. package/dist/src/agent/middleware/self-verify.js.map +1 -1
  94. package/dist/src/agent/orchestration/agent-event-handler.js +57 -15
  95. package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
  96. package/dist/src/agent/prompt/sections/tooling.js +18 -13
  97. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  98. package/dist/src/agent/prompt/system-reminder.js +2 -2
  99. package/dist/src/agent/prompt/system-reminder.js.map +1 -1
  100. package/dist/src/agent/sandbox/sanitize-env-vars.d.ts +2 -2
  101. package/dist/src/agent/sandbox/sanitize-env-vars.js +2 -2
  102. package/dist/src/agent/sandbox/sanitize-env-vars.js.map +1 -1
  103. package/dist/src/agent/sandbox/types.d.ts +2 -2
  104. package/dist/src/agent/sandbox/types.js.map +1 -1
  105. package/dist/src/agent/service/btw-query.js +1 -1
  106. package/dist/src/agent/service/btw-query.js.map +1 -1
  107. package/dist/src/agent/service/process-direct-one-shot.js +6 -2
  108. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  109. package/dist/src/agent/service/process-direct-streaming.js +12 -7
  110. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  111. package/dist/src/agent/service.js +2 -1
  112. package/dist/src/agent/service.js.map +1 -1
  113. package/dist/src/agent/skills/skill-tool-gating.js +1 -1
  114. package/dist/src/agent/skills/skill-tool-gating.js.map +1 -1
  115. package/dist/src/agent/starter-agents.js +9 -9
  116. package/dist/src/agent/starter-agents.js.map +1 -1
  117. package/dist/src/agent/tools/apply-patch.d.ts +25 -0
  118. package/dist/src/agent/tools/apply-patch.js +256 -0
  119. package/dist/src/agent/tools/apply-patch.js.map +1 -0
  120. package/dist/src/agent/tools/delegate-tool.d.ts +1 -1
  121. package/dist/src/agent/tools/delegate-tool.js +3 -3
  122. package/dist/src/agent/tools/delegate-tool.js.map +1 -1
  123. package/dist/src/agent/tools/exec-command.d.ts +30 -0
  124. package/dist/src/agent/tools/exec-command.js +224 -0
  125. package/dist/src/agent/tools/exec-command.js.map +1 -0
  126. package/dist/src/agent/tools/execute-code-tool.js +7 -4
  127. package/dist/src/agent/tools/execute-code-tool.js.map +1 -1
  128. package/dist/src/agent/tools/factory.d.ts +3 -3
  129. package/dist/src/agent/tools/factory.js +8 -9
  130. package/dist/src/agent/tools/factory.js.map +1 -1
  131. package/dist/src/agent/tools/goal-tool.d.ts +5 -1
  132. package/dist/src/agent/tools/goal-tool.js +8 -2
  133. package/dist/src/agent/tools/goal-tool.js.map +1 -1
  134. package/dist/src/agent/tools/index.d.ts +4 -3
  135. package/dist/src/agent/tools/index.js +5 -4
  136. package/dist/src/agent/tools/skills-tools.d.ts +1 -1
  137. package/dist/src/agent/tools/skills-tools.js.map +1 -1
  138. package/dist/src/agent/tools/update-plan-tool.d.ts +11 -0
  139. package/dist/src/agent/tools/update-plan-tool.js +72 -0
  140. package/dist/src/agent/tools/update-plan-tool.js.map +1 -0
  141. package/dist/src/agent/workflow/builtins/debug-incident.d.ts +1 -1
  142. package/dist/src/agent/workflow/builtins/debug-incident.js +1 -1
  143. package/dist/src/agent/workflow/builtins/debug-incident.js.map +1 -1
  144. package/dist/src/agent/workflow/builtins/pr-review.d.ts +1 -1
  145. package/dist/src/agent/workflow/builtins/pr-review.js +1 -1
  146. package/dist/src/agent/workflow/builtins/pr-review.js.map +1 -1
  147. package/dist/src/agent/workflow/builtins/release-check.d.ts +1 -1
  148. package/dist/src/agent/workflow/builtins/release-check.js +1 -1
  149. package/dist/src/agent/workflow/builtins/release-check.js.map +1 -1
  150. package/dist/src/agent/workflow/step-labels.js +7 -3
  151. package/dist/src/agent/workflow/step-labels.js.map +1 -1
  152. package/dist/src/chat-commands/agent-edit.js +1 -1
  153. package/dist/src/chat-commands/agent-edit.js.map +1 -1
  154. package/dist/src/chat-commands/builtins/goal.js +4 -1
  155. package/dist/src/chat-commands/builtins/goal.js.map +1 -1
  156. package/dist/src/chat-commands/builtins/review.d.ts +1 -0
  157. package/dist/src/chat-commands/builtins/review.js +167 -0
  158. package/dist/src/chat-commands/builtins/review.js.map +1 -0
  159. package/dist/src/chat-commands/index.d.ts +1 -0
  160. package/dist/src/chat-commands/index.js +3 -1
  161. package/dist/src/chat-commands/index.js.map +1 -1
  162. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  163. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  164. package/dist/src/config/agent-profile.js +1 -1
  165. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  166. package/dist/src/gateway/agent-builtin-tools.js +3 -2
  167. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  168. package/dist/src/gateway/agents-admin.js +1 -1
  169. package/dist/src/gateway/chat-stream/mapper.d.ts +6 -0
  170. package/dist/src/gateway/chat-stream/mapper.js +149 -6
  171. package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
  172. package/dist/src/gateway/chat-stream/protocol.d.ts +51 -1
  173. package/dist/src/gateway/hono/routes/commands-skills.js +21 -0
  174. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  175. package/dist/src/gateway/hono/routes/index.js +2 -0
  176. package/dist/src/gateway/hono/routes/index.js.map +1 -1
  177. package/dist/src/gateway/hono/routes/lazy-bundles.js +1 -0
  178. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  179. package/dist/src/gateway/hono/routes/projects.js +136 -14
  180. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  181. package/dist/src/gateway/hono/routes/search.d.ts +3 -0
  182. package/dist/src/gateway/hono/routes/search.js +47 -0
  183. package/dist/src/gateway/hono/routes/search.js.map +1 -0
  184. package/dist/src/gateway/security/dangerous-tools.js +1 -1
  185. package/dist/src/gateway/security/dangerous-tools.js.map +1 -1
  186. package/dist/src/infra/update-restart.js +1 -1
  187. package/dist/src/projects/index.d.ts +3 -0
  188. package/dist/src/projects/index.js +4 -1
  189. package/dist/src/projects/project-agent-suggestion.d.ts +14 -0
  190. package/dist/src/projects/project-agent-suggestion.js +19 -0
  191. package/dist/src/projects/project-agent-suggestion.js.map +1 -0
  192. package/dist/src/projects/project-kind.d.ts +13 -0
  193. package/dist/src/projects/project-kind.js +147 -0
  194. package/dist/src/projects/project-kind.js.map +1 -0
  195. package/dist/src/projects/project-service.d.ts +15 -0
  196. package/dist/src/projects/project-service.js +96 -3
  197. package/dist/src/projects/project-service.js.map +1 -1
  198. package/dist/src/projects/project-store.js +32 -8
  199. package/dist/src/projects/project-store.js.map +1 -1
  200. package/dist/src/projects/types.d.ts +4 -1
  201. package/dist/src/projects/workspace-project.d.ts +22 -0
  202. package/dist/src/projects/workspace-project.js +143 -0
  203. package/dist/src/projects/workspace-project.js.map +1 -0
  204. package/dist/src/review/review-git.d.ts +48 -0
  205. package/dist/src/review/review-git.js +333 -0
  206. package/dist/src/review/review-git.js.map +1 -0
  207. package/dist/src/review/review-types.d.ts +22 -0
  208. package/dist/src/review/review-types.js +29 -0
  209. package/dist/src/review/review-types.js.map +1 -0
  210. package/dist/src/session/session-context-for-llm.js +151 -0
  211. package/dist/src/session/session-context-for-llm.js.map +1 -1
  212. package/dist/src/storage/sqlite/migrations/021_projects_fts.sql +21 -0
  213. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  214. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  215. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  216. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  217. package/dist/src/storage/sqlite/schema.js +1 -1
  218. package/dist/src/tui/backends/embedded-backend.d.ts +8 -1
  219. package/dist/src/tui/backends/embedded-backend.js +60 -1
  220. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  221. package/dist/src/tui/backends/gateway-sse-backend.d.ts +9 -1
  222. package/dist/src/tui/backends/gateway-sse-backend.js +29 -0
  223. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  224. package/dist/src/tui/components/assistant-message.js +35 -0
  225. package/dist/src/tui/components/assistant-message.js.map +1 -1
  226. package/dist/src/tui/tui-agent-events.js +25 -0
  227. package/dist/src/tui/tui-agent-events.js.map +1 -1
  228. package/dist/src/tui/tui-backend.d.ts +20 -0
  229. package/dist/src/tui/tui-commands.d.ts +1 -0
  230. package/dist/src/tui/tui-commands.js +110 -4
  231. package/dist/src/tui/tui-commands.js.map +1 -1
  232. package/dist/src/tui/tui-picker-overlay.d.ts +2 -0
  233. package/dist/src/tui/tui-picker-overlay.js +153 -1
  234. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  235. package/dist/src/tui/tui.js +36 -2
  236. package/dist/src/tui/tui.js.map +1 -1
  237. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  238. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  239. package/package.json +1 -1
  240. package/dist/gateway/static/root/assets/agents-SsQrj9B-.js +0 -2
  241. package/dist/gateway/static/root/assets/apps-page-CYb6fame.js +0 -1
  242. package/dist/gateway/static/root/assets/automations-page-DpOOq1nk.js +0 -1
  243. package/dist/gateway/static/root/assets/browser-settings-page-9nXxgh4u.js +0 -8
  244. package/dist/gateway/static/root/assets/capability-presets-settings-panel-D528_YFy.js +0 -1
  245. package/dist/gateway/static/root/assets/channels-settings-Ck-3h5lI.js +0 -1
  246. package/dist/gateway/static/root/assets/connectors-page-DL-fAqE_.js +0 -2
  247. package/dist/gateway/static/root/assets/gateway-settings-mmmnIH27.js +0 -1
  248. package/dist/gateway/static/root/assets/goal-detail-page-Ceu5zrN6.js +0 -1
  249. package/dist/gateway/static/root/assets/heartbeat-settings-YoYgKlfX.js +0 -1
  250. package/dist/gateway/static/root/assets/index-DdqSO9R2.js +0 -191
  251. package/dist/gateway/static/root/assets/index-jGB-2nI-.css +0 -1
  252. package/dist/gateway/static/root/assets/logs-page-BgVk5DvZ.js +0 -2
  253. package/dist/gateway/static/root/assets/messages-B5O4OIEo.js +0 -3
  254. package/dist/gateway/static/root/assets/models-hub-panel-BU0x8PGP.js +0 -2
  255. package/dist/gateway/static/root/assets/notes-page-D6JYVP4I.js +0 -1
  256. package/dist/gateway/static/root/assets/notes-workbench-mqRJYnJS.js +0 -2
  257. package/dist/gateway/static/root/assets/project-detail-page-DOTgzoeh.js +0 -1
  258. package/dist/gateway/static/root/assets/projects-page-DGUIb4y5.js +0 -1
  259. package/dist/gateway/static/root/assets/remote-access-hub-DVKKUj3u.js +0 -1
  260. package/dist/gateway/static/root/assets/sessions-page-BVbzUWxW.js +0 -1
  261. package/dist/gateway/static/root/assets/settings-advanced-gate-DrNNoSqE.js +0 -1
  262. package/dist/gateway/static/root/assets/settings-page-CMDqgeMR.js +0 -1
  263. package/dist/gateway/static/root/assets/shares-settings-aKSraR8l.js +0 -1
  264. package/dist/gateway/static/root/assets/skill-reload-api-CS-FU_B-.js +0 -1
  265. package/dist/gateway/static/root/assets/skills-page-BaF3u0LA.js +0 -2
  266. package/dist/gateway/static/root/assets/voice-api-key-field-CkhbRt1q.js +0 -1
  267. package/dist/gateway/static/root/assets/workflows-page-CZR05Bu_.js +0 -18
  268. package/dist/src/agent/tools/edit.d.ts +0 -14
  269. package/dist/src/agent/tools/edit.js +0 -132
  270. package/dist/src/agent/tools/edit.js.map +0 -1
  271. package/dist/src/agent/tools/shell.d.ts +0 -15
  272. package/dist/src/agent/tools/shell.js +0 -158
  273. package/dist/src/agent/tools/shell.js.map +0 -1
@@ -4,7 +4,12 @@ var ChatStreamMapper = class {
4
4
  currentAssistantMessageId;
5
5
  lastAssistantMessageId;
6
6
  currentAssistantText = "";
7
+ currentAssistantReviewEmitted = false;
7
8
  toolCallToMessageId = /* @__PURE__ */ new Map();
9
+ turnDiffs = [];
10
+ turnDiffFiles = /* @__PURE__ */ new Set();
11
+ turnDiffAdded = 0;
12
+ turnDiffRemoved = 0;
8
13
  started = false;
9
14
  ended = false;
10
15
  constructor(opts) {
@@ -80,12 +85,21 @@ var ChatStreamMapper = class {
80
85
  const messageId = this.nextAssistantMessageId();
81
86
  this.currentAssistantMessageId = messageId;
82
87
  this.currentAssistantText = "";
88
+ this.currentAssistantReviewEmitted = false;
83
89
  return [this.make("assistant_message_start", { messageId })];
84
90
  }
85
91
  mapMessageUpdate(event) {
86
92
  const message = event.message;
87
93
  if (message?.role !== "assistant") return [];
88
94
  const messageId = this.ensureAssistantMessageId();
95
+ const review = extractReview(message);
96
+ if (review && !this.currentAssistantReviewEmitted) {
97
+ this.currentAssistantReviewEmitted = true;
98
+ return [this.make("review", {
99
+ messageId,
100
+ review
101
+ })];
102
+ }
89
103
  const delta = event.assistantMessageEvent;
90
104
  if (delta?.type === "text_delta" && typeof delta.delta === "string" && delta.delta) {
91
105
  const text = extractTextFromMessage(message);
@@ -118,6 +132,14 @@ var ChatStreamMapper = class {
118
132
  if (message?.role !== "assistant") return [];
119
133
  const messageId = this.ensureAssistantMessageId();
120
134
  const events = [];
135
+ const review = extractReview(message);
136
+ if (review && !this.currentAssistantReviewEmitted) {
137
+ this.currentAssistantReviewEmitted = true;
138
+ events.push(this.make("review", {
139
+ messageId,
140
+ review
141
+ }));
142
+ }
121
143
  const text = extractTextFromMessage(message);
122
144
  const suffix = appendSuffix(this.currentAssistantText, text);
123
145
  if (suffix) events.push(this.make("assistant_delta", {
@@ -126,6 +148,19 @@ var ChatStreamMapper = class {
126
148
  }));
127
149
  this.currentAssistantText = text || this.currentAssistantText;
128
150
  events.push(this.make("thinking_end", { messageId }));
151
+ if (this.turnDiffs.length > 0) {
152
+ events.push(this.make("turn_diff", {
153
+ messageId,
154
+ files: [...this.turnDiffFiles],
155
+ diff: this.turnDiffs.join("\n"),
156
+ added: this.turnDiffAdded,
157
+ removed: this.turnDiffRemoved
158
+ }));
159
+ this.turnDiffs = [];
160
+ this.turnDiffFiles.clear();
161
+ this.turnDiffAdded = 0;
162
+ this.turnDiffRemoved = 0;
163
+ }
129
164
  events.push(this.make("assistant_message_end", {
130
165
  messageId,
131
166
  usage: extractUsage(message)
@@ -133,19 +168,31 @@ var ChatStreamMapper = class {
133
168
  this.lastAssistantMessageId = messageId;
134
169
  this.currentAssistantMessageId = void 0;
135
170
  this.currentAssistantText = "";
171
+ this.currentAssistantReviewEmitted = false;
136
172
  return events;
137
173
  }
138
174
  mapToolStart(event) {
139
175
  const toolCallId = String(event.toolCallId ?? "");
140
176
  if (!toolCallId) return [];
141
177
  const messageId = this.ensureAssistantMessageId();
178
+ const toolName = String(event.toolName ?? "unknown");
142
179
  this.toolCallToMessageId.set(toolCallId, messageId);
143
- return [this.make("tool_start", {
180
+ const events = [this.make("tool_start", {
144
181
  messageId,
145
182
  toolCallId,
146
- toolName: String(event.toolName ?? "unknown"),
183
+ toolName,
147
184
  args: event.args
148
185
  })];
186
+ if (toolName === "exec_command") {
187
+ const args = asRecord(event.args);
188
+ events.push(this.make("command_started", {
189
+ messageId,
190
+ toolCallId,
191
+ command: String(args?.cmd ?? args?.command ?? ""),
192
+ cwd: typeof args?.cwd === "string" ? args.cwd : void 0
193
+ }));
194
+ }
195
+ return events;
149
196
  }
150
197
  mapToolUpdate(event) {
151
198
  const toolCallId = String(event.toolCallId ?? "");
@@ -154,27 +201,79 @@ var ChatStreamMapper = class {
154
201
  const partial = event.partialResult;
155
202
  const details = extractDetails(partial);
156
203
  const textDelta = extractText(partial);
157
- return [this.make("tool_update", {
204
+ const toolName = String(event.toolName ?? "unknown");
205
+ const events = [this.make("tool_update", {
158
206
  messageId,
159
207
  toolCallId,
160
- toolName: String(event.toolName ?? "unknown"),
208
+ toolName,
161
209
  details,
162
210
  textDelta
163
211
  })];
212
+ if (toolName === "exec_command") {
213
+ const rec = asRecord(details);
214
+ if (rec?.kind === "command_output_delta") {
215
+ const stream = rec.stream === "stderr" ? "stderr" : "stdout";
216
+ const delta = typeof rec.delta === "string" ? rec.delta : "";
217
+ if (delta) events.push(this.make("command_output_delta", {
218
+ messageId,
219
+ toolCallId,
220
+ stream,
221
+ delta
222
+ }));
223
+ }
224
+ }
225
+ return events;
164
226
  }
165
227
  mapToolEnd(event) {
166
228
  const toolCallId = String(event.toolCallId ?? "");
167
229
  if (!toolCallId) return [];
168
230
  const messageId = this.toolCallToMessageId.get(toolCallId) ?? this.ensureAssistantMessageId();
169
231
  const result = normalizeToolResult(event.result);
170
- return [this.make("tool_end", {
232
+ const toolName = String(event.toolName ?? "unknown");
233
+ const events = [this.make("tool_end", {
171
234
  messageId,
172
235
  toolCallId,
173
- toolName: String(event.toolName ?? "unknown"),
236
+ toolName,
174
237
  status: event.isError ? "error" : "success",
175
238
  result,
176
239
  errorMessage: event.isError ? result?.text : void 0
177
240
  })];
241
+ const details = asRecord(result?.details);
242
+ if (toolName === "exec_command" && details) events.push(this.make("command_completed", {
243
+ messageId,
244
+ toolCallId,
245
+ command: typeof details.command === "string" ? details.command : "",
246
+ cwd: typeof details.cwd === "string" ? details.cwd : void 0,
247
+ exitCode: typeof details.exitCode === "number" ? details.exitCode : null,
248
+ durationMs: typeof details.durationMs === "number" ? details.durationMs : void 0,
249
+ timedOut: details.timedOut === true,
250
+ truncated: details.truncated === true
251
+ }));
252
+ if (toolName === "apply_patch" && details) {
253
+ const changes = Array.isArray(details.changes) ? details.changes : [];
254
+ const diff = typeof details.diff === "string" ? details.diff : "";
255
+ const added = typeof details.added === "number" ? details.added : 0;
256
+ const removed = typeof details.removed === "number" ? details.removed : 0;
257
+ if (diff || changes.length > 0) {
258
+ this.recordPatchDiff(details);
259
+ events.push(this.make("patch_applied", {
260
+ messageId,
261
+ toolCallId,
262
+ changes,
263
+ diff,
264
+ added,
265
+ removed
266
+ }));
267
+ }
268
+ }
269
+ if (toolName === "update_plan" && details) {
270
+ const plan = extractTurnPlan(details);
271
+ if (plan) events.push(this.make("turn_plan", {
272
+ messageId,
273
+ ...plan
274
+ }));
275
+ }
276
+ return events;
178
277
  }
179
278
  ensureAssistantMessageId() {
180
279
  if (!this.currentAssistantMessageId) this.currentAssistantMessageId = this.nextAssistantMessageId();
@@ -193,6 +292,18 @@ var ChatStreamMapper = class {
193
292
  payload
194
293
  };
195
294
  }
295
+ recordPatchDiff(details) {
296
+ const diff = typeof details.diff === "string" ? details.diff : "";
297
+ if (diff) this.turnDiffs.push(diff);
298
+ if (typeof details.added === "number") this.turnDiffAdded += details.added;
299
+ if (typeof details.removed === "number") this.turnDiffRemoved += details.removed;
300
+ const changes = Array.isArray(details.changes) ? details.changes : [];
301
+ for (const change of changes) {
302
+ const rec = asRecord(change);
303
+ const path = typeof rec?.moveTo === "string" ? rec.moveTo : typeof rec?.path === "string" ? rec.path : void 0;
304
+ if (path) this.turnDiffFiles.add(path);
305
+ }
306
+ }
196
307
  };
197
308
  function userMessageFromLegacyEvent(event) {
198
309
  return {
@@ -205,6 +316,18 @@ function userMessageFromLegacyEvent(event) {
205
316
  function extractTextFromMessage(message) {
206
317
  return extractText(message.content);
207
318
  }
319
+ function extractReview(message) {
320
+ const metadata = message.metadata;
321
+ const metadataReview = asRecord(metadata)?.review;
322
+ if (isReviewBlock(metadataReview)) return metadataReview;
323
+ const content = message.content;
324
+ if (Array.isArray(content)) {
325
+ for (const block of content) if (isReviewBlock(block)) return block;
326
+ }
327
+ }
328
+ function isReviewBlock(value) {
329
+ return !!value && typeof value === "object" && !Array.isArray(value) && value.type === "review";
330
+ }
208
331
  function extractText(value) {
209
332
  if (typeof value === "string") return value;
210
333
  if (!Array.isArray(value)) return void 0;
@@ -238,6 +361,9 @@ function extractDetails(value) {
238
361
  if (!value || typeof value !== "object") return void 0;
239
362
  return value.details;
240
363
  }
364
+ function asRecord(value) {
365
+ return value && typeof value === "object" && !Array.isArray(value) ? value : null;
366
+ }
241
367
  function normalizeToolResult(value) {
242
368
  if (value == null) return void 0;
243
369
  if (typeof value === "string") return { text: value };
@@ -249,6 +375,23 @@ function normalizeToolResult(value) {
249
375
  text: extractText(rec.content) ?? (typeof rec.text === "string" ? rec.text : void 0)
250
376
  };
251
377
  }
378
+ function extractTurnPlan(details) {
379
+ const plan = (Array.isArray(details.plan) ? details.plan : []).map((item) => {
380
+ const rec = asRecord(item);
381
+ const step = typeof rec?.step === "string" ? rec.step.trim() : "";
382
+ const status = rec?.status;
383
+ if (!step || status !== "pending" && status !== "in_progress" && status !== "completed") return;
384
+ return {
385
+ step,
386
+ status
387
+ };
388
+ }).filter((item) => Boolean(item));
389
+ if (plan.length === 0) return void 0;
390
+ return {
391
+ explanation: typeof details.explanation === "string" && details.explanation.trim() ? details.explanation.trim() : void 0,
392
+ plan
393
+ };
394
+ }
252
395
  //#endregion
253
396
  export { ChatStreamMapper };
254
397
 
@@ -1 +1 @@
1
- {"version":3,"file":"mapper.js","names":["message"],"sources":["../../../../src/gateway/chat-stream/mapper.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\n\nimport type { EmbeddedStreamEvent } from '../../agent/embedded/types.js';\nimport type { ChatStreamEvent, ChatStreamStatus } from './protocol.js';\n\nexport type RuntimeStreamEvent = EmbeddedStreamEvent | { type: string; [key: string]: unknown };\n\nexport interface ChatStreamMapperOptions {\n runId: string;\n sessionKey: string;\n channel: string;\n}\n\ntype ToolResultEnvelope = { content?: unknown[]; details?: unknown; text?: string };\n\nexport class ChatStreamMapper {\n private assistantIndex = 0;\n private currentAssistantMessageId: string | undefined;\n private lastAssistantMessageId: string | undefined;\n private currentAssistantText = '';\n private toolCallToMessageId = new Map<string, string>();\n private started = false;\n private ended = false;\n\n constructor(private readonly opts: ChatStreamMapperOptions) {}\n\n map(input: RuntimeStreamEvent): ChatStreamEvent[] {\n const event = input as { type: string; [key: string]: unknown };\n switch (event.type) {\n case 'agent_start':\n return this.start();\n case 'agent_end':\n return [];\n case 'message_start':\n return this.mapMessageStart(event.message);\n case 'message_update':\n return this.mapMessageUpdate(event);\n case 'message_end':\n return this.mapMessageEnd(event.message);\n case 'tool_execution_start':\n return this.mapToolStart(event);\n case 'tool_execution_update':\n return this.mapToolUpdate(event);\n case 'tool_execution_end':\n return this.mapToolEnd(event);\n case 'user_message':\n return [this.make('user_message', { message: userMessageFromLegacyEvent(event) })];\n case 'user_transcript':\n return [this.make('user_transcript', { text: String(event.text ?? ''), media: event.media })];\n case 'progress':\n return [this.make('progress', { stage: String(event.stage ?? ''), message: String(event.message ?? '') })];\n case 'compaction':\n return [\n this.make('compaction', {\n status: event.status === 'completed' || event.status === 'skipped' ? event.status : 'started',\n tokensBefore: typeof event.tokensBefore === 'number' ? event.tokensBefore : undefined,\n tokensAfter: typeof event.tokensAfter === 'number' ? event.tokensAfter : undefined,\n summary: typeof event.summary === 'string' ? event.summary : undefined,\n }),\n ];\n case 'tts_audio':\n return [\n this.make('tts_audio', {\n uri: String(event.uri ?? ''),\n mimeType: String(event.mimeType ?? 'audio/mpeg'),\n name: String(event.name ?? 'voice.mp3'),\n attachTo: 'last_assistant',\n ...(this.lastAssistantMessageId ? { messageId: this.lastAssistantMessageId } : {}),\n }),\n ];\n case 'clarify_request':\n return [\n this.make('clarify_request', {\n requestId: String(event.requestId ?? ''),\n question: String(event.question ?? ''),\n choices: Array.isArray(event.choices) ? event.choices.filter((x): x is string => typeof x === 'string') : undefined,\n default: typeof event.default === 'string' ? event.default : undefined,\n }),\n ];\n case 'error':\n return [this.make('error', { code: 'AGENT_RUN_ERROR', message: String(event.content ?? event.message ?? 'Unknown error') })];\n default:\n return [];\n }\n }\n\n start(): ChatStreamEvent[] {\n if (this.started) return [];\n this.started = true;\n return [this.make('run_start', { channel: this.opts.channel })];\n }\n\n end(status: ChatStreamStatus, summary?: string): ChatStreamEvent[] {\n if (this.ended) return [];\n this.ended = true;\n return [this.make('run_end', { status, summary })];\n }\n\n error(message: string, code = 'AGENT_RUN_ERROR'): ChatStreamEvent[] {\n return [this.make('error', { code, message })];\n }\n\n private mapMessageStart(raw: unknown): ChatStreamEvent[] {\n const message = raw as AgentMessage | undefined;\n if (message?.role !== 'assistant') return [];\n const messageId = this.nextAssistantMessageId();\n this.currentAssistantMessageId = messageId;\n this.currentAssistantText = '';\n return [this.make('assistant_message_start', { messageId })];\n }\n\n private mapMessageUpdate(event: { [key: string]: unknown }): ChatStreamEvent[] {\n const message = event.message as AgentMessage | undefined;\n if (message?.role !== 'assistant') return [];\n const messageId = this.ensureAssistantMessageId();\n const delta = event.assistantMessageEvent as { type?: unknown; delta?: unknown } | undefined;\n if (delta?.type === 'text_delta' && typeof delta.delta === 'string' && delta.delta) {\n const text = extractTextFromMessage(message);\n const suffixFromMessage = appendSuffix(this.currentAssistantText, text);\n const suffix = text ? suffixFromMessage : appendSuffix(this.currentAssistantText, delta.delta);\n if (!suffix) {\n if (text) this.currentAssistantText = text;\n return [];\n }\n this.currentAssistantText = text || `${this.currentAssistantText}${suffix}`;\n return [this.make('assistant_delta', { messageId, delta: suffix })];\n }\n if (delta?.type === 'thinking_delta' && typeof delta.delta === 'string' && delta.delta) {\n return [this.make('thinking_delta', { messageId, delta: delta.delta })];\n }\n\n const text = extractTextFromMessage(message);\n const suffix = appendSuffix(this.currentAssistantText, text);\n this.currentAssistantText = text || this.currentAssistantText;\n return suffix ? [this.make('assistant_delta', { messageId, delta: suffix })] : [];\n }\n\n private mapMessageEnd(raw: unknown): ChatStreamEvent[] {\n const message = raw as AgentMessage | undefined;\n if (message?.role !== 'assistant') return [];\n const messageId = this.ensureAssistantMessageId();\n const events: ChatStreamEvent[] = [];\n const text = extractTextFromMessage(message);\n const suffix = appendSuffix(this.currentAssistantText, text);\n if (suffix) events.push(this.make('assistant_delta', { messageId, delta: suffix }));\n this.currentAssistantText = text || this.currentAssistantText;\n events.push(this.make('thinking_end', { messageId }));\n events.push(this.make('assistant_message_end', { messageId, usage: extractUsage(message) }));\n this.lastAssistantMessageId = messageId;\n this.currentAssistantMessageId = undefined;\n this.currentAssistantText = '';\n return events;\n }\n\n private mapToolStart(event: { [key: string]: unknown }): ChatStreamEvent[] {\n const toolCallId = String(event.toolCallId ?? '');\n if (!toolCallId) return [];\n const messageId = this.ensureAssistantMessageId();\n this.toolCallToMessageId.set(toolCallId, messageId);\n return [\n this.make('tool_start', {\n messageId,\n toolCallId,\n toolName: String(event.toolName ?? 'unknown'),\n args: event.args,\n }),\n ];\n }\n\n private mapToolUpdate(event: { [key: string]: unknown }): ChatStreamEvent[] {\n const toolCallId = String(event.toolCallId ?? '');\n if (!toolCallId) return [];\n const messageId = this.toolCallToMessageId.get(toolCallId) ?? this.ensureAssistantMessageId();\n const partial = event.partialResult;\n const details = extractDetails(partial);\n const textDelta = extractText(partial);\n return [\n this.make('tool_update', {\n messageId,\n toolCallId,\n toolName: String(event.toolName ?? 'unknown'),\n details,\n textDelta,\n }),\n ];\n }\n\n private mapToolEnd(event: { [key: string]: unknown }): ChatStreamEvent[] {\n const toolCallId = String(event.toolCallId ?? '');\n if (!toolCallId) return [];\n const messageId = this.toolCallToMessageId.get(toolCallId) ?? this.ensureAssistantMessageId();\n const result = normalizeToolResult(event.result);\n return [\n this.make('tool_end', {\n messageId,\n toolCallId,\n toolName: String(event.toolName ?? 'unknown'),\n status: event.isError ? 'error' : 'success',\n result,\n errorMessage: event.isError ? result?.text : undefined,\n }),\n ];\n }\n\n private ensureAssistantMessageId(): string {\n if (!this.currentAssistantMessageId) {\n this.currentAssistantMessageId = this.nextAssistantMessageId();\n }\n return this.currentAssistantMessageId;\n }\n\n private nextAssistantMessageId(): string {\n this.assistantIndex += 1;\n return `msg_${this.opts.runId.replace(/[^a-zA-Z0-9_-]/g, '_')}_${this.assistantIndex}`;\n }\n\n private make<T extends ChatStreamEvent['type']>(\n type: T,\n payload: Extract<ChatStreamEvent, { type: T }>['payload'],\n ): Extract<ChatStreamEvent, { type: T }> {\n return {\n type,\n runId: this.opts.runId,\n sessionKey: this.opts.sessionKey,\n timestamp: Date.now(),\n payload,\n } as Extract<ChatStreamEvent, { type: T }>;\n }\n}\n\nfunction userMessageFromLegacyEvent(event: { [key: string]: unknown }): unknown {\n return {\n role: 'user',\n content: event.content ?? [],\n attachments: event.media,\n timestamp: typeof event.timestamp === 'number' ? event.timestamp : Date.now(),\n };\n}\n\nfunction extractTextFromMessage(message: AgentMessage): string {\n return extractText((message as { content?: unknown }).content);\n}\n\nfunction extractText(value: unknown): string | undefined {\n if (typeof value === 'string') return value;\n if (!Array.isArray(value)) return undefined;\n const text = value\n .map((block) => {\n if (!block || typeof block !== 'object') return '';\n const rec = block as { type?: unknown; text?: unknown };\n return rec.type === 'text' && typeof rec.text === 'string' ? rec.text : '';\n })\n .join('');\n return text || undefined;\n}\n\nfunction appendSuffix(base: string, next: string | undefined): string {\n if (!next) return '';\n if (!base) return next;\n if (next === base || base.endsWith(next)) return '';\n if (next.startsWith(base)) return next.slice(base.length);\n const max = Math.min(base.length, next.length, 512);\n for (let overlap = max; overlap > 0; overlap--) {\n if (base.slice(-overlap) === next.slice(0, overlap)) return next.slice(overlap);\n }\n return next;\n}\n\nfunction extractUsage(message: AgentMessage): AssistantMessageEndEventPayload['usage'] {\n const usage = (message as { usage?: unknown }).usage;\n if (!usage || typeof usage !== 'object') return undefined;\n const rec = usage as Record<string, unknown>;\n return {\n inputTokens: typeof rec.inputTokens === 'number' ? rec.inputTokens : undefined,\n outputTokens: typeof rec.outputTokens === 'number' ? rec.outputTokens : undefined,\n totalTokens: typeof rec.totalTokens === 'number' ? rec.totalTokens : undefined,\n cost: typeof rec.cost === 'number' ? rec.cost : undefined,\n };\n}\n\ntype AssistantMessageEndEventPayload = Extract<ChatStreamEvent, { type: 'assistant_message_end' }>['payload'];\n\nfunction extractDetails(value: unknown): unknown {\n if (!value || typeof value !== 'object') return undefined;\n return (value as Record<string, unknown>).details;\n}\n\nfunction normalizeToolResult(value: unknown): ToolResultEnvelope | undefined {\n if (value == null) return undefined;\n if (typeof value === 'string') return { text: value };\n if (typeof value !== 'object') return { text: String(value) };\n const rec = value as Record<string, unknown>;\n return {\n content: Array.isArray(rec.content) ? rec.content : undefined,\n details: rec.details,\n text: extractText(rec.content) ?? (typeof rec.text === 'string' ? rec.text : undefined),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"mapper.js","names":["message"],"sources":["../../../../src/gateway/chat-stream/mapper.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\n\nimport type { EmbeddedStreamEvent } from '../../agent/embedded/types.js';\nimport type { ChatStreamEvent, ChatStreamStatus } from './protocol.js';\n\nexport type RuntimeStreamEvent = EmbeddedStreamEvent | { type: string; [key: string]: unknown };\n\nexport interface ChatStreamMapperOptions {\n runId: string;\n sessionKey: string;\n channel: string;\n}\n\ntype ToolResultEnvelope = { content?: unknown[]; details?: unknown; text?: string };\n\nexport class ChatStreamMapper {\n private assistantIndex = 0;\n private currentAssistantMessageId: string | undefined;\n private lastAssistantMessageId: string | undefined;\n private currentAssistantText = '';\n private currentAssistantReviewEmitted = false;\n private toolCallToMessageId = new Map<string, string>();\n private turnDiffs: string[] = [];\n private turnDiffFiles = new Set<string>();\n private turnDiffAdded = 0;\n private turnDiffRemoved = 0;\n private started = false;\n private ended = false;\n\n constructor(private readonly opts: ChatStreamMapperOptions) {}\n\n map(input: RuntimeStreamEvent): ChatStreamEvent[] {\n const event = input as { type: string; [key: string]: unknown };\n switch (event.type) {\n case 'agent_start':\n return this.start();\n case 'agent_end':\n return [];\n case 'message_start':\n return this.mapMessageStart(event.message);\n case 'message_update':\n return this.mapMessageUpdate(event);\n case 'message_end':\n return this.mapMessageEnd(event.message);\n case 'tool_execution_start':\n return this.mapToolStart(event);\n case 'tool_execution_update':\n return this.mapToolUpdate(event);\n case 'tool_execution_end':\n return this.mapToolEnd(event);\n case 'user_message':\n return [this.make('user_message', { message: userMessageFromLegacyEvent(event) })];\n case 'user_transcript':\n return [this.make('user_transcript', { text: String(event.text ?? ''), media: event.media })];\n case 'progress':\n return [this.make('progress', { stage: String(event.stage ?? ''), message: String(event.message ?? '') })];\n case 'compaction':\n return [\n this.make('compaction', {\n status: event.status === 'completed' || event.status === 'skipped' ? event.status : 'started',\n tokensBefore: typeof event.tokensBefore === 'number' ? event.tokensBefore : undefined,\n tokensAfter: typeof event.tokensAfter === 'number' ? event.tokensAfter : undefined,\n summary: typeof event.summary === 'string' ? event.summary : undefined,\n }),\n ];\n case 'tts_audio':\n return [\n this.make('tts_audio', {\n uri: String(event.uri ?? ''),\n mimeType: String(event.mimeType ?? 'audio/mpeg'),\n name: String(event.name ?? 'voice.mp3'),\n attachTo: 'last_assistant',\n ...(this.lastAssistantMessageId ? { messageId: this.lastAssistantMessageId } : {}),\n }),\n ];\n case 'clarify_request':\n return [\n this.make('clarify_request', {\n requestId: String(event.requestId ?? ''),\n question: String(event.question ?? ''),\n choices: Array.isArray(event.choices) ? event.choices.filter((x): x is string => typeof x === 'string') : undefined,\n default: typeof event.default === 'string' ? event.default : undefined,\n }),\n ];\n case 'error':\n return [this.make('error', { code: 'AGENT_RUN_ERROR', message: String(event.content ?? event.message ?? 'Unknown error') })];\n default:\n return [];\n }\n }\n\n start(): ChatStreamEvent[] {\n if (this.started) return [];\n this.started = true;\n return [this.make('run_start', { channel: this.opts.channel })];\n }\n\n end(status: ChatStreamStatus, summary?: string): ChatStreamEvent[] {\n if (this.ended) return [];\n this.ended = true;\n return [this.make('run_end', { status, summary })];\n }\n\n error(message: string, code = 'AGENT_RUN_ERROR'): ChatStreamEvent[] {\n return [this.make('error', { code, message })];\n }\n\n private mapMessageStart(raw: unknown): ChatStreamEvent[] {\n const message = raw as AgentMessage | undefined;\n if (message?.role !== 'assistant') return [];\n const messageId = this.nextAssistantMessageId();\n this.currentAssistantMessageId = messageId;\n this.currentAssistantText = '';\n this.currentAssistantReviewEmitted = false;\n return [this.make('assistant_message_start', { messageId })];\n }\n\n private mapMessageUpdate(event: { [key: string]: unknown }): ChatStreamEvent[] {\n const message = event.message as AgentMessage | undefined;\n if (message?.role !== 'assistant') return [];\n const messageId = this.ensureAssistantMessageId();\n const review = extractReview(message);\n if (review && !this.currentAssistantReviewEmitted) {\n this.currentAssistantReviewEmitted = true;\n return [this.make('review', { messageId, review })];\n }\n const delta = event.assistantMessageEvent as { type?: unknown; delta?: unknown } | undefined;\n if (delta?.type === 'text_delta' && typeof delta.delta === 'string' && delta.delta) {\n const text = extractTextFromMessage(message);\n const suffixFromMessage = appendSuffix(this.currentAssistantText, text);\n const suffix = text ? suffixFromMessage : appendSuffix(this.currentAssistantText, delta.delta);\n if (!suffix) {\n if (text) this.currentAssistantText = text;\n return [];\n }\n this.currentAssistantText = text || `${this.currentAssistantText}${suffix}`;\n return [this.make('assistant_delta', { messageId, delta: suffix })];\n }\n if (delta?.type === 'thinking_delta' && typeof delta.delta === 'string' && delta.delta) {\n return [this.make('thinking_delta', { messageId, delta: delta.delta })];\n }\n\n const text = extractTextFromMessage(message);\n const suffix = appendSuffix(this.currentAssistantText, text);\n this.currentAssistantText = text || this.currentAssistantText;\n return suffix ? [this.make('assistant_delta', { messageId, delta: suffix })] : [];\n }\n\n private mapMessageEnd(raw: unknown): ChatStreamEvent[] {\n const message = raw as AgentMessage | undefined;\n if (message?.role !== 'assistant') return [];\n const messageId = this.ensureAssistantMessageId();\n const events: ChatStreamEvent[] = [];\n const review = extractReview(message);\n if (review && !this.currentAssistantReviewEmitted) {\n this.currentAssistantReviewEmitted = true;\n events.push(this.make('review', { messageId, review }));\n }\n const text = extractTextFromMessage(message);\n const suffix = appendSuffix(this.currentAssistantText, text);\n if (suffix) events.push(this.make('assistant_delta', { messageId, delta: suffix }));\n this.currentAssistantText = text || this.currentAssistantText;\n events.push(this.make('thinking_end', { messageId }));\n if (this.turnDiffs.length > 0) {\n events.push(\n this.make('turn_diff', {\n messageId,\n files: [...this.turnDiffFiles],\n diff: this.turnDiffs.join('\\n'),\n added: this.turnDiffAdded,\n removed: this.turnDiffRemoved,\n }),\n );\n this.turnDiffs = [];\n this.turnDiffFiles.clear();\n this.turnDiffAdded = 0;\n this.turnDiffRemoved = 0;\n }\n events.push(this.make('assistant_message_end', { messageId, usage: extractUsage(message) }));\n this.lastAssistantMessageId = messageId;\n this.currentAssistantMessageId = undefined;\n this.currentAssistantText = '';\n this.currentAssistantReviewEmitted = false;\n return events;\n }\n\n private mapToolStart(event: { [key: string]: unknown }): ChatStreamEvent[] {\n const toolCallId = String(event.toolCallId ?? '');\n if (!toolCallId) return [];\n const messageId = this.ensureAssistantMessageId();\n const toolName = String(event.toolName ?? 'unknown');\n this.toolCallToMessageId.set(toolCallId, messageId);\n const events: ChatStreamEvent[] = [\n this.make('tool_start', {\n messageId,\n toolCallId,\n toolName,\n args: event.args,\n }),\n ];\n if (toolName === 'exec_command') {\n const args = asRecord(event.args);\n events.push(\n this.make('command_started', {\n messageId,\n toolCallId,\n command: String(args?.cmd ?? args?.command ?? ''),\n cwd: typeof args?.cwd === 'string' ? args.cwd : undefined,\n }),\n );\n }\n return events;\n }\n\n private mapToolUpdate(event: { [key: string]: unknown }): ChatStreamEvent[] {\n const toolCallId = String(event.toolCallId ?? '');\n if (!toolCallId) return [];\n const messageId = this.toolCallToMessageId.get(toolCallId) ?? this.ensureAssistantMessageId();\n const partial = event.partialResult;\n const details = extractDetails(partial);\n const textDelta = extractText(partial);\n const toolName = String(event.toolName ?? 'unknown');\n const events: ChatStreamEvent[] = [\n this.make('tool_update', {\n messageId,\n toolCallId,\n toolName,\n details,\n textDelta,\n }),\n ];\n if (toolName === 'exec_command') {\n const rec = asRecord(details);\n if (rec?.kind === 'command_output_delta') {\n const stream = rec.stream === 'stderr' ? 'stderr' : 'stdout';\n const delta = typeof rec.delta === 'string' ? rec.delta : '';\n if (delta) {\n events.push(this.make('command_output_delta', { messageId, toolCallId, stream, delta }));\n }\n }\n }\n return events;\n }\n\n private mapToolEnd(event: { [key: string]: unknown }): ChatStreamEvent[] {\n const toolCallId = String(event.toolCallId ?? '');\n if (!toolCallId) return [];\n const messageId = this.toolCallToMessageId.get(toolCallId) ?? this.ensureAssistantMessageId();\n const result = normalizeToolResult(event.result);\n const toolName = String(event.toolName ?? 'unknown');\n const events: ChatStreamEvent[] = [\n this.make('tool_end', {\n messageId,\n toolCallId,\n toolName,\n status: event.isError ? 'error' : 'success',\n result,\n errorMessage: event.isError ? result?.text : undefined,\n }),\n ];\n const details = asRecord(result?.details);\n if (toolName === 'exec_command' && details) {\n events.push(\n this.make('command_completed', {\n messageId,\n toolCallId,\n command: typeof details.command === 'string' ? details.command : '',\n cwd: typeof details.cwd === 'string' ? details.cwd : undefined,\n exitCode: typeof details.exitCode === 'number' ? details.exitCode : null,\n durationMs: typeof details.durationMs === 'number' ? details.durationMs : undefined,\n timedOut: details.timedOut === true,\n truncated: details.truncated === true,\n }),\n );\n }\n if (toolName === 'apply_patch' && details) {\n const changes = Array.isArray(details.changes) ? details.changes : [];\n const diff = typeof details.diff === 'string' ? details.diff : '';\n const added = typeof details.added === 'number' ? details.added : 0;\n const removed = typeof details.removed === 'number' ? details.removed : 0;\n if (diff || changes.length > 0) {\n this.recordPatchDiff(details);\n events.push(this.make('patch_applied', { messageId, toolCallId, changes, diff, added, removed }));\n }\n }\n if (toolName === 'update_plan' && details) {\n const plan = extractTurnPlan(details);\n if (plan) {\n events.push(this.make('turn_plan', { messageId, ...plan }));\n }\n }\n return events;\n }\n\n private ensureAssistantMessageId(): string {\n if (!this.currentAssistantMessageId) {\n this.currentAssistantMessageId = this.nextAssistantMessageId();\n }\n return this.currentAssistantMessageId;\n }\n\n private nextAssistantMessageId(): string {\n this.assistantIndex += 1;\n return `msg_${this.opts.runId.replace(/[^a-zA-Z0-9_-]/g, '_')}_${this.assistantIndex}`;\n }\n\n private make<T extends ChatStreamEvent['type']>(\n type: T,\n payload: Extract<ChatStreamEvent, { type: T }>['payload'],\n ): Extract<ChatStreamEvent, { type: T }> {\n return {\n type,\n runId: this.opts.runId,\n sessionKey: this.opts.sessionKey,\n timestamp: Date.now(),\n payload,\n } as Extract<ChatStreamEvent, { type: T }>;\n }\n\n private recordPatchDiff(details: Record<string, unknown>): void {\n const diff = typeof details.diff === 'string' ? details.diff : '';\n if (diff) this.turnDiffs.push(diff);\n if (typeof details.added === 'number') this.turnDiffAdded += details.added;\n if (typeof details.removed === 'number') this.turnDiffRemoved += details.removed;\n const changes = Array.isArray(details.changes) ? details.changes : [];\n for (const change of changes) {\n const rec = asRecord(change);\n const path = typeof rec?.moveTo === 'string'\n ? rec.moveTo\n : typeof rec?.path === 'string'\n ? rec.path\n : undefined;\n if (path) this.turnDiffFiles.add(path);\n }\n }\n}\n\nfunction userMessageFromLegacyEvent(event: { [key: string]: unknown }): unknown {\n return {\n role: 'user',\n content: event.content ?? [],\n attachments: event.media,\n timestamp: typeof event.timestamp === 'number' ? event.timestamp : Date.now(),\n };\n}\n\nfunction extractTextFromMessage(message: AgentMessage): string {\n return extractText((message as { content?: unknown }).content);\n}\n\nfunction extractReview(message: AgentMessage): unknown {\n const metadata = (message as { metadata?: unknown }).metadata;\n const metadataReview = asRecord(metadata)?.review;\n if (isReviewBlock(metadataReview)) return metadataReview;\n const content = (message as { content?: unknown }).content;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (isReviewBlock(block)) return block;\n }\n }\n return undefined;\n}\n\nfunction isReviewBlock(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n && (value as { type?: unknown }).type === 'review';\n}\n\nfunction extractText(value: unknown): string | undefined {\n if (typeof value === 'string') return value;\n if (!Array.isArray(value)) return undefined;\n const text = value\n .map((block) => {\n if (!block || typeof block !== 'object') return '';\n const rec = block as { type?: unknown; text?: unknown };\n return rec.type === 'text' && typeof rec.text === 'string' ? rec.text : '';\n })\n .join('');\n return text || undefined;\n}\n\nfunction appendSuffix(base: string, next: string | undefined): string {\n if (!next) return '';\n if (!base) return next;\n if (next === base || base.endsWith(next)) return '';\n if (next.startsWith(base)) return next.slice(base.length);\n const max = Math.min(base.length, next.length, 512);\n for (let overlap = max; overlap > 0; overlap--) {\n if (base.slice(-overlap) === next.slice(0, overlap)) return next.slice(overlap);\n }\n return next;\n}\n\nfunction extractUsage(message: AgentMessage): AssistantMessageEndEventPayload['usage'] {\n const usage = (message as { usage?: unknown }).usage;\n if (!usage || typeof usage !== 'object') return undefined;\n const rec = usage as Record<string, unknown>;\n return {\n inputTokens: typeof rec.inputTokens === 'number' ? rec.inputTokens : undefined,\n outputTokens: typeof rec.outputTokens === 'number' ? rec.outputTokens : undefined,\n totalTokens: typeof rec.totalTokens === 'number' ? rec.totalTokens : undefined,\n cost: typeof rec.cost === 'number' ? rec.cost : undefined,\n };\n}\n\ntype AssistantMessageEndEventPayload = Extract<ChatStreamEvent, { type: 'assistant_message_end' }>['payload'];\n\nfunction extractDetails(value: unknown): unknown {\n if (!value || typeof value !== 'object') return undefined;\n return (value as Record<string, unknown>).details;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction normalizeToolResult(value: unknown): ToolResultEnvelope | undefined {\n if (value == null) return undefined;\n if (typeof value === 'string') return { text: value };\n if (typeof value !== 'object') return { text: String(value) };\n const rec = value as Record<string, unknown>;\n return {\n content: Array.isArray(rec.content) ? rec.content : undefined,\n details: rec.details,\n text: extractText(rec.content) ?? (typeof rec.text === 'string' ? rec.text : undefined),\n };\n}\n\nfunction extractTurnPlan(details: Record<string, unknown>): { explanation?: string; plan: { step: string; status: 'pending' | 'in_progress' | 'completed' }[] } | undefined {\n const rawPlan = Array.isArray(details.plan) ? details.plan : [];\n const plan = rawPlan\n .map((item) => {\n const rec = asRecord(item);\n const step = typeof rec?.step === 'string' ? rec.step.trim() : '';\n const status = rec?.status;\n if (!step || (status !== 'pending' && status !== 'in_progress' && status !== 'completed')) {\n return undefined;\n }\n return { step, status };\n })\n .filter((item): item is { step: string; status: 'pending' | 'in_progress' | 'completed' } => Boolean(item));\n if (plan.length === 0) return undefined;\n const explanation = typeof details.explanation === 'string' && details.explanation.trim()\n ? details.explanation.trim()\n : undefined;\n return { explanation, plan };\n}\n"],"mappings":";AAeA,IAAa,mBAAb,MAA8B;CAC5B,iBAAyB;CACzB;CACA;CACA,uBAA+B;CAC/B,gCAAwC;CACxC,sCAA8B,IAAI,KAAqB;CACvD,YAA8B,EAAE;CAChC,gCAAwB,IAAI,KAAa;CACzC,gBAAwB;CACxB,kBAA0B;CAC1B,UAAkB;CAClB,QAAgB;CAEhB,YAAY,MAAgD;AAA/B,OAAA,OAAA;;CAE7B,IAAI,OAA8C;EAChD,MAAM,QAAQ;AACd,UAAQ,MAAM,MAAd;GACE,KAAK,cACH,QAAO,KAAK,OAAO;GACrB,KAAK,YACH,QAAO,EAAE;GACX,KAAK,gBACH,QAAO,KAAK,gBAAgB,MAAM,QAAQ;GAC5C,KAAK,iBACH,QAAO,KAAK,iBAAiB,MAAM;GACrC,KAAK,cACH,QAAO,KAAK,cAAc,MAAM,QAAQ;GAC1C,KAAK,uBACH,QAAO,KAAK,aAAa,MAAM;GACjC,KAAK,wBACH,QAAO,KAAK,cAAc,MAAM;GAClC,KAAK,qBACH,QAAO,KAAK,WAAW,MAAM;GAC/B,KAAK,eACH,QAAO,CAAC,KAAK,KAAK,gBAAgB,EAAE,SAAS,2BAA2B,MAAM,EAAE,CAAC,CAAC;GACpF,KAAK,kBACH,QAAO,CAAC,KAAK,KAAK,mBAAmB;IAAE,MAAM,OAAO,MAAM,QAAQ,GAAG;IAAE,OAAO,MAAM;IAAO,CAAC,CAAC;GAC/F,KAAK,WACH,QAAO,CAAC,KAAK,KAAK,YAAY;IAAE,OAAO,OAAO,MAAM,SAAS,GAAG;IAAE,SAAS,OAAO,MAAM,WAAW,GAAG;IAAE,CAAC,CAAC;GAC5G,KAAK,aACH,QAAO,CACL,KAAK,KAAK,cAAc;IACtB,QAAQ,MAAM,WAAW,eAAe,MAAM,WAAW,YAAY,MAAM,SAAS;IACpF,cAAc,OAAO,MAAM,iBAAiB,WAAW,MAAM,eAAe,KAAA;IAC5E,aAAa,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc,KAAA;IACzE,SAAS,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU,KAAA;IAC9D,CAAC,CACH;GACH,KAAK,YACH,QAAO,CACL,KAAK,KAAK,aAAa;IACrB,KAAK,OAAO,MAAM,OAAO,GAAG;IAC5B,UAAU,OAAO,MAAM,YAAY,aAAa;IAChD,MAAM,OAAO,MAAM,QAAQ,YAAY;IACvC,UAAU;IACV,GAAI,KAAK,yBAAyB,EAAE,WAAW,KAAK,wBAAwB,GAAG,EAAE;IAClF,CAAC,CACH;GACH,KAAK,kBACH,QAAO,CACL,KAAK,KAAK,mBAAmB;IAC3B,WAAW,OAAO,MAAM,aAAa,GAAG;IACxC,UAAU,OAAO,MAAM,YAAY,GAAG;IACtC,SAAS,MAAM,QAAQ,MAAM,QAAQ,GAAG,MAAM,QAAQ,QAAQ,MAAmB,OAAO,MAAM,SAAS,GAAG,KAAA;IAC1G,SAAS,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU,KAAA;IAC9D,CAAC,CACH;GACH,KAAK,QACH,QAAO,CAAC,KAAK,KAAK,SAAS;IAAE,MAAM;IAAmB,SAAS,OAAO,MAAM,WAAW,MAAM,WAAW,gBAAgB;IAAE,CAAC,CAAC;GAC9H,QACE,QAAO,EAAE;;;CAIf,QAA2B;AACzB,MAAI,KAAK,QAAS,QAAO,EAAE;AAC3B,OAAK,UAAU;AACf,SAAO,CAAC,KAAK,KAAK,aAAa,EAAE,SAAS,KAAK,KAAK,SAAS,CAAC,CAAC;;CAGjE,IAAI,QAA0B,SAAqC;AACjE,MAAI,KAAK,MAAO,QAAO,EAAE;AACzB,OAAK,QAAQ;AACb,SAAO,CAAC,KAAK,KAAK,WAAW;GAAE;GAAQ;GAAS,CAAC,CAAC;;CAGpD,MAAM,SAAiB,OAAO,mBAAsC;AAClE,SAAO,CAAC,KAAK,KAAK,SAAS;GAAE;GAAM;GAAS,CAAC,CAAC;;CAGhD,gBAAwB,KAAiC;AAEvD,MAAIA,KAAS,SAAS,YAAa,QAAO,EAAE;EAC5C,MAAM,YAAY,KAAK,wBAAwB;AAC/C,OAAK,4BAA4B;AACjC,OAAK,uBAAuB;AAC5B,OAAK,gCAAgC;AACrC,SAAO,CAAC,KAAK,KAAK,2BAA2B,EAAE,WAAW,CAAC,CAAC;;CAG9D,iBAAyB,OAAsD;EAC7E,MAAM,UAAU,MAAM;AACtB,MAAI,SAAS,SAAS,YAAa,QAAO,EAAE;EAC5C,MAAM,YAAY,KAAK,0BAA0B;EACjD,MAAM,SAAS,cAAc,QAAQ;AACrC,MAAI,UAAU,CAAC,KAAK,+BAA+B;AACjD,QAAK,gCAAgC;AACrC,UAAO,CAAC,KAAK,KAAK,UAAU;IAAE;IAAW;IAAQ,CAAC,CAAC;;EAErD,MAAM,QAAQ,MAAM;AACpB,MAAI,OAAO,SAAS,gBAAgB,OAAO,MAAM,UAAU,YAAY,MAAM,OAAO;GAClF,MAAM,OAAO,uBAAuB,QAAQ;GAC5C,MAAM,oBAAoB,aAAa,KAAK,sBAAsB,KAAK;GACvE,MAAM,SAAS,OAAO,oBAAoB,aAAa,KAAK,sBAAsB,MAAM,MAAM;AAC9F,OAAI,CAAC,QAAQ;AACX,QAAI,KAAM,MAAK,uBAAuB;AACtC,WAAO,EAAE;;AAEX,QAAK,uBAAuB,QAAQ,GAAG,KAAK,uBAAuB;AACnE,UAAO,CAAC,KAAK,KAAK,mBAAmB;IAAE;IAAW,OAAO;IAAQ,CAAC,CAAC;;AAErE,MAAI,OAAO,SAAS,oBAAoB,OAAO,MAAM,UAAU,YAAY,MAAM,MAC/E,QAAO,CAAC,KAAK,KAAK,kBAAkB;GAAE;GAAW,OAAO,MAAM;GAAO,CAAC,CAAC;EAGzE,MAAM,OAAO,uBAAuB,QAAQ;EAC5C,MAAM,SAAS,aAAa,KAAK,sBAAsB,KAAK;AAC5D,OAAK,uBAAuB,QAAQ,KAAK;AACzC,SAAO,SAAS,CAAC,KAAK,KAAK,mBAAmB;GAAE;GAAW,OAAO;GAAQ,CAAC,CAAC,GAAG,EAAE;;CAGnF,cAAsB,KAAiC;EACrD,MAAM,UAAU;AAChB,MAAI,SAAS,SAAS,YAAa,QAAO,EAAE;EAC5C,MAAM,YAAY,KAAK,0BAA0B;EACjD,MAAM,SAA4B,EAAE;EACpC,MAAM,SAAS,cAAc,QAAQ;AACrC,MAAI,UAAU,CAAC,KAAK,+BAA+B;AACjD,QAAK,gCAAgC;AACrC,UAAO,KAAK,KAAK,KAAK,UAAU;IAAE;IAAW;IAAQ,CAAC,CAAC;;EAEzD,MAAM,OAAO,uBAAuB,QAAQ;EAC5C,MAAM,SAAS,aAAa,KAAK,sBAAsB,KAAK;AAC5D,MAAI,OAAQ,QAAO,KAAK,KAAK,KAAK,mBAAmB;GAAE;GAAW,OAAO;GAAQ,CAAC,CAAC;AACnF,OAAK,uBAAuB,QAAQ,KAAK;AACzC,SAAO,KAAK,KAAK,KAAK,gBAAgB,EAAE,WAAW,CAAC,CAAC;AACrD,MAAI,KAAK,UAAU,SAAS,GAAG;AAC7B,UAAO,KACL,KAAK,KAAK,aAAa;IACrB;IACA,OAAO,CAAC,GAAG,KAAK,cAAc;IAC9B,MAAM,KAAK,UAAU,KAAK,KAAK;IAC/B,OAAO,KAAK;IACZ,SAAS,KAAK;IACf,CAAC,CACH;AACD,QAAK,YAAY,EAAE;AACnB,QAAK,cAAc,OAAO;AAC1B,QAAK,gBAAgB;AACrB,QAAK,kBAAkB;;AAEzB,SAAO,KAAK,KAAK,KAAK,yBAAyB;GAAE;GAAW,OAAO,aAAa,QAAQ;GAAE,CAAC,CAAC;AAC5F,OAAK,yBAAyB;AAC9B,OAAK,4BAA4B,KAAA;AACjC,OAAK,uBAAuB;AAC5B,OAAK,gCAAgC;AACrC,SAAO;;CAGT,aAAqB,OAAsD;EACzE,MAAM,aAAa,OAAO,MAAM,cAAc,GAAG;AACjD,MAAI,CAAC,WAAY,QAAO,EAAE;EAC1B,MAAM,YAAY,KAAK,0BAA0B;EACjD,MAAM,WAAW,OAAO,MAAM,YAAY,UAAU;AACpD,OAAK,oBAAoB,IAAI,YAAY,UAAU;EACnD,MAAM,SAA4B,CAChC,KAAK,KAAK,cAAc;GACtB;GACA;GACA;GACA,MAAM,MAAM;GACb,CAAC,CACH;AACD,MAAI,aAAa,gBAAgB;GAC/B,MAAM,OAAO,SAAS,MAAM,KAAK;AACjC,UAAO,KACL,KAAK,KAAK,mBAAmB;IAC3B;IACA;IACA,SAAS,OAAO,MAAM,OAAO,MAAM,WAAW,GAAG;IACjD,KAAK,OAAO,MAAM,QAAQ,WAAW,KAAK,MAAM,KAAA;IACjD,CAAC,CACH;;AAEH,SAAO;;CAGT,cAAsB,OAAsD;EAC1E,MAAM,aAAa,OAAO,MAAM,cAAc,GAAG;AACjD,MAAI,CAAC,WAAY,QAAO,EAAE;EAC1B,MAAM,YAAY,KAAK,oBAAoB,IAAI,WAAW,IAAI,KAAK,0BAA0B;EAC7F,MAAM,UAAU,MAAM;EACtB,MAAM,UAAU,eAAe,QAAQ;EACvC,MAAM,YAAY,YAAY,QAAQ;EACtC,MAAM,WAAW,OAAO,MAAM,YAAY,UAAU;EACpD,MAAM,SAA4B,CAChC,KAAK,KAAK,eAAe;GACvB;GACA;GACA;GACA;GACA;GACD,CAAC,CACH;AACD,MAAI,aAAa,gBAAgB;GAC/B,MAAM,MAAM,SAAS,QAAQ;AAC7B,OAAI,KAAK,SAAS,wBAAwB;IACxC,MAAM,SAAS,IAAI,WAAW,WAAW,WAAW;IACpD,MAAM,QAAQ,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ;AAC1D,QAAI,MACF,QAAO,KAAK,KAAK,KAAK,wBAAwB;KAAE;KAAW;KAAY;KAAQ;KAAO,CAAC,CAAC;;;AAI9F,SAAO;;CAGT,WAAmB,OAAsD;EACvE,MAAM,aAAa,OAAO,MAAM,cAAc,GAAG;AACjD,MAAI,CAAC,WAAY,QAAO,EAAE;EAC1B,MAAM,YAAY,KAAK,oBAAoB,IAAI,WAAW,IAAI,KAAK,0BAA0B;EAC7F,MAAM,SAAS,oBAAoB,MAAM,OAAO;EAChD,MAAM,WAAW,OAAO,MAAM,YAAY,UAAU;EACpD,MAAM,SAA4B,CAChC,KAAK,KAAK,YAAY;GACpB;GACA;GACA;GACA,QAAQ,MAAM,UAAU,UAAU;GAClC;GACA,cAAc,MAAM,UAAU,QAAQ,OAAO,KAAA;GAC9C,CAAC,CACH;EACD,MAAM,UAAU,SAAS,QAAQ,QAAQ;AACzC,MAAI,aAAa,kBAAkB,QACjC,QAAO,KACL,KAAK,KAAK,qBAAqB;GAC7B;GACA;GACA,SAAS,OAAO,QAAQ,YAAY,WAAW,QAAQ,UAAU;GACjE,KAAK,OAAO,QAAQ,QAAQ,WAAW,QAAQ,MAAM,KAAA;GACrD,UAAU,OAAO,QAAQ,aAAa,WAAW,QAAQ,WAAW;GACpE,YAAY,OAAO,QAAQ,eAAe,WAAW,QAAQ,aAAa,KAAA;GAC1E,UAAU,QAAQ,aAAa;GAC/B,WAAW,QAAQ,cAAc;GAClC,CAAC,CACH;AAEH,MAAI,aAAa,iBAAiB,SAAS;GACzC,MAAM,UAAU,MAAM,QAAQ,QAAQ,QAAQ,GAAG,QAAQ,UAAU,EAAE;GACrE,MAAM,OAAO,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO;GAC/D,MAAM,QAAQ,OAAO,QAAQ,UAAU,WAAW,QAAQ,QAAQ;GAClE,MAAM,UAAU,OAAO,QAAQ,YAAY,WAAW,QAAQ,UAAU;AACxE,OAAI,QAAQ,QAAQ,SAAS,GAAG;AAC9B,SAAK,gBAAgB,QAAQ;AAC7B,WAAO,KAAK,KAAK,KAAK,iBAAiB;KAAE;KAAW;KAAY;KAAS;KAAM;KAAO;KAAS,CAAC,CAAC;;;AAGrG,MAAI,aAAa,iBAAiB,SAAS;GACzC,MAAM,OAAO,gBAAgB,QAAQ;AACrC,OAAI,KACF,QAAO,KAAK,KAAK,KAAK,aAAa;IAAE;IAAW,GAAG;IAAM,CAAC,CAAC;;AAG/D,SAAO;;CAGT,2BAA2C;AACzC,MAAI,CAAC,KAAK,0BACR,MAAK,4BAA4B,KAAK,wBAAwB;AAEhE,SAAO,KAAK;;CAGd,yBAAyC;AACvC,OAAK,kBAAkB;AACvB,SAAO,OAAO,KAAK,KAAK,MAAM,QAAQ,mBAAmB,IAAI,CAAC,GAAG,KAAK;;CAGxE,KACE,MACA,SACuC;AACvC,SAAO;GACL;GACA,OAAO,KAAK,KAAK;GACjB,YAAY,KAAK,KAAK;GACtB,WAAW,KAAK,KAAK;GACrB;GACD;;CAGH,gBAAwB,SAAwC;EAC9D,MAAM,OAAO,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO;AAC/D,MAAI,KAAM,MAAK,UAAU,KAAK,KAAK;AACnC,MAAI,OAAO,QAAQ,UAAU,SAAU,MAAK,iBAAiB,QAAQ;AACrE,MAAI,OAAO,QAAQ,YAAY,SAAU,MAAK,mBAAmB,QAAQ;EACzE,MAAM,UAAU,MAAM,QAAQ,QAAQ,QAAQ,GAAG,QAAQ,UAAU,EAAE;AACrE,OAAK,MAAM,UAAU,SAAS;GAC5B,MAAM,MAAM,SAAS,OAAO;GAC5B,MAAM,OAAO,OAAO,KAAK,WAAW,WAChC,IAAI,SACJ,OAAO,KAAK,SAAS,WACnB,IAAI,OACJ,KAAA;AACN,OAAI,KAAM,MAAK,cAAc,IAAI,KAAK;;;;AAK5C,SAAS,2BAA2B,OAA4C;AAC9E,QAAO;EACL,MAAM;EACN,SAAS,MAAM,WAAW,EAAE;EAC5B,aAAa,MAAM;EACnB,WAAW,OAAO,MAAM,cAAc,WAAW,MAAM,YAAY,KAAK,KAAK;EAC9E;;AAGH,SAAS,uBAAuB,SAA+B;AAC7D,QAAO,YAAa,QAAkC,QAAQ;;AAGhE,SAAS,cAAc,SAAgC;CACrD,MAAM,WAAY,QAAmC;CACrD,MAAM,iBAAiB,SAAS,SAAS,EAAE;AAC3C,KAAI,cAAc,eAAe,CAAE,QAAO;CAC1C,MAAM,UAAW,QAAkC;AACnD,KAAI,MAAM,QAAQ,QAAQ;OACnB,MAAM,SAAS,QAClB,KAAI,cAAc,MAAM,CAAE,QAAO;;;AAMvC,SAAS,cAAc,OAAkD;AACvE,QAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM,IAC9D,MAA6B,SAAS;;AAG9C,SAAS,YAAY,OAAoC;AACvD,KAAI,OAAO,UAAU,SAAU,QAAO;AACtC,KAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,QAAO,KAAA;AAQlC,QAPa,MACV,KAAK,UAAU;AACd,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;EAChD,MAAM,MAAM;AACZ,SAAO,IAAI,SAAS,UAAU,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;GACxE,CACD,KAAK,GACG,IAAI,KAAA;;AAGjB,SAAS,aAAa,MAAc,MAAkC;AACpE,KAAI,CAAC,KAAM,QAAO;AAClB,KAAI,CAAC,KAAM,QAAO;AAClB,KAAI,SAAS,QAAQ,KAAK,SAAS,KAAK,CAAE,QAAO;AACjD,KAAI,KAAK,WAAW,KAAK,CAAE,QAAO,KAAK,MAAM,KAAK,OAAO;CACzD,MAAM,MAAM,KAAK,IAAI,KAAK,QAAQ,KAAK,QAAQ,IAAI;AACnD,MAAK,IAAI,UAAU,KAAK,UAAU,GAAG,UACnC,KAAI,KAAK,MAAM,CAAC,QAAQ,KAAK,KAAK,MAAM,GAAG,QAAQ,CAAE,QAAO,KAAK,MAAM,QAAQ;AAEjF,QAAO;;AAGT,SAAS,aAAa,SAAiE;CACrF,MAAM,QAAS,QAAgC;AAC/C,KAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO,KAAA;CAChD,MAAM,MAAM;AACZ,QAAO;EACL,aAAa,OAAO,IAAI,gBAAgB,WAAW,IAAI,cAAc,KAAA;EACrE,cAAc,OAAO,IAAI,iBAAiB,WAAW,IAAI,eAAe,KAAA;EACxE,aAAa,OAAO,IAAI,gBAAgB,WAAW,IAAI,cAAc,KAAA;EACrE,MAAM,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO,KAAA;EACjD;;AAKH,SAAS,eAAe,OAAyB;AAC/C,KAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO,KAAA;AAChD,QAAQ,MAAkC;;AAG5C,SAAS,SAAS,OAAgD;AAChE,QAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM,GAC7D,QACD;;AAGN,SAAS,oBAAoB,OAAgD;AAC3E,KAAI,SAAS,KAAM,QAAO,KAAA;AAC1B,KAAI,OAAO,UAAU,SAAU,QAAO,EAAE,MAAM,OAAO;AACrD,KAAI,OAAO,UAAU,SAAU,QAAO,EAAE,MAAM,OAAO,MAAM,EAAE;CAC7D,MAAM,MAAM;AACZ,QAAO;EACL,SAAS,MAAM,QAAQ,IAAI,QAAQ,GAAG,IAAI,UAAU,KAAA;EACpD,SAAS,IAAI;EACb,MAAM,YAAY,IAAI,QAAQ,KAAK,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO,KAAA;EAC9E;;AAGH,SAAS,gBAAgB,SAAmJ;CAE1K,MAAM,QADU,MAAM,QAAQ,QAAQ,KAAK,GAAG,QAAQ,OAAO,EAAE,EAE5D,KAAK,SAAS;EACb,MAAM,MAAM,SAAS,KAAK;EAC1B,MAAM,OAAO,OAAO,KAAK,SAAS,WAAW,IAAI,KAAK,MAAM,GAAG;EAC/D,MAAM,SAAS,KAAK;AACpB,MAAI,CAAC,QAAS,WAAW,aAAa,WAAW,iBAAiB,WAAW,YAC3E;AAEF,SAAO;GAAE;GAAM;GAAQ;GACvB,CACD,QAAQ,SAAoF,QAAQ,KAAK,CAAC;AAC7G,KAAI,KAAK,WAAW,EAAG,QAAO,KAAA;AAI9B,QAAO;EAAE,aAHW,OAAO,QAAQ,gBAAgB,YAAY,QAAQ,YAAY,MAAM,GACrF,QAAQ,YAAY,MAAM,GAC1B,KAAA;EACkB;EAAM"}
@@ -56,6 +56,56 @@ export type ToolEndEvent = ChatStreamEnvelope<'tool_end', {
56
56
  };
57
57
  errorMessage?: string;
58
58
  }>;
59
+ export type CommandStartedEvent = ChatStreamEnvelope<'command_started', {
60
+ messageId: string;
61
+ toolCallId: string;
62
+ command: string;
63
+ cwd?: string;
64
+ }>;
65
+ export type CommandOutputDeltaEvent = ChatStreamEnvelope<'command_output_delta', {
66
+ messageId: string;
67
+ toolCallId: string;
68
+ stream: 'stdout' | 'stderr';
69
+ delta: string;
70
+ }>;
71
+ export type CommandCompletedEvent = ChatStreamEnvelope<'command_completed', {
72
+ messageId: string;
73
+ toolCallId: string;
74
+ command: string;
75
+ cwd?: string;
76
+ exitCode: number | null;
77
+ durationMs?: number;
78
+ timedOut?: boolean;
79
+ truncated?: boolean;
80
+ }>;
81
+ export type PatchAppliedEvent = ChatStreamEnvelope<'patch_applied', {
82
+ messageId: string;
83
+ toolCallId: string;
84
+ changes: unknown[];
85
+ diff: string;
86
+ added: number;
87
+ removed: number;
88
+ }>;
89
+ export type TurnPlanStatus = 'pending' | 'in_progress' | 'completed';
90
+ export type TurnPlanUpdatedEvent = ChatStreamEnvelope<'turn_plan', {
91
+ messageId: string;
92
+ explanation?: string;
93
+ plan: {
94
+ step: string;
95
+ status: TurnPlanStatus;
96
+ }[];
97
+ }>;
98
+ export type TurnDiffEvent = ChatStreamEnvelope<'turn_diff', {
99
+ messageId: string;
100
+ files: string[];
101
+ diff: string;
102
+ added: number;
103
+ removed: number;
104
+ }>;
105
+ export type ReviewEvent = ChatStreamEnvelope<'review', {
106
+ messageId: string;
107
+ review: unknown;
108
+ }>;
59
109
  export type AssistantMessageEndEvent = ChatStreamEnvelope<'assistant_message_end', {
60
110
  messageId: string;
61
111
  usage?: {
@@ -99,4 +149,4 @@ export type StreamErrorEvent = ChatStreamEnvelope<'error', {
99
149
  message: string;
100
150
  recoverable?: boolean;
101
151
  }>;
102
- export type ChatStreamEvent = RunStartEvent | UserMessageEvent | UserTranscriptEvent | AssistantMessageStartEvent | AssistantDeltaEvent | ThinkingDeltaEvent | ThinkingEndEvent | ToolStartEvent | ToolUpdateEvent | ToolEndEvent | AssistantMessageEndEvent | ProgressEvent | CompactionEvent | TtsAudioEvent | ClarifyRequestEvent | RunEndEvent | StreamErrorEvent;
152
+ export type ChatStreamEvent = RunStartEvent | UserMessageEvent | UserTranscriptEvent | AssistantMessageStartEvent | AssistantDeltaEvent | ThinkingDeltaEvent | ThinkingEndEvent | ToolStartEvent | ToolUpdateEvent | ToolEndEvent | CommandStartedEvent | CommandOutputDeltaEvent | CommandCompletedEvent | PatchAppliedEvent | TurnPlanUpdatedEvent | TurnDiffEvent | ReviewEvent | AssistantMessageEndEvent | ProgressEvent | CompactionEvent | TtsAudioEvent | ClarifyRequestEvent | RunEndEvent | StreamErrorEvent;
@@ -1,5 +1,8 @@
1
+ import { effectiveWorkspacePathForSession } from "../../../session/session-workspace.js";
2
+ import { getProjectForSession } from "../../../projects/workspace.js";
1
3
  import { commandRegistry } from "../../../chat-commands/registry.js";
2
4
  import { isRegisteredProvider } from "../../../agent/skills/marketplace/registry.js";
5
+ import { buildReviewContext, resolveGitRoot } from "../../../review/review-git.js";
3
6
  import "../../../chat-commands/index.js";
4
7
  import "../../../agent/skills/skills-marketplace.js";
5
8
  //#region src/gateway/hono/routes/commands-skills.ts
@@ -35,6 +38,24 @@ function registerCommandsSkillsRoutes(authenticated, deps) {
35
38
  }
36
39
  });
37
40
  });
41
+ authenticated.get("/api/review/context", async (c) => {
42
+ const sessionKey = c.req.query("sessionKey")?.trim() || "agent:main:main";
43
+ try {
44
+ const payload = await buildReviewContext(await resolveGitRoot(effectiveWorkspacePathForSession(service.getConfig(), sessionKey, null, getProjectForSession(sessionKey))));
45
+ return c.json({
46
+ ok: true,
47
+ payload
48
+ });
49
+ } catch (err) {
50
+ return c.json({
51
+ ok: false,
52
+ error: {
53
+ code: "REVIEW_CONTEXT_FAILED",
54
+ message: err instanceof Error ? err.message : "Failed to load review context"
55
+ }
56
+ }, 400);
57
+ }
58
+ });
38
59
  authenticated.get("/api/chat/skills", (c) => {
39
60
  const agentId = c.req.query("agentId")?.trim() || service.getConfig().agents?.default || "main";
40
61
  const payload = service.marketplace.getAgentSkillsApi(agentId);
@@ -1 +1 @@
1
- {"version":3,"file":"commands-skills.js","names":[],"sources":["../../../../../src/gateway/hono/routes/commands-skills.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { commandRegistry } from '../../../chat-commands/index.js';\nimport { isRegisteredProvider } from '../../../agent/skills/skills-marketplace.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction parseMarketplaceProviderQuery(raw: string | undefined): string | undefined {\n const v = raw?.trim().toLowerCase();\n if (v && isRegisteredProvider(v)) return v;\n return undefined;\n}\n\nexport function registerCommandsSkillsRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service } = deps;\n\n // ========== Chat slash commands (CommandRegistry) ==========\n\n authenticated.get('/api/commands', (c) => {\n const all = commandRegistry.list();\n const commands = all\n .filter((cmd) => cmd.scope.includes('global') || cmd.scope.includes('private'))\n .map((cmd) => ({\n id: cmd.id,\n name: cmd.name,\n aliases: cmd.aliases ?? [],\n description: cmd.description,\n category: cmd.category,\n scope: cmd.scope,\n acceptsArgs: cmd.acceptsArgs ?? false,\n examples: cmd.examples ?? [],\n }));\n const extensionCommands = all\n .filter((cmd) => cmd.category === 'extension')\n .map((cmd) => ({\n id: cmd.id,\n name: cmd.name,\n description: cmd.description,\n extensionId: cmd.id.startsWith('ext.') ? cmd.id.split('.')[1] : undefined,\n }));\n return c.json({ ok: true, payload: { commands, extensionCommands } });\n });\n\n // ========== Skills (managed global skills under ~/.xopc/skills) ==========\n\n authenticated.get('/api/chat/skills', (c) => {\n const agentId = c.req.query('agentId')?.trim() || service.getConfig().agents?.default || 'main';\n const payload = service.marketplace.getAgentSkillsApi(agentId);\n return c.json({ ok: true, payload });\n });\n\n authenticated.get('/api/skills', (c) => {\n const payload = service.marketplace.getSkillsApi();\n return c.json({ ok: true, payload });\n });\n\n authenticated.get('/api/skills/status', (c) => {\n const payload = service.marketplace.getSkillsStatusApi();\n return c.json({ ok: true, payload });\n });\n\n authenticated.get('/api/skills/:skillName/content', (c) => {\n const raw = c.req.param('skillName');\n if (!raw) {\n return c.json({ ok: false, error: 'Missing skill name' }, 400);\n }\n let skillName: string;\n try {\n skillName = decodeURIComponent(raw);\n } catch {\n return c.json({ ok: false, error: 'Invalid skill name' }, 400);\n }\n const data = service.marketplace.getSkillMarkdownSource(skillName);\n if (!data) {\n return c.json({ ok: false, error: 'Skill not found' }, 404);\n }\n return c.json({ ok: true, payload: data });\n });\n\n authenticated.post('/api/skills/reload', (c) => {\n service.marketplace.reloadSkills();\n return c.json({ ok: true });\n });\n\n authenticated.patch('/api/skills/enabled', async (c) => {\n let body: { skillName?: unknown; enabled?: unknown };\n try {\n body = (await c.req.json()) as { skillName?: unknown; enabled?: unknown };\n } catch {\n return c.json({ ok: false, error: 'Invalid JSON' }, 400);\n }\n const skillName = typeof body.skillName === 'string' ? body.skillName.trim() : '';\n const enabled = body.enabled;\n if (!skillName || typeof enabled !== 'boolean') {\n return c.json({ ok: false, error: 'Expected { skillName: string, enabled: boolean }' }, 400);\n }\n try {\n service.marketplace.patchSkillEnabled(skillName, enabled);\n return c.json({ ok: true });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Update failed' },\n 400,\n );\n }\n });\n\n authenticated.get('/api/skills/marketplace', async (c) => {\n const q = c.req.query('q')?.trim() ?? '';\n const pageRaw = c.req.query('page');\n const pageSizeRaw = c.req.query('pageSize');\n const sortRaw = c.req.query('sort');\n const page = pageRaw != null && pageRaw !== '' ? Math.max(1, Number(pageRaw) || 1) : undefined;\n const pageSize =\n pageSizeRaw != null && pageSizeRaw !== ''\n ? Math.min(50, Math.max(1, Number(pageSizeRaw) || 20))\n : undefined;\n const sort =\n sortRaw === 'newest' || sortRaw === 'downloads' ? sortRaw : undefined;\n const category = c.req.query('category')?.trim() ?? '';\n const provider = parseMarketplaceProviderQuery(c.req.query('provider'));\n try {\n const payload = await service.marketplace.fetchSkillsCatalog(\n {\n q: q || undefined,\n page,\n pageSize,\n sort,\n category: category || undefined,\n },\n provider,\n );\n return c.json({ ok: true, payload });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Marketplace request failed' },\n 502,\n );\n }\n });\n\n authenticated.get('/api/skills/marketplace/provider', async (c) => {\n const info = await service.marketplace.getSkillsProvider();\n return c.json({ ok: true, payload: info });\n });\n\n /** All registered marketplace providers (built-in + extension-contributed). */\n authenticated.get('/api/skills/marketplace/providers', async (c) => {\n const [providers, current] = await Promise.all([\n service.marketplace.getSkillsProviders(),\n service.marketplace.getSkillsProvider(),\n ]);\n return c.json({ ok: true, payload: { providers, current: current.provider } });\n });\n\n authenticated.get('/api/skills/marketplace/categories', async (c) => {\n const provider = parseMarketplaceProviderQuery(c.req.query('provider'));\n try {\n const payload = await service.marketplace.fetchSkillsCategories(provider);\n return c.json({ ok: true, payload });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Marketplace categories failed' },\n 502,\n );\n }\n });\n\n authenticated.get('/api/skills/marketplace/packages/:pkgName', async (c) => {\n const raw = c.req.param('pkgName');\n if (!raw) {\n return c.json({ ok: false, error: 'Missing package name' }, 400);\n }\n let pkgName: string;\n try {\n pkgName = decodeURIComponent(raw);\n } catch {\n return c.json({ ok: false, error: 'Invalid package name' }, 400);\n }\n try {\n const provider = parseMarketplaceProviderQuery(c.req.query('provider'));\n const payload = await service.marketplace.fetchSkillsPackageDetail(pkgName, provider);\n return c.json({ ok: true, payload });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Marketplace request failed' },\n 502,\n );\n }\n });\n\n authenticated.post('/api/skills/marketplace/install', async (c) => {\n let body: { name?: unknown; version?: unknown; overwrite?: unknown; provider?: unknown };\n try {\n body = (await c.req.json()) as typeof body;\n } catch {\n return c.json({ ok: false, error: 'Invalid JSON' }, 400);\n }\n const name = typeof body.name === 'string' ? body.name.trim() : '';\n const version = typeof body.version === 'string' ? body.version.trim() : undefined;\n const overwrite =\n body.overwrite === true ||\n body.overwrite === 'true' ||\n body.overwrite === '1';\n const provider = parseMarketplaceProviderQuery(\n typeof body.provider === 'string' ? body.provider : undefined,\n );\n if (!name) {\n return c.json({ ok: false, error: 'Expected { name: string, version?: string, overwrite?: boolean }' }, 400);\n }\n try {\n const payload = await service.marketplace.installSkill({ name, version, overwrite, provider });\n return c.json({ ok: true, payload });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Install failed' },\n 400,\n );\n }\n });\n\n authenticated.post('/api/skills/upload', async (c) => {\n let body: Record<string, unknown>;\n try {\n body = await c.req.parseBody({ all: true });\n } catch {\n return c.json({ ok: false, error: 'Invalid multipart body' }, 400);\n }\n const file = body['file'];\n if (!file || typeof file !== 'object') {\n return c.json({ ok: false, error: 'Missing file field' }, 400);\n }\n let buf: Buffer;\n if (file instanceof File) {\n buf = Buffer.from(await file.arrayBuffer());\n } else if (typeof (file as Blob).arrayBuffer === 'function') {\n buf = Buffer.from(await (file as Blob).arrayBuffer());\n } else {\n return c.json({ ok: false, error: 'Invalid file upload' }, 400);\n }\n const skillIdRaw = body['skillId'];\n const overwriteRaw = body['overwrite'];\n const skillId = typeof skillIdRaw === 'string' && skillIdRaw.trim() ? skillIdRaw.trim() : undefined;\n const overwrite =\n overwriteRaw === 'true' ||\n overwriteRaw === true ||\n overwriteRaw === '1';\n\n try {\n const result = service.marketplace.installSkillZip(buf, { skillId, overwrite });\n return c.json({ ok: true, payload: result });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Install failed' },\n 400,\n );\n }\n });\n\n authenticated.delete('/api/skills/:id', (c) => {\n const id = c.req.param('id');\n if (!id) {\n return c.json({ ok: false, error: 'Missing id' }, 400);\n }\n try {\n service.marketplace.deleteSkill(id);\n return c.json({ ok: true });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Delete failed' },\n 400,\n );\n }\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"commands-skills.js","names":[],"sources":["../../../../../src/gateway/hono/routes/commands-skills.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { commandRegistry } from '../../../chat-commands/index.js';\nimport { isRegisteredProvider } from '../../../agent/skills/skills-marketplace.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport { effectiveWorkspacePathForSession } from '../../../session/session-workspace.js';\nimport { getProjectForSession } from '../../../projects/workspace.js';\nimport { buildReviewContext, resolveGitRoot } from '../../../review/review-git.js';\n\nfunction parseMarketplaceProviderQuery(raw: string | undefined): string | undefined {\n const v = raw?.trim().toLowerCase();\n if (v && isRegisteredProvider(v)) return v;\n return undefined;\n}\n\nexport function registerCommandsSkillsRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service } = deps;\n\n // ========== Chat slash commands (CommandRegistry) ==========\n\n authenticated.get('/api/commands', (c) => {\n const all = commandRegistry.list();\n const commands = all\n .filter((cmd) => cmd.scope.includes('global') || cmd.scope.includes('private'))\n .map((cmd) => ({\n id: cmd.id,\n name: cmd.name,\n aliases: cmd.aliases ?? [],\n description: cmd.description,\n category: cmd.category,\n scope: cmd.scope,\n acceptsArgs: cmd.acceptsArgs ?? false,\n examples: cmd.examples ?? [],\n }));\n const extensionCommands = all\n .filter((cmd) => cmd.category === 'extension')\n .map((cmd) => ({\n id: cmd.id,\n name: cmd.name,\n description: cmd.description,\n extensionId: cmd.id.startsWith('ext.') ? cmd.id.split('.')[1] : undefined,\n }));\n return c.json({ ok: true, payload: { commands, extensionCommands } });\n });\n\n authenticated.get('/api/review/context', async (c) => {\n const sessionKey = c.req.query('sessionKey')?.trim() || 'agent:main:main';\n try {\n const workspace = effectiveWorkspacePathForSession(\n service.getConfig(),\n sessionKey,\n null,\n getProjectForSession(sessionKey),\n );\n const cwd = await resolveGitRoot(workspace);\n const payload = await buildReviewContext(cwd);\n return c.json({ ok: true, payload });\n } catch (err) {\n return c.json(\n {\n ok: false,\n error: {\n code: 'REVIEW_CONTEXT_FAILED',\n message: err instanceof Error ? err.message : 'Failed to load review context',\n },\n },\n 400,\n );\n }\n });\n\n // ========== Skills (managed global skills under ~/.xopc/skills) ==========\n\n authenticated.get('/api/chat/skills', (c) => {\n const agentId = c.req.query('agentId')?.trim() || service.getConfig().agents?.default || 'main';\n const payload = service.marketplace.getAgentSkillsApi(agentId);\n return c.json({ ok: true, payload });\n });\n\n authenticated.get('/api/skills', (c) => {\n const payload = service.marketplace.getSkillsApi();\n return c.json({ ok: true, payload });\n });\n\n authenticated.get('/api/skills/status', (c) => {\n const payload = service.marketplace.getSkillsStatusApi();\n return c.json({ ok: true, payload });\n });\n\n authenticated.get('/api/skills/:skillName/content', (c) => {\n const raw = c.req.param('skillName');\n if (!raw) {\n return c.json({ ok: false, error: 'Missing skill name' }, 400);\n }\n let skillName: string;\n try {\n skillName = decodeURIComponent(raw);\n } catch {\n return c.json({ ok: false, error: 'Invalid skill name' }, 400);\n }\n const data = service.marketplace.getSkillMarkdownSource(skillName);\n if (!data) {\n return c.json({ ok: false, error: 'Skill not found' }, 404);\n }\n return c.json({ ok: true, payload: data });\n });\n\n authenticated.post('/api/skills/reload', (c) => {\n service.marketplace.reloadSkills();\n return c.json({ ok: true });\n });\n\n authenticated.patch('/api/skills/enabled', async (c) => {\n let body: { skillName?: unknown; enabled?: unknown };\n try {\n body = (await c.req.json()) as { skillName?: unknown; enabled?: unknown };\n } catch {\n return c.json({ ok: false, error: 'Invalid JSON' }, 400);\n }\n const skillName = typeof body.skillName === 'string' ? body.skillName.trim() : '';\n const enabled = body.enabled;\n if (!skillName || typeof enabled !== 'boolean') {\n return c.json({ ok: false, error: 'Expected { skillName: string, enabled: boolean }' }, 400);\n }\n try {\n service.marketplace.patchSkillEnabled(skillName, enabled);\n return c.json({ ok: true });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Update failed' },\n 400,\n );\n }\n });\n\n authenticated.get('/api/skills/marketplace', async (c) => {\n const q = c.req.query('q')?.trim() ?? '';\n const pageRaw = c.req.query('page');\n const pageSizeRaw = c.req.query('pageSize');\n const sortRaw = c.req.query('sort');\n const page = pageRaw != null && pageRaw !== '' ? Math.max(1, Number(pageRaw) || 1) : undefined;\n const pageSize =\n pageSizeRaw != null && pageSizeRaw !== ''\n ? Math.min(50, Math.max(1, Number(pageSizeRaw) || 20))\n : undefined;\n const sort =\n sortRaw === 'newest' || sortRaw === 'downloads' ? sortRaw : undefined;\n const category = c.req.query('category')?.trim() ?? '';\n const provider = parseMarketplaceProviderQuery(c.req.query('provider'));\n try {\n const payload = await service.marketplace.fetchSkillsCatalog(\n {\n q: q || undefined,\n page,\n pageSize,\n sort,\n category: category || undefined,\n },\n provider,\n );\n return c.json({ ok: true, payload });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Marketplace request failed' },\n 502,\n );\n }\n });\n\n authenticated.get('/api/skills/marketplace/provider', async (c) => {\n const info = await service.marketplace.getSkillsProvider();\n return c.json({ ok: true, payload: info });\n });\n\n /** All registered marketplace providers (built-in + extension-contributed). */\n authenticated.get('/api/skills/marketplace/providers', async (c) => {\n const [providers, current] = await Promise.all([\n service.marketplace.getSkillsProviders(),\n service.marketplace.getSkillsProvider(),\n ]);\n return c.json({ ok: true, payload: { providers, current: current.provider } });\n });\n\n authenticated.get('/api/skills/marketplace/categories', async (c) => {\n const provider = parseMarketplaceProviderQuery(c.req.query('provider'));\n try {\n const payload = await service.marketplace.fetchSkillsCategories(provider);\n return c.json({ ok: true, payload });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Marketplace categories failed' },\n 502,\n );\n }\n });\n\n authenticated.get('/api/skills/marketplace/packages/:pkgName', async (c) => {\n const raw = c.req.param('pkgName');\n if (!raw) {\n return c.json({ ok: false, error: 'Missing package name' }, 400);\n }\n let pkgName: string;\n try {\n pkgName = decodeURIComponent(raw);\n } catch {\n return c.json({ ok: false, error: 'Invalid package name' }, 400);\n }\n try {\n const provider = parseMarketplaceProviderQuery(c.req.query('provider'));\n const payload = await service.marketplace.fetchSkillsPackageDetail(pkgName, provider);\n return c.json({ ok: true, payload });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Marketplace request failed' },\n 502,\n );\n }\n });\n\n authenticated.post('/api/skills/marketplace/install', async (c) => {\n let body: { name?: unknown; version?: unknown; overwrite?: unknown; provider?: unknown };\n try {\n body = (await c.req.json()) as typeof body;\n } catch {\n return c.json({ ok: false, error: 'Invalid JSON' }, 400);\n }\n const name = typeof body.name === 'string' ? body.name.trim() : '';\n const version = typeof body.version === 'string' ? body.version.trim() : undefined;\n const overwrite =\n body.overwrite === true ||\n body.overwrite === 'true' ||\n body.overwrite === '1';\n const provider = parseMarketplaceProviderQuery(\n typeof body.provider === 'string' ? body.provider : undefined,\n );\n if (!name) {\n return c.json({ ok: false, error: 'Expected { name: string, version?: string, overwrite?: boolean }' }, 400);\n }\n try {\n const payload = await service.marketplace.installSkill({ name, version, overwrite, provider });\n return c.json({ ok: true, payload });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Install failed' },\n 400,\n );\n }\n });\n\n authenticated.post('/api/skills/upload', async (c) => {\n let body: Record<string, unknown>;\n try {\n body = await c.req.parseBody({ all: true });\n } catch {\n return c.json({ ok: false, error: 'Invalid multipart body' }, 400);\n }\n const file = body['file'];\n if (!file || typeof file !== 'object') {\n return c.json({ ok: false, error: 'Missing file field' }, 400);\n }\n let buf: Buffer;\n if (file instanceof File) {\n buf = Buffer.from(await file.arrayBuffer());\n } else if (typeof (file as Blob).arrayBuffer === 'function') {\n buf = Buffer.from(await (file as Blob).arrayBuffer());\n } else {\n return c.json({ ok: false, error: 'Invalid file upload' }, 400);\n }\n const skillIdRaw = body['skillId'];\n const overwriteRaw = body['overwrite'];\n const skillId = typeof skillIdRaw === 'string' && skillIdRaw.trim() ? skillIdRaw.trim() : undefined;\n const overwrite =\n overwriteRaw === 'true' ||\n overwriteRaw === true ||\n overwriteRaw === '1';\n\n try {\n const result = service.marketplace.installSkillZip(buf, { skillId, overwrite });\n return c.json({ ok: true, payload: result });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Install failed' },\n 400,\n );\n }\n });\n\n authenticated.delete('/api/skills/:id', (c) => {\n const id = c.req.param('id');\n if (!id) {\n return c.json({ ok: false, error: 'Missing id' }, 400);\n }\n try {\n service.marketplace.deleteSkill(id);\n return c.json({ ok: true });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Delete failed' },\n 400,\n );\n }\n });\n}\n"],"mappings":"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"}
@@ -3,6 +3,7 @@ import { registerSessionsRoutes } from "./sessions.js";
3
3
  import { registerStatusRoutes } from "./status.js";
4
4
  import { registerMemoryRoutes } from "./memory.js";
5
5
  import { registerProjectsRoutes } from "./projects.js";
6
+ import { registerSearchRoutes } from "./search.js";
6
7
  import { mountAppLazyRoutePrefixes, registerAuthenticatedLazyRouteFallback } from "./lazy-fallback.js";
7
8
  //#region src/gateway/hono/routes/index.ts
8
9
  function registerCoreAuthenticatedRoutes(authenticated, deps) {
@@ -11,6 +12,7 @@ function registerCoreAuthenticatedRoutes(authenticated, deps) {
11
12
  registerSessionsRoutes(authenticated, deps);
12
13
  registerMemoryRoutes(authenticated, deps);
13
14
  registerProjectsRoutes(authenticated, deps);
15
+ registerSearchRoutes(authenticated, deps);
14
16
  }
15
17
  function registerAuthenticatedRoutes(app, authenticated, deps) {
16
18
  registerCoreAuthenticatedRoutes(authenticated, deps);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../../src/gateway/hono/routes/index.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { registerAgentStreamRoutes } from './agent-stream.js';\nimport { registerSessionsRoutes } from './sessions.js';\nimport { registerStatusRoutes } from './status.js';\nimport { registerMemoryRoutes } from './memory.js';\nimport { registerProjectsRoutes } from './projects.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport {\n mountAppLazyRoutePrefixes,\n registerAuthenticatedLazyRouteFallback,\n} from './lazy-fallback.js';\n\nexport function registerCoreAuthenticatedRoutes(\n authenticated: Hono,\n deps: AuthenticatedRouteDeps,\n): void {\n registerStatusRoutes(authenticated, deps);\n registerAgentStreamRoutes(authenticated, deps);\n registerSessionsRoutes(authenticated, deps);\n registerMemoryRoutes(authenticated, deps);\n registerProjectsRoutes(authenticated, deps);\n}\n\nexport function registerAuthenticatedRoutes(app: Hono, authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n registerCoreAuthenticatedRoutes(authenticated, deps);\n registerAuthenticatedLazyRouteFallback(authenticated, deps);\n mountAppLazyRoutePrefixes(app, { service: deps.service, deps });\n}\n\nexport type { AuthenticatedRouteDeps } from './deps.js';\n"],"mappings":";;;;;;;AAaA,SAAgB,gCACd,eACA,MACM;AACN,sBAAqB,eAAe,KAAK;AACzC,2BAA0B,eAAe,KAAK;AAC9C,wBAAuB,eAAe,KAAK;AAC3C,sBAAqB,eAAe,KAAK;AACzC,wBAAuB,eAAe,KAAK;;AAG7C,SAAgB,4BAA4B,KAAW,eAAqB,MAAoC;AAC9G,iCAAgC,eAAe,KAAK;AACpD,wCAAuC,eAAe,KAAK;AAC3D,2BAA0B,KAAK;EAAE,SAAS,KAAK;EAAS;EAAM,CAAC"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../../src/gateway/hono/routes/index.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { registerAgentStreamRoutes } from './agent-stream.js';\nimport { registerSessionsRoutes } from './sessions.js';\nimport { registerStatusRoutes } from './status.js';\nimport { registerMemoryRoutes } from './memory.js';\nimport { registerProjectsRoutes } from './projects.js';\nimport { registerSearchRoutes } from './search.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport {\n mountAppLazyRoutePrefixes,\n registerAuthenticatedLazyRouteFallback,\n} from './lazy-fallback.js';\n\nexport function registerCoreAuthenticatedRoutes(\n authenticated: Hono,\n deps: AuthenticatedRouteDeps,\n): void {\n registerStatusRoutes(authenticated, deps);\n registerAgentStreamRoutes(authenticated, deps);\n registerSessionsRoutes(authenticated, deps);\n registerMemoryRoutes(authenticated, deps);\n registerProjectsRoutes(authenticated, deps);\n registerSearchRoutes(authenticated, deps);\n}\n\nexport function registerAuthenticatedRoutes(app: Hono, authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n registerCoreAuthenticatedRoutes(authenticated, deps);\n registerAuthenticatedLazyRouteFallback(authenticated, deps);\n mountAppLazyRoutePrefixes(app, { service: deps.service, deps });\n}\n\nexport type { AuthenticatedRouteDeps } from './deps.js';\n"],"mappings":";;;;;;;;AAcA,SAAgB,gCACd,eACA,MACM;AACN,sBAAqB,eAAe,KAAK;AACzC,2BAA0B,eAAe,KAAK;AAC9C,wBAAuB,eAAe,KAAK;AAC3C,sBAAqB,eAAe,KAAK;AACzC,wBAAuB,eAAe,KAAK;AAC3C,sBAAqB,eAAe,KAAK;;AAG3C,SAAgB,4BAA4B,KAAW,eAAqB,MAAoC;AAC9G,iCAAgC,eAAe,KAAK;AACpD,wCAAuC,eAAe,KAAK;AAC3D,2BAA0B,KAAK;EAAE,SAAS,KAAK;EAAS;EAAM,CAAC"}
@@ -147,6 +147,7 @@ const AUTHENTICATED_LAZY_ROUTE_BUNDLES = [
147
147
  id: "commands-skills",
148
148
  match: (path) => startsWithAny(path, [
149
149
  "/api/commands",
150
+ "/api/review",
150
151
  "/api/skills",
151
152
  "/api/chat/skills"
152
153
  ]),