@ponythewhite/base-context 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/NOTICE +0 -5
- package/README.md +44 -27
- package/dist/NOTICE +0 -5
- package/dist/base-context-runtime/pyproject.toml +1 -1
- package/dist/base-context-runtime/src/rlm/__init__.py +7 -5
- package/dist/base-context-runtime/test/test_subagent_registry.py +28 -1
- package/dist/base-context-runtime/uv.lock +1 -1
- package/dist/build-info.json +1 -1
- package/dist/bundle/amazon-bedrock.js +21 -0
- package/dist/bundle/{anthropic-YY4S534V.js → anthropic-UV5GZDGU.js} +5 -5
- package/dist/bundle/{azure-openai-responses-JRP6MIM3.js → azure-openai-responses-WSNPXLYC.js} +6 -6
- package/dist/bundle/{bundled-modules-P5HARVZA.js → bundled-modules-TXUMJ2XQ.js} +71 -16
- package/dist/bundle/chunk-27QCJ2AZ.js +2578 -0
- package/dist/bundle/{chunk-MZHTNNVA.js → chunk-4GXPNXOJ.js} +8 -0
- package/dist/bundle/{chunk-SC5KG5R4.js → chunk-DGNX7HQ3.js} +1 -7
- package/dist/bundle/{chunk-A53O363M.js → chunk-GRJFXLBM.js} +0 -1
- package/dist/bundle/chunk-HKINIBP4.js +29 -0
- package/dist/bundle/{chunk-UDSW6FNG.js → chunk-KTNETTHI.js} +1 -1
- package/dist/bundle/{chunk-BYVP7LWV.js → chunk-S3INFPZZ.js} +1861 -4662
- package/dist/bundle/{chunk-73DCPU3D.js → chunk-V3L54UD6.js} +1019 -3427
- package/dist/bundle/{chunk-U7AUVG3B.js → chunk-VSIYFWYI.js} +24 -6
- package/dist/bundle/{chunk-IW77OXFS.js → chunk-W46VZFI6.js} +0 -2099
- package/dist/bundle/{cli-main-O4X7GFGY.js → cli-main-BYMSRPH6.js} +8 -6
- package/dist/bundle/cli.js +2 -2
- package/dist/bundle/{google-AUTVGDGZ.js → google-T32FMD4G.js} +6 -6
- package/dist/bundle/{google-vertex-Q75D7RKS.js → google-vertex-56KP6I3B.js} +3 -3
- package/dist/bundle/{main-XKOW2BV6.js → main-ODOYCEQC.js} +7 -5
- package/dist/bundle/{mistral-7ESB7QUD.js → mistral-WGBMYIVU.js} +5 -5
- package/dist/bundle/{openai-codex-responses-LV3QRPN4.js → openai-codex-responses-PIV2RQ3G.js} +6 -6
- package/dist/bundle/{openai-completions-OJECLPXJ.js → openai-completions-64C3JPR4.js} +11 -22
- package/dist/bundle/{openai-responses-FN6HZMBC.js → openai-responses-UI7RSTDV.js} +6 -6
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +108 -59
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/daemon-ps.d.ts +4 -3
- package/dist/cli/daemon-ps.d.ts.map +1 -1
- package/dist/cli/daemon-ps.js +6 -1
- package/dist/cli/daemon-ps.js.map +1 -1
- package/dist/cli/product-doctor.d.ts +0 -1
- package/dist/cli/product-doctor.d.ts.map +1 -1
- package/dist/cli/product-doctor.js +6 -3
- package/dist/cli/product-doctor.js.map +1 -1
- package/dist/config.d.ts +0 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -8
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-config.d.ts +1 -2
- package/dist/core/agent-session-config.d.ts.map +1 -1
- package/dist/core/agent-session-config.js +0 -3
- package/dist/core/agent-session-config.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +5 -4
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +5 -3
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +2 -27
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +10 -6
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +107 -107
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +8 -35
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +33 -243
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/cron-jobs.d.ts.map +1 -1
- package/dist/core/cron-jobs.js +7 -1
- package/dist/core/cron-jobs.js.map +1 -1
- package/dist/core/inference-coordinator.d.ts +6 -1
- package/dist/core/inference-coordinator.d.ts.map +1 -1
- package/dist/core/inference-coordinator.js +18 -2
- package/dist/core/inference-coordinator.js.map +1 -1
- package/dist/core/kernel/bootstrap.d.ts.map +1 -1
- package/dist/core/kernel/bootstrap.js +2 -2
- package/dist/core/kernel/bootstrap.js.map +1 -1
- package/dist/core/kernel/repl-manager.d.ts +2 -0
- package/dist/core/kernel/repl-manager.d.ts.map +1 -1
- package/dist/core/kernel/repl-manager.js +44 -1
- package/dist/core/kernel/repl-manager.js.map +1 -1
- package/dist/core/logging.d.ts +4 -3
- package/dist/core/logging.d.ts.map +1 -1
- package/dist/core/logging.js +6 -6
- package/dist/core/logging.js.map +1 -1
- package/dist/core/mcp/mcp-manager.d.ts.map +1 -1
- package/dist/core/mcp/mcp-manager.js +3 -3
- package/dist/core/mcp/mcp-manager.js.map +1 -1
- package/dist/core/model-registry.d.ts +1 -16
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +88 -196
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +2 -19
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +36 -266
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/provider-contracts.d.ts +5 -6
- package/dist/core/provider-contracts.d.ts.map +1 -1
- package/dist/core/provider-contracts.js +25 -36
- package/dist/core/provider-contracts.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/provider-display-names.js +0 -2
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/rlm-max-subagents.d.ts +32 -0
- package/dist/core/rlm-max-subagents.d.ts.map +1 -0
- package/dist/core/rlm-max-subagents.js +50 -0
- package/dist/core/rlm-max-subagents.js.map +1 -0
- package/dist/core/rlm-runtime.d.ts +3 -3
- package/dist/core/rlm-runtime.d.ts.map +1 -1
- package/dist/core/rlm-runtime.js.map +1 -1
- package/dist/core/sdk.d.ts +4 -3
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +27 -14
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-manager.d.ts +3 -16
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +12 -44
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +6 -6
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/installer.mjs +2 -3
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +39 -34
- package/dist/main.js.map +1 -1
- package/dist/modes/acp/acp-mode.d.ts.map +1 -1
- package/dist/modes/acp/acp-mode.js +1 -1
- package/dist/modes/acp/acp-mode.js.map +1 -1
- package/dist/modes/agent-connection/daemon-agent-connection.d.ts +6 -2
- package/dist/modes/agent-connection/daemon-agent-connection.d.ts.map +1 -1
- package/dist/modes/agent-connection/daemon-agent-connection.js +13 -2
- package/dist/modes/agent-connection/daemon-agent-connection.js.map +1 -1
- package/dist/modes/agent-connection/in-process-agent-connection.d.ts +2 -0
- package/dist/modes/agent-connection/in-process-agent-connection.d.ts.map +1 -1
- package/dist/modes/agent-connection/in-process-agent-connection.js +6 -0
- package/dist/modes/agent-connection/in-process-agent-connection.js.map +1 -1
- package/dist/modes/agent-connection/types.d.ts +3 -0
- package/dist/modes/agent-connection/types.d.ts.map +1 -1
- package/dist/modes/agent-connection/types.js.map +1 -1
- package/dist/modes/agents-view/agents-view-mode.d.ts.map +1 -1
- package/dist/modes/agents-view/agents-view-mode.js +2 -19
- package/dist/modes/agents-view/agents-view-mode.js.map +1 -1
- package/dist/modes/daemon/daemon-mode.d.ts +5 -0
- package/dist/modes/daemon/daemon-mode.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-mode.js +107 -12
- package/dist/modes/daemon/daemon-mode.js.map +1 -1
- package/dist/modes/daemon/daemon-protocol.d.ts +194 -165
- package/dist/modes/daemon/daemon-protocol.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-protocol.js +16 -11
- package/dist/modes/daemon/daemon-protocol.js.map +1 -1
- package/dist/modes/daemon/daemon-rlm-capacity-coordinator.d.ts +19 -0
- package/dist/modes/daemon/daemon-rlm-capacity-coordinator.d.ts.map +1 -0
- package/dist/modes/daemon/daemon-rlm-capacity-coordinator.js +74 -0
- package/dist/modes/daemon/daemon-rlm-capacity-coordinator.js.map +1 -0
- package/dist/modes/daemon/daemon-rlm-capacity.d.ts +19 -0
- package/dist/modes/daemon/daemon-rlm-capacity.d.ts.map +1 -0
- package/dist/modes/daemon/daemon-rlm-capacity.js +85 -0
- package/dist/modes/daemon/daemon-rlm-capacity.js.map +1 -0
- package/dist/modes/daemon/daemon-session-summarizer.d.ts +2 -3
- package/dist/modes/daemon/daemon-session-summarizer.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-session-summarizer.js +32 -23
- package/dist/modes/daemon/daemon-session-summarizer.js.map +1 -1
- package/dist/modes/daemon/daemon-state-root.d.ts +15 -0
- package/dist/modes/daemon/daemon-state-root.d.ts.map +1 -0
- package/dist/modes/daemon/daemon-state-root.js +40 -0
- package/dist/modes/daemon/daemon-state-root.js.map +1 -0
- package/dist/modes/daemon/daemon-supervisor-ownership.d.ts +2 -0
- package/dist/modes/daemon/daemon-supervisor-ownership.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-supervisor-ownership.js +27 -0
- package/dist/modes/daemon/daemon-supervisor-ownership.js.map +1 -1
- package/dist/modes/daemon/daemon-supervisor.d.ts +10 -1
- package/dist/modes/daemon/daemon-supervisor.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-supervisor.js +213 -20
- package/dist/modes/daemon/daemon-supervisor.js.map +1 -1
- package/dist/modes/daemon/daemon-worker-protocol.d.ts +28 -1
- package/dist/modes/daemon/daemon-worker-protocol.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-worker-protocol.js +16 -2
- package/dist/modes/daemon/daemon-worker-protocol.js.map +1 -1
- package/dist/modes/daemon/saved-session-catalog.d.ts.map +1 -1
- package/dist/modes/daemon/saved-session-catalog.js +2 -0
- package/dist/modes/daemon/saved-session-catalog.js.map +1 -1
- package/dist/modes/interactive/auth-flows.d.ts +0 -6
- package/dist/modes/interactive/auth-flows.d.ts.map +1 -1
- package/dist/modes/interactive/auth-flows.js +6 -126
- package/dist/modes/interactive/auth-flows.js.map +1 -1
- package/dist/modes/interactive/components/configuration-menu.d.ts +3 -0
- package/dist/modes/interactive/components/configuration-menu.d.ts.map +1 -1
- package/dist/modes/interactive/components/configuration-menu.js +13 -2
- package/dist/modes/interactive/components/configuration-menu.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +2 -2
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +0 -1
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js +0 -1
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +0 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +3 -40
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +2 -0
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +13 -2
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +2 -11
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/feature-hints.d.ts.map +1 -1
- package/dist/modes/interactive/feature-hints.js +0 -4
- package/dist/modes/interactive/feature-hints.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +3 -12
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +81 -507
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/onboarding.d.ts +0 -3
- package/dist/modes/interactive/onboarding.d.ts.map +1 -1
- package/dist/modes/interactive/onboarding.js +0 -17
- package/dist/modes/interactive/onboarding.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +2 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +24 -11
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/node/amazon-bedrock.d.ts +2 -0
- package/dist/node/amazon-bedrock.d.ts.map +1 -0
- package/dist/node/amazon-bedrock.js +6 -0
- package/dist/node/amazon-bedrock.js.map +1 -0
- package/dist/product-identity.d.ts +0 -1
- package/dist/product-identity.d.ts.map +1 -1
- package/dist/product-identity.js +0 -1
- package/dist/product-identity.js.map +1 -1
- package/docs/development.md +1 -1
- package/docs/fork-philosophy.md +4 -8
- package/docs/installation.md +83 -62
- package/docs/providers.md +23 -25
- package/docs/quickstart.md +19 -10
- package/docs/rlm-runtime.md +13 -5
- package/docs/rpc.md +4 -4
- package/docs/sdk.md +20 -11
- package/docs/sessions.md +0 -1
- package/docs/settings.md +9 -42
- package/docs/skills.md +0 -1
- package/docs/upstream-0.9.5.md +171 -0
- package/docs/usage.md +14 -10
- package/package.json +4 -4
- package/dist/core/agent-traces.d.ts +0 -149
- package/dist/core/agent-traces.d.ts.map +0 -1
- package/dist/core/agent-traces.js +0 -904
- package/dist/core/agent-traces.js.map +0 -1
- package/dist/core/prime-inference-auth.d.ts +0 -70
- package/dist/core/prime-inference-auth.d.ts.map +0 -1
- package/dist/core/prime-inference-auth.js +0 -352
- package/dist/core/prime-inference-auth.js.map +0 -1
- package/dist/core/prime-inference-model-selection.d.ts +0 -16
- package/dist/core/prime-inference-model-selection.d.ts.map +0 -1
- package/dist/core/prime-inference-model-selection.js +0 -16
- package/dist/core/prime-inference-model-selection.js.map +0 -1
- package/dist/core/prime-inference-models.d.ts +0 -6
- package/dist/core/prime-inference-models.d.ts.map +0 -1
- package/dist/core/prime-inference-models.js +0 -62
- package/dist/core/prime-inference-models.js.map +0 -1
- package/dist/core/telemetry.d.ts +0 -95
- package/dist/core/telemetry.d.ts.map +0 -1
- package/dist/core/telemetry.js +0 -637
- package/dist/core/telemetry.js.map +0 -1
- package/dist/modes/interactive/components/prime-onboarding-splash.d.ts +0 -39
- package/dist/modes/interactive/components/prime-onboarding-splash.d.ts.map +0 -1
- package/dist/modes/interactive/components/prime-onboarding-splash.js +0 -286
- package/dist/modes/interactive/components/prime-onboarding-splash.js.map +0 -1
- package/dist/modes/interactive/components/prime-team-selector.d.ts +0 -30
- package/dist/modes/interactive/components/prime-team-selector.d.ts.map +0 -1
- package/dist/modes/interactive/components/prime-team-selector.js +0 -166
- package/dist/modes/interactive/components/prime-team-selector.js.map +0 -1
- package/dist/skills/prime-intellect/SKILL.md +0 -87
- package/dist/skills/prime-intellect/references/compute.md +0 -45
- package/dist/skills/prime-intellect/references/environments.md +0 -73
- package/dist/skills/prime-intellect/references/inference.md +0 -47
- package/dist/skills/prime-intellect/references/sandboxes.md +0 -75
- package/skills/prime-intellect/SKILL.md +0 -87
- package/skills/prime-intellect/references/compute.md +0 -45
- package/skills/prime-intellect/references/environments.md +0 -73
- package/skills/prime-intellect/references/inference.md +0 -47
- package/skills/prime-intellect/references/sandboxes.md +0 -75
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prime-inference-auth.js","sourceRoot":"","sources":["../../src/core/prime-inference-auth.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tchmodSync,\n\tcloseSync,\n\texistsSync,\n\tmkdirSync,\n\topenSync,\n\treadFileSync,\n\trenameSync,\n\trmSync,\n\twriteFileSync,\n} from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\nimport type { OAuthAuthInfo } from \"@ponythewhite/base-context-ai\";\nimport { getAgentDir } from \"../config.js\";\nimport { assertProductStatePath } from \"../runtime-paths.js\";\n\nexport const PRIME_INFERENCE_PROVIDER_ID = \"prime-inference\";\nexport const PRIME_INFERENCE_PROVIDER_NAME = \"Prime Inference\";\nexport const BASE_CONTEXT_TRACES_PROVIDER_ID = \"base-context-traces\";\nexport const BASE_CONTEXT_TRACES_PROVIDER_NAME = \"Base Context Traces\";\n\nconst DEFAULT_PRIME_API_BASE_URL = \"https://api.primeintellect.ai\";\nconst DEFAULT_PRIME_FRONTEND_URL = \"https://app.primeintellect.ai\";\nconst DEFAULT_PRIME_INFERENCE_URL = \"https://api.pinference.ai/api/v1\";\nconst DEFAULT_REQUEST_TIMEOUT_MS = 30_000;\n\nexport type PrimeInferenceAuthSource = \"api-key\";\n\nexport type PrimeInferenceLoginResult = {\n\tapiKey: string;\n\tsource: PrimeInferenceAuthSource;\n};\n\nexport type PrimeCliConfig = {\n\tapiKey?: string;\n\tbaseUrl: string;\n\tfrontendUrl: string;\n\tinferenceUrl: string;\n\tpath: string;\n\tteamId?: string;\n\tteamName?: string;\n\tteamRole?: string;\n\tteamIdFromEnv: boolean;\n};\n\nexport type PrimeInferenceLoginCallbacks = {\n\tonAuth: (info: OAuthAuthInfo) => void;\n\tonProgress?: (message: string) => void;\n\tsignal?: AbortSignal;\n};\n\nexport type PrimeInferenceLoginOptions = {\n\tapiKey?: string;\n\tconfigPath?: string;\n\tfetchFn?: typeof fetch;\n\trequestTimeoutMs?: number;\n};\n\nexport type PrimeInferenceAccessResult =\n\t| { ok: true }\n\t| {\n\t\t\tok: false;\n\t\t\tstatus?: number;\n\t\t\tmessage: string;\n\t };\n\ntype PrimeAccessScope = \"inference\" | \"agent_traces\";\n\nexport type PrimeTeam = {\n\tteamId: string;\n\tname: string;\n\tslug?: string;\n\trole?: string;\n\tcreatedAt?: string;\n};\n\nfunction defaultPrimeCliConfigPath(): string {\n\treturn assertProductStatePath(join(getAgentDir(), \"prime-inference.json\"));\n}\n\nexport function getPrimeCliConfigPath(configPath?: string): string {\n\treturn configPath ?? defaultPrimeCliConfigPath();\n}\n\nfunction normalizeBaseUrl(value: string | undefined): string {\n\treturn (value?.trim() || DEFAULT_PRIME_API_BASE_URL).replace(/\\/+$/, \"\").replace(/\\/api\\/v1$/, \"\");\n}\n\nfunction normalizeUrl(value: string | undefined, fallback: string): string {\n\treturn (value || fallback).trim().replace(/\\/+$/, \"\");\n}\n\nfunction stringField(data: Record<string, unknown>, key: string): string | undefined {\n\tconst value = data[key];\n\treturn typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction stringEnv(name: string): string | undefined {\n\tconst value = process.env[name];\n\treturn typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction numberField(data: Record<string, unknown>, key: string): number | undefined {\n\tconst value = data[key];\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readPrimeCliConfigData(configPath: string): Record<string, unknown> {\n\tlet data: Record<string, unknown> = {};\n\tif (existsSync(configPath)) {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(readFileSync(configPath, \"utf-8\")) as unknown;\n\t\t\tif (isRecord(parsed)) {\n\t\t\t\tdata = parsed;\n\t\t\t}\n\t\t} catch {\n\t\t\tdata = {};\n\t\t}\n\t}\n\treturn data;\n}\n\nfunction writePrimeCliConfigData(configPath: string, data: Record<string, unknown>): void {\n\tconfigPath = assertProductStatePath(configPath);\n\tconst dir = dirname(configPath);\n\tif (!existsSync(dir)) {\n\t\tmkdirSync(dir, { recursive: true, mode: 0o700 });\n\t}\n\tconst tempPath = join(\n\t\tdir,\n\t\t`.${basename(configPath)}.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2)}.tmp`,\n\t);\n\tlet fd: number | undefined = openSync(tempPath, \"wx\", 0o600);\n\ttry {\n\t\twriteFileSync(fd, `${JSON.stringify(data, null, 2)}\\n`, \"utf-8\");\n\t\tcloseSync(fd);\n\t\tfd = undefined;\n\t\tchmodSync(tempPath, 0o600);\n\t\trenameSync(tempPath, configPath);\n\t\tchmodSync(configPath, 0o600);\n\t} finally {\n\t\tif (fd !== undefined) {\n\t\t\tcloseSync(fd);\n\t\t}\n\t\tif (existsSync(tempPath)) {\n\t\t\trmSync(tempPath, { force: true });\n\t\t}\n\t}\n}\n\nfunction clearPrimeTeamFields(data: Record<string, unknown>): void {\n\tdelete data.team_id;\n\tdelete data.team_name;\n\tdelete data.team_role;\n}\n\nexport function loadPrimeCliConfig(configPath: string = defaultPrimeCliConfigPath()): PrimeCliConfig {\n\tconst data = readPrimeCliConfigData(configPath);\n\tconst teamIdFromEnv = stringEnv(\"PRIME_TEAM_ID\");\n\tconst teamId = teamIdFromEnv ?? stringField(data, \"team_id\");\n\n\tconst config: PrimeCliConfig = {\n\t\tbaseUrl: normalizeBaseUrl(stringField(data, \"base_url\")),\n\t\tfrontendUrl: normalizeUrl(stringField(data, \"frontend_url\"), DEFAULT_PRIME_FRONTEND_URL),\n\t\tinferenceUrl: normalizeUrl(stringField(data, \"inference_url\"), DEFAULT_PRIME_INFERENCE_URL),\n\t\tpath: configPath,\n\t\tteamIdFromEnv: teamIdFromEnv !== undefined,\n\t};\n\tconst apiKey = stringField(data, \"api_key\");\n\tif (apiKey) {\n\t\tconfig.apiKey = apiKey;\n\t}\n\tif (teamId) {\n\t\tconfig.teamId = teamId;\n\t}\n\tif (!teamIdFromEnv) {\n\t\tconst teamName = stringField(data, \"team_name\");\n\t\tconst teamRole = stringField(data, \"team_role\");\n\t\tif (teamName) {\n\t\t\tconfig.teamName = teamName;\n\t\t}\n\t\tif (teamRole) {\n\t\t\tconfig.teamRole = teamRole;\n\t\t}\n\t}\n\treturn config;\n}\n\nexport function savePrimeCliApiKey(apiKey: string, configPath: string = defaultPrimeCliConfigPath()): PrimeCliConfig {\n\tconst data = readPrimeCliConfigData(configPath);\n\tdata.api_key = apiKey;\n\tclearPrimeTeamFields(data);\n\twritePrimeCliConfigData(configPath, data);\n\treturn loadPrimeCliConfig(configPath);\n}\n\nexport function clearPrimeCliCredentials(configPath: string = defaultPrimeCliConfigPath()): PrimeCliConfig {\n\tconst data = readPrimeCliConfigData(configPath);\n\tdelete data.api_key;\n\tclearPrimeTeamFields(data);\n\twritePrimeCliConfigData(configPath, data);\n\treturn loadPrimeCliConfig(configPath);\n}\n\nexport function savePrimeCliTeamSelection(\n\tteam: PrimeTeam | null,\n\tconfigPath: string = defaultPrimeCliConfigPath(),\n): PrimeCliConfig {\n\tconst data = readPrimeCliConfigData(configPath);\n\tif (team) {\n\t\tdata.team_id = team.teamId;\n\t\tdata.team_name = team.name;\n\t\tif (team.role) {\n\t\t\tdata.team_role = team.role;\n\t\t} else {\n\t\t\tdelete data.team_role;\n\t\t}\n\t} else {\n\t\tclearPrimeTeamFields(data);\n\t}\n\twritePrimeCliConfigData(configPath, data);\n\treturn loadPrimeCliConfig(configPath);\n}\n\nexport function resolvePrimeAgentTracesBaseUrl(baseUrl?: string): string | undefined {\n\tconst configuredBaseUrl = baseUrl?.trim() || stringEnv(\"BASE_CONTEXT_TRACES_BASE_URL\");\n\treturn configuredBaseUrl ? normalizeBaseUrl(configuredBaseUrl) : undefined;\n}\n\nfunction throwIfCancelled(signal?: AbortSignal): void {\n\tif (signal?.aborted) {\n\t\tthrow new Error(\"Login cancelled\");\n\t}\n}\n\nasync function fetchWithTimeout(\n\tfetchFn: typeof fetch,\n\turl: string | URL,\n\tinit: RequestInit,\n\ttimeoutMs: number,\n\tsignal?: AbortSignal,\n): Promise<Response> {\n\tthrowIfCancelled(signal);\n\n\tconst controller = new AbortController();\n\tconst timeout = setTimeout(() => controller.abort(), timeoutMs);\n\tconst onAbort = () => controller.abort();\n\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\ttry {\n\t\treturn await fetchFn(url, { ...init, signal: controller.signal });\n\t} catch (error) {\n\t\tif (signal?.aborted) {\n\t\t\tthrow new Error(\"Login cancelled\");\n\t\t}\n\t\tif (controller.signal.aborted) {\n\t\t\tthrow new Error(\"Prime Inference request timed out\");\n\t\t}\n\t\tthrow error;\n\t} finally {\n\t\tclearTimeout(timeout);\n\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t}\n}\n\nasync function readResponseMessage(response: Response): Promise<string> {\n\tconst text = await response.text().catch(() => \"\");\n\tif (!text.trim()) {\n\t\treturn response.statusText || \"Unknown error\";\n\t}\n\n\ttry {\n\t\tconst parsed = JSON.parse(text) as unknown;\n\t\tif (isRecord(parsed)) {\n\t\t\tconst error = parsed.error;\n\t\t\tif (isRecord(error)) {\n\t\t\t\tconst message = stringField(error, \"message\");\n\t\t\t\tif (message) return message;\n\t\t\t}\n\t\t\tconst detail = stringField(parsed, \"detail\");\n\t\t\tif (detail) return detail;\n\t\t\tconst message = stringField(parsed, \"message\");\n\t\t\tif (message) return message;\n\t\t}\n\t} catch {\n\t\t// Fall back to raw text.\n\t}\n\n\treturn text.trim();\n}\n\nasync function readJsonObject(response: Response, context: string): Promise<Record<string, unknown>> {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = (await response.json()) as unknown;\n\t} catch {\n\t\tthrow new Error(`${context} returned an invalid response`);\n\t}\n\tif (!isRecord(parsed)) {\n\t\tthrow new Error(`${context} returned an invalid response`);\n\t}\n\treturn parsed;\n}\n\nfunction parsePrimeTeam(value: unknown): PrimeTeam | undefined {\n\tif (!isRecord(value)) {\n\t\treturn undefined;\n\t}\n\tconst teamId = stringField(value, \"teamId\");\n\tif (!teamId) {\n\t\treturn undefined;\n\t}\n\n\tconst team: PrimeTeam = {\n\t\tteamId,\n\t\tname: stringField(value, \"name\") ?? \"Unknown\",\n\t};\n\tconst slug = stringField(value, \"slug\");\n\tconst role = stringField(value, \"role\");\n\tconst createdAt = stringField(value, \"createdAt\");\n\tif (slug) {\n\t\tteam.slug = slug;\n\t}\n\tif (role) {\n\t\tteam.role = role;\n\t}\n\tif (createdAt) {\n\t\tteam.createdAt = createdAt;\n\t}\n\treturn team;\n}\n\nexport async function fetchPrimeTeams(\n\tapiKey: string,\n\tbaseUrl: string,\n\toptions: {\n\t\tfetchFn?: typeof fetch;\n\t\trequestTimeoutMs?: number;\n\t\tsignal?: AbortSignal;\n\t} = {},\n): Promise<PrimeTeam[]> {\n\tconst fetchFn = options.fetchFn ?? fetch;\n\tconst requestTimeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n\tconst teams: PrimeTeam[] = [];\n\tlet offset = 0;\n\tconst limit = 100;\n\n\twhile (true) {\n\t\tconst url = new URL(`${normalizeBaseUrl(baseUrl)}/api/v1/user/teams`);\n\t\turl.searchParams.set(\"offset\", String(offset));\n\t\turl.searchParams.set(\"limit\", String(limit));\n\t\tconst response = await fetchWithTimeout(\n\t\t\tfetchFn,\n\t\t\turl,\n\t\t\t{\n\t\t\t\tmethod: \"GET\",\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\t\tAccept: \"application/json\",\n\t\t\t\t},\n\t\t\t},\n\t\t\trequestTimeoutMs,\n\t\t\toptions.signal,\n\t\t);\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Failed to fetch Prime teams: ${await readResponseMessage(response)}`);\n\t\t}\n\n\t\tconst data = await readJsonObject(response, \"Prime teams\");\n\t\tconst batch = data.data;\n\t\tif (!Array.isArray(batch)) {\n\t\t\tthrow new Error(\"Prime teams response missing team data\");\n\t\t}\n\n\t\tfor (const item of batch) {\n\t\t\tconst team = parsePrimeTeam(item);\n\t\t\tif (team) {\n\t\t\t\tteams.push(team);\n\t\t\t}\n\t\t}\n\n\t\tconst totalCount = numberField(data, \"total_count\") ?? teams.length;\n\t\tif (batch.length === 0 || teams.length >= totalCount) {\n\t\t\tbreak;\n\t\t}\n\t\toffset += limit;\n\t}\n\n\treturn teams;\n}\n\nasync function checkPrimeScopeAccess(\n\tapiKey: string,\n\tbaseUrl: string,\n\tscopeName: PrimeAccessScope,\n\tscopeLabel: string,\n\toptions: {\n\t\tfetchFn?: typeof fetch;\n\t\trequestTimeoutMs?: number;\n\t\tsignal?: AbortSignal;\n\t} = {},\n): Promise<PrimeInferenceAccessResult> {\n\tconst fetchFn = options.fetchFn ?? fetch;\n\tconst requestTimeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n\tconst url = `${normalizeBaseUrl(baseUrl)}/api/v1/user/whoami`;\n\tconst response = await fetchWithTimeout(\n\t\tfetchFn,\n\t\turl,\n\t\t{\n\t\t\tmethod: \"GET\",\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\tAccept: \"application/json\",\n\t\t\t},\n\t\t},\n\t\trequestTimeoutMs,\n\t\toptions.signal,\n\t);\n\n\tif (!response.ok) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\tstatus: response.status,\n\t\t\tmessage: await readResponseMessage(response),\n\t\t};\n\t}\n\n\tconst data = await readJsonObject(response, \"Prime whoami\");\n\tconst user = data.data;\n\tif (!isRecord(user)) {\n\t\treturn { ok: false, message: \"Prime whoami response missing user data\" };\n\t}\n\n\tconst scope = user.scope;\n\tif (!isRecord(scope)) {\n\t\treturn { ok: false, message: \"Prime token is missing permission scope data\" };\n\t}\n\n\tconst scopedPermission = scope[scopeName];\n\tif (!isRecord(scopedPermission)) {\n\t\treturn { ok: false, message: `Prime token is missing ${scopeLabel} permissions` };\n\t}\n\n\tif (scopedPermission.write === true) {\n\t\treturn { ok: true };\n\t}\n\n\treturn { ok: false, message: `Prime token does not have ${scopeLabel} write permission` };\n}\n\nexport async function checkPrimeInferenceAccess(\n\tapiKey: string,\n\tbaseUrl: string,\n\toptions: {\n\t\tfetchFn?: typeof fetch;\n\t\trequestTimeoutMs?: number;\n\t\tsignal?: AbortSignal;\n\t} = {},\n): Promise<PrimeInferenceAccessResult> {\n\treturn checkPrimeScopeAccess(apiKey, baseUrl, \"inference\", \"inference\", options);\n}\n\nexport async function checkPrimeAgentTracesAccess(\n\tapiKey: string,\n\tbaseUrl: string,\n\toptions: {\n\t\tfetchFn?: typeof fetch;\n\t\trequestTimeoutMs?: number;\n\t\tsignal?: AbortSignal;\n\t} = {},\n): Promise<PrimeInferenceAccessResult> {\n\treturn checkPrimeScopeAccess(apiKey, baseUrl, \"agent_traces\", \"agent trace\", options);\n}\n\nfunction formatAccessFailure(result: Exclude<PrimeInferenceAccessResult, { ok: true }>): string {\n\tconst status = result.status === undefined ? \"\" : `HTTP ${result.status}: `;\n\treturn `${status}${result.message}`;\n}\n\nexport async function loginPrimeInference(\n\tcallbacks: PrimeInferenceLoginCallbacks,\n\toptions: PrimeInferenceLoginOptions = {},\n): Promise<PrimeInferenceLoginResult> {\n\tthrowIfCancelled(callbacks.signal);\n\tconst config = loadPrimeCliConfig(options.configPath);\n\tconst apiKey = options.apiKey?.trim() || stringEnv(\"PRIME_API_KEY\") || config.apiKey;\n\tif (!apiKey) {\n\t\tthrow new Error(\n\t\t\t\"Base Context does not support Prime browser sign-in. Use /login to enter a Prime Inference API key, or set PRIME_API_KEY.\",\n\t\t);\n\t}\n\n\tcallbacks.onProgress?.(\"Checking Prime Inference access...\");\n\tconst access = await checkPrimeInferenceAccess(apiKey, config.baseUrl, {\n\t\tfetchFn: options.fetchFn,\n\t\trequestTimeoutMs: options.requestTimeoutMs,\n\t\tsignal: callbacks.signal,\n\t});\n\tif (!access.ok) {\n\t\tthrow new Error(`Prime API key does not have Prime Inference access (${formatAccessFailure(access)})`);\n\t}\n\n\tthrowIfCancelled(callbacks.signal);\n\treturn { apiKey, source: \"api-key\" };\n}\n\nexport async function loginPrimeAgentTraces(\n\t_callbacks: PrimeInferenceLoginCallbacks,\n\t_options: PrimeInferenceLoginOptions = {},\n): Promise<PrimeInferenceLoginResult> {\n\tthrow new Error(\n\t\t\"Base Context trace browser sign-in is not configured. Set BASE_CONTEXT_TRACES_BASE_URL and a dedicated BASE_CONTEXT_TRACES_API_KEY; Prime Inference credentials are not used for traces.\",\n\t);\n}\n"]}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { Api, Model } from "@ponythewhite/base-context-ai";
|
|
2
|
-
import type { ModelRegistry } from "./model-registry.js";
|
|
3
|
-
type ProviderLoginResult = {
|
|
4
|
-
status: "success";
|
|
5
|
-
providerId: string;
|
|
6
|
-
kind?: "provider" | "service";
|
|
7
|
-
} | {
|
|
8
|
-
status: "cancelled" | "failed";
|
|
9
|
-
};
|
|
10
|
-
export interface PrimeInferencePostLoginModelAction {
|
|
11
|
-
openModelPicker: boolean;
|
|
12
|
-
fallbackModel?: Model<Api>;
|
|
13
|
-
}
|
|
14
|
-
export declare function resolvePrimeInferencePostLoginModelAction(authResult: ProviderLoginResult, currentModel: Model<Api> | undefined, modelRegistry: Pick<ModelRegistry, "find">): PrimeInferencePostLoginModelAction;
|
|
15
|
-
export {};
|
|
16
|
-
//# sourceMappingURL=prime-inference-model-selection.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prime-inference-model-selection.d.ts","sourceRoot":"","sources":["../../src/core/prime-inference-model-selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIzD,KAAK,mBAAmB,GACrB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,UAAU,GAAG,SAAS,CAAA;CAAE,GACxE;IAAE,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAA;CAAE,CAAC;AAEtC,MAAM,WAAW,kCAAkC;IAClD,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;CAC3B;AAED,wBAAgB,yCAAyC,CACxD,UAAU,EAAE,mBAAmB,EAC/B,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,EACpC,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GACxC,kCAAkC,CAepC","sourcesContent":["import type { Api, Model } from \"@ponythewhite/base-context-ai\";\nimport type { ModelRegistry } from \"./model-registry.js\";\nimport { PRIME_INFERENCE_DEFAULT_MODEL_ID } from \"./model-resolver.js\";\nimport { PRIME_INFERENCE_PROVIDER_ID } from \"./prime-inference-auth.js\";\n\ntype ProviderLoginResult =\n\t| { status: \"success\"; providerId: string; kind?: \"provider\" | \"service\" }\n\t| { status: \"cancelled\" | \"failed\" };\n\nexport interface PrimeInferencePostLoginModelAction {\n\topenModelPicker: boolean;\n\tfallbackModel?: Model<Api>;\n}\n\nexport function resolvePrimeInferencePostLoginModelAction(\n\tauthResult: ProviderLoginResult,\n\tcurrentModel: Model<Api> | undefined,\n\tmodelRegistry: Pick<ModelRegistry, \"find\">,\n): PrimeInferencePostLoginModelAction {\n\tif (\n\t\tauthResult.status !== \"success\" ||\n\t\tauthResult.kind === \"service\" ||\n\t\tauthResult.providerId !== PRIME_INFERENCE_PROVIDER_ID\n\t) {\n\t\treturn { openModelPicker: false };\n\t}\n\n\treturn {\n\t\topenModelPicker: true,\n\t\tfallbackModel: currentModel\n\t\t\t? undefined\n\t\t\t: modelRegistry.find(PRIME_INFERENCE_PROVIDER_ID, PRIME_INFERENCE_DEFAULT_MODEL_ID),\n\t};\n}\n"]}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { PRIME_INFERENCE_DEFAULT_MODEL_ID } from "./model-resolver.js";
|
|
2
|
-
import { PRIME_INFERENCE_PROVIDER_ID } from "./prime-inference-auth.js";
|
|
3
|
-
export function resolvePrimeInferencePostLoginModelAction(authResult, currentModel, modelRegistry) {
|
|
4
|
-
if (authResult.status !== "success" ||
|
|
5
|
-
authResult.kind === "service" ||
|
|
6
|
-
authResult.providerId !== PRIME_INFERENCE_PROVIDER_ID) {
|
|
7
|
-
return { openModelPicker: false };
|
|
8
|
-
}
|
|
9
|
-
return {
|
|
10
|
-
openModelPicker: true,
|
|
11
|
-
fallbackModel: currentModel
|
|
12
|
-
? undefined
|
|
13
|
-
: modelRegistry.find(PRIME_INFERENCE_PROVIDER_ID, PRIME_INFERENCE_DEFAULT_MODEL_ID),
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=prime-inference-model-selection.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prime-inference-model-selection.js","sourceRoot":"","sources":["../../src/core/prime-inference-model-selection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gCAAgC,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAWxE,MAAM,UAAU,yCAAyC,CACxD,UAA+B,EAC/B,YAAoC,EACpC,aAA0C,EACL;IACrC,IACC,UAAU,CAAC,MAAM,KAAK,SAAS;QAC/B,UAAU,CAAC,IAAI,KAAK,SAAS;QAC7B,UAAU,CAAC,UAAU,KAAK,2BAA2B,EACpD,CAAC;QACF,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IACnC,CAAC;IAED,OAAO;QACN,eAAe,EAAE,IAAI;QACrB,aAAa,EAAE,YAAY;YAC1B,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,2BAA2B,EAAE,gCAAgC,CAAC;KACpF,CAAC;AAAA,CACF","sourcesContent":["import type { Api, Model } from \"@ponythewhite/base-context-ai\";\nimport type { ModelRegistry } from \"./model-registry.js\";\nimport { PRIME_INFERENCE_DEFAULT_MODEL_ID } from \"./model-resolver.js\";\nimport { PRIME_INFERENCE_PROVIDER_ID } from \"./prime-inference-auth.js\";\n\ntype ProviderLoginResult =\n\t| { status: \"success\"; providerId: string; kind?: \"provider\" | \"service\" }\n\t| { status: \"cancelled\" | \"failed\" };\n\nexport interface PrimeInferencePostLoginModelAction {\n\topenModelPicker: boolean;\n\tfallbackModel?: Model<Api>;\n}\n\nexport function resolvePrimeInferencePostLoginModelAction(\n\tauthResult: ProviderLoginResult,\n\tcurrentModel: Model<Api> | undefined,\n\tmodelRegistry: Pick<ModelRegistry, \"find\">,\n): PrimeInferencePostLoginModelAction {\n\tif (\n\t\tauthResult.status !== \"success\" ||\n\t\tauthResult.kind === \"service\" ||\n\t\tauthResult.providerId !== PRIME_INFERENCE_PROVIDER_ID\n\t) {\n\t\treturn { openModelPicker: false };\n\t}\n\n\treturn {\n\t\topenModelPicker: true,\n\t\tfallbackModel: currentModel\n\t\t\t? undefined\n\t\t\t: modelRegistry.find(PRIME_INFERENCE_PROVIDER_ID, PRIME_INFERENCE_DEFAULT_MODEL_ID),\n\t};\n}\n"]}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { Model } from "@ponythewhite/base-context-ai";
|
|
2
|
-
export declare const PRIME_INFERENCE_BASE_URL = "https://api.pinference.ai/api/v1";
|
|
3
|
-
export declare function isPrivatePrimeInferenceModel(model: Pick<Model<string>, "provider" | "id">): boolean;
|
|
4
|
-
export declare function getPrivatePrimeInferenceModels(): Model<"openai-completions">[];
|
|
5
|
-
export declare function fetchAuthorizedPrivatePrimeInferenceModelIds(apiKey: string, teamHeaders: Record<string, string>, fetchFn?: typeof fetch, timeoutMs?: number): Promise<Set<string>>;
|
|
6
|
-
//# sourceMappingURL=prime-inference-models.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prime-inference-models.d.ts","sourceRoot":"","sources":["../../src/core/prime-inference-models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAE3D,eAAO,MAAM,wBAAwB,qCAAqC,CAAC;AAuB3E,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC,GAAG,OAAO,CAEnG;AAED,wBAAgB,8BAA8B,IAAI,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAO9E;AAED,wBAAsB,4CAA4C,CACjE,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,OAAO,GAAE,OAAO,KAAa,EAC7B,SAAS,GAAE,MAAyC,GAClD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAiCtB","sourcesContent":["import type { Model } from \"@ponythewhite/base-context-ai\";\n\nexport const PRIME_INFERENCE_BASE_URL = \"https://api.pinference.ai/api/v1\";\nconst PRIVATE_MODEL_REFRESH_TIMEOUT_MS = 10_000;\n\nconst PRIVATE_PRIME_INFERENCE_MODELS: readonly Model<\"openai-completions\">[] = [\n\t{\n\t\tid: \"internal/glm-5.2-fast\",\n\t\tname: \"GLM 5.2 Fast\",\n\t\tapi: \"openai-completions\",\n\t\tprovider: \"prime-inference\",\n\t\tbaseUrl: PRIME_INFERENCE_BASE_URL,\n\t\treasoning: true,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: 400000,\n\t\tmaxTokens: 131072,\n\t\tfeatured: true,\n\t\tcompat: {\n\t\t\tsupportsDeveloperRole: false,\n\t\t\tmaxTokensField: \"max_tokens\",\n\t\t},\n\t},\n];\n\nexport function isPrivatePrimeInferenceModel(model: Pick<Model<string>, \"provider\" | \"id\">): boolean {\n\treturn model.provider === \"prime-inference\" && model.id.startsWith(\"internal/\");\n}\n\nexport function getPrivatePrimeInferenceModels(): Model<\"openai-completions\">[] {\n\treturn PRIVATE_PRIME_INFERENCE_MODELS.map((model) => ({\n\t\t...model,\n\t\tinput: [...model.input],\n\t\tcost: { ...model.cost },\n\t\tcompat: model.compat ? { ...model.compat } : undefined,\n\t}));\n}\n\nexport async function fetchAuthorizedPrivatePrimeInferenceModelIds(\n\tapiKey: string,\n\tteamHeaders: Record<string, string>,\n\tfetchFn: typeof fetch = fetch,\n\ttimeoutMs: number = PRIVATE_MODEL_REFRESH_TIMEOUT_MS,\n): Promise<Set<string>> {\n\tif (!teamHeaders[\"X-Prime-Team-ID\"]) {\n\t\treturn new Set();\n\t}\n\n\tconst response = await fetchFn(`${PRIME_INFERENCE_BASE_URL}/models`, {\n\t\theaders: {\n\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t...teamHeaders,\n\t\t},\n\t\tsignal: AbortSignal.timeout(timeoutMs),\n\t});\n\tif (response.status === 401 || response.status === 403) {\n\t\treturn new Set();\n\t}\n\tif (!response.ok) {\n\t\tthrow new Error(`Prime Inference model catalog request failed with status ${response.status}`);\n\t}\n\n\tconst payload = (await response.json()) as unknown;\n\tif (!payload || typeof payload !== \"object\" || !(\"data\" in payload) || !Array.isArray(payload.data)) {\n\t\tthrow new Error(\"Prime Inference model catalog response is invalid\");\n\t}\n\n\tconst knownPrivateIds = new Set(PRIVATE_PRIME_INFERENCE_MODELS.map((model) => model.id));\n\treturn new Set(\n\t\tpayload.data.flatMap((entry) => {\n\t\t\tif (!entry || typeof entry !== \"object\" || !(\"id\" in entry) || typeof entry.id !== \"string\") {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\treturn knownPrivateIds.has(entry.id) ? [entry.id] : [];\n\t\t}),\n\t);\n}\n"]}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
export const PRIME_INFERENCE_BASE_URL = "https://api.pinference.ai/api/v1";
|
|
2
|
-
const PRIVATE_MODEL_REFRESH_TIMEOUT_MS = 10_000;
|
|
3
|
-
const PRIVATE_PRIME_INFERENCE_MODELS = [
|
|
4
|
-
{
|
|
5
|
-
id: "internal/glm-5.2-fast",
|
|
6
|
-
name: "GLM 5.2 Fast",
|
|
7
|
-
api: "openai-completions",
|
|
8
|
-
provider: "prime-inference",
|
|
9
|
-
baseUrl: PRIME_INFERENCE_BASE_URL,
|
|
10
|
-
reasoning: true,
|
|
11
|
-
input: ["text"],
|
|
12
|
-
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
13
|
-
contextWindow: 400000,
|
|
14
|
-
maxTokens: 131072,
|
|
15
|
-
featured: true,
|
|
16
|
-
compat: {
|
|
17
|
-
supportsDeveloperRole: false,
|
|
18
|
-
maxTokensField: "max_tokens",
|
|
19
|
-
},
|
|
20
|
-
},
|
|
21
|
-
];
|
|
22
|
-
export function isPrivatePrimeInferenceModel(model) {
|
|
23
|
-
return model.provider === "prime-inference" && model.id.startsWith("internal/");
|
|
24
|
-
}
|
|
25
|
-
export function getPrivatePrimeInferenceModels() {
|
|
26
|
-
return PRIVATE_PRIME_INFERENCE_MODELS.map((model) => ({
|
|
27
|
-
...model,
|
|
28
|
-
input: [...model.input],
|
|
29
|
-
cost: { ...model.cost },
|
|
30
|
-
compat: model.compat ? { ...model.compat } : undefined,
|
|
31
|
-
}));
|
|
32
|
-
}
|
|
33
|
-
export async function fetchAuthorizedPrivatePrimeInferenceModelIds(apiKey, teamHeaders, fetchFn = fetch, timeoutMs = PRIVATE_MODEL_REFRESH_TIMEOUT_MS) {
|
|
34
|
-
if (!teamHeaders["X-Prime-Team-ID"]) {
|
|
35
|
-
return new Set();
|
|
36
|
-
}
|
|
37
|
-
const response = await fetchFn(`${PRIME_INFERENCE_BASE_URL}/models`, {
|
|
38
|
-
headers: {
|
|
39
|
-
Authorization: `Bearer ${apiKey}`,
|
|
40
|
-
...teamHeaders,
|
|
41
|
-
},
|
|
42
|
-
signal: AbortSignal.timeout(timeoutMs),
|
|
43
|
-
});
|
|
44
|
-
if (response.status === 401 || response.status === 403) {
|
|
45
|
-
return new Set();
|
|
46
|
-
}
|
|
47
|
-
if (!response.ok) {
|
|
48
|
-
throw new Error(`Prime Inference model catalog request failed with status ${response.status}`);
|
|
49
|
-
}
|
|
50
|
-
const payload = (await response.json());
|
|
51
|
-
if (!payload || typeof payload !== "object" || !("data" in payload) || !Array.isArray(payload.data)) {
|
|
52
|
-
throw new Error("Prime Inference model catalog response is invalid");
|
|
53
|
-
}
|
|
54
|
-
const knownPrivateIds = new Set(PRIVATE_PRIME_INFERENCE_MODELS.map((model) => model.id));
|
|
55
|
-
return new Set(payload.data.flatMap((entry) => {
|
|
56
|
-
if (!entry || typeof entry !== "object" || !("id" in entry) || typeof entry.id !== "string") {
|
|
57
|
-
return [];
|
|
58
|
-
}
|
|
59
|
-
return knownPrivateIds.has(entry.id) ? [entry.id] : [];
|
|
60
|
-
}));
|
|
61
|
-
}
|
|
62
|
-
//# sourceMappingURL=prime-inference-models.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prime-inference-models.js","sourceRoot":"","sources":["../../src/core/prime-inference-models.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Model } from \"@ponythewhite/base-context-ai\";\n\nexport const PRIME_INFERENCE_BASE_URL = \"https://api.pinference.ai/api/v1\";\nconst PRIVATE_MODEL_REFRESH_TIMEOUT_MS = 10_000;\n\nconst PRIVATE_PRIME_INFERENCE_MODELS: readonly Model<\"openai-completions\">[] = [\n\t{\n\t\tid: \"internal/glm-5.2-fast\",\n\t\tname: \"GLM 5.2 Fast\",\n\t\tapi: \"openai-completions\",\n\t\tprovider: \"prime-inference\",\n\t\tbaseUrl: PRIME_INFERENCE_BASE_URL,\n\t\treasoning: true,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: 400000,\n\t\tmaxTokens: 131072,\n\t\tfeatured: true,\n\t\tcompat: {\n\t\t\tsupportsDeveloperRole: false,\n\t\t\tmaxTokensField: \"max_tokens\",\n\t\t},\n\t},\n];\n\nexport function isPrivatePrimeInferenceModel(model: Pick<Model<string>, \"provider\" | \"id\">): boolean {\n\treturn model.provider === \"prime-inference\" && model.id.startsWith(\"internal/\");\n}\n\nexport function getPrivatePrimeInferenceModels(): Model<\"openai-completions\">[] {\n\treturn PRIVATE_PRIME_INFERENCE_MODELS.map((model) => ({\n\t\t...model,\n\t\tinput: [...model.input],\n\t\tcost: { ...model.cost },\n\t\tcompat: model.compat ? { ...model.compat } : undefined,\n\t}));\n}\n\nexport async function fetchAuthorizedPrivatePrimeInferenceModelIds(\n\tapiKey: string,\n\tteamHeaders: Record<string, string>,\n\tfetchFn: typeof fetch = fetch,\n\ttimeoutMs: number = PRIVATE_MODEL_REFRESH_TIMEOUT_MS,\n): Promise<Set<string>> {\n\tif (!teamHeaders[\"X-Prime-Team-ID\"]) {\n\t\treturn new Set();\n\t}\n\n\tconst response = await fetchFn(`${PRIME_INFERENCE_BASE_URL}/models`, {\n\t\theaders: {\n\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t...teamHeaders,\n\t\t},\n\t\tsignal: AbortSignal.timeout(timeoutMs),\n\t});\n\tif (response.status === 401 || response.status === 403) {\n\t\treturn new Set();\n\t}\n\tif (!response.ok) {\n\t\tthrow new Error(`Prime Inference model catalog request failed with status ${response.status}`);\n\t}\n\n\tconst payload = (await response.json()) as unknown;\n\tif (!payload || typeof payload !== \"object\" || !(\"data\" in payload) || !Array.isArray(payload.data)) {\n\t\tthrow new Error(\"Prime Inference model catalog response is invalid\");\n\t}\n\n\tconst knownPrivateIds = new Set(PRIVATE_PRIME_INFERENCE_MODELS.map((model) => model.id));\n\treturn new Set(\n\t\tpayload.data.flatMap((entry) => {\n\t\t\tif (!entry || typeof entry !== \"object\" || !(\"id\" in entry) || typeof entry.id !== \"string\") {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\treturn knownPrivateIds.has(entry.id) ? [entry.id] : [];\n\t\t}),\n\t);\n}\n"]}
|
package/dist/core/telemetry.d.ts
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import type { AgentSession } from "./agent-session.js";
|
|
2
|
-
import type { AgentExecutionMode } from "./agent-session-config.js";
|
|
3
|
-
import type { AuthCredential, AuthStatus } from "./auth-storage.js";
|
|
4
|
-
import type { SettingsManager } from "./settings-manager.js";
|
|
5
|
-
type TelemetryPrimitive = string | number | boolean | null;
|
|
6
|
-
type TelemetryProperties = Record<string, TelemetryPrimitive>;
|
|
7
|
-
export type TelemetryEventName = "agent started" | "onboarding completed" | "agent command used" | "agent run completed" | "agent session ended";
|
|
8
|
-
export type TelemetryExecutionMode = AgentExecutionMode | "unknown";
|
|
9
|
-
export type TelemetryOnboardingOutcome = "success" | "error" | "aborted";
|
|
10
|
-
export type TelemetryAuthCategory = "oauth" | "api_key" | "runtime_api_key" | "environment" | "prime_cli" | "models_json" | "fallback" | "stale" | "stored" | "none";
|
|
11
|
-
export interface TelemetryEvent {
|
|
12
|
-
id: string;
|
|
13
|
-
name: TelemetryEventName;
|
|
14
|
-
timestamp: string;
|
|
15
|
-
properties: TelemetryProperties;
|
|
16
|
-
}
|
|
17
|
-
export interface TelemetryBatch {
|
|
18
|
-
installation_id: string;
|
|
19
|
-
events: TelemetryEvent[];
|
|
20
|
-
}
|
|
21
|
-
export interface TelemetrySink {
|
|
22
|
-
capture(name: TelemetryEventName, properties: TelemetryProperties): void;
|
|
23
|
-
flush(): Promise<void>;
|
|
24
|
-
}
|
|
25
|
-
interface TelemetryClientOptions {
|
|
26
|
-
agentDir: string;
|
|
27
|
-
endpoint?: string;
|
|
28
|
-
/** Dedicated analytics credential; provider inference keys are never reused. */
|
|
29
|
-
apiKey?: string;
|
|
30
|
-
fetch?: typeof fetch;
|
|
31
|
-
now?: () => number;
|
|
32
|
-
randomId?: () => string;
|
|
33
|
-
batchSize?: number;
|
|
34
|
-
flushIntervalMs?: number;
|
|
35
|
-
requestTimeoutMs?: number;
|
|
36
|
-
}
|
|
37
|
-
interface InstallAgentTelemetryOptions {
|
|
38
|
-
agentDir: string;
|
|
39
|
-
settingsManager: SettingsManager;
|
|
40
|
-
executionMode?: AgentExecutionMode;
|
|
41
|
-
sink?: TelemetrySink;
|
|
42
|
-
now?: () => number;
|
|
43
|
-
randomId?: () => string;
|
|
44
|
-
}
|
|
45
|
-
export interface CaptureOnboardingCompletedOptions {
|
|
46
|
-
agentDir: string;
|
|
47
|
-
settingsManager: SettingsManager;
|
|
48
|
-
durationMs: number;
|
|
49
|
-
outcome: TelemetryOnboardingOutcome;
|
|
50
|
-
provider?: string;
|
|
51
|
-
authSource?: AuthStatus["source"];
|
|
52
|
-
storedCredentialType?: AuthCredential["type"];
|
|
53
|
-
sink?: TelemetrySink;
|
|
54
|
-
now?: () => number;
|
|
55
|
-
randomId?: () => string;
|
|
56
|
-
}
|
|
57
|
-
export interface CaptureAgentCommandUsedOptions {
|
|
58
|
-
agentDir: string;
|
|
59
|
-
settingsManager: SettingsManager;
|
|
60
|
-
commandName: string;
|
|
61
|
-
sink?: TelemetrySink;
|
|
62
|
-
now?: () => number;
|
|
63
|
-
randomId?: () => string;
|
|
64
|
-
}
|
|
65
|
-
export declare function isTelemetryEnabled(settingsManager: SettingsManager): boolean;
|
|
66
|
-
export declare function getOrCreateTelemetryInstallationId(agentDir: string, randomId?: () => string): string;
|
|
67
|
-
export declare class TelemetryClient implements TelemetrySink {
|
|
68
|
-
private readonly options;
|
|
69
|
-
private readonly endpoint;
|
|
70
|
-
private readonly apiKey;
|
|
71
|
-
private readonly fetchImpl;
|
|
72
|
-
private readonly now;
|
|
73
|
-
private readonly randomId;
|
|
74
|
-
private readonly batchSize;
|
|
75
|
-
private readonly flushIntervalMs;
|
|
76
|
-
private readonly requestTimeoutMs;
|
|
77
|
-
private installationId?;
|
|
78
|
-
private queue;
|
|
79
|
-
private flushTimer?;
|
|
80
|
-
private flushInFlight?;
|
|
81
|
-
private disabled;
|
|
82
|
-
constructor(options: TelemetryClientOptions);
|
|
83
|
-
capture(name: TelemetryEventName, properties: TelemetryProperties): void;
|
|
84
|
-
private scheduleFlush;
|
|
85
|
-
flush(): Promise<void>;
|
|
86
|
-
private drainQueue;
|
|
87
|
-
private send;
|
|
88
|
-
}
|
|
89
|
-
export declare function telemetryProviderCategory(provider: string | undefined): string;
|
|
90
|
-
export declare function telemetryAuthCategory(source: AuthStatus["source"], storedCredentialType?: AuthCredential["type"]): TelemetryAuthCategory;
|
|
91
|
-
export declare function captureOnboardingCompleted(options: CaptureOnboardingCompletedOptions): Promise<void>;
|
|
92
|
-
export declare function captureAgentCommandUsed(options: CaptureAgentCommandUsedOptions): Promise<void>;
|
|
93
|
-
export declare function installAgentTelemetry(session: AgentSession, options: InstallAgentTelemetryOptions): void;
|
|
94
|
-
export {};
|
|
95
|
-
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/core/telemetry.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { lstatSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { arch, platform } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { AssistantMessage, Usage } from \"@ponythewhite/base-context-ai\";\nimport { detectInstallMethod, VERSION } from \"../config.js\";\nimport { assertProductStatePath } from \"../runtime-paths.js\";\nimport type { AgentSession, AgentSessionEvent } from \"./agent-session.js\";\nimport type { AgentExecutionMode } from \"./agent-session-config.js\";\nimport type { AuthCredential, AuthStatus } from \"./auth-storage.js\";\nimport type { SettingsManager } from \"./settings-manager.js\";\nimport { isBuiltinSlashCommandName, resolveBuiltinSlashCommandName } from \"./slash-commands.js\";\n\nconst TELEMETRY_STATE_FILE = \"telemetry.json\";\nconst TELEMETRY_STATE_VERSION = 1;\nconst DEFAULT_BATCH_SIZE = 10;\nconst DEFAULT_FLUSH_INTERVAL_MS = 10_000;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 1_500;\n\ntype TelemetryPrimitive = string | number | boolean | null;\ntype TelemetryProperties = Record<string, TelemetryPrimitive>;\n\nexport type TelemetryEventName =\n\t| \"agent started\"\n\t| \"onboarding completed\"\n\t| \"agent command used\"\n\t| \"agent run completed\"\n\t| \"agent session ended\";\n\nexport type TelemetryExecutionMode = AgentExecutionMode | \"unknown\";\nexport type TelemetryOnboardingOutcome = \"success\" | \"error\" | \"aborted\";\nexport type TelemetryAuthCategory =\n\t| \"oauth\"\n\t| \"api_key\"\n\t| \"runtime_api_key\"\n\t| \"environment\"\n\t| \"prime_cli\"\n\t| \"models_json\"\n\t| \"fallback\"\n\t| \"stale\"\n\t| \"stored\"\n\t| \"none\";\n\nexport interface TelemetryEvent {\n\tid: string;\n\tname: TelemetryEventName;\n\ttimestamp: string;\n\tproperties: TelemetryProperties;\n}\n\nexport interface TelemetryBatch {\n\tinstallation_id: string;\n\tevents: TelemetryEvent[];\n}\n\nexport interface TelemetrySink {\n\tcapture(name: TelemetryEventName, properties: TelemetryProperties): void;\n\tflush(): Promise<void>;\n}\n\ninterface TelemetryState {\n\tversion: number;\n\tinstallationId: string;\n}\n\ninterface TelemetryClientOptions {\n\tagentDir: string;\n\tendpoint?: string;\n\t/** Dedicated analytics credential; provider inference keys are never reused. */\n\tapiKey?: string;\n\tfetch?: typeof fetch;\n\tnow?: () => number;\n\trandomId?: () => string;\n\tbatchSize?: number;\n\tflushIntervalMs?: number;\n\trequestTimeoutMs?: number;\n}\n\ninterface InstallAgentTelemetryOptions {\n\tagentDir: string;\n\tsettingsManager: SettingsManager;\n\texecutionMode?: AgentExecutionMode;\n\tsink?: TelemetrySink;\n\tnow?: () => number;\n\trandomId?: () => string;\n}\n\nexport interface CaptureOnboardingCompletedOptions {\n\tagentDir: string;\n\tsettingsManager: SettingsManager;\n\tdurationMs: number;\n\toutcome: TelemetryOnboardingOutcome;\n\tprovider?: string;\n\tauthSource?: AuthStatus[\"source\"];\n\tstoredCredentialType?: AuthCredential[\"type\"];\n\tsink?: TelemetrySink;\n\tnow?: () => number;\n\trandomId?: () => string;\n}\n\nexport interface CaptureAgentCommandUsedOptions {\n\tagentDir: string;\n\tsettingsManager: SettingsManager;\n\tcommandName: string;\n\tsink?: TelemetrySink;\n\tnow?: () => number;\n\trandomId?: () => string;\n}\n\ninterface UsageTotals extends Usage {\n\tmodelCallCount: number;\n}\n\ninterface ActiveRun {\n\tstartedAt: number;\n\tagentEnded: boolean;\n\tfirstTurnStartedAt?: number;\n\tfirstModelEventMs?: number;\n\tvisibleTtftMs?: number;\n\tcurrentTurnStartedAt?: number;\n\tmodelLatencyMs: number;\n\tmaxModelLatencyMs: number;\n\tturnCount: number;\n\ttoolCallCount: number;\n\ttoolErrorCount: number;\n\tcompactionCount: number;\n\tretryCount: number;\n\tusage: UsageTotals;\n\tlastAssistant?: AssistantMessage;\n}\n\ninterface SessionTotals {\n\tstartedAt: number;\n\trunCount: number;\n\tsuccessfulRunCount: number;\n\tfailedRunCount: number;\n\tabortedRunCount: number;\n\tpromptCount: number;\n\ttoolCallCount: number;\n\tcompactionCount: number;\n\tusage: UsageTotals;\n}\n\nconst EMPTY_USAGE_TOTALS: UsageTotals = {\n\tinput: 0,\n\toutput: 0,\n\tcacheRead: 0,\n\tcacheWrite: 0,\n\ttotalTokens: 0,\n\tcost: {\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotal: 0,\n\t},\n\tmodelCallCount: 0,\n};\n\nfunction newUsageTotals(): UsageTotals {\n\treturn structuredClone(EMPTY_USAGE_TOTALS);\n}\n\nfunction addUsage(target: UsageTotals, usage: Usage): void {\n\ttarget.input += usage.input;\n\ttarget.output += usage.output;\n\ttarget.cacheRead += usage.cacheRead;\n\ttarget.cacheWrite += usage.cacheWrite;\n\ttarget.totalTokens += usage.totalTokens;\n\ttarget.cost.input += usage.cost.input;\n\ttarget.cost.output += usage.cost.output;\n\ttarget.cost.cacheRead += usage.cost.cacheRead;\n\ttarget.cost.cacheWrite += usage.cost.cacheWrite;\n\ttarget.cost.total += usage.cost.total;\n\ttarget.modelCallCount++;\n}\n\nfunction mergeUsage(target: UsageTotals, usage: UsageTotals): void {\n\ttarget.input += usage.input;\n\ttarget.output += usage.output;\n\ttarget.cacheRead += usage.cacheRead;\n\ttarget.cacheWrite += usage.cacheWrite;\n\ttarget.totalTokens += usage.totalTokens;\n\ttarget.cost.input += usage.cost.input;\n\ttarget.cost.output += usage.cost.output;\n\ttarget.cost.cacheRead += usage.cost.cacheRead;\n\ttarget.cost.cacheWrite += usage.cost.cacheWrite;\n\ttarget.cost.total += usage.cost.total;\n\ttarget.modelCallCount += usage.modelCallCount;\n}\n\nfunction parseBooleanOverride(value: string | undefined): boolean | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tconst normalized = value.trim().toLowerCase();\n\tif ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) {\n\t\treturn true;\n\t}\n\tif ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) {\n\t\treturn false;\n\t}\n\treturn undefined;\n}\n\nexport function isTelemetryEnabled(settingsManager: SettingsManager): boolean {\n\tif (parseBooleanOverride(process.env.BASE_CONTEXT_OFFLINE) === true) {\n\t\treturn false;\n\t}\n\tif (parseBooleanOverride(process.env.DO_NOT_TRACK) === true) {\n\t\treturn false;\n\t}\n\tconst override = parseBooleanOverride(process.env.BASE_CONTEXT_TELEMETRY);\n\tif (override !== undefined) {\n\t\treturn override;\n\t}\n\treturn settingsManager.getTelemetryEnabled();\n}\n\nfunction isInstallationId(value: unknown): value is string {\n\treturn (\n\t\ttypeof value === \"string\" &&\n\t\t/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)\n\t);\n}\n\nfunction readInstallationId(path: string): string | undefined {\n\ttry {\n\t\tconst parsed = JSON.parse(readFileSync(path, \"utf8\")) as Partial<TelemetryState>;\n\t\treturn parsed.version === TELEMETRY_STATE_VERSION && isInstallationId(parsed.installationId)\n\t\t\t? parsed.installationId\n\t\t\t: undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction writeTelemetryStateAtomically(path: string, state: TelemetryState): void {\n\tconst temporaryPath = `${path}.${process.pid}.${randomUUID()}.tmp`;\n\ttry {\n\t\twriteFileSync(temporaryPath, JSON.stringify(state, null, 2), {\n\t\t\tencoding: \"utf8\",\n\t\t\tflag: \"wx\",\n\t\t\tmode: 0o600,\n\t\t});\n\t\trenameSync(temporaryPath, path);\n\t} finally {\n\t\ttry {\n\t\t\tunlinkSync(temporaryPath);\n\t\t} catch {\n\t\t\t// The rename succeeded or the temporary file was never created.\n\t\t}\n\t}\n}\n\nexport function getOrCreateTelemetryInstallationId(agentDir: string, randomId: () => string = randomUUID): string {\n\tconst path = assertProductStatePath(join(agentDir, TELEMETRY_STATE_FILE));\n\tlet replaceInvalidState = false;\n\ttry {\n\t\tconst stats = lstatSync(path);\n\t\tif (!stats.isFile()) {\n\t\t\tthrow new Error(\"Telemetry state path must be a regular file\");\n\t\t}\n\t\tconst existing = readInstallationId(path);\n\t\tif (existing) {\n\t\t\treturn existing;\n\t\t}\n\t\treplaceInvalidState = true;\n\t} catch (error) {\n\t\tconst code =\n\t\t\ttypeof error === \"object\" && error !== null && \"code\" in error\n\t\t\t\t? String((error as { code?: unknown }).code)\n\t\t\t\t: undefined;\n\t\tif (code !== \"ENOENT\") {\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tconst installationId = randomId();\n\tif (!isInstallationId(installationId)) {\n\t\tthrow new Error(\"Telemetry installation ID generator returned an invalid UUID\");\n\t}\n\tmkdirSync(agentDir, { recursive: true });\n\tconst state: TelemetryState = {\n\t\tversion: TELEMETRY_STATE_VERSION,\n\t\tinstallationId,\n\t};\n\ttry {\n\t\tif (replaceInvalidState) {\n\t\t\twriteTelemetryStateAtomically(path, state);\n\t\t} else {\n\t\t\twriteFileSync(path, JSON.stringify(state, null, 2), {\n\t\t\t\tencoding: \"utf8\",\n\t\t\t\tflag: \"wx\",\n\t\t\t\tmode: 0o600,\n\t\t\t});\n\t\t}\n\t\treturn installationId;\n\t} catch (error) {\n\t\tconst code =\n\t\t\ttypeof error === \"object\" && error !== null && \"code\" in error\n\t\t\t\t? String((error as { code?: unknown }).code)\n\t\t\t\t: undefined;\n\t\tif (code !== \"EEXIST\") {\n\t\t\tthrow error;\n\t\t}\n\t\treturn readInstallationId(path) ?? installationId;\n\t}\n}\n\nexport class TelemetryClient implements TelemetrySink {\n\tprivate readonly endpoint: string | undefined;\n\tprivate readonly apiKey: string | undefined;\n\tprivate readonly fetchImpl: typeof fetch;\n\tprivate readonly now: () => number;\n\tprivate readonly randomId: () => string;\n\tprivate readonly batchSize: number;\n\tprivate readonly flushIntervalMs: number;\n\tprivate readonly requestTimeoutMs: number;\n\tprivate installationId?: string;\n\tprivate queue: TelemetryEvent[] = [];\n\tprivate flushTimer?: ReturnType<typeof setTimeout>;\n\tprivate flushInFlight?: Promise<void>;\n\tprivate disabled = false;\n\n\tconstructor(private readonly options: TelemetryClientOptions) {\n\t\tthis.endpoint = (options.endpoint ?? process.env.BASE_CONTEXT_TELEMETRY_ENDPOINT)?.trim() || undefined;\n\t\tthis.apiKey = (options.apiKey ?? process.env.BASE_CONTEXT_TELEMETRY_API_KEY)?.trim() || undefined;\n\t\tthis.disabled = !this.endpoint || !this.apiKey;\n\t\tthis.fetchImpl = options.fetch ?? fetch;\n\t\tthis.now = options.now ?? Date.now;\n\t\tthis.randomId = options.randomId ?? randomUUID;\n\t\tthis.batchSize = options.batchSize ?? DEFAULT_BATCH_SIZE;\n\t\tthis.flushIntervalMs = options.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS;\n\t\tthis.requestTimeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n\t}\n\n\tcapture(name: TelemetryEventName, properties: TelemetryProperties): void {\n\t\tif (this.disabled) {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tthis.installationId ??= getOrCreateTelemetryInstallationId(this.options.agentDir, this.randomId);\n\t\t\tthis.queue.push({\n\t\t\t\tid: this.randomId(),\n\t\t\t\tname,\n\t\t\t\ttimestamp: new Date(this.now()).toISOString(),\n\t\t\t\tproperties,\n\t\t\t});\n\t\t} catch {\n\t\t\tthis.disabled = true;\n\t\t\tthis.queue = [];\n\t\t\treturn;\n\t\t}\n\t\tif (this.queue.length >= this.batchSize) {\n\t\t\tvoid this.flush();\n\t\t\treturn;\n\t\t}\n\t\tthis.scheduleFlush();\n\t}\n\n\tprivate scheduleFlush(): void {\n\t\tif (this.flushTimer) {\n\t\t\treturn;\n\t\t}\n\t\tthis.flushTimer = setTimeout(() => {\n\t\t\tthis.flushTimer = undefined;\n\t\t\tvoid this.flush();\n\t\t}, this.flushIntervalMs);\n\t\tthis.flushTimer.unref?.();\n\t}\n\n\tasync flush(): Promise<void> {\n\t\tif (this.flushTimer) {\n\t\t\tclearTimeout(this.flushTimer);\n\t\t\tthis.flushTimer = undefined;\n\t\t}\n\t\tif (this.flushInFlight) {\n\t\t\tawait this.flushInFlight;\n\t\t\tif (this.queue.length > 0) {\n\t\t\t\tawait this.flush();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (this.queue.length === 0 || !this.installationId) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst drain = this.drainQueue();\n\t\tthis.flushInFlight = drain;\n\t\ttry {\n\t\t\tawait drain;\n\t\t} finally {\n\t\t\tif (this.flushInFlight === drain) {\n\t\t\t\tthis.flushInFlight = undefined;\n\t\t\t}\n\t\t}\n\t\tif (this.queue.length > 0) {\n\t\t\tawait this.flush();\n\t\t}\n\t}\n\n\tprivate async drainQueue(): Promise<void> {\n\t\twhile (this.queue.length > 0 && this.installationId) {\n\t\t\tconst events = this.queue.splice(0, this.batchSize);\n\t\t\tconst batch: TelemetryBatch = {\n\t\t\t\tinstallation_id: this.installationId,\n\t\t\t\tevents,\n\t\t\t};\n\t\t\tawait this.send(batch);\n\t\t}\n\t}\n\n\tprivate async send(batch: TelemetryBatch): Promise<void> {\n\t\tif (!this.endpoint || !this.apiKey) return;\n\t\ttry {\n\t\t\tawait this.fetchImpl(this.endpoint, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"content-type\": \"application/json\",\n\t\t\t\t\t\"user-agent\": `base-context/${VERSION}`,\n\t\t\t\t\tauthorization: `Bearer ${this.apiKey}`,\n\t\t\t\t},\n\t\t\t\tredirect: \"error\",\n\t\t\t\tbody: JSON.stringify(batch),\n\t\t\t\tsignal: AbortSignal.timeout(this.requestTimeoutMs),\n\t\t\t});\n\t\t} catch {\n\t\t\t// Product analytics is best-effort and must never affect the agent.\n\t\t}\n\t}\n}\n\nfunction modelCategory(model: string): string {\n\tconst normalized = model.toLowerCase();\n\tconst categories = [\n\t\t\"claude\",\n\t\t\"gpt\",\n\t\t\"o1\",\n\t\t\"o3\",\n\t\t\"o4\",\n\t\t\"gemini\",\n\t\t\"glm\",\n\t\t\"kimi\",\n\t\t\"qwen\",\n\t\t\"deepseek\",\n\t\t\"llama\",\n\t\t\"mistral\",\n\t];\n\treturn categories.find((category) => normalized.includes(category)) ?? \"custom\";\n}\n\nexport function telemetryProviderCategory(provider: string | undefined): string {\n\tif (!provider) {\n\t\treturn \"unknown\";\n\t}\n\tconst normalized = provider.toLowerCase();\n\tconst categories = [\n\t\t\"anthropic\",\n\t\t\"openai\",\n\t\t\"google\",\n\t\t\"prime\",\n\t\t\"openrouter\",\n\t\t\"bedrock\",\n\t\t\"vertex\",\n\t\t\"mistral\",\n\t\t\"groq\",\n\t\t\"xai\",\n\t];\n\treturn categories.find((category) => normalized.includes(category)) ?? \"custom\";\n}\n\nexport function telemetryAuthCategory(\n\tsource: AuthStatus[\"source\"],\n\tstoredCredentialType?: AuthCredential[\"type\"],\n): TelemetryAuthCategory {\n\tswitch (source) {\n\t\tcase \"stored\":\n\t\t\treturn storedCredentialType ?? \"stored\";\n\t\tcase \"runtime\":\n\t\t\treturn \"runtime_api_key\";\n\t\tcase \"environment\":\n\t\t\treturn \"environment\";\n\t\tcase \"prime_cli\":\n\t\t\treturn \"prime_cli\";\n\t\tcase \"models_json_key\":\n\t\tcase \"models_json_command\":\n\t\t\treturn \"models_json\";\n\t\tcase \"fallback\":\n\t\t\treturn \"fallback\";\n\t\tcase \"stale\":\n\t\t\treturn \"stale\";\n\t\tdefault:\n\t\t\treturn \"none\";\n\t}\n}\n\nfunction baseProperties(executionMode: TelemetryExecutionMode): TelemetryProperties {\n\treturn {\n\t\tversion: VERSION,\n\t\tos_family: platform(),\n\t\tarchitecture: arch(),\n\t\tinstall_method: detectInstallMethod(),\n\t\texecution_mode: executionMode,\n\t};\n}\n\nexport async function captureOnboardingCompleted(options: CaptureOnboardingCompletedOptions): Promise<void> {\n\tif (!isTelemetryEnabled(options.settingsManager)) {\n\t\treturn;\n\t}\n\n\tconst now = options.now ?? Date.now;\n\tconst randomId = options.randomId ?? randomUUID;\n\tconst sink =\n\t\toptions.sink ??\n\t\tnew TelemetryClient({\n\t\t\tagentDir: options.agentDir,\n\t\t\tnow,\n\t\t\trandomId,\n\t\t});\n\tsink.capture(\"onboarding completed\", {\n\t\t...baseProperties(\"interactive\"),\n\t\tduration_ms: Math.max(0, options.durationMs),\n\t\toutcome: options.outcome,\n\t\tauth_category: telemetryAuthCategory(options.authSource, options.storedCredentialType),\n\t\tprovider_category: telemetryProviderCategory(options.provider),\n\t});\n\tawait sink.flush();\n}\n\nexport async function captureAgentCommandUsed(options: CaptureAgentCommandUsedOptions): Promise<void> {\n\tif (!isBuiltinSlashCommandName(options.commandName) || !isTelemetryEnabled(options.settingsManager)) {\n\t\treturn;\n\t}\n\tconst commandName = resolveBuiltinSlashCommandName(options.commandName);\n\n\tconst now = options.now ?? Date.now;\n\tconst randomId = options.randomId ?? randomUUID;\n\tconst sink =\n\t\toptions.sink ??\n\t\tnew TelemetryClient({\n\t\t\tagentDir: options.agentDir,\n\t\t\tnow,\n\t\t\trandomId,\n\t\t});\n\tsink.capture(\"agent command used\", {\n\t\t...baseProperties(\"interactive\"),\n\t\tcommand_name: commandName,\n\t});\n\tawait sink.flush();\n}\n\nfunction errorCategory(message: AssistantMessage | undefined): string | null {\n\tif (!message || message.stopReason !== \"error\") {\n\t\treturn null;\n\t}\n\tconst error = message.errorMessage?.toLowerCase() ?? \"\";\n\tif (/\\b401\\b|\\b403\\b|auth|api.?key|credential|unauthori[sz]ed|forbidden/.test(error)) {\n\t\treturn \"authentication\";\n\t}\n\tif (/\\b429\\b|rate.?limit|quota/.test(error)) {\n\t\treturn \"rate_limit\";\n\t}\n\tif (/timeout|timed out/.test(error)) {\n\t\treturn \"timeout\";\n\t}\n\tif (/context|token.*limit|too long|maximum.*length/.test(error)) {\n\t\treturn \"context_limit\";\n\t}\n\tif (/network|socket|connection|fetch/.test(error)) {\n\t\treturn \"network\";\n\t}\n\tif (/\\b5\\d\\d\\b|overload|unavailable/.test(error)) {\n\t\treturn \"provider_unavailable\";\n\t}\n\treturn \"other\";\n}\n\nfunction runOutcome(message: AssistantMessage | undefined): \"success\" | \"error\" | \"aborted\" {\n\tif (message?.stopReason === \"aborted\") {\n\t\treturn \"aborted\";\n\t}\n\tif (!message || message.stopReason === \"error\") {\n\t\treturn \"error\";\n\t}\n\treturn \"success\";\n}\n\nfunction assistantMessage(event: AgentSessionEvent): AssistantMessage | undefined {\n\tif (event.type !== \"message_end\" || event.message.role !== \"assistant\") {\n\t\treturn undefined;\n\t}\n\treturn event.message;\n}\n\nfunction createActiveRun(now: () => number): ActiveRun {\n\treturn {\n\t\tstartedAt: now(),\n\t\tagentEnded: false,\n\t\tmodelLatencyMs: 0,\n\t\tmaxModelLatencyMs: 0,\n\t\tturnCount: 0,\n\t\ttoolCallCount: 0,\n\t\ttoolErrorCount: 0,\n\t\tcompactionCount: 0,\n\t\tretryCount: 0,\n\t\tusage: newUsageTotals(),\n\t};\n}\n\nexport function installAgentTelemetry(session: AgentSession, options: InstallAgentTelemetryOptions): void {\n\tif (!isTelemetryEnabled(options.settingsManager)) {\n\t\treturn;\n\t}\n\n\tconst now = options.now ?? Date.now;\n\tconst randomId = options.randomId ?? randomUUID;\n\tconst sink =\n\t\toptions.sink ??\n\t\tnew TelemetryClient({\n\t\t\tagentDir: options.agentDir,\n\t\t\tnow,\n\t\t\trandomId,\n\t\t});\n\tconst sessionId = randomId();\n\tconst sessionTotals: SessionTotals = {\n\t\tstartedAt: now(),\n\t\trunCount: 0,\n\t\tsuccessfulRunCount: 0,\n\t\tfailedRunCount: 0,\n\t\tabortedRunCount: 0,\n\t\tpromptCount: 0,\n\t\ttoolCallCount: 0,\n\t\tcompactionCount: 0,\n\t\tusage: newUsageTotals(),\n\t};\n\tlet activeRun: ActiveRun | undefined;\n\tlet turnActionActive = false;\n\n\tconst commonProperties = (): TelemetryProperties => ({\n\t\t...baseProperties(options.executionMode ?? \"unknown\"),\n\t\tsession_id: sessionId,\n\t});\n\n\tconst finalizeRun = (): void => {\n\t\tconst run = activeRun;\n\t\tif (!run) {\n\t\t\treturn;\n\t\t}\n\t\tactiveRun = undefined;\n\t\tconst outcome = runOutcome(run.lastAssistant);\n\t\tsessionTotals.runCount++;\n\t\tsessionTotals.toolCallCount += run.toolCallCount;\n\t\tsessionTotals.compactionCount += run.compactionCount;\n\t\tif (outcome === \"success\") {\n\t\t\tsessionTotals.successfulRunCount++;\n\t\t} else if (outcome === \"aborted\") {\n\t\t\tsessionTotals.abortedRunCount++;\n\t\t} else {\n\t\t\tsessionTotals.failedRunCount++;\n\t\t}\n\t\tmergeUsage(sessionTotals.usage, run.usage);\n\t\tconst lastAssistant = run.lastAssistant;\n\t\tsink.capture(\"agent run completed\", {\n\t\t\t...commonProperties(),\n\t\t\toutcome,\n\t\t\tduration_ms: Math.max(0, now() - run.startedAt),\n\t\t\tvisible_ttft_ms: run.visibleTtftMs ?? null,\n\t\t\tfirst_model_event_ms: run.firstModelEventMs ?? null,\n\t\t\tmodel_latency_ms: run.modelLatencyMs,\n\t\t\tmax_model_latency_ms: run.maxModelLatencyMs,\n\t\t\tmodel_call_count: run.usage.modelCallCount,\n\t\t\tturn_count: run.turnCount,\n\t\t\ttool_call_count: run.toolCallCount,\n\t\t\ttool_error_count: run.toolErrorCount,\n\t\t\tinput_tokens: run.usage.input,\n\t\t\toutput_tokens: run.usage.output,\n\t\t\tcache_read_tokens: run.usage.cacheRead,\n\t\t\tcache_write_tokens: run.usage.cacheWrite,\n\t\t\ttotal_tokens: run.usage.totalTokens,\n\t\t\tcompaction_count: run.compactionCount,\n\t\t\tretry_count: run.retryCount,\n\t\t\tprovider_category: telemetryProviderCategory(lastAssistant?.provider),\n\t\t\tmodel_category: lastAssistant ? modelCategory(lastAssistant.model) : \"unknown\",\n\t\t\terror_category: errorCategory(lastAssistant),\n\t\t});\n\t};\n\n\tsink.capture(\"agent started\", commonProperties());\n\n\tconst unsubscribe = session.subscribe((event) => {\n\t\tswitch (event.type) {\n\t\t\tcase \"session_action_update\":\n\t\t\t\tturnActionActive = event.actions.active?.kind === \"turn\";\n\t\t\t\tif (!turnActionActive && activeRun?.agentEnded) {\n\t\t\t\t\tfinalizeRun();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"agent_start\":\n\t\t\t\tif (activeRun?.agentEnded && !turnActionActive) {\n\t\t\t\t\tfinalizeRun();\n\t\t\t\t}\n\t\t\t\tactiveRun ??= createActiveRun(now);\n\t\t\t\tactiveRun.agentEnded = false;\n\t\t\t\tbreak;\n\t\t\tcase \"message_start\":\n\t\t\t\tif (event.message.role === \"user\") {\n\t\t\t\t\tsessionTotals.promptCount++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"turn_start\":\n\t\t\t\tif (activeRun) {\n\t\t\t\t\tactiveRun.currentTurnStartedAt = now();\n\t\t\t\t\tactiveRun.firstTurnStartedAt ??= activeRun.currentTurnStartedAt;\n\t\t\t\t\tactiveRun.turnCount++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"message_update\":\n\t\t\t\tif (!activeRun) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (activeRun.firstModelEventMs === undefined && activeRun.firstTurnStartedAt !== undefined) {\n\t\t\t\t\tactiveRun.firstModelEventMs = Math.max(0, now() - activeRun.firstTurnStartedAt);\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tactiveRun.visibleTtftMs === undefined &&\n\t\t\t\t\tactiveRun.firstTurnStartedAt !== undefined &&\n\t\t\t\t\tevent.assistantMessageEvent.type === \"text_delta\" &&\n\t\t\t\t\tevent.assistantMessageEvent.delta.length > 0\n\t\t\t\t) {\n\t\t\t\t\tactiveRun.visibleTtftMs = Math.max(0, now() - activeRun.firstTurnStartedAt);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"message_end\": {\n\t\t\t\tconst message = assistantMessage(event);\n\t\t\t\tif (!activeRun || !message) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tactiveRun.lastAssistant = message;\n\t\t\t\taddUsage(activeRun.usage, message.usage);\n\t\t\t\tif (activeRun.currentTurnStartedAt !== undefined) {\n\t\t\t\t\tconst latency = Math.max(0, now() - activeRun.currentTurnStartedAt);\n\t\t\t\t\tactiveRun.modelLatencyMs += latency;\n\t\t\t\t\tactiveRun.maxModelLatencyMs = Math.max(activeRun.maxModelLatencyMs, latency);\n\t\t\t\t\tactiveRun.currentTurnStartedAt = undefined;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"tool_execution_end\":\n\t\t\t\tif (activeRun) {\n\t\t\t\t\tactiveRun.toolCallCount++;\n\t\t\t\t\tif (event.isError) {\n\t\t\t\t\t\tactiveRun.toolErrorCount++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"compaction_end\":\n\t\t\t\tif (activeRun && event.result && !event.aborted) {\n\t\t\t\t\tactiveRun.compactionCount++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"auto_retry_start\":\n\t\t\t\tif (activeRun) {\n\t\t\t\t\tactiveRun.retryCount++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"agent_end\":\n\t\t\t\tif (!activeRun) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tactiveRun.agentEnded = true;\n\t\t\t\tif (!turnActionActive) {\n\t\t\t\t\tfinalizeRun();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\tsession.registerDisposeCallback(async () => {\n\t\tunsubscribe();\n\t\tfinalizeRun();\n\t\tsink.capture(\"agent session ended\", {\n\t\t\t...commonProperties(),\n\t\t\tduration_ms: Math.max(0, now() - sessionTotals.startedAt),\n\t\t\tprompt_count: sessionTotals.promptCount,\n\t\t\trun_count: sessionTotals.runCount,\n\t\t\tsuccessful_run_count: sessionTotals.successfulRunCount,\n\t\t\tfailed_run_count: sessionTotals.failedRunCount,\n\t\t\taborted_run_count: sessionTotals.abortedRunCount,\n\t\t\ttool_call_count: sessionTotals.toolCallCount,\n\t\t\tcompaction_count: sessionTotals.compactionCount,\n\t\t\tmodel_call_count: sessionTotals.usage.modelCallCount,\n\t\t\tinput_tokens: sessionTotals.usage.input,\n\t\t\toutput_tokens: sessionTotals.usage.output,\n\t\t\tcache_read_tokens: sessionTotals.usage.cacheRead,\n\t\t\tcache_write_tokens: sessionTotals.usage.cacheWrite,\n\t\t\ttotal_tokens: sessionTotals.usage.totalTokens,\n\t\t});\n\t\tawait sink.flush();\n\t});\n}\n"]}
|