@alvin0/ai-agent-sdk-core 0.1.0
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/LICENSE +21 -0
- package/README.md +52 -0
- package/dist/agent/accounting/common.js +2 -0
- package/dist/agent/accounting/common.js.map +1 -0
- package/dist/agent/accounting/config.js +2 -0
- package/dist/agent/accounting/config.js.map +1 -0
- package/dist/agent/accounting/contracts.d.ts +36 -0
- package/dist/agent/accounting/contracts.d.ts.map +1 -0
- package/dist/agent/accounting/delivery/accounting-data.js +2 -0
- package/dist/agent/accounting/delivery/accounting-data.js.map +1 -0
- package/dist/agent/accounting/delivery/config.js +2 -0
- package/dist/agent/accounting/delivery/config.js.map +1 -0
- package/dist/agent/accounting/delivery/data.js +2 -0
- package/dist/agent/accounting/delivery/data.js.map +1 -0
- package/dist/agent/accounting/delivery/support-errors.js +2 -0
- package/dist/agent/accounting/delivery/support-errors.js.map +1 -0
- package/dist/agent/accounting/delivery/terminal.js +2 -0
- package/dist/agent/accounting/delivery/terminal.js.map +1 -0
- package/dist/agent/accounting/delivery-types.d.ts +43 -0
- package/dist/agent/accounting/delivery-types.d.ts.map +1 -0
- package/dist/agent/accounting/error.d.ts +18 -0
- package/dist/agent/accounting/error.d.ts.map +1 -0
- package/dist/agent/accounting/error.js +2 -0
- package/dist/agent/accounting/error.js.map +1 -0
- package/dist/agent/accounting/estimate.js +2 -0
- package/dist/agent/accounting/estimate.js.map +1 -0
- package/dist/agent/accounting/event-buffer.js +2 -0
- package/dist/agent/accounting/event-buffer.js.map +1 -0
- package/dist/agent/accounting/ledger.js +2 -0
- package/dist/agent/accounting/ledger.js.map +1 -0
- package/dist/agent/accounting/report.d.ts +70 -0
- package/dist/agent/accounting/report.d.ts.map +1 -0
- package/dist/agent/accounting/usage.d.ts +13 -0
- package/dist/agent/accounting/usage.d.ts.map +1 -0
- package/dist/agent/accounting/usage.js +2 -0
- package/dist/agent/accounting/usage.js.map +1 -0
- package/dist/agent/context/section.d.ts +15 -0
- package/dist/agent/context/section.d.ts.map +1 -0
- package/dist/agent/context/section.js +2 -0
- package/dist/agent/context/section.js.map +1 -0
- package/dist/agent/context/types.d.ts +98 -0
- package/dist/agent/context/types.d.ts.map +1 -0
- package/dist/agent/define/definition.d.ts +110 -0
- package/dist/agent/define/definition.d.ts.map +1 -0
- package/dist/agent/define/definition.js +2 -0
- package/dist/agent/define/definition.js.map +1 -0
- package/dist/agent/define/instructions.js +2 -0
- package/dist/agent/define/instructions.js.map +1 -0
- package/dist/agent/define/output-format.js +2 -0
- package/dist/agent/define/output-format.js.map +1 -0
- package/dist/agent/define/session/accounting.js +2 -0
- package/dist/agent/define/session/accounting.js.map +1 -0
- package/dist/agent/define/session/common.js +2 -0
- package/dist/agent/define/session/common.js.map +1 -0
- package/dist/agent/define/session/config.js +2 -0
- package/dist/agent/define/session/config.js.map +1 -0
- package/dist/agent/define/session/model-config.js +2 -0
- package/dist/agent/define/session/model-config.js.map +1 -0
- package/dist/agent/define/session/observer.js +2 -0
- package/dist/agent/define/session/observer.js.map +1 -0
- package/dist/agent/define/session/run-seal.js +2 -0
- package/dist/agent/define/session/run-seal.js.map +1 -0
- package/dist/agent/define/session/runtime-binding.js +2 -0
- package/dist/agent/define/session/runtime-binding.js.map +1 -0
- package/dist/agent/define/session/runtime-compaction.js +2 -0
- package/dist/agent/define/session/runtime-compaction.js.map +1 -0
- package/dist/agent/define/session/runtime-memory.js +2 -0
- package/dist/agent/define/session/runtime-memory.js.map +1 -0
- package/dist/agent/define/session/skills.js +2 -0
- package/dist/agent/define/session/skills.js.map +1 -0
- package/dist/agent/define/session/trace-accounting.js +2 -0
- package/dist/agent/define/session/trace-accounting.js.map +1 -0
- package/dist/agent/define/session/types.d.ts +217 -0
- package/dist/agent/define/session/types.d.ts.map +1 -0
- package/dist/agent/define/session/validation.js +2 -0
- package/dist/agent/define/session/validation.js.map +1 -0
- package/dist/agent/define/session.d.ts +77 -0
- package/dist/agent/define/session.d.ts.map +1 -0
- package/dist/agent/define/session.js +2 -0
- package/dist/agent/define/session.js.map +1 -0
- package/dist/agent/history/config.js +2 -0
- package/dist/agent/history/config.js.map +1 -0
- package/dist/agent/history/history.d.ts +33 -0
- package/dist/agent/history/history.d.ts.map +1 -0
- package/dist/agent/history/history.js +2 -0
- package/dist/agent/history/history.js.map +1 -0
- package/dist/agent/history/normalize.d.ts +7 -0
- package/dist/agent/history/normalize.d.ts.map +1 -0
- package/dist/agent/history/normalize.js +2 -0
- package/dist/agent/history/normalize.js.map +1 -0
- package/dist/agent/history/project.d.ts +14 -0
- package/dist/agent/history/project.d.ts.map +1 -0
- package/dist/agent/history/project.js +2 -0
- package/dist/agent/history/project.js.map +1 -0
- package/dist/agent/history/types.d.ts +85 -0
- package/dist/agent/history/types.d.ts.map +1 -0
- package/dist/agent/history/validation.js +2 -0
- package/dist/agent/history/validation.js.map +1 -0
- package/dist/agent/loop/events.d.ts +213 -0
- package/dist/agent/loop/events.d.ts.map +1 -0
- package/dist/agent/loop/queue.js +2 -0
- package/dist/agent/loop/queue.js.map +1 -0
- package/dist/agent/loop/run-turn.d.ts +8 -0
- package/dist/agent/loop/run-turn.d.ts.map +1 -0
- package/dist/agent/loop/run-turn.js +2 -0
- package/dist/agent/loop/run-turn.js.map +1 -0
- package/dist/agent/loop/schedule.d.ts +62 -0
- package/dist/agent/loop/schedule.d.ts.map +1 -0
- package/dist/agent/loop/schedule.js +3 -0
- package/dist/agent/loop/schedule.js.map +1 -0
- package/dist/agent/loop/turn/cancellation.js +2 -0
- package/dist/agent/loop/turn/cancellation.js.map +1 -0
- package/dist/agent/loop/turn/common.js +2 -0
- package/dist/agent/loop/turn/common.js.map +1 -0
- package/dist/agent/loop/turn/config.js +2 -0
- package/dist/agent/loop/turn/config.js.map +1 -0
- package/dist/agent/loop/turn/content.js +4 -0
- package/dist/agent/loop/turn/content.js.map +1 -0
- package/dist/agent/loop/turn/hooks.js +2 -0
- package/dist/agent/loop/turn/hooks.js.map +1 -0
- package/dist/agent/loop/turn/model-round.js +2 -0
- package/dist/agent/loop/turn/model-round.js.map +1 -0
- package/dist/agent/loop/turn/repetition.js +2 -0
- package/dist/agent/loop/turn/repetition.js.map +1 -0
- package/dist/agent/loop/turn/types.d.ts +82 -0
- package/dist/agent/loop/turn/types.d.ts.map +1 -0
- package/dist/agent/loop/turn/usage-stop.js +2 -0
- package/dist/agent/loop/turn/usage-stop.js.map +1 -0
- package/dist/agent/loop/turn/validation.js +2 -0
- package/dist/agent/loop/turn/validation.js.map +1 -0
- package/dist/agent/loop/types.d.ts +82 -0
- package/dist/agent/loop/types.d.ts.map +1 -0
- package/dist/agent/memory/accounting-binding.js +2 -0
- package/dist/agent/memory/accounting-binding.js.map +1 -0
- package/dist/agent/memory/compaction-config.d.ts +63 -0
- package/dist/agent/memory/compaction-config.d.ts.map +1 -0
- package/dist/agent/memory/compaction-config.js +2 -0
- package/dist/agent/memory/compaction-config.js.map +1 -0
- package/dist/agent/memory/compaction.d.ts +62 -0
- package/dist/agent/memory/compaction.d.ts.map +1 -0
- package/dist/agent/memory/compaction.js +6 -0
- package/dist/agent/memory/compaction.js.map +1 -0
- package/dist/agent/memory/memory.d.ts +61 -0
- package/dist/agent/memory/memory.d.ts.map +1 -0
- package/dist/agent/memory/memory.js +5 -0
- package/dist/agent/memory/memory.js.map +1 -0
- package/dist/agent/memory/persistence-types.d.ts +44 -0
- package/dist/agent/memory/persistence-types.d.ts.map +1 -0
- package/dist/agent/memory/surface-compaction.d.ts +6 -0
- package/dist/agent/memory/surface-compaction.d.ts.map +1 -0
- package/dist/agent/memory/surface-compaction.js +4 -0
- package/dist/agent/memory/surface-compaction.js.map +1 -0
- package/dist/agent/memory/token-estimator.d.ts +12 -0
- package/dist/agent/memory/token-estimator.d.ts.map +1 -0
- package/dist/agent/memory/token-estimator.js +2 -0
- package/dist/agent/memory/token-estimator.js.map +1 -0
- package/dist/agent/mode/run-agent.d.ts +79 -0
- package/dist/agent/mode/run-agent.d.ts.map +1 -0
- package/dist/agent/mode/run-agent.js +4 -0
- package/dist/agent/mode/run-agent.js.map +1 -0
- package/dist/agent/mode/user-input.d.ts +61 -0
- package/dist/agent/mode/user-input.d.ts.map +1 -0
- package/dist/agent/mode/user-input.js +2 -0
- package/dist/agent/mode/user-input.js.map +1 -0
- package/dist/agent/skill/catalog.d.ts +53 -0
- package/dist/agent/skill/catalog.d.ts.map +1 -0
- package/dist/agent/skill/catalog.js +2 -0
- package/dist/agent/skill/catalog.js.map +1 -0
- package/dist/agent/skill/definition.d.ts +106 -0
- package/dist/agent/skill/definition.d.ts.map +1 -0
- package/dist/agent/skill/definition.js +2 -0
- package/dist/agent/skill/definition.js.map +1 -0
- package/dist/agent/skill/provider/config.d.ts +11 -0
- package/dist/agent/skill/provider/config.d.ts.map +1 -0
- package/dist/agent/skill/provider/config.js +2 -0
- package/dist/agent/skill/provider/config.js.map +1 -0
- package/dist/agent/skill/provider/context.js +2 -0
- package/dist/agent/skill/provider/context.js.map +1 -0
- package/dist/agent/skill/provider/definition.d.ts +6 -0
- package/dist/agent/skill/provider/definition.d.ts.map +1 -0
- package/dist/agent/skill/provider/definition.js +2 -0
- package/dist/agent/skill/provider/definition.js.map +1 -0
- package/dist/agent/skill/provider/snapshot.js +2 -0
- package/dist/agent/skill/provider/snapshot.js.map +1 -0
- package/dist/agent/skill/provider/types.d.ts +49 -0
- package/dist/agent/skill/provider/types.d.ts.map +1 -0
- package/dist/agent/skill/tools.d.ts +45 -0
- package/dist/agent/skill/tools.d.ts.map +1 -0
- package/dist/agent/skill/tools.js +14 -0
- package/dist/agent/skill/tools.js.map +1 -0
- package/dist/agent/team/common.d.ts +26 -0
- package/dist/agent/team/common.d.ts.map +1 -0
- package/dist/agent/team/common.js +2 -0
- package/dist/agent/team/common.js.map +1 -0
- package/dist/agent/team/composed.d.ts +45 -0
- package/dist/agent/team/composed.d.ts.map +1 -0
- package/dist/agent/team/composed.js +2 -0
- package/dist/agent/team/composed.js.map +1 -0
- package/dist/agent/team/contracts.d.ts +54 -0
- package/dist/agent/team/contracts.d.ts.map +1 -0
- package/dist/agent/team/managed.d.ts +527 -0
- package/dist/agent/team/managed.d.ts.map +1 -0
- package/dist/agent/team/managed.js +4 -0
- package/dist/agent/team/managed.js.map +1 -0
- package/dist/agent/team/team.d.ts +142 -0
- package/dist/agent/team/team.d.ts.map +1 -0
- package/dist/agent/team/team.js +2 -0
- package/dist/agent/team/team.js.map +1 -0
- package/dist/agent/team/types.d.ts +170 -0
- package/dist/agent/team/types.d.ts.map +1 -0
- package/dist/agent/tool/approval.d.ts +106 -0
- package/dist/agent/tool/approval.d.ts.map +1 -0
- package/dist/agent/tool/approval.js +2 -0
- package/dist/agent/tool/approval.js.map +1 -0
- package/dist/agent/tool/capture.js +2 -0
- package/dist/agent/tool/capture.js.map +1 -0
- package/dist/agent/tool/config.js +2 -0
- package/dist/agent/tool/config.js.map +1 -0
- package/dist/agent/tool/definition.d.ts +227 -0
- package/dist/agent/tool/definition.d.ts.map +1 -0
- package/dist/agent/tool/definition.js +2 -0
- package/dist/agent/tool/definition.js.map +1 -0
- package/dist/agent/tool/errors.d.ts +82 -0
- package/dist/agent/tool/errors.d.ts.map +1 -0
- package/dist/agent/tool/errors.js +2 -0
- package/dist/agent/tool/errors.js.map +1 -0
- package/dist/agent/tool/execution.d.ts +60 -0
- package/dist/agent/tool/execution.d.ts.map +1 -0
- package/dist/agent/tool/execution.js +2 -0
- package/dist/agent/tool/execution.js.map +1 -0
- package/dist/agent/tool/output-budget.d.ts +159 -0
- package/dist/agent/tool/output-budget.d.ts.map +1 -0
- package/dist/agent/tool/output-budget.js +3 -0
- package/dist/agent/tool/output-budget.js.map +1 -0
- package/dist/agent/tool/pipeline.d.ts +98 -0
- package/dist/agent/tool/pipeline.d.ts.map +1 -0
- package/dist/agent/tool/pipeline.js +4 -0
- package/dist/agent/tool/pipeline.js.map +1 -0
- package/dist/agent/tool/registry.d.ts +70 -0
- package/dist/agent/tool/registry.d.ts.map +1 -0
- package/dist/agent/tool/registry.js +2 -0
- package/dist/agent/tool/registry.js.map +1 -0
- package/dist/agent/tool/schema.d.ts +12 -0
- package/dist/agent/tool/schema.d.ts.map +1 -0
- package/dist/agent/tool/schema.js +2 -0
- package/dist/agent/tool/schema.js.map +1 -0
- package/dist/agent/tool/source-types.d.ts +25 -0
- package/dist/agent/tool/source-types.d.ts.map +1 -0
- package/dist/agent/trace/trace.d.ts +63 -0
- package/dist/agent/trace/trace.d.ts.map +1 -0
- package/dist/agent/trace/trace.js +2 -0
- package/dist/agent/trace/trace.js.map +1 -0
- package/dist/agent.d.ts +52 -0
- package/dist/agent.js +1 -0
- package/dist/async/settlement.d.ts +6 -0
- package/dist/async/settlement.d.ts.map +1 -0
- package/dist/async/settlement.js +2 -0
- package/dist/async/settlement.js.map +1 -0
- package/dist/capability/common/config.js +2 -0
- package/dist/capability/common/config.js.map +1 -0
- package/dist/capability/common/data.js +2 -0
- package/dist/capability/common/data.js.map +1 -0
- package/dist/composition/agent/author.d.ts +12 -0
- package/dist/composition/agent/author.d.ts.map +1 -0
- package/dist/composition/agent/author.js +2 -0
- package/dist/composition/agent/author.js.map +1 -0
- package/dist/composition/agent/definition.js +2 -0
- package/dist/composition/agent/definition.js.map +1 -0
- package/dist/composition/agent/native-event.js +2 -0
- package/dist/composition/agent/native-event.js.map +1 -0
- package/dist/composition/agent/native-tools.js +2 -0
- package/dist/composition/agent/native-tools.js.map +1 -0
- package/dist/composition/agent/options.js +2 -0
- package/dist/composition/agent/options.js.map +1 -0
- package/dist/composition/agent/policy.js +2 -0
- package/dist/composition/agent/policy.js.map +1 -0
- package/dist/composition/agent/public-message.js +2 -0
- package/dist/composition/agent/public-message.js.map +1 -0
- package/dist/composition/agent/session.js +2 -0
- package/dist/composition/agent/session.js.map +1 -0
- package/dist/composition/agent/types.d.ts +218 -0
- package/dist/composition/agent/types.d.ts.map +1 -0
- package/dist/composition/common/counter.js +2 -0
- package/dist/composition/common/counter.js.map +1 -0
- package/dist/composition/common/errors.d.ts +15 -0
- package/dist/composition/common/errors.d.ts.map +1 -0
- package/dist/composition/common/errors.js +2 -0
- package/dist/composition/common/errors.js.map +1 -0
- package/dist/composition/common/json-data.js +2 -0
- package/dist/composition/common/json-data.js.map +1 -0
- package/dist/composition/credential/config.d.ts +5 -0
- package/dist/composition/credential/config.d.ts.map +1 -0
- package/dist/composition/credential/config.js +2 -0
- package/dist/composition/credential/config.js.map +1 -0
- package/dist/composition/credential/definition.d.ts +9 -0
- package/dist/composition/credential/definition.d.ts.map +1 -0
- package/dist/composition/credential/definition.js +2 -0
- package/dist/composition/credential/definition.js.map +1 -0
- package/dist/composition/credential/types.d.ts +38 -0
- package/dist/composition/credential/types.d.ts.map +1 -0
- package/dist/composition/delivery/ack.js +2 -0
- package/dist/composition/delivery/ack.js.map +1 -0
- package/dist/composition/delivery/attempt.js +2 -0
- package/dist/composition/delivery/attempt.js.map +1 -0
- package/dist/composition/delivery/batch.js +2 -0
- package/dist/composition/delivery/batch.js.map +1 -0
- package/dist/composition/delivery/checkpoint.js +2 -0
- package/dist/composition/delivery/checkpoint.js.map +1 -0
- package/dist/composition/delivery/event.js +2 -0
- package/dist/composition/delivery/event.js.map +1 -0
- package/dist/composition/delivery/resource.d.ts +11 -0
- package/dist/composition/delivery/resource.d.ts.map +1 -0
- package/dist/composition/delivery/resource.js +2 -0
- package/dist/composition/delivery/resource.js.map +1 -0
- package/dist/composition/delivery/staging.js +2 -0
- package/dist/composition/delivery/staging.js.map +1 -0
- package/dist/composition/diagnostics/config.js +2 -0
- package/dist/composition/diagnostics/config.js.map +1 -0
- package/dist/composition/diagnostics/ring.d.ts +12 -0
- package/dist/composition/diagnostics/ring.d.ts.map +1 -0
- package/dist/composition/diagnostics/ring.js +2 -0
- package/dist/composition/diagnostics/ring.js.map +1 -0
- package/dist/composition/exporter/definition.d.ts +7 -0
- package/dist/composition/exporter/definition.d.ts.map +1 -0
- package/dist/composition/exporter/definition.js +2 -0
- package/dist/composition/exporter/definition.js.map +1 -0
- package/dist/composition/exporter/lifecycle.js +2 -0
- package/dist/composition/exporter/lifecycle.js.map +1 -0
- package/dist/composition/exporter/preflight.js +2 -0
- package/dist/composition/exporter/preflight.js.map +1 -0
- package/dist/composition/exporter/types.d.ts +25 -0
- package/dist/composition/exporter/types.d.ts.map +1 -0
- package/dist/composition/exporter/types.js +2 -0
- package/dist/composition/exporter/types.js.map +1 -0
- package/dist/composition/identity/agent.js +2 -0
- package/dist/composition/identity/agent.js.map +1 -0
- package/dist/composition/lifecycle/bounded.js +2 -0
- package/dist/composition/lifecycle/bounded.js.map +1 -0
- package/dist/composition/lifecycle/operations.js +2 -0
- package/dist/composition/lifecycle/operations.js.map +1 -0
- package/dist/composition/lifecycle/types.d.ts +13 -0
- package/dist/composition/lifecycle/types.d.ts.map +1 -0
- package/dist/composition/lifecycle/types.js +2 -0
- package/dist/composition/lifecycle/types.js.map +1 -0
- package/dist/composition/logging/config.js +2 -0
- package/dist/composition/logging/config.js.map +1 -0
- package/dist/composition/logging/integration.js +2 -0
- package/dist/composition/logging/integration.js.map +1 -0
- package/dist/composition/logging/logger.d.ts +9 -0
- package/dist/composition/logging/logger.d.ts.map +1 -0
- package/dist/composition/logging/logger.js +2 -0
- package/dist/composition/logging/logger.js.map +1 -0
- package/dist/composition/memory/config.d.ts +10 -0
- package/dist/composition/memory/config.d.ts.map +1 -0
- package/dist/composition/memory/config.js +2 -0
- package/dist/composition/memory/config.js.map +1 -0
- package/dist/composition/memory/definition.d.ts +7 -0
- package/dist/composition/memory/definition.d.ts.map +1 -0
- package/dist/composition/memory/definition.js +2 -0
- package/dist/composition/memory/definition.js.map +1 -0
- package/dist/composition/memory/key.js +2 -0
- package/dist/composition/memory/key.js.map +1 -0
- package/dist/composition/memory/resume.js +2 -0
- package/dist/composition/memory/resume.js.map +1 -0
- package/dist/composition/memory/run.js +2 -0
- package/dist/composition/memory/run.js.map +1 -0
- package/dist/composition/model-catalog/config.js +2 -0
- package/dist/composition/model-catalog/config.js.map +1 -0
- package/dist/composition/model-catalog/manager.js +2 -0
- package/dist/composition/model-catalog/manager.js.map +1 -0
- package/dist/composition/model-catalog/options.js +2 -0
- package/dist/composition/model-catalog/options.js.map +1 -0
- package/dist/composition/model-catalog/types.d.ts +9 -0
- package/dist/composition/model-catalog/types.d.ts.map +1 -0
- package/dist/composition/observation/config.js +2 -0
- package/dist/composition/observation/config.js.map +1 -0
- package/dist/composition/observation/extensions.js +2 -0
- package/dist/composition/observation/extensions.js.map +1 -0
- package/dist/composition/observation/final-report.d.ts +6 -0
- package/dist/composition/observation/final-report.d.ts.map +1 -0
- package/dist/composition/observation/final-report.js +2 -0
- package/dist/composition/observation/final-report.js.map +1 -0
- package/dist/composition/observation/health.d.ts +13 -0
- package/dist/composition/observation/health.d.ts.map +1 -0
- package/dist/composition/observation/port.d.ts +11 -0
- package/dist/composition/observation/port.d.ts.map +1 -0
- package/dist/composition/observation/port.js +2 -0
- package/dist/composition/observation/port.js.map +1 -0
- package/dist/composition/preflight.js +2 -0
- package/dist/composition/preflight.js.map +1 -0
- package/dist/composition/provider/activation.js +2 -0
- package/dist/composition/provider/activation.js.map +1 -0
- package/dist/composition/provider/definition.d.ts +7 -0
- package/dist/composition/provider/definition.d.ts.map +1 -0
- package/dist/composition/provider/definition.js +2 -0
- package/dist/composition/provider/definition.js.map +1 -0
- package/dist/composition/provider/model-selection.js +2 -0
- package/dist/composition/provider/model-selection.js.map +1 -0
- package/dist/composition/provider/preflight.js +2 -0
- package/dist/composition/provider/preflight.js.map +1 -0
- package/dist/composition/provider/types.d.ts +38 -0
- package/dist/composition/provider/types.d.ts.map +1 -0
- package/dist/composition/provider/types.js +2 -0
- package/dist/composition/provider/types.js.map +1 -0
- package/dist/composition/queue/config.js +2 -0
- package/dist/composition/queue/config.js.map +1 -0
- package/dist/composition/queue/scheduler.js +2 -0
- package/dist/composition/queue/scheduler.js.map +1 -0
- package/dist/composition/queue/store.js +2 -0
- package/dist/composition/queue/store.js.map +1 -0
- package/dist/composition/runtime/config.js +2 -0
- package/dist/composition/runtime/config.js.map +1 -0
- package/dist/composition/runtime/owner.js +2 -0
- package/dist/composition/runtime/owner.js.map +1 -0
- package/dist/composition/runtime/public.d.ts +7 -0
- package/dist/composition/runtime/public.d.ts.map +1 -0
- package/dist/composition/runtime/public.js +2 -0
- package/dist/composition/runtime/public.js.map +1 -0
- package/dist/composition/runtime/types.d.ts +76 -0
- package/dist/composition/runtime/types.d.ts.map +1 -0
- package/dist/composition/startup.js +2 -0
- package/dist/composition/startup.js.map +1 -0
- package/dist/composition/team/config.js +2 -0
- package/dist/composition/team/config.js.map +1 -0
- package/dist/composition/team/options.js +2 -0
- package/dist/composition/team/options.js.map +1 -0
- package/dist/composition/team/runtime.js +2 -0
- package/dist/composition/team/runtime.js.map +1 -0
- package/dist/composition/team/types.d.ts +63 -0
- package/dist/composition/team/types.d.ts.map +1 -0
- package/dist/composition/tool-source/config.d.ts +5 -0
- package/dist/composition/tool-source/config.d.ts.map +1 -0
- package/dist/composition/tool-source/config.js +2 -0
- package/dist/composition/tool-source/config.js.map +1 -0
- package/dist/composition/tool-source/definition.d.ts +7 -0
- package/dist/composition/tool-source/definition.d.ts.map +1 -0
- package/dist/composition/tool-source/definition.js +2 -0
- package/dist/composition/tool-source/definition.js.map +1 -0
- package/dist/composition/tool-source/snapshot.js +2 -0
- package/dist/composition/tool-source/snapshot.js.map +1 -0
- package/dist/contract/adapter.d.ts +91 -0
- package/dist/contract/adapter.d.ts.map +1 -0
- package/dist/contract/adapter.js +2 -0
- package/dist/contract/adapter.js.map +1 -0
- package/dist/contract/call-config.d.ts +36 -0
- package/dist/contract/call-config.d.ts.map +1 -0
- package/dist/contract/call-config.js +2 -0
- package/dist/contract/call-config.js.map +1 -0
- package/dist/contract/generate-options.d.ts +41 -0
- package/dist/contract/generate-options.d.ts.map +1 -0
- package/dist/contract/model-info.d.ts +99 -0
- package/dist/contract/model-info.d.ts.map +1 -0
- package/dist/contract/output-format.d.ts +18 -0
- package/dist/contract/output-format.d.ts.map +1 -0
- package/dist/contract/retry-policy.d.ts +104 -0
- package/dist/contract/retry-policy.d.ts.map +1 -0
- package/dist/contract/retry-policy.js +2 -0
- package/dist/contract/retry-policy.js.map +1 -0
- package/dist/contract/tool.d.ts +65 -0
- package/dist/contract/tool.d.ts.map +1 -0
- package/dist/contract/tool.js +2 -0
- package/dist/contract/tool.js.map +1 -0
- package/dist/errors/agent-sdk-error.d.ts +88 -0
- package/dist/errors/agent-sdk-error.d.ts.map +1 -0
- package/dist/errors/agent-sdk-error.js +2 -0
- package/dist/errors/agent-sdk-error.js.map +1 -0
- package/dist/errors/capability-identity.d.ts +10 -0
- package/dist/errors/capability-identity.d.ts.map +1 -0
- package/dist/errors/capability-identity.js +2 -0
- package/dist/errors/capability-identity.js.map +1 -0
- package/dist/errors/failure.d.ts +33 -0
- package/dist/errors/failure.d.ts.map +1 -0
- package/dist/errors/failure.js +2 -0
- package/dist/errors/failure.js.map +1 -0
- package/dist/errors/model-error.d.ts +83 -0
- package/dist/errors/model-error.d.ts.map +1 -0
- package/dist/errors/model-error.js +2 -0
- package/dist/errors/model-error.js.map +1 -0
- package/dist/http/api-key.d.ts +47 -0
- package/dist/http/api-key.d.ts.map +1 -0
- package/dist/http/api-key.js +2 -0
- package/dist/http/api-key.js.map +1 -0
- package/dist/http/attribution.d.ts +51 -0
- package/dist/http/attribution.d.ts.map +1 -0
- package/dist/http/attribution.js +2 -0
- package/dist/http/attribution.js.map +1 -0
- package/dist/index.d.ts +70 -0
- package/dist/index.js +1 -0
- package/dist/logging/types.d.ts +53 -0
- package/dist/logging/types.d.ts.map +1 -0
- package/dist/logging/types.js +2 -0
- package/dist/logging/types.js.map +1 -0
- package/dist/memory.d.ts +10 -0
- package/dist/memory.js +1 -0
- package/dist/message/content.d.ts +125 -0
- package/dist/message/content.d.ts.map +1 -0
- package/dist/message/message.d.ts +154 -0
- package/dist/message/message.d.ts.map +1 -0
- package/dist/message/message.js +2 -0
- package/dist/message/message.js.map +1 -0
- package/dist/message/projection.d.ts +34 -0
- package/dist/message/projection.d.ts.map +1 -0
- package/dist/message/projection.js +2 -0
- package/dist/message/projection.js.map +1 -0
- package/dist/observability/bus.d.ts +7 -0
- package/dist/observability/bus.d.ts.map +1 -0
- package/dist/observability/bus.js +2 -0
- package/dist/observability/bus.js.map +1 -0
- package/dist/observability/exporters.d.ts +39 -0
- package/dist/observability/exporters.d.ts.map +1 -0
- package/dist/observability/exporters.js +2 -0
- package/dist/observability/exporters.js.map +1 -0
- package/dist/observability/logger.js +2 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/projections.d.ts +12 -0
- package/dist/observability/projections.d.ts.map +1 -0
- package/dist/observability/projections.js +2 -0
- package/dist/observability/projections.js.map +1 -0
- package/dist/observability/types.d.ts +103 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability.d.ts +20 -0
- package/dist/observability.js +1 -0
- package/dist/observation/boundaries.js +2 -0
- package/dist/observation/boundaries.js.map +1 -0
- package/dist/observation/context.d.ts +39 -0
- package/dist/observation/context.d.ts.map +1 -0
- package/dist/observation/context.js +2 -0
- package/dist/observation/context.js.map +1 -0
- package/dist/observation/event.d.ts +50 -0
- package/dist/observation/event.d.ts.map +1 -0
- package/dist/observation/event.js +2 -0
- package/dist/observation/event.js.map +1 -0
- package/dist/observation/port.d.ts +56 -0
- package/dist/observation/port.d.ts.map +1 -0
- package/dist/observation/port.js +2 -0
- package/dist/observation/port.js.map +1 -0
- package/dist/observation/privacy.js +2 -0
- package/dist/observation/privacy.js.map +1 -0
- package/dist/observation/report.d.ts +117 -0
- package/dist/observation/report.d.ts.map +1 -0
- package/dist/observation/report.js +2 -0
- package/dist/observation/report.js.map +1 -0
- package/dist/observation/telemetry-types.d.ts +29 -0
- package/dist/observation/telemetry-types.d.ts.map +1 -0
- package/dist/observation/usage.d.ts +52 -0
- package/dist/observation/usage.d.ts.map +1 -0
- package/dist/observation/usage.js +2 -0
- package/dist/observation/usage.js.map +1 -0
- package/dist/platform/adapter.js +2 -0
- package/dist/platform/adapter.js.map +1 -0
- package/dist/platform/capability-operation.js +2 -0
- package/dist/platform/capability-operation.js.map +1 -0
- package/dist/platform/config.js +2 -0
- package/dist/platform/config.js.map +1 -0
- package/dist/platform/logger-platform.js +2 -0
- package/dist/platform/logger-platform.js.map +1 -0
- package/dist/platform/resources.js +2 -0
- package/dist/platform/resources.js.map +1 -0
- package/dist/plugin/provider-plugin.d.ts +37 -0
- package/dist/plugin/provider-plugin.d.ts.map +1 -0
- package/dist/plugin/provider-plugin.js +2 -0
- package/dist/plugin/provider-plugin.js.map +1 -0
- package/dist/primitives/brand.d.ts +61 -0
- package/dist/primitives/brand.d.ts.map +1 -0
- package/dist/primitives/brand.js +2 -0
- package/dist/primitives/brand.js.map +1 -0
- package/dist/primitives/freeze.d.ts +20 -0
- package/dist/primitives/freeze.d.ts.map +1 -0
- package/dist/primitives/freeze.js +2 -0
- package/dist/primitives/freeze.js.map +1 -0
- package/dist/primitives/json-snapshot.js +2 -0
- package/dist/primitives/json-snapshot.js.map +1 -0
- package/dist/primitives/json.d.ts +32 -0
- package/dist/primitives/json.d.ts.map +1 -0
- package/dist/primitives/json.js +2 -0
- package/dist/primitives/json.js.map +1 -0
- package/dist/primitives/never.d.ts +22 -0
- package/dist/primitives/never.d.ts.map +1 -0
- package/dist/primitives/never.js +2 -0
- package/dist/primitives/never.js.map +1 -0
- package/dist/primitives/snapshot.d.ts +10 -0
- package/dist/primitives/snapshot.d.ts.map +1 -0
- package/dist/primitives/snapshot.js +2 -0
- package/dist/primitives/snapshot.js.map +1 -0
- package/dist/primitives/version.d.ts +6 -0
- package/dist/primitives/version.d.ts.map +1 -0
- package/dist/primitives/version.js +2 -0
- package/dist/primitives/version.js.map +1 -0
- package/dist/provider.d.ts +19 -0
- package/dist/provider.js +1 -0
- package/dist/runtime/model-call-handle.js +2 -0
- package/dist/runtime/model-call-handle.js.map +1 -0
- package/dist/runtime/model-metadata.js +2 -0
- package/dist/runtime/model-metadata.js.map +1 -0
- package/dist/runtime/model-stream.js +2 -0
- package/dist/runtime/model-stream.js.map +1 -0
- package/dist/runtime/registry.d.ts +171 -0
- package/dist/runtime/registry.d.ts.map +1 -0
- package/dist/runtime/registry.js +2 -0
- package/dist/runtime/registry.js.map +1 -0
- package/dist/runtime/with-retry.d.ts +45 -0
- package/dist/runtime/with-retry.d.ts.map +1 -0
- package/dist/runtime/with-retry.js +2 -0
- package/dist/runtime/with-retry.js.map +1 -0
- package/dist/skills.d.ts +8 -0
- package/dist/skills.js +1 -0
- package/dist/stream/assembler.d.ts +86 -0
- package/dist/stream/assembler.d.ts.map +1 -0
- package/dist/stream/assembler.js +2 -0
- package/dist/stream/assembler.js.map +1 -0
- package/dist/stream/chunk.d.ts +135 -0
- package/dist/stream/chunk.d.ts.map +1 -0
- package/dist/stream/idle-timeout.d.ts +30 -0
- package/dist/stream/idle-timeout.d.ts.map +1 -0
- package/dist/stream/idle-timeout.js +2 -0
- package/dist/stream/idle-timeout.js.map +1 -0
- package/dist/support-safe/error.d.ts +29 -0
- package/dist/support-safe/error.d.ts.map +1 -0
- package/dist/support-safe/error.js +2 -0
- package/dist/support-safe/error.js.map +1 -0
- package/dist/tools.d.ts +15 -0
- package/dist/tools.js +1 -0
- package/package.json +96 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 alvin0 (chaulamdinhai) <chaulamdinhai@gmail.com>
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# `@alvin0/ai-agent-sdk-core`
|
|
2
|
+
|
|
3
|
+
Provider-neutral contracts and runtime primitives for building model adapters and streaming AI applications.
|
|
4
|
+
|
|
5
|
+
Runtime: **Universal**. Published code uses ECMAScript, Fetch-compatible types, Web Streams, AbortController, performance timing, and Web Crypto. It does not use Node built-ins, `process`, `Buffer`, local paths, filesystem access, child processes, or stdio.
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
pnpm add @alvin0/ai-agent-sdk-core
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
`createAgentRuntime()` is the recommended composition root. `defineAgent()`
|
|
12
|
+
captures a reusable agent definition, and every runtime exposes an `SdkLogger`
|
|
13
|
+
whose records share runtime/run correlation and privacy policy:
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import {
|
|
17
|
+
createAgentRuntime,
|
|
18
|
+
defineAgent,
|
|
19
|
+
type SdkLogger,
|
|
20
|
+
} from '@alvin0/ai-agent-sdk-core'
|
|
21
|
+
|
|
22
|
+
const runtime = await createAgentRuntime({ providers: [provider] })
|
|
23
|
+
const definition = defineAgent({ id: 'assistant', instructions: 'Be concise.' })
|
|
24
|
+
const logger: SdkLogger = runtime.logger({ fields: { component: 'assistant' } })
|
|
25
|
+
const agent = runtime.agent({ ...definition, model: { provider: 'openai', id: 'gpt-5.4' } })
|
|
26
|
+
logger.info('agent ready')
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
import { ModelAdapter, ModelRegistry } from '@alvin0/ai-agent-sdk-core'
|
|
31
|
+
|
|
32
|
+
const registry = new ModelRegistry()
|
|
33
|
+
registry.registerAdapter(['example'], new YourAdapter())
|
|
34
|
+
|
|
35
|
+
const call = registry.stream({
|
|
36
|
+
provider: 'example',
|
|
37
|
+
model: 'model-id',
|
|
38
|
+
messages: [],
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
for await (const chunk of call) {
|
|
42
|
+
// Consume normalized chunks.
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const report = await call.report
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
The package includes message and stream contracts, model registry and retry primitives, normalized errors, usage accounting, explicit observation/correlation ports, and transactional provider-plugin registration. Provider HTTP/SSE transport, concrete exporters, filesystem skills, environment credentials, and protocol implementations belong to separate capability packages.
|
|
49
|
+
|
|
50
|
+
The documented root plus `/agent`, `/memory`, `/observability`, `/provider`,
|
|
51
|
+
`/skills`, `/tools`, and `./package.json` are public. Internal source paths are
|
|
52
|
+
not compatibility contracts.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","names":[],"sources":["../../../src/agent/accounting/common.ts"],"sourcesContent":["import { safeErrorRecord, type SafeErrorRecord } from '../../observation/index.ts'\n\nexport function accountingError(message: string, code: string, cause?: unknown): SafeErrorRecord {\n return Object.freeze({\n type: 'AgentAccountingError',\n message,\n code,\n ...(cause === undefined ? {} : { causeTypes: safeErrorRecord(cause).causeTypes ?? [safeErrorRecord(cause).type] }),\n })\n}\n"],"mappings":"6DAEA,SAAgB,EAAgB,EAAiB,EAAc,EAAkC,CAC/F,OAAO,OAAO,OAAO,CACnB,KAAM,uBACN,UACA,OACA,GAAI,IAAU,IAAA,GAAY,CAAC,EAAI,CAAE,WAAY,EAAgB,CAAK,CAAC,CAAC,YAAc,CAAC,EAAgB,CAAK,CAAC,CAAC,IAAI,CAAE,CAClH,CAAC,CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","names":[],"sources":["../../../src/agent/accounting/config.ts"],"sourcesContent":["import type { TrackedOperationKind } from './report.ts'\n\nexport const OPERATION_KINDS = Object.freeze([\n 'turn', 'model-call', 'provider-attempt', 'tool', 'compaction', 'hook',\n 'user-input', 'skill', 'memory', 'credential', 'integration',\n] as const satisfies readonly TrackedOperationKind[])\n"],"mappings":"AAEA,MAAa,EAAkB,OAAO,OAAO,CAC3C,OAAQ,aAAc,mBAAoB,OAAQ,aAAc,OAChE,aAAc,QAAS,SAAU,aAAc,aACjD,CAAoD"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { JsonObject } from "../../primitives/json.js";
|
|
2
|
+
import { OperationStatus } from "../../observation/event.js";
|
|
3
|
+
import { ModelCallReport, ModelInvocationContext } from "../../observation/report.js";
|
|
4
|
+
import { GenerateOptions } from "../../contract/generate-options.js";
|
|
5
|
+
import { LegacyRunReport, TrackedOperationKind } from "./report.js";
|
|
6
|
+
//#region src/agent/accounting/contracts.d.ts
|
|
7
|
+
interface ModelCallPolicyDecision {
|
|
8
|
+
readonly report: ModelCallReport;
|
|
9
|
+
readonly usageRequired: boolean;
|
|
10
|
+
readonly usageUnavailable: boolean;
|
|
11
|
+
}
|
|
12
|
+
interface StartRunOperationInput {
|
|
13
|
+
readonly operationId?: string;
|
|
14
|
+
readonly data?: JsonObject;
|
|
15
|
+
readonly toolCallId?: string;
|
|
16
|
+
}
|
|
17
|
+
interface EndRunOperationInput {
|
|
18
|
+
readonly data?: JsonObject;
|
|
19
|
+
readonly error?: unknown;
|
|
20
|
+
}
|
|
21
|
+
/** Inward instrumentation surface consumed by the agent runtime. */
|
|
22
|
+
interface RunAccountingPort {
|
|
23
|
+
/** First mandatory usage stop in this invocation, including maintenance calls. */
|
|
24
|
+
readonly usageStop: ModelCallPolicyDecision | undefined;
|
|
25
|
+
readonly runId: string;
|
|
26
|
+
readonly traceId: string;
|
|
27
|
+
readonly modelInvocation: ModelInvocationContext;
|
|
28
|
+
startOperation(kind: TrackedOperationKind, input?: StartRunOperationInput): string;
|
|
29
|
+
endOperation(operationId: string, status: OperationStatus, input?: EndRunOperationInput): void;
|
|
30
|
+
recordModelCall(report: ModelCallReport, request: GenerateOptions): Promise<ModelCallPolicyDecision>;
|
|
31
|
+
recordError(error: unknown): void;
|
|
32
|
+
finalize(status: OperationStatus, completed: boolean, error?: unknown): Promise<LegacyRunReport>;
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
export { EndRunOperationInput, ModelCallPolicyDecision, RunAccountingPort, StartRunOperationInput };
|
|
36
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","names":[],"sources":["../../../src/agent/accounting/contracts.ts"],"mappings":";;;;;;UAKiB;WACN,QAAQ;WACR;WACA;;UAGM;WACN;WACA,OAAO;WACP;;UAGM;WACN,OAAO;WACP;;;UAIM;;WAEN,WAAW;WACX;WACA;WACA,iBAAiB;EAC1B,eAAe,MAAM,sBAAsB,QAAQ;EACnD,aAAa,qBAAqB,QAAQ,iBAAiB,QAAQ;EACnE,gBAAgB,QAAQ,iBAAiB,SAAS,kBAAkB,QAAQ;EAC5E,YAAY;EACZ,SAAS,QAAQ,iBAAiB,oBAAoB,kBAAkB,QAAQ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{isSpanId as e,isTraceId as t}from"../../../observation/context.js";import{arrayData as n,boundedText as r,objectValue as i,ownData as a}from"../../../capability/common/data.js";import{COMPOSITION_LIMITS as o}from"../../../capability/common/config.js";import{DELIVERY_LIMITS as s}from"./config.js";import{DeliveryDataError as c,bytes as l,choice as u,count as d,duration as f,flag as p,identity as m,numericFields as h,optional as g,safeCode as _,timestamp as v}from"./data.js";import{EXPORTER_BOUNDARIES as y}from"../../../observation/boundaries.js";import{COUNTER_KEYS as b}from"../usage.js";const x=Object.freeze([`success`,`error`,`aborted`,`rejected`,`unknown`]),S=Object.freeze([`complete`,`partial`,`estimated`,`missing`,`not-applicable`]),C=Object.freeze([`logicalCalls`,`attempts`,`complete`,`partial`,`estimated`,`missing`,`notApplicable`,`possiblyBilledAttemptsWithoutUsage`]);function w(e){let t=i(e);return Object.freeze({type:`Error`,message:`Agent operation failed`,code:_(a(t,`code`,!1)),...g(t,`retryable`,p),...g(t,`status`,d)})}function T(e){if(!t(e))throw new c;return e}function E(t){if(!e(t))throw new c;return t}function D(e){let t=i(e);return Object.freeze(Object.assign({},...b.map(e=>g(t,e,d))))}function O(e){return h(e,C)}function k(e){let t=i(e);return Object.freeze({reported:D(a(t,`reported`)),...g(t,`estimated`,D),...g(t,`budgetTokens`,d),coverage:O(a(t,`coverage`)),authoritative:p(a(t,`authoritative`))})}function A(e){let t=i(e);return Object.freeze({mode:u(a(t,`mode`),[`operational`,`reliable`,`audit`]),requiredBoundary:u(a(t,`requiredBoundary`),y),reachedBoundary:u(a(t,`reachedBoundary`),y),complete:p(a(t,`complete`)),acceptedCritical:d(a(t,`acceptedCritical`)),rejectedCritical:d(a(t,`rejectedCritical`)),pendingCritical:d(a(t,`pendingCritical`)),...g(t,`lastFailure`,w)})}function j(e){let t=i(e),n=d(a(t,`attemptNumber`));if(n===0)throw new c;return Object.freeze({attemptId:m(a(t,`attemptId`)),spanId:E(a(t,`spanId`)),attemptNumber:n,status:u(a(t,`status`),x),startedAt:v(a(t,`startedAt`)),endedAt:v(a(t,`endedAt`)),durationMs:f(a(t,`durationMs`)),dispatchState:u(a(t,`dispatchState`),[`not-sent`,`sent`,`unknown`]),coverage:u(a(t,`coverage`),S),reported:D(a(t,`reported`)),...g(t,`estimated`,D),...g(t,`origin`,m),...g(t,`httpStatus`,d),...g(t,`providerRequestId`,m),...g(t,`error`,w)})}function M(e,t,h,_){let y=i(e);if(a(y,`runId`)!==t||a(y,`traceId`)!==h)throw new c;let b=0,C=n(a(y,`attempts`),s.attemptsPerCall).map(e=>{let t=j(e);if(b+=l(t),b>_)throw new c;return t});if(new Set(C.map(e=>e.attemptId)).size!==C.length||new Set(C.map(e=>e.attemptNumber)).size!==C.length)throw new c;return Object.freeze({runId:t,traceId:T(h),modelCallId:m(a(y,`modelCallId`)),spanId:E(a(y,`spanId`)),provider:m(a(y,`provider`)),...g(y,`providerFamily`,m),...g(y,`providerPluginId`,m),model:r(a(y,`model`),o.modelIdBytes),status:u(a(y,`status`),x),startedAt:v(a(y,`startedAt`)),endedAt:v(a(y,`endedAt`)),durationMs:f(a(y,`durationMs`)),...g(y,`finishReason`,m),...g(y,`dispatchState`,e=>u(e,[`not-sent`,`sent`,`unknown`])),coverage:u(a(y,`coverage`),S),reported:D(a(y,`reported`)),...g(y,`estimated`,D),attempts:Object.freeze(C),possiblyBilledAttemptsWithoutUsage:d(a(y,`possiblyBilledAttemptsWithoutUsage`)),authoritative:p(a(y,`authoritative`)),delivery:A(a(y,`delivery`)),...g(y,`error`,w)})}export{x as OPERATION_STATUSES,O as coverageSummary,A as deliverySummary,M as modelCall,k as runUsage,w as safeRecordError};
|
|
2
|
+
//# sourceMappingURL=accounting-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounting-data.js","names":[],"sources":["../../../../src/agent/accounting/delivery/accounting-data.ts"],"sourcesContent":["import { COMPOSITION_LIMITS } from '../../../capability/common/config.ts'\nimport { arrayData, boundedText, objectValue, ownData } from '../../../capability/common/data.ts'\nimport {\n isSpanId, isTraceId, type AttemptUsageReport, type ModelCallReport,\n type ObservationDeliverySummary, type SafeErrorRecord, type UsageCounters,\n} from '../../../observation/index.ts'\nimport { EXPORTER_BOUNDARIES } from '../../../observation/boundaries.ts'\nimport { COUNTER_KEYS } from '../usage.ts'\nimport type { RunUsageReport, UsageCoverageSummary } from '../report.ts'\nimport { DELIVERY_LIMITS } from './config.ts'\nimport {\n bytes, choice, count, DeliveryDataError, duration, flag, identity,\n numericFields, optional, safeCode, timestamp,\n} from './data.ts'\n\nexport const OPERATION_STATUSES = Object.freeze(['success', 'error', 'aborted', 'rejected', 'unknown'] as const)\nconst COVERAGE = Object.freeze(['complete', 'partial', 'estimated', 'missing', 'not-applicable'] as const)\nconst COVERAGE_KEYS = Object.freeze([\n 'logicalCalls', 'attempts', 'complete', 'partial', 'estimated', 'missing',\n 'notApplicable', 'possiblyBilledAttemptsWithoutUsage',\n] as const)\n\nexport function safeRecordError(value: unknown): SafeErrorRecord {\n const source = objectValue(value)\n return Object.freeze({\n type: 'Error', message: 'Agent operation failed', code: safeCode(ownData(source, 'code', false)),\n ...optional(source, 'retryable', flag), ...optional(source, 'status', count),\n })\n}\n\nfunction trace(value: unknown): ModelCallReport['traceId'] {\n if (!isTraceId(value)) throw new DeliveryDataError()\n return value\n}\n\nfunction span(value: unknown): ModelCallReport['spanId'] {\n if (!isSpanId(value)) throw new DeliveryDataError()\n return value\n}\n\nfunction counters(value: unknown): UsageCounters {\n const source = objectValue(value)\n return Object.freeze(Object.assign({}, ...COUNTER_KEYS.map(key => optional(source, key, count)))) as UsageCounters\n}\n\nexport function coverageSummary(value: unknown): UsageCoverageSummary {\n return numericFields(value, COVERAGE_KEYS)\n}\n\nexport function runUsage(value: unknown): RunUsageReport {\n const source = objectValue(value)\n return Object.freeze({\n reported: counters(ownData(source, 'reported')),\n ...optional(source, 'estimated', counters),\n ...optional(source, 'budgetTokens', count),\n coverage: coverageSummary(ownData(source, 'coverage')),\n authoritative: flag(ownData(source, 'authoritative')),\n })\n}\n\nexport function deliverySummary(value: unknown): ObservationDeliverySummary {\n const source = objectValue(value)\n return Object.freeze({\n mode: choice(ownData(source, 'mode'), ['operational', 'reliable', 'audit']),\n requiredBoundary: choice(ownData(source, 'requiredBoundary'), EXPORTER_BOUNDARIES),\n reachedBoundary: choice(ownData(source, 'reachedBoundary'), EXPORTER_BOUNDARIES),\n complete: flag(ownData(source, 'complete')),\n acceptedCritical: count(ownData(source, 'acceptedCritical')),\n rejectedCritical: count(ownData(source, 'rejectedCritical')),\n pendingCritical: count(ownData(source, 'pendingCritical')),\n ...optional(source, 'lastFailure', safeRecordError),\n })\n}\n\nfunction attempt(value: unknown): AttemptUsageReport {\n const source = objectValue(value)\n const attemptNumber = count(ownData(source, 'attemptNumber'))\n if (attemptNumber === 0) throw new DeliveryDataError()\n return Object.freeze({\n attemptId: identity(ownData(source, 'attemptId')), spanId: span(ownData(source, 'spanId')), attemptNumber,\n status: choice(ownData(source, 'status'), OPERATION_STATUSES),\n startedAt: timestamp(ownData(source, 'startedAt')), endedAt: timestamp(ownData(source, 'endedAt')),\n durationMs: duration(ownData(source, 'durationMs')),\n dispatchState: choice(ownData(source, 'dispatchState'), ['not-sent', 'sent', 'unknown']),\n coverage: choice(ownData(source, 'coverage'), COVERAGE), reported: counters(ownData(source, 'reported')),\n ...optional(source, 'estimated', counters), ...optional(source, 'origin', identity),\n ...optional(source, 'httpStatus', count),\n ...optional(source, 'providerRequestId', identity), ...optional(source, 'error', safeRecordError),\n })\n}\n\nexport function modelCall(\n value: unknown,\n runId: string,\n traceId: string,\n remainingBytes: number,\n): ModelCallReport {\n const source = objectValue(value)\n if (ownData(source, 'runId') !== runId || ownData(source, 'traceId') !== traceId) throw new DeliveryDataError()\n let usedBytes = 0\n const attempts = arrayData(ownData(source, 'attempts'), DELIVERY_LIMITS.attemptsPerCall).map(value => {\n const row = attempt(value)\n usedBytes += bytes(row)\n if (usedBytes > remainingBytes) throw new DeliveryDataError()\n return row\n })\n if (new Set(attempts.map(row => row.attemptId)).size !== attempts.length\n || new Set(attempts.map(row => row.attemptNumber)).size !== attempts.length) throw new DeliveryDataError()\n return Object.freeze({\n runId, traceId: trace(traceId), modelCallId: identity(ownData(source, 'modelCallId')),\n spanId: span(ownData(source, 'spanId')),\n provider: identity(ownData(source, 'provider')),\n ...optional(source, 'providerFamily', identity),\n ...optional(source, 'providerPluginId', identity),\n model: boundedText(ownData(source, 'model'), COMPOSITION_LIMITS.modelIdBytes),\n status: choice(ownData(source, 'status'), OPERATION_STATUSES),\n startedAt: timestamp(ownData(source, 'startedAt')), endedAt: timestamp(ownData(source, 'endedAt')),\n durationMs: duration(ownData(source, 'durationMs')),\n ...optional(source, 'finishReason', identity),\n ...optional(source, 'dispatchState', value => choice(value, ['not-sent', 'sent', 'unknown'])),\n coverage: choice(ownData(source, 'coverage'), COVERAGE),\n reported: counters(ownData(source, 'reported')), ...optional(source, 'estimated', counters),\n attempts: Object.freeze(attempts),\n possiblyBilledAttemptsWithoutUsage: count(ownData(source, 'possiblyBilledAttemptsWithoutUsage')),\n authoritative: flag(ownData(source, 'authoritative')),\n delivery: deliverySummary(ownData(source, 'delivery')),\n ...optional(source, 'error', safeRecordError),\n })\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=Object.freeze({modelCalls:4096,attemptsPerCall:4096,errors:1024,toolSources:128,recordBytes:2097152,batchItems:256,maxBatchItems:4096,batchBytes:524288,maxBatchBytes:16777216}),t=Object.freeze({DATA_INVALID:`OBSERVATION_DELIVERY_DATA_INVALID`,ACK_INVALID:`OBSERVATION_ACK_INVALID`,EXPORT_FAILED:`OBSERVABILITY_EXPORT_FAILED`,STAGE_FAILED:`OBSERVABILITY_STAGE_FAILED`,TIMEOUT:`OBSERVABILITY_FLUSH_TIMEOUT`,ABORTED:`OBSERVATION_DELIVERY_ABORTED`,CLOSED:`OBSERVATION_DELIVERY_CLOSED`});export{t as DELIVERY_ERROR_CODES,e as DELIVERY_LIMITS};
|
|
2
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","names":[],"sources":["../../../../src/agent/accounting/delivery/config.ts"],"sourcesContent":["export const DELIVERY_LIMITS = Object.freeze({\n modelCalls: 4_096,\n attemptsPerCall: 4_096,\n errors: 1_024,\n toolSources: 128,\n recordBytes: 2 * 1024 * 1024,\n batchItems: 256,\n maxBatchItems: 4_096,\n batchBytes: 512 * 1024,\n maxBatchBytes: 16 * 1024 * 1024,\n})\n\nexport const DELIVERY_ERROR_CODES = Object.freeze({\n DATA_INVALID: 'OBSERVATION_DELIVERY_DATA_INVALID',\n ACK_INVALID: 'OBSERVATION_ACK_INVALID',\n EXPORT_FAILED: 'OBSERVABILITY_EXPORT_FAILED',\n STAGE_FAILED: 'OBSERVABILITY_STAGE_FAILED',\n TIMEOUT: 'OBSERVABILITY_FLUSH_TIMEOUT',\n ABORTED: 'OBSERVATION_DELIVERY_ABORTED',\n CLOSED: 'OBSERVATION_DELIVERY_CLOSED',\n})\n"],"mappings":"AAAA,MAAa,EAAkB,OAAO,OAAO,CAC3C,WAAY,KACZ,gBAAiB,KACjB,OAAQ,KACR,YAAa,IACb,YAAa,QACb,WAAY,IACZ,cAAe,KACf,WAAY,OACZ,cAAe,QACjB,CAAC,EAEY,EAAuB,OAAO,OAAO,CAChD,aAAc,oCACd,YAAa,0BACb,cAAe,8BACf,aAAc,6BACd,QAAS,8BACT,QAAS,+BACT,OAAQ,6BACV,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{boundedText as e,objectValue as t,ownData as n}from"../../../capability/common/data.js";import{COMPOSITION_LIMITS as r}from"../../../capability/common/config.js";import{DELIVERY_ERROR_CODES as i}from"./config.js";var a=class extends Error{code=i.DATA_INVALID;constructor(){super(`Observation delivery data is invalid`),this.name=`DeliveryDataError`}};function o(e){if(typeof e!=`number`||!Number.isSafeInteger(e)||e<0)throw new a;return e}function s(e){if(typeof e!=`number`||!Number.isFinite(e)||e<0)throw new a;return e}function c(e){if(typeof e!=`boolean`)throw new a;return e}function l(e,t){if(!t.includes(e))throw new a;return e}function u(t){return e(t,r.identityBytes)}function d(t){let n=e(t,32);if(!Number.isFinite(Date.parse(n))||new Date(n).toISOString()!==n)throw new a;return n}function f(e){return typeof e==`string`&&/^[A-Z][A-Z0-9_]{0,127}$/.test(e)?e:`OPERATION_FAILED`}function p(e,t,r){let i=n(e,t,!1);return i===void 0?{}:{[t]:r(i)}}function m(e,r){let i=t(e);return Object.freeze(Object.fromEntries(r.map(e=>[e,o(n(i,e))])))}function h(e){return new TextEncoder().encode(JSON.stringify(e)).byteLength}export{a as DeliveryDataError,h as bytes,l as choice,o as count,s as duration,c as flag,u as identity,m as numericFields,p as optional,f as safeCode,d as timestamp};
|
|
2
|
+
//# sourceMappingURL=data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.js","names":[],"sources":["../../../../src/agent/accounting/delivery/data.ts"],"sourcesContent":["import { COMPOSITION_LIMITS } from '../../../capability/common/config.ts'\nimport { boundedText, objectValue, ownData } from '../../../capability/common/data.ts'\nimport { DELIVERY_ERROR_CODES } from './config.ts'\n\nexport class DeliveryDataError extends Error {\n readonly code = DELIVERY_ERROR_CODES.DATA_INVALID\n constructor() { super('Observation delivery data is invalid'); this.name = 'DeliveryDataError' }\n}\n\nexport function count(value: unknown): number {\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0) throw new DeliveryDataError()\n return value\n}\n\nexport function duration(value: unknown): number {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) throw new DeliveryDataError()\n return value\n}\n\nexport function flag(value: unknown): boolean {\n if (typeof value !== 'boolean') throw new DeliveryDataError()\n return value\n}\n\nexport function choice<const T extends string>(value: unknown, values: readonly T[]): T {\n if (!values.includes(value as T)) throw new DeliveryDataError()\n return value as T\n}\n\nexport function identity(value: unknown): string { return boundedText(value, COMPOSITION_LIMITS.identityBytes) }\n\nexport function timestamp(value: unknown): string {\n const text = boundedText(value, 32)\n if (!Number.isFinite(Date.parse(text)) || new Date(text).toISOString() !== text) throw new DeliveryDataError()\n return text\n}\n\nexport function safeCode(value: unknown): string {\n return typeof value === 'string' && /^[A-Z][A-Z0-9_]{0,127}$/.test(value) ? value : 'OPERATION_FAILED'\n}\n\nexport function optional<T>(source: object, key: string, convert: (value: unknown) => T): Record<string, T> {\n const value = ownData(source, key, false)\n return value === undefined ? {} : { [key]: convert(value) }\n}\n\nexport function numericFields<const Key extends string>(\n value: unknown,\n keys: readonly Key[],\n): Readonly<Record<Key, number>> {\n const source = objectValue(value)\n return Object.freeze(Object.fromEntries(keys.map(key => [key, count(ownData(source, key))]))) as Readonly<Record<Key, number>>\n}\n\nexport function bytes(value: unknown): number {\n return new TextEncoder().encode(JSON.stringify(value)).byteLength\n}\n"],"mappings":"4NAIA,IAAa,EAAb,cAAuC,KAAM,CAC3C,KAAgB,EAAqB,aACrC,aAAc,CAAE,MAAM,sCAAsC,EAAG,KAAK,KAAO,mBAAoB,CACjG,EAEA,SAAgB,EAAM,EAAwB,CAC5C,GAAI,OAAO,GAAU,UAAY,CAAC,OAAO,cAAc,CAAK,GAAK,EAAQ,EAAG,MAAM,IAAI,EACtF,OAAO,CACT,CAEA,SAAgB,EAAS,EAAwB,CAC/C,GAAI,OAAO,GAAU,UAAY,CAAC,OAAO,SAAS,CAAK,GAAK,EAAQ,EAAG,MAAM,IAAI,EACjF,OAAO,CACT,CAEA,SAAgB,EAAK,EAAyB,CAC5C,GAAI,OAAO,GAAU,UAAW,MAAM,IAAI,EAC1C,OAAO,CACT,CAEA,SAAgB,EAA+B,EAAgB,EAAyB,CACtF,GAAI,CAAC,EAAO,SAAS,CAAU,EAAG,MAAM,IAAI,EAC5C,OAAO,CACT,CAEA,SAAgB,EAAS,EAAwB,CAAE,OAAO,EAAY,EAAO,EAAmB,aAAa,CAAE,CAE/G,SAAgB,EAAU,EAAwB,CAChD,IAAM,EAAO,EAAY,EAAO,EAAE,EAClC,GAAI,CAAC,OAAO,SAAS,KAAK,MAAM,CAAI,CAAC,GAAK,IAAI,KAAK,CAAI,CAAC,CAAC,YAAY,IAAM,EAAM,MAAM,IAAI,EAC3F,OAAO,CACT,CAEA,SAAgB,EAAS,EAAwB,CAC/C,OAAO,OAAO,GAAU,UAAY,0BAA0B,KAAK,CAAK,EAAI,EAAQ,kBACtF,CAEA,SAAgB,EAAY,EAAgB,EAAa,EAAmD,CAC1G,IAAM,EAAQ,EAAQ,EAAQ,EAAK,EAAK,EACxC,OAAO,IAAU,IAAA,GAAY,CAAC,EAAI,EAAG,GAAM,EAAQ,CAAK,CAAE,CAC5D,CAEA,SAAgB,EACd,EACA,EAC+B,CAC/B,IAAM,EAAS,EAAY,CAAK,EAChC,OAAO,OAAO,OAAO,OAAO,YAAY,EAAK,IAAI,GAAO,CAAC,EAAK,EAAM,EAAQ,EAAQ,CAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAC9F,CAEA,SAAgB,EAAM,EAAwB,CAC5C,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK,UAAU,CAAK,CAAC,CAAC,CAAC,UACzD"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{objectValue as e,ownData as t}from"../../../capability/common/data.js";import{flag as n,safeCode as r}from"./data.js";function i(e,t,n){let r=[];for(let i of e){let e=i.attempts,o=e.at(-1);i.error!==void 0&&r.push(a(i,i.error,`model-call`,o,t,n));for(let o of e)o.error!==void 0&&r.push(a(i,o.error,`provider-attempt`,o,t,n))}return r}function a(e,t,n,i,a,o){let c=r(t.code),l=s(t.status)?t.status:s(i?.httpStatus)?i.httpStatus:void 0;return{code:c,value:Object.freeze({code:c,stage:n,message:`Provider operation failed`,provider:e.providerFamily??e.provider,route:e.provider,...i?.origin===void 0?{}:{origin:i.origin},...l===void 0?{}:{status:l},...i?.providerRequestId===void 0?{}:{requestId:i.providerRequestId},...t.retryable===void 0?{}:{retryable:t.retryable},...i?.dispatchState===void 0&&e.dispatchState===void 0?{}:{dispatchState:i?.dispatchState??e.dispatchState},usageCoverage:a,possiblyBilledAttemptsWithoutUsage:o})}}function o(i,a,o){let c=e(i),l=t(c,`status`,!1),u=t(c,`retryable`,!1);return Object.freeze({code:r(t(c,`code`,!1)),stage:`agent-run`,message:`Agent operation failed`,...s(l)?{status:l}:{},...u===void 0?{}:{retryable:n(u)},usageCoverage:a,possiblyBilledAttemptsWithoutUsage:o})}function s(e){return typeof e==`number`&&Number.isInteger(e)&&e>=100&&e<=599}function c(n,a,s,c,l){let u=i(a,s,c),d=new Set,f=n.map(n=>{let i=e(n),a=r(t(i,`code`,!1)),l=u.findIndex((e,t)=>!d.has(t)&&e.code===a);return l<0?o(n,s,c):(d.add(l),u[l]?.value??o(n,s,c))});for(let[e,t]of u.entries()){if(f.length>=l)break;d.has(e)||f.push(t.value)}return Object.freeze(f)}export{c as supportSafeErrors};
|
|
2
|
+
//# sourceMappingURL=support-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"support-errors.js","names":[],"sources":["../../../../src/agent/accounting/delivery/support-errors.ts"],"sourcesContent":["import { objectValue, ownData } from '../../../capability/common/data.ts'\nimport type { ModelCallReport, SafeErrorRecord } from '../../../observation/index.ts'\nimport type { SupportSafeError, UsageCoverageSummary } from '../../../support-safe/error.ts'\nimport { flag, safeCode } from './data.ts'\n\ninterface ProviderFailureCandidate {\n readonly code: string\n readonly value: SupportSafeError\n}\n\n/** Project already-sanitized call/attempt facts into the public support envelope. */\nfunction providerCandidates(\n calls: readonly ModelCallReport[],\n usageCoverage: UsageCoverageSummary,\n possiblyBilled: number,\n): ProviderFailureCandidate[] {\n const candidates: ProviderFailureCandidate[] = []\n for (const call of calls) {\n const attempts = call.attempts\n const lastAttempt = attempts.at(-1)\n if (call.error !== undefined) {\n candidates.push(candidate(call, call.error, 'model-call', lastAttempt, usageCoverage, possiblyBilled))\n }\n for (const attempt of attempts) {\n if (attempt.error === undefined) continue\n candidates.push(candidate(call, attempt.error, 'provider-attempt', attempt, usageCoverage, possiblyBilled))\n }\n }\n return candidates\n}\n\nfunction candidate(\n call: ModelCallReport,\n error: SafeErrorRecord,\n stage: 'model-call' | 'provider-attempt',\n attempt: ModelCallReport['attempts'][number] | undefined,\n usageCoverage: UsageCoverageSummary,\n possiblyBilled: number,\n): ProviderFailureCandidate {\n const code = safeCode(error.code)\n const status = validHttpStatus(error.status) ? error.status\n : validHttpStatus(attempt?.httpStatus) ? attempt.httpStatus : undefined\n return {\n code,\n value: Object.freeze({\n code,\n stage,\n message: 'Provider operation failed',\n provider: call.providerFamily ?? call.provider,\n route: call.provider,\n ...(attempt?.origin === undefined ? {} : { origin: attempt.origin }),\n ...(status === undefined ? {} : { status }),\n ...(attempt?.providerRequestId === undefined ? {} : { requestId: attempt.providerRequestId }),\n ...(error.retryable === undefined ? {} : { retryable: error.retryable }),\n ...(attempt?.dispatchState === undefined && call.dispatchState === undefined\n ? {}\n : { dispatchState: attempt?.dispatchState ?? call.dispatchState }),\n usageCoverage,\n possiblyBilledAttemptsWithoutUsage: possiblyBilled,\n }),\n }\n}\n\nfunction genericError(\n raw: unknown,\n usageCoverage: UsageCoverageSummary,\n possiblyBilled: number,\n): SupportSafeError {\n const source = objectValue(raw)\n const status = ownData(source, 'status', false)\n const retryable = ownData(source, 'retryable', false)\n return Object.freeze({\n code: safeCode(ownData(source, 'code', false)),\n stage: 'agent-run',\n message: 'Agent operation failed',\n ...(validHttpStatus(status) ? { status } : {}),\n ...(retryable === undefined ? {} : { retryable: flag(retryable) }),\n usageCoverage,\n possiblyBilledAttemptsWithoutUsage: possiblyBilled,\n })\n}\n\nfunction validHttpStatus(value: unknown): value is number {\n return typeof value === 'number' && Number.isInteger(value) && value >= 100 && value <= 599\n}\n\n/** Match ledger errors to call/attempt facts without retaining any raw error text. */\nexport function supportSafeErrors(\n rawErrors: readonly unknown[],\n calls: readonly ModelCallReport[],\n usageCoverage: UsageCoverageSummary,\n possiblyBilled: number,\n limit: number,\n): readonly SupportSafeError[] {\n const candidates = providerCandidates(calls, usageCoverage, possiblyBilled)\n const used = new Set<number>()\n const projected = rawErrors.map(raw => {\n const source = objectValue(raw)\n const code = safeCode(ownData(source, 'code', false))\n const index = candidates.findIndex((row, candidateIndex) => !used.has(candidateIndex) && row.code === code)\n if (index < 0) return genericError(raw, usageCoverage, possiblyBilled)\n used.add(index)\n return candidates[index]?.value ?? genericError(raw, usageCoverage, possiblyBilled)\n })\n for (const [index, row] of candidates.entries()) {\n if (projected.length >= limit) break\n if (!used.has(index)) projected.push(row.value)\n }\n return Object.freeze(projected)\n}\n"],"mappings":"6HAWA,SAAS,EACP,EACA,EACA,EAC4B,CAC5B,IAAM,EAAyC,CAAC,EAChD,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAW,EAAK,SAChB,EAAc,EAAS,GAAG,EAAE,EAC9B,EAAK,QAAU,IAAA,IACjB,EAAW,KAAK,EAAU,EAAM,EAAK,MAAO,aAAc,EAAa,EAAe,CAAc,CAAC,EAEvG,IAAK,IAAM,KAAW,EAChB,EAAQ,QAAU,IAAA,IACtB,EAAW,KAAK,EAAU,EAAM,EAAQ,MAAO,mBAAoB,EAAS,EAAe,CAAc,CAAC,CAE9G,CACA,OAAO,CACT,CAEA,SAAS,EACP,EACA,EACA,EACA,EACA,EACA,EAC0B,CAC1B,IAAM,EAAO,EAAS,EAAM,IAAI,EAC1B,EAAS,EAAgB,EAAM,MAAM,EAAI,EAAM,OACjD,EAAgB,GAAS,UAAU,EAAI,EAAQ,WAAa,IAAA,GAChE,MAAO,CACL,OACA,MAAO,OAAO,OAAO,CACnB,OACA,QACA,QAAS,4BACT,SAAU,EAAK,gBAAkB,EAAK,SACtC,MAAO,EAAK,SACZ,GAAI,GAAS,SAAW,IAAA,GAAY,CAAC,EAAI,CAAE,OAAQ,EAAQ,MAAO,EAClE,GAAI,IAAW,IAAA,GAAY,CAAC,EAAI,CAAE,QAAO,EACzC,GAAI,GAAS,oBAAsB,IAAA,GAAY,CAAC,EAAI,CAAE,UAAW,EAAQ,iBAAkB,EAC3F,GAAI,EAAM,YAAc,IAAA,GAAY,CAAC,EAAI,CAAE,UAAW,EAAM,SAAU,EACtE,GAAI,GAAS,gBAAkB,IAAA,IAAa,EAAK,gBAAkB,IAAA,GAC/D,CAAC,EACD,CAAE,cAAe,GAAS,eAAiB,EAAK,aAAc,EAClE,gBACA,mCAAoC,CACtC,CAAC,CACH,CACF,CAEA,SAAS,EACP,EACA,EACA,EACkB,CAClB,IAAM,EAAS,EAAY,CAAG,EACxB,EAAS,EAAQ,EAAQ,SAAU,EAAK,EACxC,EAAY,EAAQ,EAAQ,YAAa,EAAK,EACpD,OAAO,OAAO,OAAO,CACnB,KAAM,EAAS,EAAQ,EAAQ,OAAQ,EAAK,CAAC,EAC7C,MAAO,YACP,QAAS,yBACT,GAAI,EAAgB,CAAM,EAAI,CAAE,QAAO,EAAI,CAAC,EAC5C,GAAI,IAAc,IAAA,GAAY,CAAC,EAAI,CAAE,UAAW,EAAK,CAAS,CAAE,EAChE,gBACA,mCAAoC,CACtC,CAAC,CACH,CAEA,SAAS,EAAgB,EAAiC,CACxD,OAAO,OAAO,GAAU,UAAY,OAAO,UAAU,CAAK,GAAK,GAAS,KAAO,GAAS,GAC1F,CAGA,SAAgB,EACd,EACA,EACA,EACA,EACA,EAC6B,CAC7B,IAAM,EAAa,EAAmB,EAAO,EAAe,CAAc,EACpE,EAAO,IAAI,IACX,EAAY,EAAU,IAAI,GAAO,CACrC,IAAM,EAAS,EAAY,CAAG,EACxB,EAAO,EAAS,EAAQ,EAAQ,OAAQ,EAAK,CAAC,EAC9C,EAAQ,EAAW,WAAW,EAAK,IAAmB,CAAC,EAAK,IAAI,CAAc,GAAK,EAAI,OAAS,CAAI,EAG1G,OAFI,EAAQ,EAAU,EAAa,EAAK,EAAe,CAAc,GACrE,EAAK,IAAI,CAAK,EACP,EAAW,EAAM,EAAE,OAAS,EAAa,EAAK,EAAe,CAAc,EACpF,CAAC,EACD,IAAK,GAAM,CAAC,EAAO,KAAQ,EAAW,QAAQ,EAAG,CAC/C,GAAI,EAAU,QAAU,EAAO,MAC1B,EAAK,IAAI,CAAK,GAAG,EAAU,KAAK,EAAI,KAAK,CAChD,CACA,OAAO,OAAO,OAAO,CAAS,CAChC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{isTraceId as e}from"../../../observation/context.js";import{arrayData as t,objectValue as n,ownData as r}from"../../../capability/common/data.js";import{DELIVERY_LIMITS as i}from"./config.js";import{DeliveryDataError as a,bytes as o,choice as s,duration as c,identity as l,numericFields as u,timestamp as d}from"./data.js";import{OPERATION_KINDS as f}from"../config.js";import{OPERATION_STATUSES as p,deliverySummary as m,modelCall as h,runUsage as g}from"./accounting-data.js";import{supportSafeErrors as _}from"./support-errors.js";const v=new WeakSet,y=Object.freeze([`total`,`success`,`error`,`aborted`,`rejected`,`unknown`]);function b(e){return v.has(e)}function x(m,b=[]){try{let x=n(m),S=l(r(x,`runId`)),C=r(x,`traceId`);if(!e(C))throw new a;let w=g(r(x,`usage`)),T=0,E=t(r(x,`modelCalls`),i.modelCalls).map(e=>{let t=h(e,S,C,i.recordBytes-T);if(T+=o(t),T>i.recordBytes)throw new a;return t});if(new Set(E.map(e=>e.modelCallId)).size!==E.length)throw new a;let D=n(r(x,`operationCounts`)),O=Object.freeze(Object.fromEntries(f.map(e=>[e,u(r(D,e),y)]))),k=t(b,i.toolSources).map(e=>{let t=n(e);return Object.freeze({sourceId:l(r(t,`sourceId`)),revision:l(r(t,`revision`))})});if(new Set(k.map(e=>e.sourceId)).size!==k.length)throw new a;let A=_(t(r(x,`errors`),i.errors),E,w.coverage,w.coverage.possiblyBilledAttemptsWithoutUsage,i.errors),j=Object.freeze({kind:`run-terminal-record`,runId:S,traceId:C,startedAt:d(r(x,`startedAt`)),endedAt:d(r(x,`endedAt`)),durationMs:c(r(x,`durationMs`)),status:s(r(x,`status`),p),usage:w,modelCalls:Object.freeze(E),operationCounts:O,toolSourceSnapshots:Object.freeze(k),errors:Object.freeze(A)});if(o(j)>i.recordBytes)throw new a;return v.add(j),j}catch{throw new a}}function S(e,t){if(!v.has(e))throw new a;try{return Object.freeze({...e,delivery:m(t)})}catch{throw new a}}export{x as createRunTerminalRecord,b as isPreparedTerminal,S as withTerminalDelivery};
|
|
2
|
+
//# sourceMappingURL=terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","names":[],"sources":["../../../../src/agent/accounting/delivery/terminal.ts"],"sourcesContent":["import { arrayData, objectValue, ownData } from '../../../capability/common/data.ts'\nimport { isTraceId } from '../../../observation/index.ts'\nimport { OPERATION_KINDS } from '../config.ts'\nimport type { LegacyRunReport } from '../report.ts'\nimport type { RunReport, RunTerminalRecord, ToolSourceRunReference } from '../delivery-types.ts'\nimport { deliverySummary, modelCall, OPERATION_STATUSES, runUsage } from './accounting-data.ts'\nimport { DELIVERY_LIMITS } from './config.ts'\nimport {\n bytes, choice, DeliveryDataError, duration, identity, numericFields, timestamp,\n} from './data.ts'\nimport { supportSafeErrors } from './support-errors.ts'\n\nconst prepared = new WeakSet<RunTerminalRecord>()\nconst COUNT_KEYS = Object.freeze(['total', 'success', 'error', 'aborted', 'rejected', 'unknown'] as const)\n\nexport function isPreparedTerminal(record: RunTerminalRecord): boolean { return prepared.has(record) }\n\nexport function createRunTerminalRecord(\n report: LegacyRunReport | RunReport,\n sources: readonly ToolSourceRunReference[] = [],\n): RunTerminalRecord {\n try {\n const input = objectValue(report)\n const runId = identity(ownData(input, 'runId')), traceId = ownData(input, 'traceId')\n if (!isTraceId(traceId)) throw new DeliveryDataError()\n const usage = runUsage(ownData(input, 'usage'))\n let usedBytes = 0\n const calls = arrayData(ownData(input, 'modelCalls'), DELIVERY_LIMITS.modelCalls).map(value => {\n const call = modelCall(value, runId, traceId, DELIVERY_LIMITS.recordBytes - usedBytes)\n usedBytes += bytes(call)\n if (usedBytes > DELIVERY_LIMITS.recordBytes) throw new DeliveryDataError()\n return call\n })\n if (new Set(calls.map(call => call.modelCallId)).size !== calls.length) throw new DeliveryDataError()\n const counts = objectValue(ownData(input, 'operationCounts'))\n const operationCounts = Object.freeze(Object.fromEntries(OPERATION_KINDS.map(kind => (\n [kind, numericFields(ownData(counts, kind), COUNT_KEYS)]\n )))) as RunTerminalRecord['operationCounts']\n const toolSourceSnapshots = arrayData(sources, DELIVERY_LIMITS.toolSources).map(value => {\n const source = objectValue(value)\n return Object.freeze({\n sourceId: identity(ownData(source, 'sourceId')),\n revision: identity(ownData(source, 'revision')),\n })\n })\n if (new Set(toolSourceSnapshots.map(source => source.sourceId)).size !== toolSourceSnapshots.length) {\n throw new DeliveryDataError()\n }\n const errors = supportSafeErrors(\n arrayData(ownData(input, 'errors'), DELIVERY_LIMITS.errors), calls, usage.coverage,\n usage.coverage.possiblyBilledAttemptsWithoutUsage, DELIVERY_LIMITS.errors,\n )\n const record: RunTerminalRecord = Object.freeze({\n kind: 'run-terminal-record', runId, traceId,\n startedAt: timestamp(ownData(input, 'startedAt')), endedAt: timestamp(ownData(input, 'endedAt')),\n durationMs: duration(ownData(input, 'durationMs')),\n status: choice(ownData(input, 'status'), OPERATION_STATUSES),\n usage, modelCalls: Object.freeze(calls), operationCounts,\n toolSourceSnapshots: Object.freeze(toolSourceSnapshots), errors: Object.freeze(errors),\n })\n if (bytes(record) > DELIVERY_LIMITS.recordBytes) throw new DeliveryDataError()\n prepared.add(record)\n return record\n } catch { throw new DeliveryDataError() }\n}\n\nexport function withTerminalDelivery(\n record: RunTerminalRecord,\n delivery: RunReport['delivery'],\n): RunReport {\n if (!prepared.has(record)) throw new DeliveryDataError()\n try { return Object.freeze({ ...record, delivery: deliverySummary(delivery) }) }\n catch { throw new DeliveryDataError() }\n}\n"],"mappings":"6hBAYA,MAAM,EAAW,IAAI,QACf,EAAa,OAAO,OAAO,CAAC,QAAS,UAAW,QAAS,UAAW,WAAY,SAAS,CAAU,EAEzG,SAAgB,EAAmB,EAAoC,CAAE,OAAO,EAAS,IAAI,CAAM,CAAE,CAErG,SAAgB,EACd,EACA,EAA6C,CAAC,EAC3B,CACnB,GAAI,CACF,IAAM,EAAQ,EAAY,CAAM,EAC1B,EAAQ,EAAS,EAAQ,EAAO,OAAO,CAAC,EAAG,EAAU,EAAQ,EAAO,SAAS,EACnF,GAAI,CAAC,EAAU,CAAO,EAAG,MAAM,IAAI,EACnC,IAAM,EAAQ,EAAS,EAAQ,EAAO,OAAO,CAAC,EAC1C,EAAY,EACV,EAAQ,EAAU,EAAQ,EAAO,YAAY,EAAG,EAAgB,UAAU,CAAC,CAAC,IAAI,GAAS,CAC7F,IAAM,EAAO,EAAU,EAAO,EAAO,EAAS,EAAgB,YAAc,CAAS,EAErF,GADA,GAAa,EAAM,CAAI,EACnB,EAAY,EAAgB,YAAa,MAAM,IAAI,EACvD,OAAO,CACT,CAAC,EACD,GAAI,IAAI,IAAI,EAAM,IAAI,GAAQ,EAAK,WAAW,CAAC,CAAC,CAAC,OAAS,EAAM,OAAQ,MAAM,IAAI,EAClF,IAAM,EAAS,EAAY,EAAQ,EAAO,iBAAiB,CAAC,EACtD,EAAkB,OAAO,OAAO,OAAO,YAAY,EAAgB,IAAI,GAC3E,CAAC,EAAM,EAAc,EAAQ,EAAQ,CAAI,EAAG,CAAU,CAAC,CACxD,CAAC,CAAC,EACG,EAAsB,EAAU,EAAS,EAAgB,WAAW,CAAC,CAAC,IAAI,GAAS,CACvF,IAAM,EAAS,EAAY,CAAK,EAChC,OAAO,OAAO,OAAO,CACnB,SAAU,EAAS,EAAQ,EAAQ,UAAU,CAAC,EAC9C,SAAU,EAAS,EAAQ,EAAQ,UAAU,CAAC,CAChD,CAAC,CACH,CAAC,EACD,GAAI,IAAI,IAAI,EAAoB,IAAI,GAAU,EAAO,QAAQ,CAAC,CAAC,CAAC,OAAS,EAAoB,OAC3F,MAAM,IAAI,EAEZ,IAAM,EAAS,EACb,EAAU,EAAQ,EAAO,QAAQ,EAAG,EAAgB,MAAM,EAAG,EAAO,EAAM,SAC1E,EAAM,SAAS,mCAAoC,EAAgB,MACrE,EACM,EAA4B,OAAO,OAAO,CAC9C,KAAM,sBAAuB,QAAO,UACpC,UAAW,EAAU,EAAQ,EAAO,WAAW,CAAC,EAAG,QAAS,EAAU,EAAQ,EAAO,SAAS,CAAC,EAC/F,WAAY,EAAS,EAAQ,EAAO,YAAY,CAAC,EACjD,OAAQ,EAAO,EAAQ,EAAO,QAAQ,EAAG,CAAkB,EAC3D,QAAO,WAAY,OAAO,OAAO,CAAK,EAAG,kBACzC,oBAAqB,OAAO,OAAO,CAAmB,EAAG,OAAQ,OAAO,OAAO,CAAM,CACvF,CAAC,EACD,GAAI,EAAM,CAAM,EAAI,EAAgB,YAAa,MAAM,IAAI,EAE3D,OADA,EAAS,IAAI,CAAM,EACZ,CACT,MAAQ,CAAE,MAAM,IAAI,CAAoB,CAC1C,CAEA,SAAgB,EACd,EACA,EACW,CACX,GAAI,CAAC,EAAS,IAAI,CAAM,EAAG,MAAM,IAAI,EACrC,GAAI,CAAE,OAAO,OAAO,OAAO,CAAE,GAAG,EAAQ,SAAU,EAAgB,CAAQ,CAAE,CAAC,CAAE,MACzE,CAAE,MAAM,IAAI,CAAoB,CACxC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { TraceId } from "../../observation/context.js";
|
|
2
|
+
import { ObservationEvent, ObservationResource, OperationStatus } from "../../observation/event.js";
|
|
3
|
+
import { ObservationDeliverySummary } from "../../observation/port.js";
|
|
4
|
+
import { ModelCallReport } from "../../observation/report.js";
|
|
5
|
+
import { SupportSafeError } from "../../support-safe/error.js";
|
|
6
|
+
import { RunOperationCounts, RunUsageReport, TrackedOperationKind } from "./report.js";
|
|
7
|
+
//#region src/agent/accounting/delivery-types.d.ts
|
|
8
|
+
interface ToolSourceRunReference {
|
|
9
|
+
readonly sourceId: string;
|
|
10
|
+
readonly revision: string;
|
|
11
|
+
}
|
|
12
|
+
interface RunTerminalRecord {
|
|
13
|
+
readonly kind: 'run-terminal-record';
|
|
14
|
+
readonly runId: string;
|
|
15
|
+
readonly traceId: TraceId;
|
|
16
|
+
readonly startedAt: string;
|
|
17
|
+
readonly endedAt: string;
|
|
18
|
+
readonly durationMs: number;
|
|
19
|
+
readonly status: OperationStatus;
|
|
20
|
+
readonly usage: RunUsageReport;
|
|
21
|
+
readonly modelCalls: readonly ModelCallReport[];
|
|
22
|
+
readonly toolSourceSnapshots: readonly ToolSourceRunReference[];
|
|
23
|
+
readonly operationCounts: Readonly<Record<TrackedOperationKind, RunOperationCounts>>;
|
|
24
|
+
readonly errors: readonly SupportSafeError[];
|
|
25
|
+
}
|
|
26
|
+
interface RunReport extends RunTerminalRecord {
|
|
27
|
+
readonly delivery: ObservationDeliverySummary;
|
|
28
|
+
}
|
|
29
|
+
interface ObservationDeliveryBatch {
|
|
30
|
+
readonly id: string;
|
|
31
|
+
readonly resource: ObservationResource;
|
|
32
|
+
readonly events: readonly ObservationEvent[];
|
|
33
|
+
readonly runRecords: readonly RunTerminalRecord[];
|
|
34
|
+
}
|
|
35
|
+
interface ObservationDeliveryAck {
|
|
36
|
+
readonly batchId: string;
|
|
37
|
+
readonly acceptedEventIds: readonly string[];
|
|
38
|
+
readonly acceptedRunIds: readonly string[];
|
|
39
|
+
}
|
|
40
|
+
type ObservationExportItem = ObservationEvent | RunTerminalRecord;
|
|
41
|
+
//#endregion
|
|
42
|
+
export { ObservationDeliveryAck, ObservationDeliveryBatch, ObservationExportItem, RunReport, RunTerminalRecord, ToolSourceRunReference };
|
|
43
|
+
//# sourceMappingURL=delivery-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-types.d.ts","names":[],"sources":["../../../src/agent/accounting/delivery-types.ts"],"mappings":";;;;;;;UASiB;WACN;WACA;;UAGM;WACN;WACA;WACA,SAAS;WACT;WACA;WACA;WACA,QAAQ;WACR,OAAO;WACP,qBAAqB;WACrB,8BAA8B;WAC9B,iBAAiB,SAAS,OAAO,sBAAsB;WACvD,iBAAiB;;UAGX,kBAAkB;WACxB,UAAU;;UAGJ;WACN;WACA,UAAU;WACV,iBAAiB;WACjB,qBAAqB;;UAGf;WACN;WACA;WACA;;KAGC,wBAAwB,mBAAmB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { AgentSdkError } from "../../errors/agent-sdk-error.js";
|
|
2
|
+
import { TraceId } from "../../observation/context.js";
|
|
3
|
+
import { RunReport } from "./delivery-types.js";
|
|
4
|
+
//#region src/agent/accounting/error.d.ts
|
|
5
|
+
declare const AGENT_ACCOUNTING_ERROR_CODES: Readonly<{
|
|
6
|
+
readonly RUN_FAILED: 'AGENT_RUN_FAILED';
|
|
7
|
+
readonly LEDGER_STATE_INVALID: 'LEDGER_STATE_INVALID';
|
|
8
|
+
}>;
|
|
9
|
+
/** A post-run-creation failure with a support-safe, finalized report. */
|
|
10
|
+
declare class AgentRunError extends AgentSdkError {
|
|
11
|
+
readonly runId: string;
|
|
12
|
+
readonly traceId: TraceId;
|
|
13
|
+
readonly report: RunReport;
|
|
14
|
+
constructor(message: string, code: string, report: RunReport, options?: ErrorOptions);
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
export { AGENT_ACCOUNTING_ERROR_CODES, AgentRunError };
|
|
18
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","names":[],"sources":["../../../src/agent/accounting/error.ts"],"mappings":";;;;cAKa,8BAA4B;WAC3B;WACU;;;cAIX,sBAAsB;WACxB;WACA,SAAS;WACT,QAAQ;EAEjB,YAAY,iBAAiB,cAAc,QAAQ,WAAW,UAAU"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{AgentSdkError as e}from"../../errors/agent-sdk-error.js";import{inheritCapabilityIdentityConflict as t}from"../../errors/capability-identity.js";const n=Object.freeze({RUN_FAILED:`AGENT_RUN_FAILED`,LEDGER_STATE_INVALID:`LEDGER_STATE_INVALID`});var r=class extends e{runId;traceId;report;constructor(e,n,r,i){super(e,n,i),this.name=`AgentRunError`,this.runId=r.runId,this.traceId=r.traceId,this.report=r,t(this,i?.cause)}};export{n as AGENT_ACCOUNTING_ERROR_CODES,r as AgentRunError};
|
|
2
|
+
//# sourceMappingURL=error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.js","names":[],"sources":["../../../src/agent/accounting/error.ts"],"sourcesContent":["import { AgentSdkError } from '../../errors/index.ts'\nimport { type TraceId } from '../../observation/index.ts'\nimport type { RunReport } from './delivery-types.ts'\nimport { inheritCapabilityIdentityConflict } from '../../errors/capability-identity.ts'\n\nexport const AGENT_ACCOUNTING_ERROR_CODES = Object.freeze({\n RUN_FAILED: 'AGENT_RUN_FAILED',\n LEDGER_STATE_INVALID: 'LEDGER_STATE_INVALID',\n} as const)\n\n/** A post-run-creation failure with a support-safe, finalized report. */\nexport class AgentRunError extends AgentSdkError {\n readonly runId: string\n readonly traceId: TraceId\n readonly report: RunReport\n\n constructor(message: string, code: string, report: RunReport, options?: ErrorOptions) {\n super(message, code, options)\n this.name = 'AgentRunError'\n this.runId = report.runId\n this.traceId = report.traceId\n this.report = report\n inheritCapabilityIdentityConflict(this, options?.cause)\n }\n}\n"],"mappings":"wJAKA,MAAa,EAA+B,OAAO,OAAO,CACxD,WAAY,mBACZ,qBAAsB,sBACxB,CAAU,EAGV,IAAa,EAAb,cAAmC,CAAc,CAC/C,MACA,QACA,OAEA,YAAY,EAAiB,EAAc,EAAmB,EAAwB,CACpF,MAAM,EAAS,EAAM,CAAO,EAC5B,KAAK,KAAO,gBACZ,KAAK,MAAQ,EAAO,MACpB,KAAK,QAAU,EAAO,QACtB,KAAK,OAAS,EACd,EAAkC,KAAM,GAAS,KAAK,CACxD,CACF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
async function e(e,t,n,r){let i=new AbortController,a=AbortSignal.any([n,i.signal,...t.request.signal===void 0?[]:[t.request.signal]]),o=setTimeout(()=>i.abort(Error(`usage estimation deadline exceeded`)),r);try{return a.throwIfAborted(),await new Promise((n,r)=>{let i=()=>r(a.reason);a.addEventListener(`abort`,i,{once:!0}),Promise.resolve().then(()=>(a.throwIfAborted(),e.estimate({...t,signal:a}))).then(e=>{a.removeEventListener(`abort`,i),n(e)},e=>{a.removeEventListener(`abort`,i),r(e)})})}finally{clearTimeout(o),i.abort(Error(`usage estimation scope closed`))}}export{e as estimateUsage};
|
|
2
|
+
//# sourceMappingURL=estimate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"estimate.js","names":[],"sources":["../../../src/agent/accounting/estimate.ts"],"sourcesContent":["import type { UsageCounters } from '../../observation/index.ts'\nimport type { UsageEstimationInput, UsageEstimator } from './report.ts'\n\n/** Observe late rejection without allowing late results to publish into a ledger. */\nexport async function estimateUsage(\n estimator: UsageEstimator,\n input: Omit<UsageEstimationInput, 'signal'>,\n closed: AbortSignal,\n timeoutMs: number,\n): Promise<UsageCounters> {\n const deadline = new AbortController()\n const signal = AbortSignal.any([closed, deadline.signal, ...input.request.signal === undefined ? [] : [input.request.signal]])\n const timer = setTimeout(() => deadline.abort(new Error('usage estimation deadline exceeded')), timeoutMs)\n try {\n signal.throwIfAborted()\n return await new Promise<UsageCounters>((resolve, reject) => {\n const abort = () => reject(signal.reason)\n signal.addEventListener('abort', abort, { once: true })\n void Promise.resolve().then(() => {\n signal.throwIfAborted()\n return estimator.estimate({ ...input, signal })\n }).then(\n value => { signal.removeEventListener('abort', abort); resolve(value) },\n error => { signal.removeEventListener('abort', abort); reject(error) },\n )\n })\n } finally {\n clearTimeout(timer)\n deadline.abort(new Error('usage estimation scope closed'))\n }\n}\n"],"mappings":"AAIA,eAAsB,EACpB,EACA,EACA,EACA,EACwB,CACxB,IAAM,EAAW,IAAI,gBACf,EAAS,YAAY,IAAI,CAAC,EAAQ,EAAS,OAAQ,GAAG,EAAM,QAAQ,SAAW,IAAA,GAAY,CAAC,EAAI,CAAC,EAAM,QAAQ,MAAM,CAAC,CAAC,EACvH,EAAQ,eAAiB,EAAS,MAAU,MAAM,oCAAoC,CAAC,EAAG,CAAS,EACzG,GAAI,CAEF,OADA,EAAO,eAAe,EACf,MAAM,IAAI,SAAwB,EAAS,IAAW,CAC3D,IAAM,MAAc,EAAO,EAAO,MAAM,EACxC,EAAO,iBAAiB,QAAS,EAAO,CAAE,KAAM,EAAK,CAAC,EACtD,QAAa,QAAQ,CAAC,CAAC,UACrB,EAAO,eAAe,EACf,EAAU,SAAS,CAAE,GAAG,EAAO,QAAO,CAAC,EAC/C,CAAC,CAAC,KACD,GAAS,CAAE,EAAO,oBAAoB,QAAS,CAAK,EAAG,EAAQ,CAAK,CAAE,EACtE,GAAS,CAAE,EAAO,oBAAoB,QAAS,CAAK,EAAG,EAAO,CAAK,CAAE,CACvE,CACF,CAAC,CACH,QAAU,CACR,aAAa,CAAK,EAClB,EAAS,MAAU,MAAM,+BAA+B,CAAC,CAC3D,CACF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{AgentSdkError as e}from"../../errors/agent-sdk-error.js";import{OBSERVATION_ERROR_CODES as t}from"../../observation/report.js";var n=class{values=[];waiters=[];bytes=0;closed=!1;stopped=!1;failure;maxEvents;maxBytes;constructor(e=1e5,t=16777216){this.maxEvents=r(e,`maxEvents`),this.maxBytes=r(t,`maxBytes`)}push(n){if(this.stopped)return;if(this.closed)throw Error(`run event buffer is closed`);let r=i(n);if(this.values.length>=this.maxEvents||this.bytes+r>this.maxBytes)throw new e(`public run event buffer exceeded its resource limit`,t.LEDGER_LIMIT_EXCEEDED);this.values.push({value:n,bytes:r}),this.bytes+=r,this.notify()}close(){this.closed=!0,this.notify()}fail(e){this.failure=e,this.closed=!0,this.notify()}stop(){this.stopped=!0,this.closed=!0,this.values.length=0,this.bytes=0,this.notify()}async take(){for(;;){let e=this.values.shift();if(e!==void 0)return this.bytes-=e.bytes,{done:!1,value:e.value};if(this.failure!==void 0)throw this.failure;if(this.closed)return{done:!0,value:void 0};await new Promise(e=>this.waiters.push(e))}}notify(){let e=this.waiters.splice(0);for(let t of e)t()}};function r(e,t){if(!Number.isSafeInteger(e)||e<1)throw RangeError(`${t} must be a positive safe integer`);return e}function i(n){try{let e=JSON.stringify(n);return e===void 0?0:new TextEncoder().encode(e).byteLength}catch{throw new e(`public run event is not lossless JSON`,t.LEDGER_LIMIT_EXCEEDED)}}export{n as RunEventBuffer};
|
|
2
|
+
//# sourceMappingURL=event-buffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-buffer.js","names":[],"sources":["../../../src/agent/accounting/event-buffer.ts"],"sourcesContent":["import { AgentSdkError } from '../../errors/index.ts'\nimport { OBSERVATION_ERROR_CODES } from '../../observation/index.ts'\n\ninterface BufferedValue<T> { readonly value: T; readonly bytes: number }\n\n/** Single-consumer, non-blocking producer buffer for public run events. */\nexport class RunEventBuffer<T> {\n private readonly values: BufferedValue<T>[] = []\n private readonly waiters: Array<() => void> = []\n private bytes = 0\n private closed = false\n private stopped = false\n private failure: unknown\n private readonly maxEvents: number\n private readonly maxBytes: number\n\n constructor(maxEvents = 100_000, maxBytes = 16 * 1024 * 1024) {\n this.maxEvents = positiveLimit(maxEvents, 'maxEvents')\n this.maxBytes = positiveLimit(maxBytes, 'maxBytes')\n }\n\n push(value: T): void {\n if (this.stopped) return\n if (this.closed) throw new Error('run event buffer is closed')\n const bytes = serializedBytes(value)\n if (this.values.length >= this.maxEvents || this.bytes + bytes > this.maxBytes) {\n throw new AgentSdkError(\n 'public run event buffer exceeded its resource limit',\n OBSERVATION_ERROR_CODES.LEDGER_LIMIT_EXCEEDED,\n )\n }\n this.values.push({ value, bytes })\n this.bytes += bytes\n this.notify()\n }\n\n close(): void {\n this.closed = true\n this.notify()\n }\n\n fail(error: unknown): void {\n this.failure = error\n this.closed = true\n this.notify()\n }\n\n stop(): void {\n this.stopped = true\n this.closed = true\n this.values.length = 0\n this.bytes = 0\n this.notify()\n }\n\n async take(): Promise<IteratorResult<T>> {\n while (true) {\n const item = this.values.shift()\n if (item !== undefined) {\n this.bytes -= item.bytes\n return { done: false, value: item.value }\n }\n if (this.failure !== undefined) throw this.failure\n if (this.closed) return { done: true, value: undefined }\n await new Promise<void>(resolve => this.waiters.push(resolve))\n }\n }\n\n private notify(): void {\n const waiters = this.waiters.splice(0)\n for (const resolve of waiters) resolve()\n }\n}\n\nfunction positiveLimit(value: number, name: string): number {\n if (!Number.isSafeInteger(value) || value < 1) throw new RangeError(`${name} must be a positive safe integer`)\n return value\n}\n\nfunction serializedBytes(value: unknown): number {\n try {\n const serialized = JSON.stringify(value)\n return serialized === undefined ? 0 : new TextEncoder().encode(serialized).byteLength\n } catch {\n throw new AgentSdkError(\n 'public run event is not lossless JSON',\n OBSERVATION_ERROR_CODES.LEDGER_LIMIT_EXCEEDED,\n )\n }\n}\n"],"mappings":"sIAMA,IAAa,EAAb,KAA+B,CAC7B,OAA8C,CAAC,EAC/C,QAA8C,CAAC,EAC/C,MAAgB,EAChB,OAAiB,GACjB,QAAkB,GAClB,QACA,UACA,SAEA,YAAY,EAAY,IAAS,EAAW,SAAkB,CAC5D,KAAK,UAAY,EAAc,EAAW,WAAW,EACrD,KAAK,SAAW,EAAc,EAAU,UAAU,CACpD,CAEA,KAAK,EAAgB,CACnB,GAAI,KAAK,QAAS,OAClB,GAAI,KAAK,OAAQ,MAAU,MAAM,4BAA4B,EAC7D,IAAM,EAAQ,EAAgB,CAAK,EACnC,GAAI,KAAK,OAAO,QAAU,KAAK,WAAa,KAAK,MAAQ,EAAQ,KAAK,SACpE,MAAM,IAAI,EACR,sDACA,EAAwB,qBAC1B,EAEF,KAAK,OAAO,KAAK,CAAE,QAAO,OAAM,CAAC,EACjC,KAAK,OAAS,EACd,KAAK,OAAO,CACd,CAEA,OAAc,CACZ,KAAK,OAAS,GACd,KAAK,OAAO,CACd,CAEA,KAAK,EAAsB,CACzB,KAAK,QAAU,EACf,KAAK,OAAS,GACd,KAAK,OAAO,CACd,CAEA,MAAa,CACX,KAAK,QAAU,GACf,KAAK,OAAS,GACd,KAAK,OAAO,OAAS,EACrB,KAAK,MAAQ,EACb,KAAK,OAAO,CACd,CAEA,MAAM,MAAmC,CACvC,OAAa,CACX,IAAM,EAAO,KAAK,OAAO,MAAM,EAC/B,GAAI,IAAS,IAAA,GAEX,MADA,MAAK,OAAS,EAAK,MACZ,CAAE,KAAM,GAAO,MAAO,EAAK,KAAM,EAE1C,GAAI,KAAK,UAAY,IAAA,GAAW,MAAM,KAAK,QAC3C,GAAI,KAAK,OAAQ,MAAO,CAAE,KAAM,GAAM,MAAO,IAAA,EAAU,EACvD,MAAM,IAAI,QAAc,GAAW,KAAK,QAAQ,KAAK,CAAO,CAAC,CAC/D,CACF,CAEA,QAAuB,CACrB,IAAM,EAAU,KAAK,QAAQ,OAAO,CAAC,EACrC,IAAK,IAAM,KAAW,EAAS,EAAQ,CACzC,CACF,EAEA,SAAS,EAAc,EAAe,EAAsB,CAC1D,GAAI,CAAC,OAAO,cAAc,CAAK,GAAK,EAAQ,EAAG,MAAU,WAAW,GAAG,EAAK,iCAAiC,EAC7G,OAAO,CACT,CAEA,SAAS,EAAgB,EAAwB,CAC/C,GAAI,CACF,IAAM,EAAa,KAAK,UAAU,CAAK,EACvC,OAAO,IAAe,IAAA,GAAY,EAAI,IAAI,YAAY,CAAC,CAAC,OAAO,CAAU,CAAC,CAAC,UAC7E,MAAQ,CACN,MAAM,IAAI,EACR,wCACA,EAAwB,qBAC1B,CACF,CACF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{deepFreeze as e}from"../../primitives/freeze.js";import{SDK_VERSION as t}from"../../primitives/version.js";import{createObservationRunScope as n,createOperationId as r}from"../../observation/context.js";import{safeErrorRecord as i}from"../../observation/event.js";import{NOOP_OBSERVATION_PORT as a,createCoreSpan as o,disabledDeliverySummary as s,snapshotObservationSpan as c,validateCaptureReceipt as l}from"../../observation/port.js";import{AgentSdkError as u}from"../../errors/agent-sdk-error.js";import{OBSERVATION_ERROR_CODES as d}from"../../observation/report.js";import{hasUsageCounters as f,validateUsageCounters as p}from"../../observation/usage.js";import{OPERATION_KINDS as m}from"./config.js";import{accountingError as h}from"./common.js";import{aggregateUsage as g,authoritativeTokenUsage as _,budgetTokenTotal as v,missingCounters as y,summarizeModelCallUsage as b}from"./usage.js";import{AGENT_ACCOUNTING_ERROR_CODES as x}from"./error.js";import{estimateUsage as S}from"./estimate.js";const C=Object.freeze({turn:`sdk.agent.turn`,"model-call":`sdk.model.call`,"provider-attempt":`sdk.provider.attempt`,tool:`sdk.tool.call`,compaction:`sdk.compaction`,hook:`sdk.hook.call`,"user-input":`sdk.user.input.wait`,skill:`sdk.skill.operation`,memory:`sdk.memory.operation`,credential:`sdk.credential.operation`,integration:`sdk.integration.request`}),w=Object.freeze({turn:`sdk.agent.turn`,"model-call":`sdk.model.call`,"provider-attempt":`sdk.provider.attempt`,tool:`sdk.tool.call`,compaction:`sdk.compaction`,hook:`sdk.hook.call`,"user-input":`sdk.user.input.wait`,skill:`sdk.skill.operation`,memory:`sdk.memory.operation`,credential:`sdk.credential.operation`,integration:`sdk.integration.request`});var T=class{runId;traceId;modelInvocation;mode;terminalAuditFailure=!1;stoppedUsage;get usageStop(){return this.stoppedUsage}port;resource;scope=n();runSpan;startedAt=new Date().toISOString();startedMonotonic=this.scope.monotonicMs();tracker={accepted:0,rejected:0,pending:0,reached:`none`};limits;usagePolicy;estimationClosed=new AbortController;cumulativeTokenBudget;defectMode;operations=new Map;modelCalls=new Map;errors=[];serializedBytes=0;toolCalls=0;integrityUnknown=!1;closed=!1;finalReport;finalizing;constructor(n){if(typeof n.agentId!=`string`||n.agentId.trim().length===0)throw TypeError(`run ledger agentId must be non-empty`);if(n.maxTurns!==`auto`&&(!Number.isSafeInteger(n.maxTurns)||n.maxTurns<1))throw RangeError(`run ledger maxTurns must be a positive safe integer or 'auto'`);if(this.runId=n.runId??r(),this.runId.length===0)throw TypeError(`run ledger runId must be non-empty`);this.port=n.observation??a,this.resource=e(n.resource===void 0?{sdkName:`ai-agent-sdk`,sdkVersion:t,runtime:`unknown`}:{...n.resource}),this.mode=O(this.port,this.tracker),this.limits=E(n.limits),this.usagePolicy=D(n.usagePolicy),this.cumulativeTokenBudget=n.cumulativeTokenBudget??!1,this.defectMode=n.defectMode??`production`,this.runSpan=k(this.port,{name:`sdk.agent.run`,runId:this.runId,...n.parent===void 0?{}:{parent:n.parent},correlation:{...n.conversationId===void 0?{}:{conversationId:n.conversationId},...n.sessionId===void 0?{}:{sessionId:n.sessionId}},startedAt:this.startedAt,monotonicMs:this.startedMonotonic},this.tracker),this.traceId=this.runSpan.correlation.traceId;let i=n.logger?.(this.runSpan.correlation);this.modelInvocation=Object.freeze({observation:this.port,correlation:this.runSpan.correlation,terminalCheckpointOwner:`agent-run`,scope:this.scope,...i===void 0?{}:{logger:i}}),this.capture(this.event(`sdk.agent.run`,`start`,this.runSpan.correlation,{agentId:n.agentId,mode:n.mode,maxTurns:n.maxTurns}))}startOperation(t,n={}){if(this.assertOpen(`operation start`),!m.includes(t))throw TypeError(`unknown tracked operation kind '${String(t)}'`);let i=n.operationId??r();if(this.operations.has(i))return this.defect(`duplicate ${t} operation start '${i}'`),i;t===`tool`&&(this.toolCalls>=this.limits.maxToolCalls&&this.limit(`run exceeded ${this.limits.maxToolCalls} tool calls`),this.toolCalls++);let a=new Date().toISOString(),o=this.scope.monotonicMs(),s=k(this.port,{name:w[t],runId:this.runId,parent:this.runSpan.correlation,correlation:n.toolCallId===void 0?{}:{toolCallId:n.toolCallId},startedAt:a,monotonicMs:o},this.tracker),c=e({...n.data??{}});return this.charge({id:i,kind:t,data:c}),this.operations.set(i,{id:i,kind:t,span:s,startedAt:a,startedMonotonic:o,data:c}),this.capture(this.event(C[t],`start`,s.correlation,c)),i}endOperation(t,n,r={}){let a=this.operations.get(t);if(a===void 0){this.defect(`orphan operation terminal '${t}'`);return}if(a.status!==void 0){this.defect(`duplicate operation terminal '${t}'`),a.status=`unknown`;return}if(!L(n))throw TypeError(`invalid operation status '${String(n)}'`);let o=new Date().toISOString(),s=this.scope.monotonicMs();a.status=n,r.error!==void 0&&(a.error=i(r.error)),a.span.end(n,o,s),a.error!==void 0&&this.errors.push(a.error);let c=e({...r.data??{},status:n,durationMs:Math.max(0,s-a.startedMonotonic),...a.error===void 0?{}:{error:I(a.error)}});this.charge(c),this.capture(this.event(C[a.kind],`end`,a.span.correlation,c))}async recordModelCall(t,n){if(this.assertOpen(`model-call usage`),this.modelCalls.has(t.modelCallId)){this.defect(`duplicate model-call terminal '${t.modelCallId}'`);let e=Object.freeze({report:this.modelCalls.get(t.modelCallId)??t,usageRequired:!0,usageUnavailable:!1});return this.stoppedUsage??=e,e}this.modelCalls.size>=this.limits.maxModelCalls&&this.limit(`run exceeded ${this.limits.maxModelCalls} logical model calls`),t.attempts.length>this.limits.maxAttemptsPerCall&&this.limit(`model call '${t.modelCallId}' exceeded ${this.limits.maxAttemptsPerCall} attempts`),this.charge(t),this.modelCalls.set(t.modelCallId,t),j(this.tracker,t.delivery);let r=this.errors.length;t.error!==void 0&&this.errors.push(t.error);for(let e of t.attempts)e.error!==void 0&&this.errors.push(e.error);let i=t,a=!1,o=t.coverage===`missing`||t.coverage===`partial`;if(o&&this.usagePolicy.onMissing===`estimate`)try{let r=this.usagePolicy.estimator;if(r===void 0)throw TypeError(`estimate usage policy requires an estimator`);let a=await S(r,{runId:this.runId,modelCallId:t.modelCallId,provider:t.provider,model:t.model,request:n,report:t},this.estimationClosed.signal,this.usagePolicy.estimateTimeoutMs);if(this.closed)return{report:t,usageRequired:!0,usageUnavailable:!1};let o=p(a);if(o.invalidFields.length>0||o.overflow||!f(o.reported))throw TypeError(`usage estimator returned invalid or empty counters`);let s=y(o.reported,t.reported);if(!f(s))throw TypeError(`usage estimator did not cover a missing counter`);i=e({...t,coverage:f(t.reported)?`partial`:`estimated`,estimated:s,authoritative:!1})}catch(e){if(this.closed)return{report:t,usageRequired:!0,usageUnavailable:!1};a=!0,this.errors.splice(r,0,h(`usage estimation failed after a provider response`,d.USAGE_REQUIRED,e))}else o&&this.usagePolicy.onMissing===`fail`?(a=!0,this.errors.splice(r,0,h(`provider usage is required by the configured run policy`,d.USAGE_REQUIRED))):o&&t.error?.code!==d.USAGE_MISSING&&this.errors.splice(r,0,h(`model call completed without authoritative provider usage`,d.USAGE_MISSING));i!==t&&this.charge({estimated:i.estimated,coverage:i.coverage,authoritative:!1}),this.modelCalls.set(i.modelCallId,i);let s=Object.freeze({report:i,usageRequired:a,usageUnavailable:!a&&o&&this.usagePolicy.onMissing===`warn`&&this.cumulativeTokenBudget&&i.possiblyBilledAttemptsWithoutUsage>0});return(s.usageRequired||s.usageUnavailable)&&(this.stoppedUsage??=s),s}recordError(e){this.errors.push(i(e))}finalize(e,t,n){return this.finalReport===void 0?(this.finalizing===void 0&&(this.finalizing=this.finalizeOnce(e,t,n)),this.finalizing):Promise.resolve(this.finalReport)}async finalizeOnce(t,n,r){this.closed=!0,this.estimationClosed.abort(Error(`run ledger closed`)),r!==void 0&&this.errors.push(i(r)),this.closeOpenOperations();let a=this.integrityUnknown?`unknown`:t,o=new Date().toISOString(),s=this.scope.monotonicMs(),c=Math.max(0,s-this.startedMonotonic),l=g([...this.modelCalls.values()],this.errors),u=N(this.operations.values(),this.modelCalls.values());this.runSpan.end(a,o,s);let d=this.event(`sdk.agent.run`,`end`,this.runSpan.correlation,{status:a,durationMs:c,completed:n,usage:l,operationCounts:u,errorCount:this.errors.length});this.mode===`operational`?this.capture(d):await this.checkpoint(d);let f=M(this.port,this.mode,this.tracker),p=[...this.modelCalls.values()].map(t=>e({...t,delivery:f})),m=e({runId:this.runId,traceId:this.traceId,startedAt:this.startedAt,endedAt:o,durationMs:c,status:a,usage:l,modelCalls:p,operationCounts:u,errors:Object.freeze([...this.errors]),delivery:f});return this.finalReport=m,m}closeOpenOperations(){for(let e of this.operations.values()){if(e.status!==void 0)continue;this.integrityUnknown=!0;let t=h(`${e.kind} operation '${e.id}' closed without a terminal event`,d.OPERATION_TERMINAL_MISSING);this.errors.push(t);let n=new Date().toISOString(),r=this.scope.monotonicMs();e.status=`unknown`,e.error=t,e.span.end(`unknown`,n,r),this.capture(this.event(C[e.kind],`end`,e.span.correlation,{status:`unknown`,durationMs:Math.max(0,r-e.startedMonotonic),error:I(t)}))}}event(t,n,i,a){return e({schemaVersion:1,eventId:r(),sequence:this.scope.nextSequence(),name:t,phase:n,occurredAt:new Date().toISOString(),monotonicMs:this.scope.monotonicMs(),priority:`critical`,resource:this.resource,correlation:i,data:a})}capture(e){try{let t=l(this.port.capture(e),e.eventId);A(this.tracker,t)}catch(e){this.tracker.rejected++,this.tracker.lastFailure=i(e)}}async checkpoint(e){this.tracker.pending++;try{let t=this.port.checkpoint===void 0?{eventId:e.eventId,status:`rejected`,durable:!1,boundary:`none`,reason:`exporter-unavailable`}:await this.port.checkpoint(e);this.tracker.pending--;let n=l(t,e.eventId);A(this.tracker,n),(n.status!==`accepted`||!n.durable)&&(this.tracker.lastFailure=h(`run terminal checkpoint was ${n.status}`,d.CAPTURE_REJECTED),this.terminalAuditFailure=this.mode===`audit`)}catch(e){this.tracker.pending--,this.tracker.rejected++,this.tracker.lastFailure=i(e),this.terminalAuditFailure=this.mode===`audit`}}defect(e){let t=new u(e,x.LEDGER_STATE_INVALID);if(this.defectMode===`test`)throw t;this.integrityUnknown=!0,this.errors.push(i(t)),this.capture(this.event(`sdk.observer.failure`,`point`,this.runSpan.correlation,{observerId:`agent-run-ledger`,failureKind:`state-machine`,counter:this.errors.length,error:I(i(t))}))}limit(e){throw new u(e,d.LEDGER_LIMIT_EXCEEDED)}assertOpen(e){if(this.closed)throw this.defect(`${e} occurred after run ledger closure`),new u(`${e} occurred after run ledger closure`,x.LEDGER_STATE_INVALID)}charge(e){let t;try{let n=JSON.stringify(e);t=n===void 0?0:new TextEncoder().encode(n).byteLength}catch{this.limit(`run ledger state could not be represented as JSON`)}this.serializedBytes+t>this.limits.maxSerializedBytes&&this.limit(`run ledger exceeded ${this.limits.maxSerializedBytes} serialized bytes`),this.serializedBytes+=t}};function E(e){return Object.freeze({maxModelCalls:R(e?.maxModelCalls??1024,`maxModelCalls`),maxAttemptsPerCall:R(e?.maxAttemptsPerCall??16,`maxAttemptsPerCall`),maxToolCalls:R(e?.maxToolCalls??1e4,`maxToolCalls`),maxSerializedBytes:R(e?.maxSerializedBytes??16777216,`maxSerializedBytes`)})}function D(e){let t=e?.onMissing??`warn`;if(![`warn`,`estimate`,`fail`].includes(t))throw TypeError(`usage policy onMissing is invalid`);if(t===`estimate`&&(typeof e?.estimator?.id!=`string`||e.estimator.id.trim().length===0||typeof e.estimator.estimate!=`function`))throw TypeError(`estimate usage policy requires an estimator with a non-empty id`);let n=R(e?.estimateTimeoutMs??3e4,`estimateTimeoutMs`);if(n>2147483647)throw RangeError(`estimateTimeoutMs exceeds the timer range`);return Object.freeze({onMissing:t,estimateTimeoutMs:n,...e?.estimator===void 0?{}:{estimator:e.estimator}})}function O(e,t){try{let t=e.mode;if(t===`operational`||t===`reliable`||t===`audit`)return t;throw TypeError(`observation delivery mode is invalid`)}catch(e){return t.lastFailure=i(e),`operational`}}function k(e,t,n){try{let n=c(e.openSpan(t));if(n!==void 0&&n.correlation.runId===t.runId)return n;throw TypeError(`observation backend returned an invalid run span`)}catch(e){return n.lastFailure=i(e),o(t)}}function A(e,t){t.status===`accepted`?e.accepted++:e.rejected++,t.status===`accepted`&&z(t.boundary)>z(e.reached)&&(e.reached=t.boundary)}function j(e,t){e.accepted+=t.acceptedCritical,e.rejected+=t.rejectedCritical,e.pending+=t.pendingCritical,z(t.reachedBoundary)>z(e.reached)&&(e.reached=t.reachedBoundary),t.lastFailure!==void 0&&(e.lastFailure=t.lastFailure)}function M(t,n,r){if(t===a)return s();let i=n===`operational`?`none`:z(r.reached)>0?r.reached:`local-durable`;return e({mode:n,requiredBoundary:i,reachedBoundary:r.reached,complete:r.rejected===0&&r.pending===0&&z(r.reached)>=z(i),acceptedCritical:r.accepted,rejectedCritical:r.rejected,pendingCritical:r.pending,...r.lastFailure===void 0?{}:{lastFailure:r.lastFailure}})}function N(t,n){let r=Object.fromEntries(m.map(e=>[e,P()]));for(let e of t)F(r[e.kind],e.status??`unknown`);for(let e of n){F(r[`model-call`],e.status);for(let t of e.attempts)F(r[`provider-attempt`],t.status)}return e(Object.fromEntries(m.map(e=>[e,{...r[e]}])))}function P(){return{total:0,success:0,error:0,aborted:0,rejected:0,unknown:0}}function F(e,t){e.total++,e[t]++}function I(e){return{type:e.type,message:e.message,...e.code===void 0?{}:{code:e.code},...e.retryable===void 0?{}:{retryable:e.retryable},...e.status===void 0?{}:{status:e.status},...e.causeTypes===void 0?{}:{causeTypes:[...e.causeTypes]}}}function L(e){return e===`success`||e===`error`||e===`aborted`||e===`rejected`||e===`unknown`}function R(e,t){if(!Number.isSafeInteger(e)||e<1)throw RangeError(`${t} must be a positive safe integer`);return e}function z(e){return e===`remote-acknowledged`?2:+(e===`local-durable`)}export{T as RunLedger,_ as authoritativeTokenUsage,v as budgetTokenTotal,b as summarizeModelCallUsage};
|
|
2
|
+
//# sourceMappingURL=ledger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger.js","names":[],"sources":["../../../src/agent/accounting/ledger.ts"],"sourcesContent":["import { AgentSdkError } from '../../errors/index.ts'\nimport {\n NOOP_OBSERVATION_PORT, OBSERVATION_ERROR_CODES, createCoreSpan, createObservationRunScope,\n createOperationId, disabledDeliverySummary, hasUsageCounters, safeErrorRecord,\n snapshotObservationSpan, validateCaptureReceipt, validateUsageCounters, type CaptureReceipt,\n type CorrelationContext, type DeliveryMode, type ModelCallReport, type ModelInvocationContext,\n type ObservationBoundary, type ObservationDeliverySummary, type ObservationEvent,\n type ObservationEventName, type ObservationPort, type ObservationResource, type ObservationSpan,\n type OperationStatus, type SafeErrorRecord,\n} from '../../observation/index.ts'\nimport { SDK_VERSION, deepFreeze, type JsonObject } from '../../primitives/index.ts'\nimport { type GenerateOptions } from '../../contract/index.ts'\nimport { AGENT_ACCOUNTING_ERROR_CODES } from './error.ts'\nimport type {\n EndRunOperationInput, ModelCallPolicyDecision, RunAccountingPort, StartRunOperationInput,\n} from './contracts.ts'\nimport type {\n LegacyRunReport, RunLedgerLimits, RunOperationCounts, TrackedOperationKind, UsagePolicy,\n} from './report.ts'\nimport { aggregateUsage, missingCounters } from './usage.ts'\nimport { estimateUsage } from './estimate.ts'\nimport { accountingError } from './common.ts'\nimport { OPERATION_KINDS } from './config.ts'\nimport type { SdkLogger } from '../../logging/types.ts'\n\nconst OPERATION_EVENT: Readonly<Record<TrackedOperationKind, ObservationEventName>> = Object.freeze({\n turn: 'sdk.agent.turn',\n 'model-call': 'sdk.model.call',\n 'provider-attempt': 'sdk.provider.attempt',\n tool: 'sdk.tool.call',\n compaction: 'sdk.compaction',\n hook: 'sdk.hook.call',\n 'user-input': 'sdk.user.input.wait',\n skill: 'sdk.skill.operation',\n memory: 'sdk.memory.operation',\n credential: 'sdk.credential.operation',\n integration: 'sdk.integration.request',\n})\n\nconst OPERATION_SPAN: Readonly<Record<TrackedOperationKind, Parameters<ObservationPort['openSpan']>[0]['name']>> = Object.freeze({\n turn: 'sdk.agent.turn',\n 'model-call': 'sdk.model.call',\n 'provider-attempt': 'sdk.provider.attempt',\n tool: 'sdk.tool.call',\n compaction: 'sdk.compaction',\n hook: 'sdk.hook.call',\n 'user-input': 'sdk.user.input.wait',\n skill: 'sdk.skill.operation',\n memory: 'sdk.memory.operation',\n credential: 'sdk.credential.operation',\n integration: 'sdk.integration.request',\n})\n\ninterface ResolvedLimits {\n readonly maxModelCalls: number\n readonly maxAttemptsPerCall: number\n readonly maxToolCalls: number\n readonly maxSerializedBytes: number\n}\n\ninterface DeliveryTracker {\n accepted: number\n rejected: number\n pending: number\n reached: ObservationBoundary\n lastFailure?: SafeErrorRecord\n}\n\ninterface MutableOperation {\n readonly id: string\n readonly kind: TrackedOperationKind\n readonly span: ObservationSpan\n readonly startedAt: string\n readonly startedMonotonic: number\n readonly data: JsonObject\n status?: OperationStatus\n error?: SafeErrorRecord\n}\n\nexport interface RunLedgerOptions {\n readonly runId?: string\n readonly observation?: ObservationPort\n readonly resource?: ObservationResource\n readonly parent?: CorrelationContext\n readonly conversationId?: string\n readonly sessionId?: string\n readonly agentId: string\n readonly mode: string\n readonly maxTurns: number | 'auto'\n readonly usagePolicy?: UsagePolicy\n readonly cumulativeTokenBudget?: boolean\n readonly limits?: RunLedgerLimits\n readonly logger?: (correlation: CorrelationContext) => SdkLogger\n /** Contract tests throw immediately; production records health and finalizes unknown. */\n readonly defectMode?: 'production' | 'test'\n}\n\n/** Canonical append-only accounting state for one agent invocation. */\nexport class RunLedger implements RunAccountingPort {\n readonly runId: string\n readonly traceId: CorrelationContext['traceId']\n readonly modelInvocation: ModelInvocationContext\n readonly mode: DeliveryMode\n terminalAuditFailure = false\n private stoppedUsage: ModelCallPolicyDecision | undefined\n get usageStop(): ModelCallPolicyDecision | undefined { return this.stoppedUsage }\n\n private readonly port: ObservationPort\n private readonly resource: ObservationResource\n private readonly scope = createObservationRunScope()\n private readonly runSpan: ObservationSpan\n private readonly startedAt = new Date().toISOString()\n private readonly startedMonotonic = this.scope.monotonicMs()\n private readonly tracker: DeliveryTracker = { accepted: 0, rejected: 0, pending: 0, reached: 'none' }\n private readonly limits: ResolvedLimits\n private readonly usagePolicy: Required<Pick<UsagePolicy, 'onMissing' | 'estimateTimeoutMs'>> & Pick<UsagePolicy, 'estimator'>\n private readonly estimationClosed = new AbortController()\n private readonly cumulativeTokenBudget: boolean\n private readonly defectMode: 'production' | 'test'\n private readonly operations = new Map<string, MutableOperation>()\n private readonly modelCalls = new Map<string, ModelCallReport>()\n private readonly errors: SafeErrorRecord[] = []\n private serializedBytes = 0\n private toolCalls = 0\n private integrityUnknown = false\n private closed = false\n private finalReport: LegacyRunReport | undefined\n private finalizing: Promise<LegacyRunReport> | undefined\n\n constructor(options: RunLedgerOptions) {\n if (typeof options.agentId !== 'string' || options.agentId.trim().length === 0) {\n throw new TypeError('run ledger agentId must be non-empty')\n }\n if (options.maxTurns !== 'auto' && (!Number.isSafeInteger(options.maxTurns) || options.maxTurns < 1)) {\n throw new RangeError(\"run ledger maxTurns must be a positive safe integer or 'auto'\")\n }\n this.runId = options.runId ?? createOperationId()\n if (this.runId.length === 0) throw new TypeError('run ledger runId must be non-empty')\n this.port = options.observation ?? NOOP_OBSERVATION_PORT\n this.resource = deepFreeze(options.resource === undefined\n ? { sdkName: 'ai-agent-sdk', sdkVersion: SDK_VERSION, runtime: 'unknown' }\n : { ...options.resource })\n this.mode = observationMode(this.port, this.tracker)\n this.limits = resolveLimits(options.limits)\n this.usagePolicy = resolveUsagePolicy(options.usagePolicy)\n this.cumulativeTokenBudget = options.cumulativeTokenBudget ?? false\n this.defectMode = options.defectMode ?? 'production'\n this.runSpan = openSpan(this.port, {\n name: 'sdk.agent.run',\n runId: this.runId,\n ...(options.parent === undefined ? {} : { parent: options.parent }),\n correlation: {\n ...(options.conversationId === undefined ? {} : { conversationId: options.conversationId }),\n ...(options.sessionId === undefined ? {} : { sessionId: options.sessionId }),\n },\n startedAt: this.startedAt,\n monotonicMs: this.startedMonotonic,\n }, this.tracker)\n this.traceId = this.runSpan.correlation.traceId\n const logger = options.logger?.(this.runSpan.correlation)\n this.modelInvocation = Object.freeze({\n observation: this.port,\n correlation: this.runSpan.correlation,\n terminalCheckpointOwner: 'agent-run' as const,\n scope: this.scope,\n ...(logger === undefined ? {} : { logger }),\n })\n this.capture(this.event('sdk.agent.run', 'start', this.runSpan.correlation, {\n agentId: options.agentId,\n mode: options.mode,\n maxTurns: options.maxTurns,\n }))\n }\n\n startOperation(kind: TrackedOperationKind, input: StartRunOperationInput = {}): string {\n this.assertOpen('operation start')\n if (!OPERATION_KINDS.includes(kind)) throw new TypeError(`unknown tracked operation kind '${String(kind)}'`)\n const id = input.operationId ?? createOperationId()\n if (this.operations.has(id)) {\n this.defect(`duplicate ${kind} operation start '${id}'`)\n return id\n }\n if (kind === 'tool') {\n if (this.toolCalls >= this.limits.maxToolCalls) this.limit(`run exceeded ${this.limits.maxToolCalls} tool calls`)\n this.toolCalls++\n }\n const startedAt = new Date().toISOString()\n const startedMonotonic = this.scope.monotonicMs()\n const span = openSpan(this.port, {\n name: OPERATION_SPAN[kind],\n runId: this.runId,\n parent: this.runSpan.correlation,\n correlation: input.toolCallId === undefined ? {} : { toolCallId: input.toolCallId },\n startedAt,\n monotonicMs: startedMonotonic,\n }, this.tracker)\n const data = deepFreeze({ ...(input.data ?? {}) })\n this.charge({ id, kind, data })\n this.operations.set(id, { id, kind, span, startedAt, startedMonotonic, data })\n this.capture(this.event(OPERATION_EVENT[kind], 'start', span.correlation, data))\n return id\n }\n\n endOperation(operationId: string, status: OperationStatus, input: EndRunOperationInput = {}): void {\n const operation = this.operations.get(operationId)\n if (operation === undefined) {\n this.defect(`orphan operation terminal '${operationId}'`)\n return\n }\n if (operation.status !== undefined) {\n this.defect(`duplicate operation terminal '${operationId}'`)\n operation.status = 'unknown'\n return\n }\n if (!isOperationStatus(status)) throw new TypeError(`invalid operation status '${String(status)}'`)\n const endedAt = new Date().toISOString()\n const endedMonotonic = this.scope.monotonicMs()\n operation.status = status\n if (input.error !== undefined) operation.error = safeErrorRecord(input.error)\n operation.span.end(status, endedAt, endedMonotonic)\n if (operation.error !== undefined) this.errors.push(operation.error)\n const data = deepFreeze({\n ...(input.data ?? {}),\n status,\n durationMs: Math.max(0, endedMonotonic - operation.startedMonotonic),\n ...(operation.error === undefined ? {} : { error: errorData(operation.error) }),\n })\n this.charge(data)\n this.capture(this.event(OPERATION_EVENT[operation.kind], 'end', operation.span.correlation, data))\n }\n\n async recordModelCall(report: ModelCallReport, request: GenerateOptions): Promise<ModelCallPolicyDecision> {\n this.assertOpen('model-call usage')\n if (this.modelCalls.has(report.modelCallId)) {\n this.defect(`duplicate model-call terminal '${report.modelCallId}'`)\n const decision = Object.freeze({ report: this.modelCalls.get(report.modelCallId) ?? report, usageRequired: true, usageUnavailable: false })\n this.stoppedUsage ??= decision\n return decision\n }\n if (this.modelCalls.size >= this.limits.maxModelCalls) {\n this.limit(`run exceeded ${this.limits.maxModelCalls} logical model calls`)\n }\n if (report.attempts.length > this.limits.maxAttemptsPerCall) {\n this.limit(`model call '${report.modelCallId}' exceeded ${this.limits.maxAttemptsPerCall} attempts`)\n }\n\n // Reserve identity and retain provider evidence before calling user code.\n this.charge(report)\n this.modelCalls.set(report.modelCallId, report)\n mergeDelivery(this.tracker, report.delivery)\n const policyErrorIndex = this.errors.length\n if (report.error !== undefined) this.errors.push(report.error)\n for (const attempt of report.attempts) if (attempt.error !== undefined) this.errors.push(attempt.error)\n let accepted = report\n let usageRequired = false\n const incomplete = report.coverage === 'missing' || report.coverage === 'partial'\n if (incomplete && this.usagePolicy.onMissing === 'estimate') {\n try {\n const estimator = this.usagePolicy.estimator\n if (estimator === undefined) throw new TypeError('estimate usage policy requires an estimator')\n const raw = await estimateUsage(estimator, {\n runId: this.runId,\n modelCallId: report.modelCallId,\n provider: report.provider,\n model: report.model,\n request,\n report,\n }, this.estimationClosed.signal, this.usagePolicy.estimateTimeoutMs)\n if (this.closed) return { report, usageRequired: true, usageUnavailable: false }\n const validation = validateUsageCounters(raw)\n if (validation.invalidFields.length > 0 || validation.overflow || !hasUsageCounters(validation.reported)) {\n throw new TypeError('usage estimator returned invalid or empty counters')\n }\n const estimated = missingCounters(validation.reported, report.reported)\n if (!hasUsageCounters(estimated)) throw new TypeError('usage estimator did not cover a missing counter')\n accepted = deepFreeze({\n ...report,\n coverage: hasUsageCounters(report.reported) ? 'partial' as const : 'estimated' as const,\n estimated,\n authoritative: false,\n })\n } catch (estimatorError) {\n if (this.closed) return { report, usageRequired: true, usageUnavailable: false }\n usageRequired = true\n this.errors.splice(policyErrorIndex, 0, accountingError(\n 'usage estimation failed after a provider response',\n OBSERVATION_ERROR_CODES.USAGE_REQUIRED,\n estimatorError,\n ))\n }\n } else if (incomplete && this.usagePolicy.onMissing === 'fail') {\n usageRequired = true\n this.errors.splice(policyErrorIndex, 0, accountingError(\n 'provider usage is required by the configured run policy',\n OBSERVATION_ERROR_CODES.USAGE_REQUIRED,\n ))\n } else if (incomplete && report.error?.code !== OBSERVATION_ERROR_CODES.USAGE_MISSING) {\n this.errors.splice(policyErrorIndex, 0, accountingError(\n 'model call completed without authoritative provider usage',\n OBSERVATION_ERROR_CODES.USAGE_MISSING,\n ))\n }\n\n // Conservatively charge the added projection including its field names and\n // changed coverage, not just the counter values inside `estimated`.\n if (accepted !== report) this.charge({\n estimated: accepted.estimated, coverage: accepted.coverage, authoritative: false,\n })\n this.modelCalls.set(accepted.modelCallId, accepted)\n const decision = Object.freeze({\n report: accepted,\n usageRequired,\n usageUnavailable: !usageRequired\n && incomplete\n && this.usagePolicy.onMissing === 'warn'\n && this.cumulativeTokenBudget\n && accepted.possiblyBilledAttemptsWithoutUsage > 0,\n })\n if (decision.usageRequired || decision.usageUnavailable) this.stoppedUsage ??= decision\n return decision\n }\n\n recordError(error: unknown): void {\n this.errors.push(safeErrorRecord(error))\n }\n\n finalize(status: OperationStatus, completed: boolean, error?: unknown): Promise<LegacyRunReport> {\n if (this.finalReport !== undefined) return Promise.resolve(this.finalReport)\n if (this.finalizing !== undefined) return this.finalizing\n this.finalizing = this.finalizeOnce(status, completed, error)\n return this.finalizing\n }\n\n private async finalizeOnce(status: OperationStatus, completed: boolean, error?: unknown): Promise<LegacyRunReport> {\n this.closed = true\n this.estimationClosed.abort(new Error('run ledger closed'))\n if (error !== undefined) this.errors.push(safeErrorRecord(error))\n this.closeOpenOperations()\n const finalStatus: OperationStatus = this.integrityUnknown ? 'unknown' : status\n const endedAt = new Date().toISOString()\n const endedMonotonic = this.scope.monotonicMs()\n const durationMs = Math.max(0, endedMonotonic - this.startedMonotonic)\n const usage = aggregateUsage([...this.modelCalls.values()], this.errors)\n const operationCounts = operationCountsOf(this.operations.values(), this.modelCalls.values())\n this.runSpan.end(finalStatus, endedAt, endedMonotonic)\n const endEvent = this.event('sdk.agent.run', 'end', this.runSpan.correlation, {\n status: finalStatus,\n durationMs,\n completed,\n usage: usage as unknown as JsonObject,\n operationCounts: operationCounts as unknown as JsonObject,\n errorCount: this.errors.length,\n })\n if (this.mode === 'operational') this.capture(endEvent)\n else await this.checkpoint(endEvent)\n\n const delivery = deliverySummary(this.port, this.mode, this.tracker)\n const modelCalls = [...this.modelCalls.values()].map(report => deepFreeze({ ...report, delivery }))\n const final = deepFreeze<LegacyRunReport>({\n runId: this.runId,\n traceId: this.traceId,\n startedAt: this.startedAt,\n endedAt,\n durationMs,\n status: finalStatus,\n usage,\n modelCalls,\n operationCounts,\n errors: Object.freeze([...this.errors]),\n delivery,\n })\n this.finalReport = final\n return final\n }\n\n private closeOpenOperations(): void {\n for (const operation of this.operations.values()) {\n if (operation.status !== undefined) continue\n this.integrityUnknown = true\n const missing = accountingError(\n `${operation.kind} operation '${operation.id}' closed without a terminal event`,\n OBSERVATION_ERROR_CODES.OPERATION_TERMINAL_MISSING,\n )\n this.errors.push(missing)\n const endedAt = new Date().toISOString()\n const endedMonotonic = this.scope.monotonicMs()\n operation.status = 'unknown'\n operation.error = missing\n operation.span.end('unknown', endedAt, endedMonotonic)\n this.capture(this.event(OPERATION_EVENT[operation.kind], 'end', operation.span.correlation, {\n status: 'unknown',\n durationMs: Math.max(0, endedMonotonic - operation.startedMonotonic),\n error: errorData(missing),\n }))\n }\n }\n\n private event(\n name: ObservationEventName,\n phase: ObservationEvent['phase'],\n correlation: CorrelationContext,\n data: JsonObject,\n ): ObservationEvent {\n return deepFreeze({\n schemaVersion: 1 as const,\n eventId: createOperationId(),\n sequence: this.scope.nextSequence(),\n name,\n phase,\n occurredAt: new Date().toISOString(),\n monotonicMs: this.scope.monotonicMs(),\n priority: 'critical' as const,\n resource: this.resource,\n correlation,\n data,\n })\n }\n\n private capture(event: ObservationEvent): void {\n try {\n const receipt = validateCaptureReceipt(this.port.capture(event), event.eventId)\n applyReceipt(this.tracker, receipt)\n } catch (captureError) {\n this.tracker.rejected++\n this.tracker.lastFailure = safeErrorRecord(captureError)\n }\n }\n\n private async checkpoint(event: ObservationEvent): Promise<void> {\n this.tracker.pending++\n try {\n const raw = this.port.checkpoint === undefined\n ? { eventId: event.eventId, status: 'rejected' as const, durable: false, boundary: 'none' as const, reason: 'exporter-unavailable' as const }\n : await this.port.checkpoint(event)\n this.tracker.pending--\n const receipt = validateCaptureReceipt(raw, event.eventId)\n applyReceipt(this.tracker, receipt)\n if (receipt.status !== 'accepted' || !receipt.durable) {\n this.tracker.lastFailure = accountingError(\n `run terminal checkpoint was ${receipt.status}`,\n OBSERVATION_ERROR_CODES.CAPTURE_REJECTED,\n )\n this.terminalAuditFailure = this.mode === 'audit'\n }\n } catch (checkpointError) {\n this.tracker.pending--\n this.tracker.rejected++\n this.tracker.lastFailure = safeErrorRecord(checkpointError)\n this.terminalAuditFailure = this.mode === 'audit'\n }\n }\n\n private defect(message: string): void {\n const error = new AgentSdkError(message, AGENT_ACCOUNTING_ERROR_CODES.LEDGER_STATE_INVALID)\n if (this.defectMode === 'test') throw error\n this.integrityUnknown = true\n this.errors.push(safeErrorRecord(error))\n this.capture(this.event('sdk.observer.failure', 'point', this.runSpan.correlation, {\n observerId: 'agent-run-ledger',\n failureKind: 'state-machine',\n counter: this.errors.length,\n error: errorData(safeErrorRecord(error)),\n }))\n }\n\n private limit(message: string): never {\n throw new AgentSdkError(message, OBSERVATION_ERROR_CODES.LEDGER_LIMIT_EXCEEDED)\n }\n\n private assertOpen(action: string): void {\n if (!this.closed) return\n this.defect(`${action} occurred after run ledger closure`)\n throw new AgentSdkError(`${action} occurred after run ledger closure`, AGENT_ACCOUNTING_ERROR_CODES.LEDGER_STATE_INVALID)\n }\n\n private charge(value: unknown): void {\n let bytes: number\n try {\n const encoded = JSON.stringify(value)\n bytes = encoded === undefined ? 0 : new TextEncoder().encode(encoded).byteLength\n } catch {\n this.limit('run ledger state could not be represented as JSON')\n }\n if (this.serializedBytes + bytes > this.limits.maxSerializedBytes) {\n this.limit(`run ledger exceeded ${this.limits.maxSerializedBytes} serialized bytes`)\n }\n this.serializedBytes += bytes\n }\n}\n\nfunction resolveLimits(input: RunLedgerLimits | undefined): ResolvedLimits {\n return Object.freeze({\n maxModelCalls: positive(input?.maxModelCalls ?? 1_024, 'maxModelCalls'),\n maxAttemptsPerCall: positive(input?.maxAttemptsPerCall ?? 16, 'maxAttemptsPerCall'),\n maxToolCalls: positive(input?.maxToolCalls ?? 10_000, 'maxToolCalls'),\n maxSerializedBytes: positive(input?.maxSerializedBytes ?? 16 * 1024 * 1024, 'maxSerializedBytes'),\n })\n}\n\nfunction resolveUsagePolicy(input: UsagePolicy | undefined): RunLedger['usagePolicy'] {\n const onMissing = input?.onMissing ?? 'warn'\n if (!['warn', 'estimate', 'fail'].includes(onMissing)) throw new TypeError('usage policy onMissing is invalid')\n if (onMissing === 'estimate') {\n if (typeof input?.estimator?.id !== 'string' || input.estimator.id.trim().length === 0\n || typeof input.estimator.estimate !== 'function') {\n throw new TypeError('estimate usage policy requires an estimator with a non-empty id')\n }\n }\n const estimateTimeoutMs = positive(input?.estimateTimeoutMs ?? 30_000, 'estimateTimeoutMs')\n if (estimateTimeoutMs > 2_147_483_647) throw new RangeError('estimateTimeoutMs exceeds the timer range')\n return Object.freeze({ onMissing, estimateTimeoutMs, ...(input?.estimator === undefined ? {} : { estimator: input.estimator }) })\n}\n\nfunction observationMode(port: ObservationPort, tracker: DeliveryTracker): DeliveryMode {\n try {\n const mode = port.mode\n if (mode === 'operational' || mode === 'reliable' || mode === 'audit') return mode\n throw new TypeError('observation delivery mode is invalid')\n } catch (error) {\n tracker.lastFailure = safeErrorRecord(error)\n return 'operational'\n }\n}\n\nfunction openSpan(\n port: ObservationPort,\n input: Parameters<ObservationPort['openSpan']>[0],\n tracker: DeliveryTracker,\n): ObservationSpan {\n try {\n const candidate = snapshotObservationSpan(port.openSpan(input))\n if (candidate !== undefined && candidate.correlation.runId === input.runId) return candidate\n throw new TypeError('observation backend returned an invalid run span')\n } catch (error) {\n tracker.lastFailure = safeErrorRecord(error)\n return createCoreSpan(input)\n }\n}\n\nfunction applyReceipt(tracker: DeliveryTracker, receipt: CaptureReceipt): void {\n if (receipt.status === 'accepted') tracker.accepted++\n else tracker.rejected++\n if (receipt.status === 'accepted' && boundaryRank(receipt.boundary) > boundaryRank(tracker.reached)) {\n tracker.reached = receipt.boundary\n }\n}\n\nfunction mergeDelivery(tracker: DeliveryTracker, summary: ObservationDeliverySummary): void {\n tracker.accepted += summary.acceptedCritical\n tracker.rejected += summary.rejectedCritical\n tracker.pending += summary.pendingCritical\n if (boundaryRank(summary.reachedBoundary) > boundaryRank(tracker.reached)) tracker.reached = summary.reachedBoundary\n if (summary.lastFailure !== undefined) tracker.lastFailure = summary.lastFailure\n}\n\nfunction deliverySummary(port: ObservationPort, mode: DeliveryMode, tracker: DeliveryTracker): ObservationDeliverySummary {\n if (port === NOOP_OBSERVATION_PORT) return disabledDeliverySummary()\n const requiredBoundary: ObservationBoundary = mode === 'operational'\n ? 'none'\n : boundaryRank(tracker.reached) > 0 ? tracker.reached : 'local-durable'\n return deepFreeze({\n mode,\n requiredBoundary,\n reachedBoundary: tracker.reached,\n complete: tracker.rejected === 0 && tracker.pending === 0\n && boundaryRank(tracker.reached) >= boundaryRank(requiredBoundary),\n acceptedCritical: tracker.accepted,\n rejectedCritical: tracker.rejected,\n pendingCritical: tracker.pending,\n ...(tracker.lastFailure === undefined ? {} : { lastFailure: tracker.lastFailure }),\n })\n}\n\nfunction operationCountsOf(\n operations: Iterable<MutableOperation>,\n modelCalls: Iterable<ModelCallReport>,\n): Readonly<Record<TrackedOperationKind, RunOperationCounts>> {\n const counts = Object.fromEntries(OPERATION_KINDS.map(kind => [kind, emptyCounts()])) as Record<TrackedOperationKind, MutableCounts>\n for (const operation of operations) addStatus(counts[operation.kind], operation.status ?? 'unknown')\n for (const report of modelCalls) {\n addStatus(counts['model-call'], report.status)\n for (const attempt of report.attempts) addStatus(counts['provider-attempt'], attempt.status)\n }\n return deepFreeze(Object.fromEntries(OPERATION_KINDS.map(kind => [kind, { ...counts[kind] }])) as Record<TrackedOperationKind, RunOperationCounts>)\n}\n\ninterface MutableCounts { total: number; success: number; error: number; aborted: number; rejected: number; unknown: number }\nfunction emptyCounts(): MutableCounts { return { total: 0, success: 0, error: 0, aborted: 0, rejected: 0, unknown: 0 } }\nfunction addStatus(counts: MutableCounts, status: OperationStatus): void {\n counts.total++\n counts[status]++\n}\n\nfunction errorData(error: SafeErrorRecord): JsonObject {\n return {\n type: error.type,\n message: error.message,\n ...(error.code === undefined ? {} : { code: error.code }),\n ...(error.retryable === undefined ? {} : { retryable: error.retryable }),\n ...(error.status === undefined ? {} : { status: error.status }),\n ...(error.causeTypes === undefined ? {} : { causeTypes: [...error.causeTypes] }),\n }\n}\n\nfunction isOperationStatus(value: unknown): value is OperationStatus {\n return value === 'success' || value === 'error' || value === 'aborted' || value === 'rejected' || value === 'unknown'\n}\n\nfunction positive(value: number, label: string): number {\n if (!Number.isSafeInteger(value) || value < 1) throw new RangeError(`${label} must be a positive safe integer`)\n return value\n}\n\nfunction boundaryRank(boundary: ObservationBoundary): number {\n return boundary === 'remote-acknowledged' ? 2 : boundary === 'local-durable' ? 1 : 0\n}\n\nexport { summarizeModelCallUsage, authoritativeTokenUsage, budgetTokenTotal } from './usage.ts'\n"],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { TraceId } from "../../observation/context.js";
|
|
2
|
+
import { OperationStatus, SafeErrorRecord } from "../../observation/event.js";
|
|
3
|
+
import { ObservationDeliverySummary } from "../../observation/port.js";
|
|
4
|
+
import { UsageCounters } from "../../observation/usage.js";
|
|
5
|
+
import { ModelCallReport } from "../../observation/report.js";
|
|
6
|
+
import { GenerateOptions } from "../../contract/generate-options.js";
|
|
7
|
+
import { UsageCoverageSummary } from "../../support-safe/error.js";
|
|
8
|
+
//#region src/agent/accounting/report.d.ts
|
|
9
|
+
interface RunUsageReport {
|
|
10
|
+
readonly reported: UsageCounters;
|
|
11
|
+
readonly estimated?: UsageCounters;
|
|
12
|
+
/** Per-call reported/estimated contributions, summed before provenance is lost.
|
|
13
|
+
* A budget estimate/known subtotal, never a billing total; missing usage remains unknown. */
|
|
14
|
+
readonly budgetTokens?: number;
|
|
15
|
+
readonly coverage: UsageCoverageSummary;
|
|
16
|
+
readonly authoritative: boolean;
|
|
17
|
+
}
|
|
18
|
+
interface RunOperationCounts {
|
|
19
|
+
readonly total: number;
|
|
20
|
+
readonly success: number;
|
|
21
|
+
readonly error: number;
|
|
22
|
+
readonly aborted: number;
|
|
23
|
+
readonly rejected: number;
|
|
24
|
+
readonly unknown: number;
|
|
25
|
+
}
|
|
26
|
+
type TrackedOperationKind = 'turn' | 'model-call' | 'provider-attempt' | 'tool' | 'compaction' | 'hook' | 'user-input' | 'skill' | 'memory' | 'credential' | 'integration';
|
|
27
|
+
/** Internal ledger result before the terminal record receives its delivery summary. */
|
|
28
|
+
interface LegacyRunReport {
|
|
29
|
+
readonly runId: string;
|
|
30
|
+
readonly traceId: TraceId;
|
|
31
|
+
readonly startedAt: string;
|
|
32
|
+
readonly endedAt: string;
|
|
33
|
+
readonly durationMs: number;
|
|
34
|
+
readonly status: OperationStatus;
|
|
35
|
+
readonly usage: RunUsageReport;
|
|
36
|
+
readonly modelCalls: readonly ModelCallReport[];
|
|
37
|
+
readonly operationCounts: Readonly<Record<TrackedOperationKind, RunOperationCounts>>;
|
|
38
|
+
readonly errors: readonly SafeErrorRecord[];
|
|
39
|
+
readonly delivery: ObservationDeliverySummary;
|
|
40
|
+
}
|
|
41
|
+
interface UsagePolicy {
|
|
42
|
+
readonly onMissing?: 'warn' | 'estimate' | 'fail';
|
|
43
|
+
readonly estimator?: UsageEstimator;
|
|
44
|
+
/** Separate post-response deadline, defaults to 30,000ms. Cancellation wins. */
|
|
45
|
+
readonly estimateTimeoutMs?: number;
|
|
46
|
+
}
|
|
47
|
+
interface UsageEstimator {
|
|
48
|
+
readonly id: string;
|
|
49
|
+
readonly estimate: (input: UsageEstimationInput) => UsageCounters | Promise<UsageCounters>;
|
|
50
|
+
}
|
|
51
|
+
/** Local-only estimator input. It is never retained in the ledger or exported. */
|
|
52
|
+
interface UsageEstimationInput {
|
|
53
|
+
/** Aborted on caller cancellation, ledger closure, or the estimation deadline. */
|
|
54
|
+
readonly signal: AbortSignal;
|
|
55
|
+
readonly runId: string;
|
|
56
|
+
readonly modelCallId: string;
|
|
57
|
+
readonly provider: string;
|
|
58
|
+
readonly model: string;
|
|
59
|
+
readonly request: GenerateOptions;
|
|
60
|
+
readonly report: ModelCallReport;
|
|
61
|
+
}
|
|
62
|
+
interface RunLedgerLimits {
|
|
63
|
+
readonly maxModelCalls?: number;
|
|
64
|
+
readonly maxAttemptsPerCall?: number;
|
|
65
|
+
readonly maxToolCalls?: number;
|
|
66
|
+
readonly maxSerializedBytes?: number;
|
|
67
|
+
}
|
|
68
|
+
//#endregion
|
|
69
|
+
export { LegacyRunReport, RunLedgerLimits, RunOperationCounts, RunUsageReport, TrackedOperationKind, type UsageCoverageSummary, UsageEstimationInput, UsageEstimator, UsagePolicy };
|
|
70
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","names":[],"sources":["../../../src/agent/accounting/report.ts"],"mappings":";;;;;;;;UASiB;WACN,UAAU;WACV,YAAY;;;WAGZ;WACA,UAAU;WACV;;UAGM;WACN;WACA;WACA;WACA;WACA;WACA;;KAGC;;UAcK;WACN;WACA,SAAS;WACT;WACA;WACA;WACA,QAAQ;WACR,OAAO;WACP,qBAAqB;WACrB,iBAAiB,SAAS,OAAO,sBAAsB;WACvD,iBAAiB;WACjB,UAAU;;UAGJ;WACN;WACA,YAAY;;WAEZ;;UAGM;WACN;WACA,WAAW,OAAO,yBAAyB,gBAAgB,QAAQ;;;UAI7D;;WAEN,QAAQ;WACR;WACA;WACA;WACA;WACA,SAAS;WACT,QAAQ;;UAGF;WACN;WACA;WACA;WACA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { TokenUsage } from "../../stream/chunk.js";
|
|
2
|
+
import { ModelCallReport } from "../../observation/report.js";
|
|
3
|
+
import { RunUsageReport } from "./report.js";
|
|
4
|
+
//#region src/agent/accounting/usage.d.ts
|
|
5
|
+
/** Deterministic public projection used by turn outcomes and the canonical ledger. */
|
|
6
|
+
declare function summarizeModelCallUsage(reports: readonly ModelCallReport[]): RunUsageReport;
|
|
7
|
+
/** Legacy exact usage exists only when every logical call is authoritative. */
|
|
8
|
+
declare function authoritativeTokenUsage(report: RunUsageReport): TokenUsage | undefined;
|
|
9
|
+
/** Budget projection: reported buckets plus estimates only where reporting is absent. */
|
|
10
|
+
declare function budgetTokenTotal(report: Pick<RunUsageReport, 'reported' | 'estimated' | 'authoritative' | 'budgetTokens'>): number | undefined;
|
|
11
|
+
//#endregion
|
|
12
|
+
export { authoritativeTokenUsage, budgetTokenTotal, summarizeModelCallUsage };
|
|
13
|
+
//# sourceMappingURL=usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.d.ts","names":[],"sources":["../../../src/agent/accounting/usage.ts"],"mappings":";;;;;iBA8EgB,wBAAwB,kBAAkB,oBAAoB;;iBAK9D,wBAAwB,QAAQ,iBAAiB;;iBAgBjD,iBAAiB,QAAQ,KAAK"}
|