@hoangsonw/forge 0.1.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 (598) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +919 -0
  3. package/bin/forge.js +30 -0
  4. package/dist/agents/architect.d.ts +20 -0
  5. package/dist/agents/architect.d.ts.map +1 -0
  6. package/dist/agents/architect.js +75 -0
  7. package/dist/agents/architect.js.map +1 -0
  8. package/dist/agents/base.d.ts +20 -0
  9. package/dist/agents/base.d.ts.map +1 -0
  10. package/dist/agents/base.js +3 -0
  11. package/dist/agents/base.js.map +1 -0
  12. package/dist/agents/debugger.d.ts +16 -0
  13. package/dist/agents/debugger.d.ts.map +1 -0
  14. package/dist/agents/debugger.js +93 -0
  15. package/dist/agents/debugger.js.map +1 -0
  16. package/dist/agents/executor.d.ts +48 -0
  17. package/dist/agents/executor.d.ts.map +1 -0
  18. package/dist/agents/executor.js +402 -0
  19. package/dist/agents/executor.js.map +1 -0
  20. package/dist/agents/memory.d.ts +8 -0
  21. package/dist/agents/memory.d.ts.map +1 -0
  22. package/dist/agents/memory.js +84 -0
  23. package/dist/agents/memory.js.map +1 -0
  24. package/dist/agents/planner.d.ts +5 -0
  25. package/dist/agents/planner.d.ts.map +1 -0
  26. package/dist/agents/planner.js +185 -0
  27. package/dist/agents/planner.js.map +1 -0
  28. package/dist/agents/registry.d.ts +6 -0
  29. package/dist/agents/registry.d.ts.map +1 -0
  30. package/dist/agents/registry.js +32 -0
  31. package/dist/agents/registry.js.map +1 -0
  32. package/dist/agents/reviewer.d.ts +18 -0
  33. package/dist/agents/reviewer.d.ts.map +1 -0
  34. package/dist/agents/reviewer.js +87 -0
  35. package/dist/agents/reviewer.js.map +1 -0
  36. package/dist/classifier/classifier.d.ts +9 -0
  37. package/dist/classifier/classifier.d.ts.map +1 -0
  38. package/dist/classifier/classifier.js +83 -0
  39. package/dist/classifier/classifier.js.map +1 -0
  40. package/dist/classifier/heuristics.d.ts +11 -0
  41. package/dist/classifier/heuristics.d.ts.map +1 -0
  42. package/dist/classifier/heuristics.js +112 -0
  43. package/dist/classifier/heuristics.js.map +1 -0
  44. package/dist/cli/animations.d.ts +27 -0
  45. package/dist/cli/animations.d.ts.map +1 -0
  46. package/dist/cli/animations.js +186 -0
  47. package/dist/cli/animations.js.map +1 -0
  48. package/dist/cli/banners.d.ts +47 -0
  49. package/dist/cli/banners.d.ts.map +1 -0
  50. package/dist/cli/banners.js +211 -0
  51. package/dist/cli/banners.js.map +1 -0
  52. package/dist/cli/bootstrap.d.ts +2 -0
  53. package/dist/cli/bootstrap.d.ts.map +1 -0
  54. package/dist/cli/bootstrap.js +21 -0
  55. package/dist/cli/bootstrap.js.map +1 -0
  56. package/dist/cli/commands/bundle.d.ts +3 -0
  57. package/dist/cli/commands/bundle.d.ts.map +1 -0
  58. package/dist/cli/commands/bundle.js +80 -0
  59. package/dist/cli/commands/bundle.js.map +1 -0
  60. package/dist/cli/commands/changelog.d.ts +3 -0
  61. package/dist/cli/commands/changelog.d.ts.map +1 -0
  62. package/dist/cli/commands/changelog.js +60 -0
  63. package/dist/cli/commands/changelog.js.map +1 -0
  64. package/dist/cli/commands/config.d.ts +3 -0
  65. package/dist/cli/commands/config.d.ts.map +1 -0
  66. package/dist/cli/commands/config.js +91 -0
  67. package/dist/cli/commands/config.js.map +1 -0
  68. package/dist/cli/commands/container.d.ts +3 -0
  69. package/dist/cli/commands/container.d.ts.map +1 -0
  70. package/dist/cli/commands/container.js +149 -0
  71. package/dist/cli/commands/container.js.map +1 -0
  72. package/dist/cli/commands/cost.d.ts +3 -0
  73. package/dist/cli/commands/cost.d.ts.map +1 -0
  74. package/dist/cli/commands/cost.js +38 -0
  75. package/dist/cli/commands/cost.js.map +1 -0
  76. package/dist/cli/commands/daemon.d.ts +3 -0
  77. package/dist/cli/commands/daemon.d.ts.map +1 -0
  78. package/dist/cli/commands/daemon.js +39 -0
  79. package/dist/cli/commands/daemon.js.map +1 -0
  80. package/dist/cli/commands/dev.d.ts +3 -0
  81. package/dist/cli/commands/dev.d.ts.map +1 -0
  82. package/dist/cli/commands/dev.js +73 -0
  83. package/dist/cli/commands/dev.js.map +1 -0
  84. package/dist/cli/commands/doctor.d.ts +3 -0
  85. package/dist/cli/commands/doctor.d.ts.map +1 -0
  86. package/dist/cli/commands/doctor.js +214 -0
  87. package/dist/cli/commands/doctor.js.map +1 -0
  88. package/dist/cli/commands/init.d.ts +3 -0
  89. package/dist/cli/commands/init.d.ts.map +1 -0
  90. package/dist/cli/commands/init.js +148 -0
  91. package/dist/cli/commands/init.js.map +1 -0
  92. package/dist/cli/commands/mcp.d.ts +3 -0
  93. package/dist/cli/commands/mcp.d.ts.map +1 -0
  94. package/dist/cli/commands/mcp.js +227 -0
  95. package/dist/cli/commands/mcp.js.map +1 -0
  96. package/dist/cli/commands/memory.d.ts +3 -0
  97. package/dist/cli/commands/memory.d.ts.map +1 -0
  98. package/dist/cli/commands/memory.js +101 -0
  99. package/dist/cli/commands/memory.js.map +1 -0
  100. package/dist/cli/commands/migrate.d.ts +3 -0
  101. package/dist/cli/commands/migrate.d.ts.map +1 -0
  102. package/dist/cli/commands/migrate.js +18 -0
  103. package/dist/cli/commands/migrate.js.map +1 -0
  104. package/dist/cli/commands/model.d.ts +3 -0
  105. package/dist/cli/commands/model.d.ts.map +1 -0
  106. package/dist/cli/commands/model.js +37 -0
  107. package/dist/cli/commands/model.js.map +1 -0
  108. package/dist/cli/commands/permissions.d.ts +3 -0
  109. package/dist/cli/commands/permissions.d.ts.map +1 -0
  110. package/dist/cli/commands/permissions.js +32 -0
  111. package/dist/cli/commands/permissions.js.map +1 -0
  112. package/dist/cli/commands/resume.d.ts +3 -0
  113. package/dist/cli/commands/resume.d.ts.map +1 -0
  114. package/dist/cli/commands/resume.js +90 -0
  115. package/dist/cli/commands/resume.js.map +1 -0
  116. package/dist/cli/commands/run.d.ts +5 -0
  117. package/dist/cli/commands/run.d.ts.map +1 -0
  118. package/dist/cli/commands/run.js +164 -0
  119. package/dist/cli/commands/run.js.map +1 -0
  120. package/dist/cli/commands/session.d.ts +3 -0
  121. package/dist/cli/commands/session.d.ts.map +1 -0
  122. package/dist/cli/commands/session.js +94 -0
  123. package/dist/cli/commands/session.js.map +1 -0
  124. package/dist/cli/commands/skills.d.ts +4 -0
  125. package/dist/cli/commands/skills.d.ts.map +1 -0
  126. package/dist/cli/commands/skills.js +176 -0
  127. package/dist/cli/commands/skills.js.map +1 -0
  128. package/dist/cli/commands/spec.d.ts +3 -0
  129. package/dist/cli/commands/spec.d.ts.map +1 -0
  130. package/dist/cli/commands/spec.js +58 -0
  131. package/dist/cli/commands/spec.js.map +1 -0
  132. package/dist/cli/commands/status.d.ts +3 -0
  133. package/dist/cli/commands/status.d.ts.map +1 -0
  134. package/dist/cli/commands/status.js +65 -0
  135. package/dist/cli/commands/status.js.map +1 -0
  136. package/dist/cli/commands/task.d.ts +3 -0
  137. package/dist/cli/commands/task.d.ts.map +1 -0
  138. package/dist/cli/commands/task.js +42 -0
  139. package/dist/cli/commands/task.js.map +1 -0
  140. package/dist/cli/commands/ui.d.ts +3 -0
  141. package/dist/cli/commands/ui.d.ts.map +1 -0
  142. package/dist/cli/commands/ui.js +28 -0
  143. package/dist/cli/commands/ui.js.map +1 -0
  144. package/dist/cli/commands/update.d.ts +3 -0
  145. package/dist/cli/commands/update.d.ts.map +1 -0
  146. package/dist/cli/commands/update.js +53 -0
  147. package/dist/cli/commands/update.js.map +1 -0
  148. package/dist/cli/commands/web.d.ts +3 -0
  149. package/dist/cli/commands/web.d.ts.map +1 -0
  150. package/dist/cli/commands/web.js +42 -0
  151. package/dist/cli/commands/web.js.map +1 -0
  152. package/dist/cli/help.d.ts +21 -0
  153. package/dist/cli/help.d.ts.map +1 -0
  154. package/dist/cli/help.js +216 -0
  155. package/dist/cli/help.js.map +1 -0
  156. package/dist/cli/index.d.ts +3 -0
  157. package/dist/cli/index.d.ts.map +1 -0
  158. package/dist/cli/index.js +154 -0
  159. package/dist/cli/index.js.map +1 -0
  160. package/dist/cli/repl-commands.d.ts +47 -0
  161. package/dist/cli/repl-commands.d.ts.map +1 -0
  162. package/dist/cli/repl-commands.js +508 -0
  163. package/dist/cli/repl-commands.js.map +1 -0
  164. package/dist/cli/repl-input.d.ts +87 -0
  165. package/dist/cli/repl-input.d.ts.map +1 -0
  166. package/dist/cli/repl-input.js +764 -0
  167. package/dist/cli/repl-input.js.map +1 -0
  168. package/dist/cli/repl.d.ts +5 -0
  169. package/dist/cli/repl.d.ts.map +1 -0
  170. package/dist/cli/repl.js +1046 -0
  171. package/dist/cli/repl.js.map +1 -0
  172. package/dist/cli/ui.d.ts +19 -0
  173. package/dist/cli/ui.d.ts.map +1 -0
  174. package/dist/cli/ui.js +106 -0
  175. package/dist/cli/ui.js.map +1 -0
  176. package/dist/config/loader.d.ts +11 -0
  177. package/dist/config/loader.d.ts.map +1 -0
  178. package/dist/config/loader.js +132 -0
  179. package/dist/config/loader.js.map +1 -0
  180. package/dist/config/paths.d.ts +35 -0
  181. package/dist/config/paths.d.ts.map +1 -0
  182. package/dist/config/paths.js +114 -0
  183. package/dist/config/paths.js.map +1 -0
  184. package/dist/config/schema.d.ts +372 -0
  185. package/dist/config/schema.d.ts.map +1 -0
  186. package/dist/config/schema.js +161 -0
  187. package/dist/config/schema.js.map +1 -0
  188. package/dist/config/xdg.d.ts +2 -0
  189. package/dist/config/xdg.d.ts.map +1 -0
  190. package/dist/config/xdg.js +55 -0
  191. package/dist/config/xdg.js.map +1 -0
  192. package/dist/core/continuity.d.ts +8 -0
  193. package/dist/core/continuity.d.ts.map +1 -0
  194. package/dist/core/continuity.js +36 -0
  195. package/dist/core/continuity.js.map +1 -0
  196. package/dist/core/conversation.d.ts +152 -0
  197. package/dist/core/conversation.d.ts.map +1 -0
  198. package/dist/core/conversation.js +435 -0
  199. package/dist/core/conversation.js.map +1 -0
  200. package/dist/core/estimation.d.ts +19 -0
  201. package/dist/core/estimation.d.ts.map +1 -0
  202. package/dist/core/estimation.js +53 -0
  203. package/dist/core/estimation.js.map +1 -0
  204. package/dist/core/fork.d.ts +7 -0
  205. package/dist/core/fork.d.ts.map +1 -0
  206. package/dist/core/fork.js +93 -0
  207. package/dist/core/fork.js.map +1 -0
  208. package/dist/core/interactive-host.d.ts +28 -0
  209. package/dist/core/interactive-host.d.ts.map +1 -0
  210. package/dist/core/interactive-host.js +19 -0
  211. package/dist/core/interactive-host.js.map +1 -0
  212. package/dist/core/loop-detection.d.ts +25 -0
  213. package/dist/core/loop-detection.d.ts.map +1 -0
  214. package/dist/core/loop-detection.js +37 -0
  215. package/dist/core/loop-detection.js.map +1 -0
  216. package/dist/core/loop.d.ts +15 -0
  217. package/dist/core/loop.d.ts.map +1 -0
  218. package/dist/core/loop.js +417 -0
  219. package/dist/core/loop.js.map +1 -0
  220. package/dist/core/mode-policy.d.ts +33 -0
  221. package/dist/core/mode-policy.d.ts.map +1 -0
  222. package/dist/core/mode-policy.js +62 -0
  223. package/dist/core/mode-policy.js.map +1 -0
  224. package/dist/core/orchestrator.d.ts +14 -0
  225. package/dist/core/orchestrator.d.ts.map +1 -0
  226. package/dist/core/orchestrator.js +69 -0
  227. package/dist/core/orchestrator.js.map +1 -0
  228. package/dist/core/plan-fixer.d.ts +16 -0
  229. package/dist/core/plan-fixer.d.ts.map +1 -0
  230. package/dist/core/plan-fixer.js +55 -0
  231. package/dist/core/plan-fixer.js.map +1 -0
  232. package/dist/core/signals.d.ts +5 -0
  233. package/dist/core/signals.d.ts.map +1 -0
  234. package/dist/core/signals.js +44 -0
  235. package/dist/core/signals.js.map +1 -0
  236. package/dist/core/spec.d.ts +8 -0
  237. package/dist/core/spec.d.ts.map +1 -0
  238. package/dist/core/spec.js +75 -0
  239. package/dist/core/spec.js.map +1 -0
  240. package/dist/core/validation.d.ts +21 -0
  241. package/dist/core/validation.d.ts.map +1 -0
  242. package/dist/core/validation.js +126 -0
  243. package/dist/core/validation.js.map +1 -0
  244. package/dist/daemon/control.d.ts +9 -0
  245. package/dist/daemon/control.d.ts.map +1 -0
  246. package/dist/daemon/control.js +88 -0
  247. package/dist/daemon/control.js.map +1 -0
  248. package/dist/daemon/server.d.ts +8 -0
  249. package/dist/daemon/server.d.ts.map +1 -0
  250. package/dist/daemon/server.js +129 -0
  251. package/dist/daemon/server.js.map +1 -0
  252. package/dist/daemon/updater.d.ts +21 -0
  253. package/dist/daemon/updater.d.ts.map +1 -0
  254. package/dist/daemon/updater.js +159 -0
  255. package/dist/daemon/updater.js.map +1 -0
  256. package/dist/keychain/index.d.ts +8 -0
  257. package/dist/keychain/index.d.ts.map +1 -0
  258. package/dist/keychain/index.js +243 -0
  259. package/dist/keychain/index.js.map +1 -0
  260. package/dist/keychain/windows.d.ts +5 -0
  261. package/dist/keychain/windows.d.ts.map +1 -0
  262. package/dist/keychain/windows.js +65 -0
  263. package/dist/keychain/windows.js.map +1 -0
  264. package/dist/logging/logger.d.ts +12 -0
  265. package/dist/logging/logger.d.ts.map +1 -0
  266. package/dist/logging/logger.js +127 -0
  267. package/dist/logging/logger.js.map +1 -0
  268. package/dist/logging/rotation.d.ts +9 -0
  269. package/dist/logging/rotation.d.ts.map +1 -0
  270. package/dist/logging/rotation.js +85 -0
  271. package/dist/logging/rotation.js.map +1 -0
  272. package/dist/logging/trace.d.ts +7 -0
  273. package/dist/logging/trace.d.ts.map +1 -0
  274. package/dist/logging/trace.js +50 -0
  275. package/dist/logging/trace.js.map +1 -0
  276. package/dist/mcp/client.d.ts +37 -0
  277. package/dist/mcp/client.d.ts.map +1 -0
  278. package/dist/mcp/client.js +111 -0
  279. package/dist/mcp/client.js.map +1 -0
  280. package/dist/mcp/http-transport.d.ts +30 -0
  281. package/dist/mcp/http-transport.d.ts.map +1 -0
  282. package/dist/mcp/http-transport.js +109 -0
  283. package/dist/mcp/http-transport.js.map +1 -0
  284. package/dist/mcp/oauth.d.ts +23 -0
  285. package/dist/mcp/oauth.d.ts.map +1 -0
  286. package/dist/mcp/oauth.js +235 -0
  287. package/dist/mcp/oauth.js.map +1 -0
  288. package/dist/mcp/registry.d.ts +5 -0
  289. package/dist/mcp/registry.d.ts.map +1 -0
  290. package/dist/mcp/registry.js +35 -0
  291. package/dist/mcp/registry.js.map +1 -0
  292. package/dist/memory/cold.d.ts +16 -0
  293. package/dist/memory/cold.d.ts.map +1 -0
  294. package/dist/memory/cold.js +244 -0
  295. package/dist/memory/cold.js.map +1 -0
  296. package/dist/memory/graph.d.ts +19 -0
  297. package/dist/memory/graph.d.ts.map +1 -0
  298. package/dist/memory/graph.js +102 -0
  299. package/dist/memory/graph.js.map +1 -0
  300. package/dist/memory/hot.d.ts +26 -0
  301. package/dist/memory/hot.d.ts.map +1 -0
  302. package/dist/memory/hot.js +58 -0
  303. package/dist/memory/hot.js.map +1 -0
  304. package/dist/memory/index.d.ts +7 -0
  305. package/dist/memory/index.d.ts.map +1 -0
  306. package/dist/memory/index.js +26 -0
  307. package/dist/memory/index.js.map +1 -0
  308. package/dist/memory/learning.d.ts +18 -0
  309. package/dist/memory/learning.d.ts.map +1 -0
  310. package/dist/memory/learning.js +83 -0
  311. package/dist/memory/learning.js.map +1 -0
  312. package/dist/memory/retrieval.d.ts +21 -0
  313. package/dist/memory/retrieval.d.ts.map +1 -0
  314. package/dist/memory/retrieval.js +114 -0
  315. package/dist/memory/retrieval.js.map +1 -0
  316. package/dist/memory/warm.d.ts +9 -0
  317. package/dist/memory/warm.d.ts.map +1 -0
  318. package/dist/memory/warm.js +150 -0
  319. package/dist/memory/warm.js.map +1 -0
  320. package/dist/migrations/runner.d.ts +18 -0
  321. package/dist/migrations/runner.d.ts.map +1 -0
  322. package/dist/migrations/runner.js +62 -0
  323. package/dist/migrations/runner.js.map +1 -0
  324. package/dist/models/adapter.d.ts +46 -0
  325. package/dist/models/adapter.d.ts.map +1 -0
  326. package/dist/models/adapter.js +85 -0
  327. package/dist/models/adapter.js.map +1 -0
  328. package/dist/models/anthropic.d.ts +17 -0
  329. package/dist/models/anthropic.d.ts.map +1 -0
  330. package/dist/models/anthropic.js +128 -0
  331. package/dist/models/anthropic.js.map +1 -0
  332. package/dist/models/cache.d.ts +5 -0
  333. package/dist/models/cache.d.ts.map +1 -0
  334. package/dist/models/cache.js +135 -0
  335. package/dist/models/cache.js.map +1 -0
  336. package/dist/models/circuit-breaker.d.ts +18 -0
  337. package/dist/models/circuit-breaker.d.ts.map +1 -0
  338. package/dist/models/circuit-breaker.js +63 -0
  339. package/dist/models/circuit-breaker.js.map +1 -0
  340. package/dist/models/cost.d.ts +13 -0
  341. package/dist/models/cost.d.ts.map +1 -0
  342. package/dist/models/cost.js +92 -0
  343. package/dist/models/cost.js.map +1 -0
  344. package/dist/models/llamacpp.d.ts +9 -0
  345. package/dist/models/llamacpp.d.ts.map +1 -0
  346. package/dist/models/llamacpp.js +15 -0
  347. package/dist/models/llamacpp.js.map +1 -0
  348. package/dist/models/lmstudio.d.ts +11 -0
  349. package/dist/models/lmstudio.d.ts.map +1 -0
  350. package/dist/models/lmstudio.js +18 -0
  351. package/dist/models/lmstudio.js.map +1 -0
  352. package/dist/models/local-catalog.d.ts +45 -0
  353. package/dist/models/local-catalog.d.ts.map +1 -0
  354. package/dist/models/local-catalog.js +314 -0
  355. package/dist/models/local-catalog.js.map +1 -0
  356. package/dist/models/ollama.d.ts +10 -0
  357. package/dist/models/ollama.d.ts.map +1 -0
  358. package/dist/models/ollama.js +98 -0
  359. package/dist/models/ollama.js.map +1 -0
  360. package/dist/models/openai.d.ts +16 -0
  361. package/dist/models/openai.d.ts.map +1 -0
  362. package/dist/models/openai.js +139 -0
  363. package/dist/models/openai.js.map +1 -0
  364. package/dist/models/provider.d.ts +7 -0
  365. package/dist/models/provider.d.ts.map +1 -0
  366. package/dist/models/provider.js +39 -0
  367. package/dist/models/provider.js.map +1 -0
  368. package/dist/models/rate-limit.d.ts +13 -0
  369. package/dist/models/rate-limit.d.ts.map +1 -0
  370. package/dist/models/rate-limit.js +37 -0
  371. package/dist/models/rate-limit.js.map +1 -0
  372. package/dist/models/registry.d.ts +2 -0
  373. package/dist/models/registry.d.ts.map +1 -0
  374. package/dist/models/registry.js +69 -0
  375. package/dist/models/registry.js.map +1 -0
  376. package/dist/models/router.d.ts +26 -0
  377. package/dist/models/router.d.ts.map +1 -0
  378. package/dist/models/router.js +185 -0
  379. package/dist/models/router.js.map +1 -0
  380. package/dist/models/vllm.d.ts +13 -0
  381. package/dist/models/vllm.d.ts.map +1 -0
  382. package/dist/models/vllm.js +19 -0
  383. package/dist/models/vllm.js.map +1 -0
  384. package/dist/notifications/manager.d.ts +5 -0
  385. package/dist/notifications/manager.d.ts.map +1 -0
  386. package/dist/notifications/manager.js +65 -0
  387. package/dist/notifications/manager.js.map +1 -0
  388. package/dist/permissions/manager.d.ts +15 -0
  389. package/dist/permissions/manager.d.ts.map +1 -0
  390. package/dist/permissions/manager.js +159 -0
  391. package/dist/permissions/manager.js.map +1 -0
  392. package/dist/permissions/risk.d.ts +13 -0
  393. package/dist/permissions/risk.d.ts.map +1 -0
  394. package/dist/permissions/risk.js +43 -0
  395. package/dist/permissions/risk.js.map +1 -0
  396. package/dist/persistence/compression.d.ts +9 -0
  397. package/dist/persistence/compression.d.ts.map +1 -0
  398. package/dist/persistence/compression.js +126 -0
  399. package/dist/persistence/compression.js.map +1 -0
  400. package/dist/persistence/conversation-store.d.ts +67 -0
  401. package/dist/persistence/conversation-store.d.ts.map +1 -0
  402. package/dist/persistence/conversation-store.js +370 -0
  403. package/dist/persistence/conversation-store.js.map +1 -0
  404. package/dist/persistence/events.d.ts +4 -0
  405. package/dist/persistence/events.d.ts.map +1 -0
  406. package/dist/persistence/events.js +50 -0
  407. package/dist/persistence/events.js.map +1 -0
  408. package/dist/persistence/index-db.d.ts +65 -0
  409. package/dist/persistence/index-db.d.ts.map +1 -0
  410. package/dist/persistence/index-db.js +280 -0
  411. package/dist/persistence/index-db.js.map +1 -0
  412. package/dist/persistence/jsonl.d.ts +8 -0
  413. package/dist/persistence/jsonl.d.ts.map +1 -0
  414. package/dist/persistence/jsonl.js +90 -0
  415. package/dist/persistence/jsonl.js.map +1 -0
  416. package/dist/persistence/sessions.d.ts +5 -0
  417. package/dist/persistence/sessions.d.ts.map +1 -0
  418. package/dist/persistence/sessions.js +54 -0
  419. package/dist/persistence/sessions.js.map +1 -0
  420. package/dist/persistence/tasks.d.ts +7 -0
  421. package/dist/persistence/tasks.d.ts.map +1 -0
  422. package/dist/persistence/tasks.js +162 -0
  423. package/dist/persistence/tasks.js.map +1 -0
  424. package/dist/prompts/assembler.d.ts +29 -0
  425. package/dist/prompts/assembler.d.ts.map +1 -0
  426. package/dist/prompts/assembler.js +136 -0
  427. package/dist/prompts/assembler.js.map +1 -0
  428. package/dist/prompts/layers.d.ts +6 -0
  429. package/dist/prompts/layers.d.ts.map +1 -0
  430. package/dist/prompts/layers.js +60 -0
  431. package/dist/prompts/layers.js.map +1 -0
  432. package/dist/release/download.d.ts +19 -0
  433. package/dist/release/download.d.ts.map +1 -0
  434. package/dist/release/download.js +187 -0
  435. package/dist/release/download.js.map +1 -0
  436. package/dist/release/verify.d.ts +34 -0
  437. package/dist/release/verify.d.ts.map +1 -0
  438. package/dist/release/verify.js +127 -0
  439. package/dist/release/verify.js.map +1 -0
  440. package/dist/sandbox/fs.d.ts +10 -0
  441. package/dist/sandbox/fs.d.ts.map +1 -0
  442. package/dist/sandbox/fs.js +114 -0
  443. package/dist/sandbox/fs.js.map +1 -0
  444. package/dist/sandbox/shell.d.ts +20 -0
  445. package/dist/sandbox/shell.d.ts.map +1 -0
  446. package/dist/sandbox/shell.js +131 -0
  447. package/dist/sandbox/shell.js.map +1 -0
  448. package/dist/scheduler/dag.d.ts +7 -0
  449. package/dist/scheduler/dag.d.ts.map +1 -0
  450. package/dist/scheduler/dag.js +72 -0
  451. package/dist/scheduler/dag.js.map +1 -0
  452. package/dist/scheduler/resource-manager.d.ts +25 -0
  453. package/dist/scheduler/resource-manager.d.ts.map +1 -0
  454. package/dist/scheduler/resource-manager.js +101 -0
  455. package/dist/scheduler/resource-manager.js.map +1 -0
  456. package/dist/security/injection.d.ts +14 -0
  457. package/dist/security/injection.d.ts.map +1 -0
  458. package/dist/security/injection.js +46 -0
  459. package/dist/security/injection.js.map +1 -0
  460. package/dist/security/redact.d.ts +10 -0
  461. package/dist/security/redact.d.ts.map +1 -0
  462. package/dist/security/redact.js +89 -0
  463. package/dist/security/redact.js.map +1 -0
  464. package/dist/skills/loader.d.ts +4 -0
  465. package/dist/skills/loader.d.ts.map +1 -0
  466. package/dist/skills/loader.js +142 -0
  467. package/dist/skills/loader.js.map +1 -0
  468. package/dist/skills/marketplace.d.ts +15 -0
  469. package/dist/skills/marketplace.d.ts.map +1 -0
  470. package/dist/skills/marketplace.js +132 -0
  471. package/dist/skills/marketplace.js.map +1 -0
  472. package/dist/tools/apply-patch.d.ts +20 -0
  473. package/dist/tools/apply-patch.d.ts.map +1 -0
  474. package/dist/tools/apply-patch.js +195 -0
  475. package/dist/tools/apply-patch.js.map +1 -0
  476. package/dist/tools/ask-user.d.ts +12 -0
  477. package/dist/tools/ask-user.d.ts.map +1 -0
  478. package/dist/tools/ask-user.js +86 -0
  479. package/dist/tools/ask-user.js.map +1 -0
  480. package/dist/tools/delete-file.d.ts +10 -0
  481. package/dist/tools/delete-file.d.ts.map +1 -0
  482. package/dist/tools/delete-file.js +94 -0
  483. package/dist/tools/delete-file.js.map +1 -0
  484. package/dist/tools/edit-file.d.ts +20 -0
  485. package/dist/tools/edit-file.d.ts.map +1 -0
  486. package/dist/tools/edit-file.js +128 -0
  487. package/dist/tools/edit-file.js.map +1 -0
  488. package/dist/tools/format.d.ts +5 -0
  489. package/dist/tools/format.d.ts.map +1 -0
  490. package/dist/tools/format.js +131 -0
  491. package/dist/tools/format.js.map +1 -0
  492. package/dist/tools/git.d.ts +24 -0
  493. package/dist/tools/git.d.ts.map +1 -0
  494. package/dist/tools/git.js +122 -0
  495. package/dist/tools/git.js.map +1 -0
  496. package/dist/tools/glob.d.ts +12 -0
  497. package/dist/tools/glob.d.ts.map +1 -0
  498. package/dist/tools/glob.js +55 -0
  499. package/dist/tools/glob.js.map +1 -0
  500. package/dist/tools/grep.d.ts +19 -0
  501. package/dist/tools/grep.d.ts.map +1 -0
  502. package/dist/tools/grep.js +97 -0
  503. package/dist/tools/grep.js.map +1 -0
  504. package/dist/tools/init.d.ts +3 -0
  505. package/dist/tools/init.d.ts.map +1 -0
  506. package/dist/tools/init.js +66 -0
  507. package/dist/tools/init.js.map +1 -0
  508. package/dist/tools/list-dir.d.ts +16 -0
  509. package/dist/tools/list-dir.d.ts.map +1 -0
  510. package/dist/tools/list-dir.js +107 -0
  511. package/dist/tools/list-dir.js.map +1 -0
  512. package/dist/tools/move-file.d.ts +13 -0
  513. package/dist/tools/move-file.d.ts.map +1 -0
  514. package/dist/tools/move-file.js +100 -0
  515. package/dist/tools/move-file.js.map +1 -0
  516. package/dist/tools/read-file.d.ts +14 -0
  517. package/dist/tools/read-file.d.ts.map +1 -0
  518. package/dist/tools/read-file.js +99 -0
  519. package/dist/tools/read-file.js.map +1 -0
  520. package/dist/tools/registry.d.ts +10 -0
  521. package/dist/tools/registry.d.ts.map +1 -0
  522. package/dist/tools/registry.js +30 -0
  523. package/dist/tools/registry.js.map +1 -0
  524. package/dist/tools/run-command.d.ts +17 -0
  525. package/dist/tools/run-command.d.ts.map +1 -0
  526. package/dist/tools/run-command.js +73 -0
  527. package/dist/tools/run-command.js.map +1 -0
  528. package/dist/tools/run-tests.d.ts +16 -0
  529. package/dist/tools/run-tests.d.ts.map +1 -0
  530. package/dist/tools/run-tests.js +140 -0
  531. package/dist/tools/run-tests.js.map +1 -0
  532. package/dist/tools/web-browse.d.ts +10 -0
  533. package/dist/tools/web-browse.d.ts.map +1 -0
  534. package/dist/tools/web-browse.js +45 -0
  535. package/dist/tools/web-browse.js.map +1 -0
  536. package/dist/tools/web-fetch.d.ts +11 -0
  537. package/dist/tools/web-fetch.d.ts.map +1 -0
  538. package/dist/tools/web-fetch.js +43 -0
  539. package/dist/tools/web-fetch.js.map +1 -0
  540. package/dist/tools/web-search.d.ts +12 -0
  541. package/dist/tools/web-search.d.ts.map +1 -0
  542. package/dist/tools/web-search.js +52 -0
  543. package/dist/tools/web-search.js.map +1 -0
  544. package/dist/tools/write-file.d.ts +13 -0
  545. package/dist/tools/write-file.d.ts.map +1 -0
  546. package/dist/tools/write-file.js +100 -0
  547. package/dist/tools/write-file.js.map +1 -0
  548. package/dist/types/errors.d.ts +14 -0
  549. package/dist/types/errors.d.ts.map +1 -0
  550. package/dist/types/errors.js +55 -0
  551. package/dist/types/errors.js.map +1 -0
  552. package/dist/types/index.d.ts +267 -0
  553. package/dist/types/index.d.ts.map +1 -0
  554. package/dist/types/index.js +38 -0
  555. package/dist/types/index.js.map +1 -0
  556. package/dist/ui/chat.d.ts +89 -0
  557. package/dist/ui/chat.d.ts.map +1 -0
  558. package/dist/ui/chat.js +311 -0
  559. package/dist/ui/chat.js.map +1 -0
  560. package/dist/ui/public/app.js +2113 -0
  561. package/dist/ui/public/index.html +78 -0
  562. package/dist/ui/public/styles.css +1703 -0
  563. package/dist/ui/server-errors.d.ts +24 -0
  564. package/dist/ui/server-errors.d.ts.map +1 -0
  565. package/dist/ui/server-errors.js +31 -0
  566. package/dist/ui/server-errors.js.map +1 -0
  567. package/dist/ui/server.d.ts +10 -0
  568. package/dist/ui/server.d.ts.map +1 -0
  569. package/dist/ui/server.js +815 -0
  570. package/dist/ui/server.js.map +1 -0
  571. package/dist/ui/task-runner.d.ts +71 -0
  572. package/dist/ui/task-runner.d.ts.map +1 -0
  573. package/dist/ui/task-runner.js +334 -0
  574. package/dist/ui/task-runner.js.map +1 -0
  575. package/dist/web/browse.d.ts +35 -0
  576. package/dist/web/browse.d.ts.map +1 -0
  577. package/dist/web/browse.js +166 -0
  578. package/dist/web/browse.js.map +1 -0
  579. package/dist/web/fetch.d.ts +18 -0
  580. package/dist/web/fetch.d.ts.map +1 -0
  581. package/dist/web/fetch.js +107 -0
  582. package/dist/web/fetch.js.map +1 -0
  583. package/dist/web/sanitize.d.ts +8 -0
  584. package/dist/web/sanitize.d.ts.map +1 -0
  585. package/dist/web/sanitize.js +58 -0
  586. package/dist/web/sanitize.js.map +1 -0
  587. package/dist/web/search.d.ts +12 -0
  588. package/dist/web/search.d.ts.map +1 -0
  589. package/dist/web/search.js +124 -0
  590. package/dist/web/search.js.map +1 -0
  591. package/install/install.ps1 +46 -0
  592. package/install/install.sh +72 -0
  593. package/package.json +89 -0
  594. package/scripts/bundle.js +26 -0
  595. package/scripts/copy-assets.js +33 -0
  596. package/scripts/link.sh +79 -0
  597. package/scripts/metrics.sh +33 -0
  598. package/scripts/postinstall.js +36 -0
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Web UI chat — thin wrapper around the unified conversation module.
3
+ *
4
+ * Everything about session storage, event schema, and replay lives in
5
+ * src/core/conversation.ts. This module handles only:
6
+ * • Turn dispatch: composing the description, creating the task, relating
7
+ * the resulting task id back to the turn so `attachResult` can match.
8
+ * • Broadcasting: fan-out of conversation events to connected WebSocket
9
+ * subscribers so open browser tabs update live.
10
+ * • Task resolution bridge: when the task runner reports a task finished,
11
+ * find the owning conversation and persist the result.
12
+ *
13
+ * State is read from disk on every request. This means multiple UI server
14
+ * processes (load-balanced, say) see each other's writes without a shared
15
+ * coordinator — the file system IS the coordinator.
16
+ */
17
+ import { RunRequest } from './task-runner';
18
+ import { Mode } from '../types';
19
+ import { Conversation, ConversationSource, ConversationTurn, TurnStatus, findConversationFile } from '../core/conversation';
20
+ import { ConversationUpdate } from '../core/conversation';
21
+ type BroadcastFn = (ev: ConversationUpdate) => void;
22
+ /**
23
+ * Close every active conversation watcher and drop every broadcaster. Called
24
+ * during UI server shutdown so the process can exit cleanly. Idempotent.
25
+ */
26
+ export declare const closeAllConversationWatchers: () => void;
27
+ /**
28
+ * Subscribe to conversation events for live push. Returns an unsubscribe
29
+ * function. Project path is needed so we know where the file lives.
30
+ */
31
+ export declare const subscribeConversation: (projectPath: string, conversationId: string, cb: BroadcastFn) => (() => void);
32
+ export interface SessionListEntry {
33
+ id: string;
34
+ source: ConversationSource;
35
+ title: string;
36
+ mode: Mode;
37
+ turns: number;
38
+ createdAt: string;
39
+ lastAt: string;
40
+ }
41
+ export declare const listChatSessions: (projectPath?: string) => SessionListEntry[];
42
+ export declare const getChatSession: (projectPath: string, id: string) => Conversation | null;
43
+ export interface CreateSessionOpts {
44
+ projectPath: string;
45
+ title?: string;
46
+ mode?: Mode;
47
+ source?: ConversationSource;
48
+ }
49
+ export declare const createChatSession: (opts: CreateSessionOpts) => Promise<Conversation>;
50
+ export declare const renameChatSession: (projectPath: string, id: string, title: string) => Promise<Conversation | null>;
51
+ export declare const deleteChatSession: (projectPath: string, id: string) => boolean;
52
+ export interface AddTurnRequest {
53
+ projectPath: string;
54
+ conversationId: string;
55
+ input: string;
56
+ mode?: Mode;
57
+ autoApprove?: boolean;
58
+ flags?: RunRequest['flags'];
59
+ }
60
+ export interface AddTurnReply {
61
+ turn: ConversationTurn;
62
+ taskId: string;
63
+ }
64
+ /** Add a user turn, kick off an orchestrator task, return the turn + taskId.
65
+ * The turn is persisted synchronously before the task is scheduled, so if
66
+ * the task creation fails the turn still appears in the history. */
67
+ export declare const addTurn: (req: AddTurnRequest) => Promise<AddTurnReply>;
68
+ /**
69
+ * Record a task's final result into its owning conversation. Called by the
70
+ * task runner via its onTaskResolved observer. The writer is synchronous so
71
+ * callers that can't await still land the update.
72
+ *
73
+ * If the in-memory map is missing the task id (server restart, task was
74
+ * registered in a previous process, etc.), fall back to a disk scan.
75
+ */
76
+ export declare const attachResultForTask: (taskId: string, result: {
77
+ success: boolean;
78
+ summary: string;
79
+ filesChanged: string[];
80
+ durationMs: number;
81
+ costUsd?: number;
82
+ }, status: TurnStatus) => void;
83
+ /** Exported for tests. Remove stale entries right now. */
84
+ export declare const _sweepTaskIndexForTesting: () => void;
85
+ /** Exported for tests. Size of the in-memory index. */
86
+ export declare const _taskIndexSize: () => number;
87
+ export type { Conversation, ConversationSummary, ConversationTurn, ConversationUpdate, } from '../core/conversation';
88
+ export { findConversationFile };
89
+ //# sourceMappingURL=chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/ui/chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,311 @@
1
+ "use strict";
2
+ /**
3
+ * Web UI chat — thin wrapper around the unified conversation module.
4
+ *
5
+ * Everything about session storage, event schema, and replay lives in
6
+ * src/core/conversation.ts. This module handles only:
7
+ * • Turn dispatch: composing the description, creating the task, relating
8
+ * the resulting task id back to the turn so `attachResult` can match.
9
+ * • Broadcasting: fan-out of conversation events to connected WebSocket
10
+ * subscribers so open browser tabs update live.
11
+ * • Task resolution bridge: when the task runner reports a task finished,
12
+ * find the owning conversation and persist the result.
13
+ *
14
+ * State is read from disk on every request. This means multiple UI server
15
+ * processes (load-balanced, say) see each other's writes without a shared
16
+ * coordinator — the file system IS the coordinator.
17
+ */
18
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ var desc = Object.getOwnPropertyDescriptor(m, k);
21
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
22
+ desc = { enumerable: true, get: function() { return m[k]; } };
23
+ }
24
+ Object.defineProperty(o, k2, desc);
25
+ }) : (function(o, m, k, k2) {
26
+ if (k2 === undefined) k2 = k;
27
+ o[k2] = m[k];
28
+ }));
29
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
30
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
31
+ }) : function(o, v) {
32
+ o["default"] = v;
33
+ });
34
+ var __importStar = (this && this.__importStar) || (function () {
35
+ var ownKeys = function(o) {
36
+ ownKeys = Object.getOwnPropertyNames || function (o) {
37
+ var ar = [];
38
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
39
+ return ar;
40
+ };
41
+ return ownKeys(o);
42
+ };
43
+ return function (mod) {
44
+ if (mod && mod.__esModule) return mod;
45
+ var result = {};
46
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
47
+ __setModuleDefault(result, mod);
48
+ return result;
49
+ };
50
+ })();
51
+ Object.defineProperty(exports, "__esModule", { value: true });
52
+ exports.findConversationFile = exports._taskIndexSize = exports._sweepTaskIndexForTesting = exports.attachResultForTask = exports.addTurn = exports.deleteChatSession = exports.renameChatSession = exports.createChatSession = exports.getChatSession = exports.listChatSessions = exports.subscribeConversation = exports.closeAllConversationWatchers = void 0;
53
+ const fs = __importStar(require("fs"));
54
+ const path = __importStar(require("path"));
55
+ const task_runner_1 = require("./task-runner");
56
+ const paths_1 = require("../config/paths");
57
+ const conversation_1 = require("../core/conversation");
58
+ Object.defineProperty(exports, "findConversationFile", { enumerable: true, get: function () { return conversation_1.findConversationFile; } });
59
+ const logger_1 = require("../logging/logger");
60
+ const broadcasters = new Map();
61
+ const watchers = new Map();
62
+ const ensureWatcher = (projectPath, id) => {
63
+ const existing = watchers.get(id);
64
+ if (existing) {
65
+ existing.refs++;
66
+ return;
67
+ }
68
+ const w = (0, conversation_1.watchConversationFile)(projectPath, id, (update) => {
69
+ const subs = broadcasters.get(id);
70
+ if (!subs)
71
+ return;
72
+ for (const cb of subs) {
73
+ try {
74
+ cb(update);
75
+ }
76
+ catch (err) {
77
+ logger_1.log.warn('chat broadcaster callback failed', { err: String(err) });
78
+ }
79
+ }
80
+ });
81
+ watchers.set(id, { close: () => w.close(), refs: 1 });
82
+ };
83
+ const releaseWatcher = (id) => {
84
+ const w = watchers.get(id);
85
+ if (!w)
86
+ return;
87
+ w.refs--;
88
+ if (w.refs <= 0) {
89
+ try {
90
+ w.close();
91
+ }
92
+ catch {
93
+ /* ignore */
94
+ }
95
+ watchers.delete(id);
96
+ }
97
+ };
98
+ /**
99
+ * Close every active conversation watcher and drop every broadcaster. Called
100
+ * during UI server shutdown so the process can exit cleanly. Idempotent.
101
+ */
102
+ const closeAllConversationWatchers = () => {
103
+ for (const [id, w] of watchers) {
104
+ try {
105
+ w.close();
106
+ }
107
+ catch {
108
+ /* ignore */
109
+ }
110
+ watchers.delete(id);
111
+ }
112
+ broadcasters.clear();
113
+ };
114
+ exports.closeAllConversationWatchers = closeAllConversationWatchers;
115
+ /**
116
+ * Subscribe to conversation events for live push. Returns an unsubscribe
117
+ * function. Project path is needed so we know where the file lives.
118
+ */
119
+ const subscribeConversation = (projectPath, conversationId, cb) => {
120
+ let set = broadcasters.get(conversationId);
121
+ if (!set) {
122
+ set = new Set();
123
+ broadcasters.set(conversationId, set);
124
+ }
125
+ set.add(cb);
126
+ ensureWatcher(projectPath, conversationId);
127
+ return () => {
128
+ set?.delete(cb);
129
+ if (set && set.size === 0)
130
+ broadcasters.delete(conversationId);
131
+ releaseWatcher(conversationId);
132
+ };
133
+ };
134
+ exports.subscribeConversation = subscribeConversation;
135
+ // ---------- Read-side ----------
136
+ const listChatSessions = (projectPath) => {
137
+ if (!projectPath)
138
+ return [];
139
+ return (0, conversation_1.listConversations)(projectPath).map((s) => ({
140
+ id: s.id,
141
+ source: s.source,
142
+ title: s.title,
143
+ mode: s.mode,
144
+ turns: s.turns,
145
+ createdAt: s.createdAt,
146
+ lastAt: s.lastAt,
147
+ }));
148
+ };
149
+ exports.listChatSessions = listChatSessions;
150
+ const getChatSession = (projectPath, id) => (0, conversation_1.loadConversation)(projectPath, id);
151
+ exports.getChatSession = getChatSession;
152
+ const createChatSession = async (opts) => (0, conversation_1.createConversation)({
153
+ projectPath: opts.projectPath,
154
+ title: opts.title,
155
+ mode: opts.mode,
156
+ source: opts.source ?? 'chat',
157
+ });
158
+ exports.createChatSession = createChatSession;
159
+ const renameChatSession = async (projectPath, id, title) => {
160
+ const existing = (0, conversation_1.loadConversation)(projectPath, id);
161
+ if (!existing)
162
+ return null;
163
+ await (0, conversation_1.renameConversation)(projectPath, id, title);
164
+ return (0, conversation_1.loadConversation)(projectPath, id);
165
+ };
166
+ exports.renameChatSession = renameChatSession;
167
+ const deleteChatSession = (projectPath, id) => {
168
+ return (0, conversation_1.deleteConversation)(projectPath, id);
169
+ };
170
+ exports.deleteChatSession = deleteChatSession;
171
+ /** Add a user turn, kick off an orchestrator task, return the turn + taskId.
172
+ * The turn is persisted synchronously before the task is scheduled, so if
173
+ * the task creation fails the turn still appears in the history. */
174
+ const addTurn = async (req) => {
175
+ const session = (0, conversation_1.loadConversation)(req.projectPath, req.conversationId);
176
+ if (!session)
177
+ throw new Error(`chat session ${req.conversationId} not found`);
178
+ const turn = {
179
+ id: (0, conversation_1.newTurnId)(),
180
+ at: new Date().toISOString(),
181
+ input: req.input,
182
+ mode: req.mode ?? session.meta.mode,
183
+ status: 'pending',
184
+ };
185
+ await (0, conversation_1.appendUserTurn)(req.projectPath, req.conversationId, turn);
186
+ // Compose prior-turn context for the planner.
187
+ const description = (0, conversation_1.composeDescription)(req.input, session.turns);
188
+ const reply = (0, task_runner_1.startUiTask)({
189
+ prompt: req.input,
190
+ mode: turn.mode,
191
+ cwd: req.projectPath,
192
+ autoApprove: req.autoApprove,
193
+ flags: req.flags,
194
+ title: req.input.slice(0, 80),
195
+ description,
196
+ });
197
+ turn.taskId = reply.taskId;
198
+ turn.status = 'running';
199
+ // Remember taskId → {sessionId, turnId} so when the task resolves we can
200
+ // persist the result back to the right turn.
201
+ taskIndex.set(reply.taskId, {
202
+ projectPath: req.projectPath,
203
+ conversationId: req.conversationId,
204
+ turnId: turn.id,
205
+ addedAt: Date.now(),
206
+ });
207
+ return { turn, taskId: reply.taskId };
208
+ };
209
+ exports.addTurn = addTurn;
210
+ const taskIndex = new Map();
211
+ /** Entries older than this are considered stale and get swept. Prevents the
212
+ * map from growing unboundedly when tasks never resolve (cancelled,
213
+ * crashed, etc.). */
214
+ const TASK_INDEX_TTL_MS = 60 * 60 * 1000; // 1 hour
215
+ const sweepTaskIndex = () => {
216
+ const now = Date.now();
217
+ for (const [k, v] of taskIndex) {
218
+ if (now - v.addedAt > TASK_INDEX_TTL_MS)
219
+ taskIndex.delete(k);
220
+ }
221
+ };
222
+ /**
223
+ * Fallback: when onTaskResolved fires for a task the in-memory index has
224
+ * forgotten (server restart between addTurn and task resolution), scan every
225
+ * conversation in every project for a turn with a matching taskId. Slower
226
+ * but bounded — we only look in one project per resolve (caller may pass a
227
+ * project path via search), and sessions/ dirs are small.
228
+ *
229
+ * We can't know the project path from taskId alone, so we scan all known
230
+ * projects in FORGE_HOME/projects via the runtime paths module.
231
+ */
232
+ const findTurnByTaskId = (taskId) => {
233
+ // Iterate known project roots. We don't have a registry of project paths;
234
+ // however the `listConversations` helper works on one project at a time.
235
+ // To make the scan scalable we walk FORGE_HOME/projects and invert the
236
+ // hashed path by reading metadata.json where present.
237
+ const projectsRoot = paths_1.paths.projects;
238
+ if (!fs.existsSync(projectsRoot))
239
+ return null;
240
+ for (const entry of fs.readdirSync(projectsRoot)) {
241
+ const metaFile = path.join(projectsRoot, entry, 'metadata.json');
242
+ let projectPath = null;
243
+ try {
244
+ if (fs.existsSync(metaFile)) {
245
+ const meta = JSON.parse(fs.readFileSync(metaFile, 'utf8'));
246
+ if (typeof meta.path === 'string')
247
+ projectPath = meta.path;
248
+ }
249
+ }
250
+ catch {
251
+ /* skip malformed metadata */
252
+ }
253
+ if (!projectPath)
254
+ continue;
255
+ try {
256
+ const summaries = (0, conversation_1.listConversations)(projectPath);
257
+ for (const s of summaries) {
258
+ const conv = (0, conversation_1.loadConversation)(projectPath, s.id);
259
+ if (!conv)
260
+ continue;
261
+ const t = conv.turns.find((x) => x.taskId === taskId);
262
+ if (t)
263
+ return { projectPath, conversationId: conv.meta.id, turnId: t.id };
264
+ }
265
+ }
266
+ catch {
267
+ /* keep scanning */
268
+ }
269
+ }
270
+ return null;
271
+ };
272
+ /**
273
+ * Record a task's final result into its owning conversation. Called by the
274
+ * task runner via its onTaskResolved observer. The writer is synchronous so
275
+ * callers that can't await still land the update.
276
+ *
277
+ * If the in-memory map is missing the task id (server restart, task was
278
+ * registered in a previous process, etc.), fall back to a disk scan.
279
+ */
280
+ const attachResultForTask = (taskId, result, status) => {
281
+ sweepTaskIndex();
282
+ let loc = taskIndex.get(taskId) ?? null;
283
+ if (!loc) {
284
+ const scanned = findTurnByTaskId(taskId);
285
+ if (!scanned)
286
+ return; // truly not a chat-owned task
287
+ loc = { ...scanned, addedAt: Date.now() };
288
+ }
289
+ try {
290
+ (0, conversation_1.attachTurnResultSync)(loc.projectPath, loc.conversationId, {
291
+ turnId: loc.turnId,
292
+ taskId,
293
+ result: { taskId, ...result },
294
+ status,
295
+ });
296
+ }
297
+ catch (err) {
298
+ logger_1.log.warn('chat: attach result failed', { err: String(err), taskId });
299
+ }
300
+ finally {
301
+ taskIndex.delete(taskId);
302
+ }
303
+ };
304
+ exports.attachResultForTask = attachResultForTask;
305
+ /** Exported for tests. Remove stale entries right now. */
306
+ const _sweepTaskIndexForTesting = () => sweepTaskIndex();
307
+ exports._sweepTaskIndexForTesting = _sweepTaskIndexForTesting;
308
+ /** Exported for tests. Size of the in-memory index. */
309
+ const _taskIndexSize = () => taskIndex.size;
310
+ exports._taskIndexSize = _taskIndexSize;
311
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/ui/chat.ts"],"names":[],"mappings":"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"}