mindweave 0.0.1 → 2.1.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 (479) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +168 -14
  3. package/dist/alternator/chassis/cache.js +47 -0
  4. package/dist/alternator/chassis/cache.js.map +1 -0
  5. package/dist/alternator/chassis/domRefs.js +53 -0
  6. package/dist/alternator/chassis/domRefs.js.map +1 -0
  7. package/dist/alternator/chassis/extractWorker.js +65 -0
  8. package/dist/alternator/chassis/extractWorker.js.map +1 -0
  9. package/dist/alternator/chassis/graph.js +221 -0
  10. package/dist/alternator/chassis/graph.js.map +1 -0
  11. package/dist/alternator/chassis/index.js +463 -0
  12. package/dist/alternator/chassis/index.js.map +1 -0
  13. package/dist/alternator/chassis/isolation.js +336 -0
  14. package/dist/alternator/chassis/isolation.js.map +1 -0
  15. package/dist/alternator/chassis/langCases.js +69 -0
  16. package/dist/alternator/chassis/langCases.js.map +1 -0
  17. package/dist/alternator/chassis/lsp.js +469 -0
  18. package/dist/alternator/chassis/lsp.js.map +1 -0
  19. package/dist/alternator/chassis/markup.js +262 -0
  20. package/dist/alternator/chassis/markup.js.map +1 -0
  21. package/dist/alternator/chassis/provision.js +198 -0
  22. package/dist/alternator/chassis/provision.js.map +1 -0
  23. package/dist/alternator/chassis/rank.js +72 -0
  24. package/dist/alternator/chassis/rank.js.map +1 -0
  25. package/dist/alternator/chassis/servers.js +215 -0
  26. package/dist/alternator/chassis/servers.js.map +1 -0
  27. package/dist/alternator/chassis/treesitter.js +608 -0
  28. package/dist/alternator/chassis/treesitter.js.map +1 -0
  29. package/dist/alternator/chassis/types.js +24 -0
  30. package/dist/alternator/chassis/types.js.map +1 -0
  31. package/dist/alternator/lane.js +67 -0
  32. package/dist/alternator/lane.js.map +1 -0
  33. package/dist/cli/App.js +2574 -0
  34. package/dist/cli/App.js.map +1 -0
  35. package/dist/cli/altScreen.js +67 -0
  36. package/dist/cli/altScreen.js.map +1 -0
  37. package/dist/cli/approvalChannel.js +72 -0
  38. package/dist/cli/approvalChannel.js.map +1 -0
  39. package/dist/cli/attachments.js +188 -0
  40. package/dist/cli/attachments.js.map +1 -0
  41. package/dist/cli/bootstrap.js +279 -0
  42. package/dist/cli/bootstrap.js.map +1 -0
  43. package/dist/cli/chatAnchor.js +94 -0
  44. package/dist/cli/chatAnchor.js.map +1 -0
  45. package/dist/cli/commandArgs.js +79 -0
  46. package/dist/cli/commandArgs.js.map +1 -0
  47. package/dist/cli/commandRoute.js +78 -0
  48. package/dist/cli/commandRoute.js.map +1 -0
  49. package/dist/cli/compaction.js +69 -0
  50. package/dist/cli/compaction.js.map +1 -0
  51. package/dist/cli/components/ApprovalBox.js +100 -0
  52. package/dist/cli/components/ApprovalBox.js.map +1 -0
  53. package/dist/cli/components/BlockView.js +128 -0
  54. package/dist/cli/components/BlockView.js.map +1 -0
  55. package/dist/cli/components/FirstRunFrame.js +41 -0
  56. package/dist/cli/components/FirstRunFrame.js.map +1 -0
  57. package/dist/cli/components/KeyManager.js +197 -0
  58. package/dist/cli/components/KeyManager.js.map +1 -0
  59. package/dist/cli/components/KeySetup.js +125 -0
  60. package/dist/cli/components/KeySetup.js.map +1 -0
  61. package/dist/cli/components/MenuFrame.js +24 -0
  62. package/dist/cli/components/MenuFrame.js.map +1 -0
  63. package/dist/cli/components/Picker.js +82 -0
  64. package/dist/cli/components/Picker.js.map +1 -0
  65. package/dist/cli/components/PromptInput.js +509 -0
  66. package/dist/cli/components/PromptInput.js.map +1 -0
  67. package/dist/cli/components/SubagentView.js +86 -0
  68. package/dist/cli/components/SubagentView.js.map +1 -0
  69. package/dist/cli/components/ToolGroup.js +60 -0
  70. package/dist/cli/components/ToolGroup.js.map +1 -0
  71. package/dist/cli/components/ToolLine.js +123 -0
  72. package/dist/cli/components/ToolLine.js.map +1 -0
  73. package/dist/cli/components/TrustGate.js +37 -0
  74. package/dist/cli/components/TrustGate.js.map +1 -0
  75. package/dist/cli/costView.js +40 -0
  76. package/dist/cli/costView.js.map +1 -0
  77. package/dist/cli/frameRate.js +30 -0
  78. package/dist/cli/frameRate.js.map +1 -0
  79. package/dist/cli/framebuffer/paint.js +165 -0
  80. package/dist/cli/framebuffer/paint.js.map +1 -0
  81. package/dist/cli/framebuffer/parse.js +266 -0
  82. package/dist/cli/framebuffer/parse.js.map +1 -0
  83. package/dist/cli/framebuffer/screen.js +196 -0
  84. package/dist/cli/framebuffer/screen.js.map +1 -0
  85. package/dist/cli/framebuffer/writer.js +139 -0
  86. package/dist/cli/framebuffer/writer.js.map +1 -0
  87. package/dist/cli/groupReveal.js +51 -0
  88. package/dist/cli/groupReveal.js.map +1 -0
  89. package/dist/cli/help.js +55 -0
  90. package/dist/cli/help.js.map +1 -0
  91. package/dist/cli/inputView.js +105 -0
  92. package/dist/cli/inputView.js.map +1 -0
  93. package/dist/cli/keyManager.js +65 -0
  94. package/dist/cli/keyManager.js.map +1 -0
  95. package/dist/cli/keySetup.js +35 -0
  96. package/dist/cli/keySetup.js.map +1 -0
  97. package/dist/cli/keyStore.js +73 -0
  98. package/dist/cli/keyStore.js.map +1 -0
  99. package/dist/cli/markdown.js +460 -0
  100. package/dist/cli/markdown.js.map +1 -0
  101. package/dist/cli/messageQueue.js +96 -0
  102. package/dist/cli/messageQueue.js.map +1 -0
  103. package/dist/cli/modes.js +90 -0
  104. package/dist/cli/modes.js.map +1 -0
  105. package/dist/cli/mouse.js +78 -0
  106. package/dist/cli/mouse.js.map +1 -0
  107. package/dist/cli/pasteAssembler.js +44 -0
  108. package/dist/cli/pasteAssembler.js.map +1 -0
  109. package/dist/cli/pathComplete.js +39 -0
  110. package/dist/cli/pathComplete.js.map +1 -0
  111. package/dist/cli/perfLog.js +90 -0
  112. package/dist/cli/perfLog.js.map +1 -0
  113. package/dist/cli/reveal.js +32 -0
  114. package/dist/cli/reveal.js.map +1 -0
  115. package/dist/cli/revealPace.js +59 -0
  116. package/dist/cli/revealPace.js.map +1 -0
  117. package/dist/cli/sessionCarry.js +19 -0
  118. package/dist/cli/sessionCarry.js.map +1 -0
  119. package/dist/cli/smoothScroll.js +74 -0
  120. package/dist/cli/smoothScroll.js.map +1 -0
  121. package/dist/cli/startupArgs.js +96 -0
  122. package/dist/cli/startupArgs.js.map +1 -0
  123. package/dist/cli/terminalRestore.js +34 -0
  124. package/dist/cli/terminalRestore.js.map +1 -0
  125. package/dist/cli/toolDisplay.js +219 -0
  126. package/dist/cli/toolDisplay.js.map +1 -0
  127. package/dist/cli/toolItems.js +65 -0
  128. package/dist/cli/toolItems.js.map +1 -0
  129. package/dist/cli/transcript.js +351 -0
  130. package/dist/cli/transcript.js.map +1 -0
  131. package/dist/cli/trust.js +79 -0
  132. package/dist/cli/trust.js.map +1 -0
  133. package/dist/cli/version.js +39 -0
  134. package/dist/cli/version.js.map +1 -0
  135. package/dist/cli/viewport.js +179 -0
  136. package/dist/cli/viewport.js.map +1 -0
  137. package/dist/cli/virtualWindow.js +103 -0
  138. package/dist/cli/virtualWindow.js.map +1 -0
  139. package/dist/cli/workingVerb.js +37 -0
  140. package/dist/cli/workingVerb.js.map +1 -0
  141. package/dist/cli/wrap.js +145 -0
  142. package/dist/cli/wrap.js.map +1 -0
  143. package/dist/drivers/anthropic/cachePoints.js +77 -0
  144. package/dist/drivers/anthropic/cachePoints.js.map +1 -0
  145. package/dist/drivers/anthropic/client.js +432 -0
  146. package/dist/drivers/anthropic/client.js.map +1 -0
  147. package/dist/drivers/anthropic/index.js +10 -0
  148. package/dist/drivers/anthropic/index.js.map +1 -0
  149. package/dist/drivers/anthropic/manifest.js +221 -0
  150. package/dist/drivers/anthropic/manifest.js.map +1 -0
  151. package/dist/drivers/cerebras/client.js +69 -0
  152. package/dist/drivers/cerebras/client.js.map +1 -0
  153. package/dist/drivers/cerebras/index.js +5 -0
  154. package/dist/drivers/cerebras/index.js.map +1 -0
  155. package/dist/drivers/cerebras/manifest.js +140 -0
  156. package/dist/drivers/cerebras/manifest.js.map +1 -0
  157. package/dist/drivers/clientId.js +41 -0
  158. package/dist/drivers/clientId.js.map +1 -0
  159. package/dist/drivers/contextOverflow.js +77 -0
  160. package/dist/drivers/contextOverflow.js.map +1 -0
  161. package/dist/drivers/deepseek/client.js +168 -0
  162. package/dist/drivers/deepseek/client.js.map +1 -0
  163. package/dist/drivers/deepseek/index.js +16 -0
  164. package/dist/drivers/deepseek/index.js.map +1 -0
  165. package/dist/drivers/deepseek/inlineTools.js +46 -0
  166. package/dist/drivers/deepseek/inlineTools.js.map +1 -0
  167. package/dist/drivers/deepseek/manifest.js +166 -0
  168. package/dist/drivers/deepseek/manifest.js.map +1 -0
  169. package/dist/drivers/gemini/client.js +38 -0
  170. package/dist/drivers/gemini/client.js.map +1 -0
  171. package/dist/drivers/gemini/index.js +5 -0
  172. package/dist/drivers/gemini/index.js.map +1 -0
  173. package/dist/drivers/gemini/manifest.js +150 -0
  174. package/dist/drivers/gemini/manifest.js.map +1 -0
  175. package/dist/drivers/glm/client.js +90 -0
  176. package/dist/drivers/glm/client.js.map +1 -0
  177. package/dist/drivers/glm/index.js +9 -0
  178. package/dist/drivers/glm/index.js.map +1 -0
  179. package/dist/drivers/glm/manifest.js +183 -0
  180. package/dist/drivers/glm/manifest.js.map +1 -0
  181. package/dist/drivers/groq/client.js +80 -0
  182. package/dist/drivers/groq/client.js.map +1 -0
  183. package/dist/drivers/groq/index.js +5 -0
  184. package/dist/drivers/groq/index.js.map +1 -0
  185. package/dist/drivers/groq/manifest.js +160 -0
  186. package/dist/drivers/groq/manifest.js.map +1 -0
  187. package/dist/drivers/kimi/client.js +82 -0
  188. package/dist/drivers/kimi/client.js.map +1 -0
  189. package/dist/drivers/kimi/index.js +9 -0
  190. package/dist/drivers/kimi/index.js.map +1 -0
  191. package/dist/drivers/kimi/manifest.js +168 -0
  192. package/dist/drivers/kimi/manifest.js.map +1 -0
  193. package/dist/drivers/meta/client.js +30 -0
  194. package/dist/drivers/meta/client.js.map +1 -0
  195. package/dist/drivers/meta/index.js +5 -0
  196. package/dist/drivers/meta/index.js.map +1 -0
  197. package/dist/drivers/meta/manifest.js +101 -0
  198. package/dist/drivers/meta/manifest.js.map +1 -0
  199. package/dist/drivers/minimax/client.js +36 -0
  200. package/dist/drivers/minimax/client.js.map +1 -0
  201. package/dist/drivers/minimax/index.js +5 -0
  202. package/dist/drivers/minimax/index.js.map +1 -0
  203. package/dist/drivers/minimax/manifest.js +120 -0
  204. package/dist/drivers/minimax/manifest.js.map +1 -0
  205. package/dist/drivers/mistral/client.js +54 -0
  206. package/dist/drivers/mistral/client.js.map +1 -0
  207. package/dist/drivers/mistral/index.js +5 -0
  208. package/dist/drivers/mistral/index.js.map +1 -0
  209. package/dist/drivers/mistral/manifest.js +118 -0
  210. package/dist/drivers/mistral/manifest.js.map +1 -0
  211. package/dist/drivers/openai/client.js +290 -0
  212. package/dist/drivers/openai/client.js.map +1 -0
  213. package/dist/drivers/openai/index.js +9 -0
  214. package/dist/drivers/openai/index.js.map +1 -0
  215. package/dist/drivers/openai/manifest.js +133 -0
  216. package/dist/drivers/openai/manifest.js.map +1 -0
  217. package/dist/drivers/openaiCompat/wire.js +493 -0
  218. package/dist/drivers/openaiCompat/wire.js.map +1 -0
  219. package/dist/drivers/partialTurn.js +23 -0
  220. package/dist/drivers/partialTurn.js.map +1 -0
  221. package/dist/drivers/providerError.js +181 -0
  222. package/dist/drivers/providerError.js.map +1 -0
  223. package/dist/drivers/qwen/client.js +93 -0
  224. package/dist/drivers/qwen/client.js.map +1 -0
  225. package/dist/drivers/qwen/index.js +9 -0
  226. package/dist/drivers/qwen/index.js.map +1 -0
  227. package/dist/drivers/qwen/manifest.js +146 -0
  228. package/dist/drivers/qwen/manifest.js.map +1 -0
  229. package/dist/drivers/registry.js +177 -0
  230. package/dist/drivers/registry.js.map +1 -0
  231. package/dist/drivers/retryPolicy.js +129 -0
  232. package/dist/drivers/retryPolicy.js.map +1 -0
  233. package/dist/drivers/searchBlocks.js +61 -0
  234. package/dist/drivers/searchBlocks.js.map +1 -0
  235. package/dist/drivers/types.js +2 -0
  236. package/dist/drivers/types.js.map +1 -0
  237. package/dist/drivers/xai/client.js +63 -0
  238. package/dist/drivers/xai/client.js.map +1 -0
  239. package/dist/drivers/xai/index.js +5 -0
  240. package/dist/drivers/xai/index.js.map +1 -0
  241. package/dist/drivers/xai/manifest.js +137 -0
  242. package/dist/drivers/xai/manifest.js.map +1 -0
  243. package/dist/dynamo/_probe.tmp.js +20 -0
  244. package/dist/dynamo/_probe.tmp.js.map +1 -0
  245. package/dist/dynamo/cacheBreak.js +88 -0
  246. package/dist/dynamo/cacheBreak.js.map +1 -0
  247. package/dist/dynamo/contextWindow.js +243 -0
  248. package/dist/dynamo/contextWindow.js.map +1 -0
  249. package/dist/dynamo/engine.js +2011 -0
  250. package/dist/dynamo/engine.js.map +1 -0
  251. package/dist/dynamo/guard.js +132 -0
  252. package/dist/dynamo/guard.js.map +1 -0
  253. package/dist/dynamo/liveMeter.js +58 -0
  254. package/dist/dynamo/liveMeter.js.map +1 -0
  255. package/dist/dynamo/model.js +172 -0
  256. package/dist/dynamo/model.js.map +1 -0
  257. package/dist/dynamo/planArtifact.js +125 -0
  258. package/dist/dynamo/planArtifact.js.map +1 -0
  259. package/dist/dynamo/pricing.js +140 -0
  260. package/dist/dynamo/pricing.js.map +1 -0
  261. package/dist/dynamo/prompt.js +264 -0
  262. package/dist/dynamo/prompt.js.map +1 -0
  263. package/dist/dynamo/spend.js +45 -0
  264. package/dist/dynamo/spend.js.map +1 -0
  265. package/dist/dynamo/verify.js +483 -0
  266. package/dist/dynamo/verify.js.map +1 -0
  267. package/dist/governor/forbidden.js +181 -0
  268. package/dist/governor/forbidden.js.map +1 -0
  269. package/dist/governor/freshness.js +83 -0
  270. package/dist/governor/freshness.js.map +1 -0
  271. package/dist/governor/frontmatter.js +38 -0
  272. package/dist/governor/frontmatter.js.map +1 -0
  273. package/dist/governor/glob.js +75 -0
  274. package/dist/governor/glob.js.map +1 -0
  275. package/dist/governor/index.js +87 -0
  276. package/dist/governor/index.js.map +1 -0
  277. package/dist/governor/rules.js +80 -0
  278. package/dist/governor/rules.js.map +1 -0
  279. package/dist/governor/scope.js +91 -0
  280. package/dist/governor/scope.js.map +1 -0
  281. package/dist/governor/skills.js +176 -0
  282. package/dist/governor/skills.js.map +1 -0
  283. package/dist/governor/types.js +16 -0
  284. package/dist/governor/types.js.map +1 -0
  285. package/dist/governor/write.js +182 -0
  286. package/dist/governor/write.js.map +1 -0
  287. package/dist/index.js +89 -0
  288. package/dist/index.js.map +1 -0
  289. package/dist/mcp/catalog.js +232 -0
  290. package/dist/mcp/catalog.js.map +1 -0
  291. package/dist/mcp/config.js +116 -0
  292. package/dist/mcp/config.js.map +1 -0
  293. package/dist/mcp/configWrite.js +254 -0
  294. package/dist/mcp/configWrite.js.map +1 -0
  295. package/dist/mcp/connection.js +504 -0
  296. package/dist/mcp/connection.js.map +1 -0
  297. package/dist/mcp/deferred.js +104 -0
  298. package/dist/mcp/deferred.js.map +1 -0
  299. package/dist/mcp/discover.js +128 -0
  300. package/dist/mcp/discover.js.map +1 -0
  301. package/dist/mcp/manager.js +679 -0
  302. package/dist/mcp/manager.js.map +1 -0
  303. package/dist/mcp/paramHeaders.js +163 -0
  304. package/dist/mcp/paramHeaders.js.map +1 -0
  305. package/dist/mcp/prompts.js +136 -0
  306. package/dist/mcp/prompts.js.map +1 -0
  307. package/dist/mcp/protocol.js +171 -0
  308. package/dist/mcp/protocol.js.map +1 -0
  309. package/dist/mcp/resources.js +119 -0
  310. package/dist/mcp/resources.js.map +1 -0
  311. package/dist/mcp/resultStore.js +180 -0
  312. package/dist/mcp/resultStore.js.map +1 -0
  313. package/dist/mcp/subscriptions.js +74 -0
  314. package/dist/mcp/subscriptions.js.map +1 -0
  315. package/dist/mcp/transport/headerValue.js +40 -0
  316. package/dist/mcp/transport/headerValue.js.map +1 -0
  317. package/dist/mcp/transport/http.js +321 -0
  318. package/dist/mcp/transport/http.js.map +1 -0
  319. package/dist/mcp/transport/stdio.js +234 -0
  320. package/dist/mcp/transport/stdio.js.map +1 -0
  321. package/dist/mcp/transport/types.js +27 -0
  322. package/dist/mcp/transport/types.js.map +1 -0
  323. package/dist/mcp/trust.js +98 -0
  324. package/dist/mcp/trust.js.map +1 -0
  325. package/dist/mcp/trustStore.js +55 -0
  326. package/dist/mcp/trustStore.js.map +1 -0
  327. package/dist/memory/autoMemory.js +340 -0
  328. package/dist/memory/autoMemory.js.map +1 -0
  329. package/dist/memory/compaction.js +513 -0
  330. package/dist/memory/compaction.js.map +1 -0
  331. package/dist/memory/images.js +173 -0
  332. package/dist/memory/images.js.map +1 -0
  333. package/dist/memory/presence.js +59 -0
  334. package/dist/memory/presence.js.map +1 -0
  335. package/dist/memory/projectNotes.js +247 -0
  336. package/dist/memory/projectNotes.js.map +1 -0
  337. package/dist/memory/restore.js +72 -0
  338. package/dist/memory/restore.js.map +1 -0
  339. package/dist/memory/session.js +472 -0
  340. package/dist/memory/session.js.map +1 -0
  341. package/dist/memory/sessionMemory.js +142 -0
  342. package/dist/memory/sessionMemory.js.map +1 -0
  343. package/dist/memory/sessionMemoryCompact.js +136 -0
  344. package/dist/memory/sessionMemoryCompact.js.map +1 -0
  345. package/dist/memory/store.js +217 -0
  346. package/dist/memory/store.js.map +1 -0
  347. package/dist/memory/types.js +14 -0
  348. package/dist/memory/types.js.map +1 -0
  349. package/dist/memory/workingSet.js +383 -0
  350. package/dist/memory/workingSet.js.map +1 -0
  351. package/dist/project/context.js +425 -0
  352. package/dist/project/context.js.map +1 -0
  353. package/dist/tools/approval.js +189 -0
  354. package/dist/tools/approval.js.map +1 -0
  355. package/dist/tools/askUser.js +103 -0
  356. package/dist/tools/askUser.js.map +1 -0
  357. package/dist/tools/atomicWrite.js +151 -0
  358. package/dist/tools/atomicWrite.js.map +1 -0
  359. package/dist/tools/backgroundShells.js +468 -0
  360. package/dist/tools/backgroundShells.js.map +1 -0
  361. package/dist/tools/captureSweep.js +77 -0
  362. package/dist/tools/captureSweep.js.map +1 -0
  363. package/dist/tools/chassisMux.js +92 -0
  364. package/dist/tools/chassisMux.js.map +1 -0
  365. package/dist/tools/checkpoints.js +328 -0
  366. package/dist/tools/checkpoints.js.map +1 -0
  367. package/dist/tools/codeIntel.js +267 -0
  368. package/dist/tools/codeIntel.js.map +1 -0
  369. package/dist/tools/deferredNative.js +121 -0
  370. package/dist/tools/deferredNative.js.map +1 -0
  371. package/dist/tools/detail.js +135 -0
  372. package/dist/tools/detail.js.map +1 -0
  373. package/dist/tools/diagnostics.js +174 -0
  374. package/dist/tools/diagnostics.js.map +1 -0
  375. package/dist/tools/edit.js +167 -0
  376. package/dist/tools/edit.js.map +1 -0
  377. package/dist/tools/editCore.js +283 -0
  378. package/dist/tools/editCore.js.map +1 -0
  379. package/dist/tools/editFile.js +183 -0
  380. package/dist/tools/editFile.js.map +1 -0
  381. package/dist/tools/editRipple.js +126 -0
  382. package/dist/tools/editRipple.js.map +1 -0
  383. package/dist/tools/editTarget.js +131 -0
  384. package/dist/tools/editTarget.js.map +1 -0
  385. package/dist/tools/editWindow.js +49 -0
  386. package/dist/tools/editWindow.js.map +1 -0
  387. package/dist/tools/eol.js +56 -0
  388. package/dist/tools/eol.js.map +1 -0
  389. package/dist/tools/exitPlan.js +175 -0
  390. package/dist/tools/exitPlan.js.map +1 -0
  391. package/dist/tools/focus.js +42 -0
  392. package/dist/tools/focus.js.map +1 -0
  393. package/dist/tools/gitignore.js +148 -0
  394. package/dist/tools/gitignore.js.map +1 -0
  395. package/dist/tools/glob.js +134 -0
  396. package/dist/tools/glob.js.map +1 -0
  397. package/dist/tools/governorTools.js +258 -0
  398. package/dist/tools/governorTools.js.map +1 -0
  399. package/dist/tools/grep.js +450 -0
  400. package/dist/tools/grep.js.map +1 -0
  401. package/dist/tools/guard.js +220 -0
  402. package/dist/tools/guard.js.map +1 -0
  403. package/dist/tools/killTree.js +215 -0
  404. package/dist/tools/killTree.js.map +1 -0
  405. package/dist/tools/listDir.js +143 -0
  406. package/dist/tools/listDir.js.map +1 -0
  407. package/dist/tools/mcpAdd.js +176 -0
  408. package/dist/tools/mcpAdd.js.map +1 -0
  409. package/dist/tools/mcpResources.js +116 -0
  410. package/dist/tools/mcpResources.js.map +1 -0
  411. package/dist/tools/mcpSearch.js +123 -0
  412. package/dist/tools/mcpSearch.js.map +1 -0
  413. package/dist/tools/multiEdit.js +168 -0
  414. package/dist/tools/multiEdit.js.map +1 -0
  415. package/dist/tools/paths.js +225 -0
  416. package/dist/tools/paths.js.map +1 -0
  417. package/dist/tools/posixShell.js +123 -0
  418. package/dist/tools/posixShell.js.map +1 -0
  419. package/dist/tools/readFile.js +371 -0
  420. package/dist/tools/readFile.js.map +1 -0
  421. package/dist/tools/readSymbol.js +145 -0
  422. package/dist/tools/readSymbol.js.map +1 -0
  423. package/dist/tools/registry.js +120 -0
  424. package/dist/tools/registry.js.map +1 -0
  425. package/dist/tools/replaceSymbol.js +141 -0
  426. package/dist/tools/replaceSymbol.js.map +1 -0
  427. package/dist/tools/results.js +15 -0
  428. package/dist/tools/results.js.map +1 -0
  429. package/dist/tools/ripgrep.js +145 -0
  430. package/dist/tools/ripgrep.js.map +1 -0
  431. package/dist/tools/runCommand.js +633 -0
  432. package/dist/tools/runCommand.js.map +1 -0
  433. package/dist/tools/saveMemory.js +102 -0
  434. package/dist/tools/saveMemory.js.map +1 -0
  435. package/dist/tools/screenshot.js +200 -0
  436. package/dist/tools/screenshot.js.map +1 -0
  437. package/dist/tools/screenshotWin.js +227 -0
  438. package/dist/tools/screenshotWin.js.map +1 -0
  439. package/dist/tools/search.js +121 -0
  440. package/dist/tools/search.js.map +1 -0
  441. package/dist/tools/sessionTools.js +187 -0
  442. package/dist/tools/sessionTools.js.map +1 -0
  443. package/dist/tools/shellCheckpoint.js +123 -0
  444. package/dist/tools/shellCheckpoint.js.map +1 -0
  445. package/dist/tools/shellLint.js +102 -0
  446. package/dist/tools/shellLint.js.map +1 -0
  447. package/dist/tools/shellTools.js +203 -0
  448. package/dist/tools/shellTools.js.map +1 -0
  449. package/dist/tools/spanCore.js +78 -0
  450. package/dist/tools/spanCore.js.map +1 -0
  451. package/dist/tools/subagent.js +224 -0
  452. package/dist/tools/subagent.js.map +1 -0
  453. package/dist/tools/subagentReport.js +114 -0
  454. package/dist/tools/subagentReport.js.map +1 -0
  455. package/dist/tools/tempSweep.js +118 -0
  456. package/dist/tools/tempSweep.js.map +1 -0
  457. package/dist/tools/todo.js +117 -0
  458. package/dist/tools/todo.js.map +1 -0
  459. package/dist/tools/types.js +2 -0
  460. package/dist/tools/types.js.map +1 -0
  461. package/dist/tools/untrusted.js +46 -0
  462. package/dist/tools/untrusted.js.map +1 -0
  463. package/dist/tools/useSkill.js +62 -0
  464. package/dist/tools/useSkill.js.map +1 -0
  465. package/dist/tools/walk.js +152 -0
  466. package/dist/tools/walk.js.map +1 -0
  467. package/dist/tools/web.js +61 -0
  468. package/dist/tools/web.js.map +1 -0
  469. package/dist/tools/webFetch.js +444 -0
  470. package/dist/tools/webFetch.js.map +1 -0
  471. package/dist/tools/webSearch.js +130 -0
  472. package/dist/tools/webSearch.js.map +1 -0
  473. package/dist/tools/workspace.js +212 -0
  474. package/dist/tools/workspace.js.map +1 -0
  475. package/dist/tools/workspaceDiscover.js +216 -0
  476. package/dist/tools/workspaceDiscover.js.map +1 -0
  477. package/dist/tools/writeFile.js +162 -0
  478. package/dist/tools/writeFile.js.map +1 -0
  479. package/package.json +74 -28
@@ -0,0 +1,243 @@
1
+ /**
2
+ * contextWindow.ts — model-anchored compaction thresholds (pure).
3
+ *
4
+ * Compaction is anchored to the model's REAL context window rather than a fixed
5
+ * number: reserve room for the summary output plus a safety buffer, then compact
6
+ * when usage crosses what's left. That keeps the thresholds correct per model, and
7
+ * automatically right when a stronger or longer model is wired in, instead of a
8
+ * single hard-coded ceiling.
9
+ *
10
+ * The window itself is the driver's answer, and it is each model's SHARP window —
11
+ * the span where attention stays reliable — not its storage maximum. A model that
12
+ * stores 1M tokens can still degrade from tool-noise dilution long before that, and
13
+ * on BYOK every token is the user's money, so compacting to the sharp window is
14
+ * both more accurate and cheaper.
15
+ *
16
+ * THE DIVISION OF LABOUR. A driver reports facts it can measure — its window, and
17
+ * the ceiling it puts on a buffered call. This module owns every decision made on
18
+ * top of them: how much headroom to leave, where the bars land, and the invariant
19
+ * that ties them together. A driver returning its own bars would be a decision in
20
+ * the driver, which is the line this project doesn't cross; see BOUNDARY.md.
21
+ */
22
+ import { manifestForModel } from "../drivers/registry.js";
23
+ /**
24
+ * Reserve used when a driver declares no buffered ceiling of its own — it sends no
25
+ * `max_tokens` and lets the provider's default apply, as the DeepSeek driver does.
26
+ * With no number to reserve, core keeps the conservative one it has always used.
27
+ */
28
+ const DEFAULT_SUMMARY_RESERVE = 20_000;
29
+ /** Headroom below the window so one turn's growth can't blow past it. */
30
+ const TURN_HEADROOM = 13_000;
31
+ /** Floor for the auto bar, so a tiny window still leaves a usable transcript. */
32
+ const MIN_AUTO_BAR = 20_000;
33
+ /** Share of the window micro-compaction aims at on an ordinary model. */
34
+ const MICRO_SHARE = 0.3;
35
+ /**
36
+ * Absolute cap on the micro bar.
37
+ *
38
+ * A flat share of the window stops making sense once windows get large: at 30% a
39
+ * 500K model would carry 150K of stale tool output on every turn, which is not a
40
+ * lean working set on any model and is the user's money on BYOK. The purpose of
41
+ * micro-compaction is a lean working set, and that purpose is absolute rather than
42
+ * proportional, so the share gets a ceiling.
43
+ *
44
+ * 96K is a judgment call under absent data, chosen so it sits ABOVE the share for
45
+ * every window we ship today (30% of 256K is 76.8K) and only engages past ~320K.
46
+ * That is deliberate: no shipped model changes behaviour, and the cap exists for
47
+ * the longer models it was written for. Revisit it if anyone measures where a
48
+ * working set actually stops paying for itself.
49
+ */
50
+ const MICRO_CEILING = 96_000;
51
+ /**
52
+ * Hard guard: micro never rises above this share of the auto bar.
53
+ *
54
+ * The two bars are computed from different inputs, so a large enough reserve on a
55
+ * small enough window could otherwise push micro past auto and invert them —
56
+ * clearing tool bodies at the same moment we summarize. This keeps the ordering a
57
+ * property of the arithmetic rather than something the numbers happen to satisfy.
58
+ */
59
+ const MICRO_MAX_SHARE_OF_AUTO = 0.6;
60
+ /**
61
+ * The part of the prompt that is NOT the transcript, measured rather than assumed:
62
+ * what the provider said the whole prompt was, minus what we measured the transcript
63
+ * to be on the way out. That remainder is the system prompt, every tool schema, the
64
+ * working-set block, the relevance map, todos and the governor — none of which the
65
+ * bars could see when they counted only the transcript.
66
+ *
67
+ * Clamped at zero. The transcript estimator is deliberately conservative and can read
68
+ * HIGHER than the provider's real count; a negative overhead would then push the bars
69
+ * later, which is precisely the failure this removes.
70
+ */
71
+ export function measuredOverhead(promptTokens, transcriptTokens) {
72
+ return Math.max(0, promptTokens - transcriptTokens);
73
+ }
74
+ export function sharpContextWindow(model) {
75
+ return manifestForModel(model).contextWindow(model);
76
+ }
77
+ /**
78
+ * How much room to keep free for a compaction summary, as the model's driver
79
+ * reports it. A driver that declares no buffered ceiling falls back to core's
80
+ * conservative default rather than reserving nothing.
81
+ */
82
+ export function summaryReserveFor(model) {
83
+ const declared = manifestForModel(model).bufferedOutputTokens?.(model);
84
+ return declared !== undefined && declared > 0 ? declared : DEFAULT_SUMMARY_RESERVE;
85
+ }
86
+ /**
87
+ * Autocompact bar: summarize once the transcript crosses
88
+ * (window − summary reserve − turn headroom). For a 256K window reserving 20K
89
+ * that's 223K.
90
+ */
91
+ export function autoBarFor(window, summaryReserve = DEFAULT_SUMMARY_RESERVE) {
92
+ return Math.max(MIN_AUTO_BAR, window - summaryReserve - TURN_HEADROOM);
93
+ }
94
+ /**
95
+ * Microcompact bar: clear old tool-result bodies well before the autocompact bar,
96
+ * so the working set stays lean continuously rather than only at the summary point.
97
+ * A share of the window, capped in absolute terms, and always kept clear of the
98
+ * auto bar.
99
+ */
100
+ export function microBarFor(window, summaryReserve = DEFAULT_SUMMARY_RESERVE) {
101
+ return Math.min(Math.round(window * MICRO_SHARE), MICRO_CEILING, Math.round(autoBarFor(window, summaryReserve) * MICRO_MAX_SHARE_OF_AUTO));
102
+ }
103
+ /**
104
+ * How far below the auto bar to start telling the user context is filling up.
105
+ *
106
+ * A share rather than a fixed number, so it scales with the model the way every other
107
+ * bar here does: 20K of warning is most of a small window's usable transcript and a
108
+ * rounding error on a large one. The point is to give roughly a turn or two of notice,
109
+ * and a turn is proportional to the window.
110
+ */
111
+ const WARN_SHARE_OF_AUTO = 0.9;
112
+ /**
113
+ * The point at which the user should be told, once, that a compaction is coming.
114
+ *
115
+ * Compaction rewrites the conversation. It is not a failure and it does not need
116
+ * permission, but arriving with no notice is how a user ends up wondering why the
117
+ * model forgot the middle of their session.
118
+ */
119
+ export function warnBarFor(autoBar) {
120
+ return Math.round(autoBar * WARN_SHARE_OF_AUTO);
121
+ }
122
+ /**
123
+ * Turn a measured context size into the proactive "a compaction is coming" notice.
124
+ *
125
+ * Nothing shows until context crosses the warn bar (`warnBarFor`, 90% of the auto bar), so
126
+ * an ordinary session never sees it — it appears only for the turn or two of notice before
127
+ * the summarizing pass rewrites the conversation, which is the one thing a user should not
128
+ * meet by surprise. The arithmetic is the SAME auto bar the compaction decision runs on, so
129
+ * what the notice says and what actually happens cannot disagree.
130
+ */
131
+ export function contextPressure(used, model) {
132
+ const auto = autoCompactThreshold(model);
133
+ const percentLeft = auto > 0 ? Math.max(0, Math.round(((auto - used) / auto) * 100)) : 0;
134
+ return { warn: used >= warnBarFor(auto), percentLeft };
135
+ }
136
+ /** Autocompact bar for a model, anchored to its driver's numbers. */
137
+ export function autoCompactThreshold(model) {
138
+ return autoBarFor(sharpContextWindow(model), summaryReserveFor(model));
139
+ }
140
+ /** Microcompact bar for a model, anchored to its driver's numbers. */
141
+ export function microCompactThreshold(model) {
142
+ return microBarFor(sharpContextWindow(model), summaryReserveFor(model));
143
+ }
144
+ /**
145
+ * How long a provider's prompt cache is assumed to survive between requests.
146
+ *
147
+ * 60 minutes, and the size matters more than it looks. This was 5 minutes — Anthropic's
148
+ * default ephemeral TTL — on the reasoning that anything past it is certainly gone. That
149
+ * is wrong in the DANGEROUS direction: the number decides when we clear tool bodies, and
150
+ * clearing rewrites the cached prefix. Guess too SHORT and we destroy an entry that was
151
+ * still alive, forcing a full-price rewrite that would never have happened. Guess too
152
+ * long and we merely miss a saving.
153
+ *
154
+ * Five minutes is only Anthropic's default tier. Its 1h tier exists, DeepSeek's context
155
+ * cache persists for hours, and several providers publish nothing at all — so a 5-minute
156
+ * assumption would have been actively wrong on most of the lineup.
157
+ *
158
+ * 60 minutes is the smallest value that is safe everywhere: past an hour no provider in
159
+ * the lineup is documented to still be holding the prefix, so clearing can only be
160
+ * reclaiming something already lost. Being wrong is then free rather than expensive.
161
+ */
162
+ export const CACHE_TTL_MS = (() => {
163
+ const raw = Number(process.env.MINDWEAVE_CACHE_TTL_MS);
164
+ return Number.isFinite(raw) && raw > 0 ? raw : 60 * 60 * 1000;
165
+ })();
166
+ /**
167
+ * Below this share of the micro bar, a cold cache is not worth compacting for. A
168
+ * session holding almost nothing has almost nothing to save, and clearing tool bodies
169
+ * early costs real detail.
170
+ */
171
+ const COLD_COMPACT_FLOOR = 0.5;
172
+ /**
173
+ * Whether to microcompact because the provider's cache has gone cold, rather than
174
+ * because context is filling up.
175
+ *
176
+ * The normal gate exists for a specific reason: clearing an old tool body REWRITES the
177
+ * transcript, and the transcript is the cached half of the request, so on a warm cache
178
+ * it trades a cheap cached read for a full prefix rewrite at 1.25x. That is a loss, and
179
+ * it is why microcompaction waits for real pressure.
180
+ *
181
+ * None of that argument survives the cache expiring. Once the gap since the last call
182
+ * exceeds the TTL there is no entry left to invalidate — the next request pays to write
183
+ * the whole prefix no matter what it contains. Clearing stale tool bodies first is then
184
+ * strictly free, and the tokens never have to be paid for again.
185
+ *
186
+ * `lastCallAt` of 0 means no call has been made yet (a fresh session), which is not a
187
+ * cold cache — it is no cache, with nothing yet worth clearing.
188
+ */
189
+ export function cacheLikelyCold(lastCallAt, now, used, microBar, ttlMs = CACHE_TTL_MS) {
190
+ if (lastCallAt <= 0)
191
+ return false;
192
+ if (now - lastCallAt <= ttlMs)
193
+ return false;
194
+ return used >= microBar * COLD_COMPACT_FLOOR;
195
+ }
196
+ /**
197
+ * Fraction of the prefix a clear must reclaim to pay for the cache rewrite it causes.
198
+ *
199
+ * Clearing an old tool body is not free on a warm cache: it changes the cached prefix,
200
+ * so the next request rewrites what remains at 1.25x instead of reading it at 0.1x.
201
+ * Writing out the break-even, with P the prefix and R what the clear reclaims:
202
+ *
203
+ * keep for N steps = N * 0.1P
204
+ * clear, then N-1 = 1.25(P-R) + (N-1) * 0.1(P-R)
205
+ * break-even at N = 11.5 * (P - R) / R
206
+ *
207
+ * which is brutal at small R: reclaiming 10% of a 40K prefix needs ~103 further steps
208
+ * to pay off, 50% needs ~12, and 75% needs ~4. A turn does not have 103 steps. So a
209
+ * clear that frees a little is not a small win, it is a real loss, and the only clears
210
+ * worth making on a warm cache are the big ones.
211
+ *
212
+ * 0.35 sits where the break-even (~21 steps) is still optimistic but no longer absurd,
213
+ * and it is deliberately a FRACTION rather than a token count: the thing being paid for
214
+ * is proportional to the prefix, so the threshold has to be too.
215
+ */
216
+ const CLEAR_WORTH_FRACTION = 0.35;
217
+ /**
218
+ * Whether a proposed microcompaction should actually be committed.
219
+ *
220
+ * Three ways to say yes, and they are different kinds of reason:
221
+ *
222
+ * - `cold`: the provider's cache has expired, so there is no entry to invalidate and
223
+ * the rewrite is free. Any reclaim at all is profit.
224
+ * - `urgent`: context is close enough to the autocompact bar that FITTING matters more
225
+ * than cost. A request that does not fit cannot be sent at any price.
226
+ * - otherwise: only when the clear reclaims enough of the prefix to out-earn the cache
227
+ * write it forces, per the arithmetic above.
228
+ *
229
+ * Pure, because the alternative is discovering the economics were wrong from a bill.
230
+ */
231
+ export function clearIsWorthIt(opts) {
232
+ const reclaimed = opts.before - opts.after;
233
+ if (reclaimed <= 0)
234
+ return false;
235
+ if (opts.cold)
236
+ return true;
237
+ // Close to the bar, fitting beats saving: clearing here is what defers a far more
238
+ // expensive summarization, and a prompt that overflows is not a cost question.
239
+ if (opts.before >= opts.autoBar * 0.9)
240
+ return true;
241
+ return reclaimed >= opts.before * CLEAR_WORTH_FRACTION;
242
+ }
243
+ //# sourceMappingURL=contextWindow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextWindow.js","sourceRoot":"","sources":["../../src/dynamo/contextWindow.ts"],"names":[],"mappings":"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"}