@asm-agent/coding-agent 0.8.7 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/README.md +2 -7
- package/dist/asm-agent-runtime/src/__pycache__/asm_cm_driver.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/__pycache__/phase76_address_head.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__init__.py +1 -1
- package/dist/asm-agent-runtime/src/rlm/__pycache__/__init__.cpython-312.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/__init__.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/_winjob.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/bash.cpython-312.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/bash.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/harness.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/mcp.cpython-312.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/mcp.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/mcp_base.cpython-312.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/mcp_base.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/repl.cpython-312.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/repl.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/skill.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/bash.py +94 -31
- package/dist/asm-agent-runtime/src/rlm/repl.md +3 -3
- package/dist/asm-agent-runtime/src/rlm/repl.py +46 -45
- package/dist/asm-agent-runtime/test/__pycache__/test_agent_message_skill.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/test/__pycache__/test_bash.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/test/__pycache__/test_harness.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/test/__pycache__/test_mcp.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/test/__pycache__/test_mcp_base.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/test/__pycache__/test_repl.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/test/__pycache__/test_subagent_registry.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/test/__pycache__/test_winjob.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/test/test_bash.py +74 -19
- package/dist/asm-agent-runtime/test/test_repl.py +67 -3
- package/dist/asm-agent-runtime/uv.lock +446 -155
- package/dist/bundle/{anthropic-XSMQHGYB.js → anthropic-ZOZNPFXS.js} +2 -2
- package/dist/bundle/{azure-openai-responses-XLQAIKKH.js → azure-openai-responses-TDHCU647.js} +2 -2
- package/dist/bundle/{bundled-modules-5OCN73BM.js → bundled-modules-Q2YODC4B.js} +3 -3
- package/dist/bundle/{chunk-IAQLPSMN.js → chunk-AMKLNEAK.js} +47 -47
- package/dist/bundle/{chunk-2LPSALBF.js → chunk-FPY7FFJS.js} +978 -1821
- package/dist/bundle/{chunk-E3YE2Q7A.js → chunk-G6SC4YYW.js} +4973 -1926
- package/dist/bundle/{chunk-YPNK4MRU.js → chunk-QLHAP3FT.js} +1 -1
- package/dist/bundle/{cli-main-QYX5R3LF.js → cli-main-277AG2BR.js} +3 -3
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/{google-ZXJEPWJA.js → google-Q3AJWUOY.js} +1 -1
- package/dist/bundle/{google-vertex-WAF3RIJ6.js → google-vertex-2CSNOUBS.js} +1 -1
- package/dist/bundle/{main-EOUAQCJH.js → main-TNXWJXIU.js} +3 -3
- package/dist/bundle/{mistral-GDZXSXRS.js → mistral-XRYJGLLG.js} +1 -1
- package/dist/bundle/{openai-codex-responses-7XMPW4LG.js → openai-codex-responses-C6BRO2BN.js} +2 -2
- package/dist/bundle/{openai-completions-LNSVGDMF.js → openai-completions-DNXCK2JW.js} +4 -4
- package/dist/bundle/{openai-responses-MFZOBMIT.js → openai-responses-BEMWVIXE.js} +2 -2
- package/dist/config.d.ts +0 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -3
- 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 +0 -8
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +0 -2
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +0 -22
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +8 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +100 -22
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/kernel/bootstrap.d.ts.map +1 -1
- package/dist/core/kernel/bootstrap.js +1 -1
- package/dist/core/kernel/bootstrap.js.map +1 -1
- package/dist/core/kernel/repl-manager.d.ts +32 -8
- package/dist/core/kernel/repl-manager.d.ts.map +1 -1
- package/dist/core/kernel/repl-manager.js +401 -102
- package/dist/core/kernel/repl-manager.js.map +1 -1
- package/dist/core/kernel/shared.d.ts +11 -7
- package/dist/core/kernel/shared.d.ts.map +1 -1
- package/dist/core/kernel/shared.js +2 -5
- package/dist/core/kernel/shared.js.map +1 -1
- package/dist/core/mcp/mcp-manager.d.ts +4 -2
- package/dist/core/mcp/mcp-manager.d.ts.map +1 -1
- package/dist/core/mcp/mcp-manager.js +9 -7
- package/dist/core/mcp/mcp-manager.js.map +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +1 -1
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/ollama-models.d.ts +3 -1
- package/dist/core/ollama-models.d.ts.map +1 -1
- package/dist/core/ollama-models.js +31 -10
- package/dist/core/ollama-models.js.map +1 -1
- package/dist/core/prime-inference-auth.d.ts +0 -9
- package/dist/core/prime-inference-auth.d.ts.map +1 -1
- package/dist/core/prime-inference-auth.js +0 -50
- package/dist/core/prime-inference-auth.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/provider-display-names.js +0 -1
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/session-manager.d.ts +0 -4
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +0 -22
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +4 -16
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +13 -43
- 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 +0 -5
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/tools/acp-mcp.d.ts +6 -0
- package/dist/core/tools/acp-mcp.d.ts.map +1 -0
- package/dist/core/tools/acp-mcp.js +86 -0
- package/dist/core/tools/acp-mcp.js.map +1 -0
- package/dist/core/tools/index.d.ts +1 -0
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +1 -0
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ipython.d.ts.map +1 -1
- package/dist/core/tools/ipython.js +9 -4
- package/dist/core/tools/ipython.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +2 -11
- 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 +0 -2
- package/dist/modes/agent-connection/daemon-agent-connection.d.ts.map +1 -1
- package/dist/modes/agent-connection/daemon-agent-connection.js +0 -2
- package/dist/modes/agent-connection/daemon-agent-connection.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 +0 -19
- package/dist/modes/agents-view/agents-view-mode.js.map +1 -1
- package/dist/modes/daemon/daemon-mode.d.ts +1 -10
- package/dist/modes/daemon/daemon-mode.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-mode.js +134 -274
- package/dist/modes/daemon/daemon-mode.js.map +1 -1
- package/dist/modes/daemon/daemon-protocol.d.ts +11 -5
- package/dist/modes/daemon/daemon-protocol.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-protocol.js +6 -8
- package/dist/modes/daemon/daemon-protocol.js.map +1 -1
- package/dist/modes/daemon/daemon-supervisor.d.ts +0 -3
- package/dist/modes/daemon/daemon-supervisor.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-supervisor.js +18 -52
- package/dist/modes/daemon/daemon-supervisor.js.map +1 -1
- package/dist/modes/daemon/daemon-worker-protocol.d.ts +1 -6
- package/dist/modes/daemon/daemon-worker-protocol.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-worker-protocol.js +0 -2
- package/dist/modes/daemon/daemon-worker-protocol.js.map +1 -1
- package/dist/modes/interactive/auth-flows.d.ts +0 -2
- package/dist/modes/interactive/auth-flows.d.ts.map +1 -1
- package/dist/modes/interactive/auth-flows.js +1 -101
- package/dist/modes/interactive/auth-flows.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +6 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +13 -3
- package/dist/modes/interactive/components/assistant-message.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/mermaid.d.ts +12 -0
- package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
- package/dist/modes/interactive/components/mermaid.js +63 -0
- package/dist/modes/interactive/components/mermaid.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +10 -0
- package/dist/modes/interactive/components/settings-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 +1 -7
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +23 -279
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +1 -1
- package/dist/utils/version-check.js.map +1 -1
- package/docs/settings.md +1 -31
- package/docs/usage.md +1 -4
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/package.json +6 -5
- package/dist/core/agent-traces.d.ts +0 -130
- package/dist/core/agent-traces.d.ts.map +0 -1
- package/dist/core/agent-traces.js +0 -746
- package/dist/core/agent-traces.js.map +0 -1
- package/dist/core/telemetry.d.ts +0 -92
- package/dist/core/telemetry.d.ts.map +0 -1
- package/dist/core/telemetry.js +0 -633
- package/dist/core/telemetry.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-traces.js","sourceRoot":"","sources":["../../src/core/agent-traces.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport type { Dirent } from \"node:fs\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { appendRotatingLog, getAgentTracesLogPath, getSessionsDir, VERSION } from \"../config.js\";\nimport { readFirstLineSync } from \"../utils/file-lines.js\";\nimport type { AuthStorage } from \"./auth-storage.js\";\nimport {\n\tASM_AGENT_TRACES_PROVIDER_ID,\n\tloadPrimeCliConfig,\n\tPRIME_INFERENCE_PROVIDER_ID,\n\tresolveAsmAgentTracesBaseUrl,\n} from \"./prime-inference-auth.js\";\nimport { getSessionArtifactsRoot, type SessionHeader, type SessionManager } from \"./session-manager.js\";\nimport type { SettingsManager } from \"./settings-manager.js\";\n\nconst MAX_TRACE_BYTES = 20 * 1024 * 1024;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 15_000;\nconst TRACE_UPLOAD_DEBOUNCE_MS = 1_000;\nconst TRACE_UPLOAD_MIN_INTERVAL_MS = 60_000;\nconst TRACE_UPLOAD_RETRY_BASE_DELAY_MS = 500;\nconst TRACE_UPLOAD_RETRY_MAX_DELAY_MS = 10_000;\nconst TRACE_UPLOAD_MAX_RETRIES = 3;\nconst TRACE_UPLOAD_RETRY_JITTER = 0.2;\nconst TRACE_PREVIEW_MAX_CHARS = 8_000;\nconst TRACE_UPLOAD_ALL_CONCURRENCY = 4;\nconst TRACE_UPLOAD_RATE_LIMIT_REQUESTS = 5;\nconst TRACE_UPLOAD_RATE_LIMIT_WINDOW_MS = 60_000;\nconst TRACE_UPLOAD_RATE_LIMIT_SAFETY_MS = 100;\nconst TRACE_UPLOAD_ALL_MIN_REQUEST_INTERVAL_MS =\n\tMath.ceil(TRACE_UPLOAD_RATE_LIMIT_WINDOW_MS / TRACE_UPLOAD_RATE_LIMIT_REQUESTS) + TRACE_UPLOAD_RATE_LIMIT_SAFETY_MS;\n\nexport type AgentTraceCredentialSource = \"environment\" | \"stored\" | \"prime-inference\" | \"prime-cli\";\n\nexport interface AgentTraceCredential {\n\tapiKey: string;\n\tsource: AgentTraceCredentialSource;\n\tlabel: string;\n}\n\nexport type AgentTraceUploadResult =\n\t| {\n\t\t\tstatus: \"uploaded\";\n\t\t\tsessionId: string;\n\t\t\ttraceId: string;\n\t\t\tbytesStored: number;\n\t\t\tkey?: string;\n\t }\n\t| { status: \"disabled\" }\n\t| { status: \"missing_credentials\" }\n\t| { status: \"no_session_file\" }\n\t| { status: \"empty_session\" }\n\t| { status: \"invalid_session\"; message: string }\n\t| { status: \"too_large\"; size: number; maxBytes: number }\n\t| { status: \"failed\"; statusCode?: number; message: string };\n\nexport interface AgentTraceUploadOptions {\n\tsessionFile: string | undefined;\n\tauthStorage: AuthStorage;\n\tsettingsManager: SettingsManager;\n\t/** Require the global automatic-sharing opt-in. Set false only for an explicit one-shot upload command. */\n\trequireEnabled?: boolean;\n\tbaseUrl?: string;\n\tconfigPath?: string;\n\tfetchFn?: typeof fetch;\n\treloadConfig?: boolean;\n\trequestTimeoutMs?: number;\n\tsignal?: AbortSignal;\n}\n\nexport interface AgentTraceSessionUploadOptions extends Omit<AgentTraceUploadOptions, \"sessionFile\"> {\n\tsessionManager: SessionManager;\n}\n\nexport interface AgentTraceUploadInstallOptions {\n\tauthStorage: AuthStorage;\n\tsettingsManager: SettingsManager;\n\tbaseUrl?: string;\n\tconfigPath?: string;\n\tfetchFn?: typeof fetch;\n\trequestTimeoutMs?: number;\n}\n\nexport type AgentTracePreviewResult =\n\t| {\n\t\t\tstatus: \"ready\";\n\t\t\tsessionFile: string;\n\t\t\tsessionId: string;\n\t\t\ttraceId: string;\n\t\t\tparentSessionId?: string;\n\t\t\tcwd: string;\n\t\t\tsize: number;\n\t\t\tmaxBytes: number;\n\t\t\tuploadable: boolean;\n\t\t\tendpoint: string;\n\t\t\tgitRepo?: string;\n\t\t\tgitCommit?: string;\n\t\t\tcontentPreview: string;\n\t\t\ttruncated: boolean;\n\t }\n\t| { status: \"no_session_file\" }\n\t| { status: \"empty_session\" }\n\t| { status: \"invalid_session\"; message: string }\n\t| { status: \"failed\"; message: string };\n\nexport interface AgentTracePreviewOptions {\n\tsessionFile: string | undefined;\n\tbaseUrl?: string;\n\tmaxContentChars?: number;\n}\n\nexport interface AgentTraceUploadAllProgress {\n\tcompleted: number;\n\ttotal: number;\n\tsessionFile?: string;\n\tresult?: AgentTraceUploadResult;\n}\n\nexport interface AgentTraceUploadAllOptions extends Omit<AgentTraceUploadOptions, \"sessionFile\"> {\n\tsessionDir?: string;\n\tconcurrency?: number;\n\tonProgress?: (progress: AgentTraceUploadAllProgress) => void;\n}\n\nexport interface AgentTraceUploadAllResult {\n\ttotal: number;\n\tuploaded: number;\n\tfailed: number;\n\tskipped: number;\n\tbytesStored: number;\n\tresults: Array<{ sessionFile: string; result: AgentTraceUploadResult }>;\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 isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction describeError(error: unknown): string {\n\tif (!(error instanceof Error)) {\n\t\treturn String(error);\n\t}\n\tconst cause = (error as { cause?: unknown }).cause;\n\tif (isRecord(cause)) {\n\t\tconst code = typeof cause.code === \"string\" ? cause.code : undefined;\n\t\tconst causeMessage = typeof cause.message === \"string\" ? cause.message : undefined;\n\t\tconst detail = code ?? causeMessage;\n\t\tif (detail && detail !== error.message) {\n\t\t\treturn `${error.message} (${detail})`;\n\t\t}\n\t}\n\treturn error.message;\n}\n\nclass TraceUploadTimeoutError extends Error {\n\tconstructor(timeoutMs: number) {\n\t\tsuper(`Trace upload timed out after ${timeoutMs}ms`);\n\t\tthis.name = \"TraceUploadTimeoutError\";\n\t}\n}\n\nconst RETRIABLE_NETWORK_CODES = new Set([\n\t\"ECONNRESET\",\n\t\"ECONNREFUSED\",\n\t\"ECONNABORTED\",\n\t\"EPIPE\",\n\t\"ETIMEDOUT\",\n\t\"ENETUNREACH\",\n\t\"ENETDOWN\",\n\t\"EAI_AGAIN\",\n\t\"UND_ERR_SOCKET\",\n\t\"UND_ERR_CONNECT_TIMEOUT\",\n]);\n\nconst RETRIABLE_HTTP_STATUSES = new Set([408, 425, 429, 500, 502, 503, 504]);\n\nfunction isRetriableNetworkError(error: unknown): boolean {\n\tif (error instanceof TraceUploadTimeoutError) {\n\t\treturn true;\n\t}\n\tif (!(error instanceof Error) || error.name === \"AbortError\") {\n\t\treturn false;\n\t}\n\tconst cause = (error as { cause?: unknown }).cause;\n\treturn isRecord(cause) && typeof cause.code === \"string\" && RETRIABLE_NETWORK_CODES.has(cause.code);\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 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 isSessionHeader(value: unknown): value is SessionHeader {\n\treturn (\n\t\tisRecord(value) &&\n\t\tvalue.type === \"session\" &&\n\t\ttypeof value.id === \"string\" &&\n\t\ttypeof value.timestamp === \"string\" &&\n\t\ttypeof value.cwd === \"string\" &&\n\t\t(value.parentSession === undefined || typeof value.parentSession === \"string\")\n\t);\n}\n\nfunction readSessionHeader(sessionFile: string): SessionHeader | undefined {\n\ttry {\n\t\tconst firstLine = readFirstLineSync(sessionFile);\n\t\tif (!firstLine?.trim()) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst parsed = JSON.parse(firstLine) as unknown;\n\t\treturn isSessionHeader(parsed) ? parsed : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** Active-branch git for the indexing headers: walk leaf to root, not the last git_state in\n * file order (which may belong to a sibling branch). */\nexport function activeGitContext(\n\tbody: string,\n\theader: SessionHeader,\n): { repoUrl?: string; commit?: string } | undefined {\n\tconst byId = new Map<string, { parentId: string | null; type: string; git?: unknown }>();\n\tlet leafId: string | null = null;\n\tfor (const line of body.split(\"\\n\")) {\n\t\tif (!line.trim()) continue;\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(line);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tif (!isRecord(parsed) || parsed.type === \"session\" || typeof parsed.id !== \"string\") continue;\n\t\tbyId.set(parsed.id, {\n\t\t\tparentId: typeof parsed.parentId === \"string\" ? parsed.parentId : null,\n\t\t\ttype: typeof parsed.type === \"string\" ? parsed.type : \"\",\n\t\t\tgit: parsed.git,\n\t\t});\n\t\tleafId = parsed.id;\n\t}\n\n\tlet current = leafId ? byId.get(leafId) : undefined;\n\tfor (let depth = 0; current && depth < byId.size + 1; depth += 1) {\n\t\tif (current.type === \"git_state\" && isRecord(current.git)) {\n\t\t\treturn current.git as { repoUrl?: string; commit?: string };\n\t\t}\n\t\tcurrent = current.parentId ? byId.get(current.parentId) : undefined;\n\t}\n\treturn header.git;\n}\n\nfunction resolveParentSessionPath(sessionFile: string, parentSession: string): string {\n\treturn isAbsolute(parentSession) ? parentSession : resolve(dirname(sessionFile), parentSession);\n}\n\nfunction resolveTraceContext(\n\tsessionFile: string,\n\theader: SessionHeader,\n): { traceId: string; parentSessionId?: string } {\n\tlet traceId = header.id;\n\tlet parentSessionId: string | undefined;\n\tlet currentFile = sessionFile;\n\tlet currentHeader = header;\n\n\tfor (let depth = 0; depth < 32; depth += 1) {\n\t\tif (!currentHeader.parentSession) {\n\t\t\tbreak;\n\t\t}\n\n\t\tconst parentPath = resolveParentSessionPath(currentFile, currentHeader.parentSession);\n\t\tconst parentHeader = readSessionHeader(parentPath);\n\t\tif (!parentHeader) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (depth === 0) {\n\t\t\tparentSessionId = parentHeader.id;\n\t\t}\n\t\ttraceId = parentHeader.id;\n\t\tcurrentFile = parentPath;\n\t\tcurrentHeader = parentHeader;\n\t}\n\n\treturn { traceId, parentSessionId };\n}\n\nfunction parseResponseObject(text: string): Record<string, unknown> | undefined {\n\tif (!text.trim()) {\n\t\treturn undefined;\n\t}\n\ttry {\n\t\tconst parsed = JSON.parse(text) as unknown;\n\t\treturn isRecord(parsed) ? parsed : undefined;\n\t} catch {\n\t\treturn undefined;\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\tconst parsed = parseResponseObject(text);\n\tif (parsed) {\n\t\tconst error = parsed.error;\n\t\tif (isRecord(error)) {\n\t\t\tconst message = stringField(error, \"message\");\n\t\t\tif (message) return message;\n\t\t}\n\t\tconst detail = stringField(parsed, \"detail\");\n\t\tif (detail) return detail;\n\t\tconst message = stringField(parsed, \"message\");\n\t\tif (message) return message;\n\t}\n\n\treturn text.trim();\n}\n\nasync function fetchWithTimeout(\n\tfetchFn: typeof fetch,\n\turl: string,\n\tinit: RequestInit,\n\ttimeoutMs: number,\n\tsignal?: AbortSignal,\n): Promise<Response> {\n\tconst controller = new AbortController();\n\tconst timeoutError = new TraceUploadTimeoutError(timeoutMs);\n\tlet timedOut = false;\n\tconst timeout = setTimeout(() => {\n\t\ttimedOut = true;\n\t\tcontroller.abort(timeoutError);\n\t}, timeoutMs);\n\tconst onAbort = () => controller.abort(signal?.reason);\n\tif (signal?.aborted) {\n\t\tonAbort();\n\t} else {\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t}\n\n\ttry {\n\t\treturn await fetchFn(url, { ...init, signal: controller.signal });\n\t} catch (error) {\n\t\tif (timedOut) {\n\t\t\tthrow timeoutError;\n\t\t}\n\t\tthrow error;\n\t} finally {\n\t\tclearTimeout(timeout);\n\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t}\n}\n\nfunction delay(ms: number, signal?: AbortSignal): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tif (signal?.aborted) {\n\t\t\tresolve();\n\t\t\treturn;\n\t\t}\n\t\tconst timeout = setTimeout(finish, ms);\n\t\tconst onAbort = () => finish();\n\t\tfunction finish() {\n\t\t\tclearTimeout(timeout);\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n\nfunction traceUploadRetryDelay(retryIndex: number): number {\n\tconst exponentialDelay = Math.min(\n\t\tTRACE_UPLOAD_RETRY_MAX_DELAY_MS,\n\t\tTRACE_UPLOAD_RETRY_BASE_DELAY_MS * 2 ** retryIndex,\n\t);\n\tconst jitterMultiplier = 1 - TRACE_UPLOAD_RETRY_JITTER + Math.random() * TRACE_UPLOAD_RETRY_JITTER * 2;\n\treturn Math.max(0, Math.round(exponentialDelay * jitterMultiplier));\n}\n\nfunction retryAfterDelay(response: Response): number | undefined {\n\tconst value = response.headers.get(\"retry-after\")?.trim();\n\tif (!value) {\n\t\treturn undefined;\n\t}\n\tconst seconds = Number(value);\n\tif (Number.isFinite(seconds) && seconds >= 0) {\n\t\treturn Math.min(Math.ceil(seconds * 1_000), TRACE_UPLOAD_RATE_LIMIT_WINDOW_MS);\n\t}\n\tconst retryAt = Date.parse(value);\n\treturn Number.isFinite(retryAt)\n\t\t? Math.min(Math.max(0, retryAt - Date.now()), TRACE_UPLOAD_RATE_LIMIT_WINDOW_MS)\n\t\t: undefined;\n}\n\ntype BeforeTraceUploadRequest = () => Promise<void>;\n\nasync function fetchWithRetry(\n\tfetchFn: typeof fetch,\n\turl: string,\n\tinit: RequestInit,\n\ttimeoutMs: number,\n\tsignal?: AbortSignal,\n\tbeforeRequest?: BeforeTraceUploadRequest,\n): Promise<Response> {\n\tfor (let attempt = 0; ; attempt += 1) {\n\t\tlet retryDelayMs: number | undefined;\n\t\ttry {\n\t\t\tawait beforeRequest?.();\n\t\t\tif (signal?.aborted) {\n\t\t\t\tthrow signal.reason ?? new Error(\"Trace upload cancelled\");\n\t\t\t}\n\t\t\tconst response = await fetchWithTimeout(fetchFn, url, init, timeoutMs, signal);\n\t\t\tif (attempt >= TRACE_UPLOAD_MAX_RETRIES || !RETRIABLE_HTTP_STATUSES.has(response.status)) {\n\t\t\t\treturn response;\n\t\t\t}\n\t\t\tif (response.status === 429) {\n\t\t\t\tretryDelayMs = retryAfterDelay(response) ?? TRACE_UPLOAD_RATE_LIMIT_WINDOW_MS;\n\t\t\t} else if (response.status === 503) {\n\t\t\t\tretryDelayMs = retryAfterDelay(response);\n\t\t\t}\n\t\t\tawait response.body?.cancel().catch(() => undefined);\n\t\t} catch (error) {\n\t\t\tif (signal?.aborted) {\n\t\t\t\tthrow signal.reason ?? error;\n\t\t\t}\n\t\t\tif (attempt >= TRACE_UPLOAD_MAX_RETRIES || !isRetriableNetworkError(error)) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tawait delay(retryDelayMs ?? traceUploadRetryDelay(attempt), signal);\n\t\tif (signal?.aborted) {\n\t\t\tthrow signal.reason ?? new Error(\"Trace upload cancelled\");\n\t\t}\n\t}\n}\n\nfunction traceContentPreview(body: string, maxChars: number): { content: string; truncated: boolean } {\n\tif (body.length <= maxChars) {\n\t\treturn { content: body.trimEnd(), truncated: false };\n\t}\n\tconst marker = \"\\n... middle of trace omitted ...\\n\";\n\tconst available = Math.max(0, maxChars - marker.length);\n\tconst headChars = Math.ceil(available / 2);\n\tconst tailChars = Math.floor(available / 2);\n\treturn {\n\t\tcontent: `${body.slice(0, headChars).trimEnd()}${marker}${body.slice(body.length - tailChars).trimStart()}`,\n\t\ttruncated: true,\n\t};\n}\n\nexport async function previewAgentTraceFile(options: AgentTracePreviewOptions): Promise<AgentTracePreviewResult> {\n\tif (!options.sessionFile) {\n\t\treturn { status: \"no_session_file\" };\n\t}\n\n\tlet fileSize: number;\n\ttry {\n\t\tconst stats = await stat(options.sessionFile);\n\t\tif (!stats.isFile()) {\n\t\t\treturn { status: \"no_session_file\" };\n\t\t}\n\t\tfileSize = stats.size;\n\t} catch {\n\t\treturn { status: \"no_session_file\" };\n\t}\n\tif (fileSize === 0) {\n\t\treturn { status: \"empty_session\" };\n\t}\n\n\tconst header = readSessionHeader(options.sessionFile);\n\tif (!header) {\n\t\treturn { status: \"invalid_session\", message: \"Session file is missing a valid session header\" };\n\t}\n\n\tlet body = \"\";\n\tif (fileSize <= MAX_TRACE_BYTES) {\n\t\ttry {\n\t\t\tbody = await readFile(options.sessionFile, \"utf8\");\n\t\t} catch (error) {\n\t\t\treturn { status: \"failed\", message: describeError(error) };\n\t\t}\n\t\tif (!body.trim()) {\n\t\t\treturn { status: \"empty_session\" };\n\t\t}\n\t}\n\n\tconst traceContext = resolveTraceContext(options.sessionFile, header);\n\tconst baseUrl = resolveAsmAgentTracesBaseUrl(options.baseUrl);\n\tconst git = body ? activeGitContext(body, header) : header.git;\n\tconst preview = body\n\t\t? traceContentPreview(body, Math.max(256, options.maxContentChars ?? TRACE_PREVIEW_MAX_CHARS))\n\t\t: { content: \"\", truncated: true };\n\treturn {\n\t\tstatus: \"ready\",\n\t\tsessionFile: options.sessionFile,\n\t\tsessionId: header.id,\n\t\ttraceId: traceContext.traceId,\n\t\tparentSessionId: traceContext.parentSessionId,\n\t\tcwd: header.cwd,\n\t\tsize: fileSize,\n\t\tmaxBytes: MAX_TRACE_BYTES,\n\t\tuploadable: fileSize <= MAX_TRACE_BYTES,\n\t\tendpoint: `${baseUrl}/api/v1/agent-traces/sessions/${encodeURIComponent(header.id)}`,\n\t\tgitRepo: git?.repoUrl,\n\t\tgitCommit: git?.commit,\n\t\tcontentPreview: preview.content,\n\t\ttruncated: preview.truncated,\n\t};\n}\n\nasync function findSessionFilesUnder(root: string, files: Set<string>): Promise<void> {\n\tlet entries: Dirent[];\n\ttry {\n\t\tentries = await readdir(root, { withFileTypes: true });\n\t} catch {\n\t\treturn;\n\t}\n\n\tfor (const entry of entries) {\n\t\tconst entryPath = join(root, entry.name);\n\t\tif (entry.isDirectory()) {\n\t\t\tawait findSessionFilesUnder(entryPath, files);\n\t\t\tcontinue;\n\t\t}\n\t\tif (entry.isFile() && entry.name.endsWith(\".jsonl\") && readSessionHeader(entryPath)) {\n\t\t\tfiles.add(entryPath);\n\t\t}\n\t}\n}\n\nexport async function findAgentTraceFiles(sessionDir: string = getSessionsDir()): Promise<string[]> {\n\tconst files = new Set<string>();\n\tconst roots = new Set([resolve(sessionDir), resolve(getSessionArtifactsRoot(sessionDir))]);\n\tawait Promise.all([...roots].map((root) => findSessionFilesUnder(root, files)));\n\treturn [...files].sort();\n}\n\nfunction createTraceUploadAllRequestGate(signal?: AbortSignal): BeforeTraceUploadRequest {\n\tlet nextRequestAt = 0;\n\tlet queue = Promise.resolve();\n\treturn () => {\n\t\tconst slot = queue.then(async () => {\n\t\t\tconst waitMs = Math.max(0, nextRequestAt - Date.now());\n\t\t\tif (waitMs > 0) {\n\t\t\t\tawait delay(waitMs, signal);\n\t\t\t}\n\t\t\tif (!signal?.aborted) {\n\t\t\t\tnextRequestAt = Date.now() + TRACE_UPLOAD_ALL_MIN_REQUEST_INTERVAL_MS;\n\t\t\t}\n\t\t});\n\t\tqueue = slot.catch(() => undefined);\n\t\treturn slot;\n\t};\n}\n\nexport async function uploadAllAgentTraces(options: AgentTraceUploadAllOptions): Promise<AgentTraceUploadAllResult> {\n\tconst { sessionDir, concurrency, onProgress, ...uploadOptions } = options;\n\tconst sessionFiles = await findAgentTraceFiles(sessionDir);\n\ttype UploadResultItem = AgentTraceUploadAllResult[\"results\"][number];\n\tconst results: Array<UploadResultItem | undefined> = new Array(sessionFiles.length);\n\tlet cursor = 0;\n\tlet completed = 0;\n\tconst beforeRequest = createTraceUploadAllRequestGate(uploadOptions.signal);\n\tonProgress?.({ completed, total: sessionFiles.length });\n\n\tconst worker = async () => {\n\t\twhile (true) {\n\t\t\tif (uploadOptions.signal?.aborted) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst index = cursor;\n\t\t\tcursor += 1;\n\t\t\tconst sessionFile = sessionFiles[index];\n\t\t\tif (!sessionFile) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst result = await uploadAgentTraceFileWithRequestGate(\n\t\t\t\t{\n\t\t\t\t\t...uploadOptions,\n\t\t\t\t\tsessionFile,\n\t\t\t\t\treloadConfig: false,\n\t\t\t\t},\n\t\t\t\tbeforeRequest,\n\t\t\t);\n\t\t\tif (uploadOptions.signal?.aborted && result.status === \"failed\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresults[index] = { sessionFile, result };\n\t\t\tcompleted += 1;\n\t\t\tonProgress?.({ completed, total: sessionFiles.length, sessionFile, result });\n\t\t}\n\t};\n\n\tconst requestedConcurrency = concurrency ?? TRACE_UPLOAD_ALL_CONCURRENCY;\n\tconst normalizedConcurrency =\n\t\tNumber.isFinite(requestedConcurrency) && requestedConcurrency > 0\n\t\t\t? Math.max(1, Math.floor(requestedConcurrency))\n\t\t\t: TRACE_UPLOAD_ALL_CONCURRENCY;\n\tconst workerCount = Math.min(sessionFiles.length, normalizedConcurrency);\n\tawait Promise.all(Array.from({ length: workerCount }, worker));\n\n\tconst completedResults = results.filter((item): item is UploadResultItem => item !== undefined);\n\tlet uploaded = 0;\n\tlet failed = 0;\n\tlet bytesStored = 0;\n\tfor (const item of completedResults) {\n\t\tif (item.result.status === \"uploaded\") {\n\t\t\tuploaded += 1;\n\t\t\tbytesStored += item.result.bytesStored;\n\t\t} else if (item.result.status === \"failed\") {\n\t\t\tfailed += 1;\n\t\t}\n\t}\n\treturn {\n\t\ttotal: sessionFiles.length,\n\t\tuploaded,\n\t\tfailed,\n\t\tskipped: sessionFiles.length - uploaded - failed,\n\t\tbytesStored,\n\t\tresults: completedResults,\n\t};\n}\n\nexport async function getAsmAgentTraceCredential(\n\tauthStorage: AuthStorage,\n\toptions: { reloadAuth?: boolean; configPath?: string } = {},\n): Promise<AgentTraceCredential | undefined> {\n\tconst traceEnvKey = stringEnv(\"ASM_AGENT_TRACES_API_KEY\");\n\tif (traceEnvKey) {\n\t\treturn { apiKey: traceEnvKey, source: \"environment\", label: \"ASM_AGENT_TRACES_API_KEY\" };\n\t}\n\n\tif (options.reloadAuth !== false) {\n\t\tauthStorage.reload();\n\t}\n\n\tconst traceKey = await authStorage.getApiKey(ASM_AGENT_TRACES_PROVIDER_ID, { includeFallback: false });\n\tif (traceKey) {\n\t\treturn { apiKey: traceKey, source: \"stored\", label: \"ASM Agent Traces credential\" };\n\t}\n\n\tconst primeEnvKey = stringEnv(\"PRIME_API_KEY\");\n\tif (primeEnvKey) {\n\t\treturn { apiKey: primeEnvKey, source: \"environment\", label: \"PRIME_API_KEY\" };\n\t}\n\n\tconst primeCredential = authStorage.get(PRIME_INFERENCE_PROVIDER_ID);\n\tif (primeCredential) {\n\t\tconst primeKey = await authStorage.getApiKey(PRIME_INFERENCE_PROVIDER_ID, { includeFallback: false });\n\t\tif (primeKey) {\n\t\t\treturn { apiKey: primeKey, source: \"prime-inference\", label: \"Prime Inference credential\" };\n\t\t}\n\t}\n\n\tconst primeCliKey = loadPrimeCliConfig(options.configPath).apiKey;\n\tif (primeCliKey) {\n\t\treturn { apiKey: primeCliKey, source: \"prime-cli\", label: \"Prime CLI credential\" };\n\t}\n\n\treturn undefined;\n}\n\nasync function getAgentTracesEnabled(\n\toptions: Pick<AgentTraceUploadOptions, \"reloadConfig\" | \"settingsManager\">,\n): Promise<boolean> {\n\tif (options.reloadConfig !== false) {\n\t\tawait options.settingsManager.reload().catch(() => undefined);\n\t}\n\treturn options.settingsManager.getAgentTracesEnabled();\n}\n\nasync function uploadAgentTraceFileWithRequestGate(\n\toptions: AgentTraceUploadOptions,\n\tbeforeRequest?: BeforeTraceUploadRequest,\n): Promise<AgentTraceUploadResult> {\n\tconst result = await performAgentTraceUpload(options, beforeRequest);\n\tlogAgentTraceOutcome(options.sessionFile, result);\n\treturn result;\n}\n\nexport function uploadAgentTraceFile(options: AgentTraceUploadOptions): Promise<AgentTraceUploadResult> {\n\treturn uploadAgentTraceFileWithRequestGate(options);\n}\n\nfunction logAgentTraceOutcome(sessionFile: string | undefined, result: AgentTraceUploadResult): void {\n\tlet line: string | undefined;\n\tswitch (result.status) {\n\t\tcase \"uploaded\":\n\t\t\tline = `uploaded session ${result.sessionId} (${result.bytesStored} bytes)`;\n\t\t\tbreak;\n\t\tcase \"failed\":\n\t\t\tline = `upload failed${result.statusCode ? ` (HTTP ${result.statusCode})` : \"\"}: ${result.message}`;\n\t\t\tbreak;\n\t\tcase \"too_large\":\n\t\t\tline = `upload skipped: session is ${result.size} bytes (limit ${result.maxBytes})`;\n\t\t\tbreak;\n\t\tcase \"invalid_session\":\n\t\t\tline = `upload skipped: ${result.message}`;\n\t\t\tbreak;\n\t\tcase \"missing_credentials\":\n\t\t\tline = \"upload skipped: no Prime credential configured (run /traces login)\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\treturn;\n\t}\n\tconst suffix = sessionFile ? ` [${sessionFile}]` : \"\";\n\tappendRotatingLog(getAgentTracesLogPath(), `[${new Date().toISOString()}] ${line}${suffix}`);\n}\n\nasync function performAgentTraceUpload(\n\toptions: AgentTraceUploadOptions,\n\tbeforeRequest?: BeforeTraceUploadRequest,\n): Promise<AgentTraceUploadResult> {\n\tconst requireEnabled = options.requireEnabled !== false;\n\tif (requireEnabled && !(await getAgentTracesEnabled(options))) {\n\t\treturn { status: \"disabled\" };\n\t}\n\tif (!options.sessionFile) {\n\t\treturn { status: \"no_session_file\" };\n\t}\n\n\tlet fileSize: number;\n\ttry {\n\t\tconst stats = await stat(options.sessionFile);\n\t\tif (!stats.isFile()) {\n\t\t\treturn { status: \"no_session_file\" };\n\t\t}\n\t\tfileSize = stats.size;\n\t} catch {\n\t\treturn { status: \"no_session_file\" };\n\t}\n\tif (fileSize === 0) {\n\t\treturn { status: \"empty_session\" };\n\t}\n\tif (fileSize > MAX_TRACE_BYTES) {\n\t\treturn { status: \"too_large\", size: fileSize, maxBytes: MAX_TRACE_BYTES };\n\t}\n\n\tconst header = readSessionHeader(options.sessionFile);\n\tif (!header) {\n\t\treturn { status: \"invalid_session\", message: \"Session file is missing a valid session header\" };\n\t}\n\n\tconst credential = await getAsmAgentTraceCredential(options.authStorage, {\n\t\tconfigPath: options.configPath,\n\t\treloadAuth: options.reloadConfig !== false,\n\t});\n\tif (!credential) {\n\t\treturn { status: \"missing_credentials\" };\n\t}\n\n\tif (requireEnabled && !(await getAgentTracesEnabled(options))) {\n\t\treturn { status: \"disabled\" };\n\t}\n\n\tlet body: string;\n\ttry {\n\t\tbody = await readFile(options.sessionFile, \"utf8\");\n\t} catch (error) {\n\t\treturn { status: \"failed\", message: describeError(error) };\n\t}\n\tif (!body.trim()) {\n\t\treturn { status: \"empty_session\" };\n\t}\n\n\tconst traceContext = resolveTraceContext(options.sessionFile, header);\n\tconst bodyBytes = Buffer.byteLength(body, \"utf8\");\n\tconst headers: Record<string, string> = {\n\t\tAuthorization: `Bearer ${credential.apiKey}`,\n\t\t\"Content-Type\": \"application/x-ndjson\",\n\t\tAccept: \"application/json\",\n\t\t\"X-Trace-Id\": traceContext.traceId,\n\t\t\"X-Cwd\": header.cwd,\n\t\t\"X-Agent-Version\": VERSION,\n\t};\n\tif (traceContext.parentSessionId) {\n\t\theaders[\"X-Parent-Session\"] = traceContext.parentSessionId;\n\t}\n\tconst git = activeGitContext(body, header);\n\tif (git?.repoUrl) {\n\t\theaders[\"X-Git-Repo\"] = git.repoUrl;\n\t}\n\tif (git?.commit) {\n\t\theaders[\"X-Git-Commit\"] = git.commit;\n\t}\n\n\tif (requireEnabled && !(await getAgentTracesEnabled(options))) {\n\t\treturn { status: \"disabled\" };\n\t}\n\n\tconst baseUrl = resolveAsmAgentTracesBaseUrl(options.baseUrl);\n\tconst url = `${baseUrl}/api/v1/agent-traces/sessions/${encodeURIComponent(header.id)}`;\n\tconst fetchFn = options.fetchFn ?? fetch;\n\n\tlet response: Response;\n\ttry {\n\t\tresponse = await fetchWithRetry(\n\t\t\tfetchFn,\n\t\t\turl,\n\t\t\t{\n\t\t\t\tmethod: \"PUT\",\n\t\t\t\theaders,\n\t\t\t\tbody,\n\t\t\t},\n\t\t\toptions.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,\n\t\t\toptions.signal,\n\t\t\tbeforeRequest,\n\t\t);\n\t} catch (error) {\n\t\treturn { status: \"failed\", message: describeError(error) };\n\t}\n\n\tif (!response.ok) {\n\t\treturn {\n\t\t\tstatus: \"failed\",\n\t\t\tstatusCode: response.status,\n\t\t\tmessage: await readResponseMessage(response),\n\t\t};\n\t}\n\n\tconst responseText = await response.text().catch(() => \"\");\n\tconst responseData = parseResponseObject(responseText);\n\treturn {\n\t\tstatus: \"uploaded\",\n\t\tsessionId: responseData ? (stringField(responseData, \"session_id\") ?? header.id) : header.id,\n\t\ttraceId: responseData ? (stringField(responseData, \"trace_id\") ?? traceContext.traceId) : traceContext.traceId,\n\t\tbytesStored: responseData ? (numberField(responseData, \"bytes_stored\") ?? bodyBytes) : bodyBytes,\n\t\tkey: responseData ? stringField(responseData, \"key\") : undefined,\n\t};\n}\n\nexport function uploadAgentTraceSession(options: AgentTraceSessionUploadOptions): Promise<AgentTraceUploadResult> {\n\treturn uploadAgentTraceFile({\n\t\t...options,\n\t\tsessionFile: options.sessionManager.getSessionFile(),\n\t});\n}\n\nclass AgentTraceUploadController {\n\tprivate timeout: NodeJS.Timeout | undefined;\n\tprivate pending = false;\n\tprivate inFlight: Promise<AgentTraceUploadResult> | undefined;\n\tprivate flushPromise: Promise<AgentTraceUploadResult | undefined> | undefined;\n\tprivate lastUploadStartedAt: number | undefined;\n\tprivate lastUploadedSignature: string | undefined;\n\n\tconstructor(\n\t\tprivate readonly sessionManager: SessionManager,\n\t\tprivate options: AgentTraceUploadInstallOptions,\n\t) {}\n\n\tupdate(options: AgentTraceUploadInstallOptions): void {\n\t\tthis.options = options;\n\t}\n\n\tschedule = (): void => {\n\t\tthis.pending = true;\n\t\tif (this.timeout) {\n\t\t\tclearTimeout(this.timeout);\n\t\t}\n\t\tconst elapsed = this.lastUploadStartedAt === undefined ? 0 : Date.now() - this.lastUploadStartedAt;\n\t\tconst throttleDelay =\n\t\t\tthis.lastUploadStartedAt === undefined ? 0 : Math.max(0, TRACE_UPLOAD_MIN_INTERVAL_MS - elapsed);\n\t\tthis.timeout = setTimeout(\n\t\t\t() => {\n\t\t\t\tthis.timeout = undefined;\n\t\t\t\tvoid this.flush().catch(() => undefined);\n\t\t\t},\n\t\t\tMath.max(TRACE_UPLOAD_DEBOUNCE_MS, throttleDelay),\n\t\t);\n\t};\n\n\tprivate async getCurrentFileSignature(): Promise<string | undefined> {\n\t\tconst sessionFile = this.sessionManager.getSessionFile();\n\t\tif (!sessionFile) {\n\t\t\treturn undefined;\n\t\t}\n\t\ttry {\n\t\t\tconst stats = await stat(sessionFile);\n\t\t\treturn `${sessionFile}:${stats.size}:${stats.mtimeMs}`;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tasync flush(): Promise<AgentTraceUploadResult | undefined> {\n\t\tif (this.flushPromise) {\n\t\t\tconst result = await this.flushPromise;\n\t\t\tif (!this.pending) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\treturn (await this.flush()) ?? result;\n\t\t}\n\n\t\tthis.flushPromise = this.runFlush();\n\t\ttry {\n\t\t\treturn await this.flushPromise;\n\t\t} finally {\n\t\t\tthis.flushPromise = undefined;\n\t\t}\n\t}\n\n\tprivate async runFlush(): Promise<AgentTraceUploadResult | undefined> {\n\t\tif (this.timeout) {\n\t\t\tclearTimeout(this.timeout);\n\t\t\tthis.timeout = undefined;\n\t\t}\n\t\tif (this.inFlight) {\n\t\t\tawait this.inFlight.catch(() => undefined);\n\t\t}\n\t\tif (!this.pending) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst signature = await this.getCurrentFileSignature();\n\t\tif (signature && signature === this.lastUploadedSignature) {\n\t\t\tthis.pending = false;\n\t\t\treturn undefined;\n\t\t}\n\n\t\tthis.pending = false;\n\t\tthis.lastUploadStartedAt = Date.now();\n\t\tthis.inFlight = uploadAgentTraceSession({\n\t\t\t...this.options,\n\t\t\tsessionManager: this.sessionManager,\n\t\t});\n\t\ttry {\n\t\t\tconst result = await this.inFlight;\n\t\t\tif (result.status === \"uploaded\" && signature) {\n\t\t\t\tthis.lastUploadedSignature = signature;\n\t\t\t}\n\t\t\treturn result;\n\t\t} finally {\n\t\t\tthis.inFlight = undefined;\n\t\t}\n\t}\n}\n\nconst traceUploadControllers = new WeakMap<SessionManager, AgentTraceUploadController>();\n\nexport function installAgentTraceUpload(sessionManager: SessionManager, options: AgentTraceUploadInstallOptions): void {\n\tlet controller = traceUploadControllers.get(sessionManager);\n\tif (controller) {\n\t\tcontroller.update(options);\n\t\treturn;\n\t}\n\n\tcontroller = new AgentTraceUploadController(sessionManager, options);\n\ttraceUploadControllers.set(sessionManager, controller);\n\tsessionManager.onPersist(controller.schedule);\n}\n\nexport async function flushAgentTraceUpload(\n\tsessionManager: SessionManager,\n): Promise<AgentTraceUploadResult | undefined> {\n\treturn traceUploadControllers.get(sessionManager)?.flush();\n}\n"]}
|
package/dist/core/telemetry.d.ts
DELETED
|
@@ -1,92 +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
|
-
fetch?: typeof fetch;
|
|
29
|
-
now?: () => number;
|
|
30
|
-
randomId?: () => string;
|
|
31
|
-
batchSize?: number;
|
|
32
|
-
flushIntervalMs?: number;
|
|
33
|
-
requestTimeoutMs?: number;
|
|
34
|
-
}
|
|
35
|
-
interface InstallAgentTelemetryOptions {
|
|
36
|
-
agentDir: string;
|
|
37
|
-
settingsManager: SettingsManager;
|
|
38
|
-
executionMode?: AgentExecutionMode;
|
|
39
|
-
sink?: TelemetrySink;
|
|
40
|
-
now?: () => number;
|
|
41
|
-
randomId?: () => string;
|
|
42
|
-
}
|
|
43
|
-
export interface CaptureOnboardingCompletedOptions {
|
|
44
|
-
agentDir: string;
|
|
45
|
-
settingsManager: SettingsManager;
|
|
46
|
-
durationMs: number;
|
|
47
|
-
outcome: TelemetryOnboardingOutcome;
|
|
48
|
-
provider?: string;
|
|
49
|
-
authSource?: AuthStatus["source"];
|
|
50
|
-
storedCredentialType?: AuthCredential["type"];
|
|
51
|
-
sink?: TelemetrySink;
|
|
52
|
-
now?: () => number;
|
|
53
|
-
randomId?: () => string;
|
|
54
|
-
}
|
|
55
|
-
export interface CaptureAgentCommandUsedOptions {
|
|
56
|
-
agentDir: string;
|
|
57
|
-
settingsManager: SettingsManager;
|
|
58
|
-
commandName: string;
|
|
59
|
-
sink?: TelemetrySink;
|
|
60
|
-
now?: () => number;
|
|
61
|
-
randomId?: () => string;
|
|
62
|
-
}
|
|
63
|
-
export declare function isTelemetryEnabled(settingsManager: SettingsManager): boolean;
|
|
64
|
-
export declare function getOrCreateTelemetryInstallationId(agentDir: string, randomId?: () => string): string;
|
|
65
|
-
export declare class TelemetryClient implements TelemetrySink {
|
|
66
|
-
private readonly options;
|
|
67
|
-
private readonly endpoint;
|
|
68
|
-
private readonly fetchImpl;
|
|
69
|
-
private readonly now;
|
|
70
|
-
private readonly randomId;
|
|
71
|
-
private readonly batchSize;
|
|
72
|
-
private readonly flushIntervalMs;
|
|
73
|
-
private readonly requestTimeoutMs;
|
|
74
|
-
private installationId?;
|
|
75
|
-
private queue;
|
|
76
|
-
private flushTimer?;
|
|
77
|
-
private flushInFlight?;
|
|
78
|
-
private disabled;
|
|
79
|
-
constructor(options: TelemetryClientOptions);
|
|
80
|
-
capture(name: TelemetryEventName, properties: TelemetryProperties): void;
|
|
81
|
-
private scheduleFlush;
|
|
82
|
-
flush(): Promise<void>;
|
|
83
|
-
private drainQueue;
|
|
84
|
-
private send;
|
|
85
|
-
}
|
|
86
|
-
export declare function telemetryProviderCategory(provider: string | undefined): string;
|
|
87
|
-
export declare function telemetryAuthCategory(source: AuthStatus["source"], storedCredentialType?: AuthCredential["type"]): TelemetryAuthCategory;
|
|
88
|
-
export declare function captureOnboardingCompleted(options: CaptureOnboardingCompletedOptions): Promise<void>;
|
|
89
|
-
export declare function captureAgentCommandUsed(options: CaptureAgentCommandUsedOptions): Promise<void>;
|
|
90
|
-
export declare function installAgentTelemetry(session: AgentSession, options: InstallAgentTelemetryOptions): void;
|
|
91
|
-
export {};
|
|
92
|
-
//# 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 \"@asm-agent/ai\";\nimport { detectInstallMethod, VERSION } from \"../config.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 DEFAULT_TELEMETRY_ENDPOINT = \"https://api.primeintellect.ai/api/v1/agent-analytics/events\";\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\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.PI_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.ASM_AGENT_TELEMETRY);\n\tif (override !== undefined) {\n\t\treturn override;\n\t}\n\tif (process.env.NODE_ENV === \"test\") {\n\t\treturn false;\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 = 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;\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.ASM_AGENT_TELEMETRY_ENDPOINT ?? DEFAULT_TELEMETRY_ENDPOINT;\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\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\": `asm-agent/${VERSION}`,\n\t\t\t\t},\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\"asm\",\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"]}
|