@roackb2/heddle 1.1.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. package/README.md +9 -1
  2. package/dist/src/cli/ask.d.ts +11 -1
  3. package/dist/src/cli/ask.d.ts.map +1 -1
  4. package/dist/src/cli/ask.js +172 -198
  5. package/dist/src/cli/ask.js.map +1 -1
  6. package/dist/src/cli/chat/App.d.ts.map +1 -1
  7. package/dist/src/cli/chat/App.js +17 -146
  8. package/dist/src/cli/chat/App.js.map +1 -1
  9. package/dist/src/cli/chat/adapters/slash-command-context.js +1 -1
  10. package/dist/src/cli/chat/adapters/slash-command-context.js.map +1 -1
  11. package/dist/src/cli/chat/hooks/{tui-agent-turn-lifecycle.d.ts → controllers/run/tui-agent-turn-lifecycle.d.ts} +1 -1
  12. package/dist/src/cli/chat/hooks/controllers/run/tui-agent-turn-lifecycle.d.ts.map +1 -0
  13. package/dist/src/cli/chat/hooks/controllers/run/tui-agent-turn-lifecycle.js.map +1 -0
  14. package/dist/src/cli/chat/hooks/controllers/run/tui-agent-turn-result.d.ts +35 -0
  15. package/dist/src/cli/chat/hooks/controllers/run/tui-agent-turn-result.d.ts.map +1 -0
  16. package/dist/src/cli/chat/hooks/controllers/run/tui-agent-turn-result.js +60 -0
  17. package/dist/src/cli/chat/hooks/controllers/run/tui-agent-turn-result.js.map +1 -0
  18. package/dist/src/cli/chat/hooks/controllers/run/tui-compaction-status.d.ts +24 -0
  19. package/dist/src/cli/chat/hooks/controllers/run/tui-compaction-status.d.ts.map +1 -0
  20. package/dist/src/cli/chat/hooks/{tui-compaction-status.js → controllers/run/tui-compaction-status.js} +12 -24
  21. package/dist/src/cli/chat/hooks/controllers/run/tui-compaction-status.js.map +1 -0
  22. package/dist/src/cli/chat/hooks/{tui-direct-shell-result.d.ts → controllers/run/tui-direct-shell-result.d.ts} +6 -6
  23. package/dist/src/cli/chat/hooks/controllers/run/tui-direct-shell-result.d.ts.map +1 -0
  24. package/dist/src/cli/chat/hooks/{tui-direct-shell-result.js → controllers/run/tui-direct-shell-result.js} +12 -12
  25. package/dist/src/cli/chat/hooks/controllers/run/tui-direct-shell-result.js.map +1 -0
  26. package/dist/src/cli/chat/hooks/controllers/run/tui-direct-shell.d.ts +22 -0
  27. package/dist/src/cli/chat/hooks/controllers/run/tui-direct-shell.d.ts.map +1 -0
  28. package/dist/src/cli/chat/hooks/{tui-direct-shell.js → controllers/run/tui-direct-shell.js} +40 -35
  29. package/dist/src/cli/chat/hooks/controllers/run/tui-direct-shell.js.map +1 -0
  30. package/dist/src/cli/chat/hooks/{tui-drift-observer.d.ts → controllers/run/tui-drift-observer.d.ts} +3 -3
  31. package/dist/src/cli/chat/hooks/controllers/run/tui-drift-observer.d.ts.map +1 -0
  32. package/dist/src/cli/chat/hooks/{tui-drift-observer.js → controllers/run/tui-drift-observer.js} +2 -2
  33. package/dist/src/cli/chat/hooks/controllers/run/tui-drift-observer.js.map +1 -0
  34. package/dist/src/cli/chat/hooks/{tui-ordinary-turn.d.ts → controllers/run/tui-ordinary-turn.d.ts} +8 -5
  35. package/dist/src/cli/chat/hooks/controllers/run/tui-ordinary-turn.d.ts.map +1 -0
  36. package/dist/src/cli/chat/hooks/{tui-ordinary-turn.js → controllers/run/tui-ordinary-turn.js} +14 -13
  37. package/dist/src/cli/chat/hooks/controllers/run/tui-ordinary-turn.js.map +1 -0
  38. package/dist/src/cli/chat/hooks/{tui-run-loop-events.d.ts → controllers/run/tui-run-loop-events.d.ts} +6 -6
  39. package/dist/src/cli/chat/hooks/controllers/run/tui-run-loop-events.d.ts.map +1 -0
  40. package/dist/src/cli/chat/hooks/{tui-run-loop-events.js → controllers/run/tui-run-loop-events.js} +27 -27
  41. package/dist/src/cli/chat/hooks/controllers/run/tui-run-loop-events.js.map +1 -0
  42. package/dist/src/cli/chat/hooks/{tui-tool-approval.d.ts → controllers/run/tui-tool-approval.d.ts} +3 -3
  43. package/dist/src/cli/chat/hooks/controllers/run/tui-tool-approval.d.ts.map +1 -0
  44. package/dist/src/cli/chat/hooks/{tui-tool-approval.js → controllers/run/tui-tool-approval.js} +4 -4
  45. package/dist/src/cli/chat/hooks/controllers/run/tui-tool-approval.js.map +1 -0
  46. package/dist/src/cli/chat/hooks/{useAgentRun.d.ts → controllers/useAgentRunController.d.ts} +14 -11
  47. package/dist/src/cli/chat/hooks/controllers/useAgentRunController.d.ts.map +1 -0
  48. package/dist/src/cli/chat/hooks/{useAgentRun.js → controllers/useAgentRunController.js} +34 -23
  49. package/dist/src/cli/chat/hooks/controllers/useAgentRunController.js.map +1 -0
  50. package/dist/src/cli/chat/hooks/controllers/useChatAppController.d.ts +26 -0
  51. package/dist/src/cli/chat/hooks/controllers/useChatAppController.d.ts.map +1 -0
  52. package/dist/src/cli/chat/hooks/controllers/useChatAppController.js +164 -0
  53. package/dist/src/cli/chat/hooks/controllers/useChatAppController.js.map +1 -0
  54. package/dist/src/cli/chat/hooks/{usePromptSubmission.d.ts → controllers/usePromptSubmissionController.d.ts} +10 -9
  55. package/dist/src/cli/chat/hooks/controllers/usePromptSubmissionController.d.ts.map +1 -0
  56. package/dist/src/cli/chat/hooks/{usePromptSubmission.js → controllers/usePromptSubmissionController.js} +13 -12
  57. package/dist/src/cli/chat/hooks/controllers/usePromptSubmissionController.js.map +1 -0
  58. package/dist/src/cli/chat/hooks/useApprovalFlow.d.ts +1 -1
  59. package/dist/src/cli/chat/hooks/useApprovalFlow.d.ts.map +1 -1
  60. package/dist/src/cli/chat/hooks/useChatDrift.d.ts +4 -4
  61. package/dist/src/cli/chat/hooks/useChatDrift.d.ts.map +1 -1
  62. package/dist/src/cli/chat/hooks/useChatDrift.js +7 -6
  63. package/dist/src/cli/chat/hooks/useChatDrift.js.map +1 -1
  64. package/dist/src/cli/chat/hooks/useChatSessions.d.ts +3 -0
  65. package/dist/src/cli/chat/hooks/useChatSessions.d.ts.map +1 -1
  66. package/dist/src/cli/chat/hooks/useChatSessions.js +66 -87
  67. package/dist/src/cli/chat/hooks/useChatSessions.js.map +1 -1
  68. package/dist/src/cli/chat/submit.d.ts +3 -4
  69. package/dist/src/cli/chat/submit.d.ts.map +1 -1
  70. package/dist/src/cli/chat/submit.js +17 -55
  71. package/dist/src/cli/chat/submit.js.map +1 -1
  72. package/dist/src/cli/chat/utils/runtime.d.ts.map +1 -1
  73. package/dist/src/cli/chat/utils/runtime.js.map +1 -1
  74. package/dist/src/cli/daemon.d.ts +2 -2
  75. package/dist/src/cli/daemon.d.ts.map +1 -1
  76. package/dist/src/cli/daemon.js +2 -2
  77. package/dist/src/cli/daemon.js.map +1 -1
  78. package/dist/src/cli/main.js +3 -3
  79. package/dist/src/cli/main.js.map +1 -1
  80. package/dist/src/cli/remote/control-plane-client.d.ts +8 -4
  81. package/dist/src/cli/remote/control-plane-client.d.ts.map +1 -1
  82. package/dist/src/cli/session.js +1 -1
  83. package/dist/src/cli/session.js.map +1 -1
  84. package/dist/src/core/awareness/domains/coding/collectors/project-signals.d.ts +12 -0
  85. package/dist/src/core/awareness/domains/coding/collectors/project-signals.d.ts.map +1 -0
  86. package/dist/src/core/awareness/domains/coding/collectors/project-signals.js +187 -0
  87. package/dist/src/core/awareness/domains/coding/collectors/project-signals.js.map +1 -0
  88. package/dist/src/core/awareness/domains/coding/collectors/workspace.d.ts +3 -1
  89. package/dist/src/core/awareness/domains/coding/collectors/workspace.d.ts.map +1 -1
  90. package/dist/src/core/awareness/domains/coding/collectors/workspace.js +20 -11
  91. package/dist/src/core/awareness/domains/coding/collectors/workspace.js.map +1 -1
  92. package/dist/src/core/awareness/domains/coding/detectors/go.d.ts +3 -0
  93. package/dist/src/core/awareness/domains/coding/detectors/go.d.ts.map +1 -0
  94. package/dist/src/core/awareness/domains/coding/detectors/go.js +48 -0
  95. package/dist/src/core/awareness/domains/coding/detectors/go.js.map +1 -0
  96. package/dist/src/core/awareness/domains/coding/detectors/javascript.d.ts +3 -0
  97. package/dist/src/core/awareness/domains/coding/detectors/javascript.d.ts.map +1 -0
  98. package/dist/src/core/awareness/domains/coding/detectors/javascript.js +90 -0
  99. package/dist/src/core/awareness/domains/coding/detectors/javascript.js.map +1 -0
  100. package/dist/src/core/awareness/domains/coding/detectors/python.d.ts +3 -0
  101. package/dist/src/core/awareness/domains/coding/detectors/python.d.ts.map +1 -0
  102. package/dist/src/core/awareness/domains/coding/detectors/python.js +79 -0
  103. package/dist/src/core/awareness/domains/coding/detectors/python.js.map +1 -0
  104. package/dist/src/core/awareness/domains/coding/detectors/types.d.ts +18 -0
  105. package/dist/src/core/awareness/domains/coding/detectors/types.d.ts.map +1 -0
  106. package/dist/src/core/awareness/domains/coding/detectors/types.js +2 -0
  107. package/dist/src/core/awareness/domains/coding/detectors/types.js.map +1 -0
  108. package/dist/src/core/awareness/domains/coding/format.d.ts.map +1 -1
  109. package/dist/src/core/awareness/domains/coding/format.js +6 -0
  110. package/dist/src/core/awareness/domains/coding/format.js.map +1 -1
  111. package/dist/src/core/awareness/domains/coding/provider.d.ts.map +1 -1
  112. package/dist/src/core/awareness/domains/coding/provider.js +18 -1
  113. package/dist/src/core/awareness/domains/coding/provider.js.map +1 -1
  114. package/dist/src/core/awareness/domains/coding/types.d.ts +68 -1
  115. package/dist/src/core/awareness/domains/coding/types.d.ts.map +1 -1
  116. package/dist/src/core/awareness/types.d.ts +1 -1
  117. package/dist/src/core/awareness/types.d.ts.map +1 -1
  118. package/dist/src/core/chat/engine/conversation-engine.d.ts.map +1 -1
  119. package/dist/src/core/chat/engine/conversation-engine.js +4 -8
  120. package/dist/src/core/chat/engine/conversation-engine.js.map +1 -1
  121. package/dist/src/core/chat/engine/index.d.ts +1 -1
  122. package/dist/src/core/chat/engine/index.d.ts.map +1 -1
  123. package/dist/src/core/chat/engine/sessions/{storage.d.ts → repository/file-chat-session-repository.d.ts} +17 -18
  124. package/dist/src/core/chat/engine/sessions/repository/file-chat-session-repository.d.ts.map +1 -0
  125. package/dist/src/core/chat/engine/sessions/{storage.js → repository/file-chat-session-repository.js} +70 -51
  126. package/dist/src/core/chat/engine/sessions/repository/file-chat-session-repository.js.map +1 -0
  127. package/dist/src/core/chat/engine/sessions/service.d.ts +43 -4
  128. package/dist/src/core/chat/engine/sessions/service.d.ts.map +1 -1
  129. package/dist/src/core/chat/engine/sessions/service.js +268 -46
  130. package/dist/src/core/chat/engine/sessions/service.js.map +1 -1
  131. package/dist/src/core/chat/engine/sessions/session-record.d.ts +16 -0
  132. package/dist/src/core/chat/engine/sessions/session-record.d.ts.map +1 -0
  133. package/dist/src/core/chat/engine/sessions/session-record.js +60 -0
  134. package/dist/src/core/chat/engine/sessions/session-record.js.map +1 -0
  135. package/dist/src/core/chat/engine/turns/context.d.ts +2 -0
  136. package/dist/src/core/chat/engine/turns/context.d.ts.map +1 -1
  137. package/dist/src/core/chat/engine/turns/context.js +3 -3
  138. package/dist/src/core/chat/engine/turns/context.js.map +1 -1
  139. package/dist/src/core/chat/engine/turns/memory-maintenance.d.ts.map +1 -1
  140. package/dist/src/core/chat/engine/turns/memory-maintenance.js +2 -1
  141. package/dist/src/core/chat/engine/turns/memory-maintenance.js.map +1 -1
  142. package/dist/src/core/chat/engine/turns/persistence.d.ts.map +1 -1
  143. package/dist/src/core/chat/engine/turns/persistence.js +2 -1
  144. package/dist/src/core/chat/engine/turns/persistence.js.map +1 -1
  145. package/dist/src/core/chat/engine/turns/preflight.d.ts.map +1 -1
  146. package/dist/src/core/chat/engine/turns/preflight.js +2 -1
  147. package/dist/src/core/chat/engine/turns/preflight.js.map +1 -1
  148. package/dist/src/core/chat/engine/turns/result.js +1 -1
  149. package/dist/src/core/chat/engine/turns/result.js.map +1 -1
  150. package/dist/src/core/chat/engine/turns/run-conversation-turn.d.ts +10 -0
  151. package/dist/src/core/chat/engine/turns/run-conversation-turn.d.ts.map +1 -1
  152. package/dist/src/core/chat/engine/turns/run-conversation-turn.js +12 -1
  153. package/dist/src/core/chat/engine/turns/run-conversation-turn.js.map +1 -1
  154. package/dist/src/core/chat/engine/turns/service.d.ts +9 -4
  155. package/dist/src/core/chat/engine/turns/service.d.ts.map +1 -1
  156. package/dist/src/core/chat/engine/turns/service.js +29 -28
  157. package/dist/src/core/chat/engine/turns/service.js.map +1 -1
  158. package/dist/src/core/chat/engine/types.d.ts +48 -2
  159. package/dist/src/core/chat/engine/types.d.ts.map +1 -1
  160. package/dist/src/core/chat/types.d.ts +2 -0
  161. package/dist/src/core/chat/types.d.ts.map +1 -1
  162. package/dist/src/core/prompts/system-prompt.d.ts.map +1 -1
  163. package/dist/src/core/prompts/system-prompt.js +1 -0
  164. package/dist/src/core/prompts/system-prompt.js.map +1 -1
  165. package/dist/src/core/tools/toolkits/coding-awareness/project-dashboard.d.ts.map +1 -1
  166. package/dist/src/core/tools/toolkits/coding-awareness/project-dashboard.js +9 -4
  167. package/dist/src/core/tools/toolkits/coding-awareness/project-dashboard.js.map +1 -1
  168. package/dist/src/index.d.ts +1 -1
  169. package/dist/src/index.d.ts.map +1 -1
  170. package/dist/src/index.js.map +1 -1
  171. package/dist/src/server/app.js +3 -3
  172. package/dist/src/server/app.js.map +1 -1
  173. package/dist/src/server/features/control-plane/{services → controllers}/ask.d.ts +5 -1
  174. package/dist/src/server/features/control-plane/controllers/ask.d.ts.map +1 -0
  175. package/dist/src/server/features/control-plane/controllers/ask.js +68 -0
  176. package/dist/src/server/features/control-plane/controllers/ask.js.map +1 -0
  177. package/dist/src/server/features/control-plane/controllers/chat-session-events.d.ts +26 -0
  178. package/dist/src/server/features/control-plane/controllers/chat-session-events.d.ts.map +1 -0
  179. package/dist/src/server/features/control-plane/controllers/chat-session-events.js +49 -0
  180. package/dist/src/server/features/control-plane/controllers/chat-session-events.js.map +1 -0
  181. package/dist/src/server/features/control-plane/controllers/chat-session-presenter.d.ts +12 -0
  182. package/dist/src/server/features/control-plane/controllers/chat-session-presenter.d.ts.map +1 -0
  183. package/dist/src/server/features/control-plane/controllers/chat-session-presenter.js +181 -0
  184. package/dist/src/server/features/control-plane/controllers/chat-session-presenter.js.map +1 -0
  185. package/dist/src/server/features/control-plane/controllers/chat-sessions-controller.d.ts +63 -0
  186. package/dist/src/server/features/control-plane/controllers/chat-sessions-controller.d.ts.map +1 -0
  187. package/dist/src/server/features/control-plane/controllers/chat-sessions-controller.js +285 -0
  188. package/dist/src/server/features/control-plane/controllers/chat-sessions-controller.js.map +1 -0
  189. package/dist/src/server/features/control-plane/controllers/chat-turn-review-presenter.d.ts +13 -0
  190. package/dist/src/server/features/control-plane/controllers/chat-turn-review-presenter.d.ts.map +1 -0
  191. package/dist/src/server/features/control-plane/controllers/chat-turn-review-presenter.js +196 -0
  192. package/dist/src/server/features/control-plane/controllers/chat-turn-review-presenter.js.map +1 -0
  193. package/dist/src/server/features/control-plane/controllers/control-plane-state.d.ts +7 -0
  194. package/dist/src/server/features/control-plane/controllers/control-plane-state.d.ts.map +1 -0
  195. package/dist/src/server/features/control-plane/controllers/control-plane-state.js +64 -0
  196. package/dist/src/server/features/control-plane/controllers/control-plane-state.js.map +1 -0
  197. package/dist/src/server/features/control-plane/controllers/heartbeat.d.ts +12 -0
  198. package/dist/src/server/features/control-plane/controllers/heartbeat.d.ts.map +1 -0
  199. package/dist/src/server/features/control-plane/controllers/heartbeat.js +59 -0
  200. package/dist/src/server/features/control-plane/controllers/heartbeat.js.map +1 -0
  201. package/dist/src/server/features/control-plane/controllers/layout-snapshots.d.ts +13 -0
  202. package/dist/src/server/features/control-plane/controllers/layout-snapshots.d.ts.map +1 -0
  203. package/dist/src/server/features/control-plane/controllers/layout-snapshots.js +70 -0
  204. package/dist/src/server/features/control-plane/controllers/layout-snapshots.js.map +1 -0
  205. package/dist/src/server/features/control-plane/controllers/memory.d.ts +25 -0
  206. package/dist/src/server/features/control-plane/controllers/memory.d.ts.map +1 -0
  207. package/dist/src/server/features/control-plane/controllers/memory.js +44 -0
  208. package/dist/src/server/features/control-plane/controllers/memory.js.map +1 -0
  209. package/dist/src/server/features/control-plane/controllers/workspace-diff.d.ts +18 -0
  210. package/dist/src/server/features/control-plane/controllers/workspace-diff.d.ts.map +1 -0
  211. package/dist/src/server/features/control-plane/controllers/workspace-diff.js +260 -0
  212. package/dist/src/server/features/control-plane/controllers/workspace-diff.js.map +1 -0
  213. package/dist/src/server/features/control-plane/controllers/workspace-files.d.ts +38 -0
  214. package/dist/src/server/features/control-plane/controllers/workspace-files.d.ts.map +1 -0
  215. package/dist/src/server/features/control-plane/controllers/workspace-files.js +139 -0
  216. package/dist/src/server/features/control-plane/controllers/workspace-files.js.map +1 -0
  217. package/dist/src/server/features/control-plane/helpers/read-values.d.ts +7 -0
  218. package/dist/src/server/features/control-plane/helpers/read-values.d.ts.map +1 -0
  219. package/dist/src/server/features/control-plane/helpers/read-values.js +26 -0
  220. package/dist/src/server/features/control-plane/helpers/read-values.js.map +1 -0
  221. package/dist/src/server/features/control-plane/router.d.ts +8 -4
  222. package/dist/src/server/features/control-plane/router.d.ts.map +1 -1
  223. package/dist/src/server/features/control-plane/router.js +59 -40
  224. package/dist/src/server/features/control-plane/router.js.map +1 -1
  225. package/dist/src/server/features/control-plane/types.d.ts +2 -0
  226. package/dist/src/server/features/control-plane/types.d.ts.map +1 -1
  227. package/dist/src/server/index.d.ts +1 -1
  228. package/dist/src/server/index.d.ts.map +1 -1
  229. package/dist/src/server/index.js +1 -1
  230. package/dist/src/server/index.js.map +1 -1
  231. package/dist/src/server/router.d.ts +8 -4
  232. package/dist/src/server/router.d.ts.map +1 -1
  233. package/dist/src/web/assets/{MonacoDiffViewer-vifX8i2F.js → MonacoDiffViewer-D0Ed6GCN.js} +1 -1
  234. package/dist/src/web/assets/{index-vEln1ViW.js → index-B_9nk8kS.js} +2 -2
  235. package/dist/src/web/index.html +1 -1
  236. package/package.json +6 -2
  237. package/dist/src/cli/chat/hooks/tui-agent-turn-lifecycle.d.ts.map +0 -1
  238. package/dist/src/cli/chat/hooks/tui-agent-turn-lifecycle.js.map +0 -1
  239. package/dist/src/cli/chat/hooks/tui-agent-turn-result.d.ts +0 -48
  240. package/dist/src/cli/chat/hooks/tui-agent-turn-result.d.ts.map +0 -1
  241. package/dist/src/cli/chat/hooks/tui-agent-turn-result.js +0 -172
  242. package/dist/src/cli/chat/hooks/tui-agent-turn-result.js.map +0 -1
  243. package/dist/src/cli/chat/hooks/tui-compaction-status.d.ts +0 -24
  244. package/dist/src/cli/chat/hooks/tui-compaction-status.d.ts.map +0 -1
  245. package/dist/src/cli/chat/hooks/tui-compaction-status.js.map +0 -1
  246. package/dist/src/cli/chat/hooks/tui-direct-shell-result.d.ts.map +0 -1
  247. package/dist/src/cli/chat/hooks/tui-direct-shell-result.js.map +0 -1
  248. package/dist/src/cli/chat/hooks/tui-direct-shell.d.ts +0 -22
  249. package/dist/src/cli/chat/hooks/tui-direct-shell.d.ts.map +0 -1
  250. package/dist/src/cli/chat/hooks/tui-direct-shell.js.map +0 -1
  251. package/dist/src/cli/chat/hooks/tui-drift-observer.d.ts.map +0 -1
  252. package/dist/src/cli/chat/hooks/tui-drift-observer.js.map +0 -1
  253. package/dist/src/cli/chat/hooks/tui-ordinary-turn.d.ts.map +0 -1
  254. package/dist/src/cli/chat/hooks/tui-ordinary-turn.js.map +0 -1
  255. package/dist/src/cli/chat/hooks/tui-run-loop-events.d.ts.map +0 -1
  256. package/dist/src/cli/chat/hooks/tui-run-loop-events.js.map +0 -1
  257. package/dist/src/cli/chat/hooks/tui-tool-approval.d.ts.map +0 -1
  258. package/dist/src/cli/chat/hooks/tui-tool-approval.js.map +0 -1
  259. package/dist/src/cli/chat/hooks/useAgentRun.d.ts.map +0 -1
  260. package/dist/src/cli/chat/hooks/useAgentRun.js.map +0 -1
  261. package/dist/src/cli/chat/hooks/usePromptSubmission.d.ts.map +0 -1
  262. package/dist/src/cli/chat/hooks/usePromptSubmission.js.map +0 -1
  263. package/dist/src/cli/chat/state/storage.d.ts +0 -2
  264. package/dist/src/cli/chat/state/storage.d.ts.map +0 -1
  265. package/dist/src/cli/chat/state/storage.js +0 -2
  266. package/dist/src/cli/chat/state/storage.js.map +0 -1
  267. package/dist/src/core/chat/engine/sessions/storage.d.ts.map +0 -1
  268. package/dist/src/core/chat/engine/sessions/storage.js.map +0 -1
  269. package/dist/src/server/features/control-plane/services/ask.d.ts.map +0 -1
  270. package/dist/src/server/features/control-plane/services/ask.js +0 -66
  271. package/dist/src/server/features/control-plane/services/ask.js.map +0 -1
  272. package/dist/src/server/features/control-plane/services/chat-session-events.d.ts +0 -26
  273. package/dist/src/server/features/control-plane/services/chat-session-events.d.ts.map +0 -1
  274. package/dist/src/server/features/control-plane/services/chat-session-events.js +0 -61
  275. package/dist/src/server/features/control-plane/services/chat-session-events.js.map +0 -1
  276. package/dist/src/server/features/control-plane/services/chat-sessions.d.ts +0 -59
  277. package/dist/src/server/features/control-plane/services/chat-sessions.d.ts.map +0 -1
  278. package/dist/src/server/features/control-plane/services/chat-sessions.js +0 -651
  279. package/dist/src/server/features/control-plane/services/chat-sessions.js.map +0 -1
  280. package/dist/src/server/features/control-plane/services/control-plane-state.d.ts +0 -4
  281. package/dist/src/server/features/control-plane/services/control-plane-state.d.ts.map +0 -1
  282. package/dist/src/server/features/control-plane/services/control-plane-state.js +0 -56
  283. package/dist/src/server/features/control-plane/services/control-plane-state.js.map +0 -1
  284. package/dist/src/server/features/control-plane/services/heartbeat.d.ts +0 -9
  285. package/dist/src/server/features/control-plane/services/heartbeat.d.ts.map +0 -1
  286. package/dist/src/server/features/control-plane/services/heartbeat.js +0 -57
  287. package/dist/src/server/features/control-plane/services/heartbeat.js.map +0 -1
  288. package/dist/src/server/features/control-plane/services/layout-snapshots.d.ts +0 -6
  289. package/dist/src/server/features/control-plane/services/layout-snapshots.d.ts.map +0 -1
  290. package/dist/src/server/features/control-plane/services/layout-snapshots.js +0 -68
  291. package/dist/src/server/features/control-plane/services/layout-snapshots.js.map +0 -1
  292. package/dist/src/server/features/control-plane/services/memory.d.ts +0 -22
  293. package/dist/src/server/features/control-plane/services/memory.d.ts.map +0 -1
  294. package/dist/src/server/features/control-plane/services/memory.js +0 -36
  295. package/dist/src/server/features/control-plane/services/memory.js.map +0 -1
  296. package/dist/src/server/features/control-plane/services/workspace-diff.d.ts +0 -4
  297. package/dist/src/server/features/control-plane/services/workspace-diff.d.ts.map +0 -1
  298. package/dist/src/server/features/control-plane/services/workspace-diff.js +0 -258
  299. package/dist/src/server/features/control-plane/services/workspace-diff.js.map +0 -1
  300. package/dist/src/server/features/control-plane/services/workspace-files.d.ts +0 -27
  301. package/dist/src/server/features/control-plane/services/workspace-files.d.ts.map +0 -1
  302. package/dist/src/server/features/control-plane/services/workspace-files.js +0 -137
  303. package/dist/src/server/features/control-plane/services/workspace-files.js.map +0 -1
  304. /package/dist/src/cli/chat/hooks/{tui-agent-turn-lifecycle.js → controllers/run/tui-agent-turn-lifecycle.js} +0 -0
@@ -1,651 +0,0 @@
1
- import { EventEmitter } from 'node:events';
2
- import { existsSync, readFileSync } from 'node:fs';
3
- import { join } from 'node:path';
4
- import { createChatSession, readChatSession, readChatSessionCatalog, saveChatSessions } from '../../../../core/chat/engine/sessions/storage.js';
5
- import { DEFAULT_OPENAI_MODEL } from '../../../../core/config.js';
6
- import { credentialModeFromSource, resolveCompatibleActiveModel } from '../../../../core/llm/model-policy.js';
7
- import { inferProviderFromModel } from '../../../../core/llm/providers.js';
8
- import { parseUnifiedDiffFiles } from '../../../../core/review/diff-domain.js';
9
- import { hasProviderCredentialForModel, resolveProviderCredentialSourceForModel } from '../../../../core/runtime/api-keys.js';
10
- import { buildConversationMessages } from '../../../../core/chat/engine/sessions/conversation-lines.js';
11
- import { runConversationTurn } from '../../../../core/chat/engine/index.js';
12
- import { requestToolApproval } from '../../../../core/approvals/surface.js';
13
- import { createControlPlanePendingApprovalView, createControlPlaneSessionEventPublisher, } from './chat-session-events.js';
14
- export function createControlPlaneChatSession(args) {
15
- const existing = readChatSessionViews(args.sessionStoragePath);
16
- const nextNumber = existing.length + 1;
17
- const model = resolveControlPlaneSessionCreationModel(args);
18
- const credentialRuntime = {
19
- preferApiKey: args.preferApiKey,
20
- credentialStorePath: args.credentialStorePath,
21
- };
22
- const session = createChatSession({
23
- id: `session-${Date.now()}`,
24
- name: args.suggestedName?.trim() || `Session ${nextNumber}`,
25
- apiKeyPresent: args.apiKeyPresent ?? hasProviderCredentialForModel(model, credentialRuntime),
26
- model,
27
- workspaceId: args.workspaceId,
28
- });
29
- const currentSessions = readChatSessionCatalog(args.sessionStoragePath)
30
- .map((entry) => readChatSession(args.sessionStoragePath, entry.id, hasProviderCredentialForModel(model, credentialRuntime)))
31
- .filter((candidate) => Boolean(candidate));
32
- saveChatSessions(args.sessionStoragePath, [session, ...currentSessions]);
33
- return projectChatSessionDetail(session)[0];
34
- }
35
- function resolveControlPlaneSessionCreationModel(args) {
36
- const activeModel = firstNonEmpty(args.model, process.env.OPENAI_MODEL, process.env.ANTHROPIC_MODEL) ?? DEFAULT_OPENAI_MODEL;
37
- const provider = inferProviderFromModel(activeModel);
38
- const credentialMode = credentialModeFromSource(resolveProviderCredentialSourceForModel(activeModel, {
39
- preferApiKey: args.preferApiKey,
40
- credentialStorePath: args.credentialStorePath,
41
- }));
42
- return resolveCompatibleActiveModel({
43
- activeModel,
44
- provider,
45
- credentialMode,
46
- }).model;
47
- }
48
- function firstNonEmpty(...values) {
49
- return values.find((value) => typeof value === 'string' && value.trim().length > 0);
50
- }
51
- export function updateControlPlaneChatSessionSettings(args) {
52
- const currentSessions = readChatSessionCatalog(args.sessionStoragePath)
53
- .map((entry) => readChatSession(args.sessionStoragePath, entry.id, true))
54
- .filter((candidate) => Boolean(candidate));
55
- const nextSessions = currentSessions.map((session) => (session.id === args.sessionId ?
56
- {
57
- ...session,
58
- model: args.model ?? session.model,
59
- reasoningEffort: args.reasoningEffort === null ? undefined : args.reasoningEffort ?? session.reasoningEffort,
60
- driftEnabled: args.driftEnabled ?? session.driftEnabled,
61
- updatedAt: new Date().toISOString(),
62
- }
63
- : session));
64
- const updated = nextSessions.find((session) => session.id === args.sessionId);
65
- if (!updated) {
66
- throw new Error(`Chat session not found: ${args.sessionId}`);
67
- }
68
- saveChatSessions(args.sessionStoragePath, nextSessions);
69
- return projectChatSessionDetail(updated)[0];
70
- }
71
- const sessionEventBus = new EventEmitter();
72
- const pendingApprovals = new Map();
73
- const inFlightRuns = new Map();
74
- export async function submitChatPrompt(args) {
75
- if (inFlightRuns.has(args.sessionId)) {
76
- throw new Error('A run is already in progress for this session.');
77
- }
78
- if (process.env.HEDDLE_E2E_FAKE_AGENT === '1') {
79
- return runFakeE2eSessionPrompt(args);
80
- }
81
- const controller = new AbortController();
82
- inFlightRuns.set(args.sessionId, controller);
83
- const events = createControlPlaneSessionEventPublisher({
84
- eventBus: sessionEventBus,
85
- sessionId: args.sessionId,
86
- });
87
- try {
88
- const result = await runConversationTurn({
89
- workspaceRoot: args.workspaceRoot,
90
- stateRoot: args.stateRoot,
91
- sessionStoragePath: args.sessionStoragePath,
92
- traceDir: join(args.stateRoot, 'traces'),
93
- sessionId: args.sessionId,
94
- prompt: args.continuePrompt ?? args.prompt,
95
- apiKey: args.apiKey,
96
- preferApiKey: args.preferApiKey,
97
- systemContext: args.systemContext,
98
- memoryMaintenanceMode: args.memoryMaintenanceMode,
99
- abortSignal: controller.signal,
100
- leaseOwner: args.leaseOwner,
101
- host: {
102
- events: {
103
- onAgentLoopEvent: events.hostPort.events?.onAgentLoopEvent,
104
- },
105
- compaction: {
106
- onPreflightCompactionStatus: events.hostPort.compaction?.onPreflightCompactionStatus,
107
- onFinalCompactionStatus: events.hostPort.compaction?.onFinalCompactionStatus,
108
- },
109
- approvals: {
110
- requestToolApproval: async ({ call, tool }) => {
111
- const decision = await requestToolApproval({
112
- call,
113
- tool,
114
- createView: createControlPlanePendingApprovalView,
115
- storePending: ({ view, resolve }) => {
116
- pendingApprovals.set(args.sessionId, {
117
- approval: view,
118
- resolve,
119
- });
120
- },
121
- publish: (_view, callForEvent) => {
122
- events.publishApprovalRequested(callForEvent);
123
- },
124
- });
125
- pendingApprovals.delete(args.sessionId);
126
- return decision;
127
- },
128
- },
129
- },
130
- });
131
- return {
132
- ...result,
133
- session: projectChatSessionDetail(result.session)[0] ?? null,
134
- };
135
- }
136
- finally {
137
- pendingApprovals.delete(args.sessionId);
138
- inFlightRuns.delete(args.sessionId);
139
- }
140
- }
141
- export async function continueChatPrompt(args) {
142
- const session = readChatSession(args.sessionStoragePath, args.sessionId, true);
143
- if (!session) {
144
- throw new Error(`Chat session not found: ${args.sessionId}`);
145
- }
146
- if (!session.history.length || !session.lastContinuePrompt) {
147
- throw new Error('There is no interrupted or prior run to continue yet.');
148
- }
149
- return await submitChatPrompt({
150
- ...args,
151
- prompt: 'Continue from where you left off.',
152
- continuePrompt: session.lastContinuePrompt,
153
- });
154
- }
155
- async function runFakeE2eSessionPrompt(args) {
156
- const session = readChatSession(args.sessionStoragePath, args.sessionId, true);
157
- if (!session) {
158
- throw new Error(`Chat session not found: ${args.sessionId}`);
159
- }
160
- const timestamp = new Date().toISOString();
161
- const assistantText = `Mocked E2E agent response: ${args.prompt}`;
162
- const nextHistory = [
163
- ...session.history,
164
- { role: 'user', content: args.prompt },
165
- { role: 'assistant', content: assistantText },
166
- ];
167
- const nextTurn = {
168
- id: `e2e-turn-${Date.now()}`,
169
- prompt: args.prompt,
170
- outcome: 'done',
171
- summary: assistantText,
172
- steps: 1,
173
- traceFile: 'e2e-fake-trace.jsonl',
174
- events: ['Mocked E2E session run completed.'],
175
- };
176
- const updatedSession = {
177
- ...session,
178
- history: nextHistory,
179
- messages: buildConversationMessages(nextHistory),
180
- turns: [...session.turns, nextTurn].slice(-8),
181
- updatedAt: timestamp,
182
- lastContinuePrompt: args.prompt,
183
- lease: undefined,
184
- };
185
- saveChatSessions(args.sessionStoragePath, readChatSessionCatalog(args.sessionStoragePath)
186
- .map((entry) => readChatSession(args.sessionStoragePath, entry.id, true))
187
- .filter((candidate) => Boolean(candidate))
188
- .map((candidate) => candidate.id === session.id ? updatedSession : candidate));
189
- sessionEventBus.emit(args.sessionId, {
190
- sessionId: args.sessionId,
191
- timestamp,
192
- event: {
193
- type: 'trace',
194
- runId: `e2e-${args.sessionId}`,
195
- timestamp,
196
- event: {
197
- type: 'run.finished',
198
- outcome: 'done',
199
- summary: assistantText,
200
- step: 1,
201
- timestamp,
202
- },
203
- },
204
- });
205
- return {
206
- outcome: 'done',
207
- summary: assistantText,
208
- session: projectChatSessionDetail(updatedSession)[0] ?? null,
209
- };
210
- }
211
- export function subscribeToControlPlaneSessionEvents(sessionId, listener) {
212
- sessionEventBus.on(sessionId, listener);
213
- return () => {
214
- sessionEventBus.off(sessionId, listener);
215
- };
216
- }
217
- export function getPendingControlPlaneApproval(sessionId) {
218
- return pendingApprovals.get(sessionId)?.approval;
219
- }
220
- export function isControlPlaneSessionRunning(sessionId) {
221
- return inFlightRuns.has(sessionId);
222
- }
223
- export function cancelControlPlaneSessionRun(sessionId) {
224
- const controller = inFlightRuns.get(sessionId);
225
- if (!controller) {
226
- return false;
227
- }
228
- controller.abort();
229
- pendingApprovals.delete(sessionId);
230
- return true;
231
- }
232
- export function resolvePendingControlPlaneApproval(sessionId, decision) {
233
- const pending = pendingApprovals.get(sessionId);
234
- if (!pending) {
235
- return false;
236
- }
237
- pendingApprovals.delete(sessionId);
238
- pending.resolve(decision);
239
- return true;
240
- }
241
- export function readChatSessionViews(sessionStoragePath) {
242
- return readChatSessionCatalog(sessionStoragePath)
243
- .flatMap(projectChatSessionView)
244
- .sort((left, right) => (right.updatedAt ?? '').localeCompare(left.updatedAt ?? ''));
245
- }
246
- export function readChatSessionDetail(sessionStoragePath, id) {
247
- const session = readChatSession(sessionStoragePath, id, true);
248
- return session ? projectChatSessionDetail(session)[0] : undefined;
249
- }
250
- export function readChatTurnReview(sessionStoragePath, sessionId, turnId) {
251
- const session = readChatSessionDetail(sessionStoragePath, sessionId);
252
- const turn = session?.turns.find((candidate) => candidate.id === turnId);
253
- if (!turn) {
254
- return undefined;
255
- }
256
- return loadChatTurnReview(turn.traceFile);
257
- }
258
- export function resolveChatSessionFilePath(stateRoot, sessionId) {
259
- return join(stateRoot, 'chat-sessions', `${sessionId}.json`);
260
- }
261
- export function projectChatSessionView(raw) {
262
- if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
263
- return [];
264
- }
265
- const candidate = raw;
266
- const id = typeof candidate.id === 'string' ? candidate.id : undefined;
267
- const name = typeof candidate.name === 'string' ? candidate.name : undefined;
268
- if (!id || !name) {
269
- return [];
270
- }
271
- const turns = Array.isArray(candidate.turns) ? candidate.turns : [];
272
- const messages = Array.isArray(candidate.messages) ? candidate.messages : [];
273
- const lastTurn = readObject(turns.at(-1));
274
- const context = readObject(candidate.context);
275
- const archives = Array.isArray(candidate.archives) ? candidate.archives.map(readObject).filter(Boolean) : [];
276
- const rawCompactionStatus = readString(context?.compactionStatus);
277
- const compactionStatus = rawCompactionStatus === 'idle' || rawCompactionStatus === 'running' || rawCompactionStatus === 'failed' ?
278
- rawCompactionStatus
279
- : undefined;
280
- const contextView = context ?
281
- omitUndefined({
282
- estimatedHistoryTokens: readNumber(context.estimatedHistoryTokens),
283
- estimatedRequestTokens: readNumber(context.estimatedRequestTokens),
284
- lastRunInputTokens: readNumber(context.lastRunInputTokens),
285
- lastRunOutputTokens: readNumber(context.lastRunOutputTokens),
286
- lastRunTotalTokens: readNumber(context.lastRunTotalTokens),
287
- compactedMessages: readNumber(context.compactedMessages),
288
- compactedAt: readString(context.compactedAt),
289
- compactionStatus,
290
- compactionError: readString(context.compactionError),
291
- archiveCount: readNumber(context.archiveCount),
292
- currentSummaryPath: readString(context.currentSummaryPath),
293
- lastArchivePath: readString(context.lastArchivePath),
294
- })
295
- : undefined;
296
- const archiveViews = archives.flatMap((archive) => {
297
- const archiveObject = readObject(archive);
298
- if (!archiveObject) {
299
- return [];
300
- }
301
- const id = readString(archiveObject.id);
302
- const path = readString(archiveObject.path);
303
- const summaryPath = readString(archiveObject.summaryPath);
304
- const messageCount = readNumber(archiveObject.messageCount);
305
- const createdAt = readString(archiveObject.createdAt);
306
- if (!id || !path || !summaryPath || messageCount === undefined || !createdAt) {
307
- return [];
308
- }
309
- return [omitUndefined({
310
- id,
311
- path,
312
- summaryPath,
313
- shortDescription: readString(archiveObject.shortDescription),
314
- messageCount,
315
- createdAt,
316
- summaryModel: readString(archiveObject.summaryModel),
317
- })];
318
- });
319
- return [omitUndefined({
320
- id,
321
- name,
322
- workspaceId: readString(candidate.workspaceId),
323
- createdAt: readString(candidate.createdAt),
324
- updatedAt: readString(candidate.updatedAt),
325
- model: readString(candidate.model),
326
- reasoningEffort: readReasoningEffort(candidate.reasoningEffort),
327
- driftEnabled: typeof candidate.driftEnabled === 'boolean' ? candidate.driftEnabled : undefined,
328
- driftLevel: readLatestDriftLevel(turns),
329
- messageCount: messages.length,
330
- turnCount: turns.length,
331
- lastPrompt: readString(lastTurn?.prompt),
332
- lastOutcome: readString(lastTurn?.outcome),
333
- lastSummary: readString(lastTurn?.summary),
334
- context: contextView && Object.keys(contextView).length > 0 ? contextView : undefined,
335
- archives: archiveViews.length > 0 ? archiveViews : undefined,
336
- })];
337
- }
338
- function readReasoningEffort(value) {
339
- return value === 'low' || value === 'medium' || value === 'high' || value === 'ultrahigh' ? value : undefined;
340
- }
341
- function readLatestDriftLevel(turns) {
342
- for (let index = turns.length - 1; index >= 0; index--) {
343
- const turn = readObject(turns[index]);
344
- const traceFile = readString(turn?.traceFile);
345
- const driftLevel = traceFile ? readLatestDriftLevelFromTrace(traceFile) : undefined;
346
- if (driftLevel) {
347
- return driftLevel;
348
- }
349
- }
350
- return undefined;
351
- }
352
- function omitUndefined(value) {
353
- return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined));
354
- }
355
- function readLatestDriftLevelFromTrace(traceFile) {
356
- if (!traceFile || !existsSync(traceFile)) {
357
- return undefined;
358
- }
359
- try {
360
- const parsed = JSON.parse(readFileSync(traceFile, 'utf8'));
361
- if (!Array.isArray(parsed)) {
362
- return undefined;
363
- }
364
- for (let index = parsed.length - 1; index >= 0; index--) {
365
- const event = readObject(parsed[index]);
366
- if (event?.type !== 'cyberloop.annotation') {
367
- continue;
368
- }
369
- const driftLevel = readString(event.driftLevel);
370
- if (driftLevel === 'unknown' || driftLevel === 'low' || driftLevel === 'medium' || driftLevel === 'high') {
371
- return driftLevel;
372
- }
373
- }
374
- }
375
- catch {
376
- return undefined;
377
- }
378
- return undefined;
379
- }
380
- export function projectChatSessionDetail(raw) {
381
- const base = projectChatSessionView(raw)[0];
382
- if (!base || !raw || typeof raw !== 'object' || Array.isArray(raw)) {
383
- return [];
384
- }
385
- const candidate = raw;
386
- const messages = Array.isArray(candidate.messages) ? candidate.messages.flatMap(projectChatSessionMessage) : [];
387
- const turns = Array.isArray(candidate.turns) ? candidate.turns.flatMap(projectChatTurnView) : [];
388
- return [{
389
- ...base,
390
- messages,
391
- turns,
392
- lastContinuePrompt: readString(candidate.lastContinuePrompt),
393
- }];
394
- }
395
- function projectChatSessionMessage(raw) {
396
- if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
397
- return [];
398
- }
399
- const candidate = raw;
400
- const id = readString(candidate.id);
401
- const role = candidate.role === 'user' || candidate.role === 'assistant' ? candidate.role : undefined;
402
- const text = readString(candidate.text);
403
- if (!id || !role || !text) {
404
- return [];
405
- }
406
- return [{
407
- id,
408
- role,
409
- text,
410
- isStreaming: readBoolean(candidate.isStreaming),
411
- isPending: readBoolean(candidate.isPending),
412
- }];
413
- }
414
- function projectChatTurnView(raw) {
415
- if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
416
- return [];
417
- }
418
- const candidate = raw;
419
- const id = readString(candidate.id);
420
- const prompt = readString(candidate.prompt);
421
- const outcome = readString(candidate.outcome);
422
- const summary = readString(candidate.summary);
423
- const traceFile = readString(candidate.traceFile);
424
- const steps = readNumber(candidate.steps);
425
- const events = Array.isArray(candidate.events) ? candidate.events.filter((event) => typeof event === 'string') : [];
426
- if (!id || !prompt || !outcome || !summary || !traceFile || steps === undefined) {
427
- return [];
428
- }
429
- return [{
430
- id,
431
- prompt,
432
- outcome,
433
- summary,
434
- steps,
435
- traceFile,
436
- events,
437
- }];
438
- }
439
- function loadChatTurnReview(traceFile) {
440
- if (!traceFile || !existsSync(traceFile)) {
441
- return undefined;
442
- }
443
- try {
444
- const parsed = JSON.parse(readFileSync(traceFile, 'utf8'));
445
- if (!Array.isArray(parsed)) {
446
- return undefined;
447
- }
448
- const reviewCommands = [];
449
- const verificationCommands = [];
450
- const mutationCommands = [];
451
- const approvals = [];
452
- const files = new Map();
453
- let diffExcerpt;
454
- let finalSummary;
455
- for (const entry of parsed) {
456
- const event = readObject(entry);
457
- const type = readString(event?.type);
458
- if (!event || !type) {
459
- continue;
460
- }
461
- if (type === 'tool.result') {
462
- const tool = readString(event.tool) ?? 'unknown';
463
- const result = readObject(event.result);
464
- if (tool === 'edit_file' && readBoolean(result?.ok) === true) {
465
- const output = readObject(result?.output);
466
- const file = projectEditFileReview(output);
467
- if (file) {
468
- addChangedFile(files, file);
469
- }
470
- }
471
- const output = readObject(result?.output);
472
- const evidence = output ? projectCommandEvidence(tool, output) : undefined;
473
- if (!evidence) {
474
- continue;
475
- }
476
- if (isReviewCommand(evidence.command)) {
477
- reviewCommands.push(evidence);
478
- if (!diffExcerpt && /^git diff(?:\s|$)/.test(evidence.command) && evidence.stdout) {
479
- diffExcerpt = evidence.stdout;
480
- }
481
- if (/^git diff(?:\s|$)/.test(evidence.command) && evidence.stdout) {
482
- for (const file of parseGitDiffFiles(evidence.stdout)) {
483
- addChangedFile(files, file);
484
- }
485
- }
486
- continue;
487
- }
488
- if (isVerificationCommand(evidence.command)) {
489
- verificationCommands.push(evidence);
490
- continue;
491
- }
492
- if (tool === 'run_shell_mutate') {
493
- mutationCommands.push(evidence);
494
- }
495
- continue;
496
- }
497
- if (type === 'tool.call') {
498
- const call = readObject(event.call);
499
- const tool = readString(call?.tool);
500
- if (tool !== 'edit_file') {
501
- continue;
502
- }
503
- const input = readObject(call?.input);
504
- const path = readString(input?.path);
505
- mutationCommands.push({
506
- tool,
507
- command: path ? `edit_file ${path}` : 'edit_file',
508
- });
509
- continue;
510
- }
511
- if (type === 'tool.approval_resolved') {
512
- const call = readObject(event.call);
513
- const tool = readString(call?.tool);
514
- if (!tool) {
515
- continue;
516
- }
517
- const input = readObject(call?.input);
518
- approvals.push({
519
- tool,
520
- command: readString(input?.command) ?? readString(input?.path),
521
- approved: readBoolean(event.approved) ?? false,
522
- reason: readString(event.reason),
523
- timestamp: readString(event.timestamp),
524
- });
525
- continue;
526
- }
527
- if (type === 'run.finished') {
528
- finalSummary = readString(event.summary) ?? finalSummary;
529
- }
530
- }
531
- return {
532
- traceFile,
533
- diffExcerpt,
534
- finalSummary,
535
- files: [...files.values()],
536
- reviewCommands: dedupeEvidence(reviewCommands),
537
- verificationCommands: dedupeEvidence(verificationCommands),
538
- mutationCommands: dedupeEvidence(mutationCommands),
539
- approvals,
540
- };
541
- }
542
- catch {
543
- return undefined;
544
- }
545
- }
546
- function projectCommandEvidence(tool, output) {
547
- const command = readString(output.command);
548
- if (!command) {
549
- return undefined;
550
- }
551
- return {
552
- tool,
553
- command,
554
- exitCode: readNumber(output.exitCode),
555
- stdout: normalizeCommandText(readString(output.stdout)),
556
- stderr: normalizeCommandText(readString(output.stderr)),
557
- };
558
- }
559
- function dedupeEvidence(evidence) {
560
- const seen = new Set();
561
- return evidence.filter((entry) => {
562
- const key = `${entry.tool}:${entry.command}`;
563
- if (seen.has(key)) {
564
- return false;
565
- }
566
- seen.add(key);
567
- return true;
568
- });
569
- }
570
- function isReviewCommand(command) {
571
- return /^git (?:status\b|diff\b|show\b|branch\b|remote\b)/.test(command);
572
- }
573
- function isVerificationCommand(command) {
574
- return /^(?:yarn|npm|pnpm|bun|vitest|jest|tsx|tsc|go test|cargo test|pytest|ruff|eslint)\b/.test(command);
575
- }
576
- function projectEditFileReview(output) {
577
- if (!output) {
578
- return undefined;
579
- }
580
- const path = readString(output.path);
581
- const diff = readObject(output.diff);
582
- const patch = normalizeCommandText(readString(diff?.diff));
583
- if (!path) {
584
- return undefined;
585
- }
586
- return {
587
- path,
588
- status: statusFromEditAction(readString(output.action)),
589
- source: 'edit_file',
590
- patch,
591
- diff: patch ? parseUnifiedDiffFiles(patch).find((file) => file.path === path || file.oldPath === path) : undefined,
592
- truncated: readBoolean(diff?.truncated),
593
- };
594
- }
595
- function statusFromEditAction(action) {
596
- switch (action) {
597
- case 'created':
598
- return 'added';
599
- case 'overwritten':
600
- case 'replaced':
601
- return 'modified';
602
- default:
603
- return 'unknown';
604
- }
605
- }
606
- function parseGitDiffFiles(diff) {
607
- return parseUnifiedDiffFiles(diff).map((file) => ({
608
- path: file.path,
609
- status: file.status === 'copied' ? 'modified' : file.status,
610
- source: 'git_diff',
611
- patch: normalizeCommandText(file.patch),
612
- diff: file,
613
- truncated: file.binary === true,
614
- }));
615
- }
616
- function addChangedFile(files, file) {
617
- const existing = files.get(file.path);
618
- if (!existing) {
619
- files.set(file.path, file);
620
- return;
621
- }
622
- if (existing.source === 'edit_file') {
623
- return;
624
- }
625
- if (file.source === 'edit_file' || (!existing.patch && file.patch)) {
626
- files.set(file.path, file);
627
- }
628
- }
629
- function normalizeCommandText(value) {
630
- if (!value) {
631
- return undefined;
632
- }
633
- const trimmed = value.trim();
634
- if (!trimmed) {
635
- return undefined;
636
- }
637
- return trimmed.length > 2400 ? `${trimmed.slice(0, 2399)}…` : trimmed;
638
- }
639
- function readObject(value) {
640
- return value && typeof value === 'object' && !Array.isArray(value) ? value : undefined;
641
- }
642
- function readString(value) {
643
- return typeof value === 'string' ? value : undefined;
644
- }
645
- function readBoolean(value) {
646
- return typeof value === 'boolean' ? value : undefined;
647
- }
648
- function readNumber(value) {
649
- return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
650
- }
651
- //# sourceMappingURL=chat-sessions.js.map