@xopcai/xopc 0.0.123 → 0.0.125

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 (436) 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/Combination-BzaXOLd9.js +41 -0
  6. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Bicr3ZBg.js → agent-avatar-dicebear-BKDKICZV.js} +1 -1
  7. package/dist/gateway/static/root/assets/agents-BnTB7-c5.js +2 -0
  8. package/dist/gateway/static/root/assets/app-management-settings-panel-DI4BqHKW.js +1 -0
  9. package/dist/gateway/static/root/assets/appearance-settings-6_ie3NQ4.js +1 -0
  10. package/dist/gateway/static/root/assets/apps-page-B6bG65SW.js +1 -0
  11. package/dist/gateway/static/root/assets/{archive-plugin-Bpy64GjU.js → archive-plugin-kUHEJ1HK.js} +1 -1
  12. package/dist/gateway/static/root/assets/{attachment-load-DMkp4xSb.js → attachment-load-Dm-9prpU.js} +1 -1
  13. package/dist/gateway/static/root/assets/automation-suggestion-card-OTxQTPnC.js +1 -0
  14. package/dist/gateway/static/root/assets/automations-page-1lVbo0dS.js +1 -0
  15. package/dist/gateway/static/root/assets/{binary-plugins-DA9C5mCw.js → binary-plugins-DllA_jQ0.js} +1 -1
  16. package/dist/gateway/static/root/assets/{block-editor-CiSXk_YC.js → block-editor-Cm6CWNj1.js} +5 -5
  17. package/dist/gateway/static/root/assets/browser-settings-page-CzDBlOK0.js +8 -0
  18. package/dist/gateway/static/root/assets/capability-presets-api-VJ89b6I2.js +1 -0
  19. package/dist/gateway/static/root/assets/capability-presets-settings-panel-BaPj8wC2.js +1 -0
  20. package/dist/gateway/static/root/assets/{channel-recipient-api-CDhrhfhN.js → channel-recipient-api-B5PwBEUx.js} +1 -1
  21. package/dist/gateway/static/root/assets/channels-settings-Df4m7p1k.js +1 -0
  22. package/dist/gateway/static/root/assets/code-editor-gbRgS14t.js +1 -0
  23. package/dist/gateway/static/root/assets/connectors-page-BMTphmHS.js +2 -0
  24. package/dist/gateway/static/root/assets/{directory-picker-path-field-7jKfbH0J.js → directory-picker-path-field-DySMzOF6.js} +1 -1
  25. package/dist/gateway/static/root/assets/dist-By6Rh2ee.js +1 -0
  26. package/dist/gateway/static/root/assets/dist-CkobR7mk.js +1 -0
  27. package/dist/gateway/static/root/assets/dist-DokQNVMQ.js +1 -0
  28. package/dist/gateway/static/root/assets/dreaming-settings-D_AjSnV_.js +3 -0
  29. package/dist/gateway/static/root/assets/extension-debug-page-BaM0FpW7.js +1 -0
  30. package/dist/gateway/static/root/assets/extension-page-DuZWVOGA.js +1 -0
  31. package/dist/gateway/static/root/assets/extension-settings-page-DarVtbmJ.js +1 -0
  32. package/dist/gateway/static/root/assets/{fetch-Dtpbbe0s.js → fetch-NFKfkqrd.js} +1 -1
  33. package/dist/gateway/static/root/assets/{gateway-config-api-BN6pyX2c.js → gateway-config-api-CFEm9rgy.js} +1 -1
  34. package/dist/gateway/static/root/assets/gateway-settings-BMk2S5td.js +1 -0
  35. package/dist/gateway/static/root/assets/{gateway-startup-retry-BIET2x3y.js → gateway-startup-retry-Dtwh_yGg.js} +1 -1
  36. package/dist/gateway/static/root/assets/goal-create-dialog-BKP7ylcG.js +1 -0
  37. package/dist/gateway/static/root/assets/goal-detail-page-C2cTxf71.js +1 -0
  38. package/dist/gateway/static/root/assets/{goals-config-api-CQm2r1Ty.js → goals-config-api-DTWZNA_Y.js} +1 -1
  39. package/dist/gateway/static/root/assets/goals-page-CTmA3hWK.js +2 -0
  40. package/dist/gateway/static/root/assets/goals-settings-Bhct0ZT-.js +1 -0
  41. package/dist/gateway/static/root/assets/heartbeat-settings-C-UxSU4a.js +1 -0
  42. package/dist/gateway/static/root/assets/{html-workspace-editor-CQLWDiwE.js → html-workspace-editor-DV90ddkE.js} +1 -1
  43. package/dist/gateway/static/root/assets/index-BNHDd2j1.css +1 -0
  44. package/dist/gateway/static/root/assets/index-BPXLPMuY.js +193 -0
  45. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-DCjy2y4d.js +1 -0
  46. package/dist/gateway/static/root/assets/logs-page-CGc3_CQU.js +2 -0
  47. package/dist/gateway/static/root/assets/{markdown-editor-AssmZFx4.js → markdown-editor-BFOjBBla.js} +2 -2
  48. package/dist/gateway/static/root/assets/markdown-split-BaqxP-GQ.js +1 -0
  49. package/dist/gateway/static/root/assets/{media-plugins-DS44pJzr.js → media-plugins-DQ_EXloK.js} +1 -1
  50. package/dist/gateway/static/root/assets/messages-CjuIJcZl.js +3 -0
  51. package/dist/gateway/static/root/assets/models-hub-panel-Drz4UQMb.js +2 -0
  52. package/dist/gateway/static/root/assets/notes-page-CY1ylng1.js +1 -0
  53. package/dist/gateway/static/root/assets/notes-workbench-X7IaD--t.js +2 -0
  54. package/dist/gateway/static/root/assets/page-tabs-EIZhLppK.js +1 -0
  55. package/dist/gateway/static/root/assets/{preview-open-alternatives-Dej6zHnr.js → preview-open-alternatives-r_uB4Epr.js} +1 -1
  56. package/dist/gateway/static/root/assets/project-detail-page-DE5adRBE.js +1 -0
  57. package/dist/gateway/static/root/assets/projects-page-CuOb1k6F.js +1 -0
  58. package/dist/gateway/static/root/assets/remote-access-hub-BOxNrUVA.js +1 -0
  59. package/dist/gateway/static/root/assets/{save-bar-controls-Zu1FzH6z.js → save-bar-controls-B132Uf-2.js} +1 -1
  60. package/dist/gateway/static/root/assets/{schedule-field-BW78mKc0.js → schedule-field-B5qshALm.js} +1 -1
  61. package/dist/gateway/static/root/assets/{schema-form-Cc-IOydE.js → schema-form-CvLmkdS9.js} +1 -1
  62. package/dist/gateway/static/root/assets/sessions-page-CY0IQcGW.js +1 -0
  63. package/dist/gateway/static/root/assets/settings-advanced-gate-D4NBNVCB.js +1 -0
  64. package/dist/gateway/static/root/assets/{settings-collapsible-section-DIpIYht_.js → settings-collapsible-section-pRlvqsAf.js} +1 -1
  65. package/dist/gateway/static/root/assets/{settings-form-section-BFxBNxOG.js → settings-form-section-BBYUDLVd.js} +1 -1
  66. package/dist/gateway/static/root/assets/{settings-page-C4fivemT.js → settings-page-DaO7zYZM.js} +1 -1
  67. package/dist/gateway/static/root/assets/{settings-page-layout-CLx4o2PN.js → settings-page-layout-D8g9PAek.js} +1 -1
  68. package/dist/gateway/static/root/assets/setup-status-panel-Bks0CLLT.js +1 -0
  69. package/dist/gateway/static/root/assets/{share-preview-page-ZswWCrDu.js → share-preview-page-v6-IOp8t.js} +1 -1
  70. package/dist/gateway/static/root/assets/shares-settings-CEZsKm9r.js +1 -0
  71. package/dist/gateway/static/root/assets/skill-reload-api-oTkHbb9W.js +1 -0
  72. package/dist/gateway/static/root/assets/skills-page-DigsbZ6K.js +2 -0
  73. package/dist/gateway/static/root/assets/{system-settings-panel-3ZNcGRhS.js → system-settings-panel-HUU2FFjM.js} +1 -1
  74. package/dist/gateway/static/root/assets/{typed-models-lib-bpzZjiVF.js → typed-models-lib-AH160QHh.js} +1 -1
  75. package/dist/gateway/static/root/assets/{use-channel-catalog-BCjZLZ3O.js → use-channel-catalog-BXzDmjCQ.js} +1 -1
  76. package/dist/gateway/static/root/assets/{user-profile-settings-panel-CIXafITi.js → user-profile-settings-panel-DxwnQvQ3.js} +1 -1
  77. package/dist/gateway/static/root/assets/{utils-DXMtz5j_.js → utils-i5POEtqd.js} +1 -1
  78. package/dist/gateway/static/root/assets/{vendor-codemirror-CNP1wPe7.js → vendor-codemirror-BvNgyE1Q.js} +1 -1
  79. package/dist/gateway/static/root/assets/voice-api-key-field-CEJklEgb.js +1 -0
  80. package/dist/gateway/static/root/assets/work-item-detail-page-CD6FL_Rs.js +1 -0
  81. package/dist/gateway/static/root/assets/workflow-run-setup-panel-ClVVMgN-.js +3 -0
  82. package/dist/gateway/static/root/assets/{workflow-start-dialog-B4sZpTDQ.js → workflow-start-dialog-Dv4ZA1T0.js} +1 -1
  83. package/dist/gateway/static/root/assets/workflows-page-OLQiUpoW.js +18 -0
  84. package/dist/gateway/static/root/index.html +8 -7
  85. package/dist/package.js +1 -1
  86. package/dist/src/agent/agent-manager.d.ts +6 -1
  87. package/dist/src/agent/agent-manager.js +34 -14
  88. package/dist/src/agent/agent-manager.js.map +1 -1
  89. package/dist/src/agent/child-agent-factory.d.ts +2 -0
  90. package/dist/src/agent/child-agent-factory.js +2 -0
  91. package/dist/src/agent/child-agent-factory.js.map +1 -1
  92. package/dist/src/agent/coding/index.d.ts +1 -0
  93. package/dist/src/agent/coding/index.js +2 -0
  94. package/dist/src/agent/coding/turn-diff-tracker.d.ts +67 -0
  95. package/dist/src/agent/coding/turn-diff-tracker.js +233 -0
  96. package/dist/src/agent/coding/turn-diff-tracker.js.map +1 -0
  97. package/dist/src/agent/context/workspace-templates/AGENTS.md +1 -1
  98. package/dist/src/agent/embedded/xopc-tools-bridge.js +11 -7
  99. package/dist/src/agent/embedded/xopc-tools-bridge.js.map +1 -1
  100. package/dist/src/agent/lifecycle/progress.js +3 -1
  101. package/dist/src/agent/lifecycle/progress.js.map +1 -1
  102. package/dist/src/agent/lifecycle/timeout-wrapper.d.ts +2 -2
  103. package/dist/src/agent/lifecycle/timeout-wrapper.js +4 -4
  104. package/dist/src/agent/lifecycle/timeout-wrapper.js.map +1 -1
  105. package/dist/src/agent/memory/dreaming/config.d.ts +2 -2
  106. package/dist/src/agent/memory/dreaming/config.js +3 -3
  107. package/dist/src/agent/memory/dreaming/config.js.map +1 -1
  108. package/dist/src/agent/memory/dreaming/constants.d.ts +1 -1
  109. package/dist/src/agent/memory/dreaming/constants.js +1 -1
  110. package/dist/src/agent/memory/dreaming/constants.js.map +1 -1
  111. package/dist/src/agent/memory/dreaming/deep-promotion.d.ts +1 -0
  112. package/dist/src/agent/memory/dreaming/deep-promotion.js +11 -20
  113. package/dist/src/agent/memory/dreaming/deep-promotion.js.map +1 -1
  114. package/dist/src/agent/memory/dreaming/events.d.ts +3 -3
  115. package/dist/src/agent/memory/dreaming/events.js +6 -6
  116. package/dist/src/agent/memory/dreaming/events.js.map +1 -1
  117. package/dist/src/agent/memory/dreaming/last-run.d.ts +2 -2
  118. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  119. package/dist/src/agent/memory/dreaming/last-run.js.map +1 -1
  120. package/dist/src/agent/memory/dreaming/light-sweep.d.ts +1 -1
  121. package/dist/src/agent/memory/dreaming/light-sweep.js +3 -3
  122. package/dist/src/agent/memory/dreaming/light-sweep.js.map +1 -1
  123. package/dist/src/agent/memory/dreaming/preview.d.ts +1 -0
  124. package/dist/src/agent/memory/dreaming/preview.js +2 -2
  125. package/dist/src/agent/memory/dreaming/preview.js.map +1 -1
  126. package/dist/src/agent/memory/dreaming/rem-patterns.d.ts +1 -1
  127. package/dist/src/agent/memory/dreaming/rem-patterns.js +13 -13
  128. package/dist/src/agent/memory/dreaming/rem-patterns.js.map +1 -1
  129. package/dist/src/agent/memory/dreaming/scope.d.ts +14 -0
  130. package/dist/src/agent/memory/dreaming/scope.js +27 -0
  131. package/dist/src/agent/memory/dreaming/scope.js.map +1 -0
  132. package/dist/src/agent/memory/dreaming/short-term-store.d.ts +4 -4
  133. package/dist/src/agent/memory/dreaming/short-term-store.js +17 -17
  134. package/dist/src/agent/memory/dreaming/short-term-store.js.map +1 -1
  135. package/dist/src/agent/memory/summary-generator.d.ts +1 -1
  136. package/dist/src/agent/memory/summary-generator.js +1 -2
  137. package/dist/src/agent/memory/summary-generator.js.map +1 -1
  138. package/dist/src/agent/middleware/index.d.ts +1 -1
  139. package/dist/src/agent/middleware/self-verify.d.ts +44 -14
  140. package/dist/src/agent/middleware/self-verify.js +214 -44
  141. package/dist/src/agent/middleware/self-verify.js.map +1 -1
  142. package/dist/src/agent/orchestration/agent-event-handler.d.ts +2 -0
  143. package/dist/src/agent/orchestration/agent-event-handler.js +69 -14
  144. package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
  145. package/dist/src/agent/orchestration/agent-orchestrator.js +22 -12
  146. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  147. package/dist/src/agent/prompt/sections/tooling.js +18 -13
  148. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  149. package/dist/src/agent/prompt/system-reminder.js +2 -2
  150. package/dist/src/agent/prompt/system-reminder.js.map +1 -1
  151. package/dist/src/agent/sandbox/command-validator.js +12 -0
  152. package/dist/src/agent/sandbox/command-validator.js.map +1 -1
  153. package/dist/src/agent/sandbox/sanitize-env-vars.d.ts +2 -2
  154. package/dist/src/agent/sandbox/sanitize-env-vars.js +2 -2
  155. package/dist/src/agent/sandbox/sanitize-env-vars.js.map +1 -1
  156. package/dist/src/agent/sandbox/types.d.ts +2 -2
  157. package/dist/src/agent/sandbox/types.js.map +1 -1
  158. package/dist/src/agent/service/btw-query.js +1 -1
  159. package/dist/src/agent/service/btw-query.js.map +1 -1
  160. package/dist/src/agent/service/process-direct-one-shot.js +6 -2
  161. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  162. package/dist/src/agent/service/process-direct-streaming.js +12 -7
  163. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  164. package/dist/src/agent/service.d.ts +2 -1
  165. package/dist/src/agent/service.js +19 -6
  166. package/dist/src/agent/service.js.map +1 -1
  167. package/dist/src/agent/session/session-inspector.d.ts +5 -3
  168. package/dist/src/agent/session/session-inspector.js +16 -7
  169. package/dist/src/agent/session/session-inspector.js.map +1 -1
  170. package/dist/src/agent/skills/skill-tool-gating.js +1 -1
  171. package/dist/src/agent/skills/skill-tool-gating.js.map +1 -1
  172. package/dist/src/agent/source-context/types.d.ts +1 -1
  173. package/dist/src/agent/source-context/types.js +1 -1
  174. package/dist/src/agent/source-context/types.js.map +1 -1
  175. package/dist/src/agent/starter-agents.js +9 -9
  176. package/dist/src/agent/starter-agents.js.map +1 -1
  177. package/dist/src/agent/tools/apply-patch.d.ts +25 -0
  178. package/dist/src/agent/tools/apply-patch.js +310 -0
  179. package/dist/src/agent/tools/apply-patch.js.map +1 -0
  180. package/dist/src/agent/tools/concurrency.d.ts +8 -0
  181. package/dist/src/agent/tools/concurrency.js +31 -0
  182. package/dist/src/agent/tools/concurrency.js.map +1 -0
  183. package/dist/src/agent/tools/delegate-tool.d.ts +1 -1
  184. package/dist/src/agent/tools/delegate-tool.js +3 -3
  185. package/dist/src/agent/tools/delegate-tool.js.map +1 -1
  186. package/dist/src/agent/tools/dreaming-tool.d.ts +2 -0
  187. package/dist/src/agent/tools/dreaming-tool.js +13 -10
  188. package/dist/src/agent/tools/dreaming-tool.js.map +1 -1
  189. package/dist/src/agent/tools/exec-command.d.ts +30 -0
  190. package/dist/src/agent/tools/exec-command.js +228 -0
  191. package/dist/src/agent/tools/exec-command.js.map +1 -0
  192. package/dist/src/agent/tools/execute-code-tool.js +7 -4
  193. package/dist/src/agent/tools/execute-code-tool.js.map +1 -1
  194. package/dist/src/agent/tools/executor.d.ts +6 -4
  195. package/dist/src/agent/tools/executor.js +7 -4
  196. package/dist/src/agent/tools/executor.js.map +1 -1
  197. package/dist/src/agent/tools/factory.d.ts +6 -3
  198. package/dist/src/agent/tools/factory.js +14 -9
  199. package/dist/src/agent/tools/factory.js.map +1 -1
  200. package/dist/src/agent/tools/find.js +2 -0
  201. package/dist/src/agent/tools/find.js.map +1 -1
  202. package/dist/src/agent/tools/grep.js +2 -0
  203. package/dist/src/agent/tools/grep.js.map +1 -1
  204. package/dist/src/agent/tools/index.d.ts +5 -2
  205. package/dist/src/agent/tools/index.js +7 -4
  206. package/dist/src/agent/tools/list-dir.js +2 -0
  207. package/dist/src/agent/tools/list-dir.js.map +1 -1
  208. package/dist/src/agent/tools/memory-tool.d.ts +1 -0
  209. package/dist/src/agent/tools/memory-tool.js +2 -2
  210. package/dist/src/agent/tools/memory-tool.js.map +1 -1
  211. package/dist/src/agent/tools/metadata.d.ts +15 -0
  212. package/dist/src/agent/tools/metadata.js +26 -0
  213. package/dist/src/agent/tools/metadata.js.map +1 -0
  214. package/dist/src/agent/tools/read.js +2 -0
  215. package/dist/src/agent/tools/read.js.map +1 -1
  216. package/dist/src/agent/tools/skills-tools.d.ts +1 -1
  217. package/dist/src/agent/tools/skills-tools.js.map +1 -1
  218. package/dist/src/agent/tools/update-plan-tool.d.ts +11 -0
  219. package/dist/src/agent/tools/update-plan-tool.js +72 -0
  220. package/dist/src/agent/tools/update-plan-tool.js.map +1 -0
  221. package/dist/src/agent/tools/write.js +6 -0
  222. package/dist/src/agent/tools/write.js.map +1 -1
  223. package/dist/src/agent/workflow/builtins/debug-incident.d.ts +1 -1
  224. package/dist/src/agent/workflow/builtins/debug-incident.js +1 -1
  225. package/dist/src/agent/workflow/builtins/debug-incident.js.map +1 -1
  226. package/dist/src/agent/workflow/builtins/pr-review.d.ts +1 -1
  227. package/dist/src/agent/workflow/builtins/pr-review.js +1 -1
  228. package/dist/src/agent/workflow/builtins/pr-review.js.map +1 -1
  229. package/dist/src/agent/workflow/builtins/release-check.d.ts +1 -1
  230. package/dist/src/agent/workflow/builtins/release-check.js +1 -1
  231. package/dist/src/agent/workflow/builtins/release-check.js.map +1 -1
  232. package/dist/src/agent/workflow/step-labels.js +7 -3
  233. package/dist/src/agent/workflow/step-labels.js.map +1 -1
  234. package/dist/src/agent/workflow/subagent-runner.d.ts +1 -0
  235. package/dist/src/agent/workflow/subagent-runner.js +5 -1
  236. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  237. package/dist/src/agent/workflow/workflow-child-tools.js +5 -0
  238. package/dist/src/agent/workflow/workflow-child-tools.js.map +1 -1
  239. package/dist/src/chat-commands/agent-edit.js +1 -1
  240. package/dist/src/chat-commands/agent-edit.js.map +1 -1
  241. package/dist/src/chat-commands/builtins/review.d.ts +1 -0
  242. package/dist/src/chat-commands/builtins/review.js +167 -0
  243. package/dist/src/chat-commands/builtins/review.js.map +1 -0
  244. package/dist/src/chat-commands/index.d.ts +1 -0
  245. package/dist/src/chat-commands/index.js +3 -1
  246. package/dist/src/chat-commands/index.js.map +1 -1
  247. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  248. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  249. package/dist/src/connectors/health.d.ts +2 -1
  250. package/dist/src/connectors/health.js +59 -1
  251. package/dist/src/connectors/health.js.map +1 -1
  252. package/dist/src/connectors/install.d.ts +1 -0
  253. package/dist/src/connectors/install.js +28 -1
  254. package/dist/src/connectors/install.js.map +1 -1
  255. package/dist/src/connectors/instances.js +7 -0
  256. package/dist/src/connectors/instances.js.map +1 -1
  257. package/dist/src/connectors/materialize.js +2 -1
  258. package/dist/src/connectors/materialize.js.map +1 -1
  259. package/dist/src/connectors/registries/modelscope.js +38 -13
  260. package/dist/src/connectors/registries/modelscope.js.map +1 -1
  261. package/dist/src/connectors/types.d.ts +2 -0
  262. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  263. package/dist/src/gateway/agent-builtin-tools.js +3 -2
  264. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  265. package/dist/src/gateway/chat-stream/mapper.d.ts +6 -0
  266. package/dist/src/gateway/chat-stream/mapper.js +149 -6
  267. package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
  268. package/dist/src/gateway/chat-stream/protocol.d.ts +51 -1
  269. package/dist/src/gateway/dreaming-automation-reconciler.d.ts +1 -0
  270. package/dist/src/gateway/dreaming-automation-reconciler.js +62 -42
  271. package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -1
  272. package/dist/src/gateway/hono/app.js +7 -1
  273. package/dist/src/gateway/hono/app.js.map +1 -1
  274. package/dist/src/gateway/hono/routes/commands-skills.js +21 -0
  275. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  276. package/dist/src/gateway/hono/routes/connectors.js +46 -2
  277. package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
  278. package/dist/src/gateway/hono/routes/dreaming.js +111 -66
  279. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  280. package/dist/src/gateway/hono/routes/index.js +2 -0
  281. package/dist/src/gateway/hono/routes/index.js.map +1 -1
  282. package/dist/src/gateway/hono/routes/lazy-bundles.js +1 -0
  283. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  284. package/dist/src/gateway/hono/routes/projects.js +886 -45
  285. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  286. package/dist/src/gateway/hono/routes/search.d.ts +3 -0
  287. package/dist/src/gateway/hono/routes/search.js +47 -0
  288. package/dist/src/gateway/hono/routes/search.js.map +1 -0
  289. package/dist/src/gateway/hono/routes/sessions.js +1 -0
  290. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  291. package/dist/src/gateway/security/dangerous-tools.js +1 -1
  292. package/dist/src/gateway/security/dangerous-tools.js.map +1 -1
  293. package/dist/src/gateway/service.js +17 -8
  294. package/dist/src/gateway/service.js.map +1 -1
  295. package/dist/src/infra/update-restart.js +1 -1
  296. package/dist/src/mcp/channel-bridge.js +1 -1
  297. package/dist/src/media/store.js +1 -1
  298. package/dist/src/media/store.js.map +1 -1
  299. package/dist/src/media/types.d.ts +1 -1
  300. package/dist/src/media/uri.js +2 -1
  301. package/dist/src/media/uri.js.map +1 -1
  302. package/dist/src/projects/index.d.ts +2 -0
  303. package/dist/src/projects/index.js +3 -1
  304. package/dist/src/projects/project-agent-suggestion.d.ts +14 -0
  305. package/dist/src/projects/project-agent-suggestion.js +19 -0
  306. package/dist/src/projects/project-agent-suggestion.js.map +1 -0
  307. package/dist/src/projects/project-kind.d.ts +13 -0
  308. package/dist/src/projects/project-kind.js +147 -0
  309. package/dist/src/projects/project-kind.js.map +1 -0
  310. package/dist/src/projects/project-service.d.ts +1 -0
  311. package/dist/src/projects/project-service.js +1 -1
  312. package/dist/src/projects/project-service.js.map +1 -1
  313. package/dist/src/projects/project-store.js +32 -8
  314. package/dist/src/projects/project-store.js.map +1 -1
  315. package/dist/src/projects/types.d.ts +1 -0
  316. package/dist/src/review/review-git.d.ts +48 -0
  317. package/dist/src/review/review-git.js +333 -0
  318. package/dist/src/review/review-git.js.map +1 -0
  319. package/dist/src/review/review-types.d.ts +22 -0
  320. package/dist/src/review/review-types.js +29 -0
  321. package/dist/src/review/review-types.js.map +1 -0
  322. package/dist/src/session/session-context-for-llm.d.ts +2 -0
  323. package/dist/src/session/session-context-for-llm.js +165 -1
  324. package/dist/src/session/session-context-for-llm.js.map +1 -1
  325. package/dist/src/session/store.js +2 -2
  326. package/dist/src/session/store.js.map +1 -1
  327. package/dist/src/storage/sqlite/migrations/021_projects_fts.sql +21 -0
  328. package/dist/src/storage/sqlite/migrations/022_work_items.sql +61 -0
  329. package/dist/src/storage/sqlite/migrations/023_work_item_attachments.sql +15 -0
  330. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  331. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  332. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  333. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  334. package/dist/src/storage/sqlite/schema.js +1 -1
  335. package/dist/src/storage/sqlite/schema.sql +78 -0
  336. package/dist/src/tui/backends/embedded-backend.d.ts +1 -0
  337. package/dist/src/tui/backends/embedded-backend.js +20 -0
  338. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  339. package/dist/src/tui/backends/gateway-sse-backend.d.ts +2 -0
  340. package/dist/src/tui/backends/gateway-sse-backend.js +7 -0
  341. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  342. package/dist/src/tui/components/assistant-message.js +47 -2
  343. package/dist/src/tui/components/assistant-message.js.map +1 -1
  344. package/dist/src/tui/components/tool-execution.d.ts +8 -0
  345. package/dist/src/tui/components/tool-execution.js +87 -77
  346. package/dist/src/tui/components/tool-execution.js.map +1 -1
  347. package/dist/src/tui/components/visual-truncate.d.ts +1 -0
  348. package/dist/src/tui/components/visual-truncate.js +28 -1
  349. package/dist/src/tui/components/visual-truncate.js.map +1 -1
  350. package/dist/src/tui/tool-summary.d.ts +22 -0
  351. package/dist/src/tui/tool-summary.js +212 -0
  352. package/dist/src/tui/tool-summary.js.map +1 -0
  353. package/dist/src/tui/tui-agent-events.js +25 -0
  354. package/dist/src/tui/tui-agent-events.js.map +1 -1
  355. package/dist/src/tui/tui-backend.d.ts +4 -0
  356. package/dist/src/tui/tui-commands.d.ts +1 -0
  357. package/dist/src/tui/tui-commands.js +110 -4
  358. package/dist/src/tui/tui-commands.js.map +1 -1
  359. package/dist/src/tui/tui-picker-overlay.d.ts +2 -0
  360. package/dist/src/tui/tui-picker-overlay.js +153 -1
  361. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  362. package/dist/src/tui/tui-tool-diff.d.ts +15 -0
  363. package/dist/src/tui/tui-tool-diff.js +178 -7
  364. package/dist/src/tui/tui-tool-diff.js.map +1 -1
  365. package/dist/src/tui/tui.js +16 -3
  366. package/dist/src/tui/tui.js.map +1 -1
  367. package/dist/src/work-items/agent-context.d.ts +3 -0
  368. package/dist/src/work-items/agent-context.js +39 -0
  369. package/dist/src/work-items/agent-context.js.map +1 -0
  370. package/dist/src/work-items/index.d.ts +4 -0
  371. package/dist/src/work-items/index.js +4 -0
  372. package/dist/src/work-items/types.d.ts +112 -0
  373. package/dist/src/work-items/types.js +1 -0
  374. package/dist/src/work-items/work-item-service.d.ts +33 -0
  375. package/dist/src/work-items/work-item-service.js +180 -0
  376. package/dist/src/work-items/work-item-service.js.map +1 -0
  377. package/dist/src/work-items/work-item-store.d.ts +21 -0
  378. package/dist/src/work-items/work-item-store.js +302 -0
  379. package/dist/src/work-items/work-item-store.js.map +1 -0
  380. package/dist/src/workflows/service/workflow-run-service.js +4 -3
  381. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  382. package/dist/src/workflows/service/workflow-session-bridge.js +3 -0
  383. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  384. package/package.json +1 -1
  385. package/dist/gateway/static/root/assets/Combination-HAlzriaz.js +0 -41
  386. package/dist/gateway/static/root/assets/agents-CxDSFHGx.js +0 -2
  387. package/dist/gateway/static/root/assets/app-management-settings-panel-CbEy9sR1.js +0 -1
  388. package/dist/gateway/static/root/assets/appearance-settings-CTHja6n9.js +0 -1
  389. package/dist/gateway/static/root/assets/apps-page-CyZdgqvm.js +0 -1
  390. package/dist/gateway/static/root/assets/automation-suggestion-card-KnYaP7NT.js +0 -1
  391. package/dist/gateway/static/root/assets/automations-page-8VLKM4au.js +0 -1
  392. package/dist/gateway/static/root/assets/browser-settings-page-5tPg0DcP.js +0 -8
  393. package/dist/gateway/static/root/assets/capability-presets-api-CEJ44WCU.js +0 -1
  394. package/dist/gateway/static/root/assets/capability-presets-settings-panel-BJW3aVST.js +0 -1
  395. package/dist/gateway/static/root/assets/channels-settings-CorUCTrs.js +0 -1
  396. package/dist/gateway/static/root/assets/code-editor-dZTY2dRW.js +0 -1
  397. package/dist/gateway/static/root/assets/connectors-page-VKstC3sP.js +0 -2
  398. package/dist/gateway/static/root/assets/dist-Mys7eFJ5.js +0 -1
  399. package/dist/gateway/static/root/assets/dist-wO9a2_ID.js +0 -1
  400. package/dist/gateway/static/root/assets/dreaming-settings-m1-wmz4o.js +0 -1
  401. package/dist/gateway/static/root/assets/extension-debug-page-C9qQQrBS.js +0 -1
  402. package/dist/gateway/static/root/assets/extension-page-DcBBMEGl.js +0 -1
  403. package/dist/gateway/static/root/assets/extension-settings-page-BQ-jMMP9.js +0 -1
  404. package/dist/gateway/static/root/assets/gateway-settings-hQtgVmSR.js +0 -1
  405. package/dist/gateway/static/root/assets/goal-create-dialog-BuIMDx6C.js +0 -1
  406. package/dist/gateway/static/root/assets/goal-detail-page-FEypCq74.js +0 -1
  407. package/dist/gateway/static/root/assets/goals-page-C4-2_MLG.js +0 -2
  408. package/dist/gateway/static/root/assets/goals-settings-DDrdRMxB.js +0 -1
  409. package/dist/gateway/static/root/assets/heartbeat-settings-BJVok3Sl.js +0 -1
  410. package/dist/gateway/static/root/assets/index-CBDr5xjB.css +0 -1
  411. package/dist/gateway/static/root/assets/index-T0SaNd5a.js +0 -191
  412. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-C2TuQppb.js +0 -1
  413. package/dist/gateway/static/root/assets/logs-page-DwkwPgid.js +0 -2
  414. package/dist/gateway/static/root/assets/markdown-split-DhONQ81k.js +0 -1
  415. package/dist/gateway/static/root/assets/messages-avfvyZuQ.js +0 -3
  416. package/dist/gateway/static/root/assets/models-hub-panel-huNY4A1G.js +0 -2
  417. package/dist/gateway/static/root/assets/notes-page-DdfGuEZ1.js +0 -1
  418. package/dist/gateway/static/root/assets/notes-workbench-B0bT9Hqa.js +0 -2
  419. package/dist/gateway/static/root/assets/project-detail-page-CjxhPorG.js +0 -1
  420. package/dist/gateway/static/root/assets/projects-page-C4Z5OJMF.js +0 -1
  421. package/dist/gateway/static/root/assets/remote-access-hub-CVCOPUVd.js +0 -1
  422. package/dist/gateway/static/root/assets/sessions-page-B4qExXHC.js +0 -1
  423. package/dist/gateway/static/root/assets/settings-advanced-gate-Ce8yLTBi.js +0 -1
  424. package/dist/gateway/static/root/assets/setup-status-panel-Kyc4eUf0.js +0 -1
  425. package/dist/gateway/static/root/assets/shares-settings-Bu76CMiC.js +0 -1
  426. package/dist/gateway/static/root/assets/skill-reload-api-D-CFg86j.js +0 -1
  427. package/dist/gateway/static/root/assets/skills-page-CUU4f6Ss.js +0 -2
  428. package/dist/gateway/static/root/assets/voice-api-key-field-C1MrQD8R.js +0 -1
  429. package/dist/gateway/static/root/assets/workflow-run-setup-panel-DqizIcY5.js +0 -3
  430. package/dist/gateway/static/root/assets/workflows-page-B3sVNPFk.js +0 -18
  431. package/dist/src/agent/tools/edit.d.ts +0 -14
  432. package/dist/src/agent/tools/edit.js +0 -132
  433. package/dist/src/agent/tools/edit.js.map +0 -1
  434. package/dist/src/agent/tools/shell.d.ts +0 -15
  435. package/dist/src/agent/tools/shell.js +0 -158
  436. package/dist/src/agent/tools/shell.js.map +0 -1
@@ -0,0 +1,333 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ //#region src/review/review-git.ts
4
+ const execFileAsync = promisify(execFile);
5
+ async function git(args, cwd) {
6
+ const { stdout } = await execFileAsync("git", args, {
7
+ cwd,
8
+ maxBuffer: 8 * 1024 * 1024
9
+ });
10
+ return stdout;
11
+ }
12
+ async function gitDiffNoIndex(args, cwd) {
13
+ try {
14
+ return await git(args, cwd);
15
+ } catch (err) {
16
+ const rec = err && typeof err === "object" ? err : {};
17
+ if (typeof rec.stdout === "string") return rec.stdout;
18
+ throw err;
19
+ }
20
+ }
21
+ async function resolveGitRoot(workspace) {
22
+ return (await git(["rev-parse", "--show-toplevel"], workspace)).trim() || workspace;
23
+ }
24
+ async function untrackedFileDiff(cwd) {
25
+ const files = (await git([
26
+ "ls-files",
27
+ "--others",
28
+ "--exclude-standard",
29
+ "-z"
30
+ ], cwd).catch(() => "")).split("\0").map((item) => item.trim()).filter(Boolean);
31
+ if (files.length === 0) return "";
32
+ const chunks = [];
33
+ for (const file of files) {
34
+ const diff = await gitDiffNoIndex([
35
+ "diff",
36
+ "--no-index",
37
+ "--",
38
+ "/dev/null",
39
+ file
40
+ ], cwd).catch(() => "");
41
+ if (diff.trim()) chunks.push(diff);
42
+ }
43
+ return chunks.join("\n");
44
+ }
45
+ function splitArgs(input) {
46
+ const out = [];
47
+ let cur = "";
48
+ let quote = null;
49
+ let escaped = false;
50
+ for (const ch of input) {
51
+ if (escaped) {
52
+ cur += ch;
53
+ escaped = false;
54
+ continue;
55
+ }
56
+ if (ch === "\\") {
57
+ escaped = true;
58
+ continue;
59
+ }
60
+ if (quote) {
61
+ if (ch === quote) quote = null;
62
+ else cur += ch;
63
+ continue;
64
+ }
65
+ if (ch === "\"" || ch === "'") {
66
+ quote = ch;
67
+ continue;
68
+ }
69
+ if (/\s/.test(ch)) {
70
+ if (cur) {
71
+ out.push(cur);
72
+ cur = "";
73
+ }
74
+ continue;
75
+ }
76
+ cur += ch;
77
+ }
78
+ if (escaped) cur += "\\";
79
+ if (cur) out.push(cur);
80
+ return out;
81
+ }
82
+ function readOptionValue(tokens, index, flag) {
83
+ const token = tokens[index] ?? "";
84
+ const eq = token.indexOf("=");
85
+ if (eq > -1) return {
86
+ value: token.slice(eq + 1),
87
+ next: index + 1
88
+ };
89
+ const value = tokens[index + 1] ?? "";
90
+ if (!value || value.startsWith("--")) throw new Error(`Missing value for ${flag}`);
91
+ return {
92
+ value,
93
+ next: index + 2
94
+ };
95
+ }
96
+ function parseReviewTargetArgs(args) {
97
+ const tokens = splitArgs(args.trim());
98
+ let kind;
99
+ let baseBranch = "";
100
+ let sha = "";
101
+ let instructions = "";
102
+ const free = [];
103
+ for (let i = 0; i < tokens.length;) {
104
+ const token = tokens[i];
105
+ if (token === "--uncommitted") {
106
+ kind = "uncommitted";
107
+ i += 1;
108
+ continue;
109
+ }
110
+ if (token === "--base" || token.startsWith("--base=")) {
111
+ const value = readOptionValue(tokens, i, "--base");
112
+ kind = "base_branch";
113
+ baseBranch = value.value.trim();
114
+ i = value.next;
115
+ continue;
116
+ }
117
+ if (token === "--commit" || token.startsWith("--commit=")) {
118
+ const value = readOptionValue(tokens, i, "--commit");
119
+ kind = "commit";
120
+ sha = value.value.trim();
121
+ i = value.next;
122
+ continue;
123
+ }
124
+ if (token === "--custom" || token === "--instructions") {
125
+ instructions = tokens.slice(i + 1).join(" ").trim();
126
+ break;
127
+ }
128
+ if (token.startsWith("--custom=") || token.startsWith("--instructions=")) {
129
+ instructions = token.slice(token.indexOf("=") + 1).trim();
130
+ i += 1;
131
+ continue;
132
+ }
133
+ free.push(token);
134
+ i += 1;
135
+ }
136
+ const extraInstructions = instructions || free.join(" ").trim();
137
+ if (!kind) kind = "uncommitted";
138
+ if (kind === "base_branch") {
139
+ if (!baseBranch) throw new Error("Missing base branch for review.");
140
+ return {
141
+ kind,
142
+ baseBranch,
143
+ ...extraInstructions ? { instructions: extraInstructions } : {}
144
+ };
145
+ }
146
+ if (kind === "commit") {
147
+ if (!sha) throw new Error("Missing commit SHA for review.");
148
+ return {
149
+ kind,
150
+ sha,
151
+ ...extraInstructions ? { instructions: extraInstructions } : {}
152
+ };
153
+ }
154
+ return {
155
+ kind: "uncommitted",
156
+ ...extraInstructions ? { instructions: extraInstructions } : {}
157
+ };
158
+ }
159
+ async function buildUncommittedReview(cwd, target) {
160
+ return {
161
+ cwd,
162
+ target,
163
+ targetLabel: "uncommitted changes",
164
+ status: await git(["status", "--short"], cwd).catch(() => ""),
165
+ stat: await git([
166
+ "diff",
167
+ "--stat",
168
+ "HEAD",
169
+ "--"
170
+ ], cwd).catch(() => ""),
171
+ diff: [await git([
172
+ "diff",
173
+ "--find-renames",
174
+ "HEAD",
175
+ "--"
176
+ ], cwd).catch(() => ""), await untrackedFileDiff(cwd)].filter((part) => part.trim()).join("\n")
177
+ };
178
+ }
179
+ async function buildBaseBranchReview(cwd, target) {
180
+ const mergeBase = (await git([
181
+ "merge-base",
182
+ "HEAD",
183
+ target.baseBranch
184
+ ], cwd)).trim();
185
+ const status = await git(["status", "--short"], cwd).catch(() => "");
186
+ const stat = await git([
187
+ "diff",
188
+ "--stat",
189
+ mergeBase,
190
+ "HEAD",
191
+ "--"
192
+ ], cwd).catch(() => "");
193
+ const diff = await git([
194
+ "diff",
195
+ "--find-renames",
196
+ mergeBase,
197
+ "HEAD",
198
+ "--"
199
+ ], cwd).catch(() => "");
200
+ return {
201
+ cwd,
202
+ target,
203
+ targetLabel: `changes against ${target.baseBranch} (merge-base ${mergeBase.slice(0, 12)})`,
204
+ status,
205
+ stat,
206
+ diff
207
+ };
208
+ }
209
+ async function buildCommitReview(cwd, target) {
210
+ const title = (await git([
211
+ "log",
212
+ "-1",
213
+ "--format=%s",
214
+ target.sha
215
+ ], cwd)).trim();
216
+ const nextTarget = {
217
+ ...target,
218
+ ...title ? { title } : {}
219
+ };
220
+ const stat = await git([
221
+ "show",
222
+ "--stat",
223
+ "--format=",
224
+ "--find-renames",
225
+ target.sha,
226
+ "--"
227
+ ], cwd);
228
+ const diff = await git([
229
+ "show",
230
+ "--format=fuller",
231
+ "--find-renames",
232
+ "--patch",
233
+ target.sha,
234
+ "--"
235
+ ], cwd);
236
+ return {
237
+ cwd,
238
+ target: nextTarget,
239
+ targetLabel: `commit ${target.sha}${title ? ` (${title})` : ""}`,
240
+ status: "",
241
+ stat,
242
+ diff
243
+ };
244
+ }
245
+ async function buildReviewDiffBundle(cwd, target) {
246
+ if (target.kind === "base_branch") return buildBaseBranchReview(cwd, target);
247
+ if (target.kind === "commit") return buildCommitReview(cwd, target);
248
+ return buildUncommittedReview(cwd, target);
249
+ }
250
+ function parseStatusCounts(status) {
251
+ let changedFiles = 0;
252
+ let untrackedFiles = 0;
253
+ for (const line of status.split("\n")) {
254
+ if (!line.trim()) continue;
255
+ if (line.startsWith("??")) untrackedFiles += 1;
256
+ else changedFiles += 1;
257
+ }
258
+ return {
259
+ changedFiles,
260
+ untrackedFiles,
261
+ isClean: changedFiles === 0 && untrackedFiles === 0
262
+ };
263
+ }
264
+ function normalizeBranchName(raw) {
265
+ return raw.replace(/^remotes\//, "").trim();
266
+ }
267
+ async function listBranches(cwd) {
268
+ const raw = await git([
269
+ "branch",
270
+ "--all",
271
+ "--format=%(refname:short)|%(HEAD)"
272
+ ], cwd).catch(() => "");
273
+ const seen = /* @__PURE__ */ new Set();
274
+ const out = [];
275
+ for (const line of raw.split("\n")) {
276
+ const [nameRaw, headRaw] = line.split("|");
277
+ const name = normalizeBranchName(nameRaw ?? "");
278
+ if (!name || name.includes("HEAD ->") || seen.has(name)) continue;
279
+ seen.add(name);
280
+ const item = { name };
281
+ if (headRaw?.trim() === "*") item.current = true;
282
+ if (name.includes("/")) item.remote = true;
283
+ out.push(item);
284
+ }
285
+ return out;
286
+ }
287
+ async function listCommits(cwd) {
288
+ return (await git([
289
+ "log",
290
+ "--date=iso-strict",
291
+ "--format=%H%x00%h%x00%s%x00%aI",
292
+ "-n",
293
+ "100"
294
+ ], cwd).catch(() => "")).split("\n").map((line) => {
295
+ const [sha, shortSha, subject, date] = line.split("\0");
296
+ if (!sha || !shortSha || !subject) return null;
297
+ const item = {
298
+ sha,
299
+ shortSha,
300
+ subject
301
+ };
302
+ if (date) item.date = date;
303
+ return item;
304
+ }).filter((item) => item != null);
305
+ }
306
+ function defaultBaseBranch(branches) {
307
+ for (const name of [
308
+ "origin/main",
309
+ "main",
310
+ "origin/master",
311
+ "master",
312
+ "develop"
313
+ ]) if (branches.some((branch) => branch.name === name)) return name;
314
+ return branches.find((branch) => branch.remote && !branch.current)?.name ?? branches.find((branch) => !branch.current)?.name;
315
+ }
316
+ async function buildReviewContext(cwd) {
317
+ const statusRaw = await git(["status", "--short"], cwd).catch(() => "");
318
+ const branches = await listBranches(cwd);
319
+ const commits = await listCommits(cwd);
320
+ const context = {
321
+ cwd,
322
+ status: parseStatusCounts(statusRaw),
323
+ branches,
324
+ commits
325
+ };
326
+ const base = defaultBaseBranch(branches);
327
+ if (base) context.defaultBaseBranch = base;
328
+ return context;
329
+ }
330
+ //#endregion
331
+ export { buildReviewContext, buildReviewDiffBundle, git, parseReviewTargetArgs, resolveGitRoot };
332
+
333
+ //# sourceMappingURL=review-git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-git.js","names":[],"sources":["../../../src/review/review-git.ts"],"sourcesContent":["import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nexport type ReviewTarget =\n | { kind: 'uncommitted'; instructions?: string }\n | { kind: 'base_branch'; baseBranch: string; instructions?: string }\n | { kind: 'commit'; sha: string; title?: string; instructions?: string };\n\nexport interface ReviewDiffBundle {\n cwd: string;\n target: ReviewTarget;\n targetLabel: string;\n status: string;\n stat: string;\n diff: string;\n}\n\nexport interface ReviewContextBranch {\n name: string;\n current?: boolean;\n remote?: boolean;\n}\n\nexport interface ReviewContextCommit {\n sha: string;\n shortSha: string;\n subject: string;\n date?: string;\n}\n\nexport interface ReviewContext {\n cwd: string;\n defaultBaseBranch?: string;\n status: {\n changedFiles: number;\n untrackedFiles: number;\n isClean: boolean;\n };\n branches: ReviewContextBranch[];\n commits: ReviewContextCommit[];\n}\n\nexport async function git(args: string[], cwd: string): Promise<string> {\n const { stdout } = await execFileAsync('git', args, {\n cwd,\n maxBuffer: 8 * 1024 * 1024,\n });\n return stdout;\n}\n\nasync function gitDiffNoIndex(args: string[], cwd: string): Promise<string> {\n try {\n return await git(args, cwd);\n } catch (err) {\n const rec = err && typeof err === 'object' ? err as Record<string, unknown> : {};\n if (typeof rec.stdout === 'string') return rec.stdout;\n throw err;\n }\n}\n\nexport async function resolveGitRoot(workspace: string): Promise<string> {\n const root = (await git(['rev-parse', '--show-toplevel'], workspace)).trim();\n return root || workspace;\n}\n\nasync function untrackedFileDiff(cwd: string): Promise<string> {\n const raw = await git(['ls-files', '--others', '--exclude-standard', '-z'], cwd).catch(() => '');\n const files = raw.split('\\0').map((item) => item.trim()).filter(Boolean);\n if (files.length === 0) return '';\n\n const chunks: string[] = [];\n for (const file of files) {\n const diff = await gitDiffNoIndex(['diff', '--no-index', '--', '/dev/null', file], cwd).catch(() => '');\n if (diff.trim()) chunks.push(diff);\n }\n return chunks.join('\\n');\n}\n\nfunction splitArgs(input: string): string[] {\n const out: string[] = [];\n let cur = '';\n let quote: '\"' | \"'\" | null = null;\n let escaped = false;\n for (const ch of input) {\n if (escaped) {\n cur += ch;\n escaped = false;\n continue;\n }\n if (ch === '\\\\') {\n escaped = true;\n continue;\n }\n if (quote) {\n if (ch === quote) quote = null;\n else cur += ch;\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n quote = ch;\n continue;\n }\n if (/\\s/.test(ch)) {\n if (cur) {\n out.push(cur);\n cur = '';\n }\n continue;\n }\n cur += ch;\n }\n if (escaped) cur += '\\\\';\n if (cur) out.push(cur);\n return out;\n}\n\nfunction readOptionValue(tokens: string[], index: number, flag: string): { value: string; next: number } {\n const token = tokens[index] ?? '';\n const eq = token.indexOf('=');\n if (eq > -1) {\n return { value: token.slice(eq + 1), next: index + 1 };\n }\n const value = tokens[index + 1] ?? '';\n if (!value || value.startsWith('--')) {\n throw new Error(`Missing value for ${flag}`);\n }\n return { value, next: index + 2 };\n}\n\nexport function parseReviewTargetArgs(args: string): ReviewTarget {\n const tokens = splitArgs(args.trim());\n let kind: ReviewTarget['kind'] | undefined;\n let baseBranch = '';\n let sha = '';\n let instructions = '';\n const free: string[] = [];\n\n for (let i = 0; i < tokens.length;) {\n const token = tokens[i]!;\n if (token === '--uncommitted') {\n kind = 'uncommitted';\n i += 1;\n continue;\n }\n if (token === '--base' || token.startsWith('--base=')) {\n const value = readOptionValue(tokens, i, '--base');\n kind = 'base_branch';\n baseBranch = value.value.trim();\n i = value.next;\n continue;\n }\n if (token === '--commit' || token.startsWith('--commit=')) {\n const value = readOptionValue(tokens, i, '--commit');\n kind = 'commit';\n sha = value.value.trim();\n i = value.next;\n continue;\n }\n if (token === '--custom' || token === '--instructions') {\n instructions = tokens.slice(i + 1).join(' ').trim();\n break;\n }\n if (token.startsWith('--custom=') || token.startsWith('--instructions=')) {\n instructions = token.slice(token.indexOf('=') + 1).trim();\n i += 1;\n continue;\n }\n free.push(token);\n i += 1;\n }\n\n const extraInstructions = instructions || free.join(' ').trim();\n if (!kind) kind = 'uncommitted';\n if (kind === 'base_branch') {\n if (!baseBranch) throw new Error('Missing base branch for review.');\n return { kind, baseBranch, ...(extraInstructions ? { instructions: extraInstructions } : {}) };\n }\n if (kind === 'commit') {\n if (!sha) throw new Error('Missing commit SHA for review.');\n return { kind, sha, ...(extraInstructions ? { instructions: extraInstructions } : {}) };\n }\n return { kind: 'uncommitted', ...(extraInstructions ? { instructions: extraInstructions } : {}) };\n}\n\nasync function buildUncommittedReview(cwd: string, target: ReviewTarget & { kind: 'uncommitted' }): Promise<ReviewDiffBundle> {\n const status = await git(['status', '--short'], cwd).catch(() => '');\n const stat = await git(['diff', '--stat', 'HEAD', '--'], cwd).catch(() => '');\n const trackedDiff = await git(['diff', '--find-renames', 'HEAD', '--'], cwd).catch(() => '');\n const untrackedDiff = await untrackedFileDiff(cwd);\n return {\n cwd,\n target,\n targetLabel: 'uncommitted changes',\n status,\n stat,\n diff: [trackedDiff, untrackedDiff].filter((part) => part.trim()).join('\\n'),\n };\n}\n\nasync function buildBaseBranchReview(cwd: string, target: ReviewTarget & { kind: 'base_branch' }): Promise<ReviewDiffBundle> {\n const mergeBase = (await git(['merge-base', 'HEAD', target.baseBranch], cwd)).trim();\n const status = await git(['status', '--short'], cwd).catch(() => '');\n const stat = await git(['diff', '--stat', mergeBase, 'HEAD', '--'], cwd).catch(() => '');\n const diff = await git(['diff', '--find-renames', mergeBase, 'HEAD', '--'], cwd).catch(() => '');\n return {\n cwd,\n target,\n targetLabel: `changes against ${target.baseBranch} (merge-base ${mergeBase.slice(0, 12)})`,\n status,\n stat,\n diff,\n };\n}\n\nasync function buildCommitReview(cwd: string, target: ReviewTarget & { kind: 'commit' }): Promise<ReviewDiffBundle> {\n const title = (await git(['log', '-1', '--format=%s', target.sha], cwd)).trim();\n const nextTarget: ReviewTarget = {\n ...target,\n ...(title ? { title } : {}),\n };\n const stat = await git(['show', '--stat', '--format=', '--find-renames', target.sha, '--'], cwd);\n const diff = await git(['show', '--format=fuller', '--find-renames', '--patch', target.sha, '--'], cwd);\n return {\n cwd,\n target: nextTarget,\n targetLabel: `commit ${target.sha}${title ? ` (${title})` : ''}`,\n status: '',\n stat,\n diff,\n };\n}\n\nexport async function buildReviewDiffBundle(cwd: string, target: ReviewTarget): Promise<ReviewDiffBundle> {\n if (target.kind === 'base_branch') return buildBaseBranchReview(cwd, target);\n if (target.kind === 'commit') return buildCommitReview(cwd, target);\n return buildUncommittedReview(cwd, target);\n}\n\nfunction parseStatusCounts(status: string): ReviewContext['status'] {\n let changedFiles = 0;\n let untrackedFiles = 0;\n for (const line of status.split('\\n')) {\n if (!line.trim()) continue;\n if (line.startsWith('??')) untrackedFiles += 1;\n else changedFiles += 1;\n }\n return {\n changedFiles,\n untrackedFiles,\n isClean: changedFiles === 0 && untrackedFiles === 0,\n };\n}\n\nfunction normalizeBranchName(raw: string): string {\n return raw.replace(/^remotes\\//, '').trim();\n}\n\nasync function listBranches(cwd: string): Promise<ReviewContextBranch[]> {\n const raw = await git(['branch', '--all', '--format=%(refname:short)|%(HEAD)'], cwd).catch(() => '');\n const seen = new Set<string>();\n const out: ReviewContextBranch[] = [];\n for (const line of raw.split('\\n')) {\n const [nameRaw, headRaw] = line.split('|');\n const name = normalizeBranchName(nameRaw ?? '');\n if (!name || name.includes('HEAD ->') || seen.has(name)) continue;\n seen.add(name);\n const item: ReviewContextBranch = { name };\n if (headRaw?.trim() === '*') item.current = true;\n if (name.includes('/')) item.remote = true;\n out.push(item);\n }\n return out;\n}\n\nasync function listCommits(cwd: string): Promise<ReviewContextCommit[]> {\n const raw = await git(['log', '--date=iso-strict', '--format=%H%x00%h%x00%s%x00%aI', '-n', '100'], cwd).catch(() => '');\n return raw\n .split('\\n')\n .map((line): ReviewContextCommit | null => {\n const [sha, shortSha, subject, date] = line.split('\\0');\n if (!sha || !shortSha || !subject) return null;\n const item: ReviewContextCommit = { sha, shortSha, subject };\n if (date) item.date = date;\n return item;\n })\n .filter((item): item is ReviewContextCommit => item != null);\n}\n\nfunction defaultBaseBranch(branches: ReviewContextBranch[]): string | undefined {\n const preferred = ['origin/main', 'main', 'origin/master', 'master', 'develop'];\n for (const name of preferred) {\n if (branches.some((branch) => branch.name === name)) return name;\n }\n return branches.find((branch) => branch.remote && !branch.current)?.name\n ?? branches.find((branch) => !branch.current)?.name;\n}\n\nexport async function buildReviewContext(cwd: string): Promise<ReviewContext> {\n const statusRaw = await git(['status', '--short'], cwd).catch(() => '');\n const branches = await listBranches(cwd);\n const commits = await listCommits(cwd);\n const context: ReviewContext = {\n cwd,\n status: parseStatusCounts(statusRaw),\n branches,\n commits,\n };\n const base = defaultBaseBranch(branches);\n if (base) context.defaultBaseBranch = base;\n return context;\n}\n"],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export type ReviewPriority = 0 | 1 | 2 | 3;
2
+ export interface ReviewFinding {
3
+ title: string;
4
+ body: string;
5
+ priority: ReviewPriority;
6
+ confidenceScore?: number;
7
+ filePath?: string;
8
+ lineStart?: number;
9
+ lineEnd?: number;
10
+ }
11
+ export interface ReviewOutput {
12
+ type: 'review';
13
+ target: string;
14
+ summary: string;
15
+ findings: ReviewFinding[];
16
+ overallCorrectness: 'patch is correct' | 'patch is incorrect' | 'unknown';
17
+ overallExplanation: string;
18
+ overallConfidenceScore?: number;
19
+ generatedAt: number;
20
+ source: 'model' | 'local';
21
+ }
22
+ export declare function formatReviewMarkdown(review: ReviewOutput): string;
@@ -0,0 +1,29 @@
1
+ //#region src/review/review-types.ts
2
+ function formatLocation(finding) {
3
+ if (!finding.filePath) return "";
4
+ if (!finding.lineStart) return finding.filePath;
5
+ const end = finding.lineEnd && finding.lineEnd !== finding.lineStart ? `-${finding.lineEnd}` : "";
6
+ return `${finding.filePath}:${finding.lineStart}${end}`;
7
+ }
8
+ function formatReviewMarkdown(review) {
9
+ const lines = ["Code review", ""];
10
+ if (review.findings.length === 0) lines.push("No findings.");
11
+ else {
12
+ lines.push("Findings:");
13
+ for (const finding of review.findings) {
14
+ const location = formatLocation(finding);
15
+ const suffix = location ? ` - ${location}` : "";
16
+ lines.push(`- [P${finding.priority}] ${finding.title}${suffix}`);
17
+ if (finding.body.trim()) lines.push(` ${finding.body.trim().replace(/\n+/g, "\n ")}`);
18
+ }
19
+ }
20
+ lines.push("");
21
+ lines.push(`Overall correctness: ${review.overallCorrectness}`);
22
+ if (review.overallExplanation.trim()) lines.push(review.overallExplanation.trim());
23
+ if (typeof review.overallConfidenceScore === "number") lines.push(`Confidence: ${review.overallConfidenceScore.toFixed(2)}`);
24
+ return lines.join("\n");
25
+ }
26
+ //#endregion
27
+ export { formatReviewMarkdown };
28
+
29
+ //# sourceMappingURL=review-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-types.js","names":[],"sources":["../../../src/review/review-types.ts"],"sourcesContent":["export type ReviewPriority = 0 | 1 | 2 | 3;\n\nexport interface ReviewFinding {\n title: string;\n body: string;\n priority: ReviewPriority;\n confidenceScore?: number;\n filePath?: string;\n lineStart?: number;\n lineEnd?: number;\n}\n\nexport interface ReviewOutput {\n type: 'review';\n target: string;\n summary: string;\n findings: ReviewFinding[];\n overallCorrectness: 'patch is correct' | 'patch is incorrect' | 'unknown';\n overallExplanation: string;\n overallConfidenceScore?: number;\n generatedAt: number;\n source: 'model' | 'local';\n}\n\nfunction formatLocation(finding: ReviewFinding): string {\n if (!finding.filePath) return '';\n if (!finding.lineStart) return finding.filePath;\n const end = finding.lineEnd && finding.lineEnd !== finding.lineStart ? `-${finding.lineEnd}` : '';\n return `${finding.filePath}:${finding.lineStart}${end}`;\n}\n\nexport function formatReviewMarkdown(review: ReviewOutput): string {\n const lines: string[] = ['Code review', ''];\n if (review.findings.length === 0) {\n lines.push('No findings.');\n } else {\n lines.push('Findings:');\n for (const finding of review.findings) {\n const location = formatLocation(finding);\n const suffix = location ? ` - ${location}` : '';\n lines.push(`- [P${finding.priority}] ${finding.title}${suffix}`);\n if (finding.body.trim()) {\n lines.push(` ${finding.body.trim().replace(/\\n+/g, '\\n ')}`);\n }\n }\n }\n lines.push('');\n lines.push(`Overall correctness: ${review.overallCorrectness}`);\n if (review.overallExplanation.trim()) {\n lines.push(review.overallExplanation.trim());\n }\n if (typeof review.overallConfidenceScore === 'number') {\n lines.push(`Confidence: ${review.overallConfidenceScore.toFixed(2)}`);\n }\n return lines.join('\\n');\n}\n"],"mappings":";AAwBA,SAAS,eAAe,SAAgC;AACtD,KAAI,CAAC,QAAQ,SAAU,QAAO;AAC9B,KAAI,CAAC,QAAQ,UAAW,QAAO,QAAQ;CACvC,MAAM,MAAM,QAAQ,WAAW,QAAQ,YAAY,QAAQ,YAAY,IAAI,QAAQ,YAAY;AAC/F,QAAO,GAAG,QAAQ,SAAS,GAAG,QAAQ,YAAY;;AAGpD,SAAgB,qBAAqB,QAA8B;CACjE,MAAM,QAAkB,CAAC,eAAe,GAAG;AAC3C,KAAI,OAAO,SAAS,WAAW,EAC7B,OAAM,KAAK,eAAe;MACrB;AACL,QAAM,KAAK,YAAY;AACvB,OAAK,MAAM,WAAW,OAAO,UAAU;GACrC,MAAM,WAAW,eAAe,QAAQ;GACxC,MAAM,SAAS,WAAW,MAAM,aAAa;AAC7C,SAAM,KAAK,OAAO,QAAQ,SAAS,IAAI,QAAQ,QAAQ,SAAS;AAChE,OAAI,QAAQ,KAAK,MAAM,CACrB,OAAM,KAAK,KAAK,QAAQ,KAAK,MAAM,CAAC,QAAQ,QAAQ,OAAO,GAAG;;;AAIpE,OAAM,KAAK,GAAG;AACd,OAAM,KAAK,wBAAwB,OAAO,qBAAqB;AAC/D,KAAI,OAAO,mBAAmB,MAAM,CAClC,OAAM,KAAK,OAAO,mBAAmB,MAAM,CAAC;AAE9C,KAAI,OAAO,OAAO,2BAA2B,SAC3C,OAAM,KAAK,eAAe,OAAO,uBAAuB,QAAQ,EAAE,GAAG;AAEvE,QAAO,MAAM,KAAK,KAAK"}
@@ -116,6 +116,8 @@ export declare function isTranscriptMetadataEntry(x: unknown): x is XopcTranscri
116
116
  export declare function transcriptRowsFromJsonArray(arr: unknown[]): TranscriptStoredRow[];
117
117
  /** Messages only — what providers and pi-agent should see. */
118
118
  export declare function buildSessionContextForLlm(rows: TranscriptStoredRow[]): AgentMessage[];
119
+ /** Visible chat messages only - no LLM-only audit/context expansion. */
120
+ export declare function buildSessionDisplayMessages(rows: TranscriptStoredRow[]): AgentMessage[];
119
121
  /**
120
122
  * When persisting LLM messages, keep prior `kind: 'context'` rows in their relative positions:
121
123
  * each non-context slot in the previous file is replaced by the next incoming LLM message;
@@ -37,6 +37,8 @@ const LLM_ROLES = new Set([
37
37
  "tool",
38
38
  "toolResult"
39
39
  ]);
40
+ const CODING_CONTEXT_LOOKBACK = 80;
41
+ const CODING_CONTEXT_MAX_LINES = 24;
40
42
  function isLikelyAgentMessage(x) {
41
43
  if (!x || typeof x !== "object") return false;
42
44
  const role = x.role;
@@ -85,6 +87,153 @@ function bashExecutionRowToLlmMessage(row) {
85
87
  timestamp: parseTimestampValue(row.timestamp)
86
88
  };
87
89
  }
90
+ function asRecord(value) {
91
+ return value && typeof value === "object" && !Array.isArray(value) ? value : null;
92
+ }
93
+ function stringValue(value) {
94
+ return typeof value === "string" ? value : void 0;
95
+ }
96
+ function parseJsonRecord(value) {
97
+ if (typeof value !== "string" || !value.trim()) return null;
98
+ try {
99
+ return asRecord(JSON.parse(value));
100
+ } catch {
101
+ return null;
102
+ }
103
+ }
104
+ function textFromContent(content) {
105
+ if (typeof content === "string") return content;
106
+ if (!Array.isArray(content)) return "";
107
+ return content.map((part) => {
108
+ if (typeof part === "string") return part;
109
+ const rec = asRecord(part);
110
+ if (!rec) return "";
111
+ if (rec.type === "text" && typeof rec.text === "string") return rec.text;
112
+ return "";
113
+ }).filter(Boolean).join("");
114
+ }
115
+ function toolNameFromBlock(block) {
116
+ const fn = asRecord(block.function);
117
+ return stringValue(block.name) ?? stringValue(block.toolName) ?? stringValue(fn?.name) ?? "tool";
118
+ }
119
+ function toolArgsFromBlock(block) {
120
+ const fn = asRecord(block.function);
121
+ return asRecord(block.arguments) ?? asRecord(block.args) ?? asRecord(block.input) ?? asRecord(fn?.arguments) ?? parseJsonRecord(block.arguments) ?? parseJsonRecord(block.args) ?? parseJsonRecord(block.input) ?? parseJsonRecord(fn?.arguments) ?? {};
122
+ }
123
+ function toolCallIdFromBlock(block) {
124
+ return stringValue(block.id) ?? stringValue(block.toolCallId) ?? stringValue(block.tool_call_id) ?? stringValue(block.tool_call_id$);
125
+ }
126
+ function toolResultId(row) {
127
+ const rec = row;
128
+ return stringValue(rec.toolCallId) ?? stringValue(rec.tool_call_id) ?? stringValue(rec.tool_call_id$);
129
+ }
130
+ function extractResultDetails(row) {
131
+ if (!row) return null;
132
+ const topLevelDetails = asRecord(row.details);
133
+ if (topLevelDetails) return topLevelDetails;
134
+ const contentText = textFromContent(row.content);
135
+ if (!contentText.trim()) return null;
136
+ try {
137
+ const rec = asRecord(JSON.parse(contentText));
138
+ return asRecord(rec?.details) ?? rec;
139
+ } catch {
140
+ return null;
141
+ }
142
+ }
143
+ function collectToolResults(messages) {
144
+ const results = /* @__PURE__ */ new Map();
145
+ for (const message of messages) {
146
+ const role = message.role;
147
+ if (role !== "tool" && role !== "toolResult") continue;
148
+ const id = toolResultId(message);
149
+ if (id) results.set(id, message);
150
+ }
151
+ return results;
152
+ }
153
+ function extractToolCalls(message) {
154
+ const content = message.content;
155
+ const calls = [];
156
+ if (Array.isArray(content)) for (const block of content) {
157
+ const rec = asRecord(block);
158
+ const type = rec ? stringValue(rec.type) : void 0;
159
+ if (!rec || type !== "toolCall" && type !== "tool_use" && type !== "tool_call") continue;
160
+ calls.push({
161
+ id: toolCallIdFromBlock(rec),
162
+ name: toolNameFromBlock(rec),
163
+ args: toolArgsFromBlock(rec)
164
+ });
165
+ }
166
+ const toolCalls = message.tool_calls;
167
+ if (Array.isArray(toolCalls)) for (const call of toolCalls) {
168
+ const rec = asRecord(call);
169
+ const fn = asRecord(rec?.function);
170
+ const name = stringValue(fn?.name) ?? stringValue(rec?.name);
171
+ if (!rec || !name) continue;
172
+ calls.push({
173
+ id: stringValue(rec.id),
174
+ name,
175
+ args: parseJsonRecord(fn?.arguments) ?? asRecord(fn?.arguments) ?? {}
176
+ });
177
+ }
178
+ return calls;
179
+ }
180
+ function summarizePlan(details) {
181
+ const lines = (Array.isArray(details.plan) ? details.plan : []).map((item) => {
182
+ const rec = asRecord(item);
183
+ const step = stringValue(rec?.step)?.trim();
184
+ const status = stringValue(rec?.status)?.trim();
185
+ return step && status ? `${status}: ${step}` : "";
186
+ }).filter(Boolean).slice(0, 8);
187
+ if (lines.length === 0) return void 0;
188
+ const explanation = stringValue(details.explanation)?.trim();
189
+ return `Plan${explanation ? ` (${explanation})` : ""}: ${lines.join(" | ")}`;
190
+ }
191
+ function summarizeCommand(args, details) {
192
+ const command = stringValue(details?.command) ?? stringValue(args.cmd) ?? stringValue(args.command) ?? "";
193
+ const status = stringValue(details?.status) ?? (details?.exitCode === 0 ? "success" : "unknown");
194
+ const exitCode = typeof details?.exitCode === "number" ? details.exitCode : void 0;
195
+ const hint = stringValue(details?.failureHint);
196
+ return [
197
+ `Command ${status}: ${command || "(unknown command)"}`,
198
+ exitCode !== void 0 ? `exit=${exitCode}` : "",
199
+ hint ? `hint=${hint}` : ""
200
+ ].filter(Boolean).join(" ");
201
+ }
202
+ function summarizePatch(details) {
203
+ if (!details) return void 0;
204
+ const files = Array.isArray(details.files) ? details.files.filter((file) => typeof file === "string" && file.trim().length > 0) : [];
205
+ const added = typeof details.added === "number" ? details.added : 0;
206
+ const removed = typeof details.removed === "number" ? details.removed : 0;
207
+ const summary = stringValue(details.summary)?.trim();
208
+ return `Patch applied: ${files.length ? files.join(", ") : summary || "(files unknown)"} (+${added}/-${removed})`;
209
+ }
210
+ function buildCodingContextMessage(messages) {
211
+ const recent = messages.slice(-CODING_CONTEXT_LOOKBACK);
212
+ const results = collectToolResults(recent);
213
+ const lines = [];
214
+ for (const message of recent) {
215
+ if (message.role !== "assistant") continue;
216
+ for (const call of extractToolCalls(message)) {
217
+ if (call.name !== "update_plan" && call.name !== "exec_command" && call.name !== "apply_patch") continue;
218
+ const details = extractResultDetails(call.id ? results.get(call.id) : void 0);
219
+ const line = call.name === "update_plan" ? summarizePlan(details ?? call.args) : call.name === "exec_command" ? summarizeCommand(call.args, details) : summarizePatch(details);
220
+ if (line) lines.push(line);
221
+ }
222
+ }
223
+ const uniqueLines = [...new Set(lines)].slice(-CODING_CONTEXT_MAX_LINES);
224
+ if (uniqueLines.length === 0) return null;
225
+ return {
226
+ role: "user",
227
+ content: [{
228
+ type: "text",
229
+ text: [
230
+ "<coding_context>",
231
+ ...uniqueLines.map((line) => `- ${line}`),
232
+ "</coding_context>"
233
+ ].join("\n")
234
+ }]
235
+ };
236
+ }
88
237
  /**
89
238
  * Normalize a JSON array from on-disk transcript into stored rows (drops unrecognized objects).
90
239
  */
@@ -140,6 +289,21 @@ function buildSessionContextForLlm(rows) {
140
289
  }
141
290
  if (isLikelyAgentMessage(r)) out.push(r);
142
291
  }
292
+ const codingContext = buildCodingContextMessage(out);
293
+ if (codingContext) out.push(codingContext);
294
+ return out;
295
+ }
296
+ /** Visible chat messages only - no LLM-only audit/context expansion. */
297
+ function buildSessionDisplayMessages(rows) {
298
+ const out = [];
299
+ for (const r of rows) {
300
+ if (isTranscriptCustomMessageEntry(r)) {
301
+ if (r.display === false) continue;
302
+ out.push(customMessageRowToLlmMessage(r));
303
+ continue;
304
+ }
305
+ if (isLikelyAgentMessage(r)) out.push(r);
306
+ }
143
307
  return out;
144
308
  }
145
309
  /**
@@ -162,6 +326,6 @@ function mergeLlmMessagesPreservingContextRows(prevRows, llmMessages) {
162
326
  return out;
163
327
  }
164
328
  //#endregion
165
- export { buildSessionContextForLlm, isTranscriptBashExecutionEntry, isTranscriptContextEntry, isTranscriptCustomMessageEntry, isTranscriptCustomStateEntry, isTranscriptLabelEntry, isTranscriptMetadataEntry, isTranscriptSummaryMessageEntry, mergeLlmMessagesPreservingContextRows, transcriptRowsFromJsonArray };
329
+ export { buildSessionContextForLlm, buildSessionDisplayMessages, isTranscriptBashExecutionEntry, isTranscriptContextEntry, isTranscriptCustomMessageEntry, isTranscriptCustomStateEntry, isTranscriptLabelEntry, isTranscriptMetadataEntry, isTranscriptSummaryMessageEntry, mergeLlmMessagesPreservingContextRows, transcriptRowsFromJsonArray };
166
330
 
167
331
  //# sourceMappingURL=session-context-for-llm.js.map