@assemblyline-agents/runtime 5.0.10 → 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. package/README.md +20 -5
  2. package/dist/a2a-client.d.ts +1 -3
  3. package/dist/a2a-client.d.ts.map +1 -1
  4. package/dist/a2a-client.js +1 -4
  5. package/dist/a2a-client.js.map +1 -1
  6. package/dist/agent-event-handlers.d.ts +2 -0
  7. package/dist/agent-event-handlers.d.ts.map +1 -1
  8. package/dist/agent-event-handlers.js +1 -1
  9. package/dist/agent-event-handlers.js.map +1 -1
  10. package/dist/agent-hook-context.d.ts.map +1 -1
  11. package/dist/agent-hook-context.js +3 -1
  12. package/dist/agent-hook-context.js.map +1 -1
  13. package/dist/agent-hook-controller-factory.d.ts +5 -1
  14. package/dist/agent-hook-controller-factory.d.ts.map +1 -1
  15. package/dist/agent-hook-controller-factory.js +11 -9
  16. package/dist/agent-hook-controller-factory.js.map +1 -1
  17. package/dist/agent-hook-evaluation.d.ts +0 -2
  18. package/dist/agent-hook-evaluation.d.ts.map +1 -1
  19. package/dist/agent-hook-evaluation.js +10 -10
  20. package/dist/agent-hook-evaluation.js.map +1 -1
  21. package/dist/agent-hook-run-lifecycle.d.ts +1 -2
  22. package/dist/agent-hook-run-lifecycle.d.ts.map +1 -1
  23. package/dist/agent-hook-run-lifecycle.js +1 -2
  24. package/dist/agent-hook-run-lifecycle.js.map +1 -1
  25. package/dist/agent-surface.d.ts +5 -2
  26. package/dist/agent-surface.d.ts.map +1 -1
  27. package/dist/agent-surface.js +11 -3
  28. package/dist/agent-surface.js.map +1 -1
  29. package/dist/artifact-selection.js +1 -1
  30. package/dist/artifact-selection.js.map +1 -1
  31. package/dist/assembly-line-runtime.d.ts +9 -0
  32. package/dist/assembly-line-runtime.d.ts.map +1 -0
  33. package/dist/assembly-line-runtime.js +9 -0
  34. package/dist/assembly-line-runtime.js.map +1 -0
  35. package/dist/attachment-download.d.ts +17 -0
  36. package/dist/attachment-download.d.ts.map +1 -0
  37. package/dist/attachment-download.js +51 -0
  38. package/dist/attachment-download.js.map +1 -0
  39. package/dist/attachments.d.ts +2 -14
  40. package/dist/attachments.d.ts.map +1 -1
  41. package/dist/attachments.js +8 -80
  42. package/dist/attachments.js.map +1 -1
  43. package/dist/background-review-types.d.ts +2 -0
  44. package/dist/background-review-types.d.ts.map +1 -1
  45. package/dist/background-review.d.ts.map +1 -1
  46. package/dist/background-review.js +13 -0
  47. package/dist/background-review.js.map +1 -1
  48. package/dist/background-subagents.d.ts +1 -1
  49. package/dist/background-subagents.d.ts.map +1 -1
  50. package/dist/blob-storage.d.ts +12 -0
  51. package/dist/blob-storage.d.ts.map +1 -0
  52. package/dist/blob-storage.js +86 -0
  53. package/dist/blob-storage.js.map +1 -0
  54. package/dist/builtin-tool-executors.d.ts.map +1 -1
  55. package/dist/builtin-tool-executors.js +12 -11
  56. package/dist/builtin-tool-executors.js.map +1 -1
  57. package/dist/builtin-tools.d.ts +1 -2
  58. package/dist/builtin-tools.d.ts.map +1 -1
  59. package/dist/builtin-tools.js +0 -8
  60. package/dist/builtin-tools.js.map +1 -1
  61. package/dist/capability-inspection.d.ts +4 -0
  62. package/dist/capability-inspection.d.ts.map +1 -1
  63. package/dist/capability-inspection.js +10 -11
  64. package/dist/capability-inspection.js.map +1 -1
  65. package/dist/channel-credential-environment.d.ts +1 -1
  66. package/dist/channel-credential-environment.d.ts.map +1 -1
  67. package/dist/channel-credential-environment.js +1 -6
  68. package/dist/channel-credential-environment.js.map +1 -1
  69. package/dist/channel-ingress.d.ts +1 -2
  70. package/dist/channel-ingress.d.ts.map +1 -1
  71. package/dist/channel-ingress.js +2 -2
  72. package/dist/channel-ingress.js.map +1 -1
  73. package/dist/channel-operation.d.ts +0 -1
  74. package/dist/channel-operation.d.ts.map +1 -1
  75. package/dist/channel-operation.js +1 -2
  76. package/dist/channel-operation.js.map +1 -1
  77. package/dist/channel.d.ts +32 -3
  78. package/dist/channel.d.ts.map +1 -1
  79. package/dist/connection-assets.d.ts.map +1 -1
  80. package/dist/connection-assets.js.map +1 -1
  81. package/dist/connection-authorization-service.d.ts +52 -0
  82. package/dist/connection-authorization-service.d.ts.map +1 -0
  83. package/dist/connection-authorization-service.js +417 -0
  84. package/dist/connection-authorization-service.js.map +1 -0
  85. package/dist/connection-credential-materialization.d.ts +23 -0
  86. package/dist/connection-credential-materialization.d.ts.map +1 -0
  87. package/dist/connection-credential-materialization.js +223 -0
  88. package/dist/connection-credential-materialization.js.map +1 -0
  89. package/dist/connection-definition-loader.d.ts +6 -0
  90. package/dist/connection-definition-loader.d.ts.map +1 -0
  91. package/dist/connection-definition-loader.js +102 -0
  92. package/dist/connection-definition-loader.js.map +1 -0
  93. package/dist/connection-discovery.d.ts +11 -0
  94. package/dist/connection-discovery.d.ts.map +1 -0
  95. package/dist/connection-discovery.js +105 -0
  96. package/dist/connection-discovery.js.map +1 -0
  97. package/dist/connection-events.d.ts.map +1 -1
  98. package/dist/connection-events.js.map +1 -1
  99. package/dist/connection-oauth-client.d.ts +3 -0
  100. package/dist/connection-oauth-client.d.ts.map +1 -0
  101. package/dist/connection-oauth-client.js +64 -0
  102. package/dist/connection-oauth-client.js.map +1 -0
  103. package/dist/connection-runtime-types.d.ts +78 -0
  104. package/dist/connection-runtime-types.d.ts.map +1 -0
  105. package/dist/connection-runtime-types.js +31 -0
  106. package/dist/connection-runtime-types.js.map +1 -0
  107. package/dist/connections.d.ts +18 -167
  108. package/dist/connections.d.ts.map +1 -1
  109. package/dist/connections.js +71 -1017
  110. package/dist/connections.js.map +1 -1
  111. package/dist/context-policy-util.d.ts +0 -4
  112. package/dist/context-policy-util.d.ts.map +1 -1
  113. package/dist/context-policy-util.js +0 -10
  114. package/dist/context-policy-util.js.map +1 -1
  115. package/dist/conversation-context.d.ts +1 -1
  116. package/dist/conversation-context.d.ts.map +1 -1
  117. package/dist/conversation-context.js +12 -9
  118. package/dist/conversation-context.js.map +1 -1
  119. package/dist/default-outbound-route.d.ts +1 -0
  120. package/dist/default-outbound-route.d.ts.map +1 -1
  121. package/dist/default-outbound-route.js +1 -1
  122. package/dist/default-outbound-route.js.map +1 -1
  123. package/dist/delivery-queue.d.ts +1 -1
  124. package/dist/delivery-send.d.ts.map +1 -1
  125. package/dist/delivery-send.js +3 -2
  126. package/dist/delivery-send.js.map +1 -1
  127. package/dist/dynamic-schedule-execution.d.ts +4 -0
  128. package/dist/dynamic-schedule-execution.d.ts.map +1 -0
  129. package/dist/dynamic-schedule-execution.js +136 -0
  130. package/dist/dynamic-schedule-execution.js.map +1 -0
  131. package/dist/dynamic-schedule-runtime.d.ts +11 -20
  132. package/dist/dynamic-schedule-runtime.d.ts.map +1 -1
  133. package/dist/dynamic-schedule-runtime.js +27 -39
  134. package/dist/dynamic-schedule-runtime.js.map +1 -1
  135. package/dist/evolution-tracker.d.ts +52 -0
  136. package/dist/evolution-tracker.d.ts.map +1 -0
  137. package/dist/evolution-tracker.js +179 -0
  138. package/dist/evolution-tracker.js.map +1 -0
  139. package/dist/harness-capabilities.d.ts +7 -0
  140. package/dist/harness-capabilities.d.ts.map +1 -0
  141. package/dist/harness-capabilities.js +56 -0
  142. package/dist/harness-capabilities.js.map +1 -0
  143. package/dist/harness-continuation-persistence.d.ts +6 -0
  144. package/dist/harness-continuation-persistence.d.ts.map +1 -0
  145. package/dist/harness-continuation-persistence.js +11 -0
  146. package/dist/harness-continuation-persistence.js.map +1 -0
  147. package/dist/harness-execution-context.d.ts +10 -0
  148. package/dist/harness-execution-context.d.ts.map +1 -0
  149. package/dist/harness-execution-context.js +193 -0
  150. package/dist/harness-execution-context.js.map +1 -0
  151. package/dist/harness-loop-types.d.ts +67 -0
  152. package/dist/harness-loop-types.d.ts.map +1 -0
  153. package/dist/harness-loop-types.js +2 -0
  154. package/dist/harness-loop-types.js.map +1 -0
  155. package/dist/harness-loop.d.ts +13 -94
  156. package/dist/harness-loop.d.ts.map +1 -1
  157. package/dist/harness-loop.js +19 -551
  158. package/dist/harness-loop.js.map +1 -1
  159. package/dist/harness-tool-execution.d.ts +30 -0
  160. package/dist/harness-tool-execution.d.ts.map +1 -0
  161. package/dist/harness-tool-execution.js +397 -0
  162. package/dist/harness-tool-execution.js.map +1 -0
  163. package/dist/harness-transcript-resume.d.ts +18 -0
  164. package/dist/harness-transcript-resume.d.ts.map +1 -0
  165. package/dist/harness-transcript-resume.js +102 -0
  166. package/dist/harness-transcript-resume.js.map +1 -0
  167. package/dist/harness-turn-execution.d.ts +11 -0
  168. package/dist/harness-turn-execution.d.ts.map +1 -0
  169. package/dist/harness-turn-execution.js +157 -0
  170. package/dist/harness-turn-execution.js.map +1 -0
  171. package/dist/index.d.ts +10 -499
  172. package/dist/index.d.ts.map +1 -1
  173. package/dist/index.js +9 -2139
  174. package/dist/index.js.map +1 -1
  175. package/dist/local-sandbox.d.ts +2 -1
  176. package/dist/local-sandbox.d.ts.map +1 -1
  177. package/dist/mcp-client.d.ts +11 -1
  178. package/dist/mcp-client.d.ts.map +1 -1
  179. package/dist/mcp-client.js +39 -7
  180. package/dist/mcp-client.js.map +1 -1
  181. package/dist/media-processor.d.ts +3 -1
  182. package/dist/media-processor.d.ts.map +1 -1
  183. package/dist/media-processor.js +15 -1
  184. package/dist/media-processor.js.map +1 -1
  185. package/dist/memory-storage.d.ts +51 -0
  186. package/dist/memory-storage.d.ts.map +1 -0
  187. package/dist/memory-storage.js +324 -0
  188. package/dist/memory-storage.js.map +1 -0
  189. package/dist/model-credential-stores.d.ts.map +1 -1
  190. package/dist/model-credential-stores.js +6 -12
  191. package/dist/model-credential-stores.js.map +1 -1
  192. package/dist/model-provider-environment.d.ts +4 -0
  193. package/dist/model-provider-environment.d.ts.map +1 -0
  194. package/dist/model-provider-environment.js +36 -0
  195. package/dist/model-provider-environment.js.map +1 -0
  196. package/dist/plugin-embeddings.d.ts +4 -0
  197. package/dist/plugin-embeddings.d.ts.map +1 -0
  198. package/dist/plugin-embeddings.js +75 -0
  199. package/dist/plugin-embeddings.js.map +1 -0
  200. package/dist/public-api.d.ts +8 -5
  201. package/dist/public-api.d.ts.map +1 -1
  202. package/dist/public-api.js +6 -4
  203. package/dist/public-api.js.map +1 -1
  204. package/dist/relay-mcp-client.js +1 -1
  205. package/dist/relay-mcp-client.js.map +1 -1
  206. package/dist/replay-resume-authorization.d.ts +8 -0
  207. package/dist/replay-resume-authorization.d.ts.map +1 -0
  208. package/dist/replay-resume-authorization.js +181 -0
  209. package/dist/replay-resume-authorization.js.map +1 -0
  210. package/dist/replay-resume-connection.d.ts +6 -0
  211. package/dist/replay-resume-connection.d.ts.map +1 -0
  212. package/dist/replay-resume-connection.js +75 -0
  213. package/dist/replay-resume-connection.js.map +1 -0
  214. package/dist/replay-resume-controls.d.ts +6 -0
  215. package/dist/replay-resume-controls.d.ts.map +1 -0
  216. package/dist/replay-resume-controls.js +157 -0
  217. package/dist/replay-resume-controls.js.map +1 -0
  218. package/dist/replay-resume-harness.d.ts +14 -0
  219. package/dist/replay-resume-harness.d.ts.map +1 -0
  220. package/dist/replay-resume-harness.js +158 -0
  221. package/dist/replay-resume-harness.js.map +1 -0
  222. package/dist/replay-resume-recovery.d.ts +10 -0
  223. package/dist/replay-resume-recovery.d.ts.map +1 -0
  224. package/dist/replay-resume-recovery.js +62 -0
  225. package/dist/replay-resume-recovery.js.map +1 -0
  226. package/dist/replay-resume-shared.d.ts +16 -0
  227. package/dist/replay-resume-shared.d.ts.map +1 -0
  228. package/dist/replay-resume-shared.js +55 -0
  229. package/dist/replay-resume-shared.js.map +1 -0
  230. package/dist/replay-resume-types.d.ts +85 -0
  231. package/dist/replay-resume-types.d.ts.map +1 -0
  232. package/dist/replay-resume-types.js +2 -0
  233. package/dist/replay-resume-types.js.map +1 -0
  234. package/dist/replay-resume.d.ts +7 -119
  235. package/dist/replay-resume.d.ts.map +1 -1
  236. package/dist/replay-resume.js +5 -715
  237. package/dist/replay-resume.js.map +1 -1
  238. package/dist/resource-projection-util.d.ts +1 -2
  239. package/dist/resource-projection-util.d.ts.map +1 -1
  240. package/dist/resource-projection-util.js +2 -11
  241. package/dist/resource-projection-util.js.map +1 -1
  242. package/dist/resource-projection.d.ts.map +1 -1
  243. package/dist/resource-projection.js +67 -22
  244. package/dist/resource-projection.js.map +1 -1
  245. package/dist/run-execution-host.d.ts +98 -0
  246. package/dist/run-execution-host.d.ts.map +1 -0
  247. package/dist/run-execution-host.js +2 -0
  248. package/dist/run-execution-host.js.map +1 -0
  249. package/dist/run-execution.d.ts +6 -0
  250. package/dist/run-execution.d.ts.map +1 -0
  251. package/dist/run-execution.js +313 -0
  252. package/dist/run-execution.js.map +1 -0
  253. package/dist/run-initialization.d.ts +19 -0
  254. package/dist/run-initialization.d.ts.map +1 -0
  255. package/dist/run-initialization.js +171 -0
  256. package/dist/run-initialization.js.map +1 -0
  257. package/dist/run-recovery.d.ts +1 -1
  258. package/dist/run-recovery.js.map +1 -1
  259. package/dist/runtime-connection-definitions.d.ts +35 -0
  260. package/dist/runtime-connection-definitions.d.ts.map +1 -0
  261. package/dist/runtime-connection-definitions.js +97 -0
  262. package/dist/runtime-connection-definitions.js.map +1 -0
  263. package/dist/runtime-engine-background.d.ts +64 -0
  264. package/dist/runtime-engine-background.d.ts.map +1 -0
  265. package/dist/runtime-engine-background.js +136 -0
  266. package/dist/runtime-engine-background.js.map +1 -0
  267. package/dist/runtime-engine-base.d.ts +60 -0
  268. package/dist/runtime-engine-base.d.ts.map +1 -0
  269. package/dist/runtime-engine-base.js +192 -0
  270. package/dist/runtime-engine-base.js.map +1 -0
  271. package/dist/runtime-engine-capabilities.d.ts +81 -0
  272. package/dist/runtime-engine-capabilities.d.ts.map +1 -0
  273. package/dist/runtime-engine-capabilities.js +198 -0
  274. package/dist/runtime-engine-capabilities.js.map +1 -0
  275. package/dist/runtime-engine-config.d.ts +77 -0
  276. package/dist/runtime-engine-config.d.ts.map +1 -0
  277. package/dist/runtime-engine-config.js +187 -0
  278. package/dist/runtime-engine-config.js.map +1 -0
  279. package/dist/runtime-engine-foundation.d.ts +11 -0
  280. package/dist/runtime-engine-foundation.d.ts.map +1 -0
  281. package/dist/runtime-engine-foundation.js +121 -0
  282. package/dist/runtime-engine-foundation.js.map +1 -0
  283. package/dist/runtime-engine-hooks.d.ts +33 -0
  284. package/dist/runtime-engine-hooks.d.ts.map +1 -0
  285. package/dist/runtime-engine-hooks.js +153 -0
  286. package/dist/runtime-engine-hooks.js.map +1 -0
  287. package/dist/runtime-engine-integrations.d.ts +16 -0
  288. package/dist/runtime-engine-integrations.d.ts.map +1 -0
  289. package/dist/runtime-engine-integrations.js +177 -0
  290. package/dist/runtime-engine-integrations.js.map +1 -0
  291. package/dist/runtime-engine-operations.d.ts +87 -0
  292. package/dist/runtime-engine-operations.d.ts.map +1 -0
  293. package/dist/runtime-engine-operations.js +204 -0
  294. package/dist/runtime-engine-operations.js.map +1 -0
  295. package/dist/runtime-engine-resources.d.ts +18 -0
  296. package/dist/runtime-engine-resources.d.ts.map +1 -0
  297. package/dist/runtime-engine-resources.js +49 -0
  298. package/dist/runtime-engine-resources.js.map +1 -0
  299. package/dist/runtime-engine-run.d.ts +70 -0
  300. package/dist/runtime-engine-run.d.ts.map +1 -0
  301. package/dist/runtime-engine-run.js +202 -0
  302. package/dist/runtime-engine-run.js.map +1 -0
  303. package/dist/runtime-engine-scheduling.d.ts +22 -0
  304. package/dist/runtime-engine-scheduling.d.ts.map +1 -0
  305. package/dist/runtime-engine-scheduling.js +45 -0
  306. package/dist/runtime-engine-scheduling.js.map +1 -0
  307. package/dist/runtime-engine-tools.d.ts +8 -0
  308. package/dist/runtime-engine-tools.d.ts.map +1 -0
  309. package/dist/runtime-engine-tools.js +80 -0
  310. package/dist/runtime-engine-tools.js.map +1 -0
  311. package/dist/runtime-evolution.d.ts +17 -0
  312. package/dist/runtime-evolution.d.ts.map +1 -0
  313. package/dist/runtime-evolution.js +51 -0
  314. package/dist/runtime-evolution.js.map +1 -0
  315. package/dist/runtime-learning.d.ts +4 -6
  316. package/dist/runtime-learning.d.ts.map +1 -1
  317. package/dist/runtime-learning.js +109 -99
  318. package/dist/runtime-learning.js.map +1 -1
  319. package/dist/runtime-types.d.ts +21 -7
  320. package/dist/runtime-types.d.ts.map +1 -1
  321. package/dist/runtime-util.d.ts +4 -3
  322. package/dist/runtime-util.d.ts.map +1 -1
  323. package/dist/runtime-util.js +0 -7
  324. package/dist/runtime-util.js.map +1 -1
  325. package/dist/sandbox-atomic-json.d.ts +4 -0
  326. package/dist/sandbox-atomic-json.d.ts.map +1 -0
  327. package/dist/sandbox-atomic-json.js +23 -0
  328. package/dist/sandbox-atomic-json.js.map +1 -0
  329. package/dist/sandbox-authored-tool-executor.d.ts.map +1 -1
  330. package/dist/sandbox-authored-tool-executor.js +13 -3
  331. package/dist/sandbox-authored-tool-executor.js.map +1 -1
  332. package/dist/sandbox-fs.d.ts +2 -7
  333. package/dist/sandbox-fs.d.ts.map +1 -1
  334. package/dist/sandbox-fs.js +6 -37
  335. package/dist/sandbox-fs.js.map +1 -1
  336. package/dist/sandbox-handle.d.ts +1 -3
  337. package/dist/sandbox-handle.d.ts.map +1 -1
  338. package/dist/sandbox-handle.js +2 -5
  339. package/dist/sandbox-handle.js.map +1 -1
  340. package/dist/sandbox-state-sync.d.ts +2 -0
  341. package/dist/sandbox-state-sync.d.ts.map +1 -1
  342. package/dist/sandbox-state-sync.js +26 -2
  343. package/dist/sandbox-state-sync.js.map +1 -1
  344. package/dist/sandbox-tool-bridge.d.ts.map +1 -1
  345. package/dist/sandbox-tool-bridge.js +23 -3
  346. package/dist/sandbox-tool-bridge.js.map +1 -1
  347. package/dist/schedule-execution.d.ts +4 -4
  348. package/dist/schedule-execution.d.ts.map +1 -1
  349. package/dist/schedule-execution.js +45 -440
  350. package/dist/schedule-execution.js.map +1 -1
  351. package/dist/schedule-trigger-context.d.ts +18 -0
  352. package/dist/schedule-trigger-context.d.ts.map +1 -0
  353. package/dist/schedule-trigger-context.js +276 -0
  354. package/dist/schedule-trigger-context.js.map +1 -0
  355. package/dist/scheduler.d.ts +1 -14
  356. package/dist/scheduler.d.ts.map +1 -1
  357. package/dist/scheduler.js +1 -37
  358. package/dist/scheduler.js.map +1 -1
  359. package/dist/security.d.ts +0 -4
  360. package/dist/security.d.ts.map +1 -1
  361. package/dist/security.js +0 -22
  362. package/dist/security.js.map +1 -1
  363. package/dist/self-improvement.d.ts +5 -21
  364. package/dist/self-improvement.d.ts.map +1 -1
  365. package/dist/self-improvement.js +10 -40
  366. package/dist/self-improvement.js.map +1 -1
  367. package/dist/source-loader.d.ts +0 -3
  368. package/dist/source-loader.d.ts.map +1 -1
  369. package/dist/source-loader.js +1 -10
  370. package/dist/source-loader.js.map +1 -1
  371. package/dist/state/conversation-state.d.ts +117 -0
  372. package/dist/state/conversation-state.d.ts.map +1 -0
  373. package/dist/state/conversation-state.js +2 -0
  374. package/dist/state/conversation-state.js.map +1 -0
  375. package/dist/state/run-state.d.ts +129 -0
  376. package/dist/state/run-state.d.ts.map +1 -0
  377. package/dist/state/run-state.js +3 -0
  378. package/dist/state/run-state.js.map +1 -0
  379. package/dist/state/sandbox-memory-state.d.ts +159 -0
  380. package/dist/state/sandbox-memory-state.d.ts.map +1 -0
  381. package/dist/state/sandbox-memory-state.js +2 -0
  382. package/dist/state/sandbox-memory-state.js.map +1 -0
  383. package/dist/state/store-contracts.d.ts +329 -0
  384. package/dist/state/store-contracts.d.ts.map +1 -0
  385. package/dist/state/store-contracts.js +26 -0
  386. package/dist/state/store-contracts.js.map +1 -0
  387. package/dist/state/usage-state.d.ts +111 -0
  388. package/dist/state/usage-state.d.ts.map +1 -0
  389. package/dist/state/usage-state.js +2 -0
  390. package/dist/state/usage-state.js.map +1 -0
  391. package/dist/state/workspace-state.d.ts +126 -0
  392. package/dist/state/workspace-state.d.ts.map +1 -0
  393. package/dist/state/workspace-state.js +16 -0
  394. package/dist/state/workspace-state.js.map +1 -0
  395. package/dist/state-stores.d.ts +3 -15
  396. package/dist/state-stores.d.ts.map +1 -1
  397. package/dist/state-stores.js +36 -82
  398. package/dist/state-stores.js.map +1 -1
  399. package/dist/state.d.ts +7 -1075
  400. package/dist/state.d.ts.map +1 -1
  401. package/dist/state.js +7 -88
  402. package/dist/state.js.map +1 -1
  403. package/dist/storage.d.ts +4 -64
  404. package/dist/storage.d.ts.map +1 -1
  405. package/dist/storage.js +5 -408
  406. package/dist/storage.js.map +1 -1
  407. package/dist/subagent-execution.d.ts +1 -2
  408. package/dist/subagent-execution.d.ts.map +1 -1
  409. package/dist/subagent-execution.js +2 -26
  410. package/dist/subagent-execution.js.map +1 -1
  411. package/dist/subagent-handoff.d.ts +13 -0
  412. package/dist/subagent-handoff.d.ts.map +1 -1
  413. package/dist/subagent-handoff.js +74 -9
  414. package/dist/subagent-handoff.js.map +1 -1
  415. package/dist/tool-apis.d.ts +2 -2
  416. package/dist/tool-apis.d.ts.map +1 -1
  417. package/dist/tool-apis.js +26 -14
  418. package/dist/tool-apis.js.map +1 -1
  419. package/dist/tool-execution-host.d.ts +122 -0
  420. package/dist/tool-execution-host.d.ts.map +1 -0
  421. package/dist/tool-execution-host.js +2 -0
  422. package/dist/tool-execution-host.js.map +1 -0
  423. package/dist/tool-execution.d.ts +5 -141
  424. package/dist/tool-execution.d.ts.map +1 -1
  425. package/dist/tool-execution.js +6 -395
  426. package/dist/tool-execution.js.map +1 -1
  427. package/dist/usage-reconciliation-support.d.ts +20 -0
  428. package/dist/usage-reconciliation-support.d.ts.map +1 -0
  429. package/dist/usage-reconciliation-support.js +95 -0
  430. package/dist/usage-reconciliation-support.js.map +1 -0
  431. package/dist/usage-reconciliation.d.ts +14 -35
  432. package/dist/usage-reconciliation.d.ts.map +1 -1
  433. package/dist/usage-reconciliation.js +17 -394
  434. package/dist/usage-reconciliation.js.map +1 -1
  435. package/dist/workspace-paths.d.ts +3 -0
  436. package/dist/workspace-paths.d.ts.map +1 -0
  437. package/dist/workspace-paths.js +13 -0
  438. package/dist/workspace-paths.js.map +1 -0
  439. package/dist/workspace-service.d.ts +0 -1
  440. package/dist/workspace-service.d.ts.map +1 -1
  441. package/dist/workspace-service.js +1 -4
  442. package/dist/workspace-service.js.map +1 -1
  443. package/package.json +3 -3
  444. package/dist/run-timeline.d.ts +0 -11
  445. package/dist/run-timeline.d.ts.map +0 -1
  446. package/dist/run-timeline.js +0 -2
  447. package/dist/run-timeline.js.map +0 -1
  448. package/dist/trusted-attachments.d.ts +0 -20
  449. package/dist/trusted-attachments.d.ts.map +0 -1
  450. package/dist/trusted-attachments.js +0 -276
  451. package/dist/trusted-attachments.js.map +0 -1
@@ -0,0 +1,95 @@
1
+ import { UsageAccountingError, sha256Json } from "./usage-records.js";
2
+ const FETCH_TIMEOUT_MS = 10_000;
3
+ export async function fetchUsageJson(url, key, fetchImpl) {
4
+ let lastError;
5
+ for (const delayMs of [0, 150, 750]) {
6
+ if (delayMs)
7
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
8
+ const controller = new AbortController();
9
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
10
+ timer.unref?.();
11
+ try {
12
+ const response = await fetchImpl(url, {
13
+ headers: { authorization: `Bearer ${key}`, accept: "application/json" },
14
+ signal: controller.signal
15
+ });
16
+ if (response.ok)
17
+ return response.json();
18
+ const retryable = response.status === 429 || response.status >= 500;
19
+ const detail = (await response.text()).slice(0, 500);
20
+ lastError = new UsageAccountingError(`Provider reconciliation failed with HTTP ${response.status}${detail ? `: ${detail}` : "."}`, "usage_provider_reconciliation_failed");
21
+ if (!retryable)
22
+ throw lastError;
23
+ }
24
+ catch (error) {
25
+ lastError = error;
26
+ }
27
+ finally {
28
+ clearTimeout(timer);
29
+ }
30
+ }
31
+ throw lastError instanceof Error
32
+ ? lastError
33
+ : new UsageAccountingError("Provider reconciliation failed after retries.");
34
+ }
35
+ export function settledUsageRange(from, to, now, lagHours) {
36
+ if (!Number.isFinite(lagHours) || lagHours < 0)
37
+ throw new UsageAccountingError("Provider settlement lag must be non-negative.");
38
+ return normalizedUsageRange(from, to, utcDay(new Date(now.getTime() - lagHours * 3_600_000)));
39
+ }
40
+ export function completedUsageRange(from, to, now) {
41
+ return normalizedUsageRange(from, to, utcDay(now));
42
+ }
43
+ export function usageDates(from, to, maximum) {
44
+ const dates = [];
45
+ for (let cursor = new Date(from); cursor < new Date(to); cursor = new Date(cursor.getTime() + 86_400_000)) {
46
+ dates.push(cursor.toISOString().slice(0, 10));
47
+ }
48
+ if (dates.length > maximum)
49
+ throw new UsageAccountingError(`Provider activity reconciliation supports at most ${maximum} completed UTC days.`);
50
+ return dates;
51
+ }
52
+ export function usageControlKey(provider, source, bucket, dimensions) {
53
+ return `control:${provider}:${source}:${bucket}:${sha256Json(dimensions)}`;
54
+ }
55
+ export function bodyString(body, key) {
56
+ return stringValue(body[key]);
57
+ }
58
+ export function stringValue(value) {
59
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
60
+ }
61
+ export function numberValue(value) {
62
+ const parsed = typeof value === "number" ? value : typeof value === "string" ? Number(value) : NaN;
63
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : undefined;
64
+ }
65
+ export function integerValue(value) {
66
+ const parsed = numberValue(value);
67
+ return parsed !== undefined && Number.isSafeInteger(parsed) ? parsed : undefined;
68
+ }
69
+ export function objectValue(value) {
70
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value) ? value : undefined;
71
+ }
72
+ export function objectList(value) {
73
+ return Array.isArray(value) ? value.filter((entry) => Boolean(objectValue(entry))) : [];
74
+ }
75
+ export function compactJson(value) {
76
+ return Object.fromEntries(Object.entries(value).filter(([, entry]) => typeof entry === "string" || typeof entry === "number" || typeof entry === "boolean"));
77
+ }
78
+ function normalizedUsageRange(from, to, maximumTo) {
79
+ const normalizedFrom = iso(from, "from");
80
+ const requestedTo = to ? iso(to, "to") : maximumTo;
81
+ const normalizedTo = requestedTo < maximumTo ? requestedTo : maximumTo;
82
+ if (normalizedFrom >= normalizedTo)
83
+ throw new UsageAccountingError("Reconciliation range has no completed provider buckets.");
84
+ return { from: normalizedFrom, to: normalizedTo };
85
+ }
86
+ function utcDay(value) {
87
+ return `${value.toISOString().slice(0, 10)}T00:00:00.000Z`;
88
+ }
89
+ function iso(value, name) {
90
+ const date = new Date(value);
91
+ if (Number.isNaN(date.getTime()))
92
+ throw new UsageAccountingError(`${name} must be an ISO timestamp.`);
93
+ return date.toISOString();
94
+ }
95
+ //# sourceMappingURL=usage-reconciliation-support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-reconciliation-support.js","sourceRoot":"","sources":["../src/usage-reconciliation-support.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
+ import type { JsonObject } from "@assemblyline-agents/core";
1
2
  import type { UsageAggregate, UsageStore } from "./state.js";
3
+ export declare const USAGE_RECONCILER_EXPORT_NAME: "assemblyLineUsageReconciler";
2
4
  export interface UsageReconciliationReport {
3
5
  provider: string;
4
6
  from: string;
@@ -30,44 +32,21 @@ export interface ProviderReconciliationResult {
30
32
  reconciledTransactions: number;
31
33
  report: UsageReconciliationReport;
32
34
  }
33
- export interface OpenAIOrganizationReconciliationOptions {
35
+ export interface UsageReconcilerContext {
34
36
  state: UsageStore;
35
- adminKey: string;
36
- from: string;
37
- to?: string;
38
- provider?: string;
39
- projectIds?: string[];
40
- apiKeyIds?: string[];
41
- agentByProjectId?: Record<string, string>;
42
- agentByApiKeyId?: Record<string, string>;
43
- settlementLagHours?: number;
44
- now?: Date;
45
- fetch?: typeof fetch;
46
- baseUrl?: string;
37
+ env: Record<string, string | undefined>;
38
+ input: JsonObject;
39
+ fetch: typeof fetch;
47
40
  }
48
- /**
49
- * Import settled OpenAI organization token and cash control totals.
50
- *
51
- * Control totals are deliberately separate from transaction records. A
52
- * project/API-key mapping is the only way they receive an agentId; Assembly Line
53
- * never invents per-run cost attribution from aggregate provider invoices.
54
- */
55
- export declare function reconcileOpenAIOrganization(options: OpenAIOrganizationReconciliationOptions): Promise<ProviderReconciliationResult>;
56
- export interface OpenRouterReconciliationOptions {
57
- state: UsageStore;
58
- apiKey?: string;
59
- managementKey?: string;
60
- from: string;
61
- to?: string;
62
- provider?: string;
63
- apiKeyHash?: string;
64
- agentId?: string;
65
- now?: Date;
66
- fetch?: typeof fetch;
67
- baseUrl?: string;
41
+ export interface ProviderUsageReconciler {
42
+ provider: string;
43
+ reconcile(context: UsageReconcilerContext): Promise<ProviderReconciliationResult>;
44
+ }
45
+ export interface UsageReconcilerModule {
46
+ providers: ProviderUsageReconciler[];
68
47
  }
69
- /** Retry missing generation receipts and import completed OpenRouter activity totals. */
70
- export declare function reconcileOpenRouterUsage(options: OpenRouterReconciliationOptions): Promise<ProviderReconciliationResult>;
48
+ /** Read the optional usage surface exported by a selected model plugin. */
49
+ export declare function usageReconcilerModuleFromImport(imported: unknown): UsageReconcilerModule | undefined;
71
50
  export declare function usageReconciliationReport(state: UsageStore, input: {
72
51
  provider: string;
73
52
  from: string;
@@ -1 +1 @@
1
- {"version":3,"file":"usage-reconciliation.d.ts","sourceRoot":"","sources":["../src/usage-reconciliation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,cAAc,EAGd,UAAU,EACX,MAAM,YAAY,CAAC;AAyBpB,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,cAAc,CAAC;IAC7B,aAAa,EAAE,cAAc,CAAC;IAC9B,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,QAAQ,EAAE;QACR,kBAAkB,EAAE,MAAM,CAAC;QAC3B,mCAAmC,EAAE,MAAM,CAAC;QAC5C,8BAA8B,EAAE,MAAM,CAAC;QACvC,mBAAmB,EAAE,MAAM,CAAC;QAC5B,qBAAqB,EAAE,OAAO,CAAC;QAC/B,oBAAoB,EAAE,OAAO,CAAC;QAC9B,8BAA8B,EAAE,OAAO,CAAC;KACzC,CAAC;CACH;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,MAAM,EAAE,yBAAyB,CAAC;CACnC;AAED,MAAM,WAAW,uCAAuC;IACtD,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,uCAAuC,GAC/C,OAAO,CAAC,4BAA4B,CAAC,CA4GvC;AAED,MAAM,WAAW,+BAA+B;IAC9C,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,yFAAyF;AACzF,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,4BAA4B,CAAC,CA0FvC;AAED,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACpD,OAAO,CAAC,yBAAyB,CAAC,CAsCpC"}
1
+ {"version":3,"file":"usage-reconciliation.d.ts","sourceRoot":"","sources":["../src/usage-reconciliation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAkB7D,eAAO,MAAM,4BAA4B,EAAG,6BAAsC,CAAC;AAEnF,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,cAAc,CAAC;IAC7B,aAAa,EAAE,cAAc,CAAC;IAC9B,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,QAAQ,EAAE;QACR,kBAAkB,EAAE,MAAM,CAAC;QAC3B,mCAAmC,EAAE,MAAM,CAAC;QAC5C,8BAA8B,EAAE,MAAM,CAAC;QACvC,mBAAmB,EAAE,MAAM,CAAC;QAC5B,qBAAqB,EAAE,OAAO,CAAC;QAC/B,oBAAoB,EAAE,OAAO,CAAC;QAC9B,8BAA8B,EAAE,OAAO,CAAC;KACzC,CAAC;CACH;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,MAAM,EAAE,yBAAyB,CAAC;CACnC;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,UAAU,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACxC,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,OAAO,KAAK,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;CACnF;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,uBAAuB,EAAE,CAAC;CACtC;AAED,2EAA2E;AAC3E,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,OAAO,GAAG,qBAAqB,GAAG,SAAS,CAQpG;AAED,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACpD,OAAO,CAAC,yBAAyB,CAAC,CAsCpC"}
@@ -1,7 +1,3 @@
1
- import { openRouterGenerationAccounting } from "@assemblyline-agents/pi";
2
- import { UsageAccountingError, sha256Json, usageRecordInput } from "./usage-records.js";
3
- const DEFAULT_PROVIDER_SETTLEMENT_LAG_HOURS = 48;
4
- const FETCH_TIMEOUT_MS = 10_000;
5
1
  const EMPTY_AGGREGATE = {
6
2
  dimensions: {},
7
3
  recordCount: "0",
@@ -17,194 +13,18 @@ const EMPTY_AGGREGATE = {
17
13
  unreconciledTokenRecords: "0",
18
14
  unreconciledRecords: "0"
19
15
  };
20
- /**
21
- * Import settled OpenAI organization token and cash control totals.
22
- *
23
- * Control totals are deliberately separate from transaction records. A
24
- * project/API-key mapping is the only way they receive an agentId; Assembly Line
25
- * never invents per-run cost attribution from aggregate provider invoices.
26
- */
27
- export async function reconcileOpenAIOrganization(options) {
28
- const provider = clean(options.provider) ?? "openai";
29
- const adminKey = requiredSecret(options.adminKey, "OpenAI admin key");
30
- const range = settledDailyRange(options.from, options.to, options.now ?? new Date(), options.settlementLagHours ?? DEFAULT_PROVIDER_SETTLEMENT_LAG_HOURS);
31
- const baseUrl = (clean(options.baseUrl) ?? "https://api.openai.com/v1").replace(/\/+$/u, "");
32
- const common = {
33
- start_time: String(Math.floor(new Date(range.from).getTime() / 1_000)),
34
- end_time: String(Math.floor(new Date(range.to).getTime() / 1_000)),
35
- bucket_width: "1d"
36
- };
37
- const usageBuckets = await fetchOpenAIPages(`${baseUrl}/organization/usage/completions`, adminKey, common, ["model", "project_id", "api_key_id"], options.projectIds, options.apiKeyIds, options.fetch);
38
- const costBuckets = await fetchOpenAIPages(`${baseUrl}/organization/costs`, adminKey, common, ["project_id", "line_item"], options.projectIds, undefined, options.fetch);
39
- let recordedControlTotals = 0;
40
- for (const bucket of usageBuckets) {
41
- const startTime = integer(bucket.start_time);
42
- const endTime = integer(bucket.end_time);
43
- if (startTime === undefined || endTime === undefined)
16
+ export const USAGE_RECONCILER_EXPORT_NAME = "assemblyLineUsageReconciler";
17
+ /** Read the optional usage surface exported by a selected model plugin. */
18
+ export function usageReconcilerModuleFromImport(imported) {
19
+ const candidates = [imported, imported?.default];
20
+ for (const candidate of candidates) {
21
+ if (!candidate || typeof candidate !== "object")
44
22
  continue;
45
- for (const result of arrayObjects(bucket.results)) {
46
- const inputTokens = integer(result.input_tokens) ?? 0;
47
- const outputTokens = integer(result.output_tokens) ?? 0;
48
- const cachedTokens = integer(result.input_cached_tokens) ?? 0;
49
- const cacheWriteTokens = integer(result.input_cache_write_tokens) ?? 0;
50
- const dimensions = openAIDimensions(result);
51
- const model = string(result.model);
52
- await options.state.recordUsage({
53
- idempotencyKey: controlKey(provider, "openai-usage", startTime, dimensions),
54
- ...openAIAgentAttribution(result, options),
55
- provider,
56
- ...(model ? { model } : {}),
57
- billingMode: "api_key",
58
- recordKind: "control_total",
59
- inputTokens,
60
- outputTokens,
61
- cachedTokens,
62
- cacheWriteTokens,
63
- tokenSource: "provider_reconciled",
64
- costSource: "unavailable",
65
- providerReceipt: providerReceipt("openai.organization.usage.completions", startTime, endTime, result),
66
- metadata: compactJson({
67
- controlType: "token_usage",
68
- numModelRequests: integer(result.num_model_requests),
69
- ...dimensions
70
- }),
71
- occurredAt: epochIso(startTime)
72
- });
73
- recordedControlTotals += 1;
74
- }
23
+ const value = candidate[USAGE_RECONCILER_EXPORT_NAME];
24
+ if (isUsageReconcilerModule(value))
25
+ return value;
75
26
  }
76
- for (const bucket of costBuckets) {
77
- const startTime = integer(bucket.start_time);
78
- const endTime = integer(bucket.end_time);
79
- if (startTime === undefined || endTime === undefined)
80
- continue;
81
- for (const result of arrayObjects(bucket.results)) {
82
- const amount = object(result.amount);
83
- const costUsd = number(amount?.value);
84
- if (costUsd === undefined)
85
- continue;
86
- const currency = string(amount?.currency)?.toUpperCase() ?? "USD";
87
- const dimensions = openAIDimensions(result);
88
- await options.state.recordUsage({
89
- idempotencyKey: controlKey(provider, "openai-costs", startTime, dimensions),
90
- ...openAIAgentAttribution(result, options),
91
- provider,
92
- billingMode: "api_key",
93
- recordKind: "control_total",
94
- costUsd,
95
- currency,
96
- tokenSource: "unavailable",
97
- costSource: "provider_reconciled",
98
- providerReceipt: providerReceipt("openai.organization.costs", startTime, endTime, result),
99
- metadata: compactJson({
100
- controlType: "cash_cost",
101
- quantity: number(result.quantity),
102
- ...dimensions
103
- }),
104
- occurredAt: epochIso(startTime)
105
- });
106
- recordedControlTotals += 1;
107
- }
108
- }
109
- return {
110
- provider,
111
- ...range,
112
- recordedControlTotals,
113
- reconciledTransactions: 0,
114
- report: await usageReconciliationReport(options.state, { provider, ...range })
115
- };
116
- }
117
- /** Retry missing generation receipts and import completed OpenRouter activity totals. */
118
- export async function reconcileOpenRouterUsage(options) {
119
- const provider = clean(options.provider) ?? "openrouter";
120
- const range = completedUtcRange(options.from, options.to, options.now ?? new Date());
121
- const baseUrl = (clean(options.baseUrl) ?? "https://openrouter.ai/api/v1").replace(/\/+$/u, "");
122
- let reconciledTransactions = 0;
123
- if (clean(options.apiKey)) {
124
- const candidates = (options.state.queryUsage
125
- ? await options.state.queryUsage({ provider, recordKind: "transaction", from: range.from, to: range.to, limit: 10_000 })
126
- : (await options.state.listUsage()).filter((record) => record.provider === provider &&
127
- record.recordKind === "transaction" &&
128
- record.occurredAt >= range.from &&
129
- record.occurredAt < range.to))
130
- .filter((record) => Boolean(record.providerRequestId) &&
131
- record.costSource === "unavailable");
132
- for (const record of candidates) {
133
- const accounting = await openRouterGenerationAccounting(record.providerRequestId, {
134
- env: { OPENROUTER_API_KEY: options.apiKey },
135
- ...(options.fetch ? { fetch: options.fetch } : {}),
136
- fallback: harnessUsage(record)
137
- });
138
- if (!accounting || accounting.usage.costSource !== "provider_reconciled")
139
- continue;
140
- await options.state.recordUsage(reconciledTransactionInput(record, accounting));
141
- reconciledTransactions += 1;
142
- }
143
- }
144
- let recordedControlTotals = 0;
145
- const managementKey = clean(options.managementKey);
146
- if (managementKey) {
147
- for (const date of utcDates(range.from, range.to)) {
148
- const url = new URL(`${baseUrl}/activity`);
149
- url.searchParams.set("date", date);
150
- if (clean(options.apiKeyHash))
151
- url.searchParams.set("api_key_hash", options.apiKeyHash);
152
- const body = await fetchJsonWithRetry(url, managementKey, options.fetch);
153
- for (const row of arrayObjects(object(body)?.data)) {
154
- const dimensions = compactJson({
155
- endpointId: string(row.endpoint_id),
156
- model: string(row.model),
157
- modelPermaslug: string(row.model_permaslug),
158
- providerName: string(row.provider_name)
159
- });
160
- const inputTokens = integer(row.prompt_tokens) ?? 0;
161
- const outputTokens = integer(row.completion_tokens) ?? 0;
162
- const reasoningTokens = Math.min(integer(row.reasoning_tokens) ?? 0, outputTokens);
163
- const costUsd = number(row.usage);
164
- const upstreamCostUsd = number(row.byok_usage_inference);
165
- const model = string(row.model);
166
- const control = {
167
- idempotencyKey: controlKey(provider, "openrouter-activity", date, dimensions),
168
- provider,
169
- ...(model ? { model } : {}),
170
- billingMode: upstreamCostUsd && !costUsd ? "byok" : "unknown",
171
- recordKind: "control_total",
172
- inputTokens,
173
- outputTokens,
174
- reasoningTokens,
175
- tokenSource: "provider_reconciled",
176
- costSource: costUsd === undefined ? "unavailable" : "provider_reconciled",
177
- providerReceipt: {
178
- source: "openrouter.activity",
179
- date,
180
- result: row
181
- },
182
- metadata: compactJson({
183
- controlType: "activity",
184
- requests: integer(row.requests),
185
- apiKeyHash: clean(options.apiKeyHash),
186
- ...dimensions
187
- }),
188
- occurredAt: `${date}T00:00:00.000Z`
189
- };
190
- if (costUsd !== undefined)
191
- control.costUsd = costUsd;
192
- if (upstreamCostUsd !== undefined)
193
- control.upstreamCostUsd = upstreamCostUsd;
194
- if (clean(options.agentId))
195
- control.agentId = options.agentId;
196
- await options.state.recordUsage(control);
197
- recordedControlTotals += 1;
198
- }
199
- }
200
- }
201
- return {
202
- provider,
203
- ...range,
204
- recordedControlTotals,
205
- reconciledTransactions,
206
- report: await usageReconciliationReport(options.state, { provider, ...range })
207
- };
27
+ return undefined;
208
28
  }
209
29
  export async function usageReconciliationReport(state, input) {
210
30
  const [transactions] = await summarize(state, {
@@ -252,212 +72,15 @@ async function summarize(state, query) {
252
72
  const { summarizeUsageRecords } = await import("./usage-records.js");
253
73
  return summarizeUsageRecords(records, query);
254
74
  }
255
- async function fetchOpenAIPages(endpoint, key, common, groups, projectIds, apiKeyIds, fetchImpl) {
256
- const buckets = [];
257
- let page;
258
- do {
259
- const url = new URL(endpoint);
260
- for (const [name, value] of Object.entries(common))
261
- url.searchParams.set(name, value);
262
- url.searchParams.set("limit", "31");
263
- for (const group of groups)
264
- url.searchParams.append("group_by", group);
265
- for (const projectId of projectIds ?? [])
266
- url.searchParams.append("project_ids", projectId);
267
- for (const apiKeyId of apiKeyIds ?? [])
268
- url.searchParams.append("api_key_ids", apiKeyId);
269
- if (page)
270
- url.searchParams.set("page", page);
271
- const body = object(await fetchJsonWithRetry(url, key, fetchImpl));
272
- buckets.push(...arrayObjects(body?.data));
273
- page = body?.has_more === true ? string(body.next_page) : undefined;
274
- if (body?.has_more === true && !page) {
275
- throw new UsageAccountingError("Provider pagination reported has_more without next_page.");
276
- }
277
- } while (page);
278
- return buckets;
279
- }
280
- async function fetchJsonWithRetry(url, key, fetchImpl) {
281
- const request = fetchImpl ?? globalThis.fetch;
282
- let lastError;
283
- for (const delayMs of [0, 150, 750]) {
284
- if (delayMs)
285
- await delay(delayMs);
286
- const controller = new AbortController();
287
- const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
288
- timer.unref?.();
289
- try {
290
- const response = await request(url, {
291
- headers: { authorization: `Bearer ${key}`, accept: "application/json" },
292
- signal: controller.signal
293
- });
294
- if (response.ok)
295
- return response.json();
296
- const retryable = response.status === 429 || response.status >= 500;
297
- const detail = (await response.text()).slice(0, 500);
298
- lastError = new UsageAccountingError(`Provider reconciliation failed with HTTP ${response.status}${detail ? `: ${detail}` : "."}`, "usage_provider_reconciliation_failed");
299
- if (!retryable)
300
- throw lastError;
301
- }
302
- catch (error) {
303
- lastError = error;
304
- }
305
- finally {
306
- clearTimeout(timer);
307
- }
308
- }
309
- throw lastError instanceof Error
310
- ? lastError
311
- : new UsageAccountingError("Provider reconciliation failed after retries.");
312
- }
313
- function reconciledTransactionInput(record, accounting) {
314
- const input = usageRecordInput(record);
315
- const usage = accounting.usage;
316
- if (usage.inputTokens !== undefined)
317
- input.inputTokens = usage.inputTokens;
318
- if (usage.outputTokens !== undefined)
319
- input.outputTokens = usage.outputTokens;
320
- if (usage.cachedTokens !== undefined)
321
- input.cachedTokens = usage.cachedTokens;
322
- if (usage.cacheWriteTokens !== undefined)
323
- input.cacheWriteTokens = usage.cacheWriteTokens;
324
- if (usage.reasoningTokens !== undefined)
325
- input.reasoningTokens = usage.reasoningTokens;
326
- if (usage.costUsd !== undefined)
327
- input.costUsd = usage.costUsd;
328
- if (usage.upstreamCostUsd !== undefined)
329
- input.upstreamCostUsd = usage.upstreamCostUsd;
330
- if (usage.currency !== undefined)
331
- input.currency = usage.currency;
332
- if (usage.tokenSource !== undefined)
333
- input.tokenSource = usage.tokenSource;
334
- if (usage.costSource !== undefined)
335
- input.costSource = usage.costSource;
336
- if (accounting.providerReceipt)
337
- input.providerReceipt = accounting.providerReceipt;
338
- input.billingMode = accounting.billingMode;
339
- return input;
340
- }
341
- function harnessUsage(record) {
342
- return {
343
- inputTokens: record.inputTokens,
344
- outputTokens: record.outputTokens,
345
- cachedTokens: record.cachedTokens,
346
- cacheWriteTokens: record.cacheWriteTokens,
347
- reasoningTokens: record.reasoningTokens,
348
- tokenSource: record.tokenSource,
349
- costSource: record.costSource
350
- };
351
- }
352
- function openAIAgentAttribution(result, options) {
353
- const apiKeyId = string(result.api_key_id);
354
- const projectId = string(result.project_id);
355
- const agentId = (apiKeyId ? options.agentByApiKeyId?.[apiKeyId] : undefined) ??
356
- (projectId ? options.agentByProjectId?.[projectId] : undefined);
357
- return agentId ? { agentId } : {};
358
- }
359
- function openAIDimensions(result) {
360
- return compactJson({
361
- apiKeyId: string(result.api_key_id),
362
- projectId: string(result.project_id),
363
- model: string(result.model),
364
- lineItem: string(result.line_item),
365
- serviceTier: string(result.service_tier),
366
- batch: typeof result.batch === "boolean" ? result.batch : undefined
367
- });
368
- }
369
- function providerReceipt(source, startTime, endTime, result) {
370
- return {
371
- source,
372
- bucketStart: epochIso(startTime),
373
- bucketEnd: epochIso(endTime),
374
- result: result
375
- };
376
- }
377
- function controlKey(provider, source, bucket, dimensions) {
378
- return `control:${provider}:${source}:${bucket}:${sha256Json(dimensions)}`;
379
- }
380
- function settledDailyRange(from, to, now, lagHours) {
381
- if (!Number.isFinite(lagHours) || lagHours < 0) {
382
- throw new UsageAccountingError("Provider settlement lag must be non-negative.");
383
- }
384
- const cutoff = new Date(now.getTime() - lagHours * 60 * 60 * 1_000);
385
- const settledTo = utcDay(cutoff);
386
- return normalizedRange(from, to, settledTo);
387
- }
388
- function completedUtcRange(from, to, now) {
389
- return normalizedRange(from, to, utcDay(now));
390
- }
391
- function normalizedRange(from, to, maximumTo) {
392
- const normalizedFrom = iso(from, "from");
393
- const requestedTo = to ? iso(to, "to") : maximumTo;
394
- const normalizedTo = requestedTo < maximumTo ? requestedTo : maximumTo;
395
- if (normalizedFrom >= normalizedTo) {
396
- throw new UsageAccountingError("Reconciliation range has no completed provider buckets.");
397
- }
398
- return { from: normalizedFrom, to: normalizedTo };
399
- }
400
- function utcDay(value) {
401
- return `${value.toISOString().slice(0, 10)}T00:00:00.000Z`;
402
- }
403
- function utcDates(from, to) {
404
- const dates = [];
405
- for (let cursor = new Date(from); cursor < new Date(to); cursor = new Date(cursor.getTime() + 86_400_000)) {
406
- dates.push(cursor.toISOString().slice(0, 10));
407
- }
408
- if (dates.length > 30) {
409
- throw new UsageAccountingError("OpenRouter activity reconciliation supports at most 30 completed UTC days.");
410
- }
411
- return dates;
412
- }
413
75
  function difference(left, right) {
414
76
  return (BigInt(left) - BigInt(right)).toString();
415
77
  }
416
- function epochIso(value) {
417
- return new Date(value * 1_000).toISOString();
418
- }
419
- function iso(value, name) {
420
- const date = new Date(value);
421
- if (Number.isNaN(date.getTime()))
422
- throw new UsageAccountingError(`${name} must be an ISO timestamp.`);
423
- return date.toISOString();
424
- }
425
- function arrayObjects(value) {
426
- return Array.isArray(value)
427
- ? value.filter((entry) => Boolean(object(entry)))
428
- : [];
429
- }
430
- function object(value) {
431
- return Boolean(value) && typeof value === "object" && !Array.isArray(value)
432
- ? value
433
- : undefined;
434
- }
435
- function compactJson(value) {
436
- return Object.fromEntries(Object.entries(value).filter(([, entry]) => typeof entry === "string" ||
437
- typeof entry === "number" ||
438
- typeof entry === "boolean"));
439
- }
440
- function string(value) {
441
- return typeof value === "string" && value.trim() ? value.trim() : undefined;
442
- }
443
- function clean(value) {
444
- return value?.trim() || undefined;
445
- }
446
- function number(value) {
447
- const parsed = typeof value === "number" ? value : typeof value === "string" ? Number(value) : NaN;
448
- return Number.isFinite(parsed) && parsed >= 0 ? parsed : undefined;
449
- }
450
- function integer(value) {
451
- const parsed = number(value);
452
- return parsed !== undefined && Number.isSafeInteger(parsed) ? parsed : undefined;
453
- }
454
- function requiredSecret(value, name) {
455
- const secret = clean(value);
456
- if (!secret)
457
- throw new UsageAccountingError(`${name} is required.`);
458
- return secret;
459
- }
460
- function delay(ms) {
461
- return new Promise((resolve) => setTimeout(resolve, ms));
78
+ function isUsageReconcilerModule(value) {
79
+ if (!value || typeof value !== "object")
80
+ return false;
81
+ const providers = value.providers;
82
+ return Array.isArray(providers) && providers.every((provider) => Boolean(provider) && typeof provider === "object" &&
83
+ typeof provider.provider === "string" &&
84
+ typeof provider.reconcile === "function");
462
85
  }
463
86
  //# sourceMappingURL=usage-reconciliation.js.map