@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
@@ -0,0 +1,196 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { parseUnifiedDiffFiles } from '../../../../core/review/diff-domain.js';
3
+ import { normalizeCommandText, readBoolean, readNumber, readObject, readString, } from '../helpers/read-values.js';
4
+ export class ControlPlaneChatTurnReviewPresenter {
5
+ static load(traceFile) {
6
+ if (!traceFile || !existsSync(traceFile)) {
7
+ return undefined;
8
+ }
9
+ try {
10
+ const parsed = JSON.parse(readFileSync(traceFile, 'utf8'));
11
+ if (!Array.isArray(parsed)) {
12
+ return undefined;
13
+ }
14
+ const reviewCommands = [];
15
+ const verificationCommands = [];
16
+ const mutationCommands = [];
17
+ const approvals = [];
18
+ const files = new Map();
19
+ let diffExcerpt;
20
+ let finalSummary;
21
+ for (const entry of parsed) {
22
+ const event = readObject(entry);
23
+ const type = readString(event?.type);
24
+ if (!event || !type) {
25
+ continue;
26
+ }
27
+ if (type === 'tool.result') {
28
+ const tool = readString(event.tool) ?? 'unknown';
29
+ const result = readObject(event.result);
30
+ if (tool === 'edit_file' && readBoolean(result?.ok) === true) {
31
+ const output = readObject(result?.output);
32
+ const file = ControlPlaneChatTurnReviewPresenter.projectEditFileReview(output);
33
+ if (file) {
34
+ ControlPlaneChatTurnReviewPresenter.addChangedFile(files, file);
35
+ }
36
+ }
37
+ const output = readObject(result?.output);
38
+ const evidence = output ? ControlPlaneChatTurnReviewPresenter.projectCommandEvidence(tool, output) : undefined;
39
+ if (!evidence) {
40
+ continue;
41
+ }
42
+ if (ControlPlaneChatTurnReviewPresenter.isReviewCommand(evidence.command)) {
43
+ reviewCommands.push(evidence);
44
+ if (!diffExcerpt && /^git diff(?:\s|$)/.test(evidence.command) && evidence.stdout) {
45
+ diffExcerpt = evidence.stdout;
46
+ }
47
+ if (/^git diff(?:\s|$)/.test(evidence.command) && evidence.stdout) {
48
+ for (const file of ControlPlaneChatTurnReviewPresenter.parseGitDiffFiles(evidence.stdout)) {
49
+ ControlPlaneChatTurnReviewPresenter.addChangedFile(files, file);
50
+ }
51
+ }
52
+ continue;
53
+ }
54
+ if (ControlPlaneChatTurnReviewPresenter.isVerificationCommand(evidence.command)) {
55
+ verificationCommands.push(evidence);
56
+ continue;
57
+ }
58
+ if (tool === 'run_shell_mutate') {
59
+ mutationCommands.push(evidence);
60
+ }
61
+ continue;
62
+ }
63
+ if (type === 'tool.call') {
64
+ const call = readObject(event.call);
65
+ const tool = readString(call?.tool);
66
+ if (tool !== 'edit_file') {
67
+ continue;
68
+ }
69
+ const input = readObject(call?.input);
70
+ const path = readString(input?.path);
71
+ mutationCommands.push({
72
+ tool,
73
+ command: path ? `edit_file ${path}` : 'edit_file',
74
+ });
75
+ continue;
76
+ }
77
+ if (type === 'tool.approval_resolved') {
78
+ const call = readObject(event.call);
79
+ const tool = readString(call?.tool);
80
+ if (!tool) {
81
+ continue;
82
+ }
83
+ const input = readObject(call?.input);
84
+ approvals.push({
85
+ tool,
86
+ command: readString(input?.command) ?? readString(input?.path),
87
+ approved: readBoolean(event.approved) ?? false,
88
+ reason: readString(event.reason),
89
+ timestamp: readString(event.timestamp),
90
+ });
91
+ continue;
92
+ }
93
+ if (type === 'run.finished') {
94
+ finalSummary = readString(event.summary) ?? finalSummary;
95
+ }
96
+ }
97
+ return {
98
+ traceFile,
99
+ diffExcerpt,
100
+ finalSummary,
101
+ files: [...files.values()],
102
+ reviewCommands: ControlPlaneChatTurnReviewPresenter.dedupeEvidence(reviewCommands),
103
+ verificationCommands: ControlPlaneChatTurnReviewPresenter.dedupeEvidence(verificationCommands),
104
+ mutationCommands: ControlPlaneChatTurnReviewPresenter.dedupeEvidence(mutationCommands),
105
+ approvals,
106
+ };
107
+ }
108
+ catch {
109
+ return undefined;
110
+ }
111
+ }
112
+ static projectCommandEvidence(tool, output) {
113
+ const command = readString(output.command);
114
+ if (!command) {
115
+ return undefined;
116
+ }
117
+ return {
118
+ tool,
119
+ command,
120
+ exitCode: readNumber(output.exitCode),
121
+ stdout: normalizeCommandText(readString(output.stdout)),
122
+ stderr: normalizeCommandText(readString(output.stderr)),
123
+ };
124
+ }
125
+ static dedupeEvidence(evidence) {
126
+ const seen = new Set();
127
+ return evidence.filter((entry) => {
128
+ const key = `${entry.tool}:${entry.command}`;
129
+ if (seen.has(key)) {
130
+ return false;
131
+ }
132
+ seen.add(key);
133
+ return true;
134
+ });
135
+ }
136
+ static isReviewCommand(command) {
137
+ return /^git (?:status\b|diff\b|show\b|branch\b|remote\b)/.test(command);
138
+ }
139
+ static isVerificationCommand(command) {
140
+ return /^(?:yarn|npm|pnpm|bun|vitest|jest|tsx|tsc|go test|cargo test|pytest|ruff|eslint)\b/.test(command);
141
+ }
142
+ static projectEditFileReview(output) {
143
+ if (!output) {
144
+ return undefined;
145
+ }
146
+ const path = readString(output.path);
147
+ const diff = readObject(output.diff);
148
+ const patch = normalizeCommandText(readString(diff?.diff));
149
+ if (!path) {
150
+ return undefined;
151
+ }
152
+ return {
153
+ path,
154
+ status: ControlPlaneChatTurnReviewPresenter.statusFromEditAction(readString(output.action)),
155
+ source: 'edit_file',
156
+ patch,
157
+ diff: patch ? parseUnifiedDiffFiles(patch).find((file) => file.path === path || file.oldPath === path) : undefined,
158
+ truncated: readBoolean(diff?.truncated),
159
+ };
160
+ }
161
+ static statusFromEditAction(action) {
162
+ switch (action) {
163
+ case 'created':
164
+ return 'added';
165
+ case 'overwritten':
166
+ case 'replaced':
167
+ return 'modified';
168
+ default:
169
+ return 'unknown';
170
+ }
171
+ }
172
+ static parseGitDiffFiles(diff) {
173
+ return parseUnifiedDiffFiles(diff).map((file) => ({
174
+ path: file.path,
175
+ status: file.status === 'copied' ? 'modified' : file.status,
176
+ source: 'git_diff',
177
+ patch: normalizeCommandText(file.patch),
178
+ diff: file,
179
+ truncated: file.binary === true,
180
+ }));
181
+ }
182
+ static addChangedFile(files, file) {
183
+ const existing = files.get(file.path);
184
+ if (!existing) {
185
+ files.set(file.path, file);
186
+ return;
187
+ }
188
+ if (existing.source === 'edit_file') {
189
+ return;
190
+ }
191
+ if (file.source === 'edit_file' || (!existing.patch && file.patch)) {
192
+ files.set(file.path, file);
193
+ }
194
+ }
195
+ }
196
+ //# sourceMappingURL=chat-turn-review-presenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-turn-review-presenter.js","sourceRoot":"","sources":["../../../../../../src/server/features/control-plane/controllers/chat-turn-review-presenter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { HeddleServerContext } from '../../../types.js';
2
+ import type { ControlPlaneState } from '../types.js';
3
+ export declare class ControlPlaneStateController {
4
+ static load(context: HeddleServerContext): Promise<ControlPlaneState>;
5
+ private static readKnownWorkspaces;
6
+ }
7
+ //# sourceMappingURL=control-plane-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-plane-state.d.ts","sourceRoot":"","sources":["../../../../../../src/server/features/control-plane/controllers/control-plane-state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAOrD,qBAAa,2BAA2B;WACzB,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAqC3E,OAAO,CAAC,MAAM,CAAC,mBAAmB;CAoBnC"}
@@ -0,0 +1,64 @@
1
+ import { resolve } from 'node:path';
2
+ import { readDaemonRegistry, registerKnownWorkspaces, resolveDaemonRegistryPath } from '../../../../core/runtime/daemon-registry.js';
3
+ import { resolveProviderCredentialSourceForModel } from '../../../../core/runtime/api-keys.js';
4
+ import { controlPlaneChatSessionsController } from './chat-sessions-controller.js';
5
+ import { ControlPlaneHeartbeatController } from './heartbeat.js';
6
+ import { ControlPlaneMemoryController } from './memory.js';
7
+ export class ControlPlaneStateController {
8
+ static async load(context) {
9
+ const workspaceRoot = context.activeWorkspace.anchorRoot;
10
+ const stateRoot = context.activeWorkspace.stateRoot;
11
+ const [tasks, runs, memory] = await Promise.all([
12
+ ControlPlaneHeartbeatController.listTasks(stateRoot),
13
+ ControlPlaneHeartbeatController.listRuns(stateRoot, { limit: 20 }),
14
+ ControlPlaneMemoryController.readStatus(stateRoot),
15
+ ]);
16
+ return {
17
+ workspaceRoot,
18
+ stateRoot,
19
+ auth: {
20
+ preferApiKey: context.preferApiKey,
21
+ openai: resolveProviderCredentialSourceForModel('gpt-5.4', { preferApiKey: context.preferApiKey }),
22
+ anthropic: resolveProviderCredentialSourceForModel('claude-sonnet-4-6', { preferApiKey: context.preferApiKey }),
23
+ },
24
+ activeWorkspaceId: context.activeWorkspaceId,
25
+ workspace: context.activeWorkspace,
26
+ workspaces: context.workspaces,
27
+ knownWorkspaces: ControlPlaneStateController.readKnownWorkspaces(context),
28
+ runtimeHost: context.runtimeHost,
29
+ sessions: controlPlaneChatSessionsController.readViews({
30
+ workspaceRoot,
31
+ stateRoot,
32
+ sessionStoragePath: resolve(stateRoot, 'chat-sessions.catalog.json'),
33
+ preferApiKey: context.preferApiKey,
34
+ workspaceId: context.activeWorkspace.id,
35
+ }),
36
+ heartbeat: {
37
+ tasks,
38
+ runs,
39
+ },
40
+ memory,
41
+ };
42
+ }
43
+ static readKnownWorkspaces(context) {
44
+ const registryPath = context.runtimeHost?.registryPath ?? resolveDaemonRegistryPath();
45
+ registerKnownWorkspaces({
46
+ registryPath,
47
+ workspaces: context.workspaces,
48
+ });
49
+ const current = new Set(context.workspaces.map((workspace) => resolve(workspace.stateRoot)));
50
+ const known = new Map();
51
+ for (const record of readDaemonRegistry(registryPath).workspaces) {
52
+ const stateRoot = resolve(record.workspace.stateRoot);
53
+ if (current.has(stateRoot)) {
54
+ continue;
55
+ }
56
+ const existing = known.get(stateRoot);
57
+ if (!existing || (record.workspace.updatedAt ?? '') > (existing.updatedAt ?? '')) {
58
+ known.set(stateRoot, record.workspace);
59
+ }
60
+ }
61
+ return Array.from(known.values()).sort((left, right) => (right.updatedAt ?? '').localeCompare(left.updatedAt ?? ''));
62
+ }
63
+ }
64
+ //# sourceMappingURL=control-plane-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-plane-state.js","sourceRoot":"","sources":["../../../../../../src/server/features/control-plane/controllers/control-plane-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare class ControlPlaneHeartbeatController {
2
+ static createStore(stateRoot: string): import("../../../../index.js").HeartbeatTaskStore;
3
+ static listTasks(stateRoot: string): Promise<import("../../../../index.js").HeartbeatTaskView[]>;
4
+ static listRuns(stateRoot: string, options?: {
5
+ taskId?: string;
6
+ limit?: number;
7
+ }): Promise<import("../../../../index.js").HeartbeatRunView[]>;
8
+ static setTaskEnabled(stateRoot: string, taskId: string, enabled: boolean): Promise<import("../../../../index.js").HeartbeatTaskView>;
9
+ static triggerTaskRun(stateRoot: string, taskId: string): Promise<import("../../../../index.js").HeartbeatTaskView>;
10
+ private static loadTaskById;
11
+ }
12
+ //# sourceMappingURL=heartbeat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../../../../../src/server/features/control-plane/controllers/heartbeat.ts"],"names":[],"mappings":"AASA,qBAAa,+BAA+B;IAC1C,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM;WAIvB,SAAS,CAAC,SAAS,EAAE,MAAM;WAI3B,QAAQ,CACnB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO;WAKtC,cAAc,CACzB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO;WAoBL,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;mBAuBxC,YAAY;CAWlC"}
@@ -0,0 +1,59 @@
1
+ import { resolve } from 'node:path';
2
+ import { createFileHeartbeatTaskStore, listHeartbeatRunViews, listHeartbeatTaskViews, projectHeartbeatTaskView, } from '../../../../index.js';
3
+ export class ControlPlaneHeartbeatController {
4
+ static createStore(stateRoot) {
5
+ return createFileHeartbeatTaskStore({ dir: resolve(stateRoot, 'heartbeat') });
6
+ }
7
+ static async listTasks(stateRoot) {
8
+ return await listHeartbeatTaskViews(ControlPlaneHeartbeatController.createStore(stateRoot));
9
+ }
10
+ static async listRuns(stateRoot, options = {}) {
11
+ return await listHeartbeatRunViews(ControlPlaneHeartbeatController.createStore(stateRoot), options);
12
+ }
13
+ static async setTaskEnabled(stateRoot, taskId, enabled) {
14
+ const store = ControlPlaneHeartbeatController.createStore(stateRoot);
15
+ const task = await ControlPlaneHeartbeatController.loadTaskById(store, taskId);
16
+ const now = new Date();
17
+ const status = enabled ? (task.status ?? 'waiting') : (task.status === 'running' ? 'running' : 'idle');
18
+ const nextTask = {
19
+ ...task,
20
+ enabled,
21
+ status,
22
+ nextRunAt: enabled ?
23
+ task.nextRunAt ?? new Date(now.getTime() - 1_000).toISOString()
24
+ : undefined,
25
+ updatedAt: now.toISOString(),
26
+ };
27
+ await store.saveTask(nextTask);
28
+ return projectHeartbeatTaskView(nextTask);
29
+ }
30
+ static async triggerTaskRun(stateRoot, taskId) {
31
+ const store = ControlPlaneHeartbeatController.createStore(stateRoot);
32
+ const task = await ControlPlaneHeartbeatController.loadTaskById(store, taskId);
33
+ if (!task.enabled) {
34
+ throw new Error(`Heartbeat task ${taskId} is disabled. Enable it before triggering a run.`);
35
+ }
36
+ const now = new Date();
37
+ const status = task.status === 'running' ? 'running' : 'waiting';
38
+ const nextTask = {
39
+ ...task,
40
+ status,
41
+ lastProgress: task.status === 'running' ?
42
+ task.lastProgress
43
+ : 'Task manually triggered from control plane. Waiting for the next heartbeat worker poll.',
44
+ nextRunAt: new Date(now.getTime() - 1_000).toISOString(),
45
+ updatedAt: now.toISOString(),
46
+ };
47
+ await store.saveTask(nextTask);
48
+ return projectHeartbeatTaskView(nextTask);
49
+ }
50
+ static async loadTaskById(store, taskId) {
51
+ const tasks = await store.listTasks();
52
+ const task = tasks.find((candidate) => candidate.id === taskId);
53
+ if (!task) {
54
+ throw new Error(`Heartbeat task not found: ${taskId}`);
55
+ }
56
+ return task;
57
+ }
58
+ }
59
+ //# sourceMappingURL=heartbeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../../../../../src/server/features/control-plane/controllers/heartbeat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,4BAA4B,EAC5B,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,GAEzB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,OAAO,+BAA+B;IAC1C,MAAM,CAAC,WAAW,CAAC,SAAiB;QAClC,OAAO,4BAA4B,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,SAAiB;QACtC,OAAO,MAAM,sBAAsB,CAAC,+BAA+B,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,QAAQ,CACnB,SAAiB,EACjB,UAA+C,EAAE;QAEjD,OAAO,MAAM,qBAAqB,CAAC,+BAA+B,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;IACtG,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,cAAc,CACzB,SAAiB,EACjB,MAAc,EACd,OAAgB;QAEhB,MAAM,KAAK,GAAG,+BAA+B,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,MAAM,+BAA+B,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/E,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACvG,MAAM,QAAQ,GAAkB;YAC9B,GAAG,IAAI;YACP,OAAO;YACP,MAAM;YACN,SAAS,EACP,OAAO,CAAC,CAAC;gBACP,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE;gBACjE,CAAC,CAAC,SAAS;YACb,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;SAC7B,CAAC;QACF,MAAM,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,SAAiB,EAAE,MAAc;QAC3D,MAAM,KAAK,GAAG,+BAA+B,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,MAAM,+BAA+B,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/E,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,kDAAkD,CAAC,CAAC;QAC9F,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACjE,MAAM,QAAQ,GAAkB;YAC9B,GAAG,IAAI;YACP,MAAM;YACN,YAAY,EACV,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;gBACzB,IAAI,CAAC,YAAY;gBACnB,CAAC,CAAC,yFAAyF;YAC7F,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE;YACxD,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;SAC7B,CAAC;QACF,MAAM,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,YAAY,CAC/B,KAAqE,EACrE,MAAc;QAEd,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ export type SavedLayoutSnapshot = {
2
+ jsonPath: string;
3
+ screenshotPath?: string;
4
+ };
5
+ export declare class ControlPlaneLayoutSnapshotsController {
6
+ static save(stateRoot: string, snapshot: unknown): Promise<SavedLayoutSnapshot>;
7
+ private static persistScreenshot;
8
+ private static deriveSnapshotLabel;
9
+ private static sanitizeFilenamePart;
10
+ private static cloneJsonRecord;
11
+ private static isRecord;
12
+ }
13
+ //# sourceMappingURL=layout-snapshots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-snapshots.d.ts","sourceRoot":"","sources":["../../../../../../src/server/features/control-plane/controllers/layout-snapshots.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAOF,qBAAa,qCAAqC;WACnC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC;mBAqBhE,iBAAiB;IA2BtC,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAWlC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IASnC,OAAO,CAAC,MAAM,CAAC,eAAe;IAI9B,OAAO,CAAC,MAAM,CAAC,QAAQ;CAGxB"}
@@ -0,0 +1,70 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ const SNAPSHOT_DIR = 'debug/dom-snapshots';
4
+ const DATA_URL_PATTERN = /^data:image\/png;base64,([A-Za-z0-9+/=]+)$/;
5
+ export class ControlPlaneLayoutSnapshotsController {
6
+ static async save(stateRoot, snapshot) {
7
+ if (!ControlPlaneLayoutSnapshotsController.isRecord(snapshot)) {
8
+ throw new Error('Layout snapshot payload must be an object.');
9
+ }
10
+ const outputDir = join(stateRoot, SNAPSHOT_DIR);
11
+ await mkdir(outputDir, { recursive: true });
12
+ const capturedAt = typeof snapshot.capturedAt === 'string' ? snapshot.capturedAt : new Date().toISOString();
13
+ const timestamp = ControlPlaneLayoutSnapshotsController.sanitizeFilenamePart(capturedAt.replaceAll(':', '-'));
14
+ const label = ControlPlaneLayoutSnapshotsController.deriveSnapshotLabel(snapshot);
15
+ const basename = `${timestamp}-${label}`;
16
+ const jsonPath = join(outputDir, `${basename}.json`);
17
+ const persistedSnapshot = ControlPlaneLayoutSnapshotsController.cloneJsonRecord(snapshot);
18
+ const screenshotPath = await ControlPlaneLayoutSnapshotsController.persistScreenshot(outputDir, basename, persistedSnapshot);
19
+ await writeFile(jsonPath, `${JSON.stringify(persistedSnapshot, null, 2)}\n`, 'utf8');
20
+ return screenshotPath ? { jsonPath, screenshotPath } : { jsonPath };
21
+ }
22
+ static async persistScreenshot(outputDir, basename, snapshot) {
23
+ const screenshot = snapshot.screenshot;
24
+ if (!ControlPlaneLayoutSnapshotsController.isRecord(screenshot) || screenshot.status !== 'captured' || typeof screenshot.dataUrl !== 'string') {
25
+ return undefined;
26
+ }
27
+ const match = DATA_URL_PATTERN.exec(screenshot.dataUrl);
28
+ if (!match?.[1]) {
29
+ snapshot.screenshot = {
30
+ ...screenshot,
31
+ status: 'failed',
32
+ reason: 'Screenshot data URL was not a PNG image.',
33
+ dataUrl: undefined,
34
+ };
35
+ return undefined;
36
+ }
37
+ const screenshotPath = join(outputDir, `${basename}.png`);
38
+ await writeFile(screenshotPath, Buffer.from(match[1], 'base64'));
39
+ snapshot.screenshot = {
40
+ ...screenshot,
41
+ path: screenshotPath,
42
+ dataUrl: undefined,
43
+ };
44
+ return screenshotPath;
45
+ }
46
+ static deriveSnapshotLabel(snapshot) {
47
+ const appState = ControlPlaneLayoutSnapshotsController.isRecord(snapshot.appState) ? snapshot.appState : {};
48
+ const parts = [
49
+ typeof appState.activeTab === 'string' ? appState.activeTab : 'control-plane',
50
+ typeof appState.selectedSessionId === 'string' ? appState.selectedSessionId : undefined,
51
+ ControlPlaneLayoutSnapshotsController.isRecord(appState.pendingApproval) && typeof appState.pendingApproval.tool === 'string' ? `approval-${appState.pendingApproval.tool}` : undefined,
52
+ ].filter((part) => Boolean(part));
53
+ return ControlPlaneLayoutSnapshotsController.sanitizeFilenamePart(parts.join('-')) || 'snapshot';
54
+ }
55
+ static sanitizeFilenamePart(value) {
56
+ return value
57
+ .toLowerCase()
58
+ .replace(/[^a-z0-9._-]+/g, '-')
59
+ .replace(/-+/g, '-')
60
+ .replace(/^-|-$/g, '')
61
+ .slice(0, 120);
62
+ }
63
+ static cloneJsonRecord(value) {
64
+ return JSON.parse(JSON.stringify(value));
65
+ }
66
+ static isRecord(value) {
67
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
68
+ }
69
+ }
70
+ //# sourceMappingURL=layout-snapshots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-snapshots.js","sourceRoot":"","sources":["../../../../../../src/server/features/control-plane/controllers/layout-snapshots.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export declare class ControlPlaneMemoryController {
2
+ static readStatus(stateRoot: string): Promise<import("../../../../core/memory/visibility.js").MemoryStatusView>;
3
+ static listNotes(stateRoot: string, path?: string): Promise<{
4
+ memoryRoot: string;
5
+ notes: string[];
6
+ }>;
7
+ static readNote(stateRoot: string, path: string, options?: {
8
+ offset?: number;
9
+ maxLines?: number;
10
+ }): Promise<{
11
+ memoryRoot: string;
12
+ path: string;
13
+ content: string;
14
+ }>;
15
+ static searchNotes(stateRoot: string, query: string, options?: {
16
+ path?: string;
17
+ maxResults?: number;
18
+ }): Promise<{
19
+ memoryRoot: string;
20
+ query: string;
21
+ matches: string;
22
+ }>;
23
+ private static memoryRoot;
24
+ }
25
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../../../../src/server/features/control-plane/controllers/memory.ts"],"names":[],"mappings":"AAQA,qBAAa,4BAA4B;WAC1B,UAAU,CAAC,SAAS,EAAE,MAAM;WAI5B,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;;;;WAQ1C,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;WAc1F,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;IAc3G,OAAO,CAAC,MAAM,CAAC,UAAU;CAG1B"}
@@ -0,0 +1,44 @@
1
+ import { resolve } from 'node:path';
2
+ import { listMemoryNotePaths, loadMemoryStatus, readMemoryNote, searchMemoryNotes, } from '../../../../core/memory/visibility.js';
3
+ export class ControlPlaneMemoryController {
4
+ static async readStatus(stateRoot) {
5
+ return await loadMemoryStatus({ memoryRoot: ControlPlaneMemoryController.memoryRoot(stateRoot) });
6
+ }
7
+ static async listNotes(stateRoot, path) {
8
+ const memoryRoot = ControlPlaneMemoryController.memoryRoot(stateRoot);
9
+ return {
10
+ memoryRoot,
11
+ notes: await listMemoryNotePaths({ memoryRoot, path }),
12
+ };
13
+ }
14
+ static async readNote(stateRoot, path, options) {
15
+ const memoryRoot = ControlPlaneMemoryController.memoryRoot(stateRoot);
16
+ return {
17
+ memoryRoot,
18
+ path,
19
+ content: await readMemoryNote({
20
+ memoryRoot,
21
+ path,
22
+ offset: options?.offset,
23
+ maxLines: options?.maxLines,
24
+ }),
25
+ };
26
+ }
27
+ static async searchNotes(stateRoot, query, options) {
28
+ const memoryRoot = ControlPlaneMemoryController.memoryRoot(stateRoot);
29
+ return {
30
+ memoryRoot,
31
+ query,
32
+ matches: await searchMemoryNotes({
33
+ memoryRoot,
34
+ query,
35
+ path: options?.path,
36
+ maxResults: options?.maxResults,
37
+ }),
38
+ };
39
+ }
40
+ static memoryRoot(stateRoot) {
41
+ return resolve(stateRoot, 'memory');
42
+ }
43
+ }
44
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../../../../src/server/features/control-plane/controllers/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EACd,iBAAiB,GAClB,MAAM,uCAAuC,CAAC;AAE/C,MAAM,OAAO,4BAA4B;IACvC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAiB;QACvC,OAAO,MAAM,gBAAgB,CAAC,EAAE,UAAU,EAAE,4BAA4B,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACpG,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,SAAiB,EAAE,IAAa;QACrD,MAAM,UAAU,GAAG,4BAA4B,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACtE,OAAO;YACL,UAAU;YACV,KAAK,EAAE,MAAM,mBAAmB,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;SACvD,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAiB,EAAE,IAAY,EAAE,OAAgD;QACrG,MAAM,UAAU,GAAG,4BAA4B,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACtE,OAAO;YACL,UAAU;YACV,IAAI;YACJ,OAAO,EAAE,MAAM,cAAc,CAAC;gBAC5B,UAAU;gBACV,IAAI;gBACJ,MAAM,EAAE,OAAO,EAAE,MAAM;gBACvB,QAAQ,EAAE,OAAO,EAAE,QAAQ;aAC5B,CAAC;SACH,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,KAAa,EAAE,OAAgD;QACzG,MAAM,UAAU,GAAG,4BAA4B,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACtE,OAAO;YACL,UAAU;YACV,KAAK;YACL,OAAO,EAAE,MAAM,iBAAiB,CAAC;gBAC/B,UAAU;gBACV,KAAK;gBACL,IAAI,EAAE,OAAO,EAAE,IAAI;gBACnB,UAAU,EAAE,OAAO,EAAE,UAAU;aAChC,CAAC;SACH,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,UAAU,CAAC,SAAiB;QACzC,OAAO,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ import type { WorkspaceChangesView, WorkspaceFileDiffView } from '../types.js';
2
+ export declare class ControlPlaneWorkspaceDiffController {
3
+ static readChanges(workspaceRoot: string): Promise<WorkspaceChangesView>;
4
+ static readFileDiff(workspaceRoot: string, path: string): Promise<WorkspaceFileDiffView>;
5
+ private static isHeddleStatePath;
6
+ private static ensureGitWorkspace;
7
+ private static readDiffStats;
8
+ private static parsePorcelainStatus;
9
+ private static statusFromPorcelain;
10
+ private static normalizeStatusCode;
11
+ private static resolveWorkspacePath;
12
+ private static isReadableUntrackedFile;
13
+ private static rewriteNoIndexPatchPaths;
14
+ private static truncatePatch;
15
+ private static normalizeError;
16
+ private static runGit;
17
+ }
18
+ //# sourceMappingURL=workspace-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-diff.d.ts","sourceRoot":"","sources":["../../../../../../src/server/features/control-plane/controllers/workspace-diff.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAiBrB,qBAAa,mCAAmC;WACjC,WAAW,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;WA4CjE,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAoD9F,OAAO,CAAC,MAAM,CAAC,iBAAiB;mBAIX,kBAAkB;mBAWlB,aAAa;IA8BlC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAmCnC,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAsBlC,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAIlC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAenC,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAYtC,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAYvC,OAAO,CAAC,MAAM,CAAC,aAAa;IAU5B,OAAO,CAAC,MAAM,CAAC,cAAc;IAK7B,OAAO,CAAC,MAAM,CAAC,MAAM;CAiBtB"}