@edwardlee5423/magi 0.1.0-alpha.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 (531) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +184 -0
  3. package/dist/agent/headless-agent.d.ts +15 -0
  4. package/dist/agent/headless-agent.js +105 -0
  5. package/dist/agent/headless-agent.js.map +1 -0
  6. package/dist/agent/local-plan.d.ts +20 -0
  7. package/dist/agent/local-plan.js +30 -0
  8. package/dist/agent/local-plan.js.map +1 -0
  9. package/dist/agent/query-engine.d.ts +71 -0
  10. package/dist/agent/query-engine.js +938 -0
  11. package/dist/agent/query-engine.js.map +1 -0
  12. package/dist/agent/query.d.ts +128 -0
  13. package/dist/agent/query.js +674 -0
  14. package/dist/agent/query.js.map +1 -0
  15. package/dist/agent/system-prompt.d.ts +12 -0
  16. package/dist/agent/system-prompt.js +104 -0
  17. package/dist/agent/system-prompt.js.map +1 -0
  18. package/dist/agent/tools.d.ts +71 -0
  19. package/dist/agent/tools.js +37 -0
  20. package/dist/agent/tools.js.map +1 -0
  21. package/dist/agents/roles.d.ts +9 -0
  22. package/dist/agents/roles.js +18 -0
  23. package/dist/agents/roles.js.map +1 -0
  24. package/dist/agents/task-queue.d.ts +13 -0
  25. package/dist/agents/task-queue.js +50 -0
  26. package/dist/agents/task-queue.js.map +1 -0
  27. package/dist/cli.d.ts +7 -0
  28. package/dist/cli.js +1540 -0
  29. package/dist/cli.js.map +1 -0
  30. package/dist/colors.d.ts +20 -0
  31. package/dist/colors.js +92 -0
  32. package/dist/colors.js.map +1 -0
  33. package/dist/commands/agents.d.ts +9 -0
  34. package/dist/commands/agents.js +37 -0
  35. package/dist/commands/agents.js.map +1 -0
  36. package/dist/commands/clear.d.ts +9 -0
  37. package/dist/commands/clear.js +20 -0
  38. package/dist/commands/clear.js.map +1 -0
  39. package/dist/commands/commit.d.ts +8 -0
  40. package/dist/commands/commit.js +35 -0
  41. package/dist/commands/commit.js.map +1 -0
  42. package/dist/commands/compact.d.ts +8 -0
  43. package/dist/commands/compact.js +29 -0
  44. package/dist/commands/compact.js.map +1 -0
  45. package/dist/commands/copy.d.ts +8 -0
  46. package/dist/commands/copy.js +49 -0
  47. package/dist/commands/copy.js.map +1 -0
  48. package/dist/commands/cost.d.ts +8 -0
  49. package/dist/commands/cost.js +94 -0
  50. package/dist/commands/cost.js.map +1 -0
  51. package/dist/commands/diff.d.ts +8 -0
  52. package/dist/commands/diff.js +38 -0
  53. package/dist/commands/diff.js.map +1 -0
  54. package/dist/commands/doctor.d.ts +8 -0
  55. package/dist/commands/doctor.js +23 -0
  56. package/dist/commands/doctor.js.map +1 -0
  57. package/dist/commands/export.d.ts +8 -0
  58. package/dist/commands/export.js +42 -0
  59. package/dist/commands/export.js.map +1 -0
  60. package/dist/commands/fork.d.ts +8 -0
  61. package/dist/commands/fork.js +20 -0
  62. package/dist/commands/fork.js.map +1 -0
  63. package/dist/commands/goal.d.ts +9 -0
  64. package/dist/commands/goal.js +54 -0
  65. package/dist/commands/goal.js.map +1 -0
  66. package/dist/commands/help.d.ts +8 -0
  67. package/dist/commands/help.js +65 -0
  68. package/dist/commands/help.js.map +1 -0
  69. package/dist/commands/hooks.d.ts +8 -0
  70. package/dist/commands/hooks.js +56 -0
  71. package/dist/commands/hooks.js.map +1 -0
  72. package/dist/commands/image.d.ts +17 -0
  73. package/dist/commands/image.js +74 -0
  74. package/dist/commands/image.js.map +1 -0
  75. package/dist/commands/init.d.ts +26 -0
  76. package/dist/commands/init.js +214 -0
  77. package/dist/commands/init.js.map +1 -0
  78. package/dist/commands/mcp.d.ts +8 -0
  79. package/dist/commands/mcp.js +217 -0
  80. package/dist/commands/mcp.js.map +1 -0
  81. package/dist/commands/memory.d.ts +8 -0
  82. package/dist/commands/memory.js +79 -0
  83. package/dist/commands/memory.js.map +1 -0
  84. package/dist/commands/model.d.ts +8 -0
  85. package/dist/commands/model.js +21 -0
  86. package/dist/commands/model.js.map +1 -0
  87. package/dist/commands/permissions.d.ts +9 -0
  88. package/dist/commands/permissions.js +30 -0
  89. package/dist/commands/permissions.js.map +1 -0
  90. package/dist/commands/proactive.d.ts +9 -0
  91. package/dist/commands/proactive.js +24 -0
  92. package/dist/commands/proactive.js.map +1 -0
  93. package/dist/commands/register-all.d.ts +1 -0
  94. package/dist/commands/register-all.js +68 -0
  95. package/dist/commands/register-all.js.map +1 -0
  96. package/dist/commands/registry.d.ts +64 -0
  97. package/dist/commands/registry.js +235 -0
  98. package/dist/commands/registry.js.map +1 -0
  99. package/dist/commands/rename.d.ts +8 -0
  100. package/dist/commands/rename.js +16 -0
  101. package/dist/commands/rename.js.map +1 -0
  102. package/dist/commands/review.d.ts +8 -0
  103. package/dist/commands/review.js +13 -0
  104. package/dist/commands/review.js.map +1 -0
  105. package/dist/commands/rewind.d.ts +8 -0
  106. package/dist/commands/rewind.js +45 -0
  107. package/dist/commands/rewind.js.map +1 -0
  108. package/dist/commands/route.d.ts +9 -0
  109. package/dist/commands/route.js +83 -0
  110. package/dist/commands/route.js.map +1 -0
  111. package/dist/commands/sessions.d.ts +9 -0
  112. package/dist/commands/sessions.js +25 -0
  113. package/dist/commands/sessions.js.map +1 -0
  114. package/dist/commands/skill.d.ts +9 -0
  115. package/dist/commands/skill.js +46 -0
  116. package/dist/commands/skill.js.map +1 -0
  117. package/dist/commands/status.d.ts +8 -0
  118. package/dist/commands/status.js +41 -0
  119. package/dist/commands/status.js.map +1 -0
  120. package/dist/commands/summary.d.ts +8 -0
  121. package/dist/commands/summary.js +39 -0
  122. package/dist/commands/summary.js.map +1 -0
  123. package/dist/commands/tasks.d.ts +9 -0
  124. package/dist/commands/tasks.js +70 -0
  125. package/dist/commands/tasks.js.map +1 -0
  126. package/dist/commands/todos.d.ts +9 -0
  127. package/dist/commands/todos.js +27 -0
  128. package/dist/commands/todos.js.map +1 -0
  129. package/dist/commands/tutorial.d.ts +8 -0
  130. package/dist/commands/tutorial.js +159 -0
  131. package/dist/commands/tutorial.js.map +1 -0
  132. package/dist/commands/upgrade.d.ts +9 -0
  133. package/dist/commands/upgrade.js +73 -0
  134. package/dist/commands/upgrade.js.map +1 -0
  135. package/dist/commands/usage.d.ts +8 -0
  136. package/dist/commands/usage.js +54 -0
  137. package/dist/commands/usage.js.map +1 -0
  138. package/dist/commands/vim.d.ts +10 -0
  139. package/dist/commands/vim.js +34 -0
  140. package/dist/commands/vim.js.map +1 -0
  141. package/dist/config.d.ts +104 -0
  142. package/dist/config.js +533 -0
  143. package/dist/config.js.map +1 -0
  144. package/dist/context/compaction.d.ts +66 -0
  145. package/dist/context/compaction.js +353 -0
  146. package/dist/context/compaction.js.map +1 -0
  147. package/dist/context/layers.d.ts +32 -0
  148. package/dist/context/layers.js +114 -0
  149. package/dist/context/layers.js.map +1 -0
  150. package/dist/context/token-budget.d.ts +21 -0
  151. package/dist/context/token-budget.js +70 -0
  152. package/dist/context/token-budget.js.map +1 -0
  153. package/dist/control/auth.d.ts +17 -0
  154. package/dist/control/auth.js +31 -0
  155. package/dist/control/auth.js.map +1 -0
  156. package/dist/control/daemon.d.ts +38 -0
  157. package/dist/control/daemon.js +135 -0
  158. package/dist/control/daemon.js.map +1 -0
  159. package/dist/control/mdns.d.ts +51 -0
  160. package/dist/control/mdns.js +344 -0
  161. package/dist/control/mdns.js.map +1 -0
  162. package/dist/control/peer-client.d.ts +49 -0
  163. package/dist/control/peer-client.js +170 -0
  164. package/dist/control/peer-client.js.map +1 -0
  165. package/dist/control/server.d.ts +30 -0
  166. package/dist/control/server.js +887 -0
  167. package/dist/control/server.js.map +1 -0
  168. package/dist/cost.d.ts +23 -0
  169. package/dist/cost.js +80 -0
  170. package/dist/cost.js.map +1 -0
  171. package/dist/doctor.d.ts +8 -0
  172. package/dist/doctor.js +22 -0
  173. package/dist/doctor.js.map +1 -0
  174. package/dist/env.d.ts +7 -0
  175. package/dist/env.js +70 -0
  176. package/dist/env.js.map +1 -0
  177. package/dist/errors.d.ts +6 -0
  178. package/dist/errors.js +13 -0
  179. package/dist/errors.js.map +1 -0
  180. package/dist/events.d.ts +19 -0
  181. package/dist/events.js +236 -0
  182. package/dist/events.js.map +1 -0
  183. package/dist/fs-utils.d.ts +21 -0
  184. package/dist/fs-utils.js +48 -0
  185. package/dist/fs-utils.js.map +1 -0
  186. package/dist/goal.d.ts +32 -0
  187. package/dist/goal.js +172 -0
  188. package/dist/goal.js.map +1 -0
  189. package/dist/headless.d.ts +38 -0
  190. package/dist/headless.js +547 -0
  191. package/dist/headless.js.map +1 -0
  192. package/dist/history.d.ts +8 -0
  193. package/dist/history.js +77 -0
  194. package/dist/history.js.map +1 -0
  195. package/dist/hooks/events.d.ts +14 -0
  196. package/dist/hooks/events.js +37 -0
  197. package/dist/hooks/events.js.map +1 -0
  198. package/dist/hooks/runner.d.ts +73 -0
  199. package/dist/hooks/runner.js +256 -0
  200. package/dist/hooks/runner.js.map +1 -0
  201. package/dist/hooks/trigger.d.ts +9 -0
  202. package/dist/hooks/trigger.js +18 -0
  203. package/dist/hooks/trigger.js.map +1 -0
  204. package/dist/index.d.ts +61 -0
  205. package/dist/index.js +62 -0
  206. package/dist/index.js.map +1 -0
  207. package/dist/interactions.d.ts +102 -0
  208. package/dist/interactions.js +250 -0
  209. package/dist/interactions.js.map +1 -0
  210. package/dist/logger.d.ts +32 -0
  211. package/dist/logger.js +115 -0
  212. package/dist/logger.js.map +1 -0
  213. package/dist/markdown.d.ts +18 -0
  214. package/dist/markdown.js +293 -0
  215. package/dist/markdown.js.map +1 -0
  216. package/dist/mcp/approval.d.ts +9 -0
  217. package/dist/mcp/approval.js +27 -0
  218. package/dist/mcp/approval.js.map +1 -0
  219. package/dist/mcp/client.d.ts +61 -0
  220. package/dist/mcp/client.js +276 -0
  221. package/dist/mcp/client.js.map +1 -0
  222. package/dist/mcp/connection-manager.d.ts +30 -0
  223. package/dist/mcp/connection-manager.js +126 -0
  224. package/dist/mcp/connection-manager.js.map +1 -0
  225. package/dist/mcp/oauth-callback.d.ts +23 -0
  226. package/dist/mcp/oauth-callback.js +108 -0
  227. package/dist/mcp/oauth-callback.js.map +1 -0
  228. package/dist/mcp/oauth-flow.d.ts +45 -0
  229. package/dist/mcp/oauth-flow.js +145 -0
  230. package/dist/mcp/oauth-flow.js.map +1 -0
  231. package/dist/mcp/oauth.d.ts +82 -0
  232. package/dist/mcp/oauth.js +169 -0
  233. package/dist/mcp/oauth.js.map +1 -0
  234. package/dist/mcp/tool-registry.d.ts +29 -0
  235. package/dist/mcp/tool-registry.js +207 -0
  236. package/dist/mcp/tool-registry.js.map +1 -0
  237. package/dist/mcp/transport.d.ts +33 -0
  238. package/dist/mcp/transport.js +493 -0
  239. package/dist/mcp/transport.js.map +1 -0
  240. package/dist/mcp/types.d.ts +57 -0
  241. package/dist/mcp/types.js +2 -0
  242. package/dist/mcp/types.js.map +1 -0
  243. package/dist/memdir.d.ts +58 -0
  244. package/dist/memdir.js +219 -0
  245. package/dist/memdir.js.map +1 -0
  246. package/dist/memory-selection.d.ts +30 -0
  247. package/dist/memory-selection.js +102 -0
  248. package/dist/memory-selection.js.map +1 -0
  249. package/dist/memory.d.ts +85 -0
  250. package/dist/memory.js +259 -0
  251. package/dist/memory.js.map +1 -0
  252. package/dist/paths.d.ts +25 -0
  253. package/dist/paths.js +99 -0
  254. package/dist/paths.js.map +1 -0
  255. package/dist/permissions.d.ts +17 -0
  256. package/dist/permissions.js +72 -0
  257. package/dist/permissions.js.map +1 -0
  258. package/dist/plugins/manifest.d.ts +17 -0
  259. package/dist/plugins/manifest.js +98 -0
  260. package/dist/plugins/manifest.js.map +1 -0
  261. package/dist/plugins/marketplace.d.ts +22 -0
  262. package/dist/plugins/marketplace.js +98 -0
  263. package/dist/plugins/marketplace.js.map +1 -0
  264. package/dist/proactive.d.ts +15 -0
  265. package/dist/proactive.js +49 -0
  266. package/dist/proactive.js.map +1 -0
  267. package/dist/providers/errors.d.ts +14 -0
  268. package/dist/providers/errors.js +66 -0
  269. package/dist/providers/errors.js.map +1 -0
  270. package/dist/providers/format-proxy.d.ts +100 -0
  271. package/dist/providers/format-proxy.js +235 -0
  272. package/dist/providers/format-proxy.js.map +1 -0
  273. package/dist/providers/http.d.ts +4 -0
  274. package/dist/providers/http.js +21 -0
  275. package/dist/providers/http.js.map +1 -0
  276. package/dist/providers/ir.d.ts +84 -0
  277. package/dist/providers/ir.js +76 -0
  278. package/dist/providers/ir.js.map +1 -0
  279. package/dist/providers/messages-compatible.d.ts +19 -0
  280. package/dist/providers/messages-compatible.js +592 -0
  281. package/dist/providers/messages-compatible.js.map +1 -0
  282. package/dist/providers/openai.d.ts +18 -0
  283. package/dist/providers/openai.js +430 -0
  284. package/dist/providers/openai.js.map +1 -0
  285. package/dist/providers/registry.d.ts +10 -0
  286. package/dist/providers/registry.js +16 -0
  287. package/dist/providers/registry.js.map +1 -0
  288. package/dist/providers/sse.d.ts +6 -0
  289. package/dist/providers/sse.js +104 -0
  290. package/dist/providers/sse.js.map +1 -0
  291. package/dist/routing/model-alias.d.ts +8 -0
  292. package/dist/routing/model-alias.js +23 -0
  293. package/dist/routing/model-alias.js.map +1 -0
  294. package/dist/routing/model-router.d.ts +55 -0
  295. package/dist/routing/model-router.js +233 -0
  296. package/dist/routing/model-router.js.map +1 -0
  297. package/dist/routing/router.d.ts +26 -0
  298. package/dist/routing/router.js +63 -0
  299. package/dist/routing/router.js.map +1 -0
  300. package/dist/rules/agents-loader.d.ts +12 -0
  301. package/dist/rules/agents-loader.js +61 -0
  302. package/dist/rules/agents-loader.js.map +1 -0
  303. package/dist/runner/client.d.ts +67 -0
  304. package/dist/runner/client.js +175 -0
  305. package/dist/runner/client.js.map +1 -0
  306. package/dist/session-store.d.ts +250 -0
  307. package/dist/session-store.js +629 -0
  308. package/dist/session-store.js.map +1 -0
  309. package/dist/skills/bundled.d.ts +14 -0
  310. package/dist/skills/bundled.js +148 -0
  311. package/dist/skills/bundled.js.map +1 -0
  312. package/dist/skills/loader.d.ts +11 -0
  313. package/dist/skills/loader.js +73 -0
  314. package/dist/skills/loader.js.map +1 -0
  315. package/dist/slash-menu.d.ts +14 -0
  316. package/dist/slash-menu.js +166 -0
  317. package/dist/slash-menu.js.map +1 -0
  318. package/dist/slash.d.ts +75 -0
  319. package/dist/slash.js +126 -0
  320. package/dist/slash.js.map +1 -0
  321. package/dist/spinner.d.ts +27 -0
  322. package/dist/spinner.js +68 -0
  323. package/dist/spinner.js.map +1 -0
  324. package/dist/ssh/exec.d.ts +20 -0
  325. package/dist/ssh/exec.js +39 -0
  326. package/dist/ssh/exec.js.map +1 -0
  327. package/dist/ssh/file.d.ts +32 -0
  328. package/dist/ssh/file.js +60 -0
  329. package/dist/ssh/file.js.map +1 -0
  330. package/dist/syntax-highlight.d.ts +19 -0
  331. package/dist/syntax-highlight.js +181 -0
  332. package/dist/syntax-highlight.js.map +1 -0
  333. package/dist/tools/agent-tool.d.ts +53 -0
  334. package/dist/tools/agent-tool.js +62 -0
  335. package/dist/tools/agent-tool.js.map +1 -0
  336. package/dist/tools/archive-create.d.ts +35 -0
  337. package/dist/tools/archive-create.js +37 -0
  338. package/dist/tools/archive-create.js.map +1 -0
  339. package/dist/tools/archive-extract.d.ts +28 -0
  340. package/dist/tools/archive-extract.js +36 -0
  341. package/dist/tools/archive-extract.js.map +1 -0
  342. package/dist/tools/base64.d.ts +27 -0
  343. package/dist/tools/base64.js +19 -0
  344. package/dist/tools/base64.js.map +1 -0
  345. package/dist/tools/browser.d.ts +125 -0
  346. package/dist/tools/browser.js +241 -0
  347. package/dist/tools/browser.js.map +1 -0
  348. package/dist/tools/config-tool.d.ts +31 -0
  349. package/dist/tools/config-tool.js +167 -0
  350. package/dist/tools/config-tool.js.map +1 -0
  351. package/dist/tools/cron.d.ts +110 -0
  352. package/dist/tools/cron.js +299 -0
  353. package/dist/tools/cron.js.map +1 -0
  354. package/dist/tools/date.d.ts +24 -0
  355. package/dist/tools/date.js +26 -0
  356. package/dist/tools/date.js.map +1 -0
  357. package/dist/tools/dir-create.d.ts +21 -0
  358. package/dist/tools/dir-create.js +19 -0
  359. package/dist/tools/dir-create.js.map +1 -0
  360. package/dist/tools/dir-list.d.ts +36 -0
  361. package/dist/tools/dir-list.js +47 -0
  362. package/dist/tools/dir-list.js.map +1 -0
  363. package/dist/tools/disk-usage.d.ts +30 -0
  364. package/dist/tools/disk-usage.js +22 -0
  365. package/dist/tools/disk-usage.js.map +1 -0
  366. package/dist/tools/download-file.d.ts +28 -0
  367. package/dist/tools/download-file.js +42 -0
  368. package/dist/tools/download-file.js.map +1 -0
  369. package/dist/tools/environment.d.ts +31 -0
  370. package/dist/tools/environment.js +33 -0
  371. package/dist/tools/environment.js.map +1 -0
  372. package/dist/tools/errors.d.ts +5 -0
  373. package/dist/tools/errors.js +9 -0
  374. package/dist/tools/errors.js.map +1 -0
  375. package/dist/tools/file-copy.d.ts +34 -0
  376. package/dist/tools/file-copy.js +45 -0
  377. package/dist/tools/file-copy.js.map +1 -0
  378. package/dist/tools/file-delete.d.ts +34 -0
  379. package/dist/tools/file-delete.js +42 -0
  380. package/dist/tools/file-delete.js.map +1 -0
  381. package/dist/tools/file-find.d.ts +46 -0
  382. package/dist/tools/file-find.js +33 -0
  383. package/dist/tools/file-find.js.map +1 -0
  384. package/dist/tools/file-move.d.ts +33 -0
  385. package/dist/tools/file-move.js +32 -0
  386. package/dist/tools/file-move.js.map +1 -0
  387. package/dist/tools/files.d.ts +38 -0
  388. package/dist/tools/files.js +123 -0
  389. package/dist/tools/files.js.map +1 -0
  390. package/dist/tools/git-branch-delete.d.ts +27 -0
  391. package/dist/tools/git-branch-delete.js +25 -0
  392. package/dist/tools/git-branch-delete.js.map +1 -0
  393. package/dist/tools/git-reset.d.ts +30 -0
  394. package/dist/tools/git-reset.js +28 -0
  395. package/dist/tools/git-reset.js.map +1 -0
  396. package/dist/tools/git-stash.d.ts +28 -0
  397. package/dist/tools/git-stash.js +24 -0
  398. package/dist/tools/git-stash.js.map +1 -0
  399. package/dist/tools/git.d.ts +77 -0
  400. package/dist/tools/git.js +300 -0
  401. package/dist/tools/git.js.map +1 -0
  402. package/dist/tools/github.d.ts +68 -0
  403. package/dist/tools/github.js +77 -0
  404. package/dist/tools/github.js.map +1 -0
  405. package/dist/tools/head-tail.d.ts +34 -0
  406. package/dist/tools/head-tail.js +23 -0
  407. package/dist/tools/head-tail.js.map +1 -0
  408. package/dist/tools/http-request.d.ts +44 -0
  409. package/dist/tools/http-request.js +57 -0
  410. package/dist/tools/http-request.js.map +1 -0
  411. package/dist/tools/json-query.d.ts +27 -0
  412. package/dist/tools/json-query.js +90 -0
  413. package/dist/tools/json-query.js.map +1 -0
  414. package/dist/tools/kill-process.d.ts +32 -0
  415. package/dist/tools/kill-process.js +51 -0
  416. package/dist/tools/kill-process.js.map +1 -0
  417. package/dist/tools/lsp.d.ts +98 -0
  418. package/dist/tools/lsp.js +398 -0
  419. package/dist/tools/lsp.js.map +1 -0
  420. package/dist/tools/monitor.d.ts +29 -0
  421. package/dist/tools/monitor.js +78 -0
  422. package/dist/tools/monitor.js.map +1 -0
  423. package/dist/tools/network-check.d.ts +34 -0
  424. package/dist/tools/network-check.js +57 -0
  425. package/dist/tools/network-check.js.map +1 -0
  426. package/dist/tools/notebook.d.ts +63 -0
  427. package/dist/tools/notebook.js +158 -0
  428. package/dist/tools/notebook.js.map +1 -0
  429. package/dist/tools/plan-mode.d.ts +48 -0
  430. package/dist/tools/plan-mode.js +57 -0
  431. package/dist/tools/plan-mode.js.map +1 -0
  432. package/dist/tools/process-list.d.ts +35 -0
  433. package/dist/tools/process-list.js +42 -0
  434. package/dist/tools/process-list.js.map +1 -0
  435. package/dist/tools/registry.d.ts +132 -0
  436. package/dist/tools/registry.js +2262 -0
  437. package/dist/tools/registry.js.map +1 -0
  438. package/dist/tools/search.d.ts +38 -0
  439. package/dist/tools/search.js +327 -0
  440. package/dist/tools/search.js.map +1 -0
  441. package/dist/tools/shell.d.ts +18 -0
  442. package/dist/tools/shell.js +249 -0
  443. package/dist/tools/shell.js.map +1 -0
  444. package/dist/tools/skill-tool.d.ts +22 -0
  445. package/dist/tools/skill-tool.js +66 -0
  446. package/dist/tools/skill-tool.js.map +1 -0
  447. package/dist/tools/sleep.d.ts +16 -0
  448. package/dist/tools/sleep.js +24 -0
  449. package/dist/tools/sleep.js.map +1 -0
  450. package/dist/tools/snip.d.ts +26 -0
  451. package/dist/tools/snip.js +95 -0
  452. package/dist/tools/snip.js.map +1 -0
  453. package/dist/tools/system-info.d.ts +17 -0
  454. package/dist/tools/system-info.js +33 -0
  455. package/dist/tools/system-info.js.map +1 -0
  456. package/dist/tools/tasks.d.ts +191 -0
  457. package/dist/tools/tasks.js +348 -0
  458. package/dist/tools/tasks.js.map +1 -0
  459. package/dist/tools/text-stats.d.ts +25 -0
  460. package/dist/tools/text-stats.js +25 -0
  461. package/dist/tools/text-stats.js.map +1 -0
  462. package/dist/tools/todo.d.ts +69 -0
  463. package/dist/tools/todo.js +197 -0
  464. package/dist/tools/todo.js.map +1 -0
  465. package/dist/tools/tool-search.d.ts +29 -0
  466. package/dist/tools/tool-search.js +114 -0
  467. package/dist/tools/tool-search.js.map +1 -0
  468. package/dist/tools/tree-view.d.ts +34 -0
  469. package/dist/tools/tree-view.js +39 -0
  470. package/dist/tools/tree-view.js.map +1 -0
  471. package/dist/tools/user-message.d.ts +39 -0
  472. package/dist/tools/user-message.js +70 -0
  473. package/dist/tools/user-message.js.map +1 -0
  474. package/dist/tools/user-question.d.ts +88 -0
  475. package/dist/tools/user-question.js +236 -0
  476. package/dist/tools/user-question.js.map +1 -0
  477. package/dist/tools/web-browser.d.ts +53 -0
  478. package/dist/tools/web-browser.js +373 -0
  479. package/dist/tools/web-browser.js.map +1 -0
  480. package/dist/tools/web-fetch.d.ts +22 -0
  481. package/dist/tools/web-fetch.js +146 -0
  482. package/dist/tools/web-fetch.js.map +1 -0
  483. package/dist/tools/web-search.d.ts +51 -0
  484. package/dist/tools/web-search.js +198 -0
  485. package/dist/tools/web-search.js.map +1 -0
  486. package/dist/tools/which.d.ts +22 -0
  487. package/dist/tools/which.js +21 -0
  488. package/dist/tools/which.js.map +1 -0
  489. package/dist/tools/whoami.d.ts +17 -0
  490. package/dist/tools/whoami.js +24 -0
  491. package/dist/tools/whoami.js.map +1 -0
  492. package/dist/tools/workspace-diagnostics.d.ts +62 -0
  493. package/dist/tools/workspace-diagnostics.js +421 -0
  494. package/dist/tools/workspace-diagnostics.js.map +1 -0
  495. package/dist/tools/workspace.d.ts +14 -0
  496. package/dist/tools/workspace.js +65 -0
  497. package/dist/tools/workspace.js.map +1 -0
  498. package/dist/tools/worktree.d.ts +70 -0
  499. package/dist/tools/worktree.js +150 -0
  500. package/dist/tools/worktree.js.map +1 -0
  501. package/dist/tui/interactions.d.ts +25 -0
  502. package/dist/tui/interactions.js +232 -0
  503. package/dist/tui/interactions.js.map +1 -0
  504. package/dist/tui/multiline-input.d.ts +14 -0
  505. package/dist/tui/multiline-input.js +550 -0
  506. package/dist/tui/multiline-input.js.map +1 -0
  507. package/dist/tui/paste.d.ts +40 -0
  508. package/dist/tui/paste.js +113 -0
  509. package/dist/tui/paste.js.map +1 -0
  510. package/dist/tui/prompt-reader.d.ts +26 -0
  511. package/dist/tui/prompt-reader.js +553 -0
  512. package/dist/tui/prompt-reader.js.map +1 -0
  513. package/dist/tui/transcript.d.ts +34 -0
  514. package/dist/tui/transcript.js +275 -0
  515. package/dist/tui/transcript.js.map +1 -0
  516. package/dist/tui.d.ts +53 -0
  517. package/dist/tui.js +669 -0
  518. package/dist/tui.js.map +1 -0
  519. package/dist/version.d.ts +1 -0
  520. package/dist/version.js +2 -0
  521. package/dist/version.js.map +1 -0
  522. package/dist/vim/lineEditor.d.ts +18 -0
  523. package/dist/vim/lineEditor.js +420 -0
  524. package/dist/vim/lineEditor.js.map +1 -0
  525. package/dist/web/panel-html.d.ts +1 -0
  526. package/dist/web/panel-html.js +532 -0
  527. package/dist/web/panel-html.js.map +1 -0
  528. package/dist/web/panel.d.ts +4 -0
  529. package/dist/web/panel.js +121 -0
  530. package/dist/web/panel.js.map +1 -0
  531. package/package.json +42 -0
@@ -0,0 +1,353 @@
1
+ import { MagiUsageError } from "../errors.js";
2
+ import { triggerHooks } from "../hooks/events.js";
3
+ export function compactSession(input) {
4
+ const session = input.store.getSession(input.sessionId);
5
+ if (!session) {
6
+ throw new MagiUsageError(`Session not found: ${input.sessionId}`);
7
+ }
8
+ const recentMessages = input.recentMessages ?? 20;
9
+ const summaryText = buildDeterministicSummary(session, {
10
+ recentMessages,
11
+ maxSummaryChars: input.maxSummaryChars ?? 6000
12
+ });
13
+ const summary = input.store.recordContextSummary({
14
+ sessionId: session.id,
15
+ summary: summaryText,
16
+ sourceMessageCount: session.messages.length,
17
+ metadata: {
18
+ kind: "deterministic-extractive-summary",
19
+ recentMessages
20
+ }
21
+ });
22
+ return {
23
+ summary,
24
+ recovered: recoverSessionContext({
25
+ store: input.store,
26
+ sessionId: session.id,
27
+ recentMessages
28
+ })
29
+ };
30
+ }
31
+ export async function compactSessionWithHooks(input) {
32
+ const session = input.store.getSession(input.sessionId);
33
+ if (!session) {
34
+ throw new MagiUsageError(`Session not found: ${input.sessionId}`);
35
+ }
36
+ const trigger = input.trigger ?? "manual";
37
+ const pre = await triggerHooks({
38
+ event: "pre_compact",
39
+ hooks: input.hooks,
40
+ store: input.store,
41
+ sessionId: session.id,
42
+ cwd: input.cwd,
43
+ env: input.env,
44
+ context: {
45
+ source: "compact",
46
+ message: `Compacting session ${session.id}`,
47
+ notificationType: "compact_started",
48
+ trigger,
49
+ customInstructions: input.customInstructions,
50
+ sourceMessageCount: session.messages.length
51
+ }
52
+ });
53
+ const block = pre.find((hook) => hook.blocked);
54
+ if (block) {
55
+ throw new MagiUsageError(`Compaction blocked by hook: ${block.output || block.error || "blocked"}`);
56
+ }
57
+ const compacted = input.modelRunner
58
+ ? await compactSessionWithModel({
59
+ store: input.store,
60
+ sessionId: session.id,
61
+ adapter: input.modelRunner.adapter,
62
+ model: input.modelRunner.model,
63
+ providerName: input.modelRunner.providerName,
64
+ recentMessages: input.recentMessages,
65
+ maxSummaryChars: input.maxSummaryChars
66
+ })
67
+ : compactSession({
68
+ store: input.store,
69
+ sessionId: session.id,
70
+ recentMessages: input.recentMessages,
71
+ maxSummaryChars: input.maxSummaryChars
72
+ });
73
+ const post = await triggerHooks({
74
+ event: "post_compact",
75
+ hooks: input.hooks,
76
+ store: input.store,
77
+ sessionId: session.id,
78
+ cwd: input.cwd,
79
+ env: input.env,
80
+ context: {
81
+ source: "compact",
82
+ message: `Compacted session ${session.id}`,
83
+ notificationType: "compact_completed",
84
+ trigger,
85
+ customInstructions: input.customInstructions,
86
+ compactSummary: compacted.summary.summary,
87
+ sourceMessageCount: compacted.summary.sourceMessageCount
88
+ }
89
+ });
90
+ return {
91
+ ...compacted,
92
+ hooks: { pre, post }
93
+ };
94
+ }
95
+ export async function compactSessionWithModel(input) {
96
+ const session = input.store.getSession(input.sessionId);
97
+ if (!session) {
98
+ throw new MagiUsageError(`Session not found: ${input.sessionId}`);
99
+ }
100
+ if (!input.model.trim()) {
101
+ throw new MagiUsageError("Compaction model must be explicit");
102
+ }
103
+ const recentMessages = input.recentMessages ?? 20;
104
+ const micro = microcompactMessages(session.messages, {
105
+ maxToolResultChars: 2_000
106
+ });
107
+ const response = await input.adapter.complete({
108
+ model: input.model,
109
+ messages: [{
110
+ role: "user",
111
+ content: [{
112
+ type: "text",
113
+ text: buildSummarizationPrompt(session, micro.messages)
114
+ }]
115
+ }],
116
+ maxOutputTokens: input.maxOutputTokens ?? 20_000
117
+ });
118
+ const summaryText = truncateAtLineBoundary(response.text.trim(), input.maxSummaryChars ?? 20_000);
119
+ if (!summaryText) {
120
+ throw new MagiUsageError("Compaction model returned an empty summary");
121
+ }
122
+ const summary = input.store.recordContextSummary({
123
+ sessionId: session.id,
124
+ summary: summaryText,
125
+ sourceMessageCount: session.messages.length,
126
+ metadata: {
127
+ kind: "llm-summary",
128
+ provider: input.providerName,
129
+ model: input.model,
130
+ recentMessages,
131
+ microcompact: {
132
+ removedDuplicateToolResults: micro.removedDuplicateToolResults,
133
+ truncatedToolResults: micro.truncatedToolResults,
134
+ mergedSystemMessages: micro.mergedSystemMessages
135
+ }
136
+ }
137
+ });
138
+ return {
139
+ summary,
140
+ recovered: recoverSessionContext({
141
+ store: input.store,
142
+ sessionId: session.id,
143
+ recentMessages
144
+ })
145
+ };
146
+ }
147
+ export function microcompactMessages(messages, input = {}) {
148
+ const maxToolResultChars = input.maxToolResultChars ?? 2_000;
149
+ const compacted = [];
150
+ const seenToolResults = new Set();
151
+ let removedDuplicateToolResults = 0;
152
+ let truncatedToolResults = 0;
153
+ let mergedSystemMessages = 0;
154
+ for (const message of messages) {
155
+ if (message.role === "tool") {
156
+ const normalized = singleLine(message.content, maxToolResultChars);
157
+ if (seenToolResults.has(normalized)) {
158
+ removedDuplicateToolResults += 1;
159
+ continue;
160
+ }
161
+ seenToolResults.add(normalized);
162
+ if (message.content.length > maxToolResultChars) {
163
+ truncatedToolResults += 1;
164
+ compacted.push({
165
+ ...message,
166
+ content: `${message.content.slice(0, maxToolResultChars).trimEnd()}\n[tool result truncated]`
167
+ });
168
+ continue;
169
+ }
170
+ }
171
+ if (message.role === "system" && compacted.at(-1)?.role === "system") {
172
+ const previous = compacted[compacted.length - 1];
173
+ compacted[compacted.length - 1] = {
174
+ ...previous,
175
+ content: `${previous.content}\n${message.content}`
176
+ };
177
+ mergedSystemMessages += 1;
178
+ continue;
179
+ }
180
+ compacted.push(message);
181
+ }
182
+ return {
183
+ messages: compacted,
184
+ removedDuplicateToolResults,
185
+ truncatedToolResults,
186
+ mergedSystemMessages
187
+ };
188
+ }
189
+ export function recoverSessionContext(input) {
190
+ const session = input.store.getSession(input.sessionId);
191
+ if (!session) {
192
+ throw new MagiUsageError(`Session not found: ${input.sessionId}`);
193
+ }
194
+ const count = input.recentMessages ?? 20;
195
+ return {
196
+ sessionId: session.id,
197
+ summary: input.store.getLatestContextSummary(session.id),
198
+ recentMessages: session.messages.slice(Math.max(0, session.messages.length - count))
199
+ };
200
+ }
201
+ export function formatCompactResult(result) {
202
+ return [
203
+ `summaryId: ${result.summary.id}`,
204
+ `sessionId: ${result.summary.sessionId}`,
205
+ `sourceMessages: ${result.summary.sourceMessageCount}`,
206
+ `recoveredRecentMessages: ${result.recovered.recentMessages.length}`,
207
+ "summary:",
208
+ result.summary.summary,
209
+ ""
210
+ ].join("\n");
211
+ }
212
+ function buildDeterministicSummary(session, input) {
213
+ const lines = [
214
+ `Session ${session.id}`,
215
+ `Title: ${session.title ?? "(untitled)"}`,
216
+ `Cwd: ${session.cwd}`,
217
+ `Messages: ${session.messages.length}`
218
+ ];
219
+ const requiredFacts = extractRequiredFacts(session.messages);
220
+ if (requiredFacts.length > 0) {
221
+ lines.push("Required facts:");
222
+ for (const fact of requiredFacts) {
223
+ lines.push(`- ${fact}`);
224
+ }
225
+ }
226
+ const recent = session.messages.slice(Math.max(0, session.messages.length - input.recentMessages));
227
+ if (recent.length > 0) {
228
+ lines.push("Recent messages:");
229
+ for (const message of recent) {
230
+ lines.push(`- ${message.role}: ${singleLine(message.content, 300)}`);
231
+ }
232
+ }
233
+ return truncateAtLineBoundary(lines.join("\n"), input.maxSummaryChars);
234
+ }
235
+ function buildSummarizationPrompt(session, messages) {
236
+ // Pre-extract structured facts mechanically so the LLM has them as ground
237
+ // truth and won't drop file paths, install lists, or error states even if
238
+ // the conversation is too long for it to summarize accurately.
239
+ const facts = extractRequiredFacts(messages);
240
+ const lines = [
241
+ "Summarize this Magi session concisely while preserving:",
242
+ "- Key decisions made",
243
+ "- Files modified and their current state",
244
+ "- Pending tasks",
245
+ "- Requirements, constraints, blockers, and facts needed to continue",
246
+ "",
247
+ "Below are MECHANICALLY EXTRACTED facts. Treat them as ground truth and",
248
+ "include them verbatim in your summary. Add narrative context only where",
249
+ "it helps a future session pick up the work.",
250
+ "",
251
+ `Session: ${session.id}`,
252
+ `Title: ${session.title ?? "(untitled)"}`,
253
+ `Cwd: ${session.cwd}`,
254
+ ""
255
+ ];
256
+ if (facts.length > 0) {
257
+ lines.push("Mechanically extracted facts:");
258
+ for (const fact of facts) {
259
+ lines.push(`- ${fact}`);
260
+ }
261
+ lines.push("");
262
+ }
263
+ lines.push("Messages:");
264
+ for (const message of messages) {
265
+ lines.push(`- ${message.role}: ${singleLine(message.content, 2_000)}`);
266
+ }
267
+ return lines.join("\n");
268
+ }
269
+ function extractRequiredFacts(messages) {
270
+ const facts = [];
271
+ const seen = new Set();
272
+ const add = (text, role) => {
273
+ const normalized = singleLine(text, 500);
274
+ const key = role ? `${role}: ${normalized}` : normalized;
275
+ if (!seen.has(key)) {
276
+ facts.push(key);
277
+ seen.add(key);
278
+ }
279
+ };
280
+ // The first user message captures the original task / intent. Always keep
281
+ // it so the model can re-orient after compaction.
282
+ const firstUser = messages.find((m) => m.role === "user");
283
+ if (firstUser) {
284
+ add(`task: ${singleLine(firstUser.content, 300)}`);
285
+ }
286
+ for (const message of messages) {
287
+ // 1. Explicit text markers users / models can put in messages.
288
+ for (const line of message.content.split(/\r?\n/)) {
289
+ const trimmed = line.trim();
290
+ if (/^(FACT|TODO|DECISION|CONSTRAINT|REQUIREMENT|BLOCKER|NOTE):/i.test(trimmed)) {
291
+ add(trimmed, message.role);
292
+ }
293
+ }
294
+ // 2. Tool results — extract structured side effects so that even if
295
+ // the LLM summary is fuzzy, the workspace state is recoverable.
296
+ if (message.role === "tool") {
297
+ const content = message.content;
298
+ // File writes / edits — preserved exactly so future turns can locate
299
+ // the files we touched.
300
+ const fileWrite = /^Wrote (\S+)/m.exec(content);
301
+ if (fileWrite)
302
+ add(`file_written: ${fileWrite[1]}`);
303
+ const fileEdit = /^Edited (\S+)/m.exec(content);
304
+ if (fileEdit)
305
+ add(`file_edited: ${fileEdit[1]}`);
306
+ const fileDelete = /^Deleted (\S+)/m.exec(content);
307
+ if (fileDelete)
308
+ add(`file_deleted: ${fileDelete[1]}`);
309
+ const fileMove = /^Moved (\S+) (?:→|->|to) (\S+)/m.exec(content);
310
+ if (fileMove)
311
+ add(`file_moved: ${fileMove[1]} -> ${fileMove[2]}`);
312
+ // Package installs. Captures pip/npm/cargo style output.
313
+ const pipInstall = /Successfully installed ([^\n]+)/m.exec(content);
314
+ if (pipInstall)
315
+ add(`installed: ${pipInstall[1].trim()}`);
316
+ const npmAdded = /^added (\d+) packages? in /m.exec(content);
317
+ if (npmAdded)
318
+ add(`npm_installed_packages: ${npmAdded[1]}`);
319
+ // Errors: capture exit codes, ToolError messages, stack traces.
320
+ const exitCode = /^Exit code: ([1-9]\d*)/m.exec(content);
321
+ if (exitCode)
322
+ add(`error_exit_code: ${exitCode[1]}`);
323
+ const toolError = /^ToolError: ([^\n]+)/m.exec(content);
324
+ if (toolError)
325
+ add(`tool_error: ${toolError[1].trim()}`);
326
+ // Git operations — what branch, what was committed.
327
+ const gitCommit = /\[([a-z0-9-]+) ([a-f0-9]{7,12})\] /m.exec(content);
328
+ if (gitCommit)
329
+ add(`git_commit: ${gitCommit[2]} on ${gitCommit[1]}`);
330
+ }
331
+ // 3. Approval decisions — what the user explicitly allowed or denied.
332
+ if (message.role === "user") {
333
+ const trimmed = message.content.trim();
334
+ if (/^(approved|allow|yes|denied|deny|no)\b/i.test(trimmed) && trimmed.length < 100) {
335
+ add(`decision: ${trimmed}`, "user");
336
+ }
337
+ }
338
+ }
339
+ return facts;
340
+ }
341
+ function singleLine(value, maxChars) {
342
+ const normalized = value.replace(/\s+/g, " ").trim();
343
+ return normalized.length <= maxChars ? normalized : `${normalized.slice(0, Math.max(0, maxChars - 3))}...`;
344
+ }
345
+ function truncateAtLineBoundary(value, maxChars) {
346
+ if (value.length <= maxChars) {
347
+ return value;
348
+ }
349
+ const clipped = value.slice(0, maxChars);
350
+ const boundary = clipped.lastIndexOf("\n");
351
+ return `${clipped.slice(0, boundary > 0 ? boundary : maxChars).trimEnd()}\n[truncated]`;
352
+ }
353
+ //# sourceMappingURL=compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../src/context/compaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * 6-layer context builder for the agent system prompt.
3
+ *
4
+ * Layers (in order):
5
+ * 1. System instructions (core behavior rules)
6
+ * 2. Project rules (AGENTS.md / .magi/rules/)
7
+ * 3. User memory index (MEMORY.md)
8
+ * 4. Dynamic memory (LLM-selected relevant memories)
9
+ * 5. Git context (branch, status)
10
+ * 6. Environment (date, cwd, platform)
11
+ */
12
+ import { MagiPaths } from "../paths.js";
13
+ export interface ContextLayer {
14
+ name: string;
15
+ content: string;
16
+ }
17
+ export interface ContextBuildInput {
18
+ cwd: string;
19
+ paths?: MagiPaths;
20
+ systemInstructions?: string;
21
+ memoryContext?: string;
22
+ userMemoryIndex?: string;
23
+ includeGit?: boolean;
24
+ includeDate?: boolean;
25
+ platform?: string;
26
+ }
27
+ export interface BuiltContext {
28
+ systemPrompt: string;
29
+ layers: ContextLayer[];
30
+ }
31
+ export declare function buildLayeredContext(input: ContextBuildInput): BuiltContext;
32
+ export declare function getGitContext(cwd: string): string | undefined;
@@ -0,0 +1,114 @@
1
+ /**
2
+ * 6-layer context builder for the agent system prompt.
3
+ *
4
+ * Layers (in order):
5
+ * 1. System instructions (core behavior rules)
6
+ * 2. Project rules (AGENTS.md / .magi/rules/)
7
+ * 3. User memory index (MEMORY.md)
8
+ * 4. Dynamic memory (LLM-selected relevant memories)
9
+ * 5. Git context (branch, status)
10
+ * 6. Environment (date, cwd, platform)
11
+ */
12
+ import { existsSync, readFileSync } from "node:fs";
13
+ import path from "node:path";
14
+ import { execSync } from "node:child_process";
15
+ import { loadAgentInstructions, formatAgentInstructions } from "../rules/agents-loader.js";
16
+ export function buildLayeredContext(input) {
17
+ const layers = [];
18
+ // Layer 1: System instructions
19
+ if (input.systemInstructions) {
20
+ layers.push({ name: "system", content: input.systemInstructions });
21
+ }
22
+ // Layer 2: Project rules (AGENTS.md)
23
+ const projectRules = loadProjectRules(input.cwd);
24
+ if (projectRules) {
25
+ layers.push({ name: "project-rules", content: projectRules });
26
+ }
27
+ // Layer 3: User memory index
28
+ const memoryIndex = input.userMemoryIndex ?? loadUserMemoryIndex(input.paths);
29
+ if (memoryIndex) {
30
+ layers.push({ name: "memory-index", content: `[User memory]\n${memoryIndex}` });
31
+ }
32
+ // Layer 4: Dynamic memory (selected relevant memories)
33
+ if (input.memoryContext) {
34
+ layers.push({ name: "dynamic-memory", content: input.memoryContext });
35
+ }
36
+ // Layer 5: Git context
37
+ if (input.includeGit !== false) {
38
+ const git = getGitContext(input.cwd);
39
+ if (git) {
40
+ layers.push({ name: "git", content: git });
41
+ }
42
+ }
43
+ // Layer 6: Environment
44
+ const env = buildEnvironmentLayer(input);
45
+ layers.push({ name: "environment", content: env });
46
+ const systemPrompt = layers.map((l) => l.content).join("\n\n");
47
+ return { systemPrompt, layers };
48
+ }
49
+ function loadProjectRules(cwd) {
50
+ const files = loadAgentInstructions(cwd);
51
+ if (files.length === 0) {
52
+ return undefined;
53
+ }
54
+ return formatAgentInstructions(files).trimEnd();
55
+ }
56
+ function loadUserMemoryIndex(paths) {
57
+ if (!paths) {
58
+ return undefined;
59
+ }
60
+ const indexFile = path.join(paths.root, "memory.md");
61
+ if (!existsSync(indexFile)) {
62
+ return undefined;
63
+ }
64
+ const content = readFileSync(indexFile, "utf8").trim();
65
+ return content || undefined;
66
+ }
67
+ export function getGitContext(cwd) {
68
+ try {
69
+ const branch = execSync("git rev-parse --abbrev-ref HEAD", {
70
+ cwd,
71
+ encoding: "utf8",
72
+ timeout: 3000,
73
+ stdio: ["ignore", "pipe", "ignore"],
74
+ }).trim();
75
+ let status;
76
+ try {
77
+ const raw = execSync("git status --porcelain -u", {
78
+ cwd,
79
+ encoding: "utf8",
80
+ timeout: 3000,
81
+ stdio: ["ignore", "pipe", "ignore"],
82
+ }).trim();
83
+ const lines = raw.split("\n").filter(Boolean);
84
+ if (lines.length === 0) {
85
+ status = "clean";
86
+ }
87
+ else if (lines.length <= 10) {
88
+ status = lines.join(", ");
89
+ }
90
+ else {
91
+ status = `${lines.length} changed files`;
92
+ }
93
+ }
94
+ catch {
95
+ status = "unknown";
96
+ }
97
+ return `[Git] branch=${branch} status=${status}`;
98
+ }
99
+ catch {
100
+ return undefined;
101
+ }
102
+ }
103
+ function buildEnvironmentLayer(input) {
104
+ const parts = [];
105
+ if (input.includeDate !== false) {
106
+ parts.push(`date=${new Date().toISOString().slice(0, 10)}`);
107
+ }
108
+ parts.push(`cwd=${input.cwd}`);
109
+ if (input.platform) {
110
+ parts.push(`platform=${input.platform}`);
111
+ }
112
+ return `[Environment] ${parts.join(" ")}`;
113
+ }
114
+ //# sourceMappingURL=layers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layers.js","sourceRoot":"","sources":["../../src/context/layers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { ContextSummaryRecord, SessionRecord } from "../session-store.js";
2
+ export interface ContextCategoryBudget {
3
+ category: string;
4
+ chars: number;
5
+ estimatedTokens: number;
6
+ items: number;
7
+ }
8
+ export interface SessionContextBudget {
9
+ sessionId: string;
10
+ messageCount: number;
11
+ summaryCount: number;
12
+ chars: number;
13
+ estimatedTokens: number;
14
+ categories: ContextCategoryBudget[];
15
+ }
16
+ export declare function estimateTokens(text: string): number;
17
+ export declare function computeSessionContextBudget(input: {
18
+ session: SessionRecord;
19
+ summaries?: ContextSummaryRecord[];
20
+ }): SessionContextBudget;
21
+ export declare function formatSessionContextBudget(budget: SessionContextBudget): string;
@@ -0,0 +1,70 @@
1
+ export function estimateTokens(text) {
2
+ const normalized = text.trim();
3
+ if (!normalized) {
4
+ return 0;
5
+ }
6
+ const asciiWords = normalized.match(/[A-Za-z0-9_]+/g)?.length ?? 0;
7
+ const nonWhitespaceChars = normalized.replace(/\s+/g, "").length;
8
+ return Math.max(1, Math.ceil(Math.max(nonWhitespaceChars / 4, asciiWords * 1.25)));
9
+ }
10
+ export function computeSessionContextBudget(input) {
11
+ const buckets = new Map();
12
+ for (const message of input.session.messages) {
13
+ const category = messageCategory(message);
14
+ addBucket(buckets, category, message.content.length);
15
+ }
16
+ for (const summary of input.summaries ?? []) {
17
+ addBucket(buckets, "summary", summary.summary.length);
18
+ }
19
+ const categories = Array.from(buckets.entries())
20
+ .map(([category, value]) => ({
21
+ category,
22
+ chars: value.chars,
23
+ estimatedTokens: estimateTokens("x".repeat(value.chars)),
24
+ items: value.items
25
+ }))
26
+ .sort((a, b) => categoryOrder(a.category) - categoryOrder(b.category) || a.category.localeCompare(b.category));
27
+ const chars = categories.reduce((sum, category) => sum + category.chars, 0);
28
+ return {
29
+ sessionId: input.session.id,
30
+ messageCount: input.session.messages.length,
31
+ summaryCount: input.summaries?.length ?? 0,
32
+ chars,
33
+ estimatedTokens: categories.reduce((sum, category) => sum + category.estimatedTokens, 0),
34
+ categories
35
+ };
36
+ }
37
+ export function formatSessionContextBudget(budget) {
38
+ const lines = [
39
+ `sessionId: ${budget.sessionId}`,
40
+ `messages: ${budget.messageCount}`,
41
+ `summaries: ${budget.summaryCount}`,
42
+ `chars: ${budget.chars}`,
43
+ `estimatedTokens: ${budget.estimatedTokens}`,
44
+ "categories:"
45
+ ];
46
+ for (const category of budget.categories) {
47
+ lines.push(` ${category.category}: ${category.estimatedTokens} tokens, ${category.chars} chars, ${category.items} items`);
48
+ }
49
+ return `${lines.join("\n")}\n`;
50
+ }
51
+ function messageCategory(message) {
52
+ if (message.metadata.kind === "context-summary") {
53
+ return "summary";
54
+ }
55
+ if (message.role === "user" || message.role === "assistant" || message.role === "tool" || message.role === "system") {
56
+ return message.role;
57
+ }
58
+ return "other";
59
+ }
60
+ function addBucket(buckets, category, chars) {
61
+ const existing = buckets.get(category) ?? { chars: 0, items: 0 };
62
+ existing.chars += chars;
63
+ existing.items += 1;
64
+ buckets.set(category, existing);
65
+ }
66
+ function categoryOrder(category) {
67
+ const index = ["system", "user", "assistant", "tool", "summary", "other"].indexOf(category);
68
+ return index === -1 ? 999 : index;
69
+ }
70
+ //# sourceMappingURL=token-budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-budget.js","sourceRoot":"","sources":["../../src/context/token-budget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { SessionStore } from "../session-store.js";
2
+ export interface PairingToken {
3
+ deviceId: string;
4
+ token: string;
5
+ expiresAt: string;
6
+ }
7
+ export declare function createPairingToken(input: {
8
+ store: SessionStore;
9
+ deviceName: string;
10
+ ttlMs?: number;
11
+ }): PairingToken;
12
+ export declare function validateDeviceToken(input: {
13
+ store: SessionStore;
14
+ deviceId: string | undefined;
15
+ token: string | undefined;
16
+ }): boolean;
17
+ export declare function hashToken(token: string): string;