@ashx-j/lunr 0.2.26 → 0.2.28

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 (697) hide show
  1. package/CHANGELOG.md +25 -1
  2. package/LICENSE +22 -0
  3. package/dist/builtin-extensions/ashxj-thinking.d.ts +1 -1
  4. package/dist/builtin-extensions/ashxj-thinking.d.ts.map +1 -1
  5. package/dist/builtin-extensions/ashxj-thinking.js +1 -1
  6. package/dist/builtin-extensions/ashxj-thinking.js.map +1 -1
  7. package/dist/builtin-extensions/ashxj-tui.d.ts +11 -1
  8. package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
  9. package/dist/builtin-extensions/ashxj-tui.js +6 -10
  10. package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
  11. package/dist/builtin-extensions/lunr-cron.d.ts +4 -5
  12. package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
  13. package/dist/builtin-extensions/lunr-cron.js +94 -108
  14. package/dist/builtin-extensions/lunr-cron.js.map +1 -1
  15. package/dist/builtin-extensions/lunr-local-providers/local-servers.d.ts.map +1 -1
  16. package/dist/builtin-extensions/lunr-local-providers/local-servers.js +3 -1
  17. package/dist/builtin-extensions/lunr-local-providers/local-servers.js.map +1 -1
  18. package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.d.ts.map +1 -1
  19. package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.js +5 -2
  20. package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.js.map +1 -1
  21. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.d.ts.map +1 -1
  22. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js +2 -2
  23. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js.map +1 -1
  24. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts.map +1 -1
  25. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js +1 -1
  26. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js.map +1 -1
  27. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts.map +1 -1
  28. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js +1 -1
  29. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js.map +1 -1
  30. package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
  31. package/dist/builtin-extensions/pi-intercom/index.js +2 -2
  32. package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
  33. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts +1 -1
  34. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts.map +1 -1
  35. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js +1 -1
  36. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js.map +1 -1
  37. package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
  38. package/dist/builtin-extensions/pi-lsp-extension/src/index.js +1 -15
  39. package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
  40. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts +6 -0
  41. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts.map +1 -1
  42. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js +187 -132
  43. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js.map +1 -1
  44. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts +8 -0
  45. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts.map +1 -1
  46. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js +142 -112
  47. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js.map +1 -1
  48. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts +12 -1
  49. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts.map +1 -1
  50. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js +14 -7
  51. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js.map +1 -1
  52. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts +11 -3
  53. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts.map +1 -1
  54. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js +67 -41
  55. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js.map +1 -1
  56. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts +4 -2
  57. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts.map +1 -1
  58. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js +3 -0
  59. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js.map +1 -1
  60. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts +2 -1
  61. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts.map +1 -1
  62. package/dist/builtin-extensions/pi-mcp-adapter/commands.js +6 -6
  63. package/dist/builtin-extensions/pi-mcp-adapter/commands.js.map +1 -1
  64. package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts +1 -1
  65. package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts.map +1 -1
  66. package/dist/builtin-extensions/pi-mcp-adapter/config.js +11 -5
  67. package/dist/builtin-extensions/pi-mcp-adapter/config.js.map +1 -1
  68. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.d.ts.map +1 -1
  69. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js +2 -2
  70. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js.map +1 -1
  71. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.d.ts.map +1 -1
  72. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js +1 -1
  73. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js.map +1 -1
  74. package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
  75. package/dist/builtin-extensions/pi-mcp-adapter/index.js +48 -40
  76. package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
  77. package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts.map +1 -1
  78. package/dist/builtin-extensions/pi-mcp-adapter/init.js +3 -1
  79. package/dist/builtin-extensions/pi-mcp-adapter/init.js.map +1 -1
  80. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts +12 -40
  81. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts.map +1 -1
  82. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js +166 -235
  83. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js.map +1 -1
  84. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts +5 -0
  85. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts.map +1 -1
  86. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js +43 -13
  87. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js.map +1 -1
  88. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts +14 -3
  89. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts.map +1 -1
  90. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js +73 -21
  91. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js.map +1 -1
  92. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.d.ts.map +1 -1
  93. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js +4 -4
  94. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js.map +1 -1
  95. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts.map +1 -1
  96. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js +2 -2
  97. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js.map +1 -1
  98. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts +2 -0
  99. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts.map +1 -1
  100. package/dist/builtin-extensions/pi-mcp-adapter/state.js.map +1 -1
  101. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts +1 -1
  102. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts.map +1 -1
  103. package/dist/builtin-extensions/pi-ollama-cloud/index.js +1 -1
  104. package/dist/builtin-extensions/pi-ollama-cloud/index.js.map +1 -1
  105. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts +11 -5
  106. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts.map +1 -1
  107. package/dist/builtin-extensions/pi-ollama-cloud/models.js +12 -32
  108. package/dist/builtin-extensions/pi-ollama-cloud/models.js.map +1 -1
  109. package/dist/builtin-extensions/pi-prompt-template-model/index.d.ts.map +1 -1
  110. package/dist/builtin-extensions/pi-prompt-template-model/index.js +5 -3
  111. package/dist/builtin-extensions/pi-prompt-template-model/index.js.map +1 -1
  112. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts +2 -1
  113. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts.map +1 -1
  114. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js +21 -12
  115. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js.map +1 -1
  116. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts.map +1 -1
  117. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js +7 -24
  118. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js.map +1 -1
  119. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  120. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +39 -77
  121. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  122. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.d.ts +4 -1
  123. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.d.ts.map +1 -1
  124. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js +2 -0
  125. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js.map +1 -1
  126. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +6 -1
  127. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
  128. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +17 -31
  129. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
  130. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
  131. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js +7 -2
  132. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js.map +1 -1
  133. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts +5 -1
  134. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  135. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +78 -42
  136. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  137. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
  138. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +8 -1
  139. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
  140. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts +0 -3
  141. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  142. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +134 -28
  143. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  144. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  145. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +26 -5
  146. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  147. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +1 -1
  148. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
  149. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +1 -1
  150. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
  151. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +7 -8
  152. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  153. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js +60 -32
  154. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  155. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.d.ts +7 -1
  156. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.d.ts.map +1 -1
  157. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.js +70 -38
  158. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.js.map +1 -1
  159. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +9 -0
  160. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
  161. package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
  162. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts +1 -1
  163. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts.map +1 -1
  164. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js +15 -5
  165. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js.map +1 -1
  166. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
  167. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +4 -3
  168. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
  169. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
  170. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +13 -62
  171. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
  172. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +1 -1
  173. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  174. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +18 -9
  175. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  176. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts.map +1 -1
  177. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js +3 -3
  178. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js.map +1 -1
  179. package/dist/builtin-extensions/pi-tps.d.ts.map +1 -1
  180. package/dist/builtin-extensions/pi-tps.js +28 -17
  181. package/dist/builtin-extensions/pi-tps.js.map +1 -1
  182. package/dist/builtin-extensions/pi-web-access/activity.d.ts +1 -0
  183. package/dist/builtin-extensions/pi-web-access/activity.d.ts.map +1 -1
  184. package/dist/builtin-extensions/pi-web-access/activity.js +27 -5
  185. package/dist/builtin-extensions/pi-web-access/activity.js.map +1 -1
  186. package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts +3 -0
  187. package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts.map +1 -0
  188. package/dist/builtin-extensions/pi-web-access/bounded-body.js +43 -0
  189. package/dist/builtin-extensions/pi-web-access/bounded-body.js.map +1 -0
  190. package/dist/builtin-extensions/pi-web-access/content-page.d.ts +24 -0
  191. package/dist/builtin-extensions/pi-web-access/content-page.d.ts.map +1 -0
  192. package/dist/builtin-extensions/pi-web-access/content-page.js +57 -0
  193. package/dist/builtin-extensions/pi-web-access/content-page.js.map +1 -0
  194. package/dist/builtin-extensions/pi-web-access/extract.d.ts.map +1 -1
  195. package/dist/builtin-extensions/pi-web-access/extract.js +7 -2
  196. package/dist/builtin-extensions/pi-web-access/extract.js.map +1 -1
  197. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts +0 -1
  198. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts.map +1 -1
  199. package/dist/builtin-extensions/pi-web-access/github-extract.js +147 -36
  200. package/dist/builtin-extensions/pi-web-access/github-extract.js.map +1 -1
  201. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  202. package/dist/builtin-extensions/pi-web-access/index.js +48 -73
  203. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  204. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts +12 -4
  205. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts.map +1 -1
  206. package/dist/builtin-extensions/pi-web-access/session-cleanup.js +35 -12
  207. package/dist/builtin-extensions/pi-web-access/session-cleanup.js.map +1 -1
  208. package/dist/builtin-extensions/pi-web-access/storage.d.ts +9 -6
  209. package/dist/builtin-extensions/pi-web-access/storage.d.ts.map +1 -1
  210. package/dist/builtin-extensions/pi-web-access/storage.js +36 -24
  211. package/dist/builtin-extensions/pi-web-access/storage.js.map +1 -1
  212. package/dist/builtin-extensions/simple-pi-memory.d.ts +1 -1
  213. package/dist/builtin-extensions/simple-pi-memory.d.ts.map +1 -1
  214. package/dist/builtin-extensions/simple-pi-memory.js +1 -1
  215. package/dist/builtin-extensions/simple-pi-memory.js.map +1 -1
  216. package/dist/catalog/models.json +1 -1
  217. package/dist/catalog/providers/google-vertex.json +1 -1
  218. package/dist/catalog/providers/google.json +1 -1
  219. package/dist/catalog/publication.json +3 -3
  220. package/dist/cli/install-cli.d.ts.map +1 -1
  221. package/dist/cli/install-cli.js +38 -30
  222. package/dist/cli/install-cli.js.map +1 -1
  223. package/dist/core/agent-session-runtime.d.ts +13 -0
  224. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  225. package/dist/core/agent-session-runtime.js +75 -11
  226. package/dist/core/agent-session-runtime.js.map +1 -1
  227. package/dist/core/agent-session-services.d.ts +1 -0
  228. package/dist/core/agent-session-services.d.ts.map +1 -1
  229. package/dist/core/agent-session-services.js +1 -0
  230. package/dist/core/agent-session-services.js.map +1 -1
  231. package/dist/core/agent-session.d.ts +46 -21
  232. package/dist/core/agent-session.d.ts.map +1 -1
  233. package/dist/core/agent-session.js +344 -126
  234. package/dist/core/agent-session.js.map +1 -1
  235. package/dist/core/browser/runtime.d.ts +2 -0
  236. package/dist/core/browser/runtime.d.ts.map +1 -1
  237. package/dist/core/browser/runtime.js +80 -45
  238. package/dist/core/browser/runtime.js.map +1 -1
  239. package/dist/core/browser/setup.d.ts.map +1 -1
  240. package/dist/core/browser/setup.js +12 -1
  241. package/dist/core/browser/setup.js.map +1 -1
  242. package/dist/core/cache-stats.d.ts +1 -1
  243. package/dist/core/cache-stats.d.ts.map +1 -1
  244. package/dist/core/cache-stats.js +1 -1
  245. package/dist/core/cache-stats.js.map +1 -1
  246. package/dist/core/compaction/branch-summarization.d.ts +2 -1
  247. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  248. package/dist/core/compaction/branch-summarization.js +1 -0
  249. package/dist/core/compaction/branch-summarization.js.map +1 -1
  250. package/dist/core/compaction/compaction.d.ts +5 -11
  251. package/dist/core/compaction/compaction.d.ts.map +1 -1
  252. package/dist/core/compaction/compaction.js +38 -92
  253. package/dist/core/compaction/compaction.js.map +1 -1
  254. package/dist/core/computer-use/adapter.d.ts.map +1 -1
  255. package/dist/core/computer-use/adapter.js +7 -2
  256. package/dist/core/computer-use/adapter.js.map +1 -1
  257. package/dist/core/computer-use/image.d.ts.map +1 -1
  258. package/dist/core/computer-use/image.js +17 -5
  259. package/dist/core/computer-use/image.js.map +1 -1
  260. package/dist/core/computer-use/schemas.d.ts.map +1 -1
  261. package/dist/core/computer-use/schemas.js +23 -6
  262. package/dist/core/computer-use/schemas.js.map +1 -1
  263. package/dist/core/computer-use/workflow.d.ts.map +1 -1
  264. package/dist/core/computer-use/workflow.js +459 -119
  265. package/dist/core/computer-use/workflow.js.map +1 -1
  266. package/dist/core/context-breakdown.d.ts +2 -2
  267. package/dist/core/context-breakdown.d.ts.map +1 -1
  268. package/dist/core/context-breakdown.js +22 -20
  269. package/dist/core/context-breakdown.js.map +1 -1
  270. package/dist/core/cron/jobs.d.ts +26 -8
  271. package/dist/core/cron/jobs.d.ts.map +1 -1
  272. package/dist/core/cron/jobs.js +357 -232
  273. package/dist/core/cron/jobs.js.map +1 -1
  274. package/dist/core/cron/origin-context.d.ts +1 -0
  275. package/dist/core/cron/origin-context.d.ts.map +1 -1
  276. package/dist/core/cron/origin-context.js.map +1 -1
  277. package/dist/core/cron/scheduler.d.ts +22 -17
  278. package/dist/core/cron/scheduler.d.ts.map +1 -1
  279. package/dist/core/cron/scheduler.js +153 -73
  280. package/dist/core/cron/scheduler.js.map +1 -1
  281. package/dist/core/extensions/index.d.ts +1 -1
  282. package/dist/core/extensions/index.d.ts.map +1 -1
  283. package/dist/core/extensions/index.js.map +1 -1
  284. package/dist/core/extensions/runner.d.ts +1 -0
  285. package/dist/core/extensions/runner.d.ts.map +1 -1
  286. package/dist/core/extensions/runner.js +8 -0
  287. package/dist/core/extensions/runner.js.map +1 -1
  288. package/dist/core/extensions/types.d.ts +11 -1
  289. package/dist/core/extensions/types.d.ts.map +1 -1
  290. package/dist/core/extensions/types.js.map +1 -1
  291. package/dist/core/footer-data-provider.d.ts +4 -0
  292. package/dist/core/footer-data-provider.d.ts.map +1 -1
  293. package/dist/core/footer-data-provider.js +22 -1
  294. package/dist/core/footer-data-provider.js.map +1 -1
  295. package/dist/core/large-subagent-launch.d.ts +1 -1
  296. package/dist/core/large-subagent-launch.d.ts.map +1 -1
  297. package/dist/core/large-subagent-launch.js +7 -7
  298. package/dist/core/large-subagent-launch.js.map +1 -1
  299. package/dist/core/model-registry.d.ts +2 -0
  300. package/dist/core/model-registry.d.ts.map +1 -1
  301. package/dist/core/model-registry.js +5 -0
  302. package/dist/core/model-registry.js.map +1 -1
  303. package/dist/core/model-runtime.d.ts +4 -1
  304. package/dist/core/model-runtime.d.ts.map +1 -1
  305. package/dist/core/model-runtime.js +40 -4
  306. package/dist/core/model-runtime.js.map +1 -1
  307. package/dist/core/package-manager.d.ts.map +1 -1
  308. package/dist/core/package-manager.js.map +1 -1
  309. package/dist/core/permissions.d.ts +3 -3
  310. package/dist/core/permissions.d.ts.map +1 -1
  311. package/dist/core/permissions.js +11 -35
  312. package/dist/core/permissions.js.map +1 -1
  313. package/dist/core/plan-mode.d.ts +5 -13
  314. package/dist/core/plan-mode.d.ts.map +1 -1
  315. package/dist/core/plan-mode.js +126 -116
  316. package/dist/core/plan-mode.js.map +1 -1
  317. package/dist/core/project-trust.d.ts.map +1 -1
  318. package/dist/core/project-trust.js +1 -1
  319. package/dist/core/project-trust.js.map +1 -1
  320. package/dist/core/prompt-resource-bridge.d.ts +12 -0
  321. package/dist/core/prompt-resource-bridge.d.ts.map +1 -0
  322. package/dist/core/prompt-resource-bridge.js +9 -0
  323. package/dist/core/prompt-resource-bridge.js.map +1 -0
  324. package/dist/core/protected-targets.d.ts +6 -0
  325. package/dist/core/protected-targets.d.ts.map +1 -0
  326. package/dist/core/protected-targets.js +45 -0
  327. package/dist/core/protected-targets.js.map +1 -0
  328. package/dist/core/resource-loader.d.ts.map +1 -1
  329. package/dist/core/resource-loader.js +7 -0
  330. package/dist/core/resource-loader.js.map +1 -1
  331. package/dist/core/rollback.d.ts +19 -3
  332. package/dist/core/rollback.d.ts.map +1 -1
  333. package/dist/core/rollback.js +172 -56
  334. package/dist/core/rollback.js.map +1 -1
  335. package/dist/core/runtime-credentials.d.ts +3 -0
  336. package/dist/core/runtime-credentials.d.ts.map +1 -1
  337. package/dist/core/runtime-credentials.js +14 -1
  338. package/dist/core/runtime-credentials.js.map +1 -1
  339. package/dist/core/sdk.d.ts +3 -0
  340. package/dist/core/sdk.d.ts.map +1 -1
  341. package/dist/core/sdk.js +1 -0
  342. package/dist/core/sdk.js.map +1 -1
  343. package/dist/core/session-manager.d.ts +11 -1
  344. package/dist/core/session-manager.d.ts.map +1 -1
  345. package/dist/core/session-manager.js +111 -33
  346. package/dist/core/session-manager.js.map +1 -1
  347. package/dist/core/session-ownership.d.ts.map +1 -1
  348. package/dist/core/session-ownership.js +8 -3
  349. package/dist/core/session-ownership.js.map +1 -1
  350. package/dist/core/session-retention.d.ts.map +1 -1
  351. package/dist/core/session-retention.js +18 -7
  352. package/dist/core/session-retention.js.map +1 -1
  353. package/dist/core/session-startup-settings.d.ts +10 -0
  354. package/dist/core/session-startup-settings.d.ts.map +1 -0
  355. package/dist/core/session-startup-settings.js +70 -0
  356. package/dist/core/session-startup-settings.js.map +1 -0
  357. package/dist/core/subscriptions.d.ts +16 -7
  358. package/dist/core/subscriptions.d.ts.map +1 -1
  359. package/dist/core/subscriptions.js +96 -55
  360. package/dist/core/subscriptions.js.map +1 -1
  361. package/dist/core/trust-manager.d.ts +2 -1
  362. package/dist/core/trust-manager.d.ts.map +1 -1
  363. package/dist/core/trust-manager.js +6 -1
  364. package/dist/core/trust-manager.js.map +1 -1
  365. package/dist/core/update-check.d.ts.map +1 -1
  366. package/dist/core/update-check.js.map +1 -1
  367. package/dist/core/usage-accounting.d.ts +47 -0
  368. package/dist/core/usage-accounting.d.ts.map +1 -0
  369. package/dist/core/usage-accounting.js +205 -0
  370. package/dist/core/usage-accounting.js.map +1 -0
  371. package/dist/core/usage-adapters/kimi-coding.d.ts +2 -2
  372. package/dist/core/usage-adapters/kimi-coding.d.ts.map +1 -1
  373. package/dist/core/usage-adapters/kimi-coding.js +2 -2
  374. package/dist/core/usage-adapters/kimi-coding.js.map +1 -1
  375. package/dist/core/usage-adapters/openai-codex.d.ts +3 -2
  376. package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
  377. package/dist/core/usage-adapters/openai-codex.js +3 -3
  378. package/dist/core/usage-adapters/openai-codex.js.map +1 -1
  379. package/dist/core/usage-adapters/xai.d.ts +2 -2
  380. package/dist/core/usage-adapters/xai.d.ts.map +1 -1
  381. package/dist/core/usage-adapters/xai.js +3 -3
  382. package/dist/core/usage-adapters/xai.js.map +1 -1
  383. package/dist/core/usage-adapters/zai.d.ts +2 -2
  384. package/dist/core/usage-adapters/zai.d.ts.map +1 -1
  385. package/dist/core/usage-adapters/zai.js +2 -2
  386. package/dist/core/usage-adapters/zai.js.map +1 -1
  387. package/dist/core/usage-history.d.ts +1 -18
  388. package/dist/core/usage-history.d.ts.map +1 -1
  389. package/dist/core/usage-history.js +46 -114
  390. package/dist/core/usage-history.js.map +1 -1
  391. package/dist/core/usage-service.d.ts +9 -2
  392. package/dist/core/usage-service.d.ts.map +1 -1
  393. package/dist/core/usage-service.js +95 -50
  394. package/dist/core/usage-service.js.map +1 -1
  395. package/dist/gateway/agent-bridge.d.ts +9 -1
  396. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  397. package/dist/gateway/agent-bridge.js +91 -37
  398. package/dist/gateway/agent-bridge.js.map +1 -1
  399. package/dist/gateway/buttons.d.ts +8 -1
  400. package/dist/gateway/buttons.d.ts.map +1 -1
  401. package/dist/gateway/buttons.js +76 -18
  402. package/dist/gateway/buttons.js.map +1 -1
  403. package/dist/gateway/commands.d.ts +1 -0
  404. package/dist/gateway/commands.d.ts.map +1 -1
  405. package/dist/gateway/commands.js +10 -4
  406. package/dist/gateway/commands.js.map +1 -1
  407. package/dist/gateway/cron.d.ts +12 -11
  408. package/dist/gateway/cron.d.ts.map +1 -1
  409. package/dist/gateway/cron.js +65 -56
  410. package/dist/gateway/cron.js.map +1 -1
  411. package/dist/gateway/index.d.ts.map +1 -1
  412. package/dist/gateway/index.js +2 -1
  413. package/dist/gateway/index.js.map +1 -1
  414. package/dist/gateway/mobile-commands.d.ts +1 -0
  415. package/dist/gateway/mobile-commands.d.ts.map +1 -1
  416. package/dist/gateway/mobile-commands.js +69 -15
  417. package/dist/gateway/mobile-commands.js.map +1 -1
  418. package/dist/gateway/presenter.d.ts +12 -2
  419. package/dist/gateway/presenter.d.ts.map +1 -1
  420. package/dist/gateway/presenter.js +73 -38
  421. package/dist/gateway/presenter.js.map +1 -1
  422. package/dist/gateway/router.d.ts +2 -2
  423. package/dist/gateway/router.d.ts.map +1 -1
  424. package/dist/gateway/router.js +17 -2
  425. package/dist/gateway/router.js.map +1 -1
  426. package/dist/gateway/service.d.ts +2 -0
  427. package/dist/gateway/service.d.ts.map +1 -1
  428. package/dist/gateway/service.js +153 -0
  429. package/dist/gateway/service.js.map +1 -1
  430. package/dist/main.d.ts.map +1 -1
  431. package/dist/main.js +86 -33
  432. package/dist/main.js.map +1 -1
  433. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  434. package/dist/modes/interactive/components/assistant-message.js +6 -4
  435. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  436. package/dist/modes/interactive/components/context-view.d.ts.map +1 -1
  437. package/dist/modes/interactive/components/context-view.js +2 -2
  438. package/dist/modes/interactive/components/context-view.js.map +1 -1
  439. package/dist/modes/interactive/components/copyable-text.d.ts.map +1 -1
  440. package/dist/modes/interactive/components/copyable-text.js +3 -2
  441. package/dist/modes/interactive/components/copyable-text.js.map +1 -1
  442. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  443. package/dist/modes/interactive/components/extension-editor.js +1 -1
  444. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  445. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  446. package/dist/modes/interactive/components/footer.js +8 -12
  447. package/dist/modes/interactive/components/footer.js.map +1 -1
  448. package/dist/modes/interactive/components/usage-view.d.ts +5 -0
  449. package/dist/modes/interactive/components/usage-view.d.ts.map +1 -1
  450. package/dist/modes/interactive/components/usage-view.js +21 -6
  451. package/dist/modes/interactive/components/usage-view.js.map +1 -1
  452. package/dist/modes/interactive/interactive-mode.d.ts +3 -7
  453. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  454. package/dist/modes/interactive/interactive-mode.js +151 -131
  455. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  456. package/dist/modes/interactive/smooth-streaming.d.ts.map +1 -1
  457. package/dist/modes/interactive/smooth-streaming.js.map +1 -1
  458. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  459. package/dist/modes/rpc/rpc-mode.js +2 -1
  460. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  461. package/dist/node-runtime/{adapter-VFG7WNPX.js → adapter-247RTYLS.js} +4 -5
  462. package/dist/node-runtime/agent-session-services-RTUGP3XR.js +54 -0
  463. package/dist/node-runtime/{brave-UWDA3I22.js → brave-2AFFAXNN.js} +1 -1
  464. package/dist/node-runtime/{builtin-extensions-I2HIFEMY.js → builtin-extensions-N4EUD6SB.js} +8 -7
  465. package/dist/node-runtime/{chunk-QH6YL7VK.js → chunk-252ZVPPF.js} +3 -3
  466. package/dist/node-runtime/{chunk-PCEW76PM.js → chunk-2OIPYKLZ.js} +6 -6
  467. package/dist/node-runtime/{chunk-XBWPBZBN.js → chunk-2SWW7KMW.js} +1 -1
  468. package/dist/node-runtime/{chunk-UQUCFAJ3.js → chunk-2VIW3IMF.js} +40 -7
  469. package/dist/node-runtime/{chunk-UOEDI7RP.js → chunk-4KNKQGHM.js} +2 -2
  470. package/dist/node-runtime/chunk-4QRUZ64T.js +1203 -0
  471. package/dist/node-runtime/{chunk-FQMM2EZ2.js → chunk-64XTQNLA.js} +29 -7
  472. package/dist/node-runtime/{chunk-SPVDBUOS.js → chunk-6O3IW3IA.js} +2 -2
  473. package/dist/node-runtime/{chunk-5ZQXRPMC.js → chunk-6ZZHGUSA.js} +2 -2
  474. package/dist/node-runtime/{chunk-WIF24I7G.js → chunk-APVM5NEU.js} +149 -144
  475. package/dist/node-runtime/{chunk-LWYIVUGV.js → chunk-B2IBAXNX.js} +48 -31
  476. package/dist/node-runtime/{chunk-M3LZLQW2.js → chunk-BDRGN3L2.js} +1 -0
  477. package/dist/node-runtime/{chunk-LJTIVM7I.js → chunk-BMRXLQWQ.js} +464 -160
  478. package/dist/node-runtime/{chunk-GJ2RDBRL.js → chunk-BYC6RKCN.js} +4 -2
  479. package/dist/node-runtime/{chunk-T4DA4XE7.js → chunk-DFMPRAQQ.js} +162 -82
  480. package/dist/node-runtime/{chunk-SN2KSMPQ.js → chunk-DQSCFU7R.js} +13 -7
  481. package/dist/node-runtime/{chunk-UVWCDQYF.js → chunk-E5DQGNJI.js} +455 -278
  482. package/dist/node-runtime/{chunk-4SBQAI4T.js → chunk-EBLAZVSA.js} +2058 -73
  483. package/dist/node-runtime/{chunk-CSFI6YXL.js → chunk-ES6PBSIE.js} +1 -1
  484. package/dist/node-runtime/{chunk-IF24A3FH.js → chunk-EVM653DD.js} +4 -4
  485. package/dist/node-runtime/{chunk-HTFRRDSF.js → chunk-F2SMQ6ES.js} +3 -2
  486. package/dist/node-runtime/chunk-F2V2F4ZG.js +114 -0
  487. package/dist/node-runtime/{chunk-IKU6Y7DL.js → chunk-FE3WZI7F.js} +9 -6
  488. package/dist/node-runtime/{chunk-6VYZ5UFP.js → chunk-FLGEEH27.js} +1 -1
  489. package/dist/node-runtime/{chunk-5EFIU3OM.js → chunk-FTKEZL27.js} +1 -1
  490. package/dist/node-runtime/{chunk-RGQAEOM5.js → chunk-FYIFPFXE.js} +23 -6
  491. package/dist/node-runtime/{chunk-HMBGROQK.js → chunk-GLDXBBL6.js} +3 -3
  492. package/dist/node-runtime/{chunk-KWA4OC2J.js → chunk-H6YBCWKG.js} +1 -1
  493. package/dist/node-runtime/{chunk-2MI5OPMN.js → chunk-HNNHHJAB.js} +68 -50
  494. package/dist/node-runtime/{chunk-I74LN5JG.js → chunk-HUD2RFJW.js} +2 -2
  495. package/dist/node-runtime/{chunk-XHIRAZ26.js → chunk-IAZSK7KK.js} +1 -1
  496. package/dist/node-runtime/{chunk-GYIXXQAO.js → chunk-ICKGAKWX.js} +23 -59
  497. package/dist/node-runtime/{chunk-X3PGBLQ7.js → chunk-IHHTWSXN.js} +9 -9
  498. package/dist/node-runtime/{chunk-DAPBPCBP.js → chunk-IPP5BIV5.js} +25 -3
  499. package/dist/node-runtime/{chunk-QFWG2RVL.js → chunk-IXG6F4NT.js} +11 -0
  500. package/dist/node-runtime/{chunk-L24TPBS4.js → chunk-JEK35V2M.js} +45 -31
  501. package/dist/node-runtime/{chunk-RDDAZOMU.js → chunk-JL4HYQXK.js} +1 -1
  502. package/dist/node-runtime/{chunk-2HMIRK7W.js → chunk-LHV3V67B.js} +5 -5
  503. package/dist/node-runtime/{chunk-UAEOTO52.js → chunk-MNQXDFPV.js} +6 -2
  504. package/dist/node-runtime/{chunk-MPKSOJBT.js → chunk-NHATCSOI.js} +4 -7
  505. package/dist/node-runtime/{chunk-RMQZU2YU.js → chunk-NNNR3QIY.js} +1 -1
  506. package/dist/node-runtime/{chunk-2KIPT4HJ.js → chunk-PWHTSQC4.js} +83 -21
  507. package/dist/node-runtime/{chunk-RWTKOC3B.js → chunk-QBTJG3UM.js} +1 -1
  508. package/dist/node-runtime/{chunk-RCR3XAQY.js → chunk-QT3F6UEV.js} +233 -169
  509. package/dist/node-runtime/{chunk-GS42T6MX.js → chunk-QW3AAHWN.js} +1 -1
  510. package/dist/node-runtime/{chunk-DVQSHCVP.js → chunk-R4WSB2MQ.js} +5 -5
  511. package/dist/node-runtime/{chunk-B4HP6ZWM.js → chunk-RHCGYWO7.js} +1 -1
  512. package/dist/node-runtime/{chunk-2CFDTH5B.js → chunk-RLGY2QIL.js} +45 -59
  513. package/dist/node-runtime/{chunk-CDVHZOOK.js → chunk-RY3FJ6WI.js} +29 -27
  514. package/dist/node-runtime/{chunk-KKUTQQV7.js → chunk-RYRGL7P4.js} +1 -1
  515. package/dist/node-runtime/{chunk-I54LGHWM.js → chunk-STMX7W5I.js} +3 -3
  516. package/dist/node-runtime/chunk-SWWHZ2RI.js +158 -0
  517. package/dist/node-runtime/{chunk-5Q4A37RB.js → chunk-TCT6PCUR.js} +32 -11
  518. package/dist/node-runtime/{chunk-P7XBVXGT.js → chunk-U3YVZ6UC.js} +18 -14
  519. package/dist/node-runtime/{chunk-D5UCKPBQ.js → chunk-UBWW2PID.js} +1 -1
  520. package/dist/node-runtime/{chunk-E75WFZ33.js → chunk-UNUZICC4.js} +3 -3
  521. package/dist/node-runtime/{chunk-RAK2QA2B.js → chunk-UYRKUKFE.js} +4 -4
  522. package/dist/node-runtime/{chunk-LWJXTA6Z.js → chunk-VSUEAI7O.js} +1377 -45
  523. package/dist/node-runtime/{chunk-NAY6UUQZ.js → chunk-WDIVLMOH.js} +1 -1
  524. package/dist/node-runtime/{chunk-E24EO34J.js → chunk-WPXUR3HE.js} +1 -1
  525. package/dist/node-runtime/{chunk-SLVOAQOY.js → chunk-WXYNALHD.js} +113 -1
  526. package/dist/node-runtime/{chunk-KJ6DWS3K.js → chunk-XEOCUEUJ.js} +121 -60
  527. package/dist/node-runtime/chunk-YD3IZAZ7.js +47 -0
  528. package/dist/node-runtime/chunk-YSB6URMT.js +41 -0
  529. package/dist/node-runtime/{chunk-YWOJIGFY.js → chunk-ZEVFBFNF.js} +95 -142
  530. package/dist/node-runtime/{chunk-5B6VKFEV.js → chunk-ZIQUS5QO.js} +1 -1
  531. package/dist/node-runtime/cli-runtime.js +4 -4
  532. package/dist/node-runtime/{command-FSBU2EVZ.js → command-YRT7I2BW.js} +5 -5
  533. package/dist/node-runtime/{commands-NAAL7KNT.js → commands-2ETOWWRA.js} +16 -16
  534. package/dist/node-runtime/{commands-EMBQQVVT.js → commands-D6A6H4TS.js} +11 -18
  535. package/dist/node-runtime/{config-QDD5PUE2.js → config-CU7M7BTK.js} +1 -1
  536. package/dist/node-runtime/{config-D4QUPAHX.js → config-DS7XLMEM.js} +2 -2
  537. package/dist/node-runtime/{direct-tool-executor-4D7UXYU4.js → direct-tool-executor-2QJXVQD2.js} +6 -11
  538. package/dist/node-runtime/{exa-LL64QZR2.js → exa-6VBZNPGE.js} +1 -1
  539. package/dist/node-runtime/{export-html-VM4J2MNR.js → export-html-DBQRRMAY.js} +4 -4
  540. package/dist/node-runtime/{extension-input-E7BJZ35H.js → extension-input-VBBMX7YV.js} +5 -5
  541. package/dist/node-runtime/{extension-selector-WU42XDTU.js → extension-selector-T5AOG5XB.js} +5 -5
  542. package/dist/node-runtime/{extract-EQJE7FZZ.js → extract-BFX2N35A.js} +3 -3
  543. package/dist/node-runtime/{gateway-DQM333YV.js → gateway-V6K2CDWN.js} +51 -42
  544. package/dist/node-runtime/{gemini-search-35OCRFLN.js → gemini-search-C66QHDT6.js} +2 -2
  545. package/dist/node-runtime/{gemini-url-context-UQY3PHHW.js → gemini-url-context-T7DEK73R.js} +3 -3
  546. package/dist/node-runtime/{github-extract-F64RZOEA.js → github-extract-HOGE3D6F.js} +107 -38
  547. package/dist/node-runtime/{goal-NJEE5CTU.js → goal-J7TYMOBK.js} +14 -8
  548. package/dist/node-runtime/index.js +51 -48
  549. package/dist/node-runtime/{init-P5AUV77I.js → init-JBQJIPYI.js} +3 -6
  550. package/dist/node-runtime/{install-cli-NN4YAU44.js → install-cli-INGHIVBY.js} +30 -25
  551. package/dist/node-runtime/interactive-mode-ASZ7APYP.js +75 -0
  552. package/dist/node-runtime/{interactive-view-NGFAMHPW.js → interactive-view-K33PM4OS.js} +8 -8
  553. package/dist/node-runtime/{lsp-manager-3ASUSO4T.js → lsp-manager-S554V5HR.js} +240 -155
  554. package/dist/node-runtime/{lunr-browser-IR7TL3J7.js → lunr-browser-H4FDOR3C.js} +7 -7
  555. package/dist/node-runtime/{lunr-computer-use-Y23CCDIJ.js → lunr-computer-use-VDP2QNRQ.js} +9 -9
  556. package/dist/node-runtime/{lunr-cron-USHC4LXH.js → lunr-cron-WD3YH4CR.js} +93 -80
  557. package/dist/node-runtime/main.js +43 -41
  558. package/dist/node-runtime/{mobile-commands-O5LCHL32.js → mobile-commands-ICUXFW5V.js} +12 -12
  559. package/dist/node-runtime/{model-runtime-OO5HFLWE.js → model-runtime-MZ2JMDV4.js} +4 -4
  560. package/dist/node-runtime/{openai-search-B3MSNCQA.js → openai-search-K72LJDYN.js} +1 -1
  561. package/dist/node-runtime/{package-manager-cli-Q7BL6KZO.js → package-manager-cli-CYM262SI.js} +20 -20
  562. package/dist/node-runtime/{parallel-AI2MNSCU.js → parallel-X724NCNU.js} +1 -1
  563. package/dist/node-runtime/{perplexity-QVJW3I35.js → perplexity-RDHQHVMK.js} +2 -2
  564. package/dist/node-runtime/{pi-intercom-QM53RLTS.js → pi-intercom-NHHEPBMI.js} +2 -2
  565. package/dist/node-runtime/{pi-mcp-adapter-3PHF4KZ4.js → pi-mcp-adapter-PP3GQJQ2.js} +98 -94
  566. package/dist/node-runtime/{pi-ollama-cloud-2F3Y2QNM.js → pi-ollama-cloud-4MNWIMFN.js} +11 -24
  567. package/dist/node-runtime/{pi-prompt-template-model-QWTCGLJU.js → pi-prompt-template-model-FTGELLS5.js} +32 -36
  568. package/dist/node-runtime/{pi-subagents-7IBSSGEW.js → pi-subagents-QPU3OXE4.js} +114 -167
  569. package/dist/node-runtime/{pi-web-access-WTGMNZ32.js → pi-web-access-Z3LP246C.js} +144 -108
  570. package/dist/node-runtime/{print-mode-XQ76CYMT.js → print-mode-2XHN5SUA.js} +3 -3
  571. package/dist/node-runtime/{process-registry-4FAKZQOL.js → process-registry-Q4QWIU33.js} +3 -3
  572. package/dist/node-runtime/{proxy-modes-5FAPSZEZ.js → proxy-modes-VEGC6QG5.js} +8 -15
  573. package/dist/node-runtime/rpc-entry.js +43 -41
  574. package/dist/node-runtime/{rpc-mode-O3XV4SID.js → rpc-mode-32DHJPEJ.js} +4 -4
  575. package/dist/node-runtime/{runtime-4VA6JKNF.js → runtime-EDUUGAQD.js} +56 -46
  576. package/dist/node-runtime/{runtime-EFPPD2UW.js → runtime-UGXM4NPQ.js} +2 -2
  577. package/dist/node-runtime/{runtime-bridges-7WVCLI76.js → runtime-bridges-DNKMNJCF.js} +7 -7
  578. package/dist/node-runtime/{service-MDQIPQ26.js → service-IHLGFLBT.js} +6 -4
  579. package/dist/node-runtime/{session-handoff-GWARVEWT.js → session-handoff-LYH53ESV.js} +4 -4
  580. package/dist/node-runtime/{session-manager-JB5J6XBN.js → session-manager-ZJ3N5Q74.js} +3 -3
  581. package/dist/node-runtime/{session-selector-GIM4DHQ2.js → session-selector-I73U3EIO.js} +7 -7
  582. package/dist/node-runtime/{settings-manager-DJDM5AHM.js → settings-manager-P2TKGYTR.js} +5 -5
  583. package/dist/node-runtime/{setup-JBKOLJ6F.js → setup-H7CCELIL.js} +15 -1
  584. package/dist/node-runtime/{setup-PFBWRNUI.js → setup-OLQ4GXWS.js} +17 -17
  585. package/dist/node-runtime/{src-IVPNZ2BX.js → src-6RV4PXKJ.js} +64 -36
  586. package/dist/node-runtime/{subagent-executor-LPZ4BHWE.js → subagent-executor-UI6SHG3X.js} +412 -288
  587. package/dist/node-runtime/{tavily-WEZFVFP7.js → tavily-KZBFYQB6.js} +1 -1
  588. package/dist/node-runtime/{theme-UOO5RVFN.js → theme-YLVZKKZD.js} +2 -2
  589. package/dist/node-runtime/{trust-manager-MMISNCYO.js → trust-manager-ZCU76D23.js} +2 -2
  590. package/dist/node-runtime/{update-cli-HNMOTNGX.js → update-cli-F3XXJANQ.js} +6 -6
  591. package/dist/node-runtime/{usage-service-LFB2SWYV.js → usage-service-CPAGBED5.js} +1 -1
  592. package/dist/node-runtime/{video-extract-OOZHR7SU.js → video-extract-UPKYIBW3.js} +3 -3
  593. package/dist/node-runtime/{workflow-OHPBEFO4.js → workflow-ICDI4N3J.js} +208 -78
  594. package/dist/node-runtime/{youtube-extract-FNPAUNHU.js → youtube-extract-77NT7FWH.js} +4 -4
  595. package/dist/utils/clipboard-image.d.ts.map +1 -1
  596. package/dist/utils/clipboard-image.js.map +1 -1
  597. package/dist/utils/exif-orientation.d.ts.map +1 -1
  598. package/dist/utils/exif-orientation.js +25 -10
  599. package/dist/utils/exif-orientation.js.map +1 -1
  600. package/dist/utils/image-resize-core.d.ts.map +1 -1
  601. package/dist/utils/image-resize-core.js +2 -0
  602. package/dist/utils/image-resize-core.js.map +1 -1
  603. package/dist/utils/paths.d.ts +4 -0
  604. package/dist/utils/paths.d.ts.map +1 -1
  605. package/dist/utils/paths.js +33 -2
  606. package/dist/utils/paths.js.map +1 -1
  607. package/dist/utils/sanitize-terminal-text.d.ts +7 -0
  608. package/dist/utils/sanitize-terminal-text.d.ts.map +1 -0
  609. package/dist/utils/sanitize-terminal-text.js +67 -0
  610. package/dist/utils/sanitize-terminal-text.js.map +1 -0
  611. package/docs/browser.md +1 -1
  612. package/docs/custom-provider.md +3 -3
  613. package/docs/extensions.md +8 -4
  614. package/docs/features.md +25 -7
  615. package/docs/keybindings.md +1 -1
  616. package/docs/models.md +5 -5
  617. package/docs/packages.md +1 -1
  618. package/docs/providers.md +2 -2
  619. package/docs/rpc.md +7 -7
  620. package/docs/security.md +10 -5
  621. package/docs/sessions.md +2 -2
  622. package/docs/skills.md +1 -1
  623. package/docs/terminal-setup.md +7 -7
  624. package/docs/themes.md +1 -1
  625. package/docs/usage.md +1 -1
  626. package/examples/extensions/auto-commit-on-exit.ts +1 -1
  627. package/examples/extensions/bash-spawn-hook.ts +1 -1
  628. package/examples/extensions/built-in-tool-renderer.ts +1 -1
  629. package/examples/extensions/claude-rules.ts +1 -1
  630. package/examples/extensions/commands.ts +1 -1
  631. package/examples/extensions/custom-compaction.ts +1 -1
  632. package/examples/extensions/custom-provider-anthropic/index.ts +3 -3
  633. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  634. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  635. package/examples/extensions/custom-provider-gitlab-duo/index.ts +1 -1
  636. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  637. package/examples/extensions/doom-overlay/index.ts +1 -1
  638. package/examples/extensions/git-merge-and-resolve.ts +2 -2
  639. package/examples/extensions/gondolin/index.ts +1 -1
  640. package/examples/extensions/gondolin/package-lock.json +2 -2
  641. package/examples/extensions/gondolin/package.json +1 -1
  642. package/examples/extensions/hidden-thinking-label.ts +1 -1
  643. package/examples/extensions/inline-bash.ts +2 -2
  644. package/examples/extensions/input-transform-streaming.ts +2 -2
  645. package/examples/extensions/input-transform.ts +2 -2
  646. package/examples/extensions/interactive-shell.ts +1 -1
  647. package/examples/extensions/kimi-deferred-tools.ts +1 -1
  648. package/examples/extensions/mac-system-theme.ts +1 -1
  649. package/examples/extensions/minimal-mode.ts +1 -1
  650. package/examples/extensions/modal-editor.ts +1 -1
  651. package/examples/extensions/model-status.ts +1 -1
  652. package/examples/extensions/notify.ts +3 -3
  653. package/examples/extensions/overlay-qa-tests.ts +1 -1
  654. package/examples/extensions/overlay-test.ts +1 -1
  655. package/examples/extensions/pirate.ts +1 -1
  656. package/examples/extensions/preset.ts +3 -3
  657. package/examples/extensions/project-trust.ts +4 -4
  658. package/examples/extensions/prompt-customizer.ts +1 -1
  659. package/examples/extensions/rainbow-editor.ts +1 -1
  660. package/examples/extensions/rpc-demo.ts +1 -1
  661. package/examples/extensions/sandbox/index.ts +7 -7
  662. package/examples/extensions/sandbox/package-lock.json +2 -2
  663. package/examples/extensions/sandbox/package.json +1 -1
  664. package/examples/extensions/shutdown-command.ts +5 -5
  665. package/examples/extensions/ssh.ts +2 -2
  666. package/examples/extensions/subagent/README.md +3 -3
  667. package/examples/extensions/subagent/index.ts +2 -2
  668. package/examples/extensions/titlebar-spinner.ts +1 -1
  669. package/examples/extensions/tool-override.ts +1 -1
  670. package/examples/extensions/tools.ts +1 -1
  671. package/examples/extensions/with-deps/package-lock.json +2 -2
  672. package/examples/extensions/with-deps/package.json +1 -1
  673. package/examples/extensions/working-indicator.ts +1 -1
  674. package/examples/extensions/working-message-test.ts +1 -1
  675. package/examples/sdk/01-minimal.ts +1 -1
  676. package/examples/sdk/03-custom-prompt.ts +1 -1
  677. package/examples/sdk/04-skills.ts +1 -1
  678. package/examples/sdk/06-extensions.ts +2 -2
  679. package/examples/sdk/08-prompt-templates.ts +1 -1
  680. package/install-lock/package-lock.json +24 -24
  681. package/install-lock/package.json +2 -2
  682. package/npm-shrinkwrap.json +60 -24
  683. package/package.json +9 -9
  684. package/dist/modes/interactive/components/exit-card.d.ts +0 -22
  685. package/dist/modes/interactive/components/exit-card.d.ts.map +0 -1
  686. package/dist/modes/interactive/components/exit-card.js +0 -69
  687. package/dist/modes/interactive/components/exit-card.js.map +0 -1
  688. package/dist/node-runtime/agent-session-services-5YXS2PLF.js +0 -51
  689. package/dist/node-runtime/chunk-2IDTZAG5.js +0 -1415
  690. package/dist/node-runtime/chunk-3MISGG4S.js +0 -769
  691. package/dist/node-runtime/chunk-4HXHDDCF.js +0 -16
  692. package/dist/node-runtime/chunk-5B5QN3ZQ.js +0 -356
  693. package/dist/node-runtime/chunk-7IQGBKBJ.js +0 -2033
  694. package/dist/node-runtime/chunk-AUXVGBO4.js +0 -19
  695. package/dist/node-runtime/chunk-PTFBPO3C.js +0 -50
  696. package/dist/node-runtime/interactive-mode-YOHZVMKX.js +0 -74
  697. package/dist/node-runtime/mcp-auth-flow-QVLFVLEO.js +0 -33
@@ -1 +1 @@
1
- {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/core/update-check.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Published-install version check against the npm registry for @ashx-j/lunr.\n * Workspace checkouts (PACKAGE_NAME !== NPM_CLI_PACKAGE) never nag or self-update.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { gt } from \"semver\";\nimport { NPM_CLI_PACKAGE, PACKAGE_NAME } from \"../config.ts\";\n\nexport const UPDATE_CHECK_TTL_MS = 24 * 60 * 60 * 1000;\nexport const UPDATE_CHECK_TIMEOUT_MS = 4000;\nexport const NPM_LATEST_URL = `https://registry.npmjs.org/${NPM_CLI_PACKAGE}/latest`;\n\nexport interface UpdateCheckRecord {\n\tcheckedAt: number;\n\tlatest: string;\n\tnotifiedVersion?: string;\n}\n\nexport interface UpdateCheckResult {\n\tlatest: string;\n\tcurrent: string;\n\tnewer: boolean;\n\tnotice?: string;\n}\n\nexport function isPublishedInstall(\n\tpackageName: string = PACKAGE_NAME,\n\tnpmName: string = NPM_CLI_PACKAGE,\n): boolean {\n\treturn packageName === npmName;\n}\n\nexport function updateCheckPath(agentDir: string): string {\n\treturn join(agentDir, \"update-check.json\");\n}\n\nfunction readRecord(path: string): UpdateCheckRecord | undefined {\n\ttry {\n\t\tconst raw = JSON.parse(readFileSync(path, \"utf8\")) as UpdateCheckRecord;\n\t\tif (typeof raw.checkedAt !== \"number\" || typeof raw.latest !== \"string\" || !raw.latest.trim()) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn {\n\t\t\tcheckedAt: raw.checkedAt,\n\t\t\tlatest: raw.latest.trim(),\n\t\t\tnotifiedVersion: typeof raw.notifiedVersion === \"string\" ? raw.notifiedVersion : undefined,\n\t\t};\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction writeRecord(path: string, record: UpdateCheckRecord): void {\n\tmkdirSync(dirname(path), { recursive: true });\n\twriteFileSync(path, `${JSON.stringify(record)}\\n`, \"utf8\");\n}\n\nasync function fetchLatest(fetchImpl: typeof fetch): Promise<string | undefined> {\n\tconst controller = new AbortController();\n\tconst timeout = setTimeout(() => controller.abort(), UPDATE_CHECK_TIMEOUT_MS);\n\ttry {\n\t\tconst response = await fetchImpl(NPM_LATEST_URL, {\n\t\t\theaders: { Accept: \"application/json\" },\n\t\t\tsignal: controller.signal,\n\t\t});\n\t\tif (!response.ok) return undefined;\n\t\tconst payload = (await response.json()) as { version?: unknown };\n\t\treturn typeof payload.version === \"string\" && payload.version.trim() ? payload.version.trim() : undefined;\n\t} catch {\n\t\treturn undefined;\n\t} finally {\n\t\tclearTimeout(timeout);\n\t}\n}\n\nexport async function checkForUpdate(options: {\n\tcurrentVersion: string;\n\tagentDir: string;\n\tnow?: number;\n\tfetchImpl?: typeof fetch;\n\tpublished?: boolean;\n\toffline?: boolean;\n\tforce?: boolean;\n}): Promise<UpdateCheckResult | undefined> {\n\tif (options.offline) return undefined;\n\tif (!(options.published ?? isPublishedInstall())) return undefined;\n\n\tconst now = options.now ?? Date.now();\n\tconst path = updateCheckPath(options.agentDir);\n\tlet record = existsSync(path) ? readRecord(path) : undefined;\n\tconst stale = !record || now - record.checkedAt >= UPDATE_CHECK_TTL_MS || options.force;\n\tif (stale) {\n\t\tconst latest = await fetchLatest(options.fetchImpl ?? fetch);\n\t\tif (!latest) return record ? toResult(options.currentVersion, record, false) : undefined;\n\t\trecord = { checkedAt: now, latest, notifiedVersion: record?.notifiedVersion };\n\t\ttry {\n\t\t\twriteRecord(path, record);\n\t\t} catch {\n\t\t\t// Cache write is best-effort.\n\t\t}\n\t}\n\n\tif (!record) return undefined;\n\treturn toResult(options.currentVersion, record, true);\n}\n\nfunction isNewer(latest: string, current: string): boolean {\n\ttry {\n\t\treturn gt(latest, current);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction toResult(current: string, record: UpdateCheckRecord, allowNotice: boolean): UpdateCheckResult {\n\tconst newer = isNewer(record.latest, current);\n\tconst notice =\n\t\tallowNotice && newer && record.notifiedVersion !== record.latest\n\t\t\t? `lunR ${record.latest} is available. Run lunr update.`\n\t\t\t: undefined;\n\treturn { latest: record.latest, current, newer, notice };\n}\n\n/** Persist that we already showed the TUI notice for this latest version. */\nexport function markUpdateNotified(agentDir: string, latest: string): void {\n\tconst path = updateCheckPath(agentDir);\n\tconst record = existsSync(path) ? readRecord(path) : undefined;\n\tif (!record) return;\n\trecord.notifiedVersion = latest;\n\ttry {\n\t\twriteRecord(path, record);\n\t} catch {\n\t\t// ignore\n\t}\n}\n"]}
1
+ {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/core/update-check.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Published-install version check against the npm registry for @ashx-j/lunr.\n * Workspace checkouts (PACKAGE_NAME !== NPM_CLI_PACKAGE) never nag or self-update.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { gt } from \"semver\";\nimport { NPM_CLI_PACKAGE, PACKAGE_NAME } from \"../config.ts\";\n\nexport const UPDATE_CHECK_TTL_MS = 24 * 60 * 60 * 1000;\nexport const UPDATE_CHECK_TIMEOUT_MS = 4000;\nexport const NPM_LATEST_URL = `https://registry.npmjs.org/${NPM_CLI_PACKAGE}/latest`;\n\nexport interface UpdateCheckRecord {\n\tcheckedAt: number;\n\tlatest: string;\n\tnotifiedVersion?: string;\n}\n\nexport interface UpdateCheckResult {\n\tlatest: string;\n\tcurrent: string;\n\tnewer: boolean;\n\tnotice?: string;\n}\n\nexport function isPublishedInstall(packageName: string = PACKAGE_NAME, npmName: string = NPM_CLI_PACKAGE): boolean {\n\treturn packageName === npmName;\n}\n\nexport function updateCheckPath(agentDir: string): string {\n\treturn join(agentDir, \"update-check.json\");\n}\n\nfunction readRecord(path: string): UpdateCheckRecord | undefined {\n\ttry {\n\t\tconst raw = JSON.parse(readFileSync(path, \"utf8\")) as UpdateCheckRecord;\n\t\tif (typeof raw.checkedAt !== \"number\" || typeof raw.latest !== \"string\" || !raw.latest.trim()) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn {\n\t\t\tcheckedAt: raw.checkedAt,\n\t\t\tlatest: raw.latest.trim(),\n\t\t\tnotifiedVersion: typeof raw.notifiedVersion === \"string\" ? raw.notifiedVersion : undefined,\n\t\t};\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction writeRecord(path: string, record: UpdateCheckRecord): void {\n\tmkdirSync(dirname(path), { recursive: true });\n\twriteFileSync(path, `${JSON.stringify(record)}\\n`, \"utf8\");\n}\n\nasync function fetchLatest(fetchImpl: typeof fetch): Promise<string | undefined> {\n\tconst controller = new AbortController();\n\tconst timeout = setTimeout(() => controller.abort(), UPDATE_CHECK_TIMEOUT_MS);\n\ttry {\n\t\tconst response = await fetchImpl(NPM_LATEST_URL, {\n\t\t\theaders: { Accept: \"application/json\" },\n\t\t\tsignal: controller.signal,\n\t\t});\n\t\tif (!response.ok) return undefined;\n\t\tconst payload = (await response.json()) as { version?: unknown };\n\t\treturn typeof payload.version === \"string\" && payload.version.trim() ? payload.version.trim() : undefined;\n\t} catch {\n\t\treturn undefined;\n\t} finally {\n\t\tclearTimeout(timeout);\n\t}\n}\n\nexport async function checkForUpdate(options: {\n\tcurrentVersion: string;\n\tagentDir: string;\n\tnow?: number;\n\tfetchImpl?: typeof fetch;\n\tpublished?: boolean;\n\toffline?: boolean;\n\tforce?: boolean;\n}): Promise<UpdateCheckResult | undefined> {\n\tif (options.offline) return undefined;\n\tif (!(options.published ?? isPublishedInstall())) return undefined;\n\n\tconst now = options.now ?? Date.now();\n\tconst path = updateCheckPath(options.agentDir);\n\tlet record = existsSync(path) ? readRecord(path) : undefined;\n\tconst stale = !record || now - record.checkedAt >= UPDATE_CHECK_TTL_MS || options.force;\n\tif (stale) {\n\t\tconst latest = await fetchLatest(options.fetchImpl ?? fetch);\n\t\tif (!latest) return record ? toResult(options.currentVersion, record, false) : undefined;\n\t\trecord = { checkedAt: now, latest, notifiedVersion: record?.notifiedVersion };\n\t\ttry {\n\t\t\twriteRecord(path, record);\n\t\t} catch {\n\t\t\t// Cache write is best-effort.\n\t\t}\n\t}\n\n\tif (!record) return undefined;\n\treturn toResult(options.currentVersion, record, true);\n}\n\nfunction isNewer(latest: string, current: string): boolean {\n\ttry {\n\t\treturn gt(latest, current);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction toResult(current: string, record: UpdateCheckRecord, allowNotice: boolean): UpdateCheckResult {\n\tconst newer = isNewer(record.latest, current);\n\tconst notice =\n\t\tallowNotice && newer && record.notifiedVersion !== record.latest\n\t\t\t? `lunR ${record.latest} is available. Run lunr update.`\n\t\t\t: undefined;\n\treturn { latest: record.latest, current, newer, notice };\n}\n\n/** Persist that we already showed the TUI notice for this latest version. */\nexport function markUpdateNotified(agentDir: string, latest: string): void {\n\tconst path = updateCheckPath(agentDir);\n\tconst record = existsSync(path) ? readRecord(path) : undefined;\n\tif (!record) return;\n\trecord.notifiedVersion = latest;\n\ttry {\n\t\twriteRecord(path, record);\n\t} catch {\n\t\t// ignore\n\t}\n}\n"]}
@@ -0,0 +1,47 @@
1
+ import type { AssistantMessage, Usage } from "@ashx-j/lunr-ai";
2
+ import type { SessionEntry } from "./session-manager.ts";
3
+ export declare const REQUEST_USAGE_TYPE = "request-usage";
4
+ export interface AccountedRequest {
5
+ id: string;
6
+ purpose: string;
7
+ provider: string;
8
+ model: string;
9
+ timestamp: number;
10
+ usage: Usage;
11
+ stopReason: AssistantMessage["stopReason"];
12
+ }
13
+ export interface UsageTotals {
14
+ requests: number;
15
+ input: number;
16
+ output: number;
17
+ cacheRead: number;
18
+ cacheWrite: number;
19
+ total: number;
20
+ cost: number;
21
+ unknownRequests: number;
22
+ partialRequests: number;
23
+ unknownCosts: number;
24
+ }
25
+ export declare function emptyUsageTotals(): UsageTotals;
26
+ export declare function usageTokens(usage: Pick<Usage, "input" | "output" | "cacheRead" | "cacheWrite">): number;
27
+ /** All incurred requests, independent of the active conversation branch. */
28
+ export declare function collectUsageRequests(entries: readonly SessionEntry[]): AccountedRequest[];
29
+ export declare function totalRequestUsage(requests: readonly AccountedRequest[]): UsageTotals;
30
+ export interface ChildUsageSnapshot {
31
+ id: string;
32
+ label: string;
33
+ sessionFile?: string;
34
+ input: number;
35
+ output: number;
36
+ cacheRead: number;
37
+ cacheWrite: number;
38
+ cost: number;
39
+ turns: number;
40
+ unknownRequests: number;
41
+ partialRequests: number;
42
+ unknownCosts: number;
43
+ }
44
+ /** Request IDs deduplicate completion, wait, fallback, resume, and inherited receipts. Legacy receipts use cumulative counters. */
45
+ export declare function collectChildUsage(entries: readonly SessionEntry[]): ChildUsageSnapshot[];
46
+ export declare function totalChildUsage(children: readonly ChildUsageSnapshot[]): UsageTotals;
47
+ //# sourceMappingURL=usage-accounting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-accounting.d.ts","sourceRoot":"","sources":["../../src/core/usage-accounting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,eAAO,MAAM,kBAAkB,kBAAkB,CAAC;AAElD,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,WAAW;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,gBAAgB,IAAI,WAAW,CAa9C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,CAAC,GAAG,MAAM,CAEvG;AAED,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,gBAAgB,EAAE,CAwBzF;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,GAAG,WAAW,CAepF;AAED,MAAM,WAAW,kBAAkB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACrB;AAgCD,mIAAmI;AACnI,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,kBAAkB,EAAE,CA4FxF;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,GAAG,WAAW,CAepF","sourcesContent":["import type { AssistantMessage, Usage } from \"@ashx-j/lunr-ai\";\nimport type { SessionEntry } from \"./session-manager.ts\";\n\nexport const REQUEST_USAGE_TYPE = \"request-usage\";\n\nexport interface AccountedRequest {\n\tid: string;\n\tpurpose: string;\n\tprovider: string;\n\tmodel: string;\n\ttimestamp: number;\n\tusage: Usage;\n\tstopReason: AssistantMessage[\"stopReason\"];\n}\n\nexport interface UsageTotals {\n\trequests: number;\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\ttotal: number;\n\tcost: number;\n\tunknownRequests: number;\n\tpartialRequests: number;\n\tunknownCosts: number;\n}\n\nexport function emptyUsageTotals(): UsageTotals {\n\treturn {\n\t\trequests: 0,\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotal: 0,\n\t\tcost: 0,\n\t\tunknownRequests: 0,\n\t\tpartialRequests: 0,\n\t\tunknownCosts: 0,\n\t};\n}\n\nexport function usageTokens(usage: Pick<Usage, \"input\" | \"output\" | \"cacheRead\" | \"cacheWrite\">): number {\n\treturn usage.input + usage.output + usage.cacheRead + usage.cacheWrite;\n}\n\n/** All incurred requests, independent of the active conversation branch. */\nexport function collectUsageRequests(entries: readonly SessionEntry[]): AccountedRequest[] {\n\tconst requests = new Map<string, AccountedRequest>();\n\tfor (const entry of entries) {\n\t\tif (entry.inherited) continue;\n\t\tlet request: AccountedRequest | undefined;\n\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tconst message = entry.message;\n\t\t\tif (!validUsage(message.usage)) continue;\n\t\t\trequest = {\n\t\t\t\tid: message.usage.requestId ?? `${entry.id}:${entry.timestamp}:${message.provider}/${message.model}`,\n\t\t\t\tpurpose: \"conversation\",\n\t\t\t\tprovider: message.provider,\n\t\t\t\tmodel: message.responseModel ?? message.model,\n\t\t\t\ttimestamp: Number.isFinite(Date.parse(entry.timestamp)) ? Date.parse(entry.timestamp) : message.timestamp,\n\t\t\t\tusage: message.usage,\n\t\t\t\tstopReason: message.stopReason,\n\t\t\t};\n\t\t} else if (entry.type === \"custom\" && entry.customType === REQUEST_USAGE_TYPE) {\n\t\t\tconst data = entry.data as AccountedRequest | undefined;\n\t\t\tif (validRequest(data)) request = data;\n\t\t}\n\t\tif (request && validRequest(request)) requests.set(request.id, request);\n\t}\n\treturn [...requests.values()];\n}\n\nexport function totalRequestUsage(requests: readonly AccountedRequest[]): UsageTotals {\n\tconst total = emptyUsageTotals();\n\ttotal.requests = requests.length;\n\tfor (const { usage } of requests) {\n\t\ttotal.input += usage.input;\n\t\ttotal.output += usage.output;\n\t\ttotal.cacheRead += usage.cacheRead;\n\t\ttotal.cacheWrite += usage.cacheWrite;\n\t\ttotal.total += usageTokens(usage);\n\t\ttotal.cost += usage.cost.total;\n\t\ttotal.unknownRequests += Number(usage.measurement === \"unknown\");\n\t\ttotal.partialRequests += Number(usage.measurement === \"partial\");\n\t\ttotal.unknownCosts += Number(usage.costSource === \"unknown\");\n\t}\n\treturn total;\n}\n\nexport interface ChildUsageSnapshot {\n\tid: string;\n\tlabel: string;\n\tsessionFile?: string;\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\tcost: number;\n\tturns: number;\n\tunknownRequests: number;\n\tpartialRequests: number;\n\tunknownCosts: number;\n}\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n\treturn value !== null && typeof value === \"object\" ? (value as Record<string, unknown>) : undefined;\n}\nfunction amount(value: unknown): number {\n\treturn typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? value : 0;\n}\n\nfunction validUsage(value: unknown): value is Usage {\n\tconst usage = record(value);\n\tconst cost = record(usage?.cost);\n\treturn Boolean(\n\t\tusage &&\n\t\t\tcost &&\n\t\t\t[usage.input, usage.output, usage.cacheRead, usage.cacheWrite, cost.total].every(\n\t\t\t\t(amount) => typeof amount === \"number\" && Number.isFinite(amount) && amount >= 0,\n\t\t\t),\n\t);\n}\n\nfunction validRequest(value: unknown): value is AccountedRequest {\n\tconst request = record(value);\n\treturn Boolean(\n\t\trequest &&\n\t\t\ttypeof request.id === \"string\" &&\n\t\t\trequest.id &&\n\t\t\tvalidUsage(request.usage) &&\n\t\t\ttypeof request.timestamp === \"number\" &&\n\t\t\tNumber.isFinite(request.timestamp),\n\t);\n}\n/** Request IDs deduplicate completion, wait, fallback, resume, and inherited receipts. Legacy receipts use cumulative counters. */\nexport function collectChildUsage(entries: readonly SessionEntry[]): ChildUsageSnapshot[] {\n\tconst children = new Map<string, ChildUsageSnapshot>();\n\tconst inherited = new Map<string, ChildUsageSnapshot>();\n\tconst requestGroups = new Map<string, Map<string, AccountedRequest>>();\n\tconst inheritedRequestIds = new Set<string>();\n\tconst requestOwners = new Map<string, string>();\n\tfor (const entry of entries) {\n\t\tconst details =\n\t\t\tentry.type === \"custom_message\" && [\"subagent-notify\", \"subagent-slash-result\"].includes(entry.customType)\n\t\t\t\t? record(entry.details)\n\t\t\t\t: entry.type === \"message\" &&\n\t\t\t\t\t\tentry.message.role === \"toolResult\" &&\n\t\t\t\t\t\tentry.message.toolName?.startsWith(\"subagent\")\n\t\t\t\t\t? record(entry.message.details)\n\t\t\t\t\t: undefined;\n\t\tif (!details) continue;\n\t\tconst slash = record(record(details.result)?.details);\n\t\tconst candidates = details.children ?? slash?.results ?? details.results;\n\t\tif (!Array.isArray(candidates)) continue;\n\t\tfor (const candidate of candidates) {\n\t\t\tconst child = record(candidate);\n\t\t\tconst usage = record(child?.usage);\n\t\t\tif (!child || !usage) continue;\n\t\t\tconst identity = child.sessionFile ?? child.childId ?? child.id;\n\t\t\tif (typeof identity !== \"string\" || !identity) continue;\n\t\t\tconst snapshot: ChildUsageSnapshot = {\n\t\t\t\tid: identity,\n\t\t\t\tlabel: String(child.description ?? child.agent ?? \"child\"),\n\t\t\t\tsessionFile: typeof child.sessionFile === \"string\" ? child.sessionFile : undefined,\n\t\t\t\tinput: amount(usage.input),\n\t\t\t\toutput: amount(usage.output),\n\t\t\t\tcacheRead: amount(usage.cacheRead),\n\t\t\t\tcacheWrite: amount(usage.cacheWrite),\n\t\t\t\tcost: amount(usage.cost),\n\t\t\t\tturns: amount(usage.turns),\n\t\t\t\tunknownRequests: amount(usage.unknownRequests),\n\t\t\t\tpartialRequests: amount(usage.partialRequests),\n\t\t\t\tunknownCosts: amount(usage.unknownCosts),\n\t\t\t};\n\t\t\tif (Array.isArray(child.usageRequests)) {\n\t\t\t\tconst requests = requestGroups.get(identity) ?? new Map<string, AccountedRequest>();\n\t\t\t\trequestGroups.set(identity, requests);\n\t\t\t\tfor (const request of child.usageRequests) {\n\t\t\t\t\tif (!validRequest(request)) continue;\n\t\t\t\t\tif (entry.inherited) inheritedRequestIds.add(request.id);\n\t\t\t\t\telse if (!requestOwners.has(request.id) || requestOwners.get(request.id) === identity) {\n\t\t\t\t\t\trequestOwners.set(request.id, identity);\n\t\t\t\t\t\trequests.set(request.id, request);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst target = entry.inherited ? inherited : children;\n\t\t\tconst previous = target.get(identity);\n\t\t\t// A stale receipt must not undo a newer cumulative receipt.\n\t\t\tif (!previous || usageTokens(snapshot) >= usageTokens(previous)) target.set(identity, snapshot);\n\t\t}\n\t}\n\treturn [...children.values()].map((child) => {\n\t\tconst requests = requestGroups.get(child.id);\n\t\tif (requests) {\n\t\t\tconst ownRequests = [...requests.values()].filter((request) => !inheritedRequestIds.has(request.id));\n\t\t\tconst total = totalRequestUsage(ownRequests);\n\t\t\treturn {\n\t\t\t\t...child,\n\t\t\t\tinput: total.input,\n\t\t\t\toutput: total.output,\n\t\t\t\tcacheRead: total.cacheRead,\n\t\t\t\tcacheWrite: total.cacheWrite,\n\t\t\t\tcost: total.cost,\n\t\t\t\tturns: ownRequests.length,\n\t\t\t\tunknownRequests: total.unknownRequests,\n\t\t\t\tpartialRequests: total.partialRequests,\n\t\t\t\tunknownCosts: total.unknownCosts,\n\t\t\t};\n\t\t}\n\t\tconst baseline = inherited.get(child.id);\n\t\tif (!baseline) return child;\n\t\tconst own = { ...child };\n\t\tfor (const key of [\n\t\t\t\"input\",\n\t\t\t\"output\",\n\t\t\t\"cacheRead\",\n\t\t\t\"cacheWrite\",\n\t\t\t\"cost\",\n\t\t\t\"turns\",\n\t\t\t\"unknownRequests\",\n\t\t\t\"partialRequests\",\n\t\t\t\"unknownCosts\",\n\t\t] as const)\n\t\t\town[key] = Math.max(0, child[key] - baseline[key]);\n\t\treturn own;\n\t});\n}\n\nexport function totalChildUsage(children: readonly ChildUsageSnapshot[]): UsageTotals {\n\tconst totals = emptyUsageTotals();\n\tfor (const child of children) {\n\t\ttotals.requests += child.turns;\n\t\ttotals.input += child.input;\n\t\ttotals.output += child.output;\n\t\ttotals.cacheRead += child.cacheRead;\n\t\ttotals.cacheWrite += child.cacheWrite;\n\t\ttotals.total += usageTokens(child);\n\t\ttotals.cost += child.cost;\n\t\ttotals.unknownRequests += child.unknownRequests;\n\t\ttotals.partialRequests += child.partialRequests;\n\t\ttotals.unknownCosts += child.unknownCosts;\n\t}\n\treturn totals;\n}\n"]}
@@ -0,0 +1,205 @@
1
+ export const REQUEST_USAGE_TYPE = "request-usage";
2
+ export function emptyUsageTotals() {
3
+ return {
4
+ requests: 0,
5
+ input: 0,
6
+ output: 0,
7
+ cacheRead: 0,
8
+ cacheWrite: 0,
9
+ total: 0,
10
+ cost: 0,
11
+ unknownRequests: 0,
12
+ partialRequests: 0,
13
+ unknownCosts: 0,
14
+ };
15
+ }
16
+ export function usageTokens(usage) {
17
+ return usage.input + usage.output + usage.cacheRead + usage.cacheWrite;
18
+ }
19
+ /** All incurred requests, independent of the active conversation branch. */
20
+ export function collectUsageRequests(entries) {
21
+ const requests = new Map();
22
+ for (const entry of entries) {
23
+ if (entry.inherited)
24
+ continue;
25
+ let request;
26
+ if (entry.type === "message" && entry.message.role === "assistant") {
27
+ const message = entry.message;
28
+ if (!validUsage(message.usage))
29
+ continue;
30
+ request = {
31
+ id: message.usage.requestId ?? `${entry.id}:${entry.timestamp}:${message.provider}/${message.model}`,
32
+ purpose: "conversation",
33
+ provider: message.provider,
34
+ model: message.responseModel ?? message.model,
35
+ timestamp: Number.isFinite(Date.parse(entry.timestamp)) ? Date.parse(entry.timestamp) : message.timestamp,
36
+ usage: message.usage,
37
+ stopReason: message.stopReason,
38
+ };
39
+ }
40
+ else if (entry.type === "custom" && entry.customType === REQUEST_USAGE_TYPE) {
41
+ const data = entry.data;
42
+ if (validRequest(data))
43
+ request = data;
44
+ }
45
+ if (request && validRequest(request))
46
+ requests.set(request.id, request);
47
+ }
48
+ return [...requests.values()];
49
+ }
50
+ export function totalRequestUsage(requests) {
51
+ const total = emptyUsageTotals();
52
+ total.requests = requests.length;
53
+ for (const { usage } of requests) {
54
+ total.input += usage.input;
55
+ total.output += usage.output;
56
+ total.cacheRead += usage.cacheRead;
57
+ total.cacheWrite += usage.cacheWrite;
58
+ total.total += usageTokens(usage);
59
+ total.cost += usage.cost.total;
60
+ total.unknownRequests += Number(usage.measurement === "unknown");
61
+ total.partialRequests += Number(usage.measurement === "partial");
62
+ total.unknownCosts += Number(usage.costSource === "unknown");
63
+ }
64
+ return total;
65
+ }
66
+ function record(value) {
67
+ return value !== null && typeof value === "object" ? value : undefined;
68
+ }
69
+ function amount(value) {
70
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : 0;
71
+ }
72
+ function validUsage(value) {
73
+ const usage = record(value);
74
+ const cost = record(usage?.cost);
75
+ return Boolean(usage &&
76
+ cost &&
77
+ [usage.input, usage.output, usage.cacheRead, usage.cacheWrite, cost.total].every((amount) => typeof amount === "number" && Number.isFinite(amount) && amount >= 0));
78
+ }
79
+ function validRequest(value) {
80
+ const request = record(value);
81
+ return Boolean(request &&
82
+ typeof request.id === "string" &&
83
+ request.id &&
84
+ validUsage(request.usage) &&
85
+ typeof request.timestamp === "number" &&
86
+ Number.isFinite(request.timestamp));
87
+ }
88
+ /** Request IDs deduplicate completion, wait, fallback, resume, and inherited receipts. Legacy receipts use cumulative counters. */
89
+ export function collectChildUsage(entries) {
90
+ const children = new Map();
91
+ const inherited = new Map();
92
+ const requestGroups = new Map();
93
+ const inheritedRequestIds = new Set();
94
+ const requestOwners = new Map();
95
+ for (const entry of entries) {
96
+ const details = entry.type === "custom_message" && ["subagent-notify", "subagent-slash-result"].includes(entry.customType)
97
+ ? record(entry.details)
98
+ : entry.type === "message" &&
99
+ entry.message.role === "toolResult" &&
100
+ entry.message.toolName?.startsWith("subagent")
101
+ ? record(entry.message.details)
102
+ : undefined;
103
+ if (!details)
104
+ continue;
105
+ const slash = record(record(details.result)?.details);
106
+ const candidates = details.children ?? slash?.results ?? details.results;
107
+ if (!Array.isArray(candidates))
108
+ continue;
109
+ for (const candidate of candidates) {
110
+ const child = record(candidate);
111
+ const usage = record(child?.usage);
112
+ if (!child || !usage)
113
+ continue;
114
+ const identity = child.sessionFile ?? child.childId ?? child.id;
115
+ if (typeof identity !== "string" || !identity)
116
+ continue;
117
+ const snapshot = {
118
+ id: identity,
119
+ label: String(child.description ?? child.agent ?? "child"),
120
+ sessionFile: typeof child.sessionFile === "string" ? child.sessionFile : undefined,
121
+ input: amount(usage.input),
122
+ output: amount(usage.output),
123
+ cacheRead: amount(usage.cacheRead),
124
+ cacheWrite: amount(usage.cacheWrite),
125
+ cost: amount(usage.cost),
126
+ turns: amount(usage.turns),
127
+ unknownRequests: amount(usage.unknownRequests),
128
+ partialRequests: amount(usage.partialRequests),
129
+ unknownCosts: amount(usage.unknownCosts),
130
+ };
131
+ if (Array.isArray(child.usageRequests)) {
132
+ const requests = requestGroups.get(identity) ?? new Map();
133
+ requestGroups.set(identity, requests);
134
+ for (const request of child.usageRequests) {
135
+ if (!validRequest(request))
136
+ continue;
137
+ if (entry.inherited)
138
+ inheritedRequestIds.add(request.id);
139
+ else if (!requestOwners.has(request.id) || requestOwners.get(request.id) === identity) {
140
+ requestOwners.set(request.id, identity);
141
+ requests.set(request.id, request);
142
+ }
143
+ }
144
+ }
145
+ const target = entry.inherited ? inherited : children;
146
+ const previous = target.get(identity);
147
+ // A stale receipt must not undo a newer cumulative receipt.
148
+ if (!previous || usageTokens(snapshot) >= usageTokens(previous))
149
+ target.set(identity, snapshot);
150
+ }
151
+ }
152
+ return [...children.values()].map((child) => {
153
+ const requests = requestGroups.get(child.id);
154
+ if (requests) {
155
+ const ownRequests = [...requests.values()].filter((request) => !inheritedRequestIds.has(request.id));
156
+ const total = totalRequestUsage(ownRequests);
157
+ return {
158
+ ...child,
159
+ input: total.input,
160
+ output: total.output,
161
+ cacheRead: total.cacheRead,
162
+ cacheWrite: total.cacheWrite,
163
+ cost: total.cost,
164
+ turns: ownRequests.length,
165
+ unknownRequests: total.unknownRequests,
166
+ partialRequests: total.partialRequests,
167
+ unknownCosts: total.unknownCosts,
168
+ };
169
+ }
170
+ const baseline = inherited.get(child.id);
171
+ if (!baseline)
172
+ return child;
173
+ const own = { ...child };
174
+ for (const key of [
175
+ "input",
176
+ "output",
177
+ "cacheRead",
178
+ "cacheWrite",
179
+ "cost",
180
+ "turns",
181
+ "unknownRequests",
182
+ "partialRequests",
183
+ "unknownCosts",
184
+ ])
185
+ own[key] = Math.max(0, child[key] - baseline[key]);
186
+ return own;
187
+ });
188
+ }
189
+ export function totalChildUsage(children) {
190
+ const totals = emptyUsageTotals();
191
+ for (const child of children) {
192
+ totals.requests += child.turns;
193
+ totals.input += child.input;
194
+ totals.output += child.output;
195
+ totals.cacheRead += child.cacheRead;
196
+ totals.cacheWrite += child.cacheWrite;
197
+ totals.total += usageTokens(child);
198
+ totals.cost += child.cost;
199
+ totals.unknownRequests += child.unknownRequests;
200
+ totals.partialRequests += child.partialRequests;
201
+ totals.unknownCosts += child.unknownCosts;
202
+ }
203
+ return totals;
204
+ }
205
+ //# sourceMappingURL=usage-accounting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-accounting.js","sourceRoot":"","sources":["../../src/core/usage-accounting.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, Usage } from \"@ashx-j/lunr-ai\";\nimport type { SessionEntry } from \"./session-manager.ts\";\n\nexport const REQUEST_USAGE_TYPE = \"request-usage\";\n\nexport interface AccountedRequest {\n\tid: string;\n\tpurpose: string;\n\tprovider: string;\n\tmodel: string;\n\ttimestamp: number;\n\tusage: Usage;\n\tstopReason: AssistantMessage[\"stopReason\"];\n}\n\nexport interface UsageTotals {\n\trequests: number;\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\ttotal: number;\n\tcost: number;\n\tunknownRequests: number;\n\tpartialRequests: number;\n\tunknownCosts: number;\n}\n\nexport function emptyUsageTotals(): UsageTotals {\n\treturn {\n\t\trequests: 0,\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotal: 0,\n\t\tcost: 0,\n\t\tunknownRequests: 0,\n\t\tpartialRequests: 0,\n\t\tunknownCosts: 0,\n\t};\n}\n\nexport function usageTokens(usage: Pick<Usage, \"input\" | \"output\" | \"cacheRead\" | \"cacheWrite\">): number {\n\treturn usage.input + usage.output + usage.cacheRead + usage.cacheWrite;\n}\n\n/** All incurred requests, independent of the active conversation branch. */\nexport function collectUsageRequests(entries: readonly SessionEntry[]): AccountedRequest[] {\n\tconst requests = new Map<string, AccountedRequest>();\n\tfor (const entry of entries) {\n\t\tif (entry.inherited) continue;\n\t\tlet request: AccountedRequest | undefined;\n\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tconst message = entry.message;\n\t\t\tif (!validUsage(message.usage)) continue;\n\t\t\trequest = {\n\t\t\t\tid: message.usage.requestId ?? `${entry.id}:${entry.timestamp}:${message.provider}/${message.model}`,\n\t\t\t\tpurpose: \"conversation\",\n\t\t\t\tprovider: message.provider,\n\t\t\t\tmodel: message.responseModel ?? message.model,\n\t\t\t\ttimestamp: Number.isFinite(Date.parse(entry.timestamp)) ? Date.parse(entry.timestamp) : message.timestamp,\n\t\t\t\tusage: message.usage,\n\t\t\t\tstopReason: message.stopReason,\n\t\t\t};\n\t\t} else if (entry.type === \"custom\" && entry.customType === REQUEST_USAGE_TYPE) {\n\t\t\tconst data = entry.data as AccountedRequest | undefined;\n\t\t\tif (validRequest(data)) request = data;\n\t\t}\n\t\tif (request && validRequest(request)) requests.set(request.id, request);\n\t}\n\treturn [...requests.values()];\n}\n\nexport function totalRequestUsage(requests: readonly AccountedRequest[]): UsageTotals {\n\tconst total = emptyUsageTotals();\n\ttotal.requests = requests.length;\n\tfor (const { usage } of requests) {\n\t\ttotal.input += usage.input;\n\t\ttotal.output += usage.output;\n\t\ttotal.cacheRead += usage.cacheRead;\n\t\ttotal.cacheWrite += usage.cacheWrite;\n\t\ttotal.total += usageTokens(usage);\n\t\ttotal.cost += usage.cost.total;\n\t\ttotal.unknownRequests += Number(usage.measurement === \"unknown\");\n\t\ttotal.partialRequests += Number(usage.measurement === \"partial\");\n\t\ttotal.unknownCosts += Number(usage.costSource === \"unknown\");\n\t}\n\treturn total;\n}\n\nexport interface ChildUsageSnapshot {\n\tid: string;\n\tlabel: string;\n\tsessionFile?: string;\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\tcost: number;\n\tturns: number;\n\tunknownRequests: number;\n\tpartialRequests: number;\n\tunknownCosts: number;\n}\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n\treturn value !== null && typeof value === \"object\" ? (value as Record<string, unknown>) : undefined;\n}\nfunction amount(value: unknown): number {\n\treturn typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? value : 0;\n}\n\nfunction validUsage(value: unknown): value is Usage {\n\tconst usage = record(value);\n\tconst cost = record(usage?.cost);\n\treturn Boolean(\n\t\tusage &&\n\t\t\tcost &&\n\t\t\t[usage.input, usage.output, usage.cacheRead, usage.cacheWrite, cost.total].every(\n\t\t\t\t(amount) => typeof amount === \"number\" && Number.isFinite(amount) && amount >= 0,\n\t\t\t),\n\t);\n}\n\nfunction validRequest(value: unknown): value is AccountedRequest {\n\tconst request = record(value);\n\treturn Boolean(\n\t\trequest &&\n\t\t\ttypeof request.id === \"string\" &&\n\t\t\trequest.id &&\n\t\t\tvalidUsage(request.usage) &&\n\t\t\ttypeof request.timestamp === \"number\" &&\n\t\t\tNumber.isFinite(request.timestamp),\n\t);\n}\n/** Request IDs deduplicate completion, wait, fallback, resume, and inherited receipts. Legacy receipts use cumulative counters. */\nexport function collectChildUsage(entries: readonly SessionEntry[]): ChildUsageSnapshot[] {\n\tconst children = new Map<string, ChildUsageSnapshot>();\n\tconst inherited = new Map<string, ChildUsageSnapshot>();\n\tconst requestGroups = new Map<string, Map<string, AccountedRequest>>();\n\tconst inheritedRequestIds = new Set<string>();\n\tconst requestOwners = new Map<string, string>();\n\tfor (const entry of entries) {\n\t\tconst details =\n\t\t\tentry.type === \"custom_message\" && [\"subagent-notify\", \"subagent-slash-result\"].includes(entry.customType)\n\t\t\t\t? record(entry.details)\n\t\t\t\t: entry.type === \"message\" &&\n\t\t\t\t\t\tentry.message.role === \"toolResult\" &&\n\t\t\t\t\t\tentry.message.toolName?.startsWith(\"subagent\")\n\t\t\t\t\t? record(entry.message.details)\n\t\t\t\t\t: undefined;\n\t\tif (!details) continue;\n\t\tconst slash = record(record(details.result)?.details);\n\t\tconst candidates = details.children ?? slash?.results ?? details.results;\n\t\tif (!Array.isArray(candidates)) continue;\n\t\tfor (const candidate of candidates) {\n\t\t\tconst child = record(candidate);\n\t\t\tconst usage = record(child?.usage);\n\t\t\tif (!child || !usage) continue;\n\t\t\tconst identity = child.sessionFile ?? child.childId ?? child.id;\n\t\t\tif (typeof identity !== \"string\" || !identity) continue;\n\t\t\tconst snapshot: ChildUsageSnapshot = {\n\t\t\t\tid: identity,\n\t\t\t\tlabel: String(child.description ?? child.agent ?? \"child\"),\n\t\t\t\tsessionFile: typeof child.sessionFile === \"string\" ? child.sessionFile : undefined,\n\t\t\t\tinput: amount(usage.input),\n\t\t\t\toutput: amount(usage.output),\n\t\t\t\tcacheRead: amount(usage.cacheRead),\n\t\t\t\tcacheWrite: amount(usage.cacheWrite),\n\t\t\t\tcost: amount(usage.cost),\n\t\t\t\tturns: amount(usage.turns),\n\t\t\t\tunknownRequests: amount(usage.unknownRequests),\n\t\t\t\tpartialRequests: amount(usage.partialRequests),\n\t\t\t\tunknownCosts: amount(usage.unknownCosts),\n\t\t\t};\n\t\t\tif (Array.isArray(child.usageRequests)) {\n\t\t\t\tconst requests = requestGroups.get(identity) ?? new Map<string, AccountedRequest>();\n\t\t\t\trequestGroups.set(identity, requests);\n\t\t\t\tfor (const request of child.usageRequests) {\n\t\t\t\t\tif (!validRequest(request)) continue;\n\t\t\t\t\tif (entry.inherited) inheritedRequestIds.add(request.id);\n\t\t\t\t\telse if (!requestOwners.has(request.id) || requestOwners.get(request.id) === identity) {\n\t\t\t\t\t\trequestOwners.set(request.id, identity);\n\t\t\t\t\t\trequests.set(request.id, request);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst target = entry.inherited ? inherited : children;\n\t\t\tconst previous = target.get(identity);\n\t\t\t// A stale receipt must not undo a newer cumulative receipt.\n\t\t\tif (!previous || usageTokens(snapshot) >= usageTokens(previous)) target.set(identity, snapshot);\n\t\t}\n\t}\n\treturn [...children.values()].map((child) => {\n\t\tconst requests = requestGroups.get(child.id);\n\t\tif (requests) {\n\t\t\tconst ownRequests = [...requests.values()].filter((request) => !inheritedRequestIds.has(request.id));\n\t\t\tconst total = totalRequestUsage(ownRequests);\n\t\t\treturn {\n\t\t\t\t...child,\n\t\t\t\tinput: total.input,\n\t\t\t\toutput: total.output,\n\t\t\t\tcacheRead: total.cacheRead,\n\t\t\t\tcacheWrite: total.cacheWrite,\n\t\t\t\tcost: total.cost,\n\t\t\t\tturns: ownRequests.length,\n\t\t\t\tunknownRequests: total.unknownRequests,\n\t\t\t\tpartialRequests: total.partialRequests,\n\t\t\t\tunknownCosts: total.unknownCosts,\n\t\t\t};\n\t\t}\n\t\tconst baseline = inherited.get(child.id);\n\t\tif (!baseline) return child;\n\t\tconst own = { ...child };\n\t\tfor (const key of [\n\t\t\t\"input\",\n\t\t\t\"output\",\n\t\t\t\"cacheRead\",\n\t\t\t\"cacheWrite\",\n\t\t\t\"cost\",\n\t\t\t\"turns\",\n\t\t\t\"unknownRequests\",\n\t\t\t\"partialRequests\",\n\t\t\t\"unknownCosts\",\n\t\t] as const)\n\t\t\town[key] = Math.max(0, child[key] - baseline[key]);\n\t\treturn own;\n\t});\n}\n\nexport function totalChildUsage(children: readonly ChildUsageSnapshot[]): UsageTotals {\n\tconst totals = emptyUsageTotals();\n\tfor (const child of children) {\n\t\ttotals.requests += child.turns;\n\t\ttotals.input += child.input;\n\t\ttotals.output += child.output;\n\t\ttotals.cacheRead += child.cacheRead;\n\t\ttotals.cacheWrite += child.cacheWrite;\n\t\ttotals.total += usageTokens(child);\n\t\ttotals.cost += child.cost;\n\t\ttotals.unknownRequests += child.unknownRequests;\n\t\ttotals.partialRequests += child.partialRequests;\n\t\ttotals.unknownCosts += child.unknownCosts;\n\t}\n\treturn totals;\n}\n"]}
@@ -6,6 +6,6 @@
6
6
  * limits: [{ window: { duration, timeUnit }, detail: { limit, remaining, resetTime } }] }
7
7
  */
8
8
  import type { ModelRuntime } from "../model-runtime.ts";
9
- import type { PlanUsage } from "../usage-service.ts";
10
- export declare function fetchKimiPlanUsage(runtime: ModelRuntime): Promise<PlanUsage | undefined>;
9
+ import type { PlanUsage, UsageAuthSnapshot } from "../usage-service.ts";
10
+ export declare function fetchKimiPlanUsage(runtime: ModelRuntime, auth?: UsageAuthSnapshot): Promise<PlanUsage | undefined>;
11
11
  //# sourceMappingURL=kimi-coding.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"kimi-coding.d.ts","sourceRoot":"","sources":["../../../src/core/usage-adapters/kimi-coding.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,qBAAqB,CAAC;AAuCtE,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CA4B9F","sourcesContent":["/**\n * Kimi for Coding plan usage: `GET https://api.kimi.com/coding/v1/usages`\n * with the stored API key (Bearer). Response shape (undocumented, mirrors\n * other open-source quota dashboards):\n * { usage: { limit, remaining, resetTime },\n * limits: [{ window: { duration, timeUnit }, detail: { limit, remaining, resetTime } }] }\n */\n\nimport type { ModelRuntime } from \"../model-runtime.ts\";\nimport type { PlanUsage, PlanUsageWindow } from \"../usage-service.ts\";\nimport { asNumber, asObject, fetchWithTimeout, toEpochMs, usedPercentFromRemaining } from \"./shared.ts\";\n\nconst KIMI_PROVIDER_ID = \"kimi-coding\";\nconst KIMI_USAGE_URL = \"https://api.kimi.com/coding/v1/usages\";\n\nconst TIME_UNIT_SECONDS: Record<string, number> = {\n\tseconds: 1,\n\tsecond: 1,\n\tminutes: 60,\n\tminute: 60,\n\thours: 3600,\n\thour: 3600,\n\tdays: 86400,\n\tday: 86400,\n\tweeks: 604800,\n\tweek: 604800,\n};\n\nfunction durationLabel(duration: unknown, timeUnit: unknown): string {\n\tconst amount = asNumber(duration);\n\tconst unit = typeof timeUnit === \"string\" ? timeUnit.toLowerCase() : undefined;\n\tconst seconds = amount !== undefined && unit ? TIME_UNIT_SECONDS[unit] : undefined;\n\tif (amount === undefined || seconds === undefined) return \"Limit\";\n\tconst totalSeconds = amount * seconds;\n\tif (totalSeconds >= 604800) return \"Weekly\";\n\tif (totalSeconds >= 86400) return `${Math.round(totalSeconds / 86400)}d`;\n\tif (totalSeconds >= 3600) return `${Math.round(totalSeconds / 3600)}h`;\n\treturn `${Math.max(1, Math.round(totalSeconds / 60))}m`;\n}\n\nfunction detailWindow(label: string, detail: unknown): PlanUsageWindow | undefined {\n\tconst object = asObject(detail);\n\tif (!object) return undefined;\n\tconst usedPercent = usedPercentFromRemaining(object.limit, object.remaining);\n\tif (usedPercent === undefined) return undefined;\n\treturn { label, usedPercent, resetsAt: toEpochMs(object.resetTime) };\n}\n\nexport async function fetchKimiPlanUsage(runtime: ModelRuntime): Promise<PlanUsage | undefined> {\n\tconst resolution = await runtime.getAuth(KIMI_PROVIDER_ID);\n\tconst apiKey = resolution?.auth.apiKey;\n\tif (!apiKey) return undefined;\n\n\tconst response = await fetchWithTimeout(KIMI_USAGE_URL, {\n\t\theaders: { Authorization: `Bearer ${apiKey}`, Accept: \"application/json\" },\n\t});\n\tif (!response.ok) return undefined;\n\tconst payload = asObject(await response.json());\n\tif (!payload) return undefined;\n\n\tconst windows: PlanUsageWindow[] = [];\n\t// Top-level `usage` is the weekly quota; `limits[]` carries the short rate window.\n\tconst weekly = detailWindow(\"Weekly\", payload.usage);\n\tif (weekly) windows.push(weekly);\n\tconst limits = Array.isArray(payload.limits) ? payload.limits : [];\n\tfor (const item of limits) {\n\t\tconst limit = asObject(item);\n\t\tif (!limit) continue;\n\t\tconst window = detailWindow(\n\t\t\tdurationLabel(asObject(limit.window)?.duration, asObject(limit.window)?.timeUnit),\n\t\t\tlimit.detail,\n\t\t);\n\t\tif (window) windows.push(window);\n\t}\n\tif (windows.length === 0) return undefined;\n\treturn { provider: KIMI_PROVIDER_ID, windows };\n}\n"]}
1
+ {"version":3,"file":"kimi-coding.d.ts","sourceRoot":"","sources":["../../../src/core/usage-adapters/kimi-coding.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAmB,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAuCzF,wBAAsB,kBAAkB,CACvC,OAAO,EAAE,YAAY,EACrB,IAAI,CAAC,EAAE,iBAAiB,GACtB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CA4BhC","sourcesContent":["/**\n * Kimi for Coding plan usage: `GET https://api.kimi.com/coding/v1/usages`\n * with the stored API key (Bearer). Response shape (undocumented, mirrors\n * other open-source quota dashboards):\n * { usage: { limit, remaining, resetTime },\n * limits: [{ window: { duration, timeUnit }, detail: { limit, remaining, resetTime } }] }\n */\n\nimport type { ModelRuntime } from \"../model-runtime.ts\";\nimport type { PlanUsage, PlanUsageWindow, UsageAuthSnapshot } from \"../usage-service.ts\";\nimport { asNumber, asObject, fetchWithTimeout, toEpochMs, usedPercentFromRemaining } from \"./shared.ts\";\n\nconst KIMI_PROVIDER_ID = \"kimi-coding\";\nconst KIMI_USAGE_URL = \"https://api.kimi.com/coding/v1/usages\";\n\nconst TIME_UNIT_SECONDS: Record<string, number> = {\n\tseconds: 1,\n\tsecond: 1,\n\tminutes: 60,\n\tminute: 60,\n\thours: 3600,\n\thour: 3600,\n\tdays: 86400,\n\tday: 86400,\n\tweeks: 604800,\n\tweek: 604800,\n};\n\nfunction durationLabel(duration: unknown, timeUnit: unknown): string {\n\tconst amount = asNumber(duration);\n\tconst unit = typeof timeUnit === \"string\" ? timeUnit.toLowerCase() : undefined;\n\tconst seconds = amount !== undefined && unit ? TIME_UNIT_SECONDS[unit] : undefined;\n\tif (amount === undefined || seconds === undefined) return \"Limit\";\n\tconst totalSeconds = amount * seconds;\n\tif (totalSeconds >= 604800) return \"Weekly\";\n\tif (totalSeconds >= 86400) return `${Math.round(totalSeconds / 86400)}d`;\n\tif (totalSeconds >= 3600) return `${Math.round(totalSeconds / 3600)}h`;\n\treturn `${Math.max(1, Math.round(totalSeconds / 60))}m`;\n}\n\nfunction detailWindow(label: string, detail: unknown): PlanUsageWindow | undefined {\n\tconst object = asObject(detail);\n\tif (!object) return undefined;\n\tconst usedPercent = usedPercentFromRemaining(object.limit, object.remaining);\n\tif (usedPercent === undefined) return undefined;\n\treturn { label, usedPercent, resetsAt: toEpochMs(object.resetTime) };\n}\n\nexport async function fetchKimiPlanUsage(\n\truntime: ModelRuntime,\n\tauth?: UsageAuthSnapshot,\n): Promise<PlanUsage | undefined> {\n\tconst resolution = auth ? auth.resolution : await runtime.getAuth(KIMI_PROVIDER_ID);\n\tconst apiKey = resolution?.auth.apiKey;\n\tif (!apiKey) return undefined;\n\n\tconst response = await fetchWithTimeout(KIMI_USAGE_URL, {\n\t\theaders: { Authorization: `Bearer ${apiKey}`, Accept: \"application/json\" },\n\t});\n\tif (!response.ok) return undefined;\n\tconst payload = asObject(await response.json());\n\tif (!payload) return undefined;\n\n\tconst windows: PlanUsageWindow[] = [];\n\t// Top-level `usage` is the weekly quota; `limits[]` carries the short rate window.\n\tconst weekly = detailWindow(\"Weekly\", payload.usage);\n\tif (weekly) windows.push(weekly);\n\tconst limits = Array.isArray(payload.limits) ? payload.limits : [];\n\tfor (const item of limits) {\n\t\tconst limit = asObject(item);\n\t\tif (!limit) continue;\n\t\tconst window = detailWindow(\n\t\t\tdurationLabel(asObject(limit.window)?.duration, asObject(limit.window)?.timeUnit),\n\t\t\tlimit.detail,\n\t\t);\n\t\tif (window) windows.push(window);\n\t}\n\tif (windows.length === 0) return undefined;\n\treturn { provider: KIMI_PROVIDER_ID, windows };\n}\n"]}
@@ -44,8 +44,8 @@ function detailWindow(label, detail) {
44
44
  return undefined;
45
45
  return { label, usedPercent, resetsAt: toEpochMs(object.resetTime) };
46
46
  }
47
- export async function fetchKimiPlanUsage(runtime) {
48
- const resolution = await runtime.getAuth(KIMI_PROVIDER_ID);
47
+ export async function fetchKimiPlanUsage(runtime, auth) {
48
+ const resolution = auth ? auth.resolution : await runtime.getAuth(KIMI_PROVIDER_ID);
49
49
  const apiKey = resolution?.auth.apiKey;
50
50
  if (!apiKey)
51
51
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"kimi-coding.js","sourceRoot":"","sources":["../../../src/core/usage-adapters/kimi-coding.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Kimi for Coding plan usage: `GET https://api.kimi.com/coding/v1/usages`\n * with the stored API key (Bearer). Response shape (undocumented, mirrors\n * other open-source quota dashboards):\n * { usage: { limit, remaining, resetTime },\n * limits: [{ window: { duration, timeUnit }, detail: { limit, remaining, resetTime } }] }\n */\n\nimport type { ModelRuntime } from \"../model-runtime.ts\";\nimport type { PlanUsage, PlanUsageWindow } from \"../usage-service.ts\";\nimport { asNumber, asObject, fetchWithTimeout, toEpochMs, usedPercentFromRemaining } from \"./shared.ts\";\n\nconst KIMI_PROVIDER_ID = \"kimi-coding\";\nconst KIMI_USAGE_URL = \"https://api.kimi.com/coding/v1/usages\";\n\nconst TIME_UNIT_SECONDS: Record<string, number> = {\n\tseconds: 1,\n\tsecond: 1,\n\tminutes: 60,\n\tminute: 60,\n\thours: 3600,\n\thour: 3600,\n\tdays: 86400,\n\tday: 86400,\n\tweeks: 604800,\n\tweek: 604800,\n};\n\nfunction durationLabel(duration: unknown, timeUnit: unknown): string {\n\tconst amount = asNumber(duration);\n\tconst unit = typeof timeUnit === \"string\" ? timeUnit.toLowerCase() : undefined;\n\tconst seconds = amount !== undefined && unit ? TIME_UNIT_SECONDS[unit] : undefined;\n\tif (amount === undefined || seconds === undefined) return \"Limit\";\n\tconst totalSeconds = amount * seconds;\n\tif (totalSeconds >= 604800) return \"Weekly\";\n\tif (totalSeconds >= 86400) return `${Math.round(totalSeconds / 86400)}d`;\n\tif (totalSeconds >= 3600) return `${Math.round(totalSeconds / 3600)}h`;\n\treturn `${Math.max(1, Math.round(totalSeconds / 60))}m`;\n}\n\nfunction detailWindow(label: string, detail: unknown): PlanUsageWindow | undefined {\n\tconst object = asObject(detail);\n\tif (!object) return undefined;\n\tconst usedPercent = usedPercentFromRemaining(object.limit, object.remaining);\n\tif (usedPercent === undefined) return undefined;\n\treturn { label, usedPercent, resetsAt: toEpochMs(object.resetTime) };\n}\n\nexport async function fetchKimiPlanUsage(runtime: ModelRuntime): Promise<PlanUsage | undefined> {\n\tconst resolution = await runtime.getAuth(KIMI_PROVIDER_ID);\n\tconst apiKey = resolution?.auth.apiKey;\n\tif (!apiKey) return undefined;\n\n\tconst response = await fetchWithTimeout(KIMI_USAGE_URL, {\n\t\theaders: { Authorization: `Bearer ${apiKey}`, Accept: \"application/json\" },\n\t});\n\tif (!response.ok) return undefined;\n\tconst payload = asObject(await response.json());\n\tif (!payload) return undefined;\n\n\tconst windows: PlanUsageWindow[] = [];\n\t// Top-level `usage` is the weekly quota; `limits[]` carries the short rate window.\n\tconst weekly = detailWindow(\"Weekly\", payload.usage);\n\tif (weekly) windows.push(weekly);\n\tconst limits = Array.isArray(payload.limits) ? payload.limits : [];\n\tfor (const item of limits) {\n\t\tconst limit = asObject(item);\n\t\tif (!limit) continue;\n\t\tconst window = detailWindow(\n\t\t\tdurationLabel(asObject(limit.window)?.duration, asObject(limit.window)?.timeUnit),\n\t\t\tlimit.detail,\n\t\t);\n\t\tif (window) windows.push(window);\n\t}\n\tif (windows.length === 0) return undefined;\n\treturn { provider: KIMI_PROVIDER_ID, windows };\n}\n"]}
1
+ {"version":3,"file":"kimi-coding.js","sourceRoot":"","sources":["../../../src/core/usage-adapters/kimi-coding.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Kimi for Coding plan usage: `GET https://api.kimi.com/coding/v1/usages`\n * with the stored API key (Bearer). Response shape (undocumented, mirrors\n * other open-source quota dashboards):\n * { usage: { limit, remaining, resetTime },\n * limits: [{ window: { duration, timeUnit }, detail: { limit, remaining, resetTime } }] }\n */\n\nimport type { ModelRuntime } from \"../model-runtime.ts\";\nimport type { PlanUsage, PlanUsageWindow, UsageAuthSnapshot } from \"../usage-service.ts\";\nimport { asNumber, asObject, fetchWithTimeout, toEpochMs, usedPercentFromRemaining } from \"./shared.ts\";\n\nconst KIMI_PROVIDER_ID = \"kimi-coding\";\nconst KIMI_USAGE_URL = \"https://api.kimi.com/coding/v1/usages\";\n\nconst TIME_UNIT_SECONDS: Record<string, number> = {\n\tseconds: 1,\n\tsecond: 1,\n\tminutes: 60,\n\tminute: 60,\n\thours: 3600,\n\thour: 3600,\n\tdays: 86400,\n\tday: 86400,\n\tweeks: 604800,\n\tweek: 604800,\n};\n\nfunction durationLabel(duration: unknown, timeUnit: unknown): string {\n\tconst amount = asNumber(duration);\n\tconst unit = typeof timeUnit === \"string\" ? timeUnit.toLowerCase() : undefined;\n\tconst seconds = amount !== undefined && unit ? TIME_UNIT_SECONDS[unit] : undefined;\n\tif (amount === undefined || seconds === undefined) return \"Limit\";\n\tconst totalSeconds = amount * seconds;\n\tif (totalSeconds >= 604800) return \"Weekly\";\n\tif (totalSeconds >= 86400) return `${Math.round(totalSeconds / 86400)}d`;\n\tif (totalSeconds >= 3600) return `${Math.round(totalSeconds / 3600)}h`;\n\treturn `${Math.max(1, Math.round(totalSeconds / 60))}m`;\n}\n\nfunction detailWindow(label: string, detail: unknown): PlanUsageWindow | undefined {\n\tconst object = asObject(detail);\n\tif (!object) return undefined;\n\tconst usedPercent = usedPercentFromRemaining(object.limit, object.remaining);\n\tif (usedPercent === undefined) return undefined;\n\treturn { label, usedPercent, resetsAt: toEpochMs(object.resetTime) };\n}\n\nexport async function fetchKimiPlanUsage(\n\truntime: ModelRuntime,\n\tauth?: UsageAuthSnapshot,\n): Promise<PlanUsage | undefined> {\n\tconst resolution = auth ? auth.resolution : await runtime.getAuth(KIMI_PROVIDER_ID);\n\tconst apiKey = resolution?.auth.apiKey;\n\tif (!apiKey) return undefined;\n\n\tconst response = await fetchWithTimeout(KIMI_USAGE_URL, {\n\t\theaders: { Authorization: `Bearer ${apiKey}`, Accept: \"application/json\" },\n\t});\n\tif (!response.ok) return undefined;\n\tconst payload = asObject(await response.json());\n\tif (!payload) return undefined;\n\n\tconst windows: PlanUsageWindow[] = [];\n\t// Top-level `usage` is the weekly quota; `limits[]` carries the short rate window.\n\tconst weekly = detailWindow(\"Weekly\", payload.usage);\n\tif (weekly) windows.push(weekly);\n\tconst limits = Array.isArray(payload.limits) ? payload.limits : [];\n\tfor (const item of limits) {\n\t\tconst limit = asObject(item);\n\t\tif (!limit) continue;\n\t\tconst window = detailWindow(\n\t\t\tdurationLabel(asObject(limit.window)?.duration, asObject(limit.window)?.timeUnit),\n\t\t\tlimit.detail,\n\t\t);\n\t\tif (window) windows.push(window);\n\t}\n\tif (windows.length === 0) return undefined;\n\treturn { provider: KIMI_PROVIDER_ID, windows };\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import type { ModelRuntime } from "../model-runtime.ts";
2
- import type { PlanUsage } from "../usage-service.ts";
3
- export declare function fetchCodexPlanUsage(runtime: ModelRuntime): Promise<PlanUsage[] | undefined>;
2
+ import type { PlanUsage, UsageAuthSnapshot } from "../usage-service.ts";
3
+ export declare function resolveCodexHeaders(runtime: ModelRuntime): Promise<Record<string, string> | undefined>;
4
+ export declare function fetchCodexPlanUsage(runtime: ModelRuntime, auth?: UsageAuthSnapshot): Promise<PlanUsage[] | undefined>;
4
5
  //# sourceMappingURL=openai-codex.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai-codex.d.ts","sourceRoot":"","sources":["../../../src/core/usage-adapters/openai-codex.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,qBAAqB,CAAC;AA4NtE,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,GAAG,SAAS,CAAC,CAYjG","sourcesContent":["// Vendored from narumiruna-pi-codex-usage (deleted in Phase 1 of the lunr-ux plan):\n// the pi-auth HTTP query path of `query.ts` plus `normalize.ts` and the backend\n// types from `types.ts`, consolidated into one core module. The codex app-server\n// fallback was dropped; extension-API imports (ExtensionContext, modelRegistry)\n// were rewired to core's ModelRuntime. No runtime dependency on the deleted\n// extension or on extension-repos remains.\n\nimport type { Api, AuthResult, Model } from \"@ashx-j/lunr-ai\";\nimport type { ModelRuntime } from \"../model-runtime.ts\";\nimport type { PlanUsage, PlanUsageWindow } from \"../usage-service.ts\";\nimport { asNumber, asObject, asString, fetchWithTimeout, toEpochMs } from \"./shared.ts\";\n\nconst CODEX_PROVIDER_ID = \"openai-codex\";\nconst CODEX_USAGE_URL = \"https://chatgpt.com/backend-api/wham/usage\";\nconst MAX_ERROR_BODY_CHARS = 600;\n\n// ---------------------------------------------------------------------------\n// Backend payload types (vendored from types.ts)\n// ---------------------------------------------------------------------------\n\ntype RateLimitStatusPayload = {\n\tplan_type?: unknown;\n\trate_limit?: unknown;\n\tadditional_rate_limits?: unknown;\n\tcredits?: unknown;\n\trate_limit_reset_credits?: unknown;\n};\n\ntype BackendRateLimitDetails = {\n\tprimary_window?: unknown;\n\tsecondary_window?: unknown;\n};\n\ntype BackendWindowSnapshot = {\n\tused_percent?: unknown;\n\tlimit_window_seconds?: unknown;\n\treset_at?: unknown;\n};\n\ntype BackendAdditionalRateLimit = {\n\tlimit_name?: unknown;\n\tmetered_feature?: unknown;\n\trate_limit?: unknown;\n};\n\ntype BackendCreditsSnapshot = {\n\thas_credits?: unknown;\n\tunlimited?: unknown;\n\tbalance?: unknown;\n};\n\ntype NormalizedWindow = {\n\tusedPercent: number;\n\twindowMinutes?: number;\n\tresetsAt?: number;\n};\n\ntype NormalizedSnapshot = {\n\tlimitId: string;\n\tlimitName?: string;\n\tprimary?: NormalizedWindow;\n\tsecondary?: NormalizedWindow;\n};\n\ntype CodexUsageReport = {\n\tplanType?: string;\n\tsnapshots: NormalizedSnapshot[];\n};\n\n// ---------------------------------------------------------------------------\n// Payload normalization (vendored from normalize.ts, backend path only)\n// ---------------------------------------------------------------------------\n\nfunction normalizeBackendPayload(payload: RateLimitStatusPayload): CodexUsageReport {\n\tconst snapshots: NormalizedSnapshot[] = [];\n\tconst planType = asString(payload.plan_type);\n\tconst primary = normalizeBackendSnapshot(\"codex\", undefined, payload.rate_limit, payload.credits);\n\tif (primary) snapshots.push(primary);\n\n\tconst additional = Array.isArray(payload.additional_rate_limits) ? payload.additional_rate_limits : [];\n\tfor (const item of additional) {\n\t\tconst additionalLimit = asObject(item) as BackendAdditionalRateLimit | undefined;\n\t\tif (!additionalLimit) continue;\n\t\tconst limitId = asString(additionalLimit.metered_feature) ?? asString(additionalLimit.limit_name);\n\t\tif (!limitId) continue;\n\t\ttry {\n\t\t\tconst snapshot = normalizeBackendSnapshot(\n\t\t\t\tlimitId,\n\t\t\t\tasString(additionalLimit.limit_name),\n\t\t\t\tadditionalLimit.rate_limit,\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\tif (snapshot) snapshots.push(snapshot);\n\t\t} catch {\n\t\t\t// Optional additional buckets must not hide otherwise usable primary usage.\n\t\t}\n\t}\n\n\tif (snapshots.length === 0) {\n\t\tthrow new Error(\"Codex usage endpoint returned no displayable usage data.\");\n\t}\n\treturn { planType, snapshots };\n}\n\nfunction normalizeBackendSnapshot(\n\tlimitId: string,\n\tlimitName: string | undefined,\n\trateLimit: unknown,\n\tcredits: unknown,\n): NormalizedSnapshot | undefined {\n\tif (rateLimit === null || rateLimit === undefined) {\n\t\treturn normalizeBackendCredits(credits) ? { limitId, limitName } : undefined;\n\t}\n\tconst details = asObject(rateLimit) as BackendRateLimitDetails | undefined;\n\tif (!details) throw new Error(\"rate limit was not an object.\");\n\tconst primary = normalizeBackendWindow(details.primary_window);\n\tconst secondary = normalizeBackendWindow(details.secondary_window);\n\tif (!primary && !secondary && !normalizeBackendCredits(credits)) return undefined;\n\treturn { limitId, limitName, primary, secondary };\n}\n\nfunction normalizeBackendWindow(value: unknown): NormalizedWindow | undefined {\n\tif (value === null || value === undefined) return undefined;\n\tconst window = asObject(value) as BackendWindowSnapshot | undefined;\n\tif (!window) throw new Error(\"rate-limit window was not an object.\");\n\tconst usedPercent = asNumber(window.used_percent);\n\tif (usedPercent === undefined) return undefined;\n\tconst limitSeconds = asNumber(window.limit_window_seconds);\n\treturn {\n\t\tusedPercent,\n\t\twindowMinutes: limitSeconds && limitSeconds > 0 ? Math.ceil(limitSeconds / 60) : undefined,\n\t\tresetsAt: toEpochMs(window.reset_at),\n\t};\n}\n\nfunction normalizeBackendCredits(value: unknown): boolean {\n\tconst credits = asObject(value) as BackendCreditsSnapshot | undefined;\n\tif (!credits) return false;\n\treturn credits.has_credits !== undefined && credits.unlimited !== undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Auth resolution via core ModelRuntime (rewired from ctx.modelRegistry)\n// ---------------------------------------------------------------------------\n\nasync function resolveCodexHeaders(runtime: ModelRuntime): Promise<Record<string, string> | undefined> {\n\tconst candidates: Model<Api>[] = [];\n\tconst seen = new Set<string>();\n\tconst add = (model: Model<Api> | undefined) => {\n\t\tif (!model || model.provider !== CODEX_PROVIDER_ID) return;\n\t\tconst key = `${model.provider}/${model.id}`;\n\t\tif (seen.has(key)) return;\n\t\tseen.add(key);\n\t\tcandidates.push(model);\n\t};\n\tfor (const model of runtime.getAvailableSnapshot()) add(model);\n\tfor (const model of runtime.getModels()) add(model);\n\n\tfor (const model of candidates) {\n\t\tlet resolution: AuthResult | undefined;\n\t\ttry {\n\t\t\tresolution = await runtime.getAuth(model);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tif (!resolution) continue;\n\t\tconst headers: Record<string, string> = {};\n\t\tfor (const [name, value] of Object.entries(resolution.auth.headers ?? {})) {\n\t\t\tif (value !== null && value !== undefined) headers[name] = String(value);\n\t\t}\n\t\tif (!hasHeader(headers, \"Authorization\") && resolution.auth.apiKey) {\n\t\t\theaders.Authorization = `Bearer ${resolution.auth.apiKey}`;\n\t\t}\n\t\tif (!hasHeader(headers, \"User-Agent\")) {\n\t\t\theaders[\"User-Agent\"] = \"lunr-usage-service\";\n\t\t}\n\t\tif (hasHeader(headers, \"Authorization\")) return headers;\n\t}\n\treturn undefined;\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string): boolean {\n\treturn Object.keys(headers).some((key) => key.toLowerCase() === name.toLowerCase());\n}\n\nfunction redactErrorBody(body: string): string {\n\tconst redacted = body\n\t\t.replace(/Bearer\\s+[A-Za-z0-9._~+/=-]+/gi, \"Bearer <redacted>\")\n\t\t.replace(/\"access_token\"\\s*:\\s*\"[^\"]+\"/gi, '\"access_token\":\"<redacted>\"')\n\t\t.trim();\n\treturn redacted.length > MAX_ERROR_BODY_CHARS ? `${redacted.slice(0, MAX_ERROR_BODY_CHARS - 1)}…` : redacted;\n}\n\n// ---------------------------------------------------------------------------\n// PlanUsage mapping\n// ---------------------------------------------------------------------------\n\nfunction windowLabel(window: NormalizedWindow, fallback: string | undefined): string {\n\tconst minutes = window.windowMinutes;\n\tif (minutes === undefined) return fallback ?? \"Limit\";\n\tif (minutes >= 7 * 24 * 60) return \"Weekly\";\n\tif (minutes >= 24 * 60) return `${Math.round(minutes / (24 * 60))}d`;\n\tif (minutes >= 60) return `${Math.round(minutes / 60)}h`;\n\treturn `${minutes}m`;\n}\n\nfunction toPlanUsage(report: CodexUsageReport): PlanUsage[] {\n\treturn report.snapshots.flatMap((snapshot, index) => {\n\t\t// Longer window (weekly) first, shorter (5h) second — matches /usage layout.\n\t\tconst windows: PlanUsageWindow[] = [];\n\t\tfor (const window of [snapshot.secondary, snapshot.primary]) {\n\t\t\tif (!window) continue;\n\t\t\twindows.push({\n\t\t\t\tlabel: windowLabel(window, snapshot.limitName),\n\t\t\t\tusedPercent: window.usedPercent,\n\t\t\t\tresetsAt: window.resetsAt,\n\t\t\t});\n\t\t}\n\t\tif (windows.length === 0) return [];\n\t\treturn [\n\t\t\t{\n\t\t\t\tprovider: CODEX_PROVIDER_ID,\n\t\t\t\tplanLabel: index === 0 ? report.planType : (snapshot.limitName ?? snapshot.limitId),\n\t\t\t\twindows,\n\t\t\t},\n\t\t];\n\t});\n}\n\nexport async function fetchCodexPlanUsage(runtime: ModelRuntime): Promise<PlanUsage[] | undefined> {\n\tconst headers = await resolveCodexHeaders(runtime);\n\tif (!headers) return undefined;\n\n\tconst response = await fetchWithTimeout(CODEX_USAGE_URL, { headers });\n\tconst text = await response.text();\n\tif (!response.ok) {\n\t\tthrow new Error(`Codex usage endpoint returned ${response.status}: ${redactErrorBody(text)}`);\n\t}\n\tconst payload = asObject(JSON.parse(text)) as RateLimitStatusPayload | undefined;\n\tif (!payload) return undefined;\n\treturn toPlanUsage(normalizeBackendPayload(payload));\n}\n"]}
1
+ {"version":3,"file":"openai-codex.d.ts","sourceRoot":"","sources":["../../../src/core/usage-adapters/openai-codex.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAmB,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAwIzF,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,CAkC5G;AAkDD,wBAAsB,mBAAmB,CACxC,OAAO,EAAE,YAAY,EACrB,IAAI,CAAC,EAAE,iBAAiB,GACtB,OAAO,CAAC,SAAS,EAAE,GAAG,SAAS,CAAC,CAYlC","sourcesContent":["// Vendored from narumiruna-pi-codex-usage (deleted in Phase 1 of the lunr-ux plan):\n// the pi-auth HTTP query path of `query.ts` plus `normalize.ts` and the backend\n// types from `types.ts`, consolidated into one core module. The codex app-server\n// fallback was dropped; extension-API imports (ExtensionContext, modelRegistry)\n// were rewired to core's ModelRuntime. No runtime dependency on the deleted\n// extension or on extension-repos remains.\n\nimport type { Api, AuthResult, Model } from \"@ashx-j/lunr-ai\";\nimport type { ModelRuntime } from \"../model-runtime.ts\";\nimport type { PlanUsage, PlanUsageWindow, UsageAuthSnapshot } from \"../usage-service.ts\";\nimport { asNumber, asObject, asString, fetchWithTimeout, toEpochMs } from \"./shared.ts\";\n\nconst CODEX_PROVIDER_ID = \"openai-codex\";\nconst CODEX_USAGE_URL = \"https://chatgpt.com/backend-api/wham/usage\";\nconst MAX_ERROR_BODY_CHARS = 600;\n\n// ---------------------------------------------------------------------------\n// Backend payload types (vendored from types.ts)\n// ---------------------------------------------------------------------------\n\ntype RateLimitStatusPayload = {\n\tplan_type?: unknown;\n\trate_limit?: unknown;\n\tadditional_rate_limits?: unknown;\n\tcredits?: unknown;\n\trate_limit_reset_credits?: unknown;\n};\n\ntype BackendRateLimitDetails = {\n\tprimary_window?: unknown;\n\tsecondary_window?: unknown;\n};\n\ntype BackendWindowSnapshot = {\n\tused_percent?: unknown;\n\tlimit_window_seconds?: unknown;\n\treset_at?: unknown;\n};\n\ntype BackendAdditionalRateLimit = {\n\tlimit_name?: unknown;\n\tmetered_feature?: unknown;\n\trate_limit?: unknown;\n};\n\ntype BackendCreditsSnapshot = {\n\thas_credits?: unknown;\n\tunlimited?: unknown;\n\tbalance?: unknown;\n};\n\ntype NormalizedWindow = {\n\tusedPercent: number;\n\twindowMinutes?: number;\n\tresetsAt?: number;\n};\n\ntype NormalizedSnapshot = {\n\tlimitId: string;\n\tlimitName?: string;\n\tprimary?: NormalizedWindow;\n\tsecondary?: NormalizedWindow;\n};\n\ntype CodexUsageReport = {\n\tplanType?: string;\n\tsnapshots: NormalizedSnapshot[];\n};\n\n// ---------------------------------------------------------------------------\n// Payload normalization (vendored from normalize.ts, backend path only)\n// ---------------------------------------------------------------------------\n\nfunction normalizeBackendPayload(payload: RateLimitStatusPayload): CodexUsageReport {\n\tconst snapshots: NormalizedSnapshot[] = [];\n\tconst planType = asString(payload.plan_type);\n\tconst primary = normalizeBackendSnapshot(\"codex\", undefined, payload.rate_limit, payload.credits);\n\tif (primary) snapshots.push(primary);\n\n\tconst additional = Array.isArray(payload.additional_rate_limits) ? payload.additional_rate_limits : [];\n\tfor (const item of additional) {\n\t\tconst additionalLimit = asObject(item) as BackendAdditionalRateLimit | undefined;\n\t\tif (!additionalLimit) continue;\n\t\tconst limitId = asString(additionalLimit.metered_feature) ?? asString(additionalLimit.limit_name);\n\t\tif (!limitId) continue;\n\t\ttry {\n\t\t\tconst snapshot = normalizeBackendSnapshot(\n\t\t\t\tlimitId,\n\t\t\t\tasString(additionalLimit.limit_name),\n\t\t\t\tadditionalLimit.rate_limit,\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\tif (snapshot) snapshots.push(snapshot);\n\t\t} catch {\n\t\t\t// Optional additional buckets must not hide otherwise usable primary usage.\n\t\t}\n\t}\n\n\tif (snapshots.length === 0) {\n\t\tthrow new Error(\"Codex usage endpoint returned no displayable usage data.\");\n\t}\n\treturn { planType, snapshots };\n}\n\nfunction normalizeBackendSnapshot(\n\tlimitId: string,\n\tlimitName: string | undefined,\n\trateLimit: unknown,\n\tcredits: unknown,\n): NormalizedSnapshot | undefined {\n\tif (rateLimit === null || rateLimit === undefined) {\n\t\treturn normalizeBackendCredits(credits) ? { limitId, limitName } : undefined;\n\t}\n\tconst details = asObject(rateLimit) as BackendRateLimitDetails | undefined;\n\tif (!details) throw new Error(\"rate limit was not an object.\");\n\tconst primary = normalizeBackendWindow(details.primary_window);\n\tconst secondary = normalizeBackendWindow(details.secondary_window);\n\tif (!primary && !secondary && !normalizeBackendCredits(credits)) return undefined;\n\treturn { limitId, limitName, primary, secondary };\n}\n\nfunction normalizeBackendWindow(value: unknown): NormalizedWindow | undefined {\n\tif (value === null || value === undefined) return undefined;\n\tconst window = asObject(value) as BackendWindowSnapshot | undefined;\n\tif (!window) throw new Error(\"rate-limit window was not an object.\");\n\tconst usedPercent = asNumber(window.used_percent);\n\tif (usedPercent === undefined) return undefined;\n\tconst limitSeconds = asNumber(window.limit_window_seconds);\n\treturn {\n\t\tusedPercent,\n\t\twindowMinutes: limitSeconds && limitSeconds > 0 ? Math.ceil(limitSeconds / 60) : undefined,\n\t\tresetsAt: toEpochMs(window.reset_at),\n\t};\n}\n\nfunction normalizeBackendCredits(value: unknown): boolean {\n\tconst credits = asObject(value) as BackendCreditsSnapshot | undefined;\n\tif (!credits) return false;\n\treturn credits.has_credits !== undefined && credits.unlimited !== undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Auth resolution via core ModelRuntime (rewired from ctx.modelRegistry)\n// ---------------------------------------------------------------------------\n\nexport async function resolveCodexHeaders(runtime: ModelRuntime): Promise<Record<string, string> | undefined> {\n\tconst candidates: Model<Api>[] = [];\n\tconst seen = new Set<string>();\n\tconst add = (model: Model<Api> | undefined) => {\n\t\tif (!model || model.provider !== CODEX_PROVIDER_ID) return;\n\t\tconst key = `${model.provider}/${model.id}`;\n\t\tif (seen.has(key)) return;\n\t\tseen.add(key);\n\t\tcandidates.push(model);\n\t};\n\tfor (const model of runtime.getAvailableSnapshot()) add(model);\n\tfor (const model of runtime.getModels()) add(model);\n\n\tfor (const model of candidates) {\n\t\tlet resolution: AuthResult | undefined;\n\t\ttry {\n\t\t\tresolution = await runtime.getAuth(model);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tif (!resolution) continue;\n\t\tconst headers: Record<string, string> = {};\n\t\tfor (const [name, value] of Object.entries(resolution.auth.headers ?? {})) {\n\t\t\tif (value !== null && value !== undefined) headers[name] = String(value);\n\t\t}\n\t\tif (!hasHeader(headers, \"Authorization\") && resolution.auth.apiKey) {\n\t\t\theaders.Authorization = `Bearer ${resolution.auth.apiKey}`;\n\t\t}\n\t\tif (!hasHeader(headers, \"User-Agent\")) {\n\t\t\theaders[\"User-Agent\"] = \"lunr-usage-service\";\n\t\t}\n\t\tif (hasHeader(headers, \"Authorization\")) return headers;\n\t}\n\treturn undefined;\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string): boolean {\n\treturn Object.keys(headers).some((key) => key.toLowerCase() === name.toLowerCase());\n}\n\nfunction redactErrorBody(body: string): string {\n\tconst redacted = body\n\t\t.replace(/Bearer\\s+[A-Za-z0-9._~+/=-]+/gi, \"Bearer <redacted>\")\n\t\t.replace(/\"access_token\"\\s*:\\s*\"[^\"]+\"/gi, '\"access_token\":\"<redacted>\"')\n\t\t.trim();\n\treturn redacted.length > MAX_ERROR_BODY_CHARS ? `${redacted.slice(0, MAX_ERROR_BODY_CHARS - 1)}…` : redacted;\n}\n\n// ---------------------------------------------------------------------------\n// PlanUsage mapping\n// ---------------------------------------------------------------------------\n\nfunction windowLabel(window: NormalizedWindow, fallback: string | undefined): string {\n\tconst minutes = window.windowMinutes;\n\tif (minutes === undefined) return fallback ?? \"Limit\";\n\tif (minutes >= 7 * 24 * 60) return \"Weekly\";\n\tif (minutes >= 24 * 60) return `${Math.round(minutes / (24 * 60))}d`;\n\tif (minutes >= 60) return `${Math.round(minutes / 60)}h`;\n\treturn `${minutes}m`;\n}\n\nfunction toPlanUsage(report: CodexUsageReport): PlanUsage[] {\n\treturn report.snapshots.flatMap((snapshot, index) => {\n\t\t// Longer window (weekly) first, shorter (5h) second — matches /usage layout.\n\t\tconst windows: PlanUsageWindow[] = [];\n\t\tfor (const window of [snapshot.secondary, snapshot.primary]) {\n\t\t\tif (!window) continue;\n\t\t\twindows.push({\n\t\t\t\tlabel: windowLabel(window, snapshot.limitName),\n\t\t\t\tusedPercent: window.usedPercent,\n\t\t\t\tresetsAt: window.resetsAt,\n\t\t\t});\n\t\t}\n\t\tif (windows.length === 0) return [];\n\t\treturn [\n\t\t\t{\n\t\t\t\tprovider: CODEX_PROVIDER_ID,\n\t\t\t\tplanLabel: index === 0 ? report.planType : (snapshot.limitName ?? snapshot.limitId),\n\t\t\t\twindows,\n\t\t\t},\n\t\t];\n\t});\n}\n\nexport async function fetchCodexPlanUsage(\n\truntime: ModelRuntime,\n\tauth?: UsageAuthSnapshot,\n): Promise<PlanUsage[] | undefined> {\n\tconst headers = auth ? auth.codexHeaders : await resolveCodexHeaders(runtime);\n\tif (!headers) return undefined;\n\n\tconst response = await fetchWithTimeout(CODEX_USAGE_URL, { headers });\n\tconst text = await response.text();\n\tif (!response.ok) {\n\t\tthrow new Error(`Codex usage endpoint returned ${response.status}: ${redactErrorBody(text)}`);\n\t}\n\tconst payload = asObject(JSON.parse(text)) as RateLimitStatusPayload | undefined;\n\tif (!payload) return undefined;\n\treturn toPlanUsage(normalizeBackendPayload(payload));\n}\n"]}
@@ -77,7 +77,7 @@ function normalizeBackendCredits(value) {
77
77
  // ---------------------------------------------------------------------------
78
78
  // Auth resolution via core ModelRuntime (rewired from ctx.modelRegistry)
79
79
  // ---------------------------------------------------------------------------
80
- async function resolveCodexHeaders(runtime) {
80
+ export async function resolveCodexHeaders(runtime) {
81
81
  const candidates = [];
82
82
  const seen = new Set();
83
83
  const add = (model) => {
@@ -168,8 +168,8 @@ function toPlanUsage(report) {
168
168
  ];
169
169
  });
170
170
  }
171
- export async function fetchCodexPlanUsage(runtime) {
172
- const headers = await resolveCodexHeaders(runtime);
171
+ export async function fetchCodexPlanUsage(runtime, auth) {
172
+ const headers = auth ? auth.codexHeaders : await resolveCodexHeaders(runtime);
173
173
  if (!headers)
174
174
  return undefined;
175
175
  const response = await fetchWithTimeout(CODEX_USAGE_URL, { headers });
@@ -1 +1 @@
1
- {"version":3,"file":"openai-codex.js","sourceRoot":"","sources":["../../../src/core/usage-adapters/openai-codex.ts"],"names":[],"mappings":"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","sourcesContent":["// Vendored from narumiruna-pi-codex-usage (deleted in Phase 1 of the lunr-ux plan):\n// the pi-auth HTTP query path of `query.ts` plus `normalize.ts` and the backend\n// types from `types.ts`, consolidated into one core module. The codex app-server\n// fallback was dropped; extension-API imports (ExtensionContext, modelRegistry)\n// were rewired to core's ModelRuntime. No runtime dependency on the deleted\n// extension or on extension-repos remains.\n\nimport type { Api, AuthResult, Model } from \"@ashx-j/lunr-ai\";\nimport type { ModelRuntime } from \"../model-runtime.ts\";\nimport type { PlanUsage, PlanUsageWindow } from \"../usage-service.ts\";\nimport { asNumber, asObject, asString, fetchWithTimeout, toEpochMs } from \"./shared.ts\";\n\nconst CODEX_PROVIDER_ID = \"openai-codex\";\nconst CODEX_USAGE_URL = \"https://chatgpt.com/backend-api/wham/usage\";\nconst MAX_ERROR_BODY_CHARS = 600;\n\n// ---------------------------------------------------------------------------\n// Backend payload types (vendored from types.ts)\n// ---------------------------------------------------------------------------\n\ntype RateLimitStatusPayload = {\n\tplan_type?: unknown;\n\trate_limit?: unknown;\n\tadditional_rate_limits?: unknown;\n\tcredits?: unknown;\n\trate_limit_reset_credits?: unknown;\n};\n\ntype BackendRateLimitDetails = {\n\tprimary_window?: unknown;\n\tsecondary_window?: unknown;\n};\n\ntype BackendWindowSnapshot = {\n\tused_percent?: unknown;\n\tlimit_window_seconds?: unknown;\n\treset_at?: unknown;\n};\n\ntype BackendAdditionalRateLimit = {\n\tlimit_name?: unknown;\n\tmetered_feature?: unknown;\n\trate_limit?: unknown;\n};\n\ntype BackendCreditsSnapshot = {\n\thas_credits?: unknown;\n\tunlimited?: unknown;\n\tbalance?: unknown;\n};\n\ntype NormalizedWindow = {\n\tusedPercent: number;\n\twindowMinutes?: number;\n\tresetsAt?: number;\n};\n\ntype NormalizedSnapshot = {\n\tlimitId: string;\n\tlimitName?: string;\n\tprimary?: NormalizedWindow;\n\tsecondary?: NormalizedWindow;\n};\n\ntype CodexUsageReport = {\n\tplanType?: string;\n\tsnapshots: NormalizedSnapshot[];\n};\n\n// ---------------------------------------------------------------------------\n// Payload normalization (vendored from normalize.ts, backend path only)\n// ---------------------------------------------------------------------------\n\nfunction normalizeBackendPayload(payload: RateLimitStatusPayload): CodexUsageReport {\n\tconst snapshots: NormalizedSnapshot[] = [];\n\tconst planType = asString(payload.plan_type);\n\tconst primary = normalizeBackendSnapshot(\"codex\", undefined, payload.rate_limit, payload.credits);\n\tif (primary) snapshots.push(primary);\n\n\tconst additional = Array.isArray(payload.additional_rate_limits) ? payload.additional_rate_limits : [];\n\tfor (const item of additional) {\n\t\tconst additionalLimit = asObject(item) as BackendAdditionalRateLimit | undefined;\n\t\tif (!additionalLimit) continue;\n\t\tconst limitId = asString(additionalLimit.metered_feature) ?? asString(additionalLimit.limit_name);\n\t\tif (!limitId) continue;\n\t\ttry {\n\t\t\tconst snapshot = normalizeBackendSnapshot(\n\t\t\t\tlimitId,\n\t\t\t\tasString(additionalLimit.limit_name),\n\t\t\t\tadditionalLimit.rate_limit,\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\tif (snapshot) snapshots.push(snapshot);\n\t\t} catch {\n\t\t\t// Optional additional buckets must not hide otherwise usable primary usage.\n\t\t}\n\t}\n\n\tif (snapshots.length === 0) {\n\t\tthrow new Error(\"Codex usage endpoint returned no displayable usage data.\");\n\t}\n\treturn { planType, snapshots };\n}\n\nfunction normalizeBackendSnapshot(\n\tlimitId: string,\n\tlimitName: string | undefined,\n\trateLimit: unknown,\n\tcredits: unknown,\n): NormalizedSnapshot | undefined {\n\tif (rateLimit === null || rateLimit === undefined) {\n\t\treturn normalizeBackendCredits(credits) ? { limitId, limitName } : undefined;\n\t}\n\tconst details = asObject(rateLimit) as BackendRateLimitDetails | undefined;\n\tif (!details) throw new Error(\"rate limit was not an object.\");\n\tconst primary = normalizeBackendWindow(details.primary_window);\n\tconst secondary = normalizeBackendWindow(details.secondary_window);\n\tif (!primary && !secondary && !normalizeBackendCredits(credits)) return undefined;\n\treturn { limitId, limitName, primary, secondary };\n}\n\nfunction normalizeBackendWindow(value: unknown): NormalizedWindow | undefined {\n\tif (value === null || value === undefined) return undefined;\n\tconst window = asObject(value) as BackendWindowSnapshot | undefined;\n\tif (!window) throw new Error(\"rate-limit window was not an object.\");\n\tconst usedPercent = asNumber(window.used_percent);\n\tif (usedPercent === undefined) return undefined;\n\tconst limitSeconds = asNumber(window.limit_window_seconds);\n\treturn {\n\t\tusedPercent,\n\t\twindowMinutes: limitSeconds && limitSeconds > 0 ? Math.ceil(limitSeconds / 60) : undefined,\n\t\tresetsAt: toEpochMs(window.reset_at),\n\t};\n}\n\nfunction normalizeBackendCredits(value: unknown): boolean {\n\tconst credits = asObject(value) as BackendCreditsSnapshot | undefined;\n\tif (!credits) return false;\n\treturn credits.has_credits !== undefined && credits.unlimited !== undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Auth resolution via core ModelRuntime (rewired from ctx.modelRegistry)\n// ---------------------------------------------------------------------------\n\nasync function resolveCodexHeaders(runtime: ModelRuntime): Promise<Record<string, string> | undefined> {\n\tconst candidates: Model<Api>[] = [];\n\tconst seen = new Set<string>();\n\tconst add = (model: Model<Api> | undefined) => {\n\t\tif (!model || model.provider !== CODEX_PROVIDER_ID) return;\n\t\tconst key = `${model.provider}/${model.id}`;\n\t\tif (seen.has(key)) return;\n\t\tseen.add(key);\n\t\tcandidates.push(model);\n\t};\n\tfor (const model of runtime.getAvailableSnapshot()) add(model);\n\tfor (const model of runtime.getModels()) add(model);\n\n\tfor (const model of candidates) {\n\t\tlet resolution: AuthResult | undefined;\n\t\ttry {\n\t\t\tresolution = await runtime.getAuth(model);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tif (!resolution) continue;\n\t\tconst headers: Record<string, string> = {};\n\t\tfor (const [name, value] of Object.entries(resolution.auth.headers ?? {})) {\n\t\t\tif (value !== null && value !== undefined) headers[name] = String(value);\n\t\t}\n\t\tif (!hasHeader(headers, \"Authorization\") && resolution.auth.apiKey) {\n\t\t\theaders.Authorization = `Bearer ${resolution.auth.apiKey}`;\n\t\t}\n\t\tif (!hasHeader(headers, \"User-Agent\")) {\n\t\t\theaders[\"User-Agent\"] = \"lunr-usage-service\";\n\t\t}\n\t\tif (hasHeader(headers, \"Authorization\")) return headers;\n\t}\n\treturn undefined;\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string): boolean {\n\treturn Object.keys(headers).some((key) => key.toLowerCase() === name.toLowerCase());\n}\n\nfunction redactErrorBody(body: string): string {\n\tconst redacted = body\n\t\t.replace(/Bearer\\s+[A-Za-z0-9._~+/=-]+/gi, \"Bearer <redacted>\")\n\t\t.replace(/\"access_token\"\\s*:\\s*\"[^\"]+\"/gi, '\"access_token\":\"<redacted>\"')\n\t\t.trim();\n\treturn redacted.length > MAX_ERROR_BODY_CHARS ? `${redacted.slice(0, MAX_ERROR_BODY_CHARS - 1)}…` : redacted;\n}\n\n// ---------------------------------------------------------------------------\n// PlanUsage mapping\n// ---------------------------------------------------------------------------\n\nfunction windowLabel(window: NormalizedWindow, fallback: string | undefined): string {\n\tconst minutes = window.windowMinutes;\n\tif (minutes === undefined) return fallback ?? \"Limit\";\n\tif (minutes >= 7 * 24 * 60) return \"Weekly\";\n\tif (minutes >= 24 * 60) return `${Math.round(minutes / (24 * 60))}d`;\n\tif (minutes >= 60) return `${Math.round(minutes / 60)}h`;\n\treturn `${minutes}m`;\n}\n\nfunction toPlanUsage(report: CodexUsageReport): PlanUsage[] {\n\treturn report.snapshots.flatMap((snapshot, index) => {\n\t\t// Longer window (weekly) first, shorter (5h) second — matches /usage layout.\n\t\tconst windows: PlanUsageWindow[] = [];\n\t\tfor (const window of [snapshot.secondary, snapshot.primary]) {\n\t\t\tif (!window) continue;\n\t\t\twindows.push({\n\t\t\t\tlabel: windowLabel(window, snapshot.limitName),\n\t\t\t\tusedPercent: window.usedPercent,\n\t\t\t\tresetsAt: window.resetsAt,\n\t\t\t});\n\t\t}\n\t\tif (windows.length === 0) return [];\n\t\treturn [\n\t\t\t{\n\t\t\t\tprovider: CODEX_PROVIDER_ID,\n\t\t\t\tplanLabel: index === 0 ? report.planType : (snapshot.limitName ?? snapshot.limitId),\n\t\t\t\twindows,\n\t\t\t},\n\t\t];\n\t});\n}\n\nexport async function fetchCodexPlanUsage(runtime: ModelRuntime): Promise<PlanUsage[] | undefined> {\n\tconst headers = await resolveCodexHeaders(runtime);\n\tif (!headers) return undefined;\n\n\tconst response = await fetchWithTimeout(CODEX_USAGE_URL, { headers });\n\tconst text = await response.text();\n\tif (!response.ok) {\n\t\tthrow new Error(`Codex usage endpoint returned ${response.status}: ${redactErrorBody(text)}`);\n\t}\n\tconst payload = asObject(JSON.parse(text)) as RateLimitStatusPayload | undefined;\n\tif (!payload) return undefined;\n\treturn toPlanUsage(normalizeBackendPayload(payload));\n}\n"]}
1
+ {"version":3,"file":"openai-codex.js","sourceRoot":"","sources":["../../../src/core/usage-adapters/openai-codex.ts"],"names":[],"mappings":"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","sourcesContent":["// Vendored from narumiruna-pi-codex-usage (deleted in Phase 1 of the lunr-ux plan):\n// the pi-auth HTTP query path of `query.ts` plus `normalize.ts` and the backend\n// types from `types.ts`, consolidated into one core module. The codex app-server\n// fallback was dropped; extension-API imports (ExtensionContext, modelRegistry)\n// were rewired to core's ModelRuntime. No runtime dependency on the deleted\n// extension or on extension-repos remains.\n\nimport type { Api, AuthResult, Model } from \"@ashx-j/lunr-ai\";\nimport type { ModelRuntime } from \"../model-runtime.ts\";\nimport type { PlanUsage, PlanUsageWindow, UsageAuthSnapshot } from \"../usage-service.ts\";\nimport { asNumber, asObject, asString, fetchWithTimeout, toEpochMs } from \"./shared.ts\";\n\nconst CODEX_PROVIDER_ID = \"openai-codex\";\nconst CODEX_USAGE_URL = \"https://chatgpt.com/backend-api/wham/usage\";\nconst MAX_ERROR_BODY_CHARS = 600;\n\n// ---------------------------------------------------------------------------\n// Backend payload types (vendored from types.ts)\n// ---------------------------------------------------------------------------\n\ntype RateLimitStatusPayload = {\n\tplan_type?: unknown;\n\trate_limit?: unknown;\n\tadditional_rate_limits?: unknown;\n\tcredits?: unknown;\n\trate_limit_reset_credits?: unknown;\n};\n\ntype BackendRateLimitDetails = {\n\tprimary_window?: unknown;\n\tsecondary_window?: unknown;\n};\n\ntype BackendWindowSnapshot = {\n\tused_percent?: unknown;\n\tlimit_window_seconds?: unknown;\n\treset_at?: unknown;\n};\n\ntype BackendAdditionalRateLimit = {\n\tlimit_name?: unknown;\n\tmetered_feature?: unknown;\n\trate_limit?: unknown;\n};\n\ntype BackendCreditsSnapshot = {\n\thas_credits?: unknown;\n\tunlimited?: unknown;\n\tbalance?: unknown;\n};\n\ntype NormalizedWindow = {\n\tusedPercent: number;\n\twindowMinutes?: number;\n\tresetsAt?: number;\n};\n\ntype NormalizedSnapshot = {\n\tlimitId: string;\n\tlimitName?: string;\n\tprimary?: NormalizedWindow;\n\tsecondary?: NormalizedWindow;\n};\n\ntype CodexUsageReport = {\n\tplanType?: string;\n\tsnapshots: NormalizedSnapshot[];\n};\n\n// ---------------------------------------------------------------------------\n// Payload normalization (vendored from normalize.ts, backend path only)\n// ---------------------------------------------------------------------------\n\nfunction normalizeBackendPayload(payload: RateLimitStatusPayload): CodexUsageReport {\n\tconst snapshots: NormalizedSnapshot[] = [];\n\tconst planType = asString(payload.plan_type);\n\tconst primary = normalizeBackendSnapshot(\"codex\", undefined, payload.rate_limit, payload.credits);\n\tif (primary) snapshots.push(primary);\n\n\tconst additional = Array.isArray(payload.additional_rate_limits) ? payload.additional_rate_limits : [];\n\tfor (const item of additional) {\n\t\tconst additionalLimit = asObject(item) as BackendAdditionalRateLimit | undefined;\n\t\tif (!additionalLimit) continue;\n\t\tconst limitId = asString(additionalLimit.metered_feature) ?? asString(additionalLimit.limit_name);\n\t\tif (!limitId) continue;\n\t\ttry {\n\t\t\tconst snapshot = normalizeBackendSnapshot(\n\t\t\t\tlimitId,\n\t\t\t\tasString(additionalLimit.limit_name),\n\t\t\t\tadditionalLimit.rate_limit,\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\tif (snapshot) snapshots.push(snapshot);\n\t\t} catch {\n\t\t\t// Optional additional buckets must not hide otherwise usable primary usage.\n\t\t}\n\t}\n\n\tif (snapshots.length === 0) {\n\t\tthrow new Error(\"Codex usage endpoint returned no displayable usage data.\");\n\t}\n\treturn { planType, snapshots };\n}\n\nfunction normalizeBackendSnapshot(\n\tlimitId: string,\n\tlimitName: string | undefined,\n\trateLimit: unknown,\n\tcredits: unknown,\n): NormalizedSnapshot | undefined {\n\tif (rateLimit === null || rateLimit === undefined) {\n\t\treturn normalizeBackendCredits(credits) ? { limitId, limitName } : undefined;\n\t}\n\tconst details = asObject(rateLimit) as BackendRateLimitDetails | undefined;\n\tif (!details) throw new Error(\"rate limit was not an object.\");\n\tconst primary = normalizeBackendWindow(details.primary_window);\n\tconst secondary = normalizeBackendWindow(details.secondary_window);\n\tif (!primary && !secondary && !normalizeBackendCredits(credits)) return undefined;\n\treturn { limitId, limitName, primary, secondary };\n}\n\nfunction normalizeBackendWindow(value: unknown): NormalizedWindow | undefined {\n\tif (value === null || value === undefined) return undefined;\n\tconst window = asObject(value) as BackendWindowSnapshot | undefined;\n\tif (!window) throw new Error(\"rate-limit window was not an object.\");\n\tconst usedPercent = asNumber(window.used_percent);\n\tif (usedPercent === undefined) return undefined;\n\tconst limitSeconds = asNumber(window.limit_window_seconds);\n\treturn {\n\t\tusedPercent,\n\t\twindowMinutes: limitSeconds && limitSeconds > 0 ? Math.ceil(limitSeconds / 60) : undefined,\n\t\tresetsAt: toEpochMs(window.reset_at),\n\t};\n}\n\nfunction normalizeBackendCredits(value: unknown): boolean {\n\tconst credits = asObject(value) as BackendCreditsSnapshot | undefined;\n\tif (!credits) return false;\n\treturn credits.has_credits !== undefined && credits.unlimited !== undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Auth resolution via core ModelRuntime (rewired from ctx.modelRegistry)\n// ---------------------------------------------------------------------------\n\nexport async function resolveCodexHeaders(runtime: ModelRuntime): Promise<Record<string, string> | undefined> {\n\tconst candidates: Model<Api>[] = [];\n\tconst seen = new Set<string>();\n\tconst add = (model: Model<Api> | undefined) => {\n\t\tif (!model || model.provider !== CODEX_PROVIDER_ID) return;\n\t\tconst key = `${model.provider}/${model.id}`;\n\t\tif (seen.has(key)) return;\n\t\tseen.add(key);\n\t\tcandidates.push(model);\n\t};\n\tfor (const model of runtime.getAvailableSnapshot()) add(model);\n\tfor (const model of runtime.getModels()) add(model);\n\n\tfor (const model of candidates) {\n\t\tlet resolution: AuthResult | undefined;\n\t\ttry {\n\t\t\tresolution = await runtime.getAuth(model);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tif (!resolution) continue;\n\t\tconst headers: Record<string, string> = {};\n\t\tfor (const [name, value] of Object.entries(resolution.auth.headers ?? {})) {\n\t\t\tif (value !== null && value !== undefined) headers[name] = String(value);\n\t\t}\n\t\tif (!hasHeader(headers, \"Authorization\") && resolution.auth.apiKey) {\n\t\t\theaders.Authorization = `Bearer ${resolution.auth.apiKey}`;\n\t\t}\n\t\tif (!hasHeader(headers, \"User-Agent\")) {\n\t\t\theaders[\"User-Agent\"] = \"lunr-usage-service\";\n\t\t}\n\t\tif (hasHeader(headers, \"Authorization\")) return headers;\n\t}\n\treturn undefined;\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string): boolean {\n\treturn Object.keys(headers).some((key) => key.toLowerCase() === name.toLowerCase());\n}\n\nfunction redactErrorBody(body: string): string {\n\tconst redacted = body\n\t\t.replace(/Bearer\\s+[A-Za-z0-9._~+/=-]+/gi, \"Bearer <redacted>\")\n\t\t.replace(/\"access_token\"\\s*:\\s*\"[^\"]+\"/gi, '\"access_token\":\"<redacted>\"')\n\t\t.trim();\n\treturn redacted.length > MAX_ERROR_BODY_CHARS ? `${redacted.slice(0, MAX_ERROR_BODY_CHARS - 1)}…` : redacted;\n}\n\n// ---------------------------------------------------------------------------\n// PlanUsage mapping\n// ---------------------------------------------------------------------------\n\nfunction windowLabel(window: NormalizedWindow, fallback: string | undefined): string {\n\tconst minutes = window.windowMinutes;\n\tif (minutes === undefined) return fallback ?? \"Limit\";\n\tif (minutes >= 7 * 24 * 60) return \"Weekly\";\n\tif (minutes >= 24 * 60) return `${Math.round(minutes / (24 * 60))}d`;\n\tif (minutes >= 60) return `${Math.round(minutes / 60)}h`;\n\treturn `${minutes}m`;\n}\n\nfunction toPlanUsage(report: CodexUsageReport): PlanUsage[] {\n\treturn report.snapshots.flatMap((snapshot, index) => {\n\t\t// Longer window (weekly) first, shorter (5h) second — matches /usage layout.\n\t\tconst windows: PlanUsageWindow[] = [];\n\t\tfor (const window of [snapshot.secondary, snapshot.primary]) {\n\t\t\tif (!window) continue;\n\t\t\twindows.push({\n\t\t\t\tlabel: windowLabel(window, snapshot.limitName),\n\t\t\t\tusedPercent: window.usedPercent,\n\t\t\t\tresetsAt: window.resetsAt,\n\t\t\t});\n\t\t}\n\t\tif (windows.length === 0) return [];\n\t\treturn [\n\t\t\t{\n\t\t\t\tprovider: CODEX_PROVIDER_ID,\n\t\t\t\tplanLabel: index === 0 ? report.planType : (snapshot.limitName ?? snapshot.limitId),\n\t\t\t\twindows,\n\t\t\t},\n\t\t];\n\t});\n}\n\nexport async function fetchCodexPlanUsage(\n\truntime: ModelRuntime,\n\tauth?: UsageAuthSnapshot,\n): Promise<PlanUsage[] | undefined> {\n\tconst headers = auth ? auth.codexHeaders : await resolveCodexHeaders(runtime);\n\tif (!headers) return undefined;\n\n\tconst response = await fetchWithTimeout(CODEX_USAGE_URL, { headers });\n\tconst text = await response.text();\n\tif (!response.ok) {\n\t\tthrow new Error(`Codex usage endpoint returned ${response.status}: ${redactErrorBody(text)}`);\n\t}\n\tconst payload = asObject(JSON.parse(text)) as RateLimitStatusPayload | undefined;\n\tif (!payload) return undefined;\n\treturn toPlanUsage(normalizeBackendPayload(payload));\n}\n"]}
@@ -16,6 +16,6 @@
16
16
  * after xAI changes the billing payload.
17
17
  */
18
18
  import type { ModelRuntime } from "../model-runtime.ts";
19
- import type { PlanUsage } from "../usage-service.ts";
20
- export declare function fetchXaiPlanUsage(runtime: ModelRuntime): Promise<PlanUsage | undefined>;
19
+ import type { PlanUsage, UsageAuthSnapshot } from "../usage-service.ts";
20
+ export declare function fetchXaiPlanUsage(runtime: ModelRuntime, auth?: UsageAuthSnapshot): Promise<PlanUsage | undefined>;
21
21
  //# sourceMappingURL=xai.d.ts.map