@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,159 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.clearSession = exports.assertAllowed = exports.requestPermission = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const prompts_1 = __importDefault(require("prompts"));
9
+ const errors_1 = require("../types/errors");
10
+ const index_db_1 = require("../persistence/index-db");
11
+ const risk_1 = require("./risk");
12
+ const logger_1 = require("../logging/logger");
13
+ const loader_1 = require("../config/loader");
14
+ const interactive_host_1 = require("../core/interactive-host");
15
+ const session = {
16
+ grants: new Map(),
17
+ approvals: new Map(),
18
+ denyCache: new Set(),
19
+ };
20
+ const checkBlanketFlags = (req, flags) => {
21
+ if (flags.strict)
22
+ return null; // fall through to normal prompt
23
+ if (req.sideEffect === 'write' && flags.allowFiles)
24
+ return 'allow_session';
25
+ if (req.sideEffect === 'execute' && flags.allowShell)
26
+ return 'allow_session';
27
+ if (req.sideEffect === 'network') {
28
+ if (req.tool.startsWith('web.') && flags.allowWeb)
29
+ return 'allow_session';
30
+ if (req.tool.startsWith('mcp.') && flags.allowMcp)
31
+ return 'allow_session';
32
+ if (flags.allowNetwork)
33
+ return 'allow_session';
34
+ }
35
+ return null;
36
+ };
37
+ const tryCachedGrant = (req) => {
38
+ // Session cache
39
+ const sessionKey = req.tool;
40
+ const cached = session.grants.get(sessionKey);
41
+ if (cached === 'session' || cached === 'project' || cached === 'global') {
42
+ return 'allow_session';
43
+ }
44
+ // Persistent grants (project + global scopes)
45
+ const grants = (0, index_db_1.loadPermissionGrants)(req.tool, req.projectId);
46
+ for (const g of grants) {
47
+ if (g.scope === 'global' || g.scope === 'project') {
48
+ return 'allow_session';
49
+ }
50
+ }
51
+ return null;
52
+ };
53
+ const promptUser = async (req) => {
54
+ const header = chalk_1.default.bold.yellow('🔐 Permission required');
55
+ const risk = chalk_1.default.dim(`[${req.risk}/${req.sideEffect}]`);
56
+ process.stdout.write(`\n${header} ${risk}\n tool: ${chalk_1.default.cyan(req.tool)}\n action: ${req.action}\n${req.target ? ` target: ${req.target}\n` : ''}`);
57
+ const choices = [
58
+ { title: 'Allow once', value: 'allow' },
59
+ { title: 'Allow for this session', value: 'allow_session' },
60
+ { title: 'Deny', value: 'deny' },
61
+ ];
62
+ // Only non-high-risk tools can be saved as persistent grants.
63
+ if (req.risk !== 'critical' && req.risk !== 'high') {
64
+ choices.splice(2, 0, { title: 'Allow for this project (remember)', value: 'allow_project' });
65
+ }
66
+ const resp = await (0, prompts_1.default)({
67
+ type: 'select',
68
+ name: 'value',
69
+ message: 'Decision',
70
+ choices,
71
+ initial: 0,
72
+ });
73
+ if (!resp || !resp.value)
74
+ return 'deny';
75
+ if (resp.value === 'allow_project') {
76
+ (0, index_db_1.savePermissionGrant)({
77
+ tool: req.tool,
78
+ project_id: req.projectId,
79
+ scope: 'project',
80
+ granted_at: new Date().toISOString(),
81
+ expires_at: null,
82
+ });
83
+ return 'allow_session';
84
+ }
85
+ return resp.value;
86
+ };
87
+ const requestPermission = async (req, flags = {}) => {
88
+ // Blocked critical risk: even strict approval mode should surface, but we
89
+ // still prompt if interactive — operator must acknowledge.
90
+ if (session.denyCache.has(req.tool)) {
91
+ return 'deny';
92
+ }
93
+ // Delegate to the interactive host first (UI / custom frontends).
94
+ const host = (0, interactive_host_1.currentHost)();
95
+ if (host) {
96
+ const decision = await host.requestPermission(req, flags);
97
+ if (decision === 'allow' || decision === 'allow_session') {
98
+ session.grants.set(req.tool, decision === 'allow' ? 'once' : 'session');
99
+ session.approvals.set(req.tool, (session.approvals.get(req.tool) ?? 0) + 1);
100
+ }
101
+ else if (decision === 'deny') {
102
+ session.denyCache.add(req.tool);
103
+ }
104
+ return decision;
105
+ }
106
+ const blanket = checkBlanketFlags(req, flags);
107
+ if (blanket && !(0, risk_1.shouldAlwaysAsk)({ risk: req.risk, sideEffect: req.sideEffect }, true)) {
108
+ return blanket;
109
+ }
110
+ // Cached decision
111
+ const cached = tryCachedGrant(req);
112
+ if (cached && !(0, risk_1.shouldAlwaysAsk)({ risk: req.risk, sideEffect: req.sideEffect }, true)) {
113
+ return cached;
114
+ }
115
+ const cfg = (0, loader_1.loadGlobalConfig)();
116
+ const trustThreshold = cfg.permissions.trust.autoAllowAfter;
117
+ const approvals = session.approvals.get(req.tool) ?? 0;
118
+ if (!(0, risk_1.shouldAlwaysAsk)({ risk: req.risk, sideEffect: req.sideEffect }, true) &&
119
+ flags.skipRoutine &&
120
+ approvals >= trustThreshold) {
121
+ logger_1.log.debug('trust-calibration auto-allow', { tool: req.tool, approvals });
122
+ return 'allow_session';
123
+ }
124
+ // At this point we need to prompt (or we're non-interactive).
125
+ if (flags.nonInteractive) {
126
+ if (req.risk === 'low' && flags.skipRoutine)
127
+ return 'allow_session';
128
+ logger_1.log.warn('permission denied: non-interactive', { tool: req.tool, risk: req.risk });
129
+ return 'deny';
130
+ }
131
+ const decision = await promptUser(req);
132
+ if (decision === 'allow' || decision === 'allow_session') {
133
+ session.grants.set(req.tool, decision === 'allow' ? 'once' : 'session');
134
+ session.approvals.set(req.tool, approvals + 1);
135
+ }
136
+ else if (decision === 'deny') {
137
+ session.denyCache.add(req.tool);
138
+ }
139
+ return decision;
140
+ };
141
+ exports.requestPermission = requestPermission;
142
+ const assertAllowed = async (req, flags = {}) => {
143
+ const d = await (0, exports.requestPermission)(req, flags);
144
+ if (d === 'deny' || d === 'ask') {
145
+ throw new errors_1.ForgeRuntimeError({
146
+ class: 'permission_denied',
147
+ message: `Permission denied for ${req.tool} (${req.action}).`,
148
+ retryable: false,
149
+ });
150
+ }
151
+ };
152
+ exports.assertAllowed = assertAllowed;
153
+ const clearSession = () => {
154
+ session.grants.clear();
155
+ session.approvals.clear();
156
+ session.denyCache.clear();
157
+ };
158
+ exports.clearSession = clearSession;
159
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/permissions/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { Risk, SideEffect, Tool, ToolSchema } from '../types';
2
+ /**
3
+ * Risk-scoring helpers. Called whenever we need a decision about whether a
4
+ * tool invocation is routine or needs explicit approval.
5
+ */
6
+ export declare const riskRank: (r: Risk) => number;
7
+ export declare const maxRisk: (a: Risk, b: Risk) => Risk;
8
+ export declare const requiresExplicitApproval: (schema: ToolSchema) => boolean;
9
+ export declare const mergeRisk: (toolRisk: Risk, actionRisk: Risk) => Risk;
10
+ export declare const shouldAlwaysAsk: (tool: Pick<ToolSchema, "risk" | "sideEffect">, skipRoutinePrompts: boolean) => boolean;
11
+ export declare const describeSideEffect: (side: SideEffect) => string;
12
+ export declare const summarizeTool: (tool: Tool) => string;
13
+ //# sourceMappingURL=risk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk.d.ts","sourceRoot":"","sources":["../../src/permissions/risk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE9D;;;GAGG;AACH,eAAO,MAAM,QAAQ,GAAI,GAAG,IAAI,KAAG,MAC0B,CAAC;AAE9D,eAAO,MAAM,OAAO,GAAI,GAAG,IAAI,EAAE,GAAG,IAAI,KAAG,IAA4C,CAAC;AAExF,eAAO,MAAM,wBAAwB,GAAI,QAAQ,UAAU,KAAG,OAI7D,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,UAAU,IAAI,EAAE,YAAY,IAAI,KAAG,IAAqC,CAAC;AAEnG,eAAO,MAAM,eAAe,GAC1B,MAAM,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAAC,EAC7C,oBAAoB,OAAO,KAC1B,OAOF,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,MAAM,UAAU,KAAG,MAO5C,CAAC;AAEX,eAAO,MAAM,aAAa,GAAI,MAAM,IAAI,KAAG,MACwD,CAAC"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.summarizeTool = exports.describeSideEffect = exports.shouldAlwaysAsk = exports.mergeRisk = exports.requiresExplicitApproval = exports.maxRisk = exports.riskRank = void 0;
4
+ /**
5
+ * Risk-scoring helpers. Called whenever we need a decision about whether a
6
+ * tool invocation is routine or needs explicit approval.
7
+ */
8
+ const riskRank = (r) => ({ low: 0, medium: 1, high: 2, critical: 3 })[r];
9
+ exports.riskRank = riskRank;
10
+ const maxRisk = (a, b) => ((0, exports.riskRank)(a) >= (0, exports.riskRank)(b) ? a : b);
11
+ exports.maxRisk = maxRisk;
12
+ const requiresExplicitApproval = (schema) => {
13
+ if (schema.risk === 'critical' || schema.risk === 'high')
14
+ return true;
15
+ if (schema.sideEffect === 'execute' || schema.sideEffect === 'network')
16
+ return true;
17
+ return false;
18
+ };
19
+ exports.requiresExplicitApproval = requiresExplicitApproval;
20
+ const mergeRisk = (toolRisk, actionRisk) => (0, exports.maxRisk)(toolRisk, actionRisk);
21
+ exports.mergeRisk = mergeRisk;
22
+ const shouldAlwaysAsk = (tool, skipRoutinePrompts) => {
23
+ // `--skip-permissions` drops only *routine* prompts (low/medium). High-risk
24
+ // and destructive actions always require explicit approval — this matches
25
+ // the spec's baseline in Operational Control §8.4.
26
+ if (tool.risk === 'critical' || tool.risk === 'high')
27
+ return true;
28
+ if (tool.sideEffect === 'execute' || tool.sideEffect === 'network')
29
+ return true;
30
+ return !skipRoutinePrompts;
31
+ };
32
+ exports.shouldAlwaysAsk = shouldAlwaysAsk;
33
+ const describeSideEffect = (side) => ({
34
+ pure: 'no side effect',
35
+ readonly: 'reads only',
36
+ write: 'writes files',
37
+ network: 'makes network calls',
38
+ execute: 'executes shell commands',
39
+ })[side];
40
+ exports.describeSideEffect = describeSideEffect;
41
+ const summarizeTool = (tool) => `${tool.schema.name} [${tool.schema.risk}/${tool.schema.sideEffect}]: ${tool.schema.description}`;
42
+ exports.summarizeTool = summarizeTool;
43
+ //# sourceMappingURL=risk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk.js","sourceRoot":"","sources":["../../src/permissions/risk.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACI,MAAM,QAAQ,GAAG,CAAC,CAAO,EAAU,EAAE,CACzC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAW,CAAC,CAAC,CAAC,CAAC;AADjD,QAAA,QAAQ,YACyC;AAEvD,MAAM,OAAO,GAAG,CAAC,CAAO,EAAE,CAAO,EAAQ,EAAE,CAAC,CAAC,IAAA,gBAAQ,EAAC,CAAC,CAAC,IAAI,IAAA,gBAAQ,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAA3E,QAAA,OAAO,WAAoE;AAEjF,MAAM,wBAAwB,GAAG,CAAC,MAAkB,EAAW,EAAE;IACtE,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACtE,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACpF,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAJW,QAAA,wBAAwB,4BAInC;AAEK,MAAM,SAAS,GAAG,CAAC,QAAc,EAAE,UAAgB,EAAQ,EAAE,CAAC,IAAA,eAAO,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AAAtF,QAAA,SAAS,aAA6E;AAE5F,MAAM,eAAe,GAAG,CAC7B,IAA6C,EAC7C,kBAA2B,EAClB,EAAE;IACX,4EAA4E;IAC5E,0EAA0E;IAC1E,mDAAmD;IACnD,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAClE,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAChF,OAAO,CAAC,kBAAkB,CAAC;AAC7B,CAAC,CAAC;AAVW,QAAA,eAAe,mBAU1B;AAEK,MAAM,kBAAkB,GAAG,CAAC,IAAgB,EAAU,EAAE,CAC7D,CAAC;IACC,IAAI,EAAE,gBAAgB;IACtB,QAAQ,EAAE,YAAY;IACtB,KAAK,EAAE,cAAc;IACrB,OAAO,EAAE,qBAAqB;IAC9B,OAAO,EAAE,yBAAyB;CACnC,CAAC,CAAC,IAAI,CAAC,CAAC;AAPE,QAAA,kBAAkB,sBAOpB;AAEJ,MAAM,aAAa,GAAG,CAAC,IAAU,EAAU,EAAE,CAClD,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;AADvF,QAAA,aAAa,iBAC0E"}
@@ -0,0 +1,9 @@
1
+ export interface CompressionResult {
2
+ compressed: number;
3
+ bytesReclaimed: number;
4
+ }
5
+ export declare const compressAgedSessions: (projectRoot: string, options?: {
6
+ olderThanDays?: number;
7
+ }) => CompressionResult;
8
+ export declare const listArchived: (limit?: number) => unknown[];
9
+ //# sourceMappingURL=compression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compression.d.ts","sourceRoot":"","sources":["../../src/persistence/compression.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAkCD,eAAO,MAAM,oBAAoB,GAC/B,aAAa,MAAM,EACnB,UAAS;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,KACvC,iBAiCF,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,cAAU,cAOtC,CAAC"}
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.listArchived = exports.compressAgedSessions = void 0;
37
+ /**
38
+ * Session compression / summarization. Periodically (from the daemon) aged
39
+ * JSONL sessions are summarized into a one-line synopsis so we can drop the
40
+ * raw file. The synopsis goes into the SQLite `sessions` table for fast
41
+ * lookup and cross-project search without paying full replay cost.
42
+ */
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ const paths_1 = require("../config/paths");
46
+ const index_db_1 = require("../persistence/index-db");
47
+ const redact_1 = require("../security/redact");
48
+ const logger_1 = require("../logging/logger");
49
+ const migrate = () => {
50
+ // Base `sessions` table exists already.
51
+ (0, index_db_1.getDb)().exec(`
52
+ CREATE TABLE IF NOT EXISTS session_archive (
53
+ project_id TEXT NOT NULL,
54
+ session_id TEXT NOT NULL,
55
+ synopsis TEXT NOT NULL,
56
+ archived_at TEXT NOT NULL,
57
+ PRIMARY KEY (project_id, session_id)
58
+ );
59
+ `);
60
+ };
61
+ const summarize = (entries) => {
62
+ const types = new Map();
63
+ let firstUser = '';
64
+ let lastResult = '';
65
+ for (const line of entries) {
66
+ try {
67
+ const obj = JSON.parse(line);
68
+ types.set(obj.type, (types.get(obj.type) ?? 0) + 1);
69
+ if (obj.type === 'user' && !firstUser)
70
+ firstUser = String(obj.content?.title ?? obj.content ?? '').slice(0, 200);
71
+ if (obj.type === 'result')
72
+ lastResult = String(obj.content?.summary ?? '').slice(0, 200);
73
+ }
74
+ catch {
75
+ /* skip */
76
+ }
77
+ }
78
+ const typeSummary = [...types.entries()].map(([k, v]) => `${k}=${v}`).join(' ');
79
+ return (0, redact_1.redactString)(`"${firstUser}" → ${lastResult} · ${typeSummary}`);
80
+ };
81
+ const compressAgedSessions = (projectRoot, options = {}) => {
82
+ migrate();
83
+ const sub = (0, paths_1.ensureProjectDir)(projectRoot);
84
+ const days = options.olderThanDays ?? 14;
85
+ const cutoff = Date.now() - days * 86_400_000;
86
+ const db = (0, index_db_1.getDb)();
87
+ let compressed = 0;
88
+ let reclaimed = 0;
89
+ if (!fs.existsSync(sub.sessions))
90
+ return { compressed: 0, bytesReclaimed: 0 };
91
+ for (const file of fs.readdirSync(sub.sessions)) {
92
+ if (!file.endsWith('.jsonl'))
93
+ continue;
94
+ const fp = path.join(sub.sessions, file);
95
+ try {
96
+ const stat = fs.statSync(fp);
97
+ if (stat.mtimeMs > cutoff)
98
+ continue;
99
+ const entries = fs.readFileSync(fp, 'utf8').split('\n').filter(Boolean);
100
+ if (entries.length === 0)
101
+ continue;
102
+ const synopsis = summarize(entries);
103
+ const pid = path.basename(projectRoot); // project identity uses hash elsewhere; not needed here for archive
104
+ const sessionId = path.basename(file, '.jsonl');
105
+ db.prepare(`INSERT INTO session_archive (project_id, session_id, synopsis, archived_at)
106
+ VALUES (?, ?, ?, ?)
107
+ ON CONFLICT(project_id, session_id) DO UPDATE SET synopsis = excluded.synopsis, archived_at = excluded.archived_at`).run(pid, sessionId, synopsis, new Date().toISOString());
108
+ reclaimed += stat.size;
109
+ fs.unlinkSync(fp);
110
+ compressed++;
111
+ }
112
+ catch (err) {
113
+ logger_1.log.debug('session compress skip', { file, err: String(err) });
114
+ }
115
+ }
116
+ return { compressed, bytesReclaimed: reclaimed };
117
+ };
118
+ exports.compressAgedSessions = compressAgedSessions;
119
+ const listArchived = (limit = 50) => {
120
+ migrate();
121
+ return (0, index_db_1.getDb)()
122
+ .prepare('SELECT session_id, project_id, synopsis, archived_at FROM session_archive ORDER BY archived_at DESC LIMIT ?')
123
+ .all(limit);
124
+ };
125
+ exports.listArchived = listArchived;
126
+ //# sourceMappingURL=compression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compression.js","sourceRoot":"","sources":["../../src/persistence/compression.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;GAKG;AACH,uCAAyB;AACzB,2CAA6B;AAC7B,2CAAmD;AACnD,sDAAgD;AAChD,+CAAkD;AAClD,8CAAwC;AAOxC,MAAM,OAAO,GAAG,GAAS,EAAE;IACzB,wCAAwC;IACxC,IAAA,gBAAK,GAAE,CAAC,IAAI,CAAC;;;;;;;;GAQZ,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,OAAiB,EAAU,EAAE;IAC9C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACpD,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,SAAS;gBACnC,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC5E,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;gBAAE,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC3F,CAAC;QAAC,MAAM,CAAC;YACP,UAAU;QACZ,CAAC;IACH,CAAC;IACD,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChF,OAAO,IAAA,qBAAY,EAAC,IAAI,SAAS,OAAO,UAAU,MAAM,WAAW,EAAE,CAAC,CAAC;AACzE,CAAC,CAAC;AAEK,MAAM,oBAAoB,GAAG,CAClC,WAAmB,EACnB,UAAsC,EAAE,EACrB,EAAE;IACrB,OAAO,EAAE,CAAC;IACV,MAAM,GAAG,GAAG,IAAA,wBAAgB,EAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,UAAU,CAAC;IAC9C,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAC;IACnB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;IAC9E,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,SAAS;QACvC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC7B,IAAI,IAAI,CAAC,OAAO,GAAG,MAAM;gBAAE,SAAS;YACpC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACxE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACnC,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,oEAAoE;YAC5G,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAChD,EAAE,CAAC,OAAO,CACR;;4HAEoH,CACrH,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;YAC1D,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC;YACvB,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAClB,UAAU,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,YAAG,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;AACnD,CAAC,CAAC;AApCW,QAAA,oBAAoB,wBAoC/B;AAEK,MAAM,YAAY,GAAG,CAAC,KAAK,GAAG,EAAE,EAAE,EAAE;IACzC,OAAO,EAAE,CAAC;IACV,OAAO,IAAA,gBAAK,GAAE;SACX,OAAO,CACN,6GAA6G,CAC9G;SACA,GAAG,CAAC,KAAK,CAAC,CAAC;AAChB,CAAC,CAAC;AAPW,QAAA,YAAY,gBAOvB"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Concurrency-safe JSONL store for conversation files.
3
+ *
4
+ * Shared between the CLI REPL and the UI chat surfaces so multiple writers
5
+ * (multiple terminals, multiple browser tabs, a browser tab + a CLI REPL,
6
+ * tasks spawned by subagents, etc.) can safely append to the same file and
7
+ * observe each other's writes in near real-time.
8
+ *
9
+ * Safety model:
10
+ * • Appends under PIPE_BUF (4 KiB on Linux/macOS) are guaranteed atomic by
11
+ * POSIX O_APPEND: the kernel updates the offset and writes the bytes as
12
+ * one operation, so interleaved writers never corrupt each other's lines.
13
+ * • Larger lines acquire a cooperative lock (mkdir-based, works across
14
+ * processes) before appending.
15
+ * • Readers never acquire locks. They open, read-to-EOF, split on '\n',
16
+ * and skip malformed lines. A writer half-way through writing produces
17
+ * at worst a trailing line without '\n' that is skipped until the next
18
+ * read.
19
+ * • Stale locks (process crashed with lock held) are detected by mtime and
20
+ * recovered automatically.
21
+ *
22
+ * The module has no knowledge of domain types — it deals in strings and
23
+ * `Record<string, unknown>` events. Domain typing lives in
24
+ * src/core/conversation.ts.
25
+ */
26
+ export interface Lock {
27
+ release(): Promise<void>;
28
+ }
29
+ /**
30
+ * Acquire a cooperative lock on `target` using an adjacent `<target>.lock`
31
+ * directory. Atomic `mkdir` is the only POSIX primitive we need. If the lock
32
+ * has been held longer than `timeoutMs`, treat it as stale and steal it.
33
+ */
34
+ export declare const acquireLock: (target: string, timeoutMs?: number) => Promise<Lock>;
35
+ /** Append a single line (newline added if absent). Safe under concurrent
36
+ * writers. Small lines use POSIX atomic append; large lines take a lock. */
37
+ export declare const atomicAppendLine: (filePath: string, line: string) => Promise<void>;
38
+ /** Sync version for code paths that cannot await (e.g. task-runner callbacks
39
+ * on task completion). Same semantics; uses sync fs. */
40
+ export declare const atomicAppendLineSync: (filePath: string, line: string) => void;
41
+ /** Read every complete JSON line from a file. Missing file → []. Corrupted
42
+ * lines are skipped with no error. Safe to run while another process is
43
+ * appending. */
44
+ export declare const readAllLines: <T = unknown>(filePath: string) => T[];
45
+ /** Delta read: given a previous offset, return only NEW complete lines since
46
+ * that offset plus the updated offset. Used by watchers to avoid re-parsing
47
+ * the entire file on every change. */
48
+ export declare const readSince: <T = unknown>(filePath: string, offset: number) => {
49
+ items: T[];
50
+ offset: number;
51
+ };
52
+ export interface ConversationWatcher {
53
+ close(): void;
54
+ }
55
+ /**
56
+ * Watch `filePath` for appended lines. Callback fires with the new events
57
+ * decoded from JSON. Re-entrant: the callback may trigger further writes to
58
+ * the same file without causing reentrancy bugs (the watcher dedupes based
59
+ * on byte offset, not event count).
60
+ *
61
+ * Uses fs.watch with a fs.watchFile fallback — on some network filesystems
62
+ * (and inside Docker mounts on macOS) fs.watch does not fire reliably.
63
+ */
64
+ export declare const watchConversation: <T = unknown>(filePath: string, onAppend: (items: T[]) => void) => ConversationWatcher;
65
+ /** Return the current byte-length of the file, or 0 if missing. */
66
+ export declare const fileSize: (filePath: string) => number;
67
+ //# sourceMappingURL=conversation-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-store.d.ts","sourceRoot":"","sources":["../../src/persistence/conversation-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAmBH,MAAM,WAAW,IAAI;IACnB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAU,QAAQ,MAAM,EAAE,kBAA2B,KAAG,OAAO,CAAC,IAAI,CAsC3F,CAAC;AAIF;4EAC4E;AAC5E,eAAO,MAAM,gBAAgB,GAAU,UAAU,MAAM,EAAE,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAiBnF,CAAC;AAEF;wDACwD;AACxD,eAAO,MAAM,oBAAoB,GAAI,UAAU,MAAM,EAAE,MAAM,MAAM,KAAG,IA8CrE,CAAC;AAIF;;gBAEgB;AAChB,eAAO,MAAM,YAAY,GAAI,CAAC,GAAG,OAAO,EAAE,UAAU,MAAM,KAAG,CAAC,EAoB7D,CAAC;AAEF;;sCAEsC;AACtC,eAAO,MAAM,SAAS,GAAI,CAAC,GAAG,OAAO,EACnC,UAAU,MAAM,EAChB,QAAQ,MAAM,KACb;IAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAuC9B,CAAC;AAIF,MAAM,WAAW,mBAAmB;IAClC,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,GAAI,CAAC,GAAG,OAAO,EAC3C,UAAU,MAAM,EAChB,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,KAC7B,mBAkEF,CAAC;AAIF,mEAAmE;AACnE,eAAO,MAAM,QAAQ,GAAI,UAAU,MAAM,KAAG,MAM3C,CAAC"}