mindweave 0.0.1 → 2.1.2

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 (481) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +171 -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 +2586 -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/updateCheck.js +107 -0
  134. package/dist/cli/updateCheck.js.map +1 -0
  135. package/dist/cli/version.js +39 -0
  136. package/dist/cli/version.js.map +1 -0
  137. package/dist/cli/viewport.js +179 -0
  138. package/dist/cli/viewport.js.map +1 -0
  139. package/dist/cli/virtualWindow.js +103 -0
  140. package/dist/cli/virtualWindow.js.map +1 -0
  141. package/dist/cli/workingVerb.js +37 -0
  142. package/dist/cli/workingVerb.js.map +1 -0
  143. package/dist/cli/wrap.js +145 -0
  144. package/dist/cli/wrap.js.map +1 -0
  145. package/dist/drivers/anthropic/cachePoints.js +77 -0
  146. package/dist/drivers/anthropic/cachePoints.js.map +1 -0
  147. package/dist/drivers/anthropic/client.js +432 -0
  148. package/dist/drivers/anthropic/client.js.map +1 -0
  149. package/dist/drivers/anthropic/index.js +10 -0
  150. package/dist/drivers/anthropic/index.js.map +1 -0
  151. package/dist/drivers/anthropic/manifest.js +221 -0
  152. package/dist/drivers/anthropic/manifest.js.map +1 -0
  153. package/dist/drivers/cerebras/client.js +69 -0
  154. package/dist/drivers/cerebras/client.js.map +1 -0
  155. package/dist/drivers/cerebras/index.js +5 -0
  156. package/dist/drivers/cerebras/index.js.map +1 -0
  157. package/dist/drivers/cerebras/manifest.js +140 -0
  158. package/dist/drivers/cerebras/manifest.js.map +1 -0
  159. package/dist/drivers/clientId.js +41 -0
  160. package/dist/drivers/clientId.js.map +1 -0
  161. package/dist/drivers/contextOverflow.js +77 -0
  162. package/dist/drivers/contextOverflow.js.map +1 -0
  163. package/dist/drivers/deepseek/client.js +168 -0
  164. package/dist/drivers/deepseek/client.js.map +1 -0
  165. package/dist/drivers/deepseek/index.js +16 -0
  166. package/dist/drivers/deepseek/index.js.map +1 -0
  167. package/dist/drivers/deepseek/inlineTools.js +46 -0
  168. package/dist/drivers/deepseek/inlineTools.js.map +1 -0
  169. package/dist/drivers/deepseek/manifest.js +166 -0
  170. package/dist/drivers/deepseek/manifest.js.map +1 -0
  171. package/dist/drivers/gemini/client.js +38 -0
  172. package/dist/drivers/gemini/client.js.map +1 -0
  173. package/dist/drivers/gemini/index.js +5 -0
  174. package/dist/drivers/gemini/index.js.map +1 -0
  175. package/dist/drivers/gemini/manifest.js +150 -0
  176. package/dist/drivers/gemini/manifest.js.map +1 -0
  177. package/dist/drivers/glm/client.js +90 -0
  178. package/dist/drivers/glm/client.js.map +1 -0
  179. package/dist/drivers/glm/index.js +9 -0
  180. package/dist/drivers/glm/index.js.map +1 -0
  181. package/dist/drivers/glm/manifest.js +183 -0
  182. package/dist/drivers/glm/manifest.js.map +1 -0
  183. package/dist/drivers/groq/client.js +80 -0
  184. package/dist/drivers/groq/client.js.map +1 -0
  185. package/dist/drivers/groq/index.js +5 -0
  186. package/dist/drivers/groq/index.js.map +1 -0
  187. package/dist/drivers/groq/manifest.js +160 -0
  188. package/dist/drivers/groq/manifest.js.map +1 -0
  189. package/dist/drivers/kimi/client.js +82 -0
  190. package/dist/drivers/kimi/client.js.map +1 -0
  191. package/dist/drivers/kimi/index.js +9 -0
  192. package/dist/drivers/kimi/index.js.map +1 -0
  193. package/dist/drivers/kimi/manifest.js +168 -0
  194. package/dist/drivers/kimi/manifest.js.map +1 -0
  195. package/dist/drivers/meta/client.js +30 -0
  196. package/dist/drivers/meta/client.js.map +1 -0
  197. package/dist/drivers/meta/index.js +5 -0
  198. package/dist/drivers/meta/index.js.map +1 -0
  199. package/dist/drivers/meta/manifest.js +101 -0
  200. package/dist/drivers/meta/manifest.js.map +1 -0
  201. package/dist/drivers/minimax/client.js +36 -0
  202. package/dist/drivers/minimax/client.js.map +1 -0
  203. package/dist/drivers/minimax/index.js +5 -0
  204. package/dist/drivers/minimax/index.js.map +1 -0
  205. package/dist/drivers/minimax/manifest.js +120 -0
  206. package/dist/drivers/minimax/manifest.js.map +1 -0
  207. package/dist/drivers/mistral/client.js +54 -0
  208. package/dist/drivers/mistral/client.js.map +1 -0
  209. package/dist/drivers/mistral/index.js +5 -0
  210. package/dist/drivers/mistral/index.js.map +1 -0
  211. package/dist/drivers/mistral/manifest.js +118 -0
  212. package/dist/drivers/mistral/manifest.js.map +1 -0
  213. package/dist/drivers/openai/client.js +290 -0
  214. package/dist/drivers/openai/client.js.map +1 -0
  215. package/dist/drivers/openai/index.js +9 -0
  216. package/dist/drivers/openai/index.js.map +1 -0
  217. package/dist/drivers/openai/manifest.js +133 -0
  218. package/dist/drivers/openai/manifest.js.map +1 -0
  219. package/dist/drivers/openaiCompat/wire.js +493 -0
  220. package/dist/drivers/openaiCompat/wire.js.map +1 -0
  221. package/dist/drivers/partialTurn.js +23 -0
  222. package/dist/drivers/partialTurn.js.map +1 -0
  223. package/dist/drivers/providerError.js +181 -0
  224. package/dist/drivers/providerError.js.map +1 -0
  225. package/dist/drivers/qwen/client.js +93 -0
  226. package/dist/drivers/qwen/client.js.map +1 -0
  227. package/dist/drivers/qwen/index.js +9 -0
  228. package/dist/drivers/qwen/index.js.map +1 -0
  229. package/dist/drivers/qwen/manifest.js +146 -0
  230. package/dist/drivers/qwen/manifest.js.map +1 -0
  231. package/dist/drivers/registry.js +177 -0
  232. package/dist/drivers/registry.js.map +1 -0
  233. package/dist/drivers/retryPolicy.js +129 -0
  234. package/dist/drivers/retryPolicy.js.map +1 -0
  235. package/dist/drivers/searchBlocks.js +61 -0
  236. package/dist/drivers/searchBlocks.js.map +1 -0
  237. package/dist/drivers/types.js +2 -0
  238. package/dist/drivers/types.js.map +1 -0
  239. package/dist/drivers/xai/client.js +63 -0
  240. package/dist/drivers/xai/client.js.map +1 -0
  241. package/dist/drivers/xai/index.js +5 -0
  242. package/dist/drivers/xai/index.js.map +1 -0
  243. package/dist/drivers/xai/manifest.js +137 -0
  244. package/dist/drivers/xai/manifest.js.map +1 -0
  245. package/dist/dynamo/_probe.tmp.js +20 -0
  246. package/dist/dynamo/_probe.tmp.js.map +1 -0
  247. package/dist/dynamo/cacheBreak.js +88 -0
  248. package/dist/dynamo/cacheBreak.js.map +1 -0
  249. package/dist/dynamo/contextWindow.js +243 -0
  250. package/dist/dynamo/contextWindow.js.map +1 -0
  251. package/dist/dynamo/engine.js +2011 -0
  252. package/dist/dynamo/engine.js.map +1 -0
  253. package/dist/dynamo/guard.js +132 -0
  254. package/dist/dynamo/guard.js.map +1 -0
  255. package/dist/dynamo/liveMeter.js +58 -0
  256. package/dist/dynamo/liveMeter.js.map +1 -0
  257. package/dist/dynamo/model.js +172 -0
  258. package/dist/dynamo/model.js.map +1 -0
  259. package/dist/dynamo/planArtifact.js +125 -0
  260. package/dist/dynamo/planArtifact.js.map +1 -0
  261. package/dist/dynamo/pricing.js +140 -0
  262. package/dist/dynamo/pricing.js.map +1 -0
  263. package/dist/dynamo/prompt.js +264 -0
  264. package/dist/dynamo/prompt.js.map +1 -0
  265. package/dist/dynamo/spend.js +45 -0
  266. package/dist/dynamo/spend.js.map +1 -0
  267. package/dist/dynamo/verify.js +483 -0
  268. package/dist/dynamo/verify.js.map +1 -0
  269. package/dist/governor/forbidden.js +181 -0
  270. package/dist/governor/forbidden.js.map +1 -0
  271. package/dist/governor/freshness.js +83 -0
  272. package/dist/governor/freshness.js.map +1 -0
  273. package/dist/governor/frontmatter.js +38 -0
  274. package/dist/governor/frontmatter.js.map +1 -0
  275. package/dist/governor/glob.js +75 -0
  276. package/dist/governor/glob.js.map +1 -0
  277. package/dist/governor/index.js +87 -0
  278. package/dist/governor/index.js.map +1 -0
  279. package/dist/governor/rules.js +80 -0
  280. package/dist/governor/rules.js.map +1 -0
  281. package/dist/governor/scope.js +91 -0
  282. package/dist/governor/scope.js.map +1 -0
  283. package/dist/governor/skills.js +176 -0
  284. package/dist/governor/skills.js.map +1 -0
  285. package/dist/governor/types.js +16 -0
  286. package/dist/governor/types.js.map +1 -0
  287. package/dist/governor/write.js +182 -0
  288. package/dist/governor/write.js.map +1 -0
  289. package/dist/index.js +89 -0
  290. package/dist/index.js.map +1 -0
  291. package/dist/mcp/catalog.js +232 -0
  292. package/dist/mcp/catalog.js.map +1 -0
  293. package/dist/mcp/config.js +116 -0
  294. package/dist/mcp/config.js.map +1 -0
  295. package/dist/mcp/configWrite.js +254 -0
  296. package/dist/mcp/configWrite.js.map +1 -0
  297. package/dist/mcp/connection.js +504 -0
  298. package/dist/mcp/connection.js.map +1 -0
  299. package/dist/mcp/deferred.js +104 -0
  300. package/dist/mcp/deferred.js.map +1 -0
  301. package/dist/mcp/discover.js +128 -0
  302. package/dist/mcp/discover.js.map +1 -0
  303. package/dist/mcp/manager.js +679 -0
  304. package/dist/mcp/manager.js.map +1 -0
  305. package/dist/mcp/paramHeaders.js +163 -0
  306. package/dist/mcp/paramHeaders.js.map +1 -0
  307. package/dist/mcp/prompts.js +136 -0
  308. package/dist/mcp/prompts.js.map +1 -0
  309. package/dist/mcp/protocol.js +171 -0
  310. package/dist/mcp/protocol.js.map +1 -0
  311. package/dist/mcp/resources.js +119 -0
  312. package/dist/mcp/resources.js.map +1 -0
  313. package/dist/mcp/resultStore.js +180 -0
  314. package/dist/mcp/resultStore.js.map +1 -0
  315. package/dist/mcp/subscriptions.js +74 -0
  316. package/dist/mcp/subscriptions.js.map +1 -0
  317. package/dist/mcp/transport/headerValue.js +40 -0
  318. package/dist/mcp/transport/headerValue.js.map +1 -0
  319. package/dist/mcp/transport/http.js +321 -0
  320. package/dist/mcp/transport/http.js.map +1 -0
  321. package/dist/mcp/transport/stdio.js +234 -0
  322. package/dist/mcp/transport/stdio.js.map +1 -0
  323. package/dist/mcp/transport/types.js +27 -0
  324. package/dist/mcp/transport/types.js.map +1 -0
  325. package/dist/mcp/trust.js +98 -0
  326. package/dist/mcp/trust.js.map +1 -0
  327. package/dist/mcp/trustStore.js +55 -0
  328. package/dist/mcp/trustStore.js.map +1 -0
  329. package/dist/memory/autoMemory.js +340 -0
  330. package/dist/memory/autoMemory.js.map +1 -0
  331. package/dist/memory/compaction.js +513 -0
  332. package/dist/memory/compaction.js.map +1 -0
  333. package/dist/memory/images.js +173 -0
  334. package/dist/memory/images.js.map +1 -0
  335. package/dist/memory/presence.js +59 -0
  336. package/dist/memory/presence.js.map +1 -0
  337. package/dist/memory/projectNotes.js +247 -0
  338. package/dist/memory/projectNotes.js.map +1 -0
  339. package/dist/memory/restore.js +72 -0
  340. package/dist/memory/restore.js.map +1 -0
  341. package/dist/memory/session.js +472 -0
  342. package/dist/memory/session.js.map +1 -0
  343. package/dist/memory/sessionMemory.js +142 -0
  344. package/dist/memory/sessionMemory.js.map +1 -0
  345. package/dist/memory/sessionMemoryCompact.js +136 -0
  346. package/dist/memory/sessionMemoryCompact.js.map +1 -0
  347. package/dist/memory/store.js +217 -0
  348. package/dist/memory/store.js.map +1 -0
  349. package/dist/memory/types.js +14 -0
  350. package/dist/memory/types.js.map +1 -0
  351. package/dist/memory/workingSet.js +383 -0
  352. package/dist/memory/workingSet.js.map +1 -0
  353. package/dist/project/context.js +425 -0
  354. package/dist/project/context.js.map +1 -0
  355. package/dist/tools/approval.js +189 -0
  356. package/dist/tools/approval.js.map +1 -0
  357. package/dist/tools/askUser.js +103 -0
  358. package/dist/tools/askUser.js.map +1 -0
  359. package/dist/tools/atomicWrite.js +151 -0
  360. package/dist/tools/atomicWrite.js.map +1 -0
  361. package/dist/tools/backgroundShells.js +468 -0
  362. package/dist/tools/backgroundShells.js.map +1 -0
  363. package/dist/tools/captureSweep.js +77 -0
  364. package/dist/tools/captureSweep.js.map +1 -0
  365. package/dist/tools/chassisMux.js +92 -0
  366. package/dist/tools/chassisMux.js.map +1 -0
  367. package/dist/tools/checkpoints.js +328 -0
  368. package/dist/tools/checkpoints.js.map +1 -0
  369. package/dist/tools/codeIntel.js +267 -0
  370. package/dist/tools/codeIntel.js.map +1 -0
  371. package/dist/tools/deferredNative.js +121 -0
  372. package/dist/tools/deferredNative.js.map +1 -0
  373. package/dist/tools/detail.js +135 -0
  374. package/dist/tools/detail.js.map +1 -0
  375. package/dist/tools/diagnostics.js +174 -0
  376. package/dist/tools/diagnostics.js.map +1 -0
  377. package/dist/tools/edit.js +167 -0
  378. package/dist/tools/edit.js.map +1 -0
  379. package/dist/tools/editCore.js +283 -0
  380. package/dist/tools/editCore.js.map +1 -0
  381. package/dist/tools/editFile.js +183 -0
  382. package/dist/tools/editFile.js.map +1 -0
  383. package/dist/tools/editRipple.js +126 -0
  384. package/dist/tools/editRipple.js.map +1 -0
  385. package/dist/tools/editTarget.js +131 -0
  386. package/dist/tools/editTarget.js.map +1 -0
  387. package/dist/tools/editWindow.js +49 -0
  388. package/dist/tools/editWindow.js.map +1 -0
  389. package/dist/tools/eol.js +56 -0
  390. package/dist/tools/eol.js.map +1 -0
  391. package/dist/tools/exitPlan.js +175 -0
  392. package/dist/tools/exitPlan.js.map +1 -0
  393. package/dist/tools/focus.js +42 -0
  394. package/dist/tools/focus.js.map +1 -0
  395. package/dist/tools/gitignore.js +148 -0
  396. package/dist/tools/gitignore.js.map +1 -0
  397. package/dist/tools/glob.js +134 -0
  398. package/dist/tools/glob.js.map +1 -0
  399. package/dist/tools/governorTools.js +258 -0
  400. package/dist/tools/governorTools.js.map +1 -0
  401. package/dist/tools/grep.js +450 -0
  402. package/dist/tools/grep.js.map +1 -0
  403. package/dist/tools/guard.js +220 -0
  404. package/dist/tools/guard.js.map +1 -0
  405. package/dist/tools/killTree.js +215 -0
  406. package/dist/tools/killTree.js.map +1 -0
  407. package/dist/tools/listDir.js +143 -0
  408. package/dist/tools/listDir.js.map +1 -0
  409. package/dist/tools/mcpAdd.js +176 -0
  410. package/dist/tools/mcpAdd.js.map +1 -0
  411. package/dist/tools/mcpResources.js +116 -0
  412. package/dist/tools/mcpResources.js.map +1 -0
  413. package/dist/tools/mcpSearch.js +123 -0
  414. package/dist/tools/mcpSearch.js.map +1 -0
  415. package/dist/tools/multiEdit.js +168 -0
  416. package/dist/tools/multiEdit.js.map +1 -0
  417. package/dist/tools/paths.js +225 -0
  418. package/dist/tools/paths.js.map +1 -0
  419. package/dist/tools/posixShell.js +123 -0
  420. package/dist/tools/posixShell.js.map +1 -0
  421. package/dist/tools/readFile.js +371 -0
  422. package/dist/tools/readFile.js.map +1 -0
  423. package/dist/tools/readSymbol.js +145 -0
  424. package/dist/tools/readSymbol.js.map +1 -0
  425. package/dist/tools/registry.js +120 -0
  426. package/dist/tools/registry.js.map +1 -0
  427. package/dist/tools/replaceSymbol.js +141 -0
  428. package/dist/tools/replaceSymbol.js.map +1 -0
  429. package/dist/tools/results.js +15 -0
  430. package/dist/tools/results.js.map +1 -0
  431. package/dist/tools/ripgrep.js +145 -0
  432. package/dist/tools/ripgrep.js.map +1 -0
  433. package/dist/tools/runCommand.js +633 -0
  434. package/dist/tools/runCommand.js.map +1 -0
  435. package/dist/tools/saveMemory.js +102 -0
  436. package/dist/tools/saveMemory.js.map +1 -0
  437. package/dist/tools/screenshot.js +200 -0
  438. package/dist/tools/screenshot.js.map +1 -0
  439. package/dist/tools/screenshotWin.js +227 -0
  440. package/dist/tools/screenshotWin.js.map +1 -0
  441. package/dist/tools/search.js +121 -0
  442. package/dist/tools/search.js.map +1 -0
  443. package/dist/tools/sessionTools.js +187 -0
  444. package/dist/tools/sessionTools.js.map +1 -0
  445. package/dist/tools/shellCheckpoint.js +123 -0
  446. package/dist/tools/shellCheckpoint.js.map +1 -0
  447. package/dist/tools/shellLint.js +102 -0
  448. package/dist/tools/shellLint.js.map +1 -0
  449. package/dist/tools/shellTools.js +203 -0
  450. package/dist/tools/shellTools.js.map +1 -0
  451. package/dist/tools/spanCore.js +78 -0
  452. package/dist/tools/spanCore.js.map +1 -0
  453. package/dist/tools/subagent.js +224 -0
  454. package/dist/tools/subagent.js.map +1 -0
  455. package/dist/tools/subagentReport.js +114 -0
  456. package/dist/tools/subagentReport.js.map +1 -0
  457. package/dist/tools/tempSweep.js +118 -0
  458. package/dist/tools/tempSweep.js.map +1 -0
  459. package/dist/tools/todo.js +117 -0
  460. package/dist/tools/todo.js.map +1 -0
  461. package/dist/tools/types.js +2 -0
  462. package/dist/tools/types.js.map +1 -0
  463. package/dist/tools/untrusted.js +46 -0
  464. package/dist/tools/untrusted.js.map +1 -0
  465. package/dist/tools/useSkill.js +62 -0
  466. package/dist/tools/useSkill.js.map +1 -0
  467. package/dist/tools/walk.js +152 -0
  468. package/dist/tools/walk.js.map +1 -0
  469. package/dist/tools/web.js +61 -0
  470. package/dist/tools/web.js.map +1 -0
  471. package/dist/tools/webFetch.js +444 -0
  472. package/dist/tools/webFetch.js.map +1 -0
  473. package/dist/tools/webSearch.js +130 -0
  474. package/dist/tools/webSearch.js.map +1 -0
  475. package/dist/tools/workspace.js +212 -0
  476. package/dist/tools/workspace.js.map +1 -0
  477. package/dist/tools/workspaceDiscover.js +216 -0
  478. package/dist/tools/workspaceDiscover.js.map +1 -0
  479. package/dist/tools/writeFile.js +162 -0
  480. package/dist/tools/writeFile.js.map +1 -0
  481. package/package.json +74 -28
@@ -0,0 +1,181 @@
1
+ /**
2
+ * providerError.ts — telling "your account cannot run this" apart from "we sent
3
+ * something broken".
4
+ *
5
+ * Both arrive as a failed HTTP request and, before this, both came out as the same
6
+ * red error with a JSON blob attached:
7
+ *
8
+ * ⚠ DeepSeek API error 402: {"error":{"message":"Insufficient Balance", …}}
9
+ *
10
+ * That is the wrong shape twice over. It reads as a crash when nothing is broken,
11
+ * and it buries the one sentence that actually explains the situation.
12
+ *
13
+ * WHY THIS DOES NOT CLASSIFY THE REASON. The obvious version reads the body and
14
+ * decides whether it is billing, a rate limit, or a revoked key, then writes a
15
+ * tailored message. Ten providers word those three things ten ways, so that version
16
+ * is occasionally confidently wrong — and telling someone to top up when they only
17
+ * need to wait thirty seconds is worse than saying nothing specific at all.
18
+ *
19
+ * So this module does not explain. It recognises that the provider refused for an
20
+ * ACCOUNT reason, and QUOTES the provider's own sentence. The wrapper is universal
21
+ * and cannot be wrong; the precision comes from the provider, which already knows.
22
+ */
23
+ /**
24
+ * Statuses that mean the ACCOUNT cannot run this request.
25
+ *
26
+ * Deliberately narrow. A 400 is a malformed request — our bug, in a parameter we
27
+ * chose — and dressing that up as a calm account notice would hide exactly the class
28
+ * of defect that a driver's per-model rules exist to prevent. 5xx is the provider
29
+ * falling over, which is transient and already mapped to `overloaded`. Only these
30
+ * four mean "the key is fine as a string, but the account behind it will not serve
31
+ * you right now".
32
+ */
33
+ const ACCESS_STATUSES = new Set([401, 402, 403, 429]);
34
+ /**
35
+ * The one exception, and it is Anthropic's fault rather than a weakening of the rule.
36
+ *
37
+ * Anthropic returns a spent balance as **400 `invalid_request_error`**, not 402:
38
+ *
39
+ * {"type":"error","error":{"type":"invalid_request_error",
40
+ * "message":"Your credit balance is too low to access the Anthropic API…"}}
41
+ *
42
+ * 400 otherwise means we sent something malformed, which must stay loud, so the
43
+ * status alone cannot decide it. This is a narrow reprieve: a 400 counts as an
44
+ * account refusal only when the provider's own sentence is unambiguously about an
45
+ * allowance. Note what it is NOT doing — it is not diagnosing WHY among account
46
+ * causes, which is the thing this module refuses to guess at. It answers the prior
47
+ * question, "is this about the account at all", for the one status where the code is
48
+ * useless, and it answers it with the provider's words rather than ours.
49
+ *
50
+ * Kept deliberately tight, because the failure directions are not symmetric: a miss
51
+ * shows an ugly-but-honest red error, while a false match hides a real bug of ours
52
+ * behind a reassuring message. Every phrase here is about money or allowance and
53
+ * nothing else. (LiteLLM shipped the un-handled version of this and it silently
54
+ * broke their provider fallback, which is the same defect in a different coat.)
55
+ */
56
+ const BALANCE_PHRASES = [
57
+ "credit balance",
58
+ "insufficient balance",
59
+ "insufficient_quota",
60
+ "insufficient quota",
61
+ "exceeded your current quota",
62
+ "billing",
63
+ "payment required",
64
+ "purchase credits",
65
+ ];
66
+ /** Whether a message is unambiguously about an account allowance. */
67
+ function namesAnAllowance(message) {
68
+ const text = message.toLowerCase();
69
+ return BALANCE_PHRASES.some((phrase) => text.includes(phrase));
70
+ }
71
+ /** The HTTP status carried by an error, whether ours or an SDK's. Null if none. */
72
+ export function statusOf(error) {
73
+ if (!error || typeof error !== "object")
74
+ return null;
75
+ const status = error.status;
76
+ return typeof status === "number" ? status : null;
77
+ }
78
+ /**
79
+ * The raw body an error carries, from whichever field its source used.
80
+ *
81
+ * Three shapes reach here and none of them agree. Our own `ProviderHttpError` keeps
82
+ * the untouched response text on `detail`. The Anthropic and OpenAI SDKs parse the
83
+ * body for us and hang the OBJECT on `error`. Everything else has only a `message`,
84
+ * which for an SDK is the status and the whole JSON blob concatenated — parseable by
85
+ * nothing, which is why it is the last resort rather than the first.
86
+ */
87
+ export function detailOf(error) {
88
+ if (!error || typeof error !== "object")
89
+ return String(error ?? "");
90
+ const e = error;
91
+ if (typeof e.detail === "string" && e.detail.trim())
92
+ return e.detail;
93
+ // An SDK's pre-parsed body. Re-serialising it lets one extractor handle both
94
+ // routes instead of two that can disagree about which field wins.
95
+ if (e.error && typeof e.error === "object") {
96
+ try {
97
+ return JSON.stringify({ error: e.error });
98
+ }
99
+ catch {
100
+ /* circular or otherwise unserialisable; fall through to the message */
101
+ }
102
+ }
103
+ return typeof e.message === "string" ? e.message : String(error);
104
+ }
105
+ /**
106
+ * The provider's own explanation, pulled out of whatever it sent back.
107
+ *
108
+ * Providers return the sentence in at least four shapes, so each is tried in turn
109
+ * and the raw text is the last resort. The result is capped: a body can be a full
110
+ * HTML error page, and the notice renders in the footer, where an unbounded string
111
+ * pushes the input box off the screen (the exact failure the plan-approval overlay
112
+ * hit once already).
113
+ */
114
+ export function providerMessage(detail) {
115
+ const raw = (detail ?? "").trim();
116
+ if (!raw)
117
+ return "";
118
+ let text = raw;
119
+ try {
120
+ const parsed = JSON.parse(raw);
121
+ if (parsed && typeof parsed === "object") {
122
+ const obj = parsed;
123
+ const err = obj.error;
124
+ const candidates = [
125
+ typeof err === "object" && err ? err.message : undefined,
126
+ typeof err === "string" ? err : undefined,
127
+ obj.message,
128
+ obj.detail,
129
+ ];
130
+ const found = candidates.find((c) => typeof c === "string" && c.trim());
131
+ if (typeof found === "string")
132
+ text = found.trim();
133
+ }
134
+ }
135
+ catch {
136
+ // Not JSON. The raw text is the message, which is what several providers send.
137
+ }
138
+ // One line, bounded. Newlines would break the rail's alignment, and the length
139
+ // cap is what stops an HTML page from evicting the input box.
140
+ const flat = text.replace(/\s+/g, " ").trim();
141
+ return flat.length > 240 ? `${flat.slice(0, 239)}…` : flat;
142
+ }
143
+ /**
144
+ * Recognise an account-level refusal and shape it for the screen.
145
+ *
146
+ * Returns null for anything else, which is the caller's signal to keep its ordinary
147
+ * red error. Being conservative here is the point: a false negative shows a message
148
+ * that is merely ugly, while a false positive tells the user their account is the
149
+ * problem when the bug is ours.
150
+ *
151
+ * @param canSwitch whether another installed provider has a key. When it does not,
152
+ * suggesting `/provider` is noise — there is nothing to switch to.
153
+ */
154
+ export function accessRefusal(error, providerLabel, canSwitch) {
155
+ const status = statusOf(error);
156
+ if (status === null)
157
+ return null;
158
+ const said = providerMessage(detailOf(error));
159
+ // A 400 has to earn it by naming an allowance; every other listed status is
160
+ // already unambiguous. See BALANCE_PHRASES for why the exception exists.
161
+ const isRefusal = ACCESS_STATUSES.has(status) || (status === 400 && namesAnAllowance(said));
162
+ if (!isRefusal)
163
+ return null;
164
+ // WHICH failure decides the advice. A rejected key is fixed here, by typing it again —
165
+ // it is the commonest way a first run dies, usually a typo or a key pasted for the
166
+ // wrong provider, and "sort it out on the provider's side" sends someone to a billing
167
+ // page over a mistyped character. A spent balance or a rate limit genuinely is on the
168
+ // provider's side, and offering to retype a working key would be the wrong steer.
169
+ const keyRejected = status === 401 || status === 403;
170
+ const switchLine = canSwitch ? " Or /provider to use a different one." : "";
171
+ const action = keyRejected
172
+ ? "The conversation is saved. Run /key to enter it again — a mistyped key, or one for" +
173
+ String.fromCharCode(10) + "a different provider, is the usual cause." + switchLine
174
+ : "The conversation is saved. Sort it out on the provider's side and pick up" +
175
+ String.fromCharCode(10) + "where you left off." + switchLine;
176
+ return {
177
+ title: `${providerLabel} isn't accepting requests on this key`,
178
+ body: said ? `${said}\n\n${action}` : action,
179
+ };
180
+ }
181
+ //# sourceMappingURL=providerError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerError.js","sourceRoot":"","sources":["../../src/drivers/providerError.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import { compatStreamTurn, compatToolTurn, } from "../openaiCompat/wire.js";
2
+ import { BUFFERED_OUTPUT_TOKENS, DEFAULT_MODEL } from "./manifest.js";
3
+ /**
4
+ * The international DashScope endpoint. The Chinese Mainland endpoint is a
5
+ * different host with different prices, and the key is not interchangeable, so
6
+ * this is an override rather than a guess: a user on the Mainland account sets
7
+ * `MINDWEAVE_QWEN_URL` and everything else works unchanged.
8
+ */
9
+ const BASE_URL = process.env.MINDWEAVE_QWEN_URL ?? "https://dashscope-intl.aliyuncs.com/compatible-mode/v1";
10
+ /**
11
+ * Thinking budgets, in tokens, for each shared effort rung.
12
+ *
13
+ * Qwen caps `thinking_budget` at 32,768 and the top rung deliberately sits exactly
14
+ * there. The rungs below are spaced to be visibly different in behaviour rather
15
+ * than evenly: the gap that matters to a user is between "a little" and "a lot",
16
+ * not between two adjacent large numbers.
17
+ */
18
+ const THINKING_BUDGETS = {
19
+ low: 4_000,
20
+ medium: 8_000,
21
+ high: 16_000,
22
+ xhigh: 24_000,
23
+ max: 32_768,
24
+ };
25
+ /** The budget for an effort rung, falling back to the middle of the ladder. */
26
+ export function thinkingBudget(effort) {
27
+ return THINKING_BUDGETS[effort ?? "high"] ?? THINKING_BUDGETS.high;
28
+ }
29
+ /**
30
+ * Qwen's reasoning fields.
31
+ *
32
+ * `enable_thinking` is ALWAYS sent, both ways, and that is the load-bearing detail
33
+ * in this file. Every model in this lineup has thinking ON by default, so omitting
34
+ * the field does not mean "no thinking" — it means full reasoning, billed at the
35
+ * higher thinking rate. Every internal call that never sets `req.model` (the
36
+ * session summarizer, the page distiller) would silently pay for reasoning it never
37
+ * asked for and that the UI discards. Sending an explicit `false` is what actually
38
+ * turns it off. This is the same trap the DeepSeek driver documents; it is a
39
+ * property of the family, not a coincidence.
40
+ *
41
+ * `thinking_budget` is deliberately preferred over `reasoning_effort`: both are
42
+ * accepted, but the budget's units are unambiguous and its cap is documented,
43
+ * whereas the effort ladder's accepted values are provider-specific and not the
44
+ * same set as the shared one.
45
+ */
46
+ export function reasoningFields(config) {
47
+ if (!config?.thinking)
48
+ return { enable_thinking: false };
49
+ return { enable_thinking: true, thinking_budget: thinkingBudget(config.effort) };
50
+ }
51
+ /**
52
+ * Qwen reports its cache hit as `prompt_tokens_details.cached_tokens`, where
53
+ * `prompt_tokens` is the FULL prompt including the cached part — so the miss side
54
+ * is the remainder rather than a separate figure to add.
55
+ */
56
+ export function cacheSplit(usage) {
57
+ const details = usage.prompt_tokens_details;
58
+ const hit = typeof details?.cached_tokens === "number" ? details.cached_tokens : 0;
59
+ if (hit === 0)
60
+ return undefined;
61
+ const prompt = typeof usage.prompt_tokens === "number" ? usage.prompt_tokens : 0;
62
+ return { hit, miss: Math.max(0, prompt - hit) };
63
+ }
64
+ /**
65
+ * A request cut short by the provider's own capacity rather than by a token limit
66
+ * or a safety decision. Without a case for it this falls through to `"end"`, and a
67
+ * starved, incomplete reply gets reported as a clean finish.
68
+ */
69
+ export function extraStop(reason) {
70
+ return reason === "insufficient_system_resource" ? "overloaded" : undefined;
71
+ }
72
+ /** Everything the shared wire layer needs to talk to Qwen. */
73
+ export const qwenProvider = {
74
+ label: "Qwen",
75
+ baseUrl: BASE_URL,
76
+ apiKeyEnv: "DASHSCOPE_API_KEY",
77
+ defaultModel: process.env.MINDWEAVE_MODEL ?? DEFAULT_MODEL,
78
+ reasoningFields,
79
+ extraStop,
80
+ cacheSplit,
81
+ // Must match the manifest's `bufferedOutputTokens`, which is what core reserves
82
+ // room for below the context window.
83
+ bufferedMaxTokens: BUFFERED_OUTPUT_TOKENS,
84
+ };
85
+ /** Ask the model for one turn. */
86
+ export async function toolTurn(req, options = {}) {
87
+ return compatToolTurn(qwenProvider, req, options.signal);
88
+ }
89
+ /** Ask the model for one turn, streaming deltas to `options.onEvent`. */
90
+ export async function streamTurn(req, options = {}) {
91
+ return compatStreamTurn(qwenProvider, req, options.onEvent, options.signal);
92
+ }
93
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/drivers/qwen/client.ts"],"names":[],"mappings":"AAqBA,OAAO,EACL,gBAAgB,EAChB,cAAc,GAEf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEtE;;;;;GAKG;AACH,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,wDAAwD,CAAC;AAE5G;;;;;;;GAOG;AACH,MAAM,gBAAgB,GAA2B;IAC/C,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,MAAM;IACb,GAAG,EAAE,MAAM;CACZ,CAAC;AAEF,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,MAA0B;IACvD,OAAO,gBAAgB,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,gBAAgB,CAAC,IAAK,CAAC;AACtE,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,eAAe,CAAC,MAA+B;IAC7D,IAAI,CAAC,MAAM,EAAE,QAAQ;QAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IACzD,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AACnF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,KAA8B;IACvD,MAAM,OAAO,GAAG,KAAK,CAAC,qBAA+D,CAAC;IACtF,MAAM,GAAG,GAAG,OAAO,OAAO,EAAE,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IACnF,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,OAAO,MAAM,KAAK,8BAA8B,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9E,CAAC;AAED,8DAA8D;AAC9D,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,QAAQ;IACjB,SAAS,EAAE,mBAAmB;IAC9B,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,aAAa;IAC1D,eAAe;IACf,SAAS;IACT,UAAU;IACV,gFAAgF;IAChF,qCAAqC;IACrC,iBAAiB,EAAE,sBAAsB;CAC1C,CAAC;AAEF,kCAAkC;AAClC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAiB,EAAE,UAAuB,EAAE;IACzE,OAAO,cAAc,CAAC,YAAY,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;AAC3D,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAiB,EAAE,UAAyB,EAAE;IAC7E,OAAO,gBAAgB,CAAC,YAAY,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { streamTurn, toolTurn } from "./client.js";
2
+ import { qwenManifest } from "./manifest.js";
3
+ export const qwenDriver = {
4
+ ...qwenManifest,
5
+ toolTurn,
6
+ streamTurn,
7
+ };
8
+ export default qwenDriver;
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/drivers/qwen/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,CAAC,MAAM,UAAU,GAAW;IAChC,GAAG,YAAY;IACf,QAAQ;IACR,UAAU;CACX,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,146 @@
1
+ export const MAX_38 = "qwen3.8-max";
2
+ export const MAX_37 = "qwen3.7-max";
3
+ export const PLUS = "qwen3.7-plus";
4
+ export const FLASH = "qwen3.5-flash";
5
+ /** The model used when nothing is saved and no env override is set. */
6
+ export const DEFAULT_MODEL = PLUS;
7
+ /**
8
+ * The models offered by `/model`. First entry is this provider's default, which is
9
+ * also where `/provider` lands when someone switches to Qwen.
10
+ *
11
+ * Plus leads rather than Max: it is roughly a sixth of Max's rate and carries the
12
+ * same 1M window, so it is the one that is rarely the wrong answer for ordinary
13
+ * work. Both Max tiers are listed because the older one is materially cheaper and
14
+ * has not been withdrawn.
15
+ */
16
+ export const MODELS = [
17
+ { id: PLUS, label: "Qwen3.7 Plus", description: "balanced and cheap to run — the default" },
18
+ { id: MAX_38, label: "Qwen3.8 Max", description: "the flagship, for the hardest work" },
19
+ { id: MAX_37, label: "Qwen3.7 Max", description: "the previous flagship, at half the rate" },
20
+ { id: FLASH, label: "Qwen3.5 Flash", description: "fastest and cheapest, for simple work" },
21
+ ];
22
+ /**
23
+ * The reasoning levels offered by `/think`.
24
+ *
25
+ * Qwen expresses reasoning as a toggle plus a TOKEN BUDGET rather than an effort
26
+ * rung, so the shared rungs are mapped onto budgets in `client.ts`. Every model
27
+ * here can have thinking turned off, and every one of them has it ON by default —
28
+ * which is exactly why the off switch is always sent explicitly rather than left
29
+ * to the provider's default. See `reasoningFields` in the client.
30
+ */
31
+ export function thinkLevels(_model) {
32
+ return [
33
+ { label: "Standard", description: "answer directly — fastest", thinking: false, effort: "high" },
34
+ { label: "Thinking", description: "think first, then answer", thinking: true, effort: "high" },
35
+ { label: "Deep", description: "more reasoning, more tool work", thinking: true, effort: "xhigh" },
36
+ { label: "Maximum", description: "maximum reasoning budget", thinking: true, effort: "max" },
37
+ ];
38
+ }
39
+ /**
40
+ * List prices (USD / 1M tokens), international endpoint.
41
+ *
42
+ * Two caveats worth knowing before trusting a figure here:
43
+ *
44
+ * - Several Qwen models are TIERED BY INPUT LENGTH: crossing 32K, 128K or 256K
45
+ * input tokens re-rates the WHOLE request, not just the excess. The shared
46
+ * `ModelPrice` shape holds one rate, so these are the base tier — an estimate
47
+ * that is right for short requests and low for long ones. Encoding the ladder
48
+ * would mean changing a shared type for one provider.
49
+ * - The Chinese Mainland endpoint is substantially cheaper than the international
50
+ * one these figures come from. This driver targets international, so these are
51
+ * the rates that apply to it.
52
+ */
53
+ const PRICES = {
54
+ [MAX_38]: { cacheHit: 0.25, cacheMiss: 2, output: 6 },
55
+ [MAX_37]: { cacheHit: 0.25, cacheMiss: 1.25, output: 3.75 },
56
+ [PLUS]: { cacheHit: 0.064, cacheMiss: 0.32, output: 1.28 },
57
+ [FLASH]: { cacheHit: 0.013, cacheMiss: 0.065, output: 0.26 },
58
+ };
59
+ /** Cache-aware list price for a model, falling back to the default model's. */
60
+ export function price(model) {
61
+ return PRICES[model] ?? PRICES[DEFAULT_MODEL];
62
+ }
63
+ /**
64
+ * The model's USABLE context window. Every model here STORES 1M tokens, but this
65
+ * is deliberately the sharp window rather than the storage cap: on BYOK every token
66
+ * in the window is the user's money on every turn, so anchoring compaction at 1M
67
+ * would mean carrying an enormous prompt long after it stopped earning its cost.
68
+ *
69
+ * The number is lower than the other drivers' 200K for a reason specific to this
70
+ * provider: input length RE-RATES the whole request at 32K, 128K and 256K, so
71
+ * letting a transcript drift past a threshold silently multiplies the cost of every
72
+ * later turn. 128K keeps ordinary sessions under the second threshold.
73
+ */
74
+ export function contextWindow(_model) {
75
+ return 128_000;
76
+ }
77
+ /**
78
+ * The ceiling this driver puts on a single BUFFERED (non-streaming) call. Core
79
+ * reserves exactly this much room below the window, so keeping it as one exported
80
+ * constant means the request and the reservation cannot drift apart.
81
+ */
82
+ export const BUFFERED_OUTPUT_TOKENS = 8_000;
83
+ export function bufferedOutputTokens(_model) {
84
+ return BUFFERED_OUTPUT_TOKENS;
85
+ }
86
+ /** The effort rungs used to size a thinking budget, weakest first. */
87
+ const EFFORTS = ["low", "medium", "high", "xhigh", "max"];
88
+ /**
89
+ * Vision is deliberately NOT declared, and that is the current fact rather than an
90
+ * omission. The Max and Plus tiers do accept images, but through the multimodal
91
+ * variants of these ids rather than the ids offered here, and Flash does not. A
92
+ * capability that holds for some of a list and not the rest cannot be reported as a
93
+ * flat yes — core would attach bytes that a Flash session silently cannot read.
94
+ * Add `acceptsImages` when this driver offers a model it is true for; nothing in
95
+ * core needs to move.
96
+ */
97
+ /**
98
+ * Coerce a stored or unknown config onto a model this provider actually serves.
99
+ *
100
+ * No per-model rule to enforce: the whole lineup shares one ladder and all of it
101
+ * can have thinking disabled. The result is snapped onto a rung `/think` actually
102
+ * lists, so a config carried in from another provider by `/model` cannot leave the
103
+ * user on a setting the menu has no tick beside.
104
+ */
105
+ export function normalize(config) {
106
+ const model = PRICES[config.model] ? config.model : DEFAULT_MODEL;
107
+ const thinking = config.thinking === true;
108
+ const effort = EFFORTS.includes(config.effort) ? config.effort : "high";
109
+ return { model, thinking, effort: snapToOfferedRung(model, thinking, effort) };
110
+ }
111
+ /**
112
+ * Move an effort onto the nearest rung this model's `/think` ladder offers. Ties
113
+ * break DOWNWARD: an unlisted setting resolves to the cheaper neighbour, because
114
+ * silently spending more of the user's money is the worse way to be wrong.
115
+ */
116
+ function snapToOfferedRung(model, thinking, effort) {
117
+ const offered = thinkLevels(model).filter((l) => l.thinking === thinking);
118
+ if (offered.length === 0)
119
+ return effort;
120
+ if (offered.some((l) => l.effort === effort))
121
+ return effort;
122
+ const want = EFFORTS.indexOf(effort);
123
+ let best = offered[0];
124
+ for (const level of offered) {
125
+ const d = Math.abs(EFFORTS.indexOf(level.effort) - want);
126
+ const bestD = Math.abs(EFFORTS.indexOf(best.effort) - want);
127
+ if (d < bestD || (d === bestD && EFFORTS.indexOf(level.effort) < EFFORTS.indexOf(best.effort))) {
128
+ best = level;
129
+ }
130
+ }
131
+ return best.effort;
132
+ }
133
+ /** The cheap metadata half of this driver — see `index.ts` for the wire half. */
134
+ export const qwenManifest = {
135
+ id: "qwen",
136
+ label: "Qwen",
137
+ apiKeyEnv: "DASHSCOPE_API_KEY",
138
+ keysUrl: "https://modelstudio.console.alibabacloud.com/?tab=playground#/api-key",
139
+ models: MODELS,
140
+ thinkLevels,
141
+ price,
142
+ contextWindow,
143
+ bufferedOutputTokens,
144
+ normalize,
145
+ };
146
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/drivers/qwen/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ import { deepseekManifest } from "./deepseek/manifest.js";
2
+ import { anthropicManifest } from "./anthropic/manifest.js";
3
+ import { openaiManifest } from "./openai/manifest.js";
4
+ import { qwenManifest } from "./qwen/manifest.js";
5
+ import { kimiManifest } from "./kimi/manifest.js";
6
+ import { glmManifest } from "./glm/manifest.js";
7
+ import { xaiManifest } from "./xai/manifest.js";
8
+ import { mistralManifest } from "./mistral/manifest.js";
9
+ import { groqManifest } from "./groq/manifest.js";
10
+ import { cerebrasManifest } from "./cerebras/manifest.js";
11
+ import { geminiManifest } from "./gemini/manifest.js";
12
+ import { metaManifest } from "./meta/manifest.js";
13
+ import { minimaxManifest } from "./minimax/manifest.js";
14
+ /** Every provider's cheap metadata, in display order. Always loaded. */
15
+ const MANIFESTS = [
16
+ deepseekManifest,
17
+ anthropicManifest,
18
+ openaiManifest,
19
+ qwenManifest,
20
+ kimiManifest,
21
+ glmManifest,
22
+ xaiManifest,
23
+ mistralManifest,
24
+ groqManifest,
25
+ cerebrasManifest,
26
+ geminiManifest,
27
+ metaManifest,
28
+ minimaxManifest,
29
+ ];
30
+ /** How to load each provider's wire code, on demand. Keyed by manifest id. */
31
+ const LOADERS = {
32
+ deepseek: async () => (await import("./deepseek/index.js")).deepseekDriver,
33
+ anthropic: async () => (await import("./anthropic/index.js")).anthropicDriver,
34
+ openai: async () => (await import("./openai/index.js")).openaiDriver,
35
+ qwen: async () => (await import("./qwen/index.js")).qwenDriver,
36
+ kimi: async () => (await import("./kimi/index.js")).kimiDriver,
37
+ glm: async () => (await import("./glm/index.js")).glmDriver,
38
+ xai: async () => (await import("./xai/index.js")).xaiDriver,
39
+ mistral: async () => (await import("./mistral/index.js")).mistralDriver,
40
+ groq: async () => (await import("./groq/index.js")).groqDriver,
41
+ cerebras: async () => (await import("./cerebras/index.js")).cerebrasDriver,
42
+ gemini: async () => (await import("./gemini/index.js")).geminiDriver,
43
+ meta: async () => (await import("./meta/index.js")).metaDriver,
44
+ minimax: async () => (await import("./minimax/index.js")).minimaxDriver,
45
+ };
46
+ /** The provider used when a model id doesn't match any other. */
47
+ const FALLBACK = MANIFESTS[0];
48
+ const loaded = new Map();
49
+ let active = null;
50
+ /**
51
+ * Live model lists for DISCOVERED providers, keyed by manifest id.
52
+ *
53
+ * The registry owns this cache rather than each driver, for one reason: a driver
54
+ * that memoized its own would go stale exactly when the user pulls a new model and
55
+ * reopens the picker to find it. Here there is one place to refresh and one place
56
+ * to reason about.
57
+ */
58
+ const discovered = new Map();
59
+ /**
60
+ * The models a provider currently offers — its discovered list when it has one,
61
+ * its declared list otherwise.
62
+ *
63
+ * Every caller must go through this rather than reading `manifest.models`, or a
64
+ * discovered provider reads as permanently empty. That is the single rule this
65
+ * whole mechanism depends on, and `registry.test.ts` pins it.
66
+ */
67
+ export function modelsOf(manifest) {
68
+ return discovered.get(manifest.id) ?? manifest.models;
69
+ }
70
+ /**
71
+ * The manifest that declares a given model id, or the fallback for an unknown id.
72
+ *
73
+ * Three steps, in order, and the order matters: a provider's real list wins, then a
74
+ * discovered provider's namespace claim, then the fallback. Checking claims last is
75
+ * what stops a provider that claims broadly from stealing a model another provider
76
+ * actually serves.
77
+ */
78
+ export function manifestForModel(model) {
79
+ return (MANIFESTS.find((m) => modelsOf(m).some((c) => c.id === model)) ??
80
+ MANIFESTS.find((m) => m.ownsModel?.(model) === true) ??
81
+ FALLBACK);
82
+ }
83
+ /** Every model offered across all installed providers. */
84
+ export function allModels() {
85
+ return MANIFESTS.flatMap((m) => modelsOf(m));
86
+ }
87
+ /**
88
+ * Refresh the model lists of every discovered provider.
89
+ *
90
+ * Called at session start and before a picker opens, so the list reflects what is
91
+ * actually available now. Providers are refreshed CONCURRENTLY and independently:
92
+ * one local runtime being down must not delay or empty another provider's list.
93
+ *
94
+ * A failure is deliberately silent here and non-destructive — the previous list
95
+ * survives. A provider that cannot be reached is reported where the user can act on
96
+ * it (no key, nothing running), not by a picker that quietly loses its contents.
97
+ * Returns the ids that refreshed successfully, so a caller can tell the difference.
98
+ */
99
+ export async function refreshModels() {
100
+ const dynamic = MANIFESTS.filter((m) => m.discoverModels);
101
+ const results = await Promise.all(dynamic.map(async (m) => {
102
+ try {
103
+ const models = await m.discoverModels();
104
+ // An empty result is a real answer — a runtime with nothing pulled — and is
105
+ // stored as such. Failure is the case that must not overwrite.
106
+ discovered.set(m.id, models);
107
+ return m.id;
108
+ }
109
+ catch {
110
+ return null;
111
+ }
112
+ }));
113
+ return results.filter((id) => id !== null);
114
+ }
115
+ /** Drop every discovered list. For tests, and for a full provider reset. */
116
+ export function clearDiscovered() {
117
+ discovered.clear();
118
+ }
119
+ /**
120
+ * Every installed provider, in display order — what `/provider` lists.
121
+ *
122
+ * Manifests only: this stays synchronous and loads nobody's wire code, so the
123
+ * picker can show every provider without paying to import the ones you don't use.
124
+ */
125
+ export function allProviders() {
126
+ return [...MANIFESTS];
127
+ }
128
+ /**
129
+ * Coerce a config onto something the owning provider actually serves. Pure and
130
+ * synchronous — it consults only manifests, so the pickers can normalize a
131
+ * selection without loading any provider's wire code.
132
+ */
133
+ export function normalizeConfig(config) {
134
+ return manifestForModel(config.model).normalize(config);
135
+ }
136
+ /**
137
+ * Load the driver that serves `model` and make it the session's active one.
138
+ * Idempotent and cached, so calling it before every turn costs nothing after the
139
+ * first. This is the only place a provider's wire code is ever loaded.
140
+ */
141
+ export async function ensureDriver(model) {
142
+ const id = manifestForModel(model).id;
143
+ let driver = loaded.get(id);
144
+ if (!driver) {
145
+ const load = LOADERS[id];
146
+ if (!load)
147
+ throw new Error(`No driver registered for provider '${id}'.`);
148
+ driver = await load();
149
+ loaded.set(id, driver);
150
+ }
151
+ active = driver;
152
+ return driver;
153
+ }
154
+ /**
155
+ * The driver currently serving this session. Callers reach this only from inside
156
+ * a turn, which `ensureDriver` has already opened — a throw here means someone
157
+ * tried to talk to a model before the session selected one.
158
+ */
159
+ export function activeDriver() {
160
+ if (!active) {
161
+ throw new Error("No model driver is loaded yet — the session must select a model first.");
162
+ }
163
+ return active;
164
+ }
165
+ /**
166
+ * Normalize streamed text for display: let the active driver repair anything its
167
+ * provider leaked into the text channel, then trim. The trim is deliberately here
168
+ * rather than in a driver — a reply that is only whitespace is an empty reply on
169
+ * every provider, and the display layer treats an empty string as "nothing to
170
+ * show". A driver with no repairs to make (or no driver yet) still gets the trim.
171
+ */
172
+ export function sanitizeStreamText(raw) {
173
+ const driver = active;
174
+ const repaired = driver?.sanitizeText ? driver.sanitizeText(raw) : raw;
175
+ return repaired.trim();
176
+ }
177
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/drivers/registry.ts"],"names":[],"mappings":"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"}