apex-code 0.0.1-alpha.0 → 0.0.1-alpha.2
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/CHANGELOG.md +24 -0
- package/README.md +66 -681
- package/dist/cli/args.d.ts +5 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +45 -6
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/auth-command.d.ts.map +1 -1
- package/dist/cli/auth-command.js +3 -3
- package/dist/cli/auth-command.js.map +1 -1
- package/dist/cli/cost-command.d.ts +19 -0
- package/dist/cli/cost-command.d.ts.map +1 -0
- package/dist/cli/cost-command.js +107 -0
- package/dist/cli/cost-command.js.map +1 -0
- package/dist/cli/startup-ui.d.ts +1 -1
- package/dist/cli/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js +1 -2
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +45 -16
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +2 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +14 -7
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +2 -0
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +9 -0
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +30 -4
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +46 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +137 -19
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +6 -6
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +1 -1
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/context/deferred-schemas.d.ts +92 -0
- package/dist/core/context/deferred-schemas.d.ts.map +1 -0
- package/dist/core/context/deferred-schemas.js +74 -0
- package/dist/core/context/deferred-schemas.js.map +1 -0
- package/dist/core/context/eviction.d.ts +47 -0
- package/dist/core/context/eviction.d.ts.map +1 -0
- package/dist/core/context/eviction.js +83 -0
- package/dist/core/context/eviction.js.map +1 -0
- package/dist/core/context/pipeline.d.ts +90 -0
- package/dist/core/context/pipeline.d.ts.map +1 -0
- package/dist/core/context/pipeline.js +109 -0
- package/dist/core/context/pipeline.js.map +1 -0
- package/dist/core/credential-failover.d.ts +30 -0
- package/dist/core/credential-failover.d.ts.map +1 -0
- package/dist/core/credential-failover.js +46 -0
- package/dist/core/credential-failover.js.map +1 -0
- package/dist/core/credential-pool.d.ts +60 -0
- package/dist/core/credential-pool.d.ts.map +1 -0
- package/dist/core/credential-pool.js +84 -0
- package/dist/core/credential-pool.js.map +1 -0
- package/dist/core/delegation/agents.d.ts +15 -0
- package/dist/core/delegation/agents.d.ts.map +1 -0
- package/dist/core/delegation/agents.js +55 -0
- package/dist/core/delegation/agents.js.map +1 -0
- package/dist/core/delegation/ceiling.d.ts +29 -0
- package/dist/core/delegation/ceiling.d.ts.map +1 -0
- package/dist/core/delegation/ceiling.js +34 -0
- package/dist/core/delegation/ceiling.js.map +1 -0
- package/dist/core/delegation/runtime.d.ts +94 -0
- package/dist/core/delegation/runtime.d.ts.map +1 -0
- package/dist/core/delegation/runtime.js +117 -0
- package/dist/core/delegation/runtime.js.map +1 -0
- package/dist/core/durable-state/daemon.d.ts +37 -0
- package/dist/core/durable-state/daemon.d.ts.map +1 -0
- package/dist/core/durable-state/daemon.js +62 -0
- package/dist/core/durable-state/daemon.js.map +1 -0
- package/dist/core/durable-state/provenance.d.ts +7 -0
- package/dist/core/durable-state/provenance.d.ts.map +1 -0
- package/dist/core/durable-state/provenance.js +24 -0
- package/dist/core/durable-state/provenance.js.map +1 -0
- package/dist/core/durable-state/sqlite.d.ts +84 -0
- package/dist/core/durable-state/sqlite.d.ts.map +1 -0
- package/dist/core/durable-state/sqlite.js +331 -0
- package/dist/core/durable-state/sqlite.js.map +1 -0
- package/dist/core/environment.d.ts +12 -0
- package/dist/core/environment.d.ts.map +1 -0
- package/dist/core/environment.js +69 -0
- package/dist/core/environment.js.map +1 -0
- package/dist/core/evidence-policy.d.ts +17 -0
- package/dist/core/evidence-policy.d.ts.map +1 -0
- package/dist/core/evidence-policy.js +25 -0
- package/dist/core/evidence-policy.js.map +1 -0
- package/dist/core/evidence.d.ts +16 -0
- package/dist/core/evidence.d.ts.map +1 -0
- package/dist/core/evidence.js +51 -0
- package/dist/core/evidence.js.map +1 -0
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/experimental.js +2 -1
- package/dist/core/experimental.js.map +1 -1
- package/dist/core/extensions/types.d.ts +2 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/model-config.d.ts +8 -0
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +21 -5
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-resolver.d.ts +20 -0
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +59 -0
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts +73 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +225 -8
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/observability/aggregate.d.ts +21 -0
- package/dist/core/observability/aggregate.d.ts.map +1 -0
- package/dist/core/observability/aggregate.js +36 -0
- package/dist/core/observability/aggregate.js.map +1 -0
- package/dist/core/observability/otlp.d.ts +66 -0
- package/dist/core/observability/otlp.d.ts.map +1 -0
- package/dist/core/observability/otlp.js +95 -0
- package/dist/core/observability/otlp.js.map +1 -0
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +3 -2
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/permissions/gate.d.ts +35 -0
- package/dist/core/permissions/gate.d.ts.map +1 -0
- package/dist/core/permissions/gate.js +72 -0
- package/dist/core/permissions/gate.js.map +1 -0
- package/dist/core/permissions/modes.d.ts +18 -0
- package/dist/core/permissions/modes.d.ts.map +1 -0
- package/dist/core/permissions/modes.js +57 -0
- package/dist/core/permissions/modes.js.map +1 -0
- package/dist/core/permissions/responder.d.ts +30 -0
- package/dist/core/permissions/responder.d.ts.map +1 -0
- package/dist/core/permissions/responder.js +32 -0
- package/dist/core/permissions/responder.js.map +1 -0
- package/dist/core/permissions/rules.d.ts +34 -0
- package/dist/core/permissions/rules.d.ts.map +1 -0
- package/dist/core/permissions/rules.js +74 -0
- package/dist/core/permissions/rules.js.map +1 -0
- package/dist/core/permissions/startup.d.ts +33 -0
- package/dist/core/permissions/startup.d.ts.map +1 -0
- package/dist/core/permissions/startup.js +55 -0
- package/dist/core/permissions/startup.js.map +1 -0
- package/dist/core/permissions/store.d.ts +114 -0
- package/dist/core/permissions/store.d.ts.map +1 -0
- package/dist/core/permissions/store.js +229 -0
- package/dist/core/permissions/store.js.map +1 -0
- package/dist/core/project-trust.d.ts.map +1 -1
- package/dist/core/project-trust.js +1 -1
- package/dist/core/project-trust.js.map +1 -1
- package/dist/core/provider-attribution.d.ts.map +1 -1
- package/dist/core/provider-attribution.js +6 -7
- package/dist/core/provider-attribution.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts +2 -2
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +20 -16
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/sandbox/child-entry.d.ts +2 -0
- package/dist/core/sandbox/child-entry.d.ts.map +1 -0
- package/dist/core/sandbox/child-entry.js +11 -0
- package/dist/core/sandbox/child-entry.js.map +1 -0
- package/dist/core/sandbox/cli-launch.d.ts +27 -0
- package/dist/core/sandbox/cli-launch.d.ts.map +1 -0
- package/dist/core/sandbox/cli-launch.js +133 -0
- package/dist/core/sandbox/cli-launch.js.map +1 -0
- package/dist/core/sandbox/cli-supervisor.d.ts +25 -0
- package/dist/core/sandbox/cli-supervisor.d.ts.map +1 -0
- package/dist/core/sandbox/cli-supervisor.js +57 -0
- package/dist/core/sandbox/cli-supervisor.js.map +1 -0
- package/dist/core/sandbox/linux-backend.d.ts +18 -0
- package/dist/core/sandbox/linux-backend.d.ts.map +1 -0
- package/dist/core/sandbox/linux-backend.js +186 -0
- package/dist/core/sandbox/linux-backend.js.map +1 -0
- package/dist/core/sandbox/macos-backend.d.ts +18 -0
- package/dist/core/sandbox/macos-backend.d.ts.map +1 -0
- package/dist/core/sandbox/macos-backend.js +195 -0
- package/dist/core/sandbox/macos-backend.js.map +1 -0
- package/dist/core/sandbox/network-proxy.d.ts +19 -0
- package/dist/core/sandbox/network-proxy.d.ts.map +1 -0
- package/dist/core/sandbox/network-proxy.js +79 -0
- package/dist/core/sandbox/network-proxy.js.map +1 -0
- package/dist/core/sandbox/policy.d.ts +32 -0
- package/dist/core/sandbox/policy.d.ts.map +1 -0
- package/dist/core/sandbox/policy.js +38 -0
- package/dist/core/sandbox/policy.js.map +1 -0
- package/dist/core/sandbox/supervisor.d.ts +31 -0
- package/dist/core/sandbox/supervisor.d.ts.map +1 -0
- package/dist/core/sandbox/supervisor.js +18 -0
- package/dist/core/sandbox/supervisor.js.map +1 -0
- package/dist/core/sandbox/violations.d.ts +23 -0
- package/dist/core/sandbox/violations.d.ts.map +1 -0
- package/dist/core/sandbox/violations.js +30 -0
- package/dist/core/sandbox/violations.js.map +1 -0
- package/dist/core/sdk.d.ts +20 -36
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +129 -2
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +41 -2
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +57 -0
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-share.d.ts +16 -0
- package/dist/core/session-share.d.ts.map +1 -0
- package/dist/core/session-share.js +22 -0
- package/dist/core/session-share.js.map +1 -0
- package/dist/core/settings-manager.d.ts +38 -9
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +39 -24
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +5 -5
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/timings.d.ts +1 -1
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js +3 -2
- package/dist/core/timings.js.map +1 -1
- package/dist/core/tools/ask-user.d.ts +25 -0
- package/dist/core/tools/ask-user.d.ts.map +1 -0
- package/dist/core/tools/ask-user.js +49 -0
- package/dist/core/tools/ask-user.js.map +1 -0
- package/dist/core/tools/bash-command-segments.d.ts +22 -0
- package/dist/core/tools/bash-command-segments.d.ts.map +1 -0
- package/dist/core/tools/bash-command-segments.js +128 -0
- package/dist/core/tools/bash-command-segments.js.map +1 -0
- package/dist/core/tools/bash.d.ts +26 -3
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +105 -16
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/contract.d.ts +156 -0
- package/dist/core/tools/contract.d.ts.map +1 -0
- package/dist/core/tools/contract.js +48 -0
- package/dist/core/tools/contract.js.map +1 -0
- package/dist/core/tools/delegate.d.ts +38 -0
- package/dist/core/tools/delegate.d.ts.map +1 -0
- package/dist/core/tools/delegate.js +66 -0
- package/dist/core/tools/delegate.js.map +1 -0
- package/dist/core/tools/edit.d.ts +2 -2
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +24 -0
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts +2 -2
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +12 -0
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +2 -2
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +12 -0
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +29 -4
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +118 -2
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts +2 -2
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +12 -0
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +1 -1
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/path-permission.d.ts +18 -0
- package/dist/core/tools/path-permission.d.ts.map +1 -0
- package/dist/core/tools/path-permission.js +28 -0
- package/dist/core/tools/path-permission.js.map +1 -0
- package/dist/core/tools/plan-present.d.ts +27 -0
- package/dist/core/tools/plan-present.d.ts.map +1 -0
- package/dist/core/tools/plan-present.js +55 -0
- package/dist/core/tools/plan-present.js.map +1 -0
- package/dist/core/tools/read.d.ts +2 -2
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +12 -0
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/test.d.ts +34 -0
- package/dist/core/tools/test.d.ts.map +1 -0
- package/dist/core/tools/test.js +75 -0
- package/dist/core/tools/test.js.map +1 -0
- package/dist/core/tools/todo-write.d.ts +31 -0
- package/dist/core/tools/todo-write.d.ts.map +1 -0
- package/dist/core/tools/todo-write.js +51 -0
- package/dist/core/tools/todo-write.js.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts +13 -2
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js +11 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/tools/tool-schema.d.ts +22 -0
- package/dist/core/tools/tool-schema.d.ts.map +1 -0
- package/dist/core/tools/tool-schema.js +45 -0
- package/dist/core/tools/tool-schema.js.map +1 -0
- package/dist/core/tools/web-fetch.d.ts +26 -0
- package/dist/core/tools/web-fetch.d.ts.map +1 -0
- package/dist/core/tools/web-fetch.js +62 -0
- package/dist/core/tools/web-fetch.js.map +1 -0
- package/dist/core/tools/web-search.d.ts +26 -0
- package/dist/core/tools/web-search.d.ts.map +1 -0
- package/dist/core/tools/web-search.js +53 -0
- package/dist/core/tools/web-search.js.map +1 -0
- package/dist/core/tools/write.d.ts +6 -2
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +32 -1
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/usage-performance-store.d.ts +56 -0
- package/dist/core/usage-performance-store.d.ts.map +1 -0
- package/dist/core/usage-performance-store.js +85 -0
- package/dist/core/usage-performance-store.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +48 -6
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +2 -2
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +9 -6
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts +1 -4
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.js +11 -39
- package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +8 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +49 -20
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +2 -2
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +6 -6
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +2 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/external-editor.d.ts.map +1 -1
- package/dist/modes/interactive/external-editor.js +58 -9
- package/dist/modes/interactive/external-editor.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +2 -3
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +92 -104
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.json +2 -2
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +15 -10
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/rpc-entry.d.ts.map +1 -1
- package/dist/rpc-entry.js +2 -1
- package/dist/rpc-entry.js.map +1 -1
- package/dist/server/create-harness.d.ts +1 -1
- package/dist/server/create-harness.d.ts.map +1 -1
- package/dist/server/create-harness.js +6 -5
- package/dist/server/create-harness.js.map +1 -1
- package/dist/testing/replay/metrics.d.ts +24 -0
- package/dist/testing/replay/metrics.d.ts.map +1 -0
- package/dist/testing/replay/metrics.js +35 -0
- package/dist/testing/replay/metrics.js.map +1 -0
- package/dist/testing/replay/recorded-provider.d.ts +10 -0
- package/dist/testing/replay/recorded-provider.d.ts.map +1 -0
- package/dist/testing/replay/recorded-provider.js +108 -0
- package/dist/testing/replay/recorded-provider.js.map +1 -0
- package/dist/testing/replay/runner.d.ts +56 -0
- package/dist/testing/replay/runner.d.ts.map +1 -0
- package/dist/testing/replay/runner.js +406 -0
- package/dist/testing/replay/runner.js.map +1 -0
- package/dist/utils/apex-code-user-agent.d.ts +2 -0
- package/dist/utils/apex-code-user-agent.d.ts.map +1 -0
- package/dist/utils/apex-code-user-agent.js +5 -0
- package/dist/utils/apex-code-user-agent.js.map +1 -0
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js +1 -1
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/tools-manager.d.ts +32 -0
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +198 -100
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/version-check.d.ts +5 -5
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +23 -14
- package/dist/utils/version-check.js.map +1 -1
- package/dist/utils/windows-self-update.d.ts.map +1 -1
- package/dist/utils/windows-self-update.js +1 -1
- package/dist/utils/windows-self-update.js.map +1 -1
- package/docs/compaction.md +21 -21
- package/docs/containerization.md +24 -21
- package/docs/custom-provider.md +9 -9
- package/docs/development.md +11 -11
- package/docs/environment-variables.md +36 -77
- package/docs/extensions.md +47 -47
- package/docs/index.md +12 -24
- package/docs/json.md +6 -6
- package/docs/keybindings.md +3 -3
- package/docs/llama-cpp.md +7 -7
- package/docs/models.md +11 -11
- package/docs/packages.md +46 -42
- package/docs/prompt-templates.md +3 -3
- package/docs/providers.md +10 -10
- package/docs/quickstart.md +49 -32
- package/docs/rpc.md +11 -11
- package/docs/sdk.md +4 -4
- package/docs/security.md +18 -18
- package/docs/session-format.md +9 -9
- package/docs/sessions.md +13 -13
- package/docs/settings.md +10 -14
- package/docs/shell-aliases.md +1 -1
- package/docs/skills.md +8 -8
- package/docs/terminal-setup.md +12 -12
- package/docs/termux.md +4 -4
- package/docs/themes.md +8 -8
- package/docs/tmux.md +4 -4
- package/docs/tui.md +3 -3
- package/docs/usage.md +54 -51
- package/docs/windows.md +1 -1
- package/npm-shrinkwrap.json +5 -5
- package/package.json +2 -3
- package/dist/core/telemetry.d.ts +0 -3
- package/dist/core/telemetry.d.ts.map +0 -1
- package/dist/core/telemetry.js +0 -9
- package/dist/core/telemetry.js.map +0 -1
- package/dist/utils/pi-user-agent.d.ts +0 -2
- package/dist/utils/pi-user-agent.d.ts.map +0 -1
- package/dist/utils/pi-user-agent.js +0 -5
- package/dist/utils/pi-user-agent.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../../../src/core/observability/aggregate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAE5E,MAAM,MAAM,uBAAuB,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEnE,MAAM,WAAW,iBAAiB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAWD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACxC,OAAO,EAAE,SAAS,sBAAsB,EAAE,EAC1C,SAAS,EAAE,uBAAuB,EAClC,KAAK,GAAE,mBAAwB,GAC7B,iBAAiB,EAAE,CAkBrB","sourcesContent":["import type { UsagePerformanceSample } from \"../usage-performance-store.ts\";\n\nexport type UsageAggregateDimension = \"model\" | \"session\" | \"role\";\n\nexport interface UsageAggregateRow {\n\tkey: string;\n\tcost: number;\n\tsampleCount: number;\n\tttftMsTotal: number;\n\tgenerationMsTotal: number;\n}\n\nexport interface UsageAggregateRange {\n\tsinceMs?: number;\n\tuntilMs?: number;\n}\n\nconst UNKNOWN_SESSION_KEY = \"(unknown session)\";\nconst NO_ROLE_KEY = \"(no role)\";\n\nfunction keyFor(sample: UsagePerformanceSample, dimension: UsageAggregateDimension): string {\n\tif (dimension === \"model\") return `${sample.provider}/${sample.model}`;\n\tif (dimension === \"session\") return sample.sessionId ?? UNKNOWN_SESSION_KEY;\n\treturn sample.role ?? NO_ROLE_KEY;\n}\n\n/**\n * Groups durable usage/cost samples by model, session, or role over an optional\n * time range. The one query surface both `apex-code cost` (roadmap Phase 8) and\n * the ledger-vs-`getUsageCostBreakdown` reconciliation gate read, so the two never\n * compute cost through independently-drifting logic.\n */\nexport function aggregateUsagePerformance(\n\tsamples: readonly UsagePerformanceSample[],\n\tdimension: UsageAggregateDimension,\n\trange: UsageAggregateRange = {},\n): UsageAggregateRow[] {\n\tconst rows = new Map<string, UsageAggregateRow>();\n\tfor (const sample of samples) {\n\t\tif (range.sinceMs !== undefined && sample.timestamp < range.sinceMs) continue;\n\t\tif (range.untilMs !== undefined && sample.timestamp > range.untilMs) continue;\n\n\t\tconst key = keyFor(sample, dimension);\n\t\tlet row = rows.get(key);\n\t\tif (!row) {\n\t\t\trow = { key, cost: 0, sampleCount: 0, ttftMsTotal: 0, generationMsTotal: 0 };\n\t\t\trows.set(key, row);\n\t\t}\n\t\trow.cost += sample.cost ?? 0;\n\t\trow.sampleCount += 1;\n\t\trow.ttftMsTotal += sample.ttftMs;\n\t\trow.generationMsTotal += sample.generationMs;\n\t}\n\treturn Array.from(rows.values()).sort((a, b) => a.key.localeCompare(b.key));\n}\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const UNKNOWN_SESSION_KEY = "(unknown session)";
|
|
2
|
+
const NO_ROLE_KEY = "(no role)";
|
|
3
|
+
function keyFor(sample, dimension) {
|
|
4
|
+
if (dimension === "model")
|
|
5
|
+
return `${sample.provider}/${sample.model}`;
|
|
6
|
+
if (dimension === "session")
|
|
7
|
+
return sample.sessionId ?? UNKNOWN_SESSION_KEY;
|
|
8
|
+
return sample.role ?? NO_ROLE_KEY;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Groups durable usage/cost samples by model, session, or role over an optional
|
|
12
|
+
* time range. The one query surface both `apex-code cost` (roadmap Phase 8) and
|
|
13
|
+
* the ledger-vs-`getUsageCostBreakdown` reconciliation gate read, so the two never
|
|
14
|
+
* compute cost through independently-drifting logic.
|
|
15
|
+
*/
|
|
16
|
+
export function aggregateUsagePerformance(samples, dimension, range = {}) {
|
|
17
|
+
const rows = new Map();
|
|
18
|
+
for (const sample of samples) {
|
|
19
|
+
if (range.sinceMs !== undefined && sample.timestamp < range.sinceMs)
|
|
20
|
+
continue;
|
|
21
|
+
if (range.untilMs !== undefined && sample.timestamp > range.untilMs)
|
|
22
|
+
continue;
|
|
23
|
+
const key = keyFor(sample, dimension);
|
|
24
|
+
let row = rows.get(key);
|
|
25
|
+
if (!row) {
|
|
26
|
+
row = { key, cost: 0, sampleCount: 0, ttftMsTotal: 0, generationMsTotal: 0 };
|
|
27
|
+
rows.set(key, row);
|
|
28
|
+
}
|
|
29
|
+
row.cost += sample.cost ?? 0;
|
|
30
|
+
row.sampleCount += 1;
|
|
31
|
+
row.ttftMsTotal += sample.ttftMs;
|
|
32
|
+
row.generationMsTotal += sample.generationMs;
|
|
33
|
+
}
|
|
34
|
+
return Array.from(rows.values()).sort((a, b) => a.key.localeCompare(b.key));
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=aggregate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../../src/core/observability/aggregate.ts"],"names":[],"mappings":"AAiBA,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AAChD,MAAM,WAAW,GAAG,WAAW,CAAC;AAEhC,SAAS,MAAM,CAAC,MAA8B,EAAE,SAAkC,EAAU;IAC3F,IAAI,SAAS,KAAK,OAAO;QAAE,OAAO,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;IACvE,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,SAAS,IAAI,mBAAmB,CAAC;IAC5E,OAAO,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC;AAAA,CAClC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CACxC,OAA0C,EAC1C,SAAkC,EAClC,KAAK,GAAwB,EAAE,EACT;IACtB,MAAM,IAAI,GAAG,IAAI,GAAG,EAA6B,CAAC;IAClD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,OAAO;YAAE,SAAS;QAC9E,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,OAAO;YAAE,SAAS;QAE9E,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACtC,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,EAAE,CAAC;YACV,GAAG,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;YAC7E,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACpB,CAAC;QACD,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;QAC7B,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC;QACrB,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC;QACjC,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAC,YAAY,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAAA,CAC5E","sourcesContent":["import type { UsagePerformanceSample } from \"../usage-performance-store.ts\";\n\nexport type UsageAggregateDimension = \"model\" | \"session\" | \"role\";\n\nexport interface UsageAggregateRow {\n\tkey: string;\n\tcost: number;\n\tsampleCount: number;\n\tttftMsTotal: number;\n\tgenerationMsTotal: number;\n}\n\nexport interface UsageAggregateRange {\n\tsinceMs?: number;\n\tuntilMs?: number;\n}\n\nconst UNKNOWN_SESSION_KEY = \"(unknown session)\";\nconst NO_ROLE_KEY = \"(no role)\";\n\nfunction keyFor(sample: UsagePerformanceSample, dimension: UsageAggregateDimension): string {\n\tif (dimension === \"model\") return `${sample.provider}/${sample.model}`;\n\tif (dimension === \"session\") return sample.sessionId ?? UNKNOWN_SESSION_KEY;\n\treturn sample.role ?? NO_ROLE_KEY;\n}\n\n/**\n * Groups durable usage/cost samples by model, session, or role over an optional\n * time range. The one query surface both `apex-code cost` (roadmap Phase 8) and\n * the ledger-vs-`getUsageCostBreakdown` reconciliation gate read, so the two never\n * compute cost through independently-drifting logic.\n */\nexport function aggregateUsagePerformance(\n\tsamples: readonly UsagePerformanceSample[],\n\tdimension: UsageAggregateDimension,\n\trange: UsageAggregateRange = {},\n): UsageAggregateRow[] {\n\tconst rows = new Map<string, UsageAggregateRow>();\n\tfor (const sample of samples) {\n\t\tif (range.sinceMs !== undefined && sample.timestamp < range.sinceMs) continue;\n\t\tif (range.untilMs !== undefined && sample.timestamp > range.untilMs) continue;\n\n\t\tconst key = keyFor(sample, dimension);\n\t\tlet row = rows.get(key);\n\t\tif (!row) {\n\t\t\trow = { key, cost: 0, sampleCount: 0, ttftMsTotal: 0, generationMsTotal: 0 };\n\t\t\trows.set(key, row);\n\t\t}\n\t\trow.cost += sample.cost ?? 0;\n\t\trow.sampleCount += 1;\n\t\trow.ttftMsTotal += sample.ttftMs;\n\t\trow.generationMsTotal += sample.generationMs;\n\t}\n\treturn Array.from(rows.values()).sort((a, b) => a.key.localeCompare(b.key));\n}\n"]}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { UsagePerformanceSample } from "../usage-performance-store.ts";
|
|
2
|
+
/**
|
|
3
|
+
* User-directed OTLP trace export (roadmap Phase 8, ADR 0012). Uses global
|
|
4
|
+
* `fetch` deliberately, not a direct undici import: `http-dispatcher.ts` already
|
|
5
|
+
* binds it to a proxy-aware, timeout-configured dispatcher, and a second HTTP
|
|
6
|
+
* client here would silently bypass a user's HTTP_PROXY.
|
|
7
|
+
*
|
|
8
|
+
* Scope note (recorded in the Phase 8 plan): this emits one span per model
|
|
9
|
+
* request attempt -- the same unit `SqliteUsagePerformanceStore` already
|
|
10
|
+
* records -- not a full turn/tool-call span tree. That would require touching
|
|
11
|
+
* `agent-session.ts`'s tool-call lifecycle, a separate, larger integration this
|
|
12
|
+
* phase does not open.
|
|
13
|
+
*/
|
|
14
|
+
export interface OtlpExportConfig {
|
|
15
|
+
endpoint: string;
|
|
16
|
+
headers?: Record<string, string>;
|
|
17
|
+
}
|
|
18
|
+
interface OtlpAttribute {
|
|
19
|
+
key: string;
|
|
20
|
+
value: {
|
|
21
|
+
stringValue: string;
|
|
22
|
+
} | {
|
|
23
|
+
doubleValue: number;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export interface OtlpSpan {
|
|
27
|
+
traceId: string;
|
|
28
|
+
spanId: string;
|
|
29
|
+
name: string;
|
|
30
|
+
kind: number;
|
|
31
|
+
startTimeUnixNano: string;
|
|
32
|
+
endTimeUnixNano: string;
|
|
33
|
+
attributes: OtlpAttribute[];
|
|
34
|
+
}
|
|
35
|
+
export interface OtlpTracePayload {
|
|
36
|
+
resourceSpans: Array<{
|
|
37
|
+
resource: {
|
|
38
|
+
attributes: OtlpAttribute[];
|
|
39
|
+
};
|
|
40
|
+
scopeSpans: Array<{
|
|
41
|
+
scope: {
|
|
42
|
+
name: string;
|
|
43
|
+
};
|
|
44
|
+
spans: OtlpSpan[];
|
|
45
|
+
}>;
|
|
46
|
+
}>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The complete allowlist ADR 0012 permits. `buildUsageSampleSpan` only ever
|
|
50
|
+
* emits a subset of this -- extending `UsagePerformanceSample` must not
|
|
51
|
+
* silently widen what is exported; this list is edited explicitly or not at
|
|
52
|
+
* all.
|
|
53
|
+
*/
|
|
54
|
+
export declare const OTLP_ALLOWED_ATTRIBUTE_KEYS: readonly ["provider", "model", "role", "outcome", "failure_kind", "ttft_ms", "generation_ms", "input_tokens", "output_tokens", "cache_read_tokens", "cache_write_tokens", "cost", "credential_identity", "tool_name"];
|
|
55
|
+
/** Builds one span for one model request attempt. Attributes are an allowlist, never a redaction pass. */
|
|
56
|
+
export declare function buildUsageSampleSpan(sample: UsagePerformanceSample): OtlpSpan;
|
|
57
|
+
export declare function buildOtlpTracePayload(spans: readonly OtlpSpan[]): OtlpTracePayload;
|
|
58
|
+
/**
|
|
59
|
+
* Exports one span for one usage sample. Never throws -- an export failure
|
|
60
|
+
* must never fail the turn that produced the sample, matching
|
|
61
|
+
* `instrumentAttempt`'s own fire-and-forget `.catch(() => {})` around the
|
|
62
|
+
* ledger write.
|
|
63
|
+
*/
|
|
64
|
+
export declare function exportUsageSampleSpan(sample: UsagePerformanceSample, config: OtlpExportConfig): Promise<void>;
|
|
65
|
+
export {};
|
|
66
|
+
//# sourceMappingURL=otlp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otlp.d.ts","sourceRoot":"","sources":["../../../src/core/observability/otlp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAE5E;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,gBAAgB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,UAAU,aAAa;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CACzD;AAED,MAAM,WAAW,QAAQ;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAChC,aAAa,EAAE,KAAK,CAAC;QACpB,QAAQ,EAAE;YAAE,UAAU,EAAE,aAAa,EAAE,CAAA;SAAE,CAAC;QAC1C,UAAU,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC;YAAC,KAAK,EAAE,QAAQ,EAAE,CAAA;SAAE,CAAC,CAAC;KAClE,CAAC,CAAC;CACH;AAMD;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,uNAe9B,CAAC;AAWX,0GAA0G;AAC1G,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,sBAAsB,GAAG,QAAQ,CA8B7E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,gBAAgB,CASlF;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,sBAAsB,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAYnH","sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport type { UsagePerformanceSample } from \"../usage-performance-store.ts\";\n\n/**\n * User-directed OTLP trace export (roadmap Phase 8, ADR 0012). Uses global\n * `fetch` deliberately, not a direct undici import: `http-dispatcher.ts` already\n * binds it to a proxy-aware, timeout-configured dispatcher, and a second HTTP\n * client here would silently bypass a user's HTTP_PROXY.\n *\n * Scope note (recorded in the Phase 8 plan): this emits one span per model\n * request attempt -- the same unit `SqliteUsagePerformanceStore` already\n * records -- not a full turn/tool-call span tree. That would require touching\n * `agent-session.ts`'s tool-call lifecycle, a separate, larger integration this\n * phase does not open.\n */\n\nexport interface OtlpExportConfig {\n\tendpoint: string;\n\theaders?: Record<string, string>;\n}\n\ninterface OtlpAttribute {\n\tkey: string;\n\tvalue: { stringValue: string } | { doubleValue: number };\n}\n\nexport interface OtlpSpan {\n\ttraceId: string;\n\tspanId: string;\n\tname: string;\n\tkind: number;\n\tstartTimeUnixNano: string;\n\tendTimeUnixNano: string;\n\tattributes: OtlpAttribute[];\n}\n\nexport interface OtlpTracePayload {\n\tresourceSpans: Array<{\n\t\tresource: { attributes: OtlpAttribute[] };\n\t\tscopeSpans: Array<{ scope: { name: string }; spans: OtlpSpan[] }>;\n\t}>;\n}\n\nconst SERVICE_NAME = \"apex-code\";\n/** OTLP SpanKind: SPAN_KIND_CLIENT -- this process is the caller of the model API. */\nconst SPAN_KIND_CLIENT = 3;\n\n/**\n * The complete allowlist ADR 0012 permits. `buildUsageSampleSpan` only ever\n * emits a subset of this -- extending `UsagePerformanceSample` must not\n * silently widen what is exported; this list is edited explicitly or not at\n * all.\n */\nexport const OTLP_ALLOWED_ATTRIBUTE_KEYS = [\n\t\"provider\",\n\t\"model\",\n\t\"role\",\n\t\"outcome\",\n\t\"failure_kind\",\n\t\"ttft_ms\",\n\t\"generation_ms\",\n\t\"input_tokens\",\n\t\"output_tokens\",\n\t\"cache_read_tokens\",\n\t\"cache_write_tokens\",\n\t\"cost\",\n\t\"credential_identity\",\n\t\"tool_name\",\n] as const;\n\nfunction attr(key: string, value: string | number | undefined): OtlpAttribute | undefined {\n\tif (value === undefined) return undefined;\n\treturn typeof value === \"number\" ? { key, value: { doubleValue: value } } : { key, value: { stringValue: value } };\n}\n\nfunction randomHex(bytes: number): string {\n\treturn randomBytes(bytes).toString(\"hex\");\n}\n\n/** Builds one span for one model request attempt. Attributes are an allowlist, never a redaction pass. */\nexport function buildUsageSampleSpan(sample: UsagePerformanceSample): OtlpSpan {\n\tconst attributes = [\n\t\tattr(\"provider\", sample.provider),\n\t\tattr(\"model\", sample.model),\n\t\tattr(\"role\", sample.role),\n\t\tattr(\"outcome\", sample.outcome),\n\t\tattr(\"failure_kind\", sample.failureKind),\n\t\tattr(\"ttft_ms\", sample.ttftMs),\n\t\tattr(\"generation_ms\", sample.generationMs),\n\t\tattr(\"input_tokens\", sample.usage?.input),\n\t\tattr(\"output_tokens\", sample.usage?.output),\n\t\tattr(\"cache_read_tokens\", sample.usage?.cacheRead),\n\t\tattr(\"cache_write_tokens\", sample.usage?.cacheWrite),\n\t\tattr(\"cost\", sample.cost),\n\t\tattr(\"credential_identity\", sample.credentialIdentity),\n\t].filter((candidate): candidate is OtlpAttribute => candidate !== undefined);\n\n\tconst startNanos = BigInt(sample.timestamp) * 1_000_000n;\n\tconst durationMs = Math.max(0, Math.round(sample.ttftMs + sample.generationMs));\n\tconst endNanos = startNanos + BigInt(durationMs) * 1_000_000n;\n\n\treturn {\n\t\ttraceId: randomHex(16),\n\t\tspanId: randomHex(8),\n\t\tname: \"model_request_attempt\",\n\t\tkind: SPAN_KIND_CLIENT,\n\t\tstartTimeUnixNano: startNanos.toString(),\n\t\tendTimeUnixNano: endNanos.toString(),\n\t\tattributes,\n\t};\n}\n\nexport function buildOtlpTracePayload(spans: readonly OtlpSpan[]): OtlpTracePayload {\n\treturn {\n\t\tresourceSpans: [\n\t\t\t{\n\t\t\t\tresource: { attributes: [attr(\"service.name\", SERVICE_NAME)!] },\n\t\t\t\tscopeSpans: [{ scope: { name: SERVICE_NAME }, spans: [...spans] }],\n\t\t\t},\n\t\t],\n\t};\n}\n\n/**\n * Exports one span for one usage sample. Never throws -- an export failure\n * must never fail the turn that produced the sample, matching\n * `instrumentAttempt`'s own fire-and-forget `.catch(() => {})` around the\n * ledger write.\n */\nexport async function exportUsageSampleSpan(sample: UsagePerformanceSample, config: OtlpExportConfig): Promise<void> {\n\ttry {\n\t\tconst payload = buildOtlpTracePayload([buildUsageSampleSpan(sample)]);\n\t\tconst url = `${config.endpoint.replace(/\\/$/, \"\")}/v1/traces`;\n\t\tawait fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"content-type\": \"application/json\", ...config.headers },\n\t\t\tbody: JSON.stringify(payload),\n\t\t});\n\t} catch {\n\t\t// Never let an export failure surface to the caller.\n\t}\n}\n"]}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
const SERVICE_NAME = "apex-code";
|
|
3
|
+
/** OTLP SpanKind: SPAN_KIND_CLIENT -- this process is the caller of the model API. */
|
|
4
|
+
const SPAN_KIND_CLIENT = 3;
|
|
5
|
+
/**
|
|
6
|
+
* The complete allowlist ADR 0012 permits. `buildUsageSampleSpan` only ever
|
|
7
|
+
* emits a subset of this -- extending `UsagePerformanceSample` must not
|
|
8
|
+
* silently widen what is exported; this list is edited explicitly or not at
|
|
9
|
+
* all.
|
|
10
|
+
*/
|
|
11
|
+
export const OTLP_ALLOWED_ATTRIBUTE_KEYS = [
|
|
12
|
+
"provider",
|
|
13
|
+
"model",
|
|
14
|
+
"role",
|
|
15
|
+
"outcome",
|
|
16
|
+
"failure_kind",
|
|
17
|
+
"ttft_ms",
|
|
18
|
+
"generation_ms",
|
|
19
|
+
"input_tokens",
|
|
20
|
+
"output_tokens",
|
|
21
|
+
"cache_read_tokens",
|
|
22
|
+
"cache_write_tokens",
|
|
23
|
+
"cost",
|
|
24
|
+
"credential_identity",
|
|
25
|
+
"tool_name",
|
|
26
|
+
];
|
|
27
|
+
function attr(key, value) {
|
|
28
|
+
if (value === undefined)
|
|
29
|
+
return undefined;
|
|
30
|
+
return typeof value === "number" ? { key, value: { doubleValue: value } } : { key, value: { stringValue: value } };
|
|
31
|
+
}
|
|
32
|
+
function randomHex(bytes) {
|
|
33
|
+
return randomBytes(bytes).toString("hex");
|
|
34
|
+
}
|
|
35
|
+
/** Builds one span for one model request attempt. Attributes are an allowlist, never a redaction pass. */
|
|
36
|
+
export function buildUsageSampleSpan(sample) {
|
|
37
|
+
const attributes = [
|
|
38
|
+
attr("provider", sample.provider),
|
|
39
|
+
attr("model", sample.model),
|
|
40
|
+
attr("role", sample.role),
|
|
41
|
+
attr("outcome", sample.outcome),
|
|
42
|
+
attr("failure_kind", sample.failureKind),
|
|
43
|
+
attr("ttft_ms", sample.ttftMs),
|
|
44
|
+
attr("generation_ms", sample.generationMs),
|
|
45
|
+
attr("input_tokens", sample.usage?.input),
|
|
46
|
+
attr("output_tokens", sample.usage?.output),
|
|
47
|
+
attr("cache_read_tokens", sample.usage?.cacheRead),
|
|
48
|
+
attr("cache_write_tokens", sample.usage?.cacheWrite),
|
|
49
|
+
attr("cost", sample.cost),
|
|
50
|
+
attr("credential_identity", sample.credentialIdentity),
|
|
51
|
+
].filter((candidate) => candidate !== undefined);
|
|
52
|
+
const startNanos = BigInt(sample.timestamp) * 1000000n;
|
|
53
|
+
const durationMs = Math.max(0, Math.round(sample.ttftMs + sample.generationMs));
|
|
54
|
+
const endNanos = startNanos + BigInt(durationMs) * 1000000n;
|
|
55
|
+
return {
|
|
56
|
+
traceId: randomHex(16),
|
|
57
|
+
spanId: randomHex(8),
|
|
58
|
+
name: "model_request_attempt",
|
|
59
|
+
kind: SPAN_KIND_CLIENT,
|
|
60
|
+
startTimeUnixNano: startNanos.toString(),
|
|
61
|
+
endTimeUnixNano: endNanos.toString(),
|
|
62
|
+
attributes,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export function buildOtlpTracePayload(spans) {
|
|
66
|
+
return {
|
|
67
|
+
resourceSpans: [
|
|
68
|
+
{
|
|
69
|
+
resource: { attributes: [attr("service.name", SERVICE_NAME)] },
|
|
70
|
+
scopeSpans: [{ scope: { name: SERVICE_NAME }, spans: [...spans] }],
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Exports one span for one usage sample. Never throws -- an export failure
|
|
77
|
+
* must never fail the turn that produced the sample, matching
|
|
78
|
+
* `instrumentAttempt`'s own fire-and-forget `.catch(() => {})` around the
|
|
79
|
+
* ledger write.
|
|
80
|
+
*/
|
|
81
|
+
export async function exportUsageSampleSpan(sample, config) {
|
|
82
|
+
try {
|
|
83
|
+
const payload = buildOtlpTracePayload([buildUsageSampleSpan(sample)]);
|
|
84
|
+
const url = `${config.endpoint.replace(/\/$/, "")}/v1/traces`;
|
|
85
|
+
await fetch(url, {
|
|
86
|
+
method: "POST",
|
|
87
|
+
headers: { "content-type": "application/json", ...config.headers },
|
|
88
|
+
body: JSON.stringify(payload),
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// Never let an export failure surface to the caller.
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=otlp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otlp.js","sourceRoot":"","sources":["../../../src/core/observability/otlp.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport type { UsagePerformanceSample } from \"../usage-performance-store.ts\";\n\n/**\n * User-directed OTLP trace export (roadmap Phase 8, ADR 0012). Uses global\n * `fetch` deliberately, not a direct undici import: `http-dispatcher.ts` already\n * binds it to a proxy-aware, timeout-configured dispatcher, and a second HTTP\n * client here would silently bypass a user's HTTP_PROXY.\n *\n * Scope note (recorded in the Phase 8 plan): this emits one span per model\n * request attempt -- the same unit `SqliteUsagePerformanceStore` already\n * records -- not a full turn/tool-call span tree. That would require touching\n * `agent-session.ts`'s tool-call lifecycle, a separate, larger integration this\n * phase does not open.\n */\n\nexport interface OtlpExportConfig {\n\tendpoint: string;\n\theaders?: Record<string, string>;\n}\n\ninterface OtlpAttribute {\n\tkey: string;\n\tvalue: { stringValue: string } | { doubleValue: number };\n}\n\nexport interface OtlpSpan {\n\ttraceId: string;\n\tspanId: string;\n\tname: string;\n\tkind: number;\n\tstartTimeUnixNano: string;\n\tendTimeUnixNano: string;\n\tattributes: OtlpAttribute[];\n}\n\nexport interface OtlpTracePayload {\n\tresourceSpans: Array<{\n\t\tresource: { attributes: OtlpAttribute[] };\n\t\tscopeSpans: Array<{ scope: { name: string }; spans: OtlpSpan[] }>;\n\t}>;\n}\n\nconst SERVICE_NAME = \"apex-code\";\n/** OTLP SpanKind: SPAN_KIND_CLIENT -- this process is the caller of the model API. */\nconst SPAN_KIND_CLIENT = 3;\n\n/**\n * The complete allowlist ADR 0012 permits. `buildUsageSampleSpan` only ever\n * emits a subset of this -- extending `UsagePerformanceSample` must not\n * silently widen what is exported; this list is edited explicitly or not at\n * all.\n */\nexport const OTLP_ALLOWED_ATTRIBUTE_KEYS = [\n\t\"provider\",\n\t\"model\",\n\t\"role\",\n\t\"outcome\",\n\t\"failure_kind\",\n\t\"ttft_ms\",\n\t\"generation_ms\",\n\t\"input_tokens\",\n\t\"output_tokens\",\n\t\"cache_read_tokens\",\n\t\"cache_write_tokens\",\n\t\"cost\",\n\t\"credential_identity\",\n\t\"tool_name\",\n] as const;\n\nfunction attr(key: string, value: string | number | undefined): OtlpAttribute | undefined {\n\tif (value === undefined) return undefined;\n\treturn typeof value === \"number\" ? { key, value: { doubleValue: value } } : { key, value: { stringValue: value } };\n}\n\nfunction randomHex(bytes: number): string {\n\treturn randomBytes(bytes).toString(\"hex\");\n}\n\n/** Builds one span for one model request attempt. Attributes are an allowlist, never a redaction pass. */\nexport function buildUsageSampleSpan(sample: UsagePerformanceSample): OtlpSpan {\n\tconst attributes = [\n\t\tattr(\"provider\", sample.provider),\n\t\tattr(\"model\", sample.model),\n\t\tattr(\"role\", sample.role),\n\t\tattr(\"outcome\", sample.outcome),\n\t\tattr(\"failure_kind\", sample.failureKind),\n\t\tattr(\"ttft_ms\", sample.ttftMs),\n\t\tattr(\"generation_ms\", sample.generationMs),\n\t\tattr(\"input_tokens\", sample.usage?.input),\n\t\tattr(\"output_tokens\", sample.usage?.output),\n\t\tattr(\"cache_read_tokens\", sample.usage?.cacheRead),\n\t\tattr(\"cache_write_tokens\", sample.usage?.cacheWrite),\n\t\tattr(\"cost\", sample.cost),\n\t\tattr(\"credential_identity\", sample.credentialIdentity),\n\t].filter((candidate): candidate is OtlpAttribute => candidate !== undefined);\n\n\tconst startNanos = BigInt(sample.timestamp) * 1_000_000n;\n\tconst durationMs = Math.max(0, Math.round(sample.ttftMs + sample.generationMs));\n\tconst endNanos = startNanos + BigInt(durationMs) * 1_000_000n;\n\n\treturn {\n\t\ttraceId: randomHex(16),\n\t\tspanId: randomHex(8),\n\t\tname: \"model_request_attempt\",\n\t\tkind: SPAN_KIND_CLIENT,\n\t\tstartTimeUnixNano: startNanos.toString(),\n\t\tendTimeUnixNano: endNanos.toString(),\n\t\tattributes,\n\t};\n}\n\nexport function buildOtlpTracePayload(spans: readonly OtlpSpan[]): OtlpTracePayload {\n\treturn {\n\t\tresourceSpans: [\n\t\t\t{\n\t\t\t\tresource: { attributes: [attr(\"service.name\", SERVICE_NAME)!] },\n\t\t\t\tscopeSpans: [{ scope: { name: SERVICE_NAME }, spans: [...spans] }],\n\t\t\t},\n\t\t],\n\t};\n}\n\n/**\n * Exports one span for one usage sample. Never throws -- an export failure\n * must never fail the turn that produced the sample, matching\n * `instrumentAttempt`'s own fire-and-forget `.catch(() => {})` around the\n * ledger write.\n */\nexport async function exportUsageSampleSpan(sample: UsagePerformanceSample, config: OtlpExportConfig): Promise<void> {\n\ttry {\n\t\tconst payload = buildOtlpTracePayload([buildUsageSampleSpan(sample)]);\n\t\tconst url = `${config.endpoint.replace(/\\/$/, \"\")}/v1/traces`;\n\t\tawait fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"content-type\": \"application/json\", ...config.headers },\n\t\t\tbody: JSON.stringify(payload),\n\t\t});\n\t} catch {\n\t\t// Never let an export failure surface to the caller.\n\t}\n}\n"]}
|