hammoc 1.5.0 → 1.7.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 (372) hide show
  1. package/README.md +12 -4
  2. package/package.json +2 -2
  3. package/packages/client/dist/assets/{agentExampleHighlight-BgwTm15v.js → agentExampleHighlight-7Olvqdpf.js} +1 -1
  4. package/packages/client/dist/assets/{commandTokenHighlight-BljHwnrK.js → commandTokenHighlight-DtKwh4lx.js} +1 -1
  5. package/packages/client/dist/assets/index-B09doO8H.js +139 -0
  6. package/packages/client/dist/assets/index-Bee52CKG.js +1569 -0
  7. package/packages/client/dist/assets/index-CVy582lU.css +32 -0
  8. package/packages/client/dist/assets/{index-D3LxqW3f.js → index-DLHBUw8c.js} +1 -1
  9. package/packages/client/dist/assets/{snippetTokenHighlight-DWsaQXX0.js → snippetTokenHighlight-C8O688f4.js} +1 -1
  10. package/packages/client/dist/index.html +2 -2
  11. package/packages/client/dist/sw.js +2 -2
  12. package/packages/server/dist/_dbg_agent_rows.d.ts +2 -0
  13. package/packages/server/dist/_dbg_agent_rows.d.ts.map +1 -0
  14. package/packages/server/dist/_dbg_agent_rows.js +60 -0
  15. package/packages/server/dist/_dbg_agent_rows.js.map +1 -0
  16. package/packages/server/dist/_dbg_flicker.d.ts +2 -0
  17. package/packages/server/dist/_dbg_flicker.d.ts.map +1 -0
  18. package/packages/server/dist/_dbg_flicker.js +38 -0
  19. package/packages/server/dist/_dbg_flicker.js.map +1 -0
  20. package/packages/server/dist/_harness_cli.d.ts +2 -0
  21. package/packages/server/dist/_harness_cli.d.ts.map +1 -0
  22. package/packages/server/dist/_harness_cli.js +81 -0
  23. package/packages/server/dist/_harness_cli.js.map +1 -0
  24. package/packages/server/dist/_harness_provcard.d.ts +2 -0
  25. package/packages/server/dist/_harness_provcard.d.ts.map +1 -0
  26. package/packages/server/dist/_harness_provcard.js +67 -0
  27. package/packages/server/dist/_harness_provcard.js.map +1 -0
  28. package/packages/server/dist/_replay_dump.d.ts +2 -0
  29. package/packages/server/dist/_replay_dump.d.ts.map +1 -0
  30. package/packages/server/dist/_replay_dump.js +62 -0
  31. package/packages/server/dist/_replay_dump.js.map +1 -0
  32. package/packages/server/dist/app.d.ts.map +1 -1
  33. package/packages/server/dist/app.js +6 -0
  34. package/packages/server/dist/app.js.map +1 -1
  35. package/packages/server/dist/config/index.d.ts.map +1 -1
  36. package/packages/server/dist/config/index.js.map +1 -1
  37. package/packages/server/dist/controllers/bmadCoreConfigController.d.ts +41 -0
  38. package/packages/server/dist/controllers/bmadCoreConfigController.d.ts.map +1 -0
  39. package/packages/server/dist/controllers/bmadCoreConfigController.js +172 -0
  40. package/packages/server/dist/controllers/bmadCoreConfigController.js.map +1 -0
  41. package/packages/server/dist/controllers/contextBuilderController.d.ts +43 -0
  42. package/packages/server/dist/controllers/contextBuilderController.d.ts.map +1 -0
  43. package/packages/server/dist/controllers/contextBuilderController.js +159 -0
  44. package/packages/server/dist/controllers/contextBuilderController.js.map +1 -0
  45. package/packages/server/dist/controllers/harnessAgentController.d.ts +7 -0
  46. package/packages/server/dist/controllers/harnessAgentController.d.ts.map +1 -1
  47. package/packages/server/dist/controllers/harnessAgentController.js +33 -0
  48. package/packages/server/dist/controllers/harnessAgentController.js.map +1 -1
  49. package/packages/server/dist/controllers/harnessBundleController.d.ts +37 -0
  50. package/packages/server/dist/controllers/harnessBundleController.d.ts.map +1 -0
  51. package/packages/server/dist/controllers/harnessBundleController.js +312 -0
  52. package/packages/server/dist/controllers/harnessBundleController.js.map +1 -0
  53. package/packages/server/dist/controllers/harnessCommandController.d.ts +7 -0
  54. package/packages/server/dist/controllers/harnessCommandController.d.ts.map +1 -1
  55. package/packages/server/dist/controllers/harnessCommandController.js +33 -0
  56. package/packages/server/dist/controllers/harnessCommandController.js.map +1 -1
  57. package/packages/server/dist/controllers/harnessHookController.d.ts.map +1 -1
  58. package/packages/server/dist/controllers/harnessHookController.js +44 -1
  59. package/packages/server/dist/controllers/harnessHookController.js.map +1 -1
  60. package/packages/server/dist/controllers/harnessMcpController.d.ts.map +1 -1
  61. package/packages/server/dist/controllers/harnessMcpController.js +62 -1
  62. package/packages/server/dist/controllers/harnessMcpController.js.map +1 -1
  63. package/packages/server/dist/controllers/harnessShareScopeController.d.ts +9 -0
  64. package/packages/server/dist/controllers/harnessShareScopeController.d.ts.map +1 -1
  65. package/packages/server/dist/controllers/harnessShareScopeController.js +48 -1
  66. package/packages/server/dist/controllers/harnessShareScopeController.js.map +1 -1
  67. package/packages/server/dist/controllers/marketplaceController.d.ts +19 -0
  68. package/packages/server/dist/controllers/marketplaceController.d.ts.map +1 -0
  69. package/packages/server/dist/controllers/marketplaceController.js +74 -0
  70. package/packages/server/dist/controllers/marketplaceController.js.map +1 -0
  71. package/packages/server/dist/controllers/observabilityController.d.ts +32 -0
  72. package/packages/server/dist/controllers/observabilityController.d.ts.map +1 -0
  73. package/packages/server/dist/controllers/observabilityController.js +148 -0
  74. package/packages/server/dist/controllers/observabilityController.js.map +1 -0
  75. package/packages/server/dist/controllers/projectController.d.ts.map +1 -1
  76. package/packages/server/dist/controllers/projectController.js +7 -1
  77. package/packages/server/dist/controllers/projectController.js.map +1 -1
  78. package/packages/server/dist/controllers/sessionController.d.ts.map +1 -1
  79. package/packages/server/dist/controllers/sessionController.js +16 -4
  80. package/packages/server/dist/controllers/sessionController.js.map +1 -1
  81. package/packages/server/dist/controllers/systemBrowseController.d.ts +33 -0
  82. package/packages/server/dist/controllers/systemBrowseController.d.ts.map +1 -0
  83. package/packages/server/dist/controllers/systemBrowseController.js +105 -0
  84. package/packages/server/dist/controllers/systemBrowseController.js.map +1 -0
  85. package/packages/server/dist/handlers/streamCallbacks.d.ts +10 -0
  86. package/packages/server/dist/handlers/streamCallbacks.d.ts.map +1 -1
  87. package/packages/server/dist/handlers/streamCallbacks.js +25 -4
  88. package/packages/server/dist/handlers/streamCallbacks.js.map +1 -1
  89. package/packages/server/dist/handlers/websocket.d.ts +43 -3
  90. package/packages/server/dist/handlers/websocket.d.ts.map +1 -1
  91. package/packages/server/dist/handlers/websocket.js +385 -93
  92. package/packages/server/dist/handlers/websocket.js.map +1 -1
  93. package/packages/server/dist/index.js +2 -0
  94. package/packages/server/dist/index.js.map +1 -1
  95. package/packages/server/dist/locales/en/server.json +17 -0
  96. package/packages/server/dist/locales/es/server.json +17 -0
  97. package/packages/server/dist/locales/ja/server.json +17 -0
  98. package/packages/server/dist/locales/ko/server.json +17 -0
  99. package/packages/server/dist/locales/pt/server.json +17 -0
  100. package/packages/server/dist/locales/zh-CN/server.json +17 -0
  101. package/packages/server/dist/routes/harness.d.ts.map +1 -1
  102. package/packages/server/dist/routes/harness.js +58 -0
  103. package/packages/server/dist/routes/harness.js.map +1 -1
  104. package/packages/server/dist/routes/preferences.d.ts.map +1 -1
  105. package/packages/server/dist/routes/preferences.js +12 -2
  106. package/packages/server/dist/routes/preferences.js.map +1 -1
  107. package/packages/server/dist/routes/systemBrowse.d.ts +17 -0
  108. package/packages/server/dist/routes/systemBrowse.d.ts.map +1 -0
  109. package/packages/server/dist/routes/systemBrowse.js +22 -0
  110. package/packages/server/dist/routes/systemBrowse.js.map +1 -0
  111. package/packages/server/dist/services/bmadCoreConfigService.d.ts +86 -0
  112. package/packages/server/dist/services/bmadCoreConfigService.d.ts.map +1 -0
  113. package/packages/server/dist/services/bmadCoreConfigService.js +175 -0
  114. package/packages/server/dist/services/bmadCoreConfigService.js.map +1 -0
  115. package/packages/server/dist/services/bmadStatusService.d.ts +9 -0
  116. package/packages/server/dist/services/bmadStatusService.d.ts.map +1 -1
  117. package/packages/server/dist/services/bmadStatusService.js +77 -13
  118. package/packages/server/dist/services/bmadStatusService.js.map +1 -1
  119. package/packages/server/dist/services/chatEngine.d.ts +81 -0
  120. package/packages/server/dist/services/chatEngine.d.ts.map +1 -0
  121. package/packages/server/dist/services/chatEngine.js +2 -0
  122. package/packages/server/dist/services/chatEngine.js.map +1 -0
  123. package/packages/server/dist/services/chatEngineFactory.d.ts +15 -0
  124. package/packages/server/dist/services/chatEngineFactory.d.ts.map +1 -0
  125. package/packages/server/dist/services/chatEngineFactory.js +28 -0
  126. package/packages/server/dist/services/chatEngineFactory.js.map +1 -0
  127. package/packages/server/dist/services/chatService.d.ts +34 -26
  128. package/packages/server/dist/services/chatService.d.ts.map +1 -1
  129. package/packages/server/dist/services/chatService.js +44 -104
  130. package/packages/server/dist/services/chatService.js.map +1 -1
  131. package/packages/server/dist/services/cliChatEngine.d.ts +198 -0
  132. package/packages/server/dist/services/cliChatEngine.d.ts.map +1 -0
  133. package/packages/server/dist/services/cliChatEngine.js +2977 -0
  134. package/packages/server/dist/services/cliChatEngine.js.map +1 -0
  135. package/packages/server/dist/services/cliGridCards.d.ts +87 -0
  136. package/packages/server/dist/services/cliGridCards.d.ts.map +1 -0
  137. package/packages/server/dist/services/cliGridCards.js +298 -0
  138. package/packages/server/dist/services/cliGridCards.js.map +1 -0
  139. package/packages/server/dist/services/cliGridRegion.d.ts +44 -0
  140. package/packages/server/dist/services/cliGridRegion.d.ts.map +1 -0
  141. package/packages/server/dist/services/cliGridRegion.js +94 -0
  142. package/packages/server/dist/services/cliGridRegion.js.map +1 -0
  143. package/packages/server/dist/services/cliModalDetect.d.ts +299 -0
  144. package/packages/server/dist/services/cliModalDetect.d.ts.map +1 -0
  145. package/packages/server/dist/services/cliModalDetect.js +583 -0
  146. package/packages/server/dist/services/cliModalDetect.js.map +1 -0
  147. package/packages/server/dist/services/cliScreenCache.d.ts +33 -0
  148. package/packages/server/dist/services/cliScreenCache.d.ts.map +1 -0
  149. package/packages/server/dist/services/cliScreenCache.js +48 -0
  150. package/packages/server/dist/services/cliScreenCache.js.map +1 -0
  151. package/packages/server/dist/services/cliScreenModel.d.ts +141 -0
  152. package/packages/server/dist/services/cliScreenModel.d.ts.map +1 -0
  153. package/packages/server/dist/services/cliScreenModel.js +196 -0
  154. package/packages/server/dist/services/cliScreenModel.js.map +1 -0
  155. package/packages/server/dist/services/cliScreenStallWatchdog.d.ts +41 -0
  156. package/packages/server/dist/services/cliScreenStallWatchdog.d.ts.map +1 -0
  157. package/packages/server/dist/services/cliScreenStallWatchdog.js +45 -0
  158. package/packages/server/dist/services/cliScreenStallWatchdog.js.map +1 -0
  159. package/packages/server/dist/services/cliSessionPool.d.ts +97 -0
  160. package/packages/server/dist/services/cliSessionPool.d.ts.map +1 -0
  161. package/packages/server/dist/services/cliSessionPool.js +278 -0
  162. package/packages/server/dist/services/cliSessionPool.js.map +1 -0
  163. package/packages/server/dist/services/cliSpinnerProgress.d.ts +41 -0
  164. package/packages/server/dist/services/cliSpinnerProgress.d.ts.map +1 -0
  165. package/packages/server/dist/services/cliSpinnerProgress.js +131 -0
  166. package/packages/server/dist/services/cliSpinnerProgress.js.map +1 -0
  167. package/packages/server/dist/services/contextBuilderScriptTemplate.d.ts +24 -0
  168. package/packages/server/dist/services/contextBuilderScriptTemplate.d.ts.map +1 -0
  169. package/packages/server/dist/services/contextBuilderScriptTemplate.js +181 -0
  170. package/packages/server/dist/services/contextBuilderScriptTemplate.js.map +1 -0
  171. package/packages/server/dist/services/contextBuilderService.d.ts +68 -0
  172. package/packages/server/dist/services/contextBuilderService.d.ts.map +1 -0
  173. package/packages/server/dist/services/contextBuilderService.js +345 -0
  174. package/packages/server/dist/services/contextBuilderService.js.map +1 -0
  175. package/packages/server/dist/services/fileRewind.d.ts +46 -0
  176. package/packages/server/dist/services/fileRewind.d.ts.map +1 -0
  177. package/packages/server/dist/services/fileRewind.js +77 -0
  178. package/packages/server/dist/services/fileRewind.js.map +1 -0
  179. package/packages/server/dist/services/fileWatcherService.d.ts.map +1 -1
  180. package/packages/server/dist/services/fileWatcherService.js +40 -0
  181. package/packages/server/dist/services/fileWatcherService.js.map +1 -1
  182. package/packages/server/dist/services/harnessAgentService.d.ts +18 -0
  183. package/packages/server/dist/services/harnessAgentService.d.ts.map +1 -1
  184. package/packages/server/dist/services/harnessAgentService.js +55 -0
  185. package/packages/server/dist/services/harnessAgentService.js.map +1 -1
  186. package/packages/server/dist/services/harnessBundleService.d.ts +145 -0
  187. package/packages/server/dist/services/harnessBundleService.d.ts.map +1 -0
  188. package/packages/server/dist/services/harnessBundleService.js +1318 -0
  189. package/packages/server/dist/services/harnessBundleService.js.map +1 -0
  190. package/packages/server/dist/services/harnessCommandService.d.ts +21 -0
  191. package/packages/server/dist/services/harnessCommandService.d.ts.map +1 -1
  192. package/packages/server/dist/services/harnessCommandService.js +64 -0
  193. package/packages/server/dist/services/harnessCommandService.js.map +1 -1
  194. package/packages/server/dist/services/harnessHookService.d.ts +27 -0
  195. package/packages/server/dist/services/harnessHookService.d.ts.map +1 -1
  196. package/packages/server/dist/services/harnessHookService.js +52 -0
  197. package/packages/server/dist/services/harnessHookService.js.map +1 -1
  198. package/packages/server/dist/services/harnessMcpService.d.ts +24 -1
  199. package/packages/server/dist/services/harnessMcpService.d.ts.map +1 -1
  200. package/packages/server/dist/services/harnessMcpService.js +70 -0
  201. package/packages/server/dist/services/harnessMcpService.js.map +1 -1
  202. package/packages/server/dist/services/harnessShareScopeService.d.ts +19 -0
  203. package/packages/server/dist/services/harnessShareScopeService.d.ts.map +1 -1
  204. package/packages/server/dist/services/harnessShareScopeService.js +65 -0
  205. package/packages/server/dist/services/harnessShareScopeService.js.map +1 -1
  206. package/packages/server/dist/services/historyParser.d.ts +11 -0
  207. package/packages/server/dist/services/historyParser.d.ts.map +1 -1
  208. package/packages/server/dist/services/historyParser.js +10 -8
  209. package/packages/server/dist/services/historyParser.js.map +1 -1
  210. package/packages/server/dist/services/imageStorageService.d.ts +12 -0
  211. package/packages/server/dist/services/imageStorageService.d.ts.map +1 -1
  212. package/packages/server/dist/services/imageStorageService.js +22 -0
  213. package/packages/server/dist/services/imageStorageService.js.map +1 -1
  214. package/packages/server/dist/services/issueService.d.ts.map +1 -1
  215. package/packages/server/dist/services/issueService.js +1 -0
  216. package/packages/server/dist/services/issueService.js.map +1 -1
  217. package/packages/server/dist/services/marketplaceService.d.ts +50 -0
  218. package/packages/server/dist/services/marketplaceService.d.ts.map +1 -0
  219. package/packages/server/dist/services/marketplaceService.js +326 -0
  220. package/packages/server/dist/services/marketplaceService.js.map +1 -0
  221. package/packages/server/dist/services/observabilityService.d.ts +87 -0
  222. package/packages/server/dist/services/observabilityService.d.ts.map +1 -0
  223. package/packages/server/dist/services/observabilityService.js +0 -0
  224. package/packages/server/dist/services/observabilityService.js.map +1 -0
  225. package/packages/server/dist/services/projectService.d.ts +13 -1
  226. package/packages/server/dist/services/projectService.d.ts.map +1 -1
  227. package/packages/server/dist/services/projectService.js +32 -0
  228. package/packages/server/dist/services/projectService.js.map +1 -1
  229. package/packages/server/dist/services/queueService.d.ts.map +1 -1
  230. package/packages/server/dist/services/queueService.js +12 -3
  231. package/packages/server/dist/services/queueService.js.map +1 -1
  232. package/packages/server/dist/services/rateLimitProbeService.d.ts +15 -0
  233. package/packages/server/dist/services/rateLimitProbeService.d.ts.map +1 -1
  234. package/packages/server/dist/services/rateLimitProbeService.js +48 -19
  235. package/packages/server/dist/services/rateLimitProbeService.js.map +1 -1
  236. package/packages/server/dist/services/sessionService.d.ts +16 -0
  237. package/packages/server/dist/services/sessionService.d.ts.map +1 -1
  238. package/packages/server/dist/services/sessionService.js +125 -0
  239. package/packages/server/dist/services/sessionService.js.map +1 -1
  240. package/packages/server/dist/services/streamHandler.d.ts +8 -1
  241. package/packages/server/dist/services/streamHandler.d.ts.map +1 -1
  242. package/packages/server/dist/services/streamHandler.js +12 -5
  243. package/packages/server/dist/services/streamHandler.js.map +1 -1
  244. package/packages/server/dist/services/systemBrowseService.d.ts +91 -0
  245. package/packages/server/dist/services/systemBrowseService.d.ts.map +1 -0
  246. package/packages/server/dist/services/systemBrowseService.js +372 -0
  247. package/packages/server/dist/services/systemBrowseService.js.map +1 -0
  248. package/packages/server/dist/services/tokenCountService.d.ts +71 -0
  249. package/packages/server/dist/services/tokenCountService.d.ts.map +1 -0
  250. package/packages/server/dist/services/tokenCountService.js +313 -0
  251. package/packages/server/dist/services/tokenCountService.js.map +1 -0
  252. package/packages/server/dist/services/workspaceContext.d.ts +24 -0
  253. package/packages/server/dist/services/workspaceContext.d.ts.map +1 -0
  254. package/packages/server/dist/services/workspaceContext.js +109 -0
  255. package/packages/server/dist/services/workspaceContext.js.map +1 -0
  256. package/packages/server/dist/snippets/apply-qa-fixes +7 -5
  257. package/packages/server/dist/snippets/qa-review +7 -1
  258. package/packages/server/dist/utils/assertSafeBundlePath.d.ts +29 -0
  259. package/packages/server/dist/utils/assertSafeBundlePath.d.ts.map +1 -0
  260. package/packages/server/dist/utils/assertSafeBundlePath.js +53 -0
  261. package/packages/server/dist/utils/assertSafeBundlePath.js.map +1 -0
  262. package/packages/server/dist/utils/backgroundBlock.d.ts +29 -0
  263. package/packages/server/dist/utils/backgroundBlock.d.ts.map +1 -0
  264. package/packages/server/dist/utils/backgroundBlock.js +33 -0
  265. package/packages/server/dist/utils/backgroundBlock.js.map +1 -0
  266. package/packages/server/dist/utils/backgroundTaskTracker.d.ts +20 -0
  267. package/packages/server/dist/utils/backgroundTaskTracker.d.ts.map +1 -0
  268. package/packages/server/dist/utils/backgroundTaskTracker.js +40 -0
  269. package/packages/server/dist/utils/backgroundTaskTracker.js.map +1 -0
  270. package/packages/server/dist/utils/bundledBinaryModelSupport.d.ts +14 -0
  271. package/packages/server/dist/utils/bundledBinaryModelSupport.d.ts.map +1 -0
  272. package/packages/server/dist/utils/bundledBinaryModelSupport.js +112 -0
  273. package/packages/server/dist/utils/bundledBinaryModelSupport.js.map +1 -0
  274. package/packages/server/dist/utils/cliDebugLog.d.ts +38 -0
  275. package/packages/server/dist/utils/cliDebugLog.d.ts.map +1 -0
  276. package/packages/server/dist/utils/cliDebugLog.js +65 -0
  277. package/packages/server/dist/utils/cliDebugLog.js.map +1 -0
  278. package/packages/server/dist/utils/cliEngineUtils.d.ts +35 -0
  279. package/packages/server/dist/utils/cliEngineUtils.d.ts.map +1 -0
  280. package/packages/server/dist/utils/cliEngineUtils.js +38 -0
  281. package/packages/server/dist/utils/cliEngineUtils.js.map +1 -0
  282. package/packages/server/dist/utils/effortUtils.d.ts +2 -2
  283. package/packages/server/dist/utils/effortUtils.d.ts.map +1 -1
  284. package/packages/server/dist/utils/effortUtils.js +7 -5
  285. package/packages/server/dist/utils/effortUtils.js.map +1 -1
  286. package/packages/server/dist/utils/errors.d.ts +1 -0
  287. package/packages/server/dist/utils/errors.d.ts.map +1 -1
  288. package/packages/server/dist/utils/errors.js +17 -0
  289. package/packages/server/dist/utils/errors.js.map +1 -1
  290. package/packages/server/dist/utils/harnessBundleSchema.d.ts +14 -12
  291. package/packages/server/dist/utils/harnessBundleSchema.d.ts.map +1 -1
  292. package/packages/server/dist/utils/harnessBundleSchema.js +11 -1
  293. package/packages/server/dist/utils/harnessBundleSchema.js.map +1 -1
  294. package/packages/server/dist/utils/harnessPaths.d.ts +40 -0
  295. package/packages/server/dist/utils/harnessPaths.d.ts.map +1 -1
  296. package/packages/server/dist/utils/harnessPaths.js +123 -0
  297. package/packages/server/dist/utils/harnessPaths.js.map +1 -1
  298. package/packages/server/dist/utils/trailingThrottle.d.ts +21 -0
  299. package/packages/server/dist/utils/trailingThrottle.d.ts.map +1 -0
  300. package/packages/server/dist/utils/trailingThrottle.js +36 -0
  301. package/packages/server/dist/utils/trailingThrottle.js.map +1 -0
  302. package/packages/server/package.json +61 -58
  303. package/packages/server/resources/internals/INDEX.md +3 -1
  304. package/packages/server/resources/internals/bmad-qa-fix-marker.md +32 -0
  305. package/packages/server/resources/internals/harness-files.md +22 -0
  306. package/packages/server/resources/internals/image-storage.md +9 -0
  307. package/packages/server/resources/internals/observability-storage.md +23 -0
  308. package/packages/server/resources/manual/02-chat.md +23 -4
  309. package/packages/server/resources/manual/03-sessions.md +1 -0
  310. package/packages/server/resources/manual/05-projects.md +15 -2
  311. package/packages/server/resources/manual/10-project-board.md +4 -3
  312. package/packages/server/resources/manual/11-bmad-method-integration.md +12 -8
  313. package/packages/server/resources/manual/12-harness-workbench.md +82 -1
  314. package/packages/server/resources/manual/13-settings.md +61 -9
  315. package/packages/shared/dist/index.d.ts +7 -0
  316. package/packages/shared/dist/index.d.ts.map +1 -1
  317. package/packages/shared/dist/index.js +14 -0
  318. package/packages/shared/dist/index.js.map +1 -1
  319. package/packages/shared/dist/types/bmadCoreConfig.d.ts +71 -0
  320. package/packages/shared/dist/types/bmadCoreConfig.d.ts.map +1 -0
  321. package/packages/shared/dist/types/bmadCoreConfig.js +30 -0
  322. package/packages/shared/dist/types/bmadCoreConfig.js.map +1 -0
  323. package/packages/shared/dist/types/bmadStatus.d.ts +26 -0
  324. package/packages/shared/dist/types/bmadStatus.d.ts.map +1 -1
  325. package/packages/shared/dist/types/bmadStatus.js.map +1 -1
  326. package/packages/shared/dist/types/board.d.ts +6 -0
  327. package/packages/shared/dist/types/board.d.ts.map +1 -1
  328. package/packages/shared/dist/types/contextBuilder.d.ts +102 -0
  329. package/packages/shared/dist/types/contextBuilder.d.ts.map +1 -0
  330. package/packages/shared/dist/types/contextBuilder.js +55 -0
  331. package/packages/shared/dist/types/contextBuilder.js.map +1 -0
  332. package/packages/shared/dist/types/harnessBundle.d.ts +35 -0
  333. package/packages/shared/dist/types/harnessBundle.d.ts.map +1 -1
  334. package/packages/shared/dist/types/marketplace.d.ts +83 -0
  335. package/packages/shared/dist/types/marketplace.d.ts.map +1 -0
  336. package/packages/shared/dist/types/marketplace.js +18 -0
  337. package/packages/shared/dist/types/marketplace.js.map +1 -0
  338. package/packages/shared/dist/types/observability.d.ts +148 -0
  339. package/packages/shared/dist/types/observability.d.ts.map +1 -0
  340. package/packages/shared/dist/types/observability.js +24 -0
  341. package/packages/shared/dist/types/observability.js.map +1 -0
  342. package/packages/shared/dist/types/preferences.d.ts +16 -2
  343. package/packages/shared/dist/types/preferences.d.ts.map +1 -1
  344. package/packages/shared/dist/types/preferences.js +1 -0
  345. package/packages/shared/dist/types/preferences.js.map +1 -1
  346. package/packages/shared/dist/types/project.d.ts +7 -1
  347. package/packages/shared/dist/types/project.d.ts.map +1 -1
  348. package/packages/shared/dist/types/project.js.map +1 -1
  349. package/packages/shared/dist/types/sdk.d.ts +124 -12
  350. package/packages/shared/dist/types/sdk.d.ts.map +1 -1
  351. package/packages/shared/dist/types/sdk.js +64 -19
  352. package/packages/shared/dist/types/sdk.js.map +1 -1
  353. package/packages/shared/dist/types/streaming.d.ts +2 -2
  354. package/packages/shared/dist/types/streaming.d.ts.map +1 -1
  355. package/packages/shared/dist/types/streaming.js.map +1 -1
  356. package/packages/shared/dist/types/systemBrowse.d.ts +120 -0
  357. package/packages/shared/dist/types/systemBrowse.d.ts.map +1 -0
  358. package/packages/shared/dist/types/systemBrowse.js +57 -0
  359. package/packages/shared/dist/types/systemBrowse.js.map +1 -0
  360. package/packages/shared/dist/types/websocket.d.ts +38 -0
  361. package/packages/shared/dist/types/websocket.d.ts.map +1 -1
  362. package/packages/shared/dist/utils/interruptFiller.d.ts +30 -0
  363. package/packages/shared/dist/utils/interruptFiller.d.ts.map +1 -0
  364. package/packages/shared/dist/utils/interruptFiller.js +38 -0
  365. package/packages/shared/dist/utils/interruptFiller.js.map +1 -0
  366. package/packages/shared/dist/utils/toolResultContent.d.ts +22 -0
  367. package/packages/shared/dist/utils/toolResultContent.d.ts.map +1 -0
  368. package/packages/shared/dist/utils/toolResultContent.js +29 -0
  369. package/packages/shared/dist/utils/toolResultContent.js.map +1 -0
  370. package/scripts/run-integration-test.mjs +362 -362
  371. package/packages/client/dist/assets/index-CjyjnXB8.css +0 -32
  372. package/packages/client/dist/assets/index-NqJdhlek.js +0 -1498
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_dbg_agent_rows.js","sourceRoot":"","sources":["../src/_dbg_agent_rows.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=_dbg_flicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_dbg_flicker.d.ts","sourceRoot":"","sources":["../src/_dbg_flicker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { createCliScreenModel, CLI_SCREEN_COLS, CLI_SCREEN_ROWS } from './services/cliScreenModel.js';
3
+ import { isGeneratingGrid } from './services/cliModalDetect.js';
4
+ import { scrollbackBodyRows } from './services/cliGridRegion.js';
5
+ const file = process.argv[2];
6
+ const raw = readFileSync(file, 'utf8');
7
+ const screen = createCliScreenModel(CLI_SCREEN_COLS, CLI_SCREEN_ROWS);
8
+ const CHUNK = 256;
9
+ const toolRE = /(Bash|Search|Read|Write|Edit|Grep|Glob|Agent|PowerShell|Workflow)\s*\(/;
10
+ let genFrames = 0;
11
+ const flickers = [];
12
+ const run = async () => {
13
+ for (let i = 0; i < raw.length; i += CHUNK) {
14
+ screen.write(raw.slice(i, i + CHUNK));
15
+ await screen.flush();
16
+ const grid = screen.readGrid();
17
+ if (!isGeneratingGrid(grid))
18
+ continue;
19
+ genFrames++;
20
+ const body = scrollbackBodyRows(grid);
21
+ for (const row of body) {
22
+ if (!toolRE.test(row))
23
+ continue;
24
+ const indent = row.length - row.trimStart().length;
25
+ const hasBullet = row.trimStart().startsWith('●');
26
+ if (!hasBullet && indent <= 3) {
27
+ flickers.push(`frame=${genFrames} indent=${indent} hasBullet=${hasBullet} "${row.slice(0, 80)}"`);
28
+ }
29
+ }
30
+ }
31
+ console.log('genFrames:', genFrames);
32
+ console.log('=== BULLET-LESS tool lines at indent<=3 (flicker candidates) ===');
33
+ flickers.slice(0, 40).forEach((f) => console.log(' ' + f));
34
+ console.log('total:', flickers.length);
35
+ process.exit(0);
36
+ };
37
+ void run();
38
+ //# sourceMappingURL=_dbg_flicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_dbg_flicker.js","sourceRoot":"","sources":["../src/_dbg_flicker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACtG,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC;AAC9B,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACvC,MAAM,MAAM,GAAG,oBAAoB,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;AACtE,MAAM,KAAK,GAAG,GAAG,CAAC;AAClB,MAAM,MAAM,GAAG,wEAAwE,CAAC;AACxF,IAAI,SAAS,GAAG,CAAC,CAAC;AAClB,MAAM,QAAQ,GAAa,EAAE,CAAC;AAE9B,MAAM,GAAG,GAAG,KAAK,IAAI,EAAE;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QACtC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAAE,SAAS;QACtC,SAAS,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACtC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,SAAS;YAChC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC;YACnD,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAClD,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;gBAC9B,QAAQ,CAAC,IAAI,CAAC,SAAS,SAAS,WAAW,MAAM,cAAc,SAAS,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YACpG,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;AACF,KAAK,GAAG,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=_harness_cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_harness_cli.d.ts","sourceRoot":"","sources":["../src/_harness_cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * TEMP harness — REAL-TIME tool-completion check (NO reconnect). Question: in ONE live process, does
3
+ * every tool (esp. Read) receive its onToolResult (completion), or do some stay "USE but no RESULT"
4
+ * (stuck spinner)? This isolates whether the stuck-Read is a LIVE-path bug or reconnect-only.
5
+ *
6
+ * cd packages/server
7
+ * HAMMOC_CLI_TOOL_TRACE=1 npx tsx src/_harness_cli.ts D:/repo/hammoc
8
+ */
9
+ import { CliChatEngine } from './services/cliChatEngine.js';
10
+ import { randomUUID } from 'node:crypto';
11
+ const projectPath = process.argv[2] || process.cwd();
12
+ const engine = new CliChatEngine({
13
+ workingDirectory: projectPath,
14
+ permissionMode: 'bypassPermissions',
15
+ autoCompactEnabled: false,
16
+ });
17
+ const tools = new Map();
18
+ const order = [];
19
+ const callbacks = {
20
+ onSessionInit: (sid) => console.log(`[INIT] ${sid}`),
21
+ onToolUse: (t) => {
22
+ const prev = tools.get(t.id);
23
+ if (!prev)
24
+ order.push(t.id);
25
+ tools.set(t.id, { id: t.id, name: t.name, prov: t.provisional ?? prev?.prov ?? false, result: prev?.result ?? false });
26
+ console.log(`[USE] ${t.provisional ? 'prov ' : 'CANON'} ${t.name} id=${t.id}`);
27
+ },
28
+ onToolResult: (toolCallId, _result, provisional) => {
29
+ const rec = tools.get(toolCallId);
30
+ if (rec)
31
+ rec.result = true;
32
+ else {
33
+ tools.set(toolCallId, { id: toolCallId, name: '?', prov: false, result: true });
34
+ order.push(toolCallId);
35
+ }
36
+ console.log(`[RESULT] ${provisional ? 'prov ' : 'CANON'} id=${toolCallId}`);
37
+ },
38
+ onComplete: (resp) => console.log(`[COMPLETE] done=${resp.done}`),
39
+ onError: (e) => console.error(`[ERROR] ${e.message}`),
40
+ };
41
+ const abort = new AbortController();
42
+ const timer = setTimeout(() => { console.error('[HARNESS] 300s timeout → abort'); abort.abort(); }, 300_000);
43
+ // Long turn: read MANY files ONE BY ONE with prose between each, so the tool cards scroll the
44
+ // 80-row viewport. The question: do EARLY tools (now scrolled ABOVE the viewport) still receive
45
+ // their completion (green flip OR file backstop), or do some stay USE-but-never-RESULT once they
46
+ // leave the screen? This isolates the scroll-off live-path completion gap (Story 37.16 territory).
47
+ const FILES = [
48
+ 'package.json', 'tsconfig.json', 'README.md', 'CLAUDE.md',
49
+ 'packages/client/package.json', 'packages/server/package.json', 'packages/shared/package.json',
50
+ 'packages/client/src/services/socket.ts', 'packages/client/src/components/ToolCard.tsx',
51
+ 'packages/server/src/config/index.ts', 'packages/client/src/sw.ts',
52
+ 'packages/client/src/main.tsx', 'packages/server/src/index.ts',
53
+ 'packages/client/src/components/ProvisionalBadge.tsx', 'packages/client/src/components/ThinkingBlock.tsx',
54
+ ];
55
+ const prompt = [
56
+ 'Read each of these files ONE BY ONE — exactly one Read tool call at a time, NEVER batch multiple reads. After EACH file write 2-3 sentences of explanation about it before reading the next, so the screen scrolls a lot:',
57
+ ...FILES.map((f, i) => `${i + 1}. ${f}`),
58
+ `${FILES.length + 1}. Finish with a three-sentence summary of the project.`,
59
+ ].join('\n');
60
+ console.log(`[HARNESS] cwd=${projectPath} sending ${prompt.length} chars...\n`);
61
+ const options = { sessionId: randomUUID(), abortController: abort };
62
+ try {
63
+ const resp = await engine.sendMessageWithCallbacks(prompt, callbacks, options, undefined, undefined, () => { });
64
+ console.log(`\n[HARNESS] === REAL-TIME TOOL COMPLETION (no reconnect) ===`);
65
+ const all = order.map((id) => tools.get(id)).filter(Boolean);
66
+ const incomplete = all.filter((t) => !t.result);
67
+ console.log(` total tool ids : ${all.length}`);
68
+ console.log(` completed : ${all.filter((t) => t.result).length}`);
69
+ console.log(` INCOMPLETE : ${incomplete.length} (USE but never RESULT = stuck spinner)`);
70
+ for (const t of incomplete)
71
+ console.log(` ✗ ${t.name} id=${t.id} prov=${t.prov}`);
72
+ console.log(`[HARNESS] done=${resp.done} isError=${resp.isError}`);
73
+ }
74
+ catch (e) {
75
+ console.error(`[HARNESS] FATAL ${e instanceof Error ? e.message : String(e)}`);
76
+ }
77
+ finally {
78
+ clearTimeout(timer);
79
+ setTimeout(() => process.exit(0), 800);
80
+ }
81
+ //# sourceMappingURL=_harness_cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_harness_cli.js","sourceRoot":"","sources":["../src/_harness_cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=_harness_provcard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_harness_provcard.d.ts","sourceRoot":"","sources":["../src/_harness_provcard.ts"],"names":[],"mappings":""}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * TEMP harness — does the live screen-scrape produce PROVISIONAL text/thinking cards at all?
3
+ * Spawns a REAL claude via the CLI engine (one turn) and logs every onTextChunk / onThinking /
4
+ * onToolUse with its provisional flag + slot id. If `provisional text/think > 0`, the grid parser
5
+ * (`●`/`∴` at the fixed col-0 gate, scrollbackBodyRows) is recognizing headers end-to-end. Pure
6
+ * observation; HAMMOC_CLI_PTY_DUMP=1 also writes the raw frames so the `●` column can be inspected.
7
+ *
8
+ * cd packages/server
9
+ * HAMMOC_CLI_PTY_DUMP=1 npx tsx src/_harness_provcard.ts D:/repo/hammoc
10
+ */
11
+ import { CliChatEngine } from './services/cliChatEngine.js';
12
+ import { randomUUID } from 'node:crypto';
13
+ const projectPath = process.argv[2] || process.cwd();
14
+ const engine = new CliChatEngine({
15
+ workingDirectory: projectPath,
16
+ permissionMode: 'bypassPermissions',
17
+ autoCompactEnabled: false,
18
+ });
19
+ let provText = 0;
20
+ let canonText = 0;
21
+ let provThink = 0;
22
+ let canonThink = 0;
23
+ const callbacks = {
24
+ onSessionInit: (sid) => console.log(`[INIT] ${sid}`),
25
+ onTextChunk: (c) => {
26
+ if (c.provisional)
27
+ provText++;
28
+ else
29
+ canonText++;
30
+ console.log(`[TEXT] ${c.provisional ? 'PROV ' : 'canon'} id=${c.messageId} "${c.content.slice(0, 50).replace(/\n/g, ' ')}"`);
31
+ },
32
+ onThinking: (content, prov) => {
33
+ if (prov)
34
+ provThink++;
35
+ else
36
+ canonThink++;
37
+ console.log(`[THINK] ${prov ? 'PROV ' : 'canon'} "${content.slice(0, 50).replace(/\n/g, ' ')}"`);
38
+ },
39
+ onToolUse: (t) => console.log(`[TOOL] ${t.provisional ? 'PROV ' : 'canon'} ${t.name} id=${t.id}`),
40
+ onComplete: (resp) => console.log(`[COMPLETE] done=${resp.done}`),
41
+ onError: (e) => console.error(`[ERROR] ${e.message}`),
42
+ };
43
+ const abort = new AbortController();
44
+ const timer = setTimeout(() => { console.error('[HARNESS] 180s timeout → abort'); abort.abort(); }, 180_000);
45
+ // A turn that produces BOTH a thinking summary (∴) and assistant prose (●), plus one tool, so the
46
+ // live scraper has all three header kinds to recognize off the fixed col-0/col-2 gate.
47
+ const prompt = 'Think briefly about what kind of project this monorepo is, then answer in about 4 sentences. ' +
48
+ 'After that, read package.json and tell me the "name" field.';
49
+ console.log(`[HARNESS] cwd=${projectPath} sending...\n`);
50
+ const options = { sessionId: randomUUID(), abortController: abort };
51
+ try {
52
+ const resp = await engine.sendMessageWithCallbacks(prompt, callbacks, options, undefined, undefined, () => { });
53
+ console.log(`\n[HARNESS] === PROVISIONAL CARD CHECK ===`);
54
+ console.log(` provisional text : ${provText} canonical text : ${canonText}`);
55
+ console.log(` provisional think: ${provThink} canonical think: ${canonThink}`);
56
+ const ok = provText + provThink > 0;
57
+ console.log(` => provisional cards ${ok ? 'DID appear — live parsing OK' : 'NEVER appeared — live parsing BROKEN'}`);
58
+ console.log(`[HARNESS] done=${resp.done} isError=${resp.isError}`);
59
+ }
60
+ catch (e) {
61
+ console.error(`[HARNESS] FATAL ${e instanceof Error ? e.message : String(e)}`);
62
+ }
63
+ finally {
64
+ clearTimeout(timer);
65
+ setTimeout(() => process.exit(0), 800);
66
+ }
67
+ //# sourceMappingURL=_harness_provcard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_harness_provcard.js","sourceRoot":"","sources":["../src/_harness_provcard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=_replay_dump.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_replay_dump.d.ts","sourceRoot":"","sources":["../src/_replay_dump.ts"],"names":[],"mappings":""}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * TEMP replay — feed a real HAMMOC_CLI_PTY_DUMP capture into the screen model and reproduce the EXACT
3
+ * live-scraper path (emitProvisionalCards): only mid-generation frames (isGeneratingGrid), footer
4
+ * cluster stripped (scrollbackBodyRows), then parseGridCards. Flags any frame where a USER MESSAGE
5
+ * substring becomes an assistant card. Pure replay → quota 0.
6
+ *
7
+ * cd packages/server
8
+ * npx tsx src/_replay_dump.ts logs/cli-pty-dump/<file>.log
9
+ */
10
+ import { readFileSync } from 'node:fs';
11
+ import { createCliScreenModel, CLI_SCREEN_COLS, CLI_SCREEN_ROWS } from './services/cliScreenModel.js';
12
+ import { parseGridCards } from './services/cliGridCards.js';
13
+ import { scrollbackBodyRows } from './services/cliGridRegion.js';
14
+ import { isGeneratingGrid } from './services/cliModalDetect.js';
15
+ const file = process.argv[2];
16
+ // User-message substrings to watch for (hard-coded to avoid Windows argv encoding issues with Hangul).
17
+ const needles = ['유저 메시지는', '아까 대화', '로그 보면', '재시작했어', '줄넘김', '토큰이랑', '스피너 카드'];
18
+ const raw = readFileSync(file, 'utf8');
19
+ const screen = createCliScreenModel(CLI_SCREEN_COLS, CLI_SCREEN_ROWS);
20
+ const CHUNK = 256;
21
+ const seen = new Set();
22
+ let hits = 0;
23
+ let genFrames = 0;
24
+ const run = async () => {
25
+ for (let i = 0; i < raw.length; i += CHUNK) {
26
+ screen.write(raw.slice(i, i + CHUNK));
27
+ await screen.flush();
28
+ const full = screen.readGrid();
29
+ if (!isGeneratingGrid(full))
30
+ continue; // the live scraper ONLY runs mid-generation
31
+ genFrames++;
32
+ const bodyRows = scrollbackBodyRows(full); // EXACT live-path input: footer cluster stripped
33
+ const colors = screen.readBulletColors().slice(0, bodyRows.length);
34
+ const cards = parseGridCards(bodyRows, colors);
35
+ for (const c of cards) {
36
+ for (const n of needles) {
37
+ if (!c.text.includes(n))
38
+ continue;
39
+ const key = `${c.kind}|${n}`;
40
+ if (seen.has(key))
41
+ continue;
42
+ seen.add(key);
43
+ hits++;
44
+ console.log(`\n### HIT @~${i}B CARD kind=${c.kind}${c.bulletColor ? ':' + c.bulletColor : ''} needle=${JSON.stringify(n)}`);
45
+ console.log(` card.text=${JSON.stringify(c.text.slice(0, 200))}`);
46
+ bodyRows.forEach((r, ri) => {
47
+ if (r.includes(n))
48
+ console.log(` bodyRow[${ri}]=${JSON.stringify(r)}`);
49
+ });
50
+ }
51
+ }
52
+ }
53
+ console.log(`\n=== generating frames scraped: ${genFrames} ; distinct (kind x needle) hits: ${hits} ===`);
54
+ console.log('\n=== FINAL screen grid (col-preserved; leading spaces show indent) ===');
55
+ screen.readGrid().forEach((r, ri) => {
56
+ if (r.trim())
57
+ console.log(`row[${String(ri).padStart(2)}] ${JSON.stringify(r)}`);
58
+ });
59
+ process.exit(0);
60
+ };
61
+ void run();
62
+ //# sourceMappingURL=_replay_dump.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_replay_dump.js","sourceRoot":"","sources":["../src/_replay_dump.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACtG,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7B,uGAAuG;AACvG,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAEhF,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACvC,MAAM,MAAM,GAAG,oBAAoB,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;AACtE,MAAM,KAAK,GAAG,GAAG,CAAC;AAClB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;AAC/B,IAAI,IAAI,GAAG,CAAC,CAAC;AACb,IAAI,SAAS,GAAG,CAAC,CAAC;AAElB,MAAM,GAAG,GAAG,KAAK,IAAmB,EAAE;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QACtC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAAE,SAAS,CAAC,4CAA4C;QACnF,SAAS,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,iDAAiD;QAC5F,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAE,SAAS;gBAClC,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;gBAC7B,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACd,IAAI,EAAE,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC9H,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;gBACrE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;oBACzB,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;wBAAE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC5E,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,oCAAoC,SAAS,sCAAsC,IAAI,MAAM,CAAC,CAAC;IAC3G,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC;IACvF,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;QAClC,IAAI,CAAC,CAAC,IAAI,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;AACF,KAAK,GAAG,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAgB,EAAE,OAAO,EAAqB,MAAM,SAAS,CAAC;AA4B9D,OAAO,WAAW,CAAC;AAInB;;;GAGG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAoKlD"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAgB,EAAE,OAAO,EAAqB,MAAM,SAAS,CAAC;AA6B9D,OAAO,WAAW,CAAC;AAInB;;;GAGG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CA0KlD"}
@@ -29,6 +29,7 @@ import imageRoutes from './routes/images.js';
29
29
  import serverRoutes from './routes/server.js';
30
30
  import harnessRoutes from './routes/harness.js';
31
31
  import snippetsRoutes from './routes/snippets.js';
32
+ import systemBrowseRoutes from './routes/systemBrowse.js';
32
33
  import { createSessionMiddleware } from './middleware/session.js';
33
34
  import { authMiddlewareWithExclusions } from './middleware/auth.js';
34
35
  import { i18nMiddleware } from './middleware/i18n.js';
@@ -145,6 +146,11 @@ export async function createApp() {
145
146
  // intentionally separate from `/api/harness/*` so the URL boundary makes
146
147
  // the system-of-record obvious.
147
148
  app.use('/api/snippets', snippetsRoutes);
149
+ // System browse routes (Story 34.1) — directory-only host filesystem browse
150
+ // for project-path selection. Mounted under /api/system (not /api/projects)
151
+ // because it runs before a project exists, so there is no project boundary.
152
+ // Auth is automatic via authMiddlewareWithExclusions (not in PUBLIC_ROUTES).
153
+ app.use('/api/system', systemBrowseRoutes);
148
154
  // Server management routes (restart)
149
155
  app.use('/api/server', serverRoutes);
150
156
  // Debug routes (server-side logging + test helpers) — dev mode or explicit opt-in.
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,QAAQ,EAAiB,MAAM,gBAAgB,CAAC;AAiCzD;;;GAGG;AACH,eAAO,MAAM,MAAM;IACjB;;OAEG;;QAED;;;;;;WAMG;;;IAIL;;OAEG;;;;QAID;;;;;;WAMG;;;IAIL;;;;OAIG;;;0BAG2B,MAAM,EAAE;;;IAItC;;;OAGG;;;;IAMH;;;OAGG;;;;;;IAOH;;;;OAIG;;;;;;IAMH;;OAEG;;;;;;;;;;CAEK,CAAC;AAEX,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,QAAQ,EAAiB,MAAM,gBAAgB,CAAC;AAiCzD;;;GAGG;AACH,eAAO,MAAM,MAAM;IACjB;;OAEG;;QAED;;;;;;WAMG;;;IAIL;;OAEG;;;;QAID;;;;;;WAMG;;;IAIL;;;;OAIG;;;0BAG2B,MAAM,EAAE;;;IAItC;;;OAGG;;;;IAMH;;;OAGG;;;;;;IAOH;;;;OAIG;;;;;;IAOH;;OAEG;;;;;;;;;;CAEK,CAAC;AAEX,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Story 31.1: BMad core-config editor controller (Epic 31).
3
+ *
4
+ * Mounts at GET/PATCH `/api/harness/bmad-config/:projectSlug` and
5
+ * PUT `/api/harness/bmad-config/:projectSlug/raw`. Mirrors the error-mapping
6
+ * envelope of `claudeMdController` (Story 29.1) / `harnessController`
7
+ * (Story 28.0.5): success responses are the raw result object and failures are
8
+ * `{ error: { code, message, details? } }` with the message resolved through
9
+ * `req.t!()` for i18n. There is no global Express error middleware — this
10
+ * controller maps `HARNESS_ERRORS` codes to HTTP statuses inline.
11
+ */
12
+ import { Request, Response } from 'express';
13
+ export declare const bmadCoreConfigController: {
14
+ /**
15
+ * GET /api/harness/bmad-config/:projectSlug
16
+ *
17
+ * Returns content + mtime + the known/unknown key partition. A malformed
18
+ * on-disk YAML does NOT 422 here (the API contract limits GET errors to
19
+ * FILE_NOT_FOUND / FORBIDDEN): the raw content is still returned with empty
20
+ * partitions so the client can open in Raw mode and repair the file.
21
+ */
22
+ read(req: Request, res: Response): Promise<void>;
23
+ /**
24
+ * PATCH /api/harness/bmad-config/:projectSlug
25
+ * body: { ops: HarnessStructuredPatchOp[]; expectedMtime? }
26
+ *
27
+ * AST patch preserving comments/order/quoting; unknown keys round-trip
28
+ * untouched. A malformed on-disk YAML surfaces as HARNESS_PARSE_ERROR (422)
29
+ * so the client switches to Raw mode.
30
+ */
31
+ patch(req: Request, res: Response): Promise<void>;
32
+ /**
33
+ * PUT /api/harness/bmad-config/:projectSlug/raw
34
+ * body: { content: string; expectedMtime? }
35
+ *
36
+ * Raw-mode overwrite (bypasses the AST patch). STALE_WRITE guard still
37
+ * applies so a raw save cannot clobber an external edit silently.
38
+ */
39
+ writeRaw(req: Request, res: Response): Promise<void>;
40
+ };
41
+ //# sourceMappingURL=bmadCoreConfigController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bmadCoreConfigController.d.ts","sourceRoot":"","sources":["../../src/controllers/bmadCoreConfigController.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AA0F5C,eAAO,MAAM,wBAAwB;IACnC;;;;;;;OAOG;cACa,OAAO,OAAO,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBtD;;;;;;;OAOG;eACc,OAAO,OAAO,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBvD;;;;;;OAMG;kBACiB,OAAO,OAAO,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAqB3D,CAAC"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Story 31.1: BMad core-config editor controller (Epic 31).
3
+ *
4
+ * Mounts at GET/PATCH `/api/harness/bmad-config/:projectSlug` and
5
+ * PUT `/api/harness/bmad-config/:projectSlug/raw`. Mirrors the error-mapping
6
+ * envelope of `claudeMdController` (Story 29.1) / `harnessController`
7
+ * (Story 28.0.5): success responses are the raw result object and failures are
8
+ * `{ error: { code, message, details? } }` with the message resolved through
9
+ * `req.t!()` for i18n. There is no global Express error middleware — this
10
+ * controller maps `HARNESS_ERRORS` codes to HTTP statuses inline.
11
+ */
12
+ import { z } from 'zod';
13
+ import { HARNESS_ERRORS, } from '@hammoc/shared';
14
+ import { bmadCoreConfigService } from '../services/bmadCoreConfigService.js';
15
+ const projectSlugSchema = z.string().min(1, 'projectSlug is required');
16
+ const patchOpSchema = z.object({
17
+ // `value` is intentionally `z.unknown()` so an omitted key parses to
18
+ // `undefined` (= delete per HarnessStructuredPatchOp), while an explicit
19
+ // `null` stays a real YAML-null set (e.g. customTechnicalDocuments: null).
20
+ path: z.array(z.union([z.string(), z.number()])).min(1, 'patch op requires a non-empty path'),
21
+ value: z.unknown(),
22
+ });
23
+ const patchBodySchema = z.object({
24
+ ops: z.array(patchOpSchema).min(1, 'at least one patch op is required'),
25
+ expectedMtime: z.string().optional(),
26
+ });
27
+ const rawBodySchema = z.object({
28
+ content: z.string(),
29
+ expectedMtime: z.string().optional(),
30
+ });
31
+ const MAPPED_CODES = [
32
+ 'HARNESS_PATH_DENIED',
33
+ 'HARNESS_FORBIDDEN',
34
+ 'HARNESS_FILE_NOT_FOUND',
35
+ 'HARNESS_NOT_A_FILE',
36
+ 'HARNESS_ROOT_MISSING',
37
+ 'HARNESS_STALE_WRITE',
38
+ 'HARNESS_PARSE_ERROR',
39
+ ];
40
+ const MESSAGE_KEY = {
41
+ HARNESS_PATH_DENIED: 'harness.error.pathDenied',
42
+ HARNESS_FORBIDDEN: 'harness.error.forbidden',
43
+ HARNESS_FILE_NOT_FOUND: 'harness.error.fileNotFound',
44
+ HARNESS_NOT_A_FILE: 'harness.error.notAFile',
45
+ HARNESS_ROOT_MISSING: 'harness.error.rootMissing',
46
+ HARNESS_STALE_WRITE: 'harness.error.staleWrite',
47
+ HARNESS_PARSE_ERROR: 'harness.error.parseError',
48
+ };
49
+ function handleError(req, res, error) {
50
+ const nodeError = error;
51
+ for (const key of MAPPED_CODES) {
52
+ const entry = HARNESS_ERRORS[key];
53
+ if (nodeError.code === entry.code) {
54
+ const body = {
55
+ code: entry.code,
56
+ message: req.t(MESSAGE_KEY[key]),
57
+ };
58
+ if (key === 'HARNESS_STALE_WRITE') {
59
+ body.details = { currentMtime: nodeError.currentMtime ?? '' };
60
+ }
61
+ if (key === 'HARNESS_FILE_NOT_FOUND' && nodeError.absolutePath) {
62
+ body.details = { absolutePath: nodeError.absolutePath };
63
+ }
64
+ res.status(entry.httpStatus).json({ error: body });
65
+ return;
66
+ }
67
+ }
68
+ res.status(HARNESS_ERRORS.HARNESS_WRITE_ERROR.httpStatus).json({
69
+ error: {
70
+ code: HARNESS_ERRORS.HARNESS_WRITE_ERROR.code,
71
+ message: req.t('harness.error.writeError'),
72
+ },
73
+ });
74
+ }
75
+ function parseSlug(req, res) {
76
+ const parsed = projectSlugSchema.safeParse(req.params.projectSlug);
77
+ if (!parsed.success) {
78
+ res.status(400).json({
79
+ error: { code: 'INVALID_REQUEST', message: parsed.error.issues[0]?.message ?? 'invalid projectSlug' },
80
+ });
81
+ return null;
82
+ }
83
+ return parsed.data;
84
+ }
85
+ export const bmadCoreConfigController = {
86
+ /**
87
+ * GET /api/harness/bmad-config/:projectSlug
88
+ *
89
+ * Returns content + mtime + the known/unknown key partition. A malformed
90
+ * on-disk YAML does NOT 422 here (the API contract limits GET errors to
91
+ * FILE_NOT_FOUND / FORBIDDEN): the raw content is still returned with empty
92
+ * partitions so the client can open in Raw mode and repair the file.
93
+ */
94
+ async read(req, res) {
95
+ const projectSlug = parseSlug(req, res);
96
+ if (!projectSlug)
97
+ return;
98
+ try {
99
+ const { content, mtime } = await bmadCoreConfigService.read(projectSlug);
100
+ let knownKeys = {};
101
+ let unknownKeys = {};
102
+ try {
103
+ const partition = bmadCoreConfigService.parseUnknownKeys(content);
104
+ knownKeys = partition.knownKeys;
105
+ unknownKeys = partition.unknownKeys;
106
+ }
107
+ catch {
108
+ // Malformed YAML on disk — return raw content with empty partitions so
109
+ // the panel can still open and the user can fix it in Raw mode.
110
+ }
111
+ const response = { content, mtime, knownKeys, unknownKeys };
112
+ res.json(response);
113
+ }
114
+ catch (error) {
115
+ handleError(req, res, error);
116
+ }
117
+ },
118
+ /**
119
+ * PATCH /api/harness/bmad-config/:projectSlug
120
+ * body: { ops: HarnessStructuredPatchOp[]; expectedMtime? }
121
+ *
122
+ * AST patch preserving comments/order/quoting; unknown keys round-trip
123
+ * untouched. A malformed on-disk YAML surfaces as HARNESS_PARSE_ERROR (422)
124
+ * so the client switches to Raw mode.
125
+ */
126
+ async patch(req, res) {
127
+ const projectSlug = parseSlug(req, res);
128
+ if (!projectSlug)
129
+ return;
130
+ const parsed = patchBodySchema.safeParse(req.body ?? {});
131
+ if (!parsed.success) {
132
+ res.status(400).json({
133
+ error: { code: 'INVALID_REQUEST', message: parsed.error.issues[0]?.message ?? 'invalid body' },
134
+ });
135
+ return;
136
+ }
137
+ try {
138
+ const result = await bmadCoreConfigService.patchKey(projectSlug, parsed.data.ops, parsed.data.expectedMtime);
139
+ res.json(result);
140
+ }
141
+ catch (error) {
142
+ handleError(req, res, error);
143
+ }
144
+ },
145
+ /**
146
+ * PUT /api/harness/bmad-config/:projectSlug/raw
147
+ * body: { content: string; expectedMtime? }
148
+ *
149
+ * Raw-mode overwrite (bypasses the AST patch). STALE_WRITE guard still
150
+ * applies so a raw save cannot clobber an external edit silently.
151
+ */
152
+ async writeRaw(req, res) {
153
+ const projectSlug = parseSlug(req, res);
154
+ if (!projectSlug)
155
+ return;
156
+ const parsed = rawBodySchema.safeParse(req.body ?? {});
157
+ if (!parsed.success) {
158
+ res.status(400).json({
159
+ error: { code: 'INVALID_REQUEST', message: parsed.error.issues[0]?.message ?? 'invalid body' },
160
+ });
161
+ return;
162
+ }
163
+ try {
164
+ const result = await bmadCoreConfigService.writeRaw(projectSlug, parsed.data.content, parsed.data.expectedMtime);
165
+ res.json(result);
166
+ }
167
+ catch (error) {
168
+ handleError(req, res, error);
169
+ }
170
+ },
171
+ };
172
+ //# sourceMappingURL=bmadCoreConfigController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bmadCoreConfigController.js","sourceRoot":"","sources":["../../src/controllers/bmadCoreConfigController.ts"],"names":[],"mappings":"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"}