context-mode 1.0.169 → 2.0.0-next.6

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 (382) hide show
  1. package/.claude-plugin/marketplace.json +4 -22
  2. package/.claude-plugin/plugin.json +9 -24
  3. package/.codex-plugin/hooks.json +18 -33
  4. package/.codex-plugin/mcp.json +5 -4
  5. package/.codex-plugin/plugin.json +8 -27
  6. package/SHA256SUMS +37 -0
  7. package/claude-code/skills/ctx-doctor/SKILL.md +6 -0
  8. package/claude-code/skills/ctx-stats/SKILL.md +6 -0
  9. package/claude-code/skills/ctx-upgrade/SKILL.md +6 -0
  10. package/cli.mjs +6859 -0
  11. package/codex/skills/ctx-doctor/SKILL.md +6 -0
  12. package/codex/skills/ctx-stats/SKILL.md +6 -0
  13. package/codex/skills/ctx-upgrade/SKILL.md +6 -0
  14. package/copilot/plugin.json +14 -0
  15. package/fixtures/hook-roundtrip.json +22 -0
  16. package/gemini-extension.json +14 -0
  17. package/hook.mjs +202 -0
  18. package/hooks/claude-code.json +50 -0
  19. package/hooks/codex.json +50 -0
  20. package/hooks/copilot-cli.json +33 -0
  21. package/hooks/hooks.json +16 -111
  22. package/hooks/kiro.json +69 -0
  23. package/hooks/qwen.json +50 -0
  24. package/hooks/vscode.json +40 -0
  25. package/hooks/zcode.json +53 -0
  26. package/opencode/plugin.js +22491 -0
  27. package/package.json +32 -114
  28. package/pi/index.js +50876 -0
  29. package/pi/skills/ctx-doctor/SKILL.md +6 -0
  30. package/pi/skills/ctx-stats/SKILL.md +6 -0
  31. package/pi/skills/ctx-upgrade/SKILL.md +6 -0
  32. package/qwen-extension.json +15 -0
  33. package/run.mjs +5639 -0
  34. package/search.mjs +5639 -0
  35. package/server.mjs +48214 -0
  36. package/skills/ctx-doctor/SKILL.md +3 -19
  37. package/skills/ctx-stats/SKILL.md +3 -23
  38. package/skills/ctx-upgrade/SKILL.md +3 -28
  39. package/.openclaw-plugin/index.ts +0 -12
  40. package/.openclaw-plugin/openclaw.plugin.json +0 -38
  41. package/.openclaw-plugin/package.json +0 -28
  42. package/LICENSE +0 -94
  43. package/README.md +0 -1619
  44. package/bin/statusline.mjs +0 -378
  45. package/build/adapters/antigravity/index.d.ts +0 -51
  46. package/build/adapters/antigravity/index.js +0 -169
  47. package/build/adapters/antigravity-cli/index.d.ts +0 -51
  48. package/build/adapters/antigravity-cli/index.js +0 -342
  49. package/build/adapters/base.d.ts +0 -92
  50. package/build/adapters/base.js +0 -135
  51. package/build/adapters/claude-code/config.d.ts +0 -8
  52. package/build/adapters/claude-code/config.js +0 -8
  53. package/build/adapters/claude-code/hooks.d.ts +0 -106
  54. package/build/adapters/claude-code/hooks.js +0 -183
  55. package/build/adapters/claude-code/index.d.ts +0 -80
  56. package/build/adapters/claude-code/index.js +0 -569
  57. package/build/adapters/claude-code-base.d.ts +0 -49
  58. package/build/adapters/claude-code-base.js +0 -113
  59. package/build/adapters/client-map.d.ts +0 -10
  60. package/build/adapters/client-map.js +0 -42
  61. package/build/adapters/codex/config.d.ts +0 -8
  62. package/build/adapters/codex/config.js +0 -8
  63. package/build/adapters/codex/hooks.d.ts +0 -55
  64. package/build/adapters/codex/hooks.js +0 -64
  65. package/build/adapters/codex/index.d.ts +0 -87
  66. package/build/adapters/codex/index.js +0 -992
  67. package/build/adapters/codex/paths.d.ts +0 -1
  68. package/build/adapters/codex/paths.js +0 -12
  69. package/build/adapters/codex/usage.d.ts +0 -107
  70. package/build/adapters/codex/usage.js +0 -227
  71. package/build/adapters/copilot-base.d.ts +0 -94
  72. package/build/adapters/copilot-base.js +0 -297
  73. package/build/adapters/copilot-cli/hooks.d.ts +0 -33
  74. package/build/adapters/copilot-cli/hooks.js +0 -64
  75. package/build/adapters/copilot-cli/index.d.ts +0 -48
  76. package/build/adapters/copilot-cli/index.js +0 -341
  77. package/build/adapters/cursor/config.d.ts +0 -4
  78. package/build/adapters/cursor/config.js +0 -4
  79. package/build/adapters/cursor/hooks.d.ts +0 -55
  80. package/build/adapters/cursor/hooks.js +0 -82
  81. package/build/adapters/cursor/index.d.ts +0 -64
  82. package/build/adapters/cursor/index.js +0 -517
  83. package/build/adapters/detect.d.ts +0 -136
  84. package/build/adapters/detect.js +0 -623
  85. package/build/adapters/gemini-cli/config.d.ts +0 -8
  86. package/build/adapters/gemini-cli/config.js +0 -8
  87. package/build/adapters/gemini-cli/hooks.d.ts +0 -83
  88. package/build/adapters/gemini-cli/hooks.js +0 -115
  89. package/build/adapters/gemini-cli/index.d.ts +0 -80
  90. package/build/adapters/gemini-cli/index.js +0 -483
  91. package/build/adapters/jetbrains-copilot/config.d.ts +0 -8
  92. package/build/adapters/jetbrains-copilot/config.js +0 -8
  93. package/build/adapters/jetbrains-copilot/hooks.d.ts +0 -59
  94. package/build/adapters/jetbrains-copilot/hooks.js +0 -87
  95. package/build/adapters/jetbrains-copilot/index.d.ts +0 -31
  96. package/build/adapters/jetbrains-copilot/index.js +0 -131
  97. package/build/adapters/kimi/config.d.ts +0 -8
  98. package/build/adapters/kimi/config.js +0 -8
  99. package/build/adapters/kimi/hooks.d.ts +0 -28
  100. package/build/adapters/kimi/hooks.js +0 -34
  101. package/build/adapters/kimi/index.d.ts +0 -66
  102. package/build/adapters/kimi/index.js +0 -537
  103. package/build/adapters/kimi/paths.d.ts +0 -21
  104. package/build/adapters/kimi/paths.js +0 -52
  105. package/build/adapters/kimi/usage.d.ts +0 -82
  106. package/build/adapters/kimi/usage.js +0 -217
  107. package/build/adapters/kiro/hooks.d.ts +0 -61
  108. package/build/adapters/kiro/hooks.js +0 -94
  109. package/build/adapters/kiro/index.d.ts +0 -61
  110. package/build/adapters/kiro/index.js +0 -301
  111. package/build/adapters/omp/index.d.ts +0 -65
  112. package/build/adapters/omp/index.js +0 -182
  113. package/build/adapters/omp/plugin.d.ts +0 -81
  114. package/build/adapters/omp/plugin.js +0 -331
  115. package/build/adapters/omp/usage.d.ts +0 -49
  116. package/build/adapters/omp/usage.js +0 -110
  117. package/build/adapters/openclaw/config.d.ts +0 -8
  118. package/build/adapters/openclaw/config.js +0 -8
  119. package/build/adapters/openclaw/hooks.d.ts +0 -50
  120. package/build/adapters/openclaw/hooks.js +0 -61
  121. package/build/adapters/openclaw/index.d.ts +0 -74
  122. package/build/adapters/openclaw/index.js +0 -439
  123. package/build/adapters/openclaw/mcp-tools.d.ts +0 -54
  124. package/build/adapters/openclaw/mcp-tools.js +0 -207
  125. package/build/adapters/openclaw/plugin.d.ts +0 -141
  126. package/build/adapters/openclaw/plugin.js +0 -818
  127. package/build/adapters/openclaw/session-db.d.ts +0 -55
  128. package/build/adapters/openclaw/session-db.js +0 -88
  129. package/build/adapters/openclaw/usage.d.ts +0 -34
  130. package/build/adapters/openclaw/usage.js +0 -52
  131. package/build/adapters/openclaw/workspace-router.d.ts +0 -29
  132. package/build/adapters/openclaw/workspace-router.js +0 -64
  133. package/build/adapters/opencode/config.d.ts +0 -8
  134. package/build/adapters/opencode/config.js +0 -8
  135. package/build/adapters/opencode/hooks.d.ts +0 -38
  136. package/build/adapters/opencode/hooks.js +0 -50
  137. package/build/adapters/opencode/index.d.ts +0 -67
  138. package/build/adapters/opencode/index.js +0 -463
  139. package/build/adapters/opencode/plugin.d.ts +0 -184
  140. package/build/adapters/opencode/plugin.js +0 -558
  141. package/build/adapters/opencode/zod3tov4.d.ts +0 -1
  142. package/build/adapters/opencode/zod3tov4.js +0 -132
  143. package/build/adapters/pi/extension.d.ts +0 -81
  144. package/build/adapters/pi/extension.js +0 -861
  145. package/build/adapters/pi/index.d.ts +0 -57
  146. package/build/adapters/pi/index.js +0 -173
  147. package/build/adapters/pi/mcp-bridge.d.ts +0 -268
  148. package/build/adapters/pi/mcp-bridge.js +0 -894
  149. package/build/adapters/qwen-code/hooks.d.ts +0 -26
  150. package/build/adapters/qwen-code/hooks.js +0 -29
  151. package/build/adapters/qwen-code/index.d.ts +0 -40
  152. package/build/adapters/qwen-code/index.js +0 -361
  153. package/build/adapters/qwen-code/usage.d.ts +0 -90
  154. package/build/adapters/qwen-code/usage.js +0 -222
  155. package/build/adapters/types.d.ts +0 -360
  156. package/build/adapters/types.js +0 -118
  157. package/build/adapters/vscode-copilot/config.d.ts +0 -8
  158. package/build/adapters/vscode-copilot/config.js +0 -8
  159. package/build/adapters/vscode-copilot/hooks.d.ts +0 -71
  160. package/build/adapters/vscode-copilot/hooks.js +0 -98
  161. package/build/adapters/vscode-copilot/index.d.ts +0 -32
  162. package/build/adapters/vscode-copilot/index.js +0 -222
  163. package/build/adapters/zed/index.d.ts +0 -40
  164. package/build/adapters/zed/index.js +0 -163
  165. package/build/cli.d.ts +0 -34
  166. package/build/cli.js +0 -1827
  167. package/build/db-base.d.ts +0 -179
  168. package/build/db-base.js +0 -569
  169. package/build/executor.d.ts +0 -72
  170. package/build/executor.js +0 -678
  171. package/build/exit-classify.d.ts +0 -19
  172. package/build/exit-classify.js +0 -12
  173. package/build/fetch-cache.d.ts +0 -13
  174. package/build/fetch-cache.js +0 -15
  175. package/build/lifecycle.d.ts +0 -124
  176. package/build/lifecycle.js +0 -278
  177. package/build/runPool.d.ts +0 -36
  178. package/build/runPool.js +0 -51
  179. package/build/runtime.d.ts +0 -71
  180. package/build/runtime.js +0 -659
  181. package/build/search/auto-memory.d.ts +0 -47
  182. package/build/search/auto-memory.js +0 -170
  183. package/build/search/ctx-search-schema.d.ts +0 -90
  184. package/build/search/ctx-search-schema.js +0 -135
  185. package/build/search/flood-guard.d.ts +0 -57
  186. package/build/search/flood-guard.js +0 -80
  187. package/build/search/unified.d.ts +0 -56
  188. package/build/search/unified.js +0 -104
  189. package/build/security.d.ts +0 -206
  190. package/build/security.js +0 -780
  191. package/build/server.d.ts +0 -184
  192. package/build/server.js +0 -4563
  193. package/build/session/analytics.d.ts +0 -773
  194. package/build/session/analytics.js +0 -2420
  195. package/build/session/db.d.ts +0 -468
  196. package/build/session/db.js +0 -1308
  197. package/build/session/error-classifier.d.ts +0 -87
  198. package/build/session/error-classifier.js +0 -303
  199. package/build/session/event-emit.d.ts +0 -48
  200. package/build/session/event-emit.js +0 -101
  201. package/build/session/extract.d.ts +0 -333
  202. package/build/session/extract.js +0 -2688
  203. package/build/session/model-prices.json +0 -429
  204. package/build/session/persist-tool-calls.d.ts +0 -54
  205. package/build/session/persist-tool-calls.js +0 -105
  206. package/build/session/pricing.d.ts +0 -64
  207. package/build/session/pricing.js +0 -151
  208. package/build/session/project-attribution.d.ts +0 -73
  209. package/build/session/project-attribution.js +0 -245
  210. package/build/session/purge.d.ts +0 -138
  211. package/build/session/purge.js +0 -240
  212. package/build/session/retrieval-marker.d.ts +0 -39
  213. package/build/session/retrieval-marker.js +0 -65
  214. package/build/session/snapshot.d.ts +0 -46
  215. package/build/session/snapshot.js +0 -532
  216. package/build/store-directory.d.ts +0 -56
  217. package/build/store-directory.js +0 -254
  218. package/build/store.d.ts +0 -147
  219. package/build/store.js +0 -1714
  220. package/build/truncate.d.ts +0 -57
  221. package/build/truncate.js +0 -142
  222. package/build/types.d.ts +0 -117
  223. package/build/types.js +0 -20
  224. package/build/util/claude-config.d.ts +0 -32
  225. package/build/util/claude-config.js +0 -84
  226. package/build/util/hook-config.d.ts +0 -27
  227. package/build/util/hook-config.js +0 -76
  228. package/build/util/jsonc.d.ts +0 -14
  229. package/build/util/jsonc.js +0 -104
  230. package/build/util/plugin-cache-integrity.d.ts +0 -51
  231. package/build/util/plugin-cache-integrity.js +0 -146
  232. package/build/util/project-dir.d.ts +0 -149
  233. package/build/util/project-dir.js +0 -340
  234. package/build/util/sibling-mcp.d.ts +0 -79
  235. package/build/util/sibling-mcp.js +0 -181
  236. package/cli.bundle.mjs +0 -1236
  237. package/configs/antigravity/GEMINI.md +0 -68
  238. package/configs/antigravity/mcp_config.json +0 -7
  239. package/configs/antigravity-cli/hooks/hooks.json +0 -37
  240. package/configs/antigravity-cli/hooks.json +0 -37
  241. package/configs/antigravity-cli/mcp_config.json +0 -10
  242. package/configs/antigravity-cli/plugin.json +0 -14
  243. package/configs/antigravity-cli/rules/context-mode.md +0 -77
  244. package/configs/antigravity-cli/skills/context-mode/SKILL.md +0 -77
  245. package/configs/claude-code/CLAUDE.md +0 -91
  246. package/configs/codex/AGENTS.md +0 -99
  247. package/configs/codex/config.toml +0 -8
  248. package/configs/codex/hooks.json +0 -47
  249. package/configs/copilot-cli/.github/plugin/plugin.json +0 -23
  250. package/configs/copilot-cli/.mcp.json +0 -12
  251. package/configs/copilot-cli/README.md +0 -47
  252. package/configs/copilot-cli/hooks.json +0 -41
  253. package/configs/copilot-cli/skills/context-mode/SKILL.md +0 -38
  254. package/configs/cursor/context-mode.mdc +0 -76
  255. package/configs/cursor/hooks.json +0 -21
  256. package/configs/cursor/mcp.json +0 -7
  257. package/configs/gemini-cli/GEMINI.md +0 -88
  258. package/configs/gemini-cli/mcp.json +0 -7
  259. package/configs/gemini-cli/settings.json +0 -60
  260. package/configs/jetbrains-copilot/copilot-instructions.md +0 -80
  261. package/configs/jetbrains-copilot/hooks.json +0 -16
  262. package/configs/jetbrains-copilot/mcp.json +0 -7
  263. package/configs/kilo/AGENTS.md +0 -84
  264. package/configs/kilo/kilo.json +0 -6
  265. package/configs/kimi/hooks.json +0 -54
  266. package/configs/kiro/KIRO.md +0 -84
  267. package/configs/kiro/agent.json +0 -18
  268. package/configs/kiro/mcp.json +0 -7
  269. package/configs/omp/SYSTEM.md +0 -85
  270. package/configs/omp/mcp.json +0 -7
  271. package/configs/openclaw/AGENTS.md +0 -87
  272. package/configs/openclaw/openclaw.json +0 -13
  273. package/configs/opencode/AGENTS.md +0 -84
  274. package/configs/opencode/opencode.json +0 -6
  275. package/configs/pi/AGENTS.md +0 -3
  276. package/configs/qwen-code/QWEN.md +0 -91
  277. package/configs/vscode-copilot/copilot-instructions.md +0 -80
  278. package/configs/vscode-copilot/hooks.json +0 -16
  279. package/configs/vscode-copilot/mcp.json +0 -7
  280. package/configs/zed/AGENTS.md +0 -68
  281. package/hooks/antigravity-cli/payload.mjs +0 -98
  282. package/hooks/antigravity-cli/posttooluse.mjs +0 -138
  283. package/hooks/antigravity-cli/pretooluse.mjs +0 -78
  284. package/hooks/antigravity-cli/stop.mjs +0 -58
  285. package/hooks/auto-injection.mjs +0 -102
  286. package/hooks/cache-heal-utils.mjs +0 -379
  287. package/hooks/codex/platform.mjs +0 -1
  288. package/hooks/codex/posttooluse.mjs +0 -66
  289. package/hooks/codex/precompact.mjs +0 -70
  290. package/hooks/codex/pretooluse.mjs +0 -42
  291. package/hooks/codex/sessionstart.mjs +0 -121
  292. package/hooks/codex/stop.mjs +0 -138
  293. package/hooks/codex/userpromptsubmit.mjs +0 -75
  294. package/hooks/copilot-cli/posttooluse.mjs +0 -79
  295. package/hooks/copilot-cli/precompact.mjs +0 -66
  296. package/hooks/copilot-cli/pretooluse.mjs +0 -41
  297. package/hooks/copilot-cli/sessionstart.mjs +0 -121
  298. package/hooks/copilot-cli/stop.mjs +0 -59
  299. package/hooks/copilot-cli/userpromptsubmit.mjs +0 -77
  300. package/hooks/core/codex-caps.mjs +0 -112
  301. package/hooks/core/formatters.mjs +0 -356
  302. package/hooks/core/mcp-ready.mjs +0 -109
  303. package/hooks/core/platform-detect.mjs +0 -49
  304. package/hooks/core/routing.mjs +0 -1017
  305. package/hooks/core/stdin.mjs +0 -90
  306. package/hooks/core/tool-naming.mjs +0 -57
  307. package/hooks/cursor/afteragentresponse.mjs +0 -74
  308. package/hooks/cursor/hooks.json +0 -31
  309. package/hooks/cursor/posttooluse.mjs +0 -72
  310. package/hooks/cursor/pretooluse.mjs +0 -26
  311. package/hooks/cursor/sessionstart.mjs +0 -97
  312. package/hooks/cursor/stop.mjs +0 -48
  313. package/hooks/ensure-deps.mjs +0 -254
  314. package/hooks/formatters/claude-code.mjs +0 -113
  315. package/hooks/formatters/cursor.mjs +0 -37
  316. package/hooks/formatters/gemini-cli.mjs +0 -55
  317. package/hooks/formatters/vscode-copilot.mjs +0 -55
  318. package/hooks/gemini-cli/aftermodel.mjs +0 -70
  319. package/hooks/gemini-cli/aftertool.mjs +0 -61
  320. package/hooks/gemini-cli/beforeagent.mjs +0 -99
  321. package/hooks/gemini-cli/beforetool.mjs +0 -27
  322. package/hooks/gemini-cli/precompress.mjs +0 -55
  323. package/hooks/gemini-cli/sessionstart.mjs +0 -137
  324. package/hooks/heal-partial-install.mjs +0 -712
  325. package/hooks/jetbrains-copilot/posttooluse.mjs +0 -61
  326. package/hooks/jetbrains-copilot/precompact.mjs +0 -55
  327. package/hooks/jetbrains-copilot/pretooluse.mjs +0 -27
  328. package/hooks/jetbrains-copilot/sessionstart.mjs +0 -124
  329. package/hooks/kimi/platform.mjs +0 -1
  330. package/hooks/kimi/posttooluse.mjs +0 -72
  331. package/hooks/kimi/precompact.mjs +0 -80
  332. package/hooks/kimi/pretooluse.mjs +0 -42
  333. package/hooks/kimi/sessionend.mjs +0 -61
  334. package/hooks/kimi/sessionstart.mjs +0 -113
  335. package/hooks/kimi/stop.mjs +0 -132
  336. package/hooks/kimi/userpromptsubmit.mjs +0 -90
  337. package/hooks/kiro/agentspawn.mjs +0 -97
  338. package/hooks/kiro/posttooluse.mjs +0 -51
  339. package/hooks/kiro/pretooluse.mjs +0 -64
  340. package/hooks/kiro/userpromptsubmit.mjs +0 -88
  341. package/hooks/normalize-hooks.mjs +0 -323
  342. package/hooks/platform-bridge.mjs +0 -340
  343. package/hooks/posttooluse.mjs +0 -225
  344. package/hooks/precompact.mjs +0 -100
  345. package/hooks/pretooluse.mjs +0 -227
  346. package/hooks/qwen-code/platform.mjs +0 -1
  347. package/hooks/qwen-code/stop.mjs +0 -168
  348. package/hooks/routing-block.mjs +0 -105
  349. package/hooks/run-hook.mjs +0 -95
  350. package/hooks/security.bundle.mjs +0 -2
  351. package/hooks/session-attribution.bundle.mjs +0 -1
  352. package/hooks/session-db.bundle.mjs +0 -144
  353. package/hooks/session-directive.mjs +0 -520
  354. package/hooks/session-extract.bundle.mjs +0 -3
  355. package/hooks/session-helpers.mjs +0 -428
  356. package/hooks/session-loaders.mjs +0 -448
  357. package/hooks/session-snapshot.bundle.mjs +0 -32
  358. package/hooks/sessionstart.mjs +0 -464
  359. package/hooks/stop.mjs +0 -82
  360. package/hooks/suppress-stderr.mjs +0 -25
  361. package/hooks/userpromptsubmit.mjs +0 -108
  362. package/hooks/vscode-copilot/posttooluse.mjs +0 -61
  363. package/hooks/vscode-copilot/precompact.mjs +0 -55
  364. package/hooks/vscode-copilot/pretooluse.mjs +0 -27
  365. package/hooks/vscode-copilot/sessionstart.mjs +0 -129
  366. package/openclaw.plugin.json +0 -38
  367. package/scripts/heal-better-sqlite3.mjs +0 -430
  368. package/scripts/heal-installed-plugins.mjs +0 -598
  369. package/scripts/plugin-cache-integrity.mjs +0 -248
  370. package/scripts/postinstall.mjs +0 -384
  371. package/server.bundle.mjs +0 -1162
  372. package/skills/.ignore +0 -7
  373. package/skills/context-mode/SKILL.md +0 -300
  374. package/skills/context-mode/references/anti-patterns.md +0 -283
  375. package/skills/context-mode/references/patterns-javascript.md +0 -298
  376. package/skills/context-mode/references/patterns-python.md +0 -304
  377. package/skills/context-mode/references/patterns-shell.md +0 -277
  378. package/skills/ctx-index/SKILL.md +0 -46
  379. package/skills/ctx-insight/SKILL.md +0 -24
  380. package/skills/ctx-purge/SKILL.md +0 -49
  381. package/skills/ctx-search/SKILL.md +0 -35
  382. package/start.mjs +0 -616
@@ -1,429 +0,0 @@
1
- {
2
- "claude-opus-4-8": {
3
- "input_per_mtok": 5,
4
- "output_per_mtok": 25,
5
- "cache_read_per_mtok": 0.5,
6
- "cache_write_per_mtok": 6.25,
7
- "source": "https://platform.claude.com/docs/en/about-claude/pricing"
8
- },
9
- "claude-opus-4-7": {
10
- "input_per_mtok": 5,
11
- "output_per_mtok": 25,
12
- "cache_read_per_mtok": 0.5,
13
- "cache_write_per_mtok": 6.25,
14
- "source": "https://platform.claude.com/docs/en/about-claude/pricing"
15
- },
16
- "claude-opus-4-6": {
17
- "input_per_mtok": 5,
18
- "output_per_mtok": 25,
19
- "cache_read_per_mtok": 0.5,
20
- "cache_write_per_mtok": 6.25,
21
- "source": "https://platform.claude.com/docs/en/about-claude/pricing"
22
- },
23
- "claude-opus-4-5": {
24
- "input_per_mtok": 5,
25
- "output_per_mtok": 25,
26
- "cache_read_per_mtok": 0.5,
27
- "cache_write_per_mtok": 6.25,
28
- "source": "https://platform.claude.com/docs/en/about-claude/pricing"
29
- },
30
- "claude-sonnet-4-6": {
31
- "input_per_mtok": 3,
32
- "output_per_mtok": 15,
33
- "cache_read_per_mtok": 0.3,
34
- "cache_write_per_mtok": 3.75,
35
- "source": "https://platform.claude.com/docs/en/about-claude/pricing"
36
- },
37
- "claude-sonnet-4-5": {
38
- "input_per_mtok": 3,
39
- "output_per_mtok": 15,
40
- "cache_read_per_mtok": 0.3,
41
- "cache_write_per_mtok": 3.75,
42
- "source": "https://platform.claude.com/docs/en/about-claude/pricing"
43
- },
44
- "claude-haiku-4-5": {
45
- "input_per_mtok": 1,
46
- "output_per_mtok": 5,
47
- "cache_read_per_mtok": 0.1,
48
- "cache_write_per_mtok": 1.25,
49
- "source": "https://platform.claude.com/docs/en/about-claude/pricing"
50
- },
51
- "claude-3-7-sonnet": {
52
- "input_per_mtok": 3,
53
- "output_per_mtok": 15,
54
- "cache_read_per_mtok": 0.3,
55
- "cache_write_per_mtok": 3.75,
56
- "source": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json"
57
- },
58
- "claude-3-5-haiku": {
59
- "input_per_mtok": 0.8,
60
- "output_per_mtok": 4,
61
- "cache_read_per_mtok": 0.08,
62
- "cache_write_per_mtok": 1,
63
- "source": "https://platform.claude.com/docs/en/about-claude/pricing"
64
- },
65
- "claude-fable-5": {
66
- "input_per_mtok": 10,
67
- "output_per_mtok": 50,
68
- "cache_read_per_mtok": 1,
69
- "cache_write_per_mtok": 12.5,
70
- "source": "https://platform.claude.com/docs/en/about-claude/pricing"
71
- },
72
- "gpt-5": {
73
- "input_per_mtok": 1.25,
74
- "output_per_mtok": 10,
75
- "cache_read_per_mtok": 0.125,
76
- "cache_write_per_mtok": null,
77
- "source": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json"
78
- },
79
- "gpt-5-mini": {
80
- "input_per_mtok": 0.25,
81
- "output_per_mtok": 2,
82
- "cache_read_per_mtok": 0.025,
83
- "cache_write_per_mtok": null,
84
- "source": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json"
85
- },
86
- "gpt-5-nano": {
87
- "input_per_mtok": 0.05,
88
- "output_per_mtok": 0.4,
89
- "cache_read_per_mtok": 0.005,
90
- "cache_write_per_mtok": null,
91
- "source": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json"
92
- },
93
- "gpt-5-codex": {
94
- "input_per_mtok": 1.25,
95
- "output_per_mtok": 10,
96
- "cache_read_per_mtok": 0.125,
97
- "cache_write_per_mtok": null,
98
- "source": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json"
99
- },
100
- "gpt-4.1": {
101
- "input_per_mtok": 2,
102
- "output_per_mtok": 8,
103
- "cache_read_per_mtok": 0.5,
104
- "cache_write_per_mtok": null,
105
- "source": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json"
106
- },
107
- "gpt-4.1-mini": {
108
- "input_per_mtok": 0.4,
109
- "output_per_mtok": 1.6,
110
- "cache_read_per_mtok": 0.1,
111
- "cache_write_per_mtok": null,
112
- "source": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json"
113
- },
114
- "gpt-4.1-nano": {
115
- "input_per_mtok": 0.1,
116
- "output_per_mtok": 0.4,
117
- "cache_read_per_mtok": 0.025,
118
- "cache_write_per_mtok": null,
119
- "source": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json"
120
- },
121
- "gpt-4o": {
122
- "input_per_mtok": 2.5,
123
- "output_per_mtok": 10,
124
- "cache_read_per_mtok": 1.25,
125
- "cache_write_per_mtok": null,
126
- "source": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json"
127
- },
128
- "gpt-4o-mini": {
129
- "input_per_mtok": 0.15,
130
- "output_per_mtok": 0.6,
131
- "cache_read_per_mtok": 0.075,
132
- "cache_write_per_mtok": null,
133
- "source": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json"
134
- },
135
- "o3": {
136
- "input_per_mtok": 2,
137
- "output_per_mtok": 8,
138
- "cache_read_per_mtok": 0.5,
139
- "cache_write_per_mtok": null,
140
- "source": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json"
141
- },
142
- "o4-mini": {
143
- "input_per_mtok": 1.1,
144
- "output_per_mtok": 4.4,
145
- "cache_read_per_mtok": 0.275,
146
- "cache_write_per_mtok": null,
147
- "source": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json"
148
- },
149
- "o3-mini": {
150
- "input_per_mtok": 1.1,
151
- "output_per_mtok": 4.4,
152
- "cache_read_per_mtok": 0.55,
153
- "cache_write_per_mtok": null,
154
- "source": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json"
155
- },
156
- "codex-mini-latest": {
157
- "input_per_mtok": 1.5,
158
- "output_per_mtok": 6,
159
- "cache_read_per_mtok": 0.375,
160
- "cache_write_per_mtok": null,
161
- "source": "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json"
162
- },
163
- "gemini-2.5-pro": {
164
- "input_per_mtok": 1.25,
165
- "output_per_mtok": 10,
166
- "cache_read_per_mtok": 0.125,
167
- "cache_write_per_mtok": null,
168
- "source": "https://ai.google.dev/gemini-api/docs/pricing"
169
- },
170
- "gemini-2.5-flash": {
171
- "input_per_mtok": 0.3,
172
- "output_per_mtok": 2.5,
173
- "cache_read_per_mtok": 0.03,
174
- "cache_write_per_mtok": null,
175
- "source": "https://ai.google.dev/gemini-api/docs/pricing"
176
- },
177
- "gemini-2.5-flash-lite": {
178
- "input_per_mtok": 0.1,
179
- "output_per_mtok": 0.4,
180
- "cache_read_per_mtok": 0.01,
181
- "cache_write_per_mtok": null,
182
- "source": "https://ai.google.dev/gemini-api/docs/pricing"
183
- },
184
- "gemini-2.0-flash": {
185
- "input_per_mtok": 0.1,
186
- "output_per_mtok": 0.4,
187
- "cache_read_per_mtok": 0.025,
188
- "cache_write_per_mtok": null,
189
- "source": "https://ai.google.dev/gemini-api/docs/pricing"
190
- },
191
- "gemini-2.0-flash-lite": {
192
- "input_per_mtok": 0.075,
193
- "output_per_mtok": 0.3,
194
- "cache_read_per_mtok": null,
195
- "cache_write_per_mtok": null,
196
- "source": "https://ai.google.dev/gemini-api/docs/pricing"
197
- },
198
- "gemini-3-pro-preview": {
199
- "input_per_mtok": 2,
200
- "output_per_mtok": 12,
201
- "cache_read_per_mtok": 0.2,
202
- "cache_write_per_mtok": null,
203
- "source": "https://ai.google.dev/gemini-api/docs/pricing"
204
- },
205
- "gemini-3-flash-preview": {
206
- "input_per_mtok": 0.5,
207
- "output_per_mtok": 3,
208
- "cache_read_per_mtok": 0.05,
209
- "cache_write_per_mtok": null,
210
- "source": "https://ai.google.dev/gemini-api/docs/pricing"
211
- },
212
- "qwen3-coder": {
213
- "input_per_mtok": 1,
214
- "output_per_mtok": 5,
215
- "cache_read_per_mtok": null,
216
- "cache_write_per_mtok": null,
217
- "source": "https://www.alibabacloud.com/help/en/model-studio/models"
218
- },
219
- "qwen-max": {
220
- "input_per_mtok": 1.6,
221
- "output_per_mtok": 6.4,
222
- "cache_read_per_mtok": null,
223
- "cache_write_per_mtok": null,
224
- "source": "https://www.alibabacloud.com/help/en/model-studio/models"
225
- },
226
- "qwen-plus": {
227
- "input_per_mtok": 0.4,
228
- "output_per_mtok": 1.2,
229
- "cache_read_per_mtok": null,
230
- "cache_write_per_mtok": null,
231
- "source": "https://www.alibabacloud.com/help/en/model-studio/models"
232
- },
233
- "qwen-turbo": {
234
- "input_per_mtok": 0.05,
235
- "output_per_mtok": 0.2,
236
- "cache_read_per_mtok": null,
237
- "cache_write_per_mtok": null,
238
- "source": "https://www.alibabacloud.com/help/en/model-studio/models"
239
- },
240
- "qwen3-max": {
241
- "input_per_mtok": 1.2,
242
- "output_per_mtok": 6,
243
- "cache_read_per_mtok": null,
244
- "cache_write_per_mtok": null,
245
- "source": "https://www.alibabacloud.com/help/en/model-studio/models"
246
- },
247
- "kimi-k2": {
248
- "input_per_mtok": 0.6,
249
- "output_per_mtok": 2.5,
250
- "cache_read_per_mtok": 0.15,
251
- "cache_write_per_mtok": null,
252
- "source": "https://platform.moonshot.ai/docs/pricing/chat"
253
- },
254
- "kimi-k2-turbo": {
255
- "input_per_mtok": 1.15,
256
- "output_per_mtok": 8,
257
- "cache_read_per_mtok": 0.15,
258
- "cache_write_per_mtok": null,
259
- "source": "https://platform.moonshot.ai/docs/pricing/chat"
260
- },
261
- "moonshot-v1-8k": {
262
- "input_per_mtok": 0.2,
263
- "output_per_mtok": 2,
264
- "cache_read_per_mtok": null,
265
- "cache_write_per_mtok": null,
266
- "source": "https://platform.moonshot.ai/docs/pricing"
267
- },
268
- "moonshot-v1-32k": {
269
- "input_per_mtok": 1,
270
- "output_per_mtok": 3,
271
- "cache_read_per_mtok": null,
272
- "cache_write_per_mtok": null,
273
- "source": "https://platform.moonshot.ai/docs/pricing"
274
- },
275
- "moonshot-v1-128k": {
276
- "input_per_mtok": 2,
277
- "output_per_mtok": 5,
278
- "cache_read_per_mtok": null,
279
- "cache_write_per_mtok": null,
280
- "source": "https://platform.moonshot.ai/docs/pricing"
281
- },
282
- "deepseek-v3": {
283
- "input_per_mtok": 0.27,
284
- "output_per_mtok": 1.1,
285
- "cache_read_per_mtok": 0.07,
286
- "cache_write_per_mtok": 0,
287
- "source": "https://api-docs.deepseek.com/quick_start/pricing"
288
- },
289
- "deepseek-r1": {
290
- "input_per_mtok": 0.55,
291
- "output_per_mtok": 2.19,
292
- "cache_read_per_mtok": null,
293
- "cache_write_per_mtok": null,
294
- "source": "https://api-docs.deepseek.com/quick_start/pricing"
295
- },
296
- "deepseek-chat": {
297
- "input_per_mtok": 0.14,
298
- "output_per_mtok": 0.28,
299
- "cache_read_per_mtok": 0.0028,
300
- "cache_write_per_mtok": null,
301
- "source": "https://api-docs.deepseek.com/quick_start/pricing"
302
- },
303
- "deepseek-reasoner": {
304
- "input_per_mtok": 0.14,
305
- "output_per_mtok": 0.28,
306
- "cache_read_per_mtok": 0.0028,
307
- "cache_write_per_mtok": null,
308
- "source": "https://api-docs.deepseek.com/quick_start/pricing"
309
- },
310
- "glm-4.6": {
311
- "input_per_mtok": 0.6,
312
- "output_per_mtok": 2.2,
313
- "cache_read_per_mtok": 0.11,
314
- "cache_write_per_mtok": null,
315
- "source": "https://docs.z.ai/guides/overview/pricing"
316
- },
317
- "glm-4-air": {
318
- "input_per_mtok": 0.2,
319
- "output_per_mtok": 1.1,
320
- "cache_read_per_mtok": 0.03,
321
- "cache_write_per_mtok": null,
322
- "source": "https://docs.z.ai/guides/overview/pricing"
323
- },
324
- "grok-4": {
325
- "input_per_mtok": 3,
326
- "output_per_mtok": 15,
327
- "cache_read_per_mtok": null,
328
- "cache_write_per_mtok": null,
329
- "source": "https://docs.x.ai/docs/pricing"
330
- },
331
- "grok-3": {
332
- "input_per_mtok": 3,
333
- "output_per_mtok": 15,
334
- "cache_read_per_mtok": 0.75,
335
- "cache_write_per_mtok": null,
336
- "source": "https://docs.x.ai/docs/pricing"
337
- },
338
- "grok-code-fast-1": {
339
- "input_per_mtok": 0.2,
340
- "output_per_mtok": 1.5,
341
- "cache_read_per_mtok": 0.02,
342
- "cache_write_per_mtok": null,
343
- "source": "https://docs.x.ai/docs/pricing"
344
- },
345
- "grok-2": {
346
- "input_per_mtok": 2,
347
- "output_per_mtok": 10,
348
- "cache_read_per_mtok": null,
349
- "cache_write_per_mtok": null,
350
- "source": "https://docs.x.ai/docs/pricing"
351
- },
352
- "mistral-large-latest": {
353
- "input_per_mtok": 0.5,
354
- "output_per_mtok": 1.5,
355
- "cache_read_per_mtok": null,
356
- "cache_write_per_mtok": null,
357
- "source": "https://mistral.ai/pricing"
358
- },
359
- "codestral-latest": {
360
- "input_per_mtok": 0.3,
361
- "output_per_mtok": 0.9,
362
- "cache_read_per_mtok": null,
363
- "cache_write_per_mtok": null,
364
- "source": "https://mistral.ai/pricing"
365
- },
366
- "devstral": {
367
- "input_per_mtok": 0.4,
368
- "output_per_mtok": 2,
369
- "cache_read_per_mtok": null,
370
- "cache_write_per_mtok": null,
371
- "source": "https://mistral.ai/pricing"
372
- },
373
- "mistral-medium": {
374
- "input_per_mtok": 0.4,
375
- "output_per_mtok": 2,
376
- "cache_read_per_mtok": null,
377
- "cache_write_per_mtok": null,
378
- "source": "https://mistral.ai/pricing"
379
- },
380
- "llama-4-maverick": {
381
- "input_per_mtok": 0.27,
382
- "output_per_mtok": 0.85,
383
- "cache_read_per_mtok": null,
384
- "cache_write_per_mtok": null,
385
- "source": "https://www.together.ai/pricing"
386
- },
387
- "llama-4-scout": {
388
- "input_per_mtok": 0.08,
389
- "output_per_mtok": 0.3,
390
- "cache_read_per_mtok": null,
391
- "cache_write_per_mtok": null,
392
- "source": "https://www.together.ai/pricing"
393
- },
394
- "llama-3.3-70b": {
395
- "input_per_mtok": 0.88,
396
- "output_per_mtok": 0.88,
397
- "cache_read_per_mtok": null,
398
- "cache_write_per_mtok": null,
399
- "source": "https://www.together.ai/pricing"
400
- },
401
- "command-a": {
402
- "input_per_mtok": 2.5,
403
- "output_per_mtok": 10,
404
- "cache_read_per_mtok": null,
405
- "cache_write_per_mtok": null,
406
- "source": "https://cohere.com/pricing"
407
- },
408
- "command-r-plus": {
409
- "input_per_mtok": 2.5,
410
- "output_per_mtok": 10,
411
- "cache_read_per_mtok": null,
412
- "cache_write_per_mtok": null,
413
- "source": "https://cohere.com/pricing"
414
- },
415
- "amazon-nova-pro": {
416
- "input_per_mtok": 0.8,
417
- "output_per_mtok": 3.2,
418
- "cache_read_per_mtok": null,
419
- "cache_write_per_mtok": null,
420
- "source": "https://aws.amazon.com/bedrock/pricing/"
421
- },
422
- "amazon-nova-lite": {
423
- "input_per_mtok": 0.06,
424
- "output_per_mtok": 0.24,
425
- "cache_read_per_mtok": null,
426
- "cache_write_per_mtok": null,
427
- "source": "https://aws.amazon.com/bedrock/pricing/"
428
- }
429
- }
@@ -1,54 +0,0 @@
1
- /**
2
- * persist-tool-calls — runtime glue between MCP server's in-memory
3
- * `sessionStats` and the on-disk `tool_calls` SessionDB table.
4
- *
5
- * Why this module exists
6
- * ──────────────────────
7
- * Commit 4742160 (May 2 16:58) added the SessionDB write path so the
8
- * statusline counters survived `npm update -g context-mode` and
9
- * `claude --continue`. Commit b392c2f (May 2 21:43) — the concurrency
10
- * refactor — silently dropped that wiring as collateral. Same-session
11
- * `/ctx-upgrade` flips the statusline back to `0 calls / $0.00`
12
- * because the new PID starts with an empty `sessionStats` and never
13
- * looks at the table the old PID was writing to.
14
- *
15
- * This module re-introduces the write path AND adds the read-side
16
- * restore that 4742160 never shipped — both pure helpers so the
17
- * server.ts wiring is a one-liner and the unit tests don't need to
18
- * boot the MCP server.
19
- */
20
- /**
21
- * Shape returned by {@link restoreSessionStats}. Subset of the in-memory
22
- * `sessionStats` object the MCP server keeps — only the fields that can
23
- * be recovered from SessionDB.
24
- */
25
- export interface RestoredSessionStats {
26
- /** Per-tool call counts. */
27
- calls: Record<string, number>;
28
- /** Per-tool returned bytes. */
29
- bytesReturned: Record<string, number>;
30
- /**
31
- * Epoch-ms for `session_meta.started_at` of the latest session, so the
32
- * statusline `uptime_ms` reflects the original session start instead of
33
- * resetting to `Date.now()` on every PID change.
34
- */
35
- sessionStart: number;
36
- }
37
- /**
38
- * Increment the persistent tool-call counter for `toolName` under whatever
39
- * session_id `session_meta` currently treats as the most recent. This is
40
- * called from {@link trackResponse} on every tool response and must be
41
- * cheap, non-throwing, and best-effort — a stats failure must never break
42
- * the MCP tool call.
43
- */
44
- export declare function persistToolCallCounter(sessionDbPath: string, toolName: string, bytes: number): void;
45
- /**
46
- * Read the latest session's tool-call totals back out of SessionDB so the
47
- * MCP server can hydrate its in-memory `sessionStats` on startup. Returns
48
- * `null` when the DB is missing or empty so the caller can keep the
49
- * default zero-state without branching twice.
50
- *
51
- * Used during MCP server boot (BEFORE the heartbeat fires) so the
52
- * statusline doesn't briefly flash `0 calls / $0.00` after upgrade.
53
- */
54
- export declare function restoreSessionStats(sessionDbPath: string): RestoredSessionStats | null;
@@ -1,105 +0,0 @@
1
- /**
2
- * persist-tool-calls — runtime glue between MCP server's in-memory
3
- * `sessionStats` and the on-disk `tool_calls` SessionDB table.
4
- *
5
- * Why this module exists
6
- * ──────────────────────
7
- * Commit 4742160 (May 2 16:58) added the SessionDB write path so the
8
- * statusline counters survived `npm update -g context-mode` and
9
- * `claude --continue`. Commit b392c2f (May 2 21:43) — the concurrency
10
- * refactor — silently dropped that wiring as collateral. Same-session
11
- * `/ctx-upgrade` flips the statusline back to `0 calls / $0.00`
12
- * because the new PID starts with an empty `sessionStats` and never
13
- * looks at the table the old PID was writing to.
14
- *
15
- * This module re-introduces the write path AND adds the read-side
16
- * restore that 4742160 never shipped — both pure helpers so the
17
- * server.ts wiring is a one-liner and the unit tests don't need to
18
- * boot the MCP server.
19
- */
20
- import { existsSync } from "node:fs";
21
- import { SessionDB } from "./db.js";
22
- /**
23
- * Increment the persistent tool-call counter for `toolName` under whatever
24
- * session_id `session_meta` currently treats as the most recent. This is
25
- * called from {@link trackResponse} on every tool response and must be
26
- * cheap, non-throwing, and best-effort — a stats failure must never break
27
- * the MCP tool call.
28
- */
29
- export function persistToolCallCounter(sessionDbPath, toolName, bytes) {
30
- try {
31
- if (!existsSync(sessionDbPath))
32
- return;
33
- const sdb = new SessionDB({ dbPath: sessionDbPath });
34
- try {
35
- const sid = sdb.getLatestSessionId();
36
- if (!sid)
37
- return;
38
- sdb.incrementToolCall(sid, toolName, bytes);
39
- }
40
- finally {
41
- sdb.close();
42
- }
43
- }
44
- catch {
45
- // Best-effort: counter must never throw and break the parent tool call.
46
- }
47
- }
48
- /**
49
- * Read the latest session's tool-call totals back out of SessionDB so the
50
- * MCP server can hydrate its in-memory `sessionStats` on startup. Returns
51
- * `null` when the DB is missing or empty so the caller can keep the
52
- * default zero-state without branching twice.
53
- *
54
- * Used during MCP server boot (BEFORE the heartbeat fires) so the
55
- * statusline doesn't briefly flash `0 calls / $0.00` after upgrade.
56
- */
57
- export function restoreSessionStats(sessionDbPath) {
58
- try {
59
- if (!existsSync(sessionDbPath))
60
- return null;
61
- const sdb = new SessionDB({ dbPath: sessionDbPath });
62
- try {
63
- const sid = sdb.getLatestSessionId();
64
- if (!sid)
65
- return null;
66
- const stats = sdb.getToolCallStats(sid);
67
- const calls = {};
68
- const bytesReturned = {};
69
- for (const [tool, row] of Object.entries(stats.byTool)) {
70
- calls[tool] = row.calls;
71
- bytesReturned[tool] = row.bytesReturned;
72
- }
73
- // started_at is "YYYY-MM-DD HH:MM:SS" in UTC (SQLite datetime() default);
74
- // append "Z" so Date.parse interprets it as UTC, matching how the
75
- // session was actually persisted.
76
- let sessionStart = Date.now();
77
- try {
78
- const meta = sdb.getSessionStats(sid);
79
- if (meta?.started_at) {
80
- const parsed = Date.parse(`${meta.started_at}Z`);
81
- if (Number.isFinite(parsed) && parsed > 0)
82
- sessionStart = parsed;
83
- }
84
- }
85
- catch {
86
- // best-effort — keep `Date.now()` fallback
87
- }
88
- // Skip empty restores so callers can `if (restored)` and not stomp
89
- // their already-zero default with another zero.
90
- if (Object.keys(calls).length === 0 &&
91
- Object.keys(bytesReturned).length === 0) {
92
- // Still useful to return sessionStart so uptime_ms doesn't reset
93
- // even when no tool calls were made — but only if we found a session.
94
- return { calls, bytesReturned, sessionStart };
95
- }
96
- return { calls, bytesReturned, sessionStart };
97
- }
98
- finally {
99
- sdb.close();
100
- }
101
- }
102
- catch {
103
- return null;
104
- }
105
- }
@@ -1,64 +0,0 @@
1
- /**
2
- * Pricing catalog — single source of truth for per-model USD cost.
3
- *
4
- * Deep module, tiny interface. At load it reads one curated multi-vendor JSON
5
- * (src/session/model-prices.json) into a Map<modelId, Price> in per-Mtok units,
6
- * then exposes three pure-ish functions:
7
- *
8
- * lookupPrice(modelId) → Price | null
9
- * computeCostUsd(modelId, tokens) → number | null
10
- * nativeOrComputed(id, t, native) → number | null
11
- *
12
- * WHY THIS EXISTS — the bug it kills:
13
- * The old table in src/session/extract.ts hardcoded ~5 Claude rows plus a
14
- * `default` row, and any unmatched id (every OpenAI / Gemini / Qwen / DeepSeek
15
- * / Grok model) silently inherited Claude-Sonnet pricing. Non-Claude turns were
16
- * therefore mispriced. Here each model is priced from ITS OWN curated row, and
17
- * an unknown id resolves to `null` (no price) instead of a wrong Claude rate.
18
- *
19
- * The large litellm catalog (~1.5MB, ~2900 models) is NOT bundled — it lives at
20
- * tools/pricing/litellm-catalog.json as the dev-only refresh base for this
21
- * curated JSON.
22
- *
23
- * The curated JSON is small (~13KB, 61 models) and esbuild inlines it into the
24
- * hook/server bundles at build time (no runtime fs read, no external file).
25
- */
26
- /** Per-Mtok price for one model. Any of the four rates may be null ("unknown"). */
27
- export interface Price {
28
- input_per_mtok: number | null;
29
- output_per_mtok: number | null;
30
- cache_read_per_mtok: number | null;
31
- cache_write_per_mtok: number | null;
32
- }
33
- /** Token counts for one turn. All fields optional; absent ⇒ treated as 0. */
34
- export interface TokenCounts {
35
- input_tokens?: number;
36
- output_tokens?: number;
37
- cache_read_tokens?: number;
38
- cache_creation_tokens?: number;
39
- }
40
- /**
41
- * Resolve a model id to its curated Price, or null on miss.
42
- * Strategy: exact, then normalized (trim+lowercase), then provider-stripped
43
- * normalized. Misses return null so the caller can decide (warn / fall back).
44
- */
45
- export declare function lookupPrice(modelId: string): Price | null;
46
- /**
47
- * Σ tokens × per-Mtok price / 1e6 over the four buckets. Returns null when no
48
- * price is found OR every token count is zero/absent (so dashboards never show
49
- * a misleading "$0.00 for nothing" row). On a price miss, warns exactly once
50
- * with the unmatched id so the curated catalog can be extended.
51
- *
52
- * Bucket → price mapping:
53
- * input_tokens → input_per_mtok
54
- * output_tokens → output_per_mtok (null ⇒ input rate)
55
- * cache_read_tokens → cache_read_per_mtok (null ⇒ input rate)
56
- * cache_creation_tokens → cache_write_per_mtok (null ⇒ input rate)
57
- */
58
- export declare function computeCostUsd(modelId: string, t: TokenCounts): number | null;
59
- /**
60
- * Prefer a provider-supplied native cost when present, else compute from the
61
- * catalog. A native cost of exactly 0 is a real value (free tier) and passes
62
- * through — only null/undefined defers to computeCostUsd.
63
- */
64
- export declare function nativeOrComputed(modelId: string, t: TokenCounts, nativeCostUsd?: number | null): number | null;