@compilr-dev/cli 0.5.0 → 0.5.1

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 (591) hide show
  1. package/README.md +236 -68
  2. package/dist/.tsbuildinfo.app +1 -0
  3. package/dist/.tsbuildinfo.data +1 -0
  4. package/dist/.tsbuildinfo.domain +1 -0
  5. package/dist/.tsbuildinfo.foundation +1 -0
  6. package/dist/agent.d.ts +61 -4
  7. package/dist/agent.js +241 -245
  8. package/dist/anchors/index.d.ts +1 -1
  9. package/dist/anchors/index.js +1 -1
  10. package/dist/anchors/project-anchors.d.ts +2 -2
  11. package/dist/anchors/project-anchors.js +1 -1
  12. package/dist/auth/api-client.d.ts +124 -0
  13. package/dist/auth/api-client.js +261 -0
  14. package/dist/auth/index.d.ts +172 -0
  15. package/dist/auth/index.js +545 -0
  16. package/dist/auth/storage.d.ts +52 -0
  17. package/dist/auth/storage.js +118 -0
  18. package/dist/changelog/index.d.ts +16 -0
  19. package/dist/changelog/index.js +24 -0
  20. package/dist/changelog/releases.d.ts +17 -0
  21. package/dist/changelog/releases.js +63 -0
  22. package/dist/commands-v2/handlers/auth.d.ts +10 -0
  23. package/dist/commands-v2/handlers/auth.js +118 -0
  24. package/dist/commands-v2/handlers/background.d.ts +14 -0
  25. package/dist/commands-v2/handlers/background.js +276 -0
  26. package/dist/commands-v2/handlers/context.js +266 -81
  27. package/dist/commands-v2/handlers/core.d.ts +1 -0
  28. package/dist/commands-v2/handlers/core.js +133 -8
  29. package/dist/commands-v2/handlers/debug.js +18 -0
  30. package/dist/commands-v2/handlers/delegations.d.ts +8 -0
  31. package/dist/commands-v2/handlers/delegations.js +29 -0
  32. package/dist/commands-v2/handlers/files.d.ts +8 -0
  33. package/dist/commands-v2/handlers/files.js +162 -0
  34. package/dist/commands-v2/handlers/filter.d.ts +9 -0
  35. package/dist/commands-v2/handlers/filter.js +130 -0
  36. package/dist/commands-v2/handlers/games.d.ts +7 -0
  37. package/dist/commands-v2/handlers/games.js +57 -0
  38. package/dist/commands-v2/handlers/index.d.ts +13 -0
  39. package/dist/commands-v2/handlers/index.js +39 -0
  40. package/dist/commands-v2/handlers/mcp.d.ts +8 -0
  41. package/dist/commands-v2/handlers/mcp.js +39 -0
  42. package/dist/commands-v2/handlers/notifications.d.ts +9 -0
  43. package/dist/commands-v2/handlers/notifications.js +34 -0
  44. package/dist/commands-v2/handlers/project.js +244 -23
  45. package/dist/commands-v2/handlers/reset.d.ts +11 -0
  46. package/dist/commands-v2/handlers/reset.js +118 -0
  47. package/dist/commands-v2/handlers/session.d.ts +161 -0
  48. package/dist/commands-v2/handlers/session.js +805 -0
  49. package/dist/commands-v2/handlers/settings.d.ts +2 -0
  50. package/dist/commands-v2/handlers/settings.js +217 -35
  51. package/dist/commands-v2/handlers/tasks.d.ts +5 -0
  52. package/dist/commands-v2/handlers/tasks.js +36 -0
  53. package/dist/commands-v2/handlers/team.d.ts +9 -0
  54. package/dist/commands-v2/handlers/team.js +549 -0
  55. package/dist/commands-v2/handlers/terminals.d.ts +9 -0
  56. package/dist/commands-v2/handlers/terminals.js +34 -0
  57. package/dist/commands-v2/index.d.ts +3 -2
  58. package/dist/commands-v2/index.js +4 -1
  59. package/dist/commands-v2/registry.d.ts +15 -0
  60. package/dist/commands-v2/registry.js +34 -0
  61. package/dist/commands-v2/types.d.ts +81 -3
  62. package/dist/commands.js +13 -0
  63. package/dist/compilr-diff-companion.vsix +0 -0
  64. package/dist/db/index.js +98 -4
  65. package/dist/db/repositories/document-repository.d.ts +2 -0
  66. package/dist/db/repositories/document-repository.js +5 -1
  67. package/dist/db/repositories/index.d.ts +2 -0
  68. package/dist/db/repositories/index.js +1 -0
  69. package/dist/db/repositories/plan-repository.d.ts +101 -0
  70. package/dist/db/repositories/plan-repository.js +275 -0
  71. package/dist/db/repositories/project-repository.d.ts +6 -0
  72. package/dist/db/repositories/project-repository.js +41 -0
  73. package/dist/db/repositories/work-item-repository.d.ts +15 -0
  74. package/dist/db/repositories/work-item-repository.js +69 -4
  75. package/dist/db/schema.d.ts +40 -3
  76. package/dist/db/schema.js +66 -3
  77. package/dist/episodes/index.d.ts +20 -0
  78. package/dist/episodes/index.js +27 -0
  79. package/dist/episodes/recorder.d.ts +51 -0
  80. package/dist/episodes/recorder.js +195 -0
  81. package/dist/episodes/significant-work.d.ts +21 -0
  82. package/dist/episodes/significant-work.js +56 -0
  83. package/dist/episodes/store.d.ts +38 -0
  84. package/dist/episodes/store.js +199 -0
  85. package/dist/episodes/types.d.ts +35 -0
  86. package/dist/episodes/types.js +6 -0
  87. package/dist/episodes/work-at-risk.d.ts +12 -0
  88. package/dist/episodes/work-at-risk.js +38 -0
  89. package/dist/episodes/work-summary-anchor.d.ts +23 -0
  90. package/dist/episodes/work-summary-anchor.js +73 -0
  91. package/dist/games/coins.d.ts +66 -0
  92. package/dist/games/coins.js +165 -0
  93. package/dist/games/game-base.d.ts +84 -0
  94. package/dist/games/game-base.js +204 -0
  95. package/dist/games/index.d.ts +16 -0
  96. package/dist/games/index.js +49 -0
  97. package/dist/games/scores.d.ts +69 -0
  98. package/dist/games/scores.js +191 -0
  99. package/dist/games/tetris/board.d.ts +59 -0
  100. package/dist/games/tetris/board.js +170 -0
  101. package/dist/games/tetris/index.d.ts +109 -0
  102. package/dist/games/tetris/index.js +610 -0
  103. package/dist/games/tetris/pieces.d.ts +44 -0
  104. package/dist/games/tetris/pieces.js +271 -0
  105. package/dist/games/tetris/renderer.d.ts +26 -0
  106. package/dist/games/tetris/renderer.js +77 -0
  107. package/dist/guide/guide-content.d.ts +23 -0
  108. package/dist/guide/guide-content.js +196 -0
  109. package/dist/guide/index.d.ts +8 -0
  110. package/dist/guide/index.js +7 -0
  111. package/dist/guide/shared-content.d.ts +37 -0
  112. package/dist/guide/shared-content.js +1272 -0
  113. package/dist/guide/tutorial-helpers.d.ts +57 -0
  114. package/dist/guide/tutorial-helpers.js +147 -0
  115. package/dist/handlers/ask-user-handlers.d.ts +32 -0
  116. package/dist/handlers/ask-user-handlers.js +104 -0
  117. package/dist/handlers/delegation-handlers.d.ts +34 -0
  118. package/dist/handlers/delegation-handlers.js +291 -0
  119. package/dist/handlers/permission-handler.d.ts +30 -0
  120. package/dist/handlers/permission-handler.js +205 -0
  121. package/dist/index.d.ts +11 -1
  122. package/dist/index.js +448 -271
  123. package/dist/input-handlers/memory-handler.d.ts +1 -1
  124. package/dist/input-handlers/memory-handler.js +2 -1
  125. package/dist/models/index.d.ts +10 -0
  126. package/dist/models/index.js +12 -0
  127. package/dist/models/model-registry.d.ts +38 -0
  128. package/dist/models/model-registry.js +69 -0
  129. package/dist/models/model-tiers.d.ts +28 -0
  130. package/dist/models/model-tiers.js +71 -0
  131. package/dist/models/model-validation.d.ts +25 -0
  132. package/dist/models/model-validation.js +291 -0
  133. package/dist/models/ollama-models.d.ts +73 -0
  134. package/dist/models/ollama-models.js +178 -0
  135. package/dist/models/provider-types.d.ts +6 -0
  136. package/dist/models/provider-types.js +1 -0
  137. package/dist/models/providers.d.ts +35 -0
  138. package/dist/models/providers.js +58 -0
  139. package/dist/models/types.d.ts +4 -0
  140. package/dist/models/types.js +4 -0
  141. package/dist/multi-agent/activity.d.ts +21 -0
  142. package/dist/multi-agent/activity.js +34 -0
  143. package/dist/multi-agent/agent-selection.d.ts +55 -0
  144. package/dist/multi-agent/agent-selection.js +90 -0
  145. package/dist/multi-agent/artifacts.d.ts +197 -0
  146. package/dist/multi-agent/artifacts.js +379 -0
  147. package/dist/multi-agent/checkpointer.d.ts +138 -0
  148. package/dist/multi-agent/checkpointer.js +471 -0
  149. package/dist/multi-agent/collision-utils.d.ts +16 -0
  150. package/dist/multi-agent/collision-utils.js +28 -0
  151. package/dist/multi-agent/context-resolver.d.ts +97 -0
  152. package/dist/multi-agent/context-resolver.js +316 -0
  153. package/dist/multi-agent/custom-agents.d.ts +83 -0
  154. package/dist/multi-agent/custom-agents.js +227 -0
  155. package/dist/multi-agent/delegation-tracker.d.ts +157 -0
  156. package/dist/multi-agent/delegation-tracker.js +243 -0
  157. package/dist/multi-agent/file-lock-hook.d.ts +29 -0
  158. package/dist/multi-agent/file-lock-hook.js +97 -0
  159. package/dist/multi-agent/file-locks.d.ts +58 -0
  160. package/dist/multi-agent/file-locks.js +194 -0
  161. package/dist/multi-agent/index.d.ts +24 -0
  162. package/dist/multi-agent/index.js +30 -0
  163. package/dist/multi-agent/mention-parser.d.ts +64 -0
  164. package/dist/multi-agent/mention-parser.js +146 -0
  165. package/dist/multi-agent/notification-manager.d.ts +84 -0
  166. package/dist/multi-agent/notification-manager.js +224 -0
  167. package/dist/multi-agent/pending-requests.d.ts +122 -0
  168. package/dist/multi-agent/pending-requests.js +155 -0
  169. package/dist/multi-agent/session-registry.d.ts +139 -0
  170. package/dist/multi-agent/session-registry.js +514 -0
  171. package/dist/multi-agent/shared-context.d.ts +293 -0
  172. package/dist/multi-agent/shared-context.js +671 -0
  173. package/dist/multi-agent/skill-requirements.d.ts +66 -0
  174. package/dist/multi-agent/skill-requirements.js +178 -0
  175. package/dist/multi-agent/task-assignment.d.ts +69 -0
  176. package/dist/multi-agent/task-assignment.js +123 -0
  177. package/dist/multi-agent/task-suggestion.d.ts +31 -0
  178. package/dist/multi-agent/task-suggestion.js +72 -0
  179. package/dist/multi-agent/team-agent.d.ts +201 -0
  180. package/dist/multi-agent/team-agent.js +488 -0
  181. package/dist/multi-agent/team.d.ts +286 -0
  182. package/dist/multi-agent/team.js +610 -0
  183. package/dist/multi-agent/tool-config.d.ts +110 -0
  184. package/dist/multi-agent/tool-config.js +661 -0
  185. package/dist/multi-agent/types.d.ts +211 -0
  186. package/dist/multi-agent/types.js +617 -0
  187. package/dist/prompts/plan-mode-prompt.d.ts +11 -0
  188. package/dist/prompts/plan-mode-prompt.js +95 -0
  189. package/dist/repl-helpers.js +3 -2
  190. package/dist/repl-v2.d.ts +401 -2
  191. package/dist/repl-v2.js +2577 -65
  192. package/dist/session/index.d.ts +6 -0
  193. package/dist/session/index.js +6 -0
  194. package/dist/session/project-session-manager.d.ts +158 -0
  195. package/dist/session/project-session-manager.js +650 -0
  196. package/dist/settings/index.d.ts +133 -13
  197. package/dist/settings/index.js +329 -24
  198. package/dist/settings/mcp-config.d.ts +76 -0
  199. package/dist/settings/mcp-config.js +143 -0
  200. package/dist/settings/paths.d.ts +4 -0
  201. package/dist/settings/paths.js +6 -0
  202. package/dist/shared-handlers.d.ts +62 -0
  203. package/dist/shared-handlers.js +48 -0
  204. package/dist/system-prompt/builder.d.ts +5 -0
  205. package/dist/system-prompt/builder.js +4 -0
  206. package/dist/system-prompt/index.d.ts +18 -0
  207. package/dist/system-prompt/index.js +18 -0
  208. package/dist/system-prompt/modules.d.ts +5 -0
  209. package/dist/system-prompt/modules.js +4 -0
  210. package/dist/tabbed-menu.js +2 -1
  211. package/dist/templates/compilr-md-import.d.ts +16 -0
  212. package/dist/templates/compilr-md-import.js +241 -0
  213. package/dist/templates/compilr-md.js +10 -61
  214. package/dist/templates/config-json.d.ts +1 -25
  215. package/dist/templates/index.d.ts +2 -0
  216. package/dist/templates/index.js +34 -73
  217. package/dist/tool-names.d.ts +108 -0
  218. package/dist/tool-names.js +227 -0
  219. package/dist/tools/anchor-tools.d.ts +4 -4
  220. package/dist/tools/anchor-tools.js +1 -1
  221. package/dist/tools/artifact-tools.d.ts +42 -0
  222. package/dist/tools/artifact-tools.js +328 -0
  223. package/dist/tools/ask-user-simple.d.ts +1 -1
  224. package/dist/tools/ask-user-simple.js +2 -1
  225. package/dist/tools/ask-user.d.ts +1 -1
  226. package/dist/tools/ask-user.js +2 -1
  227. package/dist/tools/backlog-wrappers.d.ts +5 -3
  228. package/dist/tools/backlog-wrappers.js +16 -1
  229. package/dist/tools/backlog.d.ts +2 -2
  230. package/dist/tools/backlog.js +1 -1
  231. package/dist/tools/db-tools.d.ts +8 -61
  232. package/dist/tools/db-tools.js +8 -13
  233. package/dist/tools/delegate-background.d.ts +27 -0
  234. package/dist/tools/delegate-background.js +115 -0
  235. package/dist/tools/delegate.d.ts +22 -0
  236. package/dist/tools/delegate.js +97 -0
  237. package/dist/tools/delegation-status.d.ts +16 -0
  238. package/dist/tools/delegation-status.js +128 -0
  239. package/dist/tools/document-db.d.ts +5 -5
  240. package/dist/tools/document-db.js +1 -1
  241. package/dist/tools/guide-tool.d.ts +12 -0
  242. package/dist/tools/guide-tool.js +59 -0
  243. package/dist/tools/handoff.d.ts +25 -0
  244. package/dist/tools/handoff.js +99 -0
  245. package/dist/tools/meta-tools.d.ts +26 -0
  246. package/dist/tools/meta-tools.js +47 -0
  247. package/dist/tools/plan-tools.d.ts +54 -0
  248. package/dist/tools/plan-tools.js +338 -0
  249. package/dist/tools/platform-adapter.d.ts +29 -0
  250. package/dist/tools/platform-adapter.js +394 -0
  251. package/dist/tools/project-db.d.ts +5 -73
  252. package/dist/tools/project-db.js +5 -336
  253. package/dist/tools/recall-work-tool.d.ts +18 -0
  254. package/dist/tools/recall-work-tool.js +82 -0
  255. package/dist/tools/workitem-db.d.ts +43 -11
  256. package/dist/tools/workitem-db.js +186 -5
  257. package/dist/tools.d.ts +67 -2
  258. package/dist/tools.js +237 -47
  259. package/dist/ui/autocomplete-controller.d.ts +42 -0
  260. package/dist/ui/autocomplete-controller.js +384 -0
  261. package/dist/ui/base/index.d.ts +1 -1
  262. package/dist/ui/base/index.js +1 -1
  263. package/dist/ui/base/overlay-base-v2.d.ts +10 -0
  264. package/dist/ui/base/overlay-base-v2.js +14 -0
  265. package/dist/ui/base/render-utils.d.ts +19 -0
  266. package/dist/ui/base/render-utils.js +25 -0
  267. package/dist/ui/base/tabbed-list-overlay-v2.d.ts +16 -1
  268. package/dist/ui/base/tabbed-list-overlay-v2.js +19 -1
  269. package/dist/ui/constants/labels.d.ts +14 -0
  270. package/dist/ui/constants/labels.js +51 -0
  271. package/dist/ui/conversation-store.d.ts +55 -0
  272. package/dist/ui/conversation-store.js +107 -0
  273. package/dist/ui/conversation.js +11 -13
  274. package/dist/ui/diff.d.ts +7 -1
  275. package/dist/ui/diff.js +85 -48
  276. package/dist/ui/ephemeral.js +3 -9
  277. package/dist/ui/file-autocomplete.d.ts +24 -0
  278. package/dist/ui/file-autocomplete.js +56 -0
  279. package/dist/ui/footer-renderer.d.ts +69 -0
  280. package/dist/ui/footer-renderer.js +431 -0
  281. package/dist/ui/footer.d.ts +74 -7
  282. package/dist/ui/footer.js +173 -16
  283. package/dist/ui/input-controller.d.ts +51 -0
  284. package/dist/ui/input-controller.js +176 -0
  285. package/dist/ui/input-prompt.d.ts +19 -0
  286. package/dist/ui/input-prompt.js +206 -14
  287. package/dist/ui/keyboard-handler.d.ts +57 -0
  288. package/dist/ui/keyboard-handler.js +557 -0
  289. package/dist/ui/live-region-facade.d.ts +42 -0
  290. package/dist/ui/live-region-facade.js +205 -0
  291. package/dist/ui/live-region.d.ts +0 -4
  292. package/dist/ui/live-region.js +6 -14
  293. package/dist/ui/mascot/renderer.d.ts +1 -1
  294. package/dist/ui/mascot/renderer.js +37 -2
  295. package/dist/ui/overlay/data/tutorial-content.d.ts +9 -0
  296. package/dist/ui/overlay/data/tutorial-content.js +9 -0
  297. package/dist/ui/overlay/data/tutorial-registry.d.ts +12 -0
  298. package/dist/ui/overlay/data/tutorial-registry.js +116 -0
  299. package/dist/ui/overlay/data/tutorial-types.d.ts +35 -0
  300. package/dist/ui/overlay/data/tutorial-types.js +6 -0
  301. package/dist/ui/overlay/data/tutorials/basics/first-conversation.d.ts +7 -0
  302. package/dist/ui/overlay/data/tutorials/basics/first-conversation.js +220 -0
  303. package/dist/ui/overlay/data/tutorials/basics/first-project.d.ts +7 -0
  304. package/dist/ui/overlay/data/tutorials/basics/first-project.js +284 -0
  305. package/dist/ui/overlay/data/tutorials/basics/navigation.d.ts +8 -0
  306. package/dist/ui/overlay/data/tutorials/basics/navigation.js +22 -0
  307. package/dist/ui/overlay/data/tutorials/basics/welcome.d.ts +7 -0
  308. package/dist/ui/overlay/data/tutorials/basics/welcome.js +174 -0
  309. package/dist/ui/overlay/data/tutorials/config/context-management.d.ts +7 -0
  310. package/dist/ui/overlay/data/tutorials/config/context-management.js +158 -0
  311. package/dist/ui/overlay/data/tutorials/config/mcp-servers.d.ts +8 -0
  312. package/dist/ui/overlay/data/tutorials/config/mcp-servers.js +155 -0
  313. package/dist/ui/overlay/data/tutorials/config/model-selection.d.ts +7 -0
  314. package/dist/ui/overlay/data/tutorials/config/model-selection.js +162 -0
  315. package/dist/ui/overlay/data/tutorials/config/permissions-safety.d.ts +7 -0
  316. package/dist/ui/overlay/data/tutorials/config/permissions-safety.js +163 -0
  317. package/dist/ui/overlay/data/tutorials/config/settings-config.d.ts +7 -0
  318. package/dist/ui/overlay/data/tutorials/config/settings-config.js +166 -0
  319. package/dist/ui/overlay/data/tutorials/planning/arch.d.ts +7 -0
  320. package/dist/ui/overlay/data/tutorials/planning/arch.js +168 -0
  321. package/dist/ui/overlay/data/tutorials/planning/backlog.d.ts +7 -0
  322. package/dist/ui/overlay/data/tutorials/planning/backlog.js +103 -0
  323. package/dist/ui/overlay/data/tutorials/planning/build.d.ts +7 -0
  324. package/dist/ui/overlay/data/tutorials/planning/build.js +173 -0
  325. package/dist/ui/overlay/data/tutorials/planning/design.d.ts +7 -0
  326. package/dist/ui/overlay/data/tutorials/planning/design.js +205 -0
  327. package/dist/ui/overlay/data/tutorials/planning/docs.d.ts +7 -0
  328. package/dist/ui/overlay/data/tutorials/planning/docs.js +143 -0
  329. package/dist/ui/overlay/data/tutorials/planning/prd.d.ts +7 -0
  330. package/dist/ui/overlay/data/tutorials/planning/prd.js +173 -0
  331. package/dist/ui/overlay/data/tutorials/planning/scaffold.d.ts +7 -0
  332. package/dist/ui/overlay/data/tutorials/planning/scaffold.js +164 -0
  333. package/dist/ui/overlay/data/tutorials/planning/sketch.d.ts +7 -0
  334. package/dist/ui/overlay/data/tutorials/planning/sketch.js +58 -0
  335. package/dist/ui/overlay/data/tutorials/projects/anchors.d.ts +7 -0
  336. package/dist/ui/overlay/data/tutorials/projects/anchors.js +248 -0
  337. package/dist/ui/overlay/data/tutorials/projects/import-project.d.ts +7 -0
  338. package/dist/ui/overlay/data/tutorials/projects/import-project.js +172 -0
  339. package/dist/ui/overlay/data/tutorials/projects/managing-projects.d.ts +8 -0
  340. package/dist/ui/overlay/data/tutorials/projects/managing-projects.js +212 -0
  341. package/dist/ui/overlay/data/tutorials/projects/new-project.d.ts +7 -0
  342. package/dist/ui/overlay/data/tutorials/projects/new-project.js +251 -0
  343. package/dist/ui/overlay/data/tutorials/projects/session-management.d.ts +7 -0
  344. package/dist/ui/overlay/data/tutorials/projects/session-management.js +169 -0
  345. package/dist/ui/overlay/data/tutorials/teams/background-execution.d.ts +7 -0
  346. package/dist/ui/overlay/data/tutorials/teams/background-execution.js +171 -0
  347. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.d.ts +8 -0
  348. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.js +147 -0
  349. package/dist/ui/overlay/data/tutorials/teams/task-assignment.d.ts +7 -0
  350. package/dist/ui/overlay/data/tutorials/teams/task-assignment.js +204 -0
  351. package/dist/ui/overlay/data/tutorials/teams/team-overview.d.ts +7 -0
  352. package/dist/ui/overlay/data/tutorials/teams/team-overview.js +165 -0
  353. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.d.ts +7 -0
  354. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.js +172 -0
  355. package/dist/ui/overlay/impl/agents-overlay-v2.js +6 -17
  356. package/dist/ui/overlay/impl/anchors-overlay-v2.js +30 -64
  357. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.d.ts +43 -0
  358. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.js +232 -0
  359. package/dist/ui/overlay/impl/artifact-overlay-v2.d.ts +40 -0
  360. package/dist/ui/overlay/impl/artifact-overlay-v2.js +115 -0
  361. package/dist/ui/overlay/impl/ask-user-overlay-v2.js +2 -5
  362. package/dist/ui/overlay/impl/background-overlay-v2.d.ts +40 -0
  363. package/dist/ui/overlay/impl/background-overlay-v2.js +147 -0
  364. package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +4 -1
  365. package/dist/ui/overlay/impl/backlog-overlay-v2.js +55 -16
  366. package/dist/ui/overlay/impl/changelog-overlay-v2.d.ts +44 -0
  367. package/dist/ui/overlay/impl/changelog-overlay-v2.js +165 -0
  368. package/dist/ui/overlay/impl/commands-overlay-v2.js +4 -6
  369. package/dist/ui/overlay/impl/config-overlay-v2.d.ts +12 -1
  370. package/dist/ui/overlay/impl/config-overlay-v2.js +164 -100
  371. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.d.ts +83 -0
  372. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.js +711 -0
  373. package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +2 -0
  374. package/dist/ui/overlay/impl/dashboard-overlay-v2.js +26 -3
  375. package/dist/ui/overlay/impl/delegations-overlay-v2.d.ts +28 -0
  376. package/dist/ui/overlay/impl/delegations-overlay-v2.js +279 -0
  377. package/dist/ui/overlay/impl/docs-overlay-v2.js +12 -9
  378. package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +7 -0
  379. package/dist/ui/overlay/impl/document-detail-overlay-v2.js +119 -78
  380. package/dist/ui/overlay/impl/filter-overlay-v2.d.ts +41 -0
  381. package/dist/ui/overlay/impl/filter-overlay-v2.js +110 -0
  382. package/dist/ui/overlay/impl/games-overlay-v2.d.ts +31 -0
  383. package/dist/ui/overlay/impl/games-overlay-v2.js +135 -0
  384. package/dist/ui/overlay/impl/help-overlay-v2.d.ts +26 -3
  385. package/dist/ui/overlay/impl/help-overlay-v2.js +20 -42
  386. package/dist/ui/overlay/impl/login-overlay-v2.d.ts +49 -0
  387. package/dist/ui/overlay/impl/login-overlay-v2.js +277 -0
  388. package/dist/ui/overlay/impl/mcp-overlay-v2.d.ts +63 -0
  389. package/dist/ui/overlay/impl/mcp-overlay-v2.js +907 -0
  390. package/dist/ui/overlay/impl/model-overlay-v2.d.ts +57 -13
  391. package/dist/ui/overlay/impl/model-overlay-v2.js +1086 -61
  392. package/dist/ui/overlay/impl/new-overlay-v2.d.ts +37 -6
  393. package/dist/ui/overlay/impl/new-overlay-v2.js +715 -65
  394. package/dist/ui/overlay/impl/notifications-overlay-v2.d.ts +20 -0
  395. package/dist/ui/overlay/impl/notifications-overlay-v2.js +116 -0
  396. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.d.ts +76 -0
  397. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.js +728 -0
  398. package/dist/ui/overlay/impl/pending-overlay-v2.d.ts +51 -0
  399. package/dist/ui/overlay/impl/pending-overlay-v2.js +445 -0
  400. package/dist/ui/overlay/impl/permission-overlay-v2.js +5 -5
  401. package/dist/ui/overlay/impl/permissions-overlay-v2.d.ts +85 -0
  402. package/dist/ui/overlay/impl/permissions-overlay-v2.js +820 -0
  403. package/dist/ui/overlay/impl/plan-approval-overlay-v2.d.ts +35 -0
  404. package/dist/ui/overlay/impl/plan-approval-overlay-v2.js +181 -0
  405. package/dist/ui/overlay/impl/project-edit-overlay-v2.d.ts +36 -0
  406. package/dist/ui/overlay/impl/project-edit-overlay-v2.js +195 -0
  407. package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +1 -0
  408. package/dist/ui/overlay/impl/projects-overlay-v2.js +278 -44
  409. package/dist/ui/overlay/impl/reset-overlay-v2.d.ts +39 -0
  410. package/dist/ui/overlay/impl/reset-overlay-v2.js +107 -0
  411. package/dist/ui/overlay/impl/resume-overlay-v2.d.ts +60 -0
  412. package/dist/ui/overlay/impl/resume-overlay-v2.js +414 -0
  413. package/dist/ui/overlay/impl/session-mode-overlay-v2.d.ts +43 -0
  414. package/dist/ui/overlay/impl/session-mode-overlay-v2.js +124 -0
  415. package/dist/ui/overlay/impl/tasks-overlay-v2.d.ts +28 -0
  416. package/dist/ui/overlay/impl/tasks-overlay-v2.js +283 -0
  417. package/dist/ui/overlay/impl/team-overlay-v2.d.ts +86 -0
  418. package/dist/ui/overlay/impl/team-overlay-v2.js +692 -0
  419. package/dist/ui/overlay/impl/terminals-overlay-v2.d.ts +26 -0
  420. package/dist/ui/overlay/impl/terminals-overlay-v2.js +217 -0
  421. package/dist/ui/overlay/impl/tools-overlay-v2.js +3 -7
  422. package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +30 -16
  423. package/dist/ui/overlay/impl/tutorial-overlay-v2.js +133 -956
  424. package/dist/ui/overlay/impl/workflow-overlay-v2.js +5 -1
  425. package/dist/ui/overlay/index.d.ts +20 -1
  426. package/dist/ui/overlay/index.js +19 -0
  427. package/dist/ui/overlay/types.d.ts +5 -0
  428. package/dist/ui/overlay-manager.d.ts +43 -0
  429. package/dist/ui/overlay-manager.js +238 -0
  430. package/dist/ui/overlays.js +4 -16
  431. package/dist/ui/permission-overlay.js +6 -5
  432. package/dist/ui/status-bar-controller.d.ts +33 -0
  433. package/dist/ui/status-bar-controller.js +99 -0
  434. package/dist/ui/subagent-renderer.js +3 -19
  435. package/dist/ui/terminal-autocomplete-utils.d.ts +23 -0
  436. package/dist/ui/terminal-autocomplete-utils.js +83 -0
  437. package/dist/ui/terminal-line-builders.d.ts +17 -0
  438. package/dist/ui/terminal-line-builders.js +42 -0
  439. package/dist/ui/terminal-render-item.d.ts +16 -0
  440. package/dist/ui/terminal-render-item.js +267 -0
  441. package/dist/ui/terminal-renderer.d.ts +7 -8
  442. package/dist/ui/terminal-renderer.js +7 -8
  443. package/dist/ui/terminal-types.d.ts +179 -0
  444. package/dist/ui/terminal-types.js +34 -0
  445. package/dist/ui/terminal-ui.d.ts +144 -276
  446. package/dist/ui/terminal-ui.js +384 -1861
  447. package/dist/ui/todo-zone.d.ts +19 -1
  448. package/dist/ui/todo-zone.js +71 -13
  449. package/dist/ui/tool-formatters.js +512 -1
  450. package/dist/ui/turn-metrics.d.ts +56 -0
  451. package/dist/ui/turn-metrics.js +75 -0
  452. package/dist/ui/types.d.ts +28 -0
  453. package/dist/ui/types.js +1 -0
  454. package/dist/ui/vscode-diff-ipc.d.ts +102 -0
  455. package/dist/ui/vscode-diff-ipc.js +385 -0
  456. package/dist/utils/credentials.d.ts +24 -5
  457. package/dist/utils/credentials.js +123 -9
  458. package/dist/utils/format-tokens.d.ts +13 -0
  459. package/dist/utils/format-tokens.js +18 -0
  460. package/dist/utils/git-config.d.ts +26 -0
  461. package/dist/utils/git-config.js +54 -0
  462. package/dist/utils/message-utils.d.ts +61 -0
  463. package/dist/utils/message-utils.js +72 -0
  464. package/dist/utils/model-tiers.d.ts +8 -1
  465. package/dist/utils/model-tiers.js +38 -16
  466. package/dist/utils/open-browser.d.ts +5 -0
  467. package/dist/utils/open-browser.js +32 -0
  468. package/dist/utils/path-safety.js +3 -2
  469. package/dist/utils/project-detection.d.ts +58 -0
  470. package/dist/utils/project-detection.js +424 -0
  471. package/dist/utils/project-memory.js +2 -1
  472. package/dist/utils/project-status.d.ts +2 -2
  473. package/dist/utils/startup-perf.d.ts +18 -0
  474. package/dist/utils/startup-perf.js +60 -0
  475. package/dist/utils/token-tracker.d.ts +62 -0
  476. package/dist/utils/token-tracker.js +150 -0
  477. package/dist/utils/token-types.d.ts +23 -0
  478. package/dist/utils/token-types.js +18 -0
  479. package/dist/utils/types/config-types.d.ts +32 -0
  480. package/dist/utils/types/config-types.js +8 -0
  481. package/dist/utils/update-checker.d.ts +28 -0
  482. package/dist/utils/update-checker.js +106 -0
  483. package/dist/utils/version.d.ts +7 -0
  484. package/dist/utils/version.js +10 -0
  485. package/dist/utils/vscode-detect.d.ts +39 -0
  486. package/dist/utils/vscode-detect.js +137 -0
  487. package/package.json +25 -12
  488. package/dist/commands/handler-types.d.ts +0 -68
  489. package/dist/commands/handler-types.js +0 -8
  490. package/dist/commands/handlers/agent-commands.d.ts +0 -13
  491. package/dist/commands/handlers/agent-commands.js +0 -305
  492. package/dist/commands/handlers/design-commands.d.ts +0 -15
  493. package/dist/commands/handlers/design-commands.js +0 -334
  494. package/dist/commands/handlers/index.d.ts +0 -20
  495. package/dist/commands/handlers/index.js +0 -43
  496. package/dist/commands/handlers/overlay-commands.d.ts +0 -21
  497. package/dist/commands/handlers/overlay-commands.js +0 -287
  498. package/dist/commands/handlers/project-commands.d.ts +0 -11
  499. package/dist/commands/handlers/project-commands.js +0 -167
  500. package/dist/commands/handlers/simple-commands.d.ts +0 -19
  501. package/dist/commands/handlers/simple-commands.js +0 -144
  502. package/dist/commands/registry.d.ts +0 -50
  503. package/dist/commands/registry.js +0 -75
  504. package/dist/index.old.d.ts +0 -7
  505. package/dist/index.old.js +0 -1014
  506. package/dist/repl.d.ts +0 -149
  507. package/dist/repl.js +0 -1151
  508. package/dist/templates/claude-md.d.ts +0 -7
  509. package/dist/templates/claude-md.js +0 -189
  510. package/dist/test-autocomplete.d.ts +0 -7
  511. package/dist/test-autocomplete.js +0 -85
  512. package/dist/test-tabbed-menu.d.ts +0 -7
  513. package/dist/test-tabbed-menu.js +0 -25
  514. package/dist/tool-selector.d.ts +0 -71
  515. package/dist/tool-selector.js +0 -184
  516. package/dist/ui/agents-overlay-v2.d.ts +0 -43
  517. package/dist/ui/agents-overlay-v2.js +0 -809
  518. package/dist/ui/agents-overlay.d.ts +0 -12
  519. package/dist/ui/agents-overlay.js +0 -863
  520. package/dist/ui/anchors-overlay.d.ts +0 -12
  521. package/dist/ui/anchors-overlay.js +0 -775
  522. package/dist/ui/arch-type-overlay.d.ts +0 -15
  523. package/dist/ui/arch-type-overlay.js +0 -201
  524. package/dist/ui/ask-user-overlay-v2.d.ts +0 -26
  525. package/dist/ui/ask-user-overlay-v2.js +0 -555
  526. package/dist/ui/ask-user-simple-overlay-v2.d.ts +0 -25
  527. package/dist/ui/ask-user-simple-overlay-v2.js +0 -215
  528. package/dist/ui/backlog-overlay.d.ts +0 -32
  529. package/dist/ui/backlog-overlay.js +0 -652
  530. package/dist/ui/commands-overlay-v2.d.ts +0 -33
  531. package/dist/ui/commands-overlay-v2.js +0 -441
  532. package/dist/ui/commands-overlay.d.ts +0 -16
  533. package/dist/ui/commands-overlay.js +0 -439
  534. package/dist/ui/config-overlay.d.ts +0 -35
  535. package/dist/ui/config-overlay.js +0 -707
  536. package/dist/ui/docs-overlay.d.ts +0 -17
  537. package/dist/ui/docs-overlay.js +0 -303
  538. package/dist/ui/footer-v2.d.ts +0 -222
  539. package/dist/ui/footer-v2.js +0 -1349
  540. package/dist/ui/help-overlay-v2.d.ts +0 -34
  541. package/dist/ui/help-overlay-v2.js +0 -309
  542. package/dist/ui/help-overlay.d.ts +0 -16
  543. package/dist/ui/help-overlay.js +0 -316
  544. package/dist/ui/init-overlay-v2.d.ts +0 -34
  545. package/dist/ui/init-overlay-v2.js +0 -600
  546. package/dist/ui/init-overlay.d.ts +0 -34
  547. package/dist/ui/init-overlay.js +0 -604
  548. package/dist/ui/input-prompt-v2.d.ts +0 -180
  549. package/dist/ui/input-prompt-v2.js +0 -999
  550. package/dist/ui/iteration-limit-overlay-v2.d.ts +0 -21
  551. package/dist/ui/iteration-limit-overlay-v2.js +0 -114
  552. package/dist/ui/keys-overlay-v2.d.ts +0 -41
  553. package/dist/ui/keys-overlay-v2.js +0 -248
  554. package/dist/ui/mascot-overlay-v2.d.ts +0 -41
  555. package/dist/ui/mascot-overlay-v2.js +0 -138
  556. package/dist/ui/mascot-overlay.d.ts +0 -21
  557. package/dist/ui/mascot-overlay.js +0 -146
  558. package/dist/ui/model-overlay-v2.d.ts +0 -49
  559. package/dist/ui/model-overlay-v2.js +0 -118
  560. package/dist/ui/model-overlay.d.ts +0 -27
  561. package/dist/ui/model-overlay.js +0 -221
  562. package/dist/ui/model-warning-overlay.d.ts +0 -30
  563. package/dist/ui/model-warning-overlay.js +0 -169
  564. package/dist/ui/new-overlay.d.ts +0 -34
  565. package/dist/ui/new-overlay.js +0 -604
  566. package/dist/ui/overlay/impl/init-overlay-v2.d.ts +0 -77
  567. package/dist/ui/overlay/impl/init-overlay-v2.js +0 -593
  568. package/dist/ui/overlay/overlay-types.d.ts +0 -128
  569. package/dist/ui/overlay/overlay-types.js +0 -22
  570. package/dist/ui/overlays/help-overlay-v2.d.ts +0 -28
  571. package/dist/ui/overlays/help-overlay-v2.js +0 -198
  572. package/dist/ui/overlays/index.d.ts +0 -11
  573. package/dist/ui/overlays/index.js +0 -11
  574. package/dist/ui/permission-overlay-v2.d.ts +0 -36
  575. package/dist/ui/permission-overlay-v2.js +0 -380
  576. package/dist/ui/projects-overlay.d.ts +0 -19
  577. package/dist/ui/projects-overlay.js +0 -484
  578. package/dist/ui/theme-overlay-v2.d.ts +0 -42
  579. package/dist/ui/theme-overlay-v2.js +0 -135
  580. package/dist/ui/theme-overlay.d.ts +0 -24
  581. package/dist/ui/theme-overlay.js +0 -127
  582. package/dist/ui/tools-overlay-v2.d.ts +0 -47
  583. package/dist/ui/tools-overlay-v2.js +0 -218
  584. package/dist/ui/tools-overlay.d.ts +0 -34
  585. package/dist/ui/tools-overlay.js +0 -230
  586. package/dist/ui/tutorial-overlay-v2.d.ts +0 -31
  587. package/dist/ui/tutorial-overlay-v2.js +0 -1035
  588. package/dist/ui/tutorial-overlay.d.ts +0 -11
  589. package/dist/ui/tutorial-overlay.js +0 -1034
  590. package/dist/ui/workflow-overlay.d.ts +0 -22
  591. package/dist/ui/workflow-overlay.js +0 -636
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Episode Recorder
3
+ *
4
+ * Collects tool call signals via an AfterToolHook, batches them within
5
+ * a time window, and persists as WorkEpisode records.
6
+ */
7
+ import { randomUUID } from 'crypto';
8
+ import { estimateEffort, EFFORT_ORDER } from '@compilr-dev/agents';
9
+ import { isSignificantWork, extractAffectedFiles, extractLinesChanged } from './significant-work.js';
10
+ // =============================================================================
11
+ // Constants
12
+ // =============================================================================
13
+ const DEFAULT_BATCH_WINDOW_MS = 5000;
14
+ const DEFAULT_MIN_EFFORT = 'low';
15
+ // =============================================================================
16
+ // Implementation
17
+ // =============================================================================
18
+ export class EpisodeRecorder {
19
+ store;
20
+ agentId;
21
+ terminalPrefix;
22
+ sessionId;
23
+ autoRecord;
24
+ minEffortToRecord;
25
+ batchWindowMs;
26
+ onBatchFlushed;
27
+ pendingSignals = [];
28
+ batchTimer = null;
29
+ batchStartTime = null;
30
+ constructor(config) {
31
+ this.store = config.store;
32
+ this.agentId = config.agentId;
33
+ this.terminalPrefix = config.terminalPrefix;
34
+ this.sessionId = config.sessionId;
35
+ this.autoRecord = config.autoRecord ?? true;
36
+ this.minEffortToRecord = config.minEffortToRecord ?? DEFAULT_MIN_EFFORT;
37
+ this.batchWindowMs = config.batchWindowMs ?? DEFAULT_BATCH_WINDOW_MS;
38
+ this.onBatchFlushed = config.onBatchFlushed;
39
+ }
40
+ /**
41
+ * Create an AfterToolHook for observing tool calls.
42
+ * Always returns undefined (observation only — never modifies results).
43
+ */
44
+ createHook() {
45
+ return (context) => {
46
+ if (!this.autoRecord)
47
+ return undefined;
48
+ const success = context.result.success;
49
+ if (!isSignificantWork(context.toolName, context.input, success)) {
50
+ return undefined;
51
+ }
52
+ const signal = {
53
+ toolName: context.toolName,
54
+ files: extractAffectedFiles(context.toolName, context.input),
55
+ linesChanged: extractLinesChanged(context.result),
56
+ durationMs: context.durationMs,
57
+ success,
58
+ timestamp: new Date().toISOString(),
59
+ };
60
+ this.pendingSignals.push(signal);
61
+ this.scheduleBatch();
62
+ return undefined;
63
+ };
64
+ }
65
+ /**
66
+ * Force-flush all pending signals as a WorkEpisode.
67
+ * Called on shutdown to avoid losing data.
68
+ */
69
+ flush() {
70
+ if (this.batchTimer) {
71
+ clearTimeout(this.batchTimer);
72
+ this.batchTimer = null;
73
+ }
74
+ this.buildAndSaveEpisode();
75
+ }
76
+ // ---------------------------------------------------------------------------
77
+ // Internal
78
+ // ---------------------------------------------------------------------------
79
+ scheduleBatch() {
80
+ if (!this.batchStartTime) {
81
+ this.batchStartTime = Date.now();
82
+ }
83
+ // Clear existing timer and set a new one
84
+ if (this.batchTimer) {
85
+ clearTimeout(this.batchTimer);
86
+ }
87
+ this.batchTimer = setTimeout(() => {
88
+ this.batchTimer = null;
89
+ this.buildAndSaveEpisode();
90
+ }, this.batchWindowMs);
91
+ }
92
+ buildAndSaveEpisode() {
93
+ if (this.pendingSignals.length === 0) {
94
+ this.batchStartTime = null;
95
+ return;
96
+ }
97
+ const signals = [...this.pendingSignals];
98
+ this.pendingSignals = [];
99
+ const startTime = this.batchStartTime;
100
+ this.batchStartTime = null;
101
+ // Collect unique files, tool names, total lines
102
+ const allFiles = new Set();
103
+ const toolNames = new Set();
104
+ let totalLines = 0;
105
+ let totalDurationMs = 0;
106
+ for (const s of signals) {
107
+ for (const f of s.files)
108
+ allFiles.add(f);
109
+ toolNames.add(s.toolName);
110
+ totalLines += s.linesChanged;
111
+ totalDurationMs += s.durationMs;
112
+ }
113
+ const files = [...allFiles];
114
+ // Build effort signals
115
+ const effortSignals = {
116
+ fileCount: files.length,
117
+ linesChanged: totalLines,
118
+ toolCallCount: signals.length,
119
+ durationMs: totalDurationMs,
120
+ iterationCount: signals.length,
121
+ complexityIndicators: {
122
+ newFiles: toolNames.has('write_file'),
123
+ multiLanguage: hasMultipleLanguages(files),
124
+ tests: files.some(isTestFile),
125
+ configChanges: files.some(isConfigFile),
126
+ },
127
+ };
128
+ const effort = estimateEffort(effortSignals);
129
+ // Skip if below minimum effort threshold
130
+ if (EFFORT_ORDER.indexOf(effort) < EFFORT_ORDER.indexOf(this.minEffortToRecord)) {
131
+ return;
132
+ }
133
+ const episode = {
134
+ id: randomUUID(),
135
+ agentId: this.agentId,
136
+ terminalPrefix: this.terminalPrefix,
137
+ action: inferAction([...toolNames]),
138
+ summary: buildSummary([...toolNames], files, totalLines),
139
+ files,
140
+ linesChanged: totalLines > 0 ? totalLines : undefined,
141
+ timestamp: signals[0].timestamp,
142
+ sessionId: this.sessionId,
143
+ effort,
144
+ durationMs: startTime ? Date.now() - startTime : totalDurationMs,
145
+ toolCalls: signals.length,
146
+ };
147
+ void this.store.save(episode);
148
+ this.onBatchFlushed?.();
149
+ }
150
+ }
151
+ // =============================================================================
152
+ // Helpers (module-private)
153
+ // =============================================================================
154
+ function inferAction(toolNames) {
155
+ if (toolNames.includes('git_commit'))
156
+ return 'commit';
157
+ if (toolNames.includes('run_tests'))
158
+ return 'test';
159
+ if (toolNames.includes('run_lint'))
160
+ return 'lint';
161
+ if (toolNames.includes('run_build'))
162
+ return 'build';
163
+ if (toolNames.includes('write_file') && !toolNames.includes('edit'))
164
+ return 'create';
165
+ if (toolNames.includes('edit'))
166
+ return 'edit';
167
+ return 'modify';
168
+ }
169
+ function buildSummary(toolNames, files, totalLines) {
170
+ const action = inferAction(toolNames);
171
+ const fileStr = files.length === 1 ? files[0] : `${String(files.length)} files`;
172
+ const lineStr = totalLines > 0 ? ` (${String(totalLines)} lines)` : '';
173
+ return `${action}: ${fileStr}${lineStr}`;
174
+ }
175
+ function hasMultipleLanguages(files) {
176
+ const extensions = new Set();
177
+ for (const f of files) {
178
+ const ext = f.split('.').pop();
179
+ if (ext)
180
+ extensions.add(ext);
181
+ }
182
+ return extensions.size > 1;
183
+ }
184
+ function isTestFile(file) {
185
+ return /\.(test|spec)\.[a-z]+$/i.test(file) || file.includes('__tests__');
186
+ }
187
+ function isConfigFile(file) {
188
+ const base = file.split('/').pop() ?? '';
189
+ return (base.startsWith('.') ||
190
+ base === 'package.json' ||
191
+ base === 'tsconfig.json' ||
192
+ base.endsWith('.config.ts') ||
193
+ base.endsWith('.config.js') ||
194
+ base.endsWith('.config.mjs'));
195
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Significant Work Detection
3
+ *
4
+ * Determines which tool calls represent meaningful work (writes, edits, commits)
5
+ * versus read-only exploration (reads, greps, globs).
6
+ */
7
+ /**
8
+ * Check if a tool call represents significant work worth recording.
9
+ * Returns false for failed tool calls (fail-closed: don't record broken work).
10
+ */
11
+ export declare function isSignificantWork(toolName: string, _input: Record<string, unknown>, success: boolean): boolean;
12
+ /**
13
+ * Extract affected file paths from a tool call's input.
14
+ * Returns an empty array if no files can be extracted.
15
+ */
16
+ export declare function extractAffectedFiles(toolName: string, input: Record<string, unknown>): string[];
17
+ /**
18
+ * Extract lines changed from a tool result, best-effort.
19
+ * Returns 0 if the information is not available.
20
+ */
21
+ export declare function extractLinesChanged(result: Record<string, unknown>): number;
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Significant Work Detection
3
+ *
4
+ * Determines which tool calls represent meaningful work (writes, edits, commits)
5
+ * versus read-only exploration (reads, greps, globs).
6
+ */
7
+ import { TOOL_NAMES } from '../tool-names.js';
8
+ /** Tool names that represent significant (mutating) work */
9
+ const SIGNIFICANT_TOOLS = new Set([
10
+ TOOL_NAMES.WRITE_FILE,
11
+ TOOL_NAMES.EDIT,
12
+ TOOL_NAMES.GIT_COMMIT,
13
+ TOOL_NAMES.GIT_STASH,
14
+ TOOL_NAMES.RUN_TESTS,
15
+ TOOL_NAMES.RUN_LINT,
16
+ TOOL_NAMES.RUN_BUILD,
17
+ ]);
18
+ /**
19
+ * Check if a tool call represents significant work worth recording.
20
+ * Returns false for failed tool calls (fail-closed: don't record broken work).
21
+ */
22
+ export function isSignificantWork(toolName, _input, success) {
23
+ if (!success)
24
+ return false;
25
+ return SIGNIFICANT_TOOLS.has(toolName);
26
+ }
27
+ /**
28
+ * Extract affected file paths from a tool call's input.
29
+ * Returns an empty array if no files can be extracted.
30
+ */
31
+ export function extractAffectedFiles(toolName, input) {
32
+ if (toolName === TOOL_NAMES.WRITE_FILE && typeof input.path === 'string') {
33
+ return [input.path];
34
+ }
35
+ if (toolName === TOOL_NAMES.EDIT && typeof input.filePath === 'string') {
36
+ return [input.filePath];
37
+ }
38
+ return [];
39
+ }
40
+ /**
41
+ * Extract lines changed from a tool result, best-effort.
42
+ * Returns 0 if the information is not available.
43
+ */
44
+ export function extractLinesChanged(result) {
45
+ // Some tools report linesWritten directly
46
+ if (typeof result.linesWritten === 'number') {
47
+ return result.linesWritten;
48
+ }
49
+ // Edit results may have linesAdded + linesRemoved
50
+ const added = typeof result.linesAdded === 'number' ? result.linesAdded : 0;
51
+ const removed = typeof result.linesRemoved === 'number' ? result.linesRemoved : 0;
52
+ if (added > 0 || removed > 0) {
53
+ return added + removed;
54
+ }
55
+ return 0;
56
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * File-Based Episode Store
3
+ *
4
+ * Persists work episodes to a JSON file per project.
5
+ * Uses an in-memory cache — all reads are synchronous, writes are async (fire-and-forget).
6
+ */
7
+ import type { WorkEpisode, ProjectWorkSummary, Effort, EpisodeStore } from '@compilr-dev/agents';
8
+ export interface FileEpisodeStoreOptions {
9
+ /** Path to the episodes JSON file */
10
+ filePath: string;
11
+ /** Maximum episodes to keep (oldest pruned on flush). Default: 1000 */
12
+ maxEpisodes?: number;
13
+ /** Maximum age in milliseconds for cleanup. Default: 30 days */
14
+ maxAgeMs?: number;
15
+ }
16
+ export declare class FileEpisodeStore implements EpisodeStore {
17
+ private readonly filePath;
18
+ private readonly maxEpisodes;
19
+ private readonly maxAgeMs;
20
+ private _episodes;
21
+ private flushPromise;
22
+ constructor(options: FileEpisodeStoreOptions);
23
+ /** Lazy-load and return the in-memory episode cache */
24
+ private get episodes();
25
+ save(episode: WorkEpisode): void;
26
+ saveBatch(episodes: WorkEpisode[]): void;
27
+ getAll(): WorkEpisode[];
28
+ getByFiles(files: string[]): WorkEpisode[];
29
+ getByAgent(agentId: string): WorkEpisode[];
30
+ getBySession(sessionId: string): WorkEpisode[];
31
+ getByTimeRange(start: string, end: string): WorkEpisode[];
32
+ getRecent(count: number): WorkEpisode[];
33
+ getWorkSummary(): ProjectWorkSummary;
34
+ getTotalEffort(episodes?: WorkEpisode[]): Effort;
35
+ cleanup(maxAgeMs?: number): number;
36
+ private loadFromDisk;
37
+ private flush;
38
+ }
@@ -0,0 +1,199 @@
1
+ /**
2
+ * File-Based Episode Store
3
+ *
4
+ * Persists work episodes to a JSON file per project.
5
+ * Uses an in-memory cache — all reads are synchronous, writes are async (fire-and-forget).
6
+ */
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import { EFFORT_ORDER } from '@compilr-dev/agents';
10
+ // =============================================================================
11
+ // Constants
12
+ // =============================================================================
13
+ const DEFAULT_MAX_EPISODES = 1000;
14
+ const DEFAULT_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000; // 30 days
15
+ // =============================================================================
16
+ // Implementation
17
+ // =============================================================================
18
+ export class FileEpisodeStore {
19
+ filePath;
20
+ maxEpisodes;
21
+ maxAgeMs;
22
+ _episodes = null; // lazy-loaded
23
+ flushPromise = null;
24
+ constructor(options) {
25
+ this.filePath = options.filePath;
26
+ this.maxEpisodes = options.maxEpisodes ?? DEFAULT_MAX_EPISODES;
27
+ this.maxAgeMs = options.maxAgeMs ?? DEFAULT_MAX_AGE_MS;
28
+ }
29
+ /** Lazy-load and return the in-memory episode cache */
30
+ get episodes() {
31
+ if (this._episodes === null) {
32
+ this._episodes = this.loadFromDisk();
33
+ }
34
+ return this._episodes;
35
+ }
36
+ // ---------------------------------------------------------------------------
37
+ // Write methods
38
+ // ---------------------------------------------------------------------------
39
+ save(episode) {
40
+ this.episodes.push(episode);
41
+ void this.flush();
42
+ }
43
+ saveBatch(episodes) {
44
+ if (episodes.length === 0)
45
+ return;
46
+ this.episodes.push(...episodes);
47
+ void this.flush();
48
+ }
49
+ // ---------------------------------------------------------------------------
50
+ // Read methods (synchronous — read from cache)
51
+ // ---------------------------------------------------------------------------
52
+ getAll() {
53
+ return [...this.episodes];
54
+ }
55
+ getByFiles(files) {
56
+ const fileSet = new Set(files);
57
+ return this.episodes.filter((ep) => ep.files.some((f) => fileSet.has(f)));
58
+ }
59
+ getByAgent(agentId) {
60
+ return this.episodes.filter((ep) => ep.agentId === agentId);
61
+ }
62
+ getBySession(sessionId) {
63
+ return this.episodes.filter((ep) => ep.sessionId === sessionId);
64
+ }
65
+ getByTimeRange(start, end) {
66
+ return this.episodes.filter((ep) => ep.timestamp >= start && ep.timestamp <= end);
67
+ }
68
+ getRecent(count) {
69
+ return this.episodes.slice(-count);
70
+ }
71
+ getWorkSummary() {
72
+ const eps = this.episodes;
73
+ // Agent breakdown
74
+ const agentMap = new Map();
75
+ for (const ep of eps) {
76
+ const entry = agentMap.get(ep.agentId) ?? { count: 0, maxEffort: 'trivial', timeMs: 0 };
77
+ entry.count++;
78
+ if (EFFORT_ORDER.indexOf(ep.effort) > EFFORT_ORDER.indexOf(entry.maxEffort)) {
79
+ entry.maxEffort = ep.effort;
80
+ }
81
+ entry.timeMs += ep.durationMs ?? 0;
82
+ agentMap.set(ep.agentId, entry);
83
+ }
84
+ // Top files
85
+ const fileCount = new Map();
86
+ for (const ep of eps) {
87
+ for (const f of ep.files) {
88
+ fileCount.set(f, (fileCount.get(f) ?? 0) + 1);
89
+ }
90
+ }
91
+ const topFiles = [...fileCount.entries()]
92
+ .sort((a, b) => b[1] - a[1])
93
+ .slice(0, 10)
94
+ .map(([p, touchCount]) => ({ path: p, touchCount }));
95
+ // Uncommitted work: episodes after last git_commit episode
96
+ let lastCommitIdx = -1;
97
+ for (let i = eps.length - 1; i >= 0; i--) {
98
+ if (eps[i].action === 'commit') {
99
+ lastCommitIdx = i;
100
+ break;
101
+ }
102
+ }
103
+ const uncommittedWork = lastCommitIdx >= 0 ? eps.slice(lastCommitIdx + 1) : [...eps];
104
+ return {
105
+ episodeCount: eps.length,
106
+ totalEffort: this.getTotalEffort(eps),
107
+ timeSpentMs: eps.reduce((sum, ep) => sum + (ep.durationMs ?? 0), 0),
108
+ agentBreakdown: [...agentMap.entries()].map(([agentId, entry]) => ({
109
+ agentId,
110
+ episodeCount: entry.count,
111
+ maxEffort: entry.maxEffort,
112
+ timeSpentMs: entry.timeMs,
113
+ })),
114
+ topFiles,
115
+ uncommittedWork,
116
+ };
117
+ }
118
+ getTotalEffort(episodes) {
119
+ const eps = episodes ?? this.episodes;
120
+ if (eps.length === 0)
121
+ return 'trivial';
122
+ return maxEffort(eps);
123
+ }
124
+ // ---------------------------------------------------------------------------
125
+ // Cleanup
126
+ // ---------------------------------------------------------------------------
127
+ cleanup(maxAgeMs) {
128
+ const cutoff = new Date(Date.now() - (maxAgeMs ?? this.maxAgeMs)).toISOString();
129
+ const before = this.episodes.length;
130
+ this._episodes = this.episodes.filter((ep) => ep.timestamp > cutoff);
131
+ const removed = before - this._episodes.length;
132
+ if (removed > 0) {
133
+ void this.flush();
134
+ }
135
+ return removed;
136
+ }
137
+ // ---------------------------------------------------------------------------
138
+ // Internal
139
+ // ---------------------------------------------------------------------------
140
+ loadFromDisk() {
141
+ try {
142
+ if (!fs.existsSync(this.filePath))
143
+ return [];
144
+ const raw = fs.readFileSync(this.filePath, 'utf-8');
145
+ const data = JSON.parse(raw);
146
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data from disk, version may differ
147
+ if (data.version === 1 && Array.isArray(data.episodes)) {
148
+ return data.episodes;
149
+ }
150
+ return [];
151
+ }
152
+ catch {
153
+ // Corrupted file — start fresh
154
+ return [];
155
+ }
156
+ }
157
+ async flush() {
158
+ // Coalesce concurrent flushes
159
+ if (this.flushPromise)
160
+ return this.flushPromise;
161
+ this.flushPromise = (async () => {
162
+ try {
163
+ const dir = path.dirname(this.filePath);
164
+ await fs.promises.mkdir(dir, { recursive: true });
165
+ // Prune to max episodes (keep most recent)
166
+ const eps = this.episodes;
167
+ const prunedEpisodes = eps.length > this.maxEpisodes ? eps.slice(-this.maxEpisodes) : eps;
168
+ if (prunedEpisodes !== eps) {
169
+ this._episodes = prunedEpisodes;
170
+ }
171
+ const data = {
172
+ version: 1,
173
+ episodes: prunedEpisodes,
174
+ lastCleanup: new Date().toISOString(),
175
+ };
176
+ await fs.promises.writeFile(this.filePath, JSON.stringify(data, null, 2), 'utf-8');
177
+ }
178
+ catch {
179
+ // Silently fail — episodes are best-effort, never crash the CLI
180
+ }
181
+ finally {
182
+ this.flushPromise = null;
183
+ }
184
+ })();
185
+ return this.flushPromise;
186
+ }
187
+ }
188
+ // =============================================================================
189
+ // Helpers (module-private)
190
+ // =============================================================================
191
+ function maxEffort(episodes) {
192
+ let max = 'trivial';
193
+ for (const ep of episodes) {
194
+ if (EFFORT_ORDER.indexOf(ep.effort) > EFFORT_ORDER.indexOf(max)) {
195
+ max = ep.effort;
196
+ }
197
+ }
198
+ return max;
199
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Episodic Memory Types (CLI)
3
+ *
4
+ * Re-exports core types from @compilr-dev/agents and adds CLI-internal types.
5
+ */
6
+ export type { Effort, WorkEpisode, EffortSignals, EffortWeights, EffortSummary, ProjectWorkSummary, WorkAtRisk, EpisodeStore, } from '@compilr-dev/agents';
7
+ /**
8
+ * Pending tool signal — accumulated during a batch window before
9
+ * being rolled into a WorkEpisode.
10
+ */
11
+ export interface PendingToolSignal {
12
+ /** Tool name that was invoked */
13
+ toolName: string;
14
+ /** Files affected by this tool call */
15
+ files: string[];
16
+ /** Lines changed, if known */
17
+ linesChanged: number;
18
+ /** Duration of the tool call in milliseconds */
19
+ durationMs: number;
20
+ /** Whether the tool call succeeded */
21
+ success: boolean;
22
+ /** ISO timestamp of the tool call */
23
+ timestamp: string;
24
+ }
25
+ /**
26
+ * On-disk format for the episodes JSON file.
27
+ */
28
+ export interface EpisodeFile {
29
+ /** File format version */
30
+ version: 1;
31
+ /** All stored episodes */
32
+ episodes: import('@compilr-dev/agents').WorkEpisode[];
33
+ /** ISO timestamp of last cleanup */
34
+ lastCleanup: string;
35
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Episodic Memory Types (CLI)
3
+ *
4
+ * Re-exports core types from @compilr-dev/agents and adds CLI-internal types.
5
+ */
6
+ export {};
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Work At Risk Query
3
+ *
4
+ * Pure function to query episodes by affected files and build a WorkAtRisk summary.
5
+ * Used by guardrails and rehearsal to warn about destructive operations.
6
+ */
7
+ import type { EpisodeStore, WorkAtRisk } from '@compilr-dev/agents';
8
+ /**
9
+ * Query episodes that touch any of the given files and build a WorkAtRisk summary.
10
+ * Returns null if no episodes are at risk.
11
+ */
12
+ export declare function queryWorkAtRisk(store: EpisodeStore, files: string[]): WorkAtRisk | null;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Work At Risk Query
3
+ *
4
+ * Pure function to query episodes by affected files and build a WorkAtRisk summary.
5
+ * Used by guardrails and rehearsal to warn about destructive operations.
6
+ */
7
+ import { EFFORT_ORDER } from '@compilr-dev/agents';
8
+ /**
9
+ * Query episodes that touch any of the given files and build a WorkAtRisk summary.
10
+ * Returns null if no episodes are at risk.
11
+ */
12
+ export function queryWorkAtRisk(store, files) {
13
+ const episodes = store.getByFiles(files);
14
+ if (episodes.length === 0)
15
+ return null;
16
+ // Max effort
17
+ let totalEffort = 'trivial';
18
+ for (const ep of episodes) {
19
+ if (EFFORT_ORDER.indexOf(ep.effort) > EFFORT_ORDER.indexOf(totalEffort)) {
20
+ totalEffort = ep.effort;
21
+ }
22
+ }
23
+ // Agent attribution: "agentId (terminalPrefix)"
24
+ const seen = new Set();
25
+ const agentAttribution = [];
26
+ for (const ep of episodes) {
27
+ const key = `${ep.agentId} (${ep.terminalPrefix})`;
28
+ if (!seen.has(key)) {
29
+ seen.add(key);
30
+ agentAttribution.push(key);
31
+ }
32
+ }
33
+ // Warning message
34
+ const fileCount = new Set(episodes.flatMap(ep => ep.files)).size;
35
+ const warningMessage = `⚠️ ${String(episodes.length)} episode(s) of work (effort: ${totalEffort}) ` +
36
+ `on ${String(fileCount)} file(s) by ${agentAttribution.join(', ')} would be affected.`;
37
+ return { episodes, totalEffort, agentAttribution, warningMessage };
38
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Work Summary Anchor
3
+ *
4
+ * Manages an auto-generated anchor that summarizes work done in the current session.
5
+ * Updated automatically after each episode batch is flushed.
6
+ */
7
+ import type { EpisodeStore, ProjectWorkSummary } from '@compilr-dev/agents';
8
+ import type { AnchorManager } from '@compilr-dev/sdk';
9
+ export interface WorkSummaryAnchorConfig {
10
+ store: EpisodeStore;
11
+ projectId: string;
12
+ getAnchorManager: (projectId: string) => AnchorManager;
13
+ }
14
+ /**
15
+ * Build the anchor content string from the store's work summary.
16
+ * Returns null when there are no episodes to summarize.
17
+ */
18
+ export declare function buildWorkSummaryContent(summary: ProjectWorkSummary): string | null;
19
+ /**
20
+ * Update the work summary anchor for a project.
21
+ * Removes existing anchor (if any) and adds updated one.
22
+ */
23
+ export declare function updateWorkSummaryAnchor(config: WorkSummaryAnchorConfig): void;