@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.
- package/README.md +20 -5
- package/dist/a2a-client.d.ts +1 -3
- package/dist/a2a-client.d.ts.map +1 -1
- package/dist/a2a-client.js +1 -4
- package/dist/a2a-client.js.map +1 -1
- package/dist/agent-event-handlers.d.ts +2 -0
- package/dist/agent-event-handlers.d.ts.map +1 -1
- package/dist/agent-event-handlers.js +1 -1
- package/dist/agent-event-handlers.js.map +1 -1
- package/dist/agent-hook-context.d.ts.map +1 -1
- package/dist/agent-hook-context.js +3 -1
- package/dist/agent-hook-context.js.map +1 -1
- package/dist/agent-hook-controller-factory.d.ts +5 -1
- package/dist/agent-hook-controller-factory.d.ts.map +1 -1
- package/dist/agent-hook-controller-factory.js +11 -9
- package/dist/agent-hook-controller-factory.js.map +1 -1
- package/dist/agent-hook-evaluation.d.ts +0 -2
- package/dist/agent-hook-evaluation.d.ts.map +1 -1
- package/dist/agent-hook-evaluation.js +10 -10
- package/dist/agent-hook-evaluation.js.map +1 -1
- package/dist/agent-hook-run-lifecycle.d.ts +1 -2
- package/dist/agent-hook-run-lifecycle.d.ts.map +1 -1
- package/dist/agent-hook-run-lifecycle.js +1 -2
- package/dist/agent-hook-run-lifecycle.js.map +1 -1
- package/dist/agent-surface.d.ts +5 -2
- package/dist/agent-surface.d.ts.map +1 -1
- package/dist/agent-surface.js +11 -3
- package/dist/agent-surface.js.map +1 -1
- package/dist/artifact-selection.js +1 -1
- package/dist/artifact-selection.js.map +1 -1
- package/dist/assembly-line-runtime.d.ts +9 -0
- package/dist/assembly-line-runtime.d.ts.map +1 -0
- package/dist/assembly-line-runtime.js +9 -0
- package/dist/assembly-line-runtime.js.map +1 -0
- package/dist/attachment-download.d.ts +17 -0
- package/dist/attachment-download.d.ts.map +1 -0
- package/dist/attachment-download.js +51 -0
- package/dist/attachment-download.js.map +1 -0
- package/dist/attachments.d.ts +2 -14
- package/dist/attachments.d.ts.map +1 -1
- package/dist/attachments.js +8 -80
- package/dist/attachments.js.map +1 -1
- package/dist/background-review-types.d.ts +2 -0
- package/dist/background-review-types.d.ts.map +1 -1
- package/dist/background-review.d.ts.map +1 -1
- package/dist/background-review.js +13 -0
- package/dist/background-review.js.map +1 -1
- package/dist/background-subagents.d.ts +1 -1
- package/dist/background-subagents.d.ts.map +1 -1
- package/dist/blob-storage.d.ts +12 -0
- package/dist/blob-storage.d.ts.map +1 -0
- package/dist/blob-storage.js +86 -0
- package/dist/blob-storage.js.map +1 -0
- package/dist/builtin-tool-executors.d.ts.map +1 -1
- package/dist/builtin-tool-executors.js +12 -11
- package/dist/builtin-tool-executors.js.map +1 -1
- package/dist/builtin-tools.d.ts +1 -2
- package/dist/builtin-tools.d.ts.map +1 -1
- package/dist/builtin-tools.js +0 -8
- package/dist/builtin-tools.js.map +1 -1
- package/dist/capability-inspection.d.ts +4 -0
- package/dist/capability-inspection.d.ts.map +1 -1
- package/dist/capability-inspection.js +10 -11
- package/dist/capability-inspection.js.map +1 -1
- package/dist/channel-credential-environment.d.ts +1 -1
- package/dist/channel-credential-environment.d.ts.map +1 -1
- package/dist/channel-credential-environment.js +1 -6
- package/dist/channel-credential-environment.js.map +1 -1
- package/dist/channel-ingress.d.ts +1 -2
- package/dist/channel-ingress.d.ts.map +1 -1
- package/dist/channel-ingress.js +2 -2
- package/dist/channel-ingress.js.map +1 -1
- package/dist/channel-operation.d.ts +0 -1
- package/dist/channel-operation.d.ts.map +1 -1
- package/dist/channel-operation.js +1 -2
- package/dist/channel-operation.js.map +1 -1
- package/dist/channel.d.ts +32 -3
- package/dist/channel.d.ts.map +1 -1
- package/dist/connection-assets.d.ts.map +1 -1
- package/dist/connection-assets.js.map +1 -1
- package/dist/connection-authorization-service.d.ts +52 -0
- package/dist/connection-authorization-service.d.ts.map +1 -0
- package/dist/connection-authorization-service.js +417 -0
- package/dist/connection-authorization-service.js.map +1 -0
- package/dist/connection-credential-materialization.d.ts +23 -0
- package/dist/connection-credential-materialization.d.ts.map +1 -0
- package/dist/connection-credential-materialization.js +223 -0
- package/dist/connection-credential-materialization.js.map +1 -0
- package/dist/connection-definition-loader.d.ts +6 -0
- package/dist/connection-definition-loader.d.ts.map +1 -0
- package/dist/connection-definition-loader.js +102 -0
- package/dist/connection-definition-loader.js.map +1 -0
- package/dist/connection-discovery.d.ts +11 -0
- package/dist/connection-discovery.d.ts.map +1 -0
- package/dist/connection-discovery.js +105 -0
- package/dist/connection-discovery.js.map +1 -0
- package/dist/connection-events.d.ts.map +1 -1
- package/dist/connection-events.js.map +1 -1
- package/dist/connection-oauth-client.d.ts +3 -0
- package/dist/connection-oauth-client.d.ts.map +1 -0
- package/dist/connection-oauth-client.js +64 -0
- package/dist/connection-oauth-client.js.map +1 -0
- package/dist/connection-runtime-types.d.ts +78 -0
- package/dist/connection-runtime-types.d.ts.map +1 -0
- package/dist/connection-runtime-types.js +31 -0
- package/dist/connection-runtime-types.js.map +1 -0
- package/dist/connections.d.ts +18 -167
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +71 -1017
- package/dist/connections.js.map +1 -1
- package/dist/context-policy-util.d.ts +0 -4
- package/dist/context-policy-util.d.ts.map +1 -1
- package/dist/context-policy-util.js +0 -10
- package/dist/context-policy-util.js.map +1 -1
- package/dist/conversation-context.d.ts +1 -1
- package/dist/conversation-context.d.ts.map +1 -1
- package/dist/conversation-context.js +12 -9
- package/dist/conversation-context.js.map +1 -1
- package/dist/default-outbound-route.d.ts +1 -0
- package/dist/default-outbound-route.d.ts.map +1 -1
- package/dist/default-outbound-route.js +1 -1
- package/dist/default-outbound-route.js.map +1 -1
- package/dist/delivery-queue.d.ts +1 -1
- package/dist/delivery-send.d.ts.map +1 -1
- package/dist/delivery-send.js +3 -2
- package/dist/delivery-send.js.map +1 -1
- package/dist/dynamic-schedule-execution.d.ts +4 -0
- package/dist/dynamic-schedule-execution.d.ts.map +1 -0
- package/dist/dynamic-schedule-execution.js +136 -0
- package/dist/dynamic-schedule-execution.js.map +1 -0
- package/dist/dynamic-schedule-runtime.d.ts +11 -20
- package/dist/dynamic-schedule-runtime.d.ts.map +1 -1
- package/dist/dynamic-schedule-runtime.js +27 -39
- package/dist/dynamic-schedule-runtime.js.map +1 -1
- package/dist/evolution-tracker.d.ts +52 -0
- package/dist/evolution-tracker.d.ts.map +1 -0
- package/dist/evolution-tracker.js +179 -0
- package/dist/evolution-tracker.js.map +1 -0
- package/dist/harness-capabilities.d.ts +7 -0
- package/dist/harness-capabilities.d.ts.map +1 -0
- package/dist/harness-capabilities.js +56 -0
- package/dist/harness-capabilities.js.map +1 -0
- package/dist/harness-continuation-persistence.d.ts +6 -0
- package/dist/harness-continuation-persistence.d.ts.map +1 -0
- package/dist/harness-continuation-persistence.js +11 -0
- package/dist/harness-continuation-persistence.js.map +1 -0
- package/dist/harness-execution-context.d.ts +10 -0
- package/dist/harness-execution-context.d.ts.map +1 -0
- package/dist/harness-execution-context.js +193 -0
- package/dist/harness-execution-context.js.map +1 -0
- package/dist/harness-loop-types.d.ts +67 -0
- package/dist/harness-loop-types.d.ts.map +1 -0
- package/dist/harness-loop-types.js +2 -0
- package/dist/harness-loop-types.js.map +1 -0
- package/dist/harness-loop.d.ts +13 -94
- package/dist/harness-loop.d.ts.map +1 -1
- package/dist/harness-loop.js +19 -551
- package/dist/harness-loop.js.map +1 -1
- package/dist/harness-tool-execution.d.ts +30 -0
- package/dist/harness-tool-execution.d.ts.map +1 -0
- package/dist/harness-tool-execution.js +397 -0
- package/dist/harness-tool-execution.js.map +1 -0
- package/dist/harness-transcript-resume.d.ts +18 -0
- package/dist/harness-transcript-resume.d.ts.map +1 -0
- package/dist/harness-transcript-resume.js +102 -0
- package/dist/harness-transcript-resume.js.map +1 -0
- package/dist/harness-turn-execution.d.ts +11 -0
- package/dist/harness-turn-execution.d.ts.map +1 -0
- package/dist/harness-turn-execution.js +157 -0
- package/dist/harness-turn-execution.js.map +1 -0
- package/dist/index.d.ts +10 -499
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -2139
- package/dist/index.js.map +1 -1
- package/dist/local-sandbox.d.ts +2 -1
- package/dist/local-sandbox.d.ts.map +1 -1
- package/dist/mcp-client.d.ts +11 -1
- package/dist/mcp-client.d.ts.map +1 -1
- package/dist/mcp-client.js +39 -7
- package/dist/mcp-client.js.map +1 -1
- package/dist/media-processor.d.ts +3 -1
- package/dist/media-processor.d.ts.map +1 -1
- package/dist/media-processor.js +15 -1
- package/dist/media-processor.js.map +1 -1
- package/dist/memory-storage.d.ts +51 -0
- package/dist/memory-storage.d.ts.map +1 -0
- package/dist/memory-storage.js +324 -0
- package/dist/memory-storage.js.map +1 -0
- package/dist/model-credential-stores.d.ts.map +1 -1
- package/dist/model-credential-stores.js +6 -12
- package/dist/model-credential-stores.js.map +1 -1
- package/dist/model-provider-environment.d.ts +4 -0
- package/dist/model-provider-environment.d.ts.map +1 -0
- package/dist/model-provider-environment.js +36 -0
- package/dist/model-provider-environment.js.map +1 -0
- package/dist/plugin-embeddings.d.ts +4 -0
- package/dist/plugin-embeddings.d.ts.map +1 -0
- package/dist/plugin-embeddings.js +75 -0
- package/dist/plugin-embeddings.js.map +1 -0
- package/dist/public-api.d.ts +8 -5
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +6 -4
- package/dist/public-api.js.map +1 -1
- package/dist/relay-mcp-client.js +1 -1
- package/dist/relay-mcp-client.js.map +1 -1
- package/dist/replay-resume-authorization.d.ts +8 -0
- package/dist/replay-resume-authorization.d.ts.map +1 -0
- package/dist/replay-resume-authorization.js +181 -0
- package/dist/replay-resume-authorization.js.map +1 -0
- package/dist/replay-resume-connection.d.ts +6 -0
- package/dist/replay-resume-connection.d.ts.map +1 -0
- package/dist/replay-resume-connection.js +75 -0
- package/dist/replay-resume-connection.js.map +1 -0
- package/dist/replay-resume-controls.d.ts +6 -0
- package/dist/replay-resume-controls.d.ts.map +1 -0
- package/dist/replay-resume-controls.js +157 -0
- package/dist/replay-resume-controls.js.map +1 -0
- package/dist/replay-resume-harness.d.ts +14 -0
- package/dist/replay-resume-harness.d.ts.map +1 -0
- package/dist/replay-resume-harness.js +158 -0
- package/dist/replay-resume-harness.js.map +1 -0
- package/dist/replay-resume-recovery.d.ts +10 -0
- package/dist/replay-resume-recovery.d.ts.map +1 -0
- package/dist/replay-resume-recovery.js +62 -0
- package/dist/replay-resume-recovery.js.map +1 -0
- package/dist/replay-resume-shared.d.ts +16 -0
- package/dist/replay-resume-shared.d.ts.map +1 -0
- package/dist/replay-resume-shared.js +55 -0
- package/dist/replay-resume-shared.js.map +1 -0
- package/dist/replay-resume-types.d.ts +85 -0
- package/dist/replay-resume-types.d.ts.map +1 -0
- package/dist/replay-resume-types.js +2 -0
- package/dist/replay-resume-types.js.map +1 -0
- package/dist/replay-resume.d.ts +7 -119
- package/dist/replay-resume.d.ts.map +1 -1
- package/dist/replay-resume.js +5 -715
- package/dist/replay-resume.js.map +1 -1
- package/dist/resource-projection-util.d.ts +1 -2
- package/dist/resource-projection-util.d.ts.map +1 -1
- package/dist/resource-projection-util.js +2 -11
- package/dist/resource-projection-util.js.map +1 -1
- package/dist/resource-projection.d.ts.map +1 -1
- package/dist/resource-projection.js +67 -22
- package/dist/resource-projection.js.map +1 -1
- package/dist/run-execution-host.d.ts +98 -0
- package/dist/run-execution-host.d.ts.map +1 -0
- package/dist/run-execution-host.js +2 -0
- package/dist/run-execution-host.js.map +1 -0
- package/dist/run-execution.d.ts +6 -0
- package/dist/run-execution.d.ts.map +1 -0
- package/dist/run-execution.js +313 -0
- package/dist/run-execution.js.map +1 -0
- package/dist/run-initialization.d.ts +19 -0
- package/dist/run-initialization.d.ts.map +1 -0
- package/dist/run-initialization.js +171 -0
- package/dist/run-initialization.js.map +1 -0
- package/dist/run-recovery.d.ts +1 -1
- package/dist/run-recovery.js.map +1 -1
- package/dist/runtime-connection-definitions.d.ts +35 -0
- package/dist/runtime-connection-definitions.d.ts.map +1 -0
- package/dist/runtime-connection-definitions.js +97 -0
- package/dist/runtime-connection-definitions.js.map +1 -0
- package/dist/runtime-engine-background.d.ts +64 -0
- package/dist/runtime-engine-background.d.ts.map +1 -0
- package/dist/runtime-engine-background.js +136 -0
- package/dist/runtime-engine-background.js.map +1 -0
- package/dist/runtime-engine-base.d.ts +60 -0
- package/dist/runtime-engine-base.d.ts.map +1 -0
- package/dist/runtime-engine-base.js +192 -0
- package/dist/runtime-engine-base.js.map +1 -0
- package/dist/runtime-engine-capabilities.d.ts +81 -0
- package/dist/runtime-engine-capabilities.d.ts.map +1 -0
- package/dist/runtime-engine-capabilities.js +198 -0
- package/dist/runtime-engine-capabilities.js.map +1 -0
- package/dist/runtime-engine-config.d.ts +77 -0
- package/dist/runtime-engine-config.d.ts.map +1 -0
- package/dist/runtime-engine-config.js +187 -0
- package/dist/runtime-engine-config.js.map +1 -0
- package/dist/runtime-engine-foundation.d.ts +11 -0
- package/dist/runtime-engine-foundation.d.ts.map +1 -0
- package/dist/runtime-engine-foundation.js +121 -0
- package/dist/runtime-engine-foundation.js.map +1 -0
- package/dist/runtime-engine-hooks.d.ts +33 -0
- package/dist/runtime-engine-hooks.d.ts.map +1 -0
- package/dist/runtime-engine-hooks.js +153 -0
- package/dist/runtime-engine-hooks.js.map +1 -0
- package/dist/runtime-engine-integrations.d.ts +16 -0
- package/dist/runtime-engine-integrations.d.ts.map +1 -0
- package/dist/runtime-engine-integrations.js +177 -0
- package/dist/runtime-engine-integrations.js.map +1 -0
- package/dist/runtime-engine-operations.d.ts +87 -0
- package/dist/runtime-engine-operations.d.ts.map +1 -0
- package/dist/runtime-engine-operations.js +204 -0
- package/dist/runtime-engine-operations.js.map +1 -0
- package/dist/runtime-engine-resources.d.ts +18 -0
- package/dist/runtime-engine-resources.d.ts.map +1 -0
- package/dist/runtime-engine-resources.js +49 -0
- package/dist/runtime-engine-resources.js.map +1 -0
- package/dist/runtime-engine-run.d.ts +70 -0
- package/dist/runtime-engine-run.d.ts.map +1 -0
- package/dist/runtime-engine-run.js +202 -0
- package/dist/runtime-engine-run.js.map +1 -0
- package/dist/runtime-engine-scheduling.d.ts +22 -0
- package/dist/runtime-engine-scheduling.d.ts.map +1 -0
- package/dist/runtime-engine-scheduling.js +45 -0
- package/dist/runtime-engine-scheduling.js.map +1 -0
- package/dist/runtime-engine-tools.d.ts +8 -0
- package/dist/runtime-engine-tools.d.ts.map +1 -0
- package/dist/runtime-engine-tools.js +80 -0
- package/dist/runtime-engine-tools.js.map +1 -0
- package/dist/runtime-evolution.d.ts +17 -0
- package/dist/runtime-evolution.d.ts.map +1 -0
- package/dist/runtime-evolution.js +51 -0
- package/dist/runtime-evolution.js.map +1 -0
- package/dist/runtime-learning.d.ts +4 -6
- package/dist/runtime-learning.d.ts.map +1 -1
- package/dist/runtime-learning.js +109 -99
- package/dist/runtime-learning.js.map +1 -1
- package/dist/runtime-types.d.ts +21 -7
- package/dist/runtime-types.d.ts.map +1 -1
- package/dist/runtime-util.d.ts +4 -3
- package/dist/runtime-util.d.ts.map +1 -1
- package/dist/runtime-util.js +0 -7
- package/dist/runtime-util.js.map +1 -1
- package/dist/sandbox-atomic-json.d.ts +4 -0
- package/dist/sandbox-atomic-json.d.ts.map +1 -0
- package/dist/sandbox-atomic-json.js +23 -0
- package/dist/sandbox-atomic-json.js.map +1 -0
- package/dist/sandbox-authored-tool-executor.d.ts.map +1 -1
- package/dist/sandbox-authored-tool-executor.js +13 -3
- package/dist/sandbox-authored-tool-executor.js.map +1 -1
- package/dist/sandbox-fs.d.ts +2 -7
- package/dist/sandbox-fs.d.ts.map +1 -1
- package/dist/sandbox-fs.js +6 -37
- package/dist/sandbox-fs.js.map +1 -1
- package/dist/sandbox-handle.d.ts +1 -3
- package/dist/sandbox-handle.d.ts.map +1 -1
- package/dist/sandbox-handle.js +2 -5
- package/dist/sandbox-handle.js.map +1 -1
- package/dist/sandbox-state-sync.d.ts +2 -0
- package/dist/sandbox-state-sync.d.ts.map +1 -1
- package/dist/sandbox-state-sync.js +26 -2
- package/dist/sandbox-state-sync.js.map +1 -1
- package/dist/sandbox-tool-bridge.d.ts.map +1 -1
- package/dist/sandbox-tool-bridge.js +23 -3
- package/dist/sandbox-tool-bridge.js.map +1 -1
- package/dist/schedule-execution.d.ts +4 -4
- package/dist/schedule-execution.d.ts.map +1 -1
- package/dist/schedule-execution.js +45 -440
- package/dist/schedule-execution.js.map +1 -1
- package/dist/schedule-trigger-context.d.ts +18 -0
- package/dist/schedule-trigger-context.d.ts.map +1 -0
- package/dist/schedule-trigger-context.js +276 -0
- package/dist/schedule-trigger-context.js.map +1 -0
- package/dist/scheduler.d.ts +1 -14
- package/dist/scheduler.d.ts.map +1 -1
- package/dist/scheduler.js +1 -37
- package/dist/scheduler.js.map +1 -1
- package/dist/security.d.ts +0 -4
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +0 -22
- package/dist/security.js.map +1 -1
- package/dist/self-improvement.d.ts +5 -21
- package/dist/self-improvement.d.ts.map +1 -1
- package/dist/self-improvement.js +10 -40
- package/dist/self-improvement.js.map +1 -1
- package/dist/source-loader.d.ts +0 -3
- package/dist/source-loader.d.ts.map +1 -1
- package/dist/source-loader.js +1 -10
- package/dist/source-loader.js.map +1 -1
- package/dist/state/conversation-state.d.ts +117 -0
- package/dist/state/conversation-state.d.ts.map +1 -0
- package/dist/state/conversation-state.js +2 -0
- package/dist/state/conversation-state.js.map +1 -0
- package/dist/state/run-state.d.ts +129 -0
- package/dist/state/run-state.d.ts.map +1 -0
- package/dist/state/run-state.js +3 -0
- package/dist/state/run-state.js.map +1 -0
- package/dist/state/sandbox-memory-state.d.ts +159 -0
- package/dist/state/sandbox-memory-state.d.ts.map +1 -0
- package/dist/state/sandbox-memory-state.js +2 -0
- package/dist/state/sandbox-memory-state.js.map +1 -0
- package/dist/state/store-contracts.d.ts +329 -0
- package/dist/state/store-contracts.d.ts.map +1 -0
- package/dist/state/store-contracts.js +26 -0
- package/dist/state/store-contracts.js.map +1 -0
- package/dist/state/usage-state.d.ts +111 -0
- package/dist/state/usage-state.d.ts.map +1 -0
- package/dist/state/usage-state.js +2 -0
- package/dist/state/usage-state.js.map +1 -0
- package/dist/state/workspace-state.d.ts +126 -0
- package/dist/state/workspace-state.d.ts.map +1 -0
- package/dist/state/workspace-state.js +16 -0
- package/dist/state/workspace-state.js.map +1 -0
- package/dist/state-stores.d.ts +3 -15
- package/dist/state-stores.d.ts.map +1 -1
- package/dist/state-stores.js +36 -82
- package/dist/state-stores.js.map +1 -1
- package/dist/state.d.ts +7 -1075
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +7 -88
- package/dist/state.js.map +1 -1
- package/dist/storage.d.ts +4 -64
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +5 -408
- package/dist/storage.js.map +1 -1
- package/dist/subagent-execution.d.ts +1 -2
- package/dist/subagent-execution.d.ts.map +1 -1
- package/dist/subagent-execution.js +2 -26
- package/dist/subagent-execution.js.map +1 -1
- package/dist/subagent-handoff.d.ts +13 -0
- package/dist/subagent-handoff.d.ts.map +1 -1
- package/dist/subagent-handoff.js +74 -9
- package/dist/subagent-handoff.js.map +1 -1
- package/dist/tool-apis.d.ts +2 -2
- package/dist/tool-apis.d.ts.map +1 -1
- package/dist/tool-apis.js +26 -14
- package/dist/tool-apis.js.map +1 -1
- package/dist/tool-execution-host.d.ts +122 -0
- package/dist/tool-execution-host.d.ts.map +1 -0
- package/dist/tool-execution-host.js +2 -0
- package/dist/tool-execution-host.js.map +1 -0
- package/dist/tool-execution.d.ts +5 -141
- package/dist/tool-execution.d.ts.map +1 -1
- package/dist/tool-execution.js +6 -395
- package/dist/tool-execution.js.map +1 -1
- package/dist/usage-reconciliation-support.d.ts +20 -0
- package/dist/usage-reconciliation-support.d.ts.map +1 -0
- package/dist/usage-reconciliation-support.js +95 -0
- package/dist/usage-reconciliation-support.js.map +1 -0
- package/dist/usage-reconciliation.d.ts +14 -35
- package/dist/usage-reconciliation.d.ts.map +1 -1
- package/dist/usage-reconciliation.js +17 -394
- package/dist/usage-reconciliation.js.map +1 -1
- package/dist/workspace-paths.d.ts +3 -0
- package/dist/workspace-paths.d.ts.map +1 -0
- package/dist/workspace-paths.js +13 -0
- package/dist/workspace-paths.js.map +1 -0
- package/dist/workspace-service.d.ts +0 -1
- package/dist/workspace-service.d.ts.map +1 -1
- package/dist/workspace-service.js +1 -4
- package/dist/workspace-service.js.map +1 -1
- package/package.json +3 -3
- package/dist/run-timeline.d.ts +0 -11
- package/dist/run-timeline.d.ts.map +0 -1
- package/dist/run-timeline.js +0 -2
- package/dist/run-timeline.js.map +0 -1
- package/dist/trusted-attachments.d.ts +0 -20
- package/dist/trusted-attachments.d.ts.map +0 -1
- package/dist/trusted-attachments.js +0 -276
- 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
|
|
35
|
+
export interface UsageReconcilerContext {
|
|
34
36
|
state: UsageStore;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
/**
|
|
70
|
-
export declare function
|
|
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":"
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
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
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
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
|