@agimon-ai/doompi-telemetry 0.0.1-alpha.13 → 0.0.1-alpha.15

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.
Files changed (36) hide show
  1. package/README.md +13 -13
  2. package/dist/adapters/logSinkTelemetry.cjs +2 -0
  3. package/dist/adapters/logSinkTelemetry.cjs.map +1 -0
  4. package/dist/adapters/logSinkTelemetry.d.cts +7 -0
  5. package/dist/adapters/logSinkTelemetry.d.cts.map +1 -0
  6. package/dist/adapters/logSinkTelemetry.d.mts +7 -0
  7. package/dist/adapters/logSinkTelemetry.d.mts.map +1 -0
  8. package/dist/adapters/logSinkTelemetry.mjs +2 -0
  9. package/dist/adapters/logSinkTelemetry.mjs.map +1 -0
  10. package/dist/index.cjs +1 -1
  11. package/dist/index.d.cts +4 -2
  12. package/dist/index.d.mts +4 -2
  13. package/dist/index.mjs +1 -1
  14. package/dist/services/telemetry.cjs +2 -0
  15. package/dist/services/telemetry.cjs.map +1 -0
  16. package/dist/services/telemetry.d.cts +8 -0
  17. package/dist/services/telemetry.d.cts.map +1 -0
  18. package/dist/services/telemetry.d.mts +8 -0
  19. package/dist/services/telemetry.d.mts.map +1 -0
  20. package/dist/services/telemetry.mjs +2 -0
  21. package/dist/services/telemetry.mjs.map +1 -0
  22. package/dist/telemetry.cjs +1 -1
  23. package/dist/telemetry.d.cts +4 -2
  24. package/dist/telemetry.d.mts +4 -2
  25. package/dist/telemetry.mjs +1 -1
  26. package/dist/{adapters → types}/telemetry.d.cts +7 -7
  27. package/dist/types/telemetry.d.cts.map +1 -0
  28. package/dist/{adapters → types}/telemetry.d.mts +7 -7
  29. package/dist/types/telemetry.d.mts.map +1 -0
  30. package/package.json +2 -2
  31. package/dist/adapters/telemetry.cjs +0 -2
  32. package/dist/adapters/telemetry.cjs.map +0 -1
  33. package/dist/adapters/telemetry.d.cts.map +0 -1
  34. package/dist/adapters/telemetry.d.mts.map +0 -1
  35. package/dist/adapters/telemetry.mjs +0 -2
  36. package/dist/adapters/telemetry.mjs.map +0 -1
package/README.md CHANGED
@@ -1,14 +1,14 @@
1
1
  # @agimon-ai/doompi-telemetry
2
2
 
3
- Metadata-only LogSink telemetry for Doompi runtimes.
3
+ **Measure the harness without recording the work.**
4
4
 
5
- Emits counters and spans describing what a session did, never prompt text or file content.
6
- Every Doompi runtime reports through this one package so the shape of the telemetry stays
7
- consistent across extensions.
5
+ This is the shared telemetry library for Doompi runtimes. It emits metadata-only counters
6
+ and spans: never prompt text, file contents, or the material the agent is working on. One
7
+ library keeps event names and attributes consistent across extensions, which makes the
8
+ result useful for debugging instead of merely plentiful.
8
9
 
9
- Part of [Doompi](https://www.npmjs.com/package/@agimon-ai/doompi), a coding agent that loads
10
- only the skills and tools you name. This package is composed by Doompi and is not usually
11
- installed on its own.
10
+ This is part of [Doompi](https://www.npmjs.com/package/@agimon-ai/doompi). It is usually a
11
+ transitive dependency rather than something users install on its own.
12
12
 
13
13
  ## Install
14
14
 
@@ -18,15 +18,15 @@ npm install @agimon-ai/doompi-telemetry
18
18
 
19
19
  ## How it loads
20
20
 
21
- A library, not an extension. Doompi and its extensions depend on it directly; there is
22
- nothing to declare in `.doom/modes.yaml`.
21
+ This is a library, not a Pi extension. Doompi packages import it directly; there is no
22
+ extension entry and nothing to add to `.doom/modes.yaml`.
23
23
 
24
24
  ## Entry points
25
25
 
26
- | Import |
27
- | --------------------------------------- |
28
- | `@agimon-ai/doompi-telemetry` |
29
- | `@agimon-ai/doompi-telemetry/telemetry` |
26
+ | Import | Purpose |
27
+ | --------------------------------------- | ------------------ |
28
+ | `@agimon-ai/doompi-telemetry` | Shared library API |
29
+ | `@agimon-ai/doompi-telemetry/telemetry` | Telemetry helpers |
30
30
 
31
31
  ## License
32
32
 
@@ -0,0 +1,2 @@
1
+ const e=require("../services/telemetry.cjs");let t;async function n(){t??=import(`@agimon-ai/log-sink-mcp/telemetry/node`);let e=await t;return{createNodeTelemetry:e.createNodeTelemetry,resolveNodeTelemetryEndpoints:e.resolveNodeTelemetryEndpoints}}function r(t){return e.createDoomTelemetryService(t,n)}exports.createDoomTelemetry=r,exports.createTelemetryHeaders=e.createTelemetryHeaders,exports.sanitizeTelemetryAttributes=e.sanitizeTelemetryAttributes,exports.subscribeTelemetryRecords=e.subscribeTelemetryRecords;
2
+ //# sourceMappingURL=logSinkTelemetry.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logSinkTelemetry.cjs","names":["createDoomTelemetryService"],"sources":["../../src/adapters/logSinkTelemetry.ts"],"sourcesContent":["import {\n createDoomTelemetryService,\n createTelemetryHeaders,\n sanitizeTelemetryAttributes,\n subscribeTelemetryRecords,\n} from '../services/telemetry.js';\nimport type { DoomTelemetry, DoomTelemetryOptions, DoomTelemetryRuntime } from '../types/telemetry.js';\n\nexport type {\n DoomTelemetry,\n DoomTelemetryAttributes,\n DoomTelemetryErrorOptions,\n DoomTelemetryEventLevel,\n DoomTelemetryOptions,\n DoomTelemetryRecord,\n DoomTelemetryStatus,\n} from '../types/telemetry.js';\n\nlet nodeTelemetryModule: Promise<typeof import('@agimon-ai/log-sink-mcp/telemetry/node')> | undefined;\n\nasync function loadNodeTelemetryRuntime(): Promise<DoomTelemetryRuntime> {\n nodeTelemetryModule ??= import('@agimon-ai/log-sink-mcp/telemetry/node');\n const module = await nodeTelemetryModule;\n return {\n createNodeTelemetry: module.createNodeTelemetry,\n resolveNodeTelemetryEndpoints: module.resolveNodeTelemetryEndpoints,\n };\n}\n\nexport function createDoomTelemetry(options: DoomTelemetryOptions): DoomTelemetry {\n return createDoomTelemetryService(options, loadNodeTelemetryRuntime);\n}\n\nexport { createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords };\n"],"mappings":"6CAkBA,IAAI,EAEJ,eAAe,GAA0D,CACvE,IAAwB,OAAO,0CAC/B,IAAM,EAAS,MAAM,EACrB,MAAO,CACL,oBAAqB,EAAO,oBAC5B,8BAA+B,EAAO,6BACxC,CACF,CAEA,SAAgB,EAAoB,EAA8C,CAChF,OAAOA,EAAAA,2BAA2B,EAAS,CAAwB,CACrE"}
@@ -0,0 +1,7 @@
1
+ import { DoomTelemetry, DoomTelemetryAttributes, DoomTelemetryErrorOptions, DoomTelemetryEventLevel, DoomTelemetryOptions, DoomTelemetryRecord, DoomTelemetryStatus } from "../types/telemetry.cjs";
2
+ import { createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords } from "../services/telemetry.cjs";
3
+ //#region src/adapters/logSinkTelemetry.d.ts
4
+ declare function createDoomTelemetry(options: DoomTelemetryOptions): DoomTelemetry;
5
+ //#endregion
6
+ export { createDoomTelemetry, createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords };
7
+ //# sourceMappingURL=logSinkTelemetry.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logSinkTelemetry.d.cts","names":[],"sources":["../../src/adapters/logSinkTelemetry.ts"],"mappings":";;;iBA6BgB,oBAAoB,SAAS,uBAAuB"}
@@ -0,0 +1,7 @@
1
+ import { DoomTelemetry, DoomTelemetryAttributes, DoomTelemetryErrorOptions, DoomTelemetryEventLevel, DoomTelemetryOptions, DoomTelemetryRecord, DoomTelemetryStatus } from "../types/telemetry.mjs";
2
+ import { createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords } from "../services/telemetry.mjs";
3
+ //#region src/adapters/logSinkTelemetry.d.ts
4
+ declare function createDoomTelemetry(options: DoomTelemetryOptions): DoomTelemetry;
5
+ //#endregion
6
+ export { createDoomTelemetry, createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords };
7
+ //# sourceMappingURL=logSinkTelemetry.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logSinkTelemetry.d.mts","names":[],"sources":["../../src/adapters/logSinkTelemetry.ts"],"mappings":";;;iBA6BgB,oBAAoB,SAAS,uBAAuB"}
@@ -0,0 +1,2 @@
1
+ import{createDoomTelemetryService as e,createTelemetryHeaders as t,sanitizeTelemetryAttributes as n,subscribeTelemetryRecords as r}from"../services/telemetry.mjs";let i;async function a(){i??=import(`@agimon-ai/log-sink-mcp/telemetry/node`);let e=await i;return{createNodeTelemetry:e.createNodeTelemetry,resolveNodeTelemetryEndpoints:e.resolveNodeTelemetryEndpoints}}function o(t){return e(t,a)}export{o as createDoomTelemetry,t as createTelemetryHeaders,n as sanitizeTelemetryAttributes,r as subscribeTelemetryRecords};
2
+ //# sourceMappingURL=logSinkTelemetry.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logSinkTelemetry.mjs","names":[],"sources":["../../src/adapters/logSinkTelemetry.ts"],"sourcesContent":["import {\n createDoomTelemetryService,\n createTelemetryHeaders,\n sanitizeTelemetryAttributes,\n subscribeTelemetryRecords,\n} from '../services/telemetry.js';\nimport type { DoomTelemetry, DoomTelemetryOptions, DoomTelemetryRuntime } from '../types/telemetry.js';\n\nexport type {\n DoomTelemetry,\n DoomTelemetryAttributes,\n DoomTelemetryErrorOptions,\n DoomTelemetryEventLevel,\n DoomTelemetryOptions,\n DoomTelemetryRecord,\n DoomTelemetryStatus,\n} from '../types/telemetry.js';\n\nlet nodeTelemetryModule: Promise<typeof import('@agimon-ai/log-sink-mcp/telemetry/node')> | undefined;\n\nasync function loadNodeTelemetryRuntime(): Promise<DoomTelemetryRuntime> {\n nodeTelemetryModule ??= import('@agimon-ai/log-sink-mcp/telemetry/node');\n const module = await nodeTelemetryModule;\n return {\n createNodeTelemetry: module.createNodeTelemetry,\n resolveNodeTelemetryEndpoints: module.resolveNodeTelemetryEndpoints,\n };\n}\n\nexport function createDoomTelemetry(options: DoomTelemetryOptions): DoomTelemetry {\n return createDoomTelemetryService(options, loadNodeTelemetryRuntime);\n}\n\nexport { createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords };\n"],"mappings":"mKAkBA,IAAI,EAEJ,eAAe,GAA0D,CACvE,IAAwB,OAAO,0CAC/B,IAAM,EAAS,MAAM,EACrB,MAAO,CACL,oBAAqB,EAAO,oBAC5B,8BAA+B,EAAO,6BACxC,CACF,CAEA,SAAgB,EAAoB,EAA8C,CAChF,OAAO,EAA2B,EAAS,CAAwB,CACrE"}
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./adapters/telemetry.cjs");exports.createDoomTelemetry=e.createDoomTelemetry,exports.createTelemetryHeaders=e.createTelemetryHeaders,exports.sanitizeTelemetryAttributes=e.sanitizeTelemetryAttributes,exports.subscribeTelemetryRecords=e.subscribeTelemetryRecords;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./services/telemetry.cjs"),t=require("./adapters/logSinkTelemetry.cjs");exports.createDoomTelemetry=t.createDoomTelemetry,exports.createTelemetryHeaders=e.createTelemetryHeaders,exports.sanitizeTelemetryAttributes=e.sanitizeTelemetryAttributes,exports.subscribeTelemetryRecords=e.subscribeTelemetryRecords;
package/dist/index.d.cts CHANGED
@@ -1,2 +1,4 @@
1
- import { DoomTelemetry, DoomTelemetryAttributes, DoomTelemetryEventLevel, DoomTelemetryOptions, DoomTelemetryRecord, DoomTelemetryStatus, createDoomTelemetry, createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords } from "./adapters/telemetry.cjs";
2
- export { type DoomTelemetry, type DoomTelemetryAttributes, type DoomTelemetryEventLevel, type DoomTelemetryOptions, type DoomTelemetryRecord, type DoomTelemetryStatus, createDoomTelemetry, createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords };
1
+ import { DoomTelemetry, DoomTelemetryAttributes, DoomTelemetryErrorOptions, DoomTelemetryEventLevel, DoomTelemetryOptions, DoomTelemetryRecord, DoomTelemetryStatus } from "./types/telemetry.cjs";
2
+ import { createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords } from "./services/telemetry.cjs";
3
+ import { createDoomTelemetry } from "./adapters/logSinkTelemetry.cjs";
4
+ export { type DoomTelemetry, type DoomTelemetryAttributes, type DoomTelemetryErrorOptions, type DoomTelemetryEventLevel, type DoomTelemetryOptions, type DoomTelemetryRecord, type DoomTelemetryStatus, createDoomTelemetry, createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords };
package/dist/index.d.mts CHANGED
@@ -1,2 +1,4 @@
1
- import { DoomTelemetry, DoomTelemetryAttributes, DoomTelemetryEventLevel, DoomTelemetryOptions, DoomTelemetryRecord, DoomTelemetryStatus, createDoomTelemetry, createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords } from "./adapters/telemetry.mjs";
2
- export { type DoomTelemetry, type DoomTelemetryAttributes, type DoomTelemetryEventLevel, type DoomTelemetryOptions, type DoomTelemetryRecord, type DoomTelemetryStatus, createDoomTelemetry, createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords };
1
+ import { DoomTelemetry, DoomTelemetryAttributes, DoomTelemetryErrorOptions, DoomTelemetryEventLevel, DoomTelemetryOptions, DoomTelemetryRecord, DoomTelemetryStatus } from "./types/telemetry.mjs";
2
+ import { createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords } from "./services/telemetry.mjs";
3
+ import { createDoomTelemetry } from "./adapters/logSinkTelemetry.mjs";
4
+ export { type DoomTelemetry, type DoomTelemetryAttributes, type DoomTelemetryErrorOptions, type DoomTelemetryEventLevel, type DoomTelemetryOptions, type DoomTelemetryRecord, type DoomTelemetryStatus, createDoomTelemetry, createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords };
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{createDoomTelemetry as e,createTelemetryHeaders as t,sanitizeTelemetryAttributes as n,subscribeTelemetryRecords as r}from"./adapters/telemetry.mjs";export{e as createDoomTelemetry,t as createTelemetryHeaders,n as sanitizeTelemetryAttributes,r as subscribeTelemetryRecords};
1
+ import{createTelemetryHeaders as e,sanitizeTelemetryAttributes as t,subscribeTelemetryRecords as n}from"./services/telemetry.mjs";import{createDoomTelemetry as r}from"./adapters/logSinkTelemetry.mjs";export{r as createDoomTelemetry,e as createTelemetryHeaders,t as sanitizeTelemetryAttributes,n as subscribeTelemetryRecords};
@@ -0,0 +1,2 @@
1
+ const e=[`AGENT_SESSION_ID`,`PI_SESSION_ID`],t=[`AGENT_PARENT_SESSION_ID`,`PARENT_AGENT_SESSION_ID`],n=[`PI_SESSION_ID`,`AGENT_PARENT_SESSION_ID`],r=new Set([`1`,`true`,`yes`]),i=[`prompt`,`message`,`content`,`payload`,`command`,`cwd`,`path`,`file`,`stack`,`traceback`,`transcript`,`diff`,`secret`,`authorization`,`header`,`environment`,`env`,`details`,`args`],a=new Set([`tool.result.error`,`tool.result.count`,`tool.result.bytes`,`tool.result.duration_ms`]),o=new Set([`count`,`length`,`bytes`,`duration`,`duration_ms`,`size`,`index`,`number`,`active`,`enabled`,`previous`,`empty`,`silent`,`fallback`,`bypass`,`success`,`is_error`,`has_ui`,`requires_confirmation`,`exit_code`,`status_code`,`interval_seconds`,`concurrency`,`budget`]),s=new Set([`gen_ai.usage.input_tokens`,`gen_ai.usage.output_tokens`,`gen_ai.usage.total_tokens`,`gen_ai.usage.cache_read_tokens`,`gen_ai.usage.cache_write_tokens`,`gen_ai.usage.reasoning_tokens`]),c=[`id`,`correlation`,`session`,`trace`,`span`,`call`,`run`,`job`,`step`],l=`name.operation.outcome.reason.status.mode.source.phase.engine.provider.model.level.type.code.signal.finish_reasons.trigger.action.kind.version.scope.layer.profile.domain.theme.leader.pass.role.stage.state.language.transport.adapter.runtime.backend.launcher.event.component.package.command_name.tool_name.token_attribution`.split(`.`),u=new Set;function d(e){return u.add(e),()=>u.delete(e)}function f(e){return e!==void 0&&r.has(e.toLowerCase())}function p(e,t){return e.replace(/[^a-zA-Z0-9._:-]/g,`_`).slice(0,128)||t}function m(e){let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return`id_${(t>>>0).toString(16).padStart(8,`0`)}`}function h(e){let t=e.toLowerCase();return[...o].some(e=>t===e||t.endsWith(`.${e}`)||t.endsWith(`_${e}`))}function g(e){let t=e.toLowerCase();return a.has(t)||s.has(t)||h(t)?!1:i.some(e=>t.split(/[._-]/u).includes(e))}function _(e){let t=e.toLowerCase();return l.some(e=>t===e||t.endsWith(`.${e}`)||t.endsWith(`_${e}`))}function v(e){let t=e.toLowerCase();return c.some(e=>t===e||t.endsWith(`.${e}`)||t.endsWith(`_${e}`))}function y(e){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`}function b(e,t){if(typeof t==`number`)return Number.isFinite(t)?t:void 0;if(typeof t==`boolean`)return t;if(!(t.length===0||t.length>128)){if(v(e))return m(t);if(_(e))return e===`telemetry.package`||e.endsWith(`.package`)?t.startsWith(`/`)||t.includes(`\\`)?void 0:t.replace(/[^a-zA-Z0-9@/._:-]/g,`_`):p(t,`unknown`)}}function x(e={}){let t={};for(let[n,r]of Object.entries(e)){if(g(n)||!y(r))continue;let e=b(n,r);e!==void 0&&(t[n]=e)}return t}function S(e,t){return/^[a-zA-Z][a-zA-Z0-9._:-]{0,63}$/u.test(e)?p(e,t):t}function C(e){return e instanceof Error?S(e.name,`Error`):typeof e==`string`?`StringError`:e&&typeof e==`object`?`ObjectError`:`UnknownError`}function w(e,t=0){if(t>3)return`...`;if(Array.isArray(e))return e.map(e=>w(e,t+1)).join(`; `);if(e instanceof Error){let n=`code`in e?e.code:void 0,r=typeof n==`string`||typeof n==`number`?` (code ${n})`:``,i=e instanceof AggregateError?`: ${w(e.errors,t+1)}`:``,a=e.cause===void 0?``:` <- caused by ${w(e.cause,t+1)}`;return`${e.name}: ${e.message}${r}${i}${a}`}if(typeof e==`string`)return e;if(e&&typeof e==`object`)try{return JSON.stringify(e)}catch{return`ObjectError`}return String(e)}function T(e){return w(e).slice(0,512)}function E(e){if(!e||typeof e!=`object`||!(`code`in e))return;let t=e.code;if(typeof t!=`string`&&typeof t!=`number`)return;let n=String(t);return/^[a-zA-Z0-9][a-zA-Z0-9._:-]{0,63}$/u.test(n)?p(n,`unknown`):void 0}function D(e){let t={"error.type":C(e),outcome:`error`},n=E(e);return n&&(t[`error.code`]=n),t}function O(e,t){for(let n of t){let t=e[n]?.trim();if(t)return t}}function k(n,r){let i={"x-agent":p(n,`doom`)},a=O(r,e),o=O(r,t);return a&&(i[`x-agent-session-id`]=m(a)),o&&(i[`x-agent-parent-session-id`]=m(o)),i}function A(r){let i={...r},a=O(r,e),o=O(r,t);a?i.AGENT_SESSION_ID=m(a):delete i.AGENT_SESSION_ID,o?i.PARENT_AGENT_SESSION_ID=m(o):delete i.PARENT_AGENT_SESSION_ID;for(let e of n)delete i[e];for(let e of Object.keys(i))e.startsWith(`WORKFLOW_`)&&delete i[e];return i}function j(e){return{serviceName:e.serviceName,packageName:e.packageName,backend:`disabled`,enabled:!1,endpointSource:`none`,traces:!1,fileFallback:!1}}function M(e){return Error(`Doom telemetry callback failed: ${C(e)}`)}function N(e,t){let n=e.env??process.env,r=e.telemetryFactory,i=e.endpointResolver,a=A(n),o=e.warn??(e=>process.emitWarning(e)),s=e=>{try{o(e)}catch(e){process.emitWarning(`Doom telemetry warning callback failed: ${T(e)}`)}},c=e.retryDelayMs??1e3,l=e.allowFileFallback??f(n.LOG_SINK_PI_FILE_FALLBACK),d=j(e),m=d,h,g,_=0,v,y=!1,b=new Set,S=()=>f(n.AGENT_TELEMETRY_DISABLED)||f(n.OTEL_SDK_DISABLED),C=t=>{for(let n of[...u,...e.onRecord?[e.onRecord]:[]])try{n(t)}catch(e){s(`Doom telemetry observer failed: ${T(e)}`)}},w=async()=>{if(S()||y)return;let o=r&&i?void 0:await t?.(),u=i??o?.resolveNodeTelemetryEndpoints,f=r??o?.createNodeTelemetry;if(!u||!f)throw Error(`Node telemetry runtime is unavailable.`);let p=e.telemetryFactory&&!e.endpointResolver?{endpointSource:`env`,endpoint:`injected`}:await u({cwd:e.cwd,env:n,packageName:e.packageName,serviceName:e.serviceName,workspaceRoot:e.workspaceRoot,discoverEndpoint:!0,healthCheck:!0});if(!p.endpoint&&!p.tracesEndpoint&&!p.logsEndpoint&&!l){_=Date.now()+c,m={...d};return}let g=await f({serviceName:e.serviceName,packageName:e.packageName,cwd:e.cwd,workspaceRoot:e.workspaceRoot,env:a,discoverEndpoint:!0,enableLogs:e.enableLogs??!0,enableTraces:e.enableTraces??!0,headers:k(e.serviceName,n)});if(y){await g.shutdown().catch(e=>{s(`Doom telemetry late initialization shutdown failed: ${T(e)}`)});return}if(g.backend===`file`&&!l){await g.shutdown().catch(e=>s(`Doom telemetry fallback shutdown failed: ${T(e)}`)),m={...d};return}h=g,m={serviceName:e.serviceName,packageName:e.packageName,backend:g.backend,enabled:g.enabled,endpoint:g.endpoint,endpointSource:g.endpointSource,traces:!!(e.enableTraces??!0),fileFallback:g.backend===`file`};try{e.onStatus?.({...m})}catch(e){s(`Doom telemetry status observer failed: ${T(e)}`)}return g},E=async()=>{if(!(S()||y)){if(h)return h;if(!(Date.now()<_))return g??=w().catch(e=>{_=Date.now()+c,s(`Doom telemetry initialization failed: ${T(e)}`)}).finally(()=>{g=void 0}),g}},O=async(t,n,r,i,a)=>{let o=p(n,`doom.telemetry.event`).slice(0,128),c=x({"telemetry.package":e.packageName,...i,...r===void 0?{}:D(r)});if(r!==void 0){let e=`${o}:${t}:${JSON.stringify(c)}`;if(b.has(e))return;b.size>=500&&b.clear(),b.add(e)}C({event:o,level:t,attributes:c});try{(await E())?.logger[t](o,{attributes:c,...a?.includeException===!0&&r!==void 0?{exception:r}:{}})}catch(e){s(`Doom telemetry record failed: ${T(e)}`)}},N=async()=>{try{let e=g;e&&await e,await h?.flush()}catch(e){s(`Doom telemetry flush failed: ${T(e)}`)}};return{recordDebug(e,t){return O(`debug`,e,void 0,t)},recordEvent(e,t){return O(`info`,e,void 0,t)},recordWarning(e,t,n){return O(`warn`,e,t,n)},recordError(e,t,n,r){return O(`error`,e,t,n,r)},async runInSpan(e,t,n){let r,i,a=()=>(r??=Promise.resolve().then(n),r),o=await E();if(!o)return a();let c=Date.now();try{return await o.runInSpan(p(e,`doom.telemetry.span`),{attributes:x(t)},async e=>{try{let t=await a();return e?.setAttribute(`duration_ms`,Date.now()-c),e?.setAttribute(`outcome`,`success`),t}catch(t){i={value:t};let n=D(t);for(let[t,r]of Object.entries(n))e?.setAttribute(t,r);throw e?.setAttribute(`duration_ms`,Date.now()-c),e?.setStatus({code:2}),M(t)}})}catch(e){return i?Promise.reject(i.value):r||(s(`Doom telemetry span failed: ${T(e)}`),a())}},flush:N,async shutdown(){return v||(y=!0,v=(async()=>{await N();let e=h;if(h=void 0,e)try{await e.shutdown()}catch(e){s(`Doom telemetry shutdown failed: ${T(e)}`)}})(),v)},status(){return{...m}}}}exports.createDoomTelemetryService=N,exports.createTelemetryHeaders=k,exports.sanitizeTelemetryAttributes=x,exports.subscribeTelemetryRecords=d;
2
+ //# sourceMappingURL=telemetry.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.cjs","names":[],"sources":["../../src/services/telemetry.ts"],"sourcesContent":["import type {\n DoomTelemetry,\n DoomTelemetryAttributes,\n DoomTelemetryErrorOptions,\n DoomTelemetryEventLevel,\n DoomTelemetryHandle,\n DoomTelemetryOptions,\n DoomTelemetryRecord,\n DoomTelemetryRuntimeLoader,\n DoomTelemetryStatus,\n} from '../types/telemetry.js';\n\nconst DEFAULT_RETRY_DELAY_MS = 1_000;\nconst MAX_WARNING_DETAIL_LENGTH = 512;\nconst MAX_WARNING_DETAIL_DEPTH = 3;\nconst MAX_ATTRIBUTE_STRING_LENGTH = 128;\nconst MAX_REPORTED_FAILURES = 500;\nconst MAX_EVENT_NAME_LENGTH = 128;\nconst SESSION_ID_HEADERS = ['AGENT_SESSION_ID', 'PI_SESSION_ID'] as const;\nconst PARENT_SESSION_ID_HEADERS = ['AGENT_PARENT_SESSION_ID', 'PARENT_AGENT_SESSION_ID'] as const;\nconst TRANSPORT_SESSION_HEADERS = ['PI_SESSION_ID', 'AGENT_PARENT_SESSION_ID'] as const;\nconst TRUE_VALUES = new Set(['1', 'true', 'yes']);\nconst SPAN_STATUS_ERROR = 2;\nconst SENSITIVE_ATTRIBUTE_PARTS = [\n 'prompt',\n 'message',\n 'content',\n 'payload',\n 'command',\n 'cwd',\n 'path',\n 'file',\n 'stack',\n 'traceback',\n 'transcript',\n 'diff',\n 'secret',\n 'authorization',\n 'header',\n 'environment',\n 'env',\n 'details',\n 'args',\n] as const;\nconst SAFE_RESULT_KEYS = new Set([\n 'tool.result.error',\n 'tool.result.count',\n 'tool.result.bytes',\n 'tool.result.duration_ms',\n]);\nconst SAFE_METADATA_KEY_PARTS = new Set([\n 'count',\n 'length',\n 'bytes',\n 'duration',\n 'duration_ms',\n 'size',\n 'index',\n 'number',\n 'active',\n 'enabled',\n 'previous',\n 'empty',\n 'silent',\n 'fallback',\n 'bypass',\n 'success',\n 'is_error',\n 'has_ui',\n 'requires_confirmation',\n 'exit_code',\n 'status_code',\n 'interval_seconds',\n 'concurrency',\n 'budget',\n]);\nconst SAFE_INPUT_KEYS = new Set([\n 'gen_ai.usage.input_tokens',\n 'gen_ai.usage.output_tokens',\n 'gen_ai.usage.total_tokens',\n 'gen_ai.usage.cache_read_tokens',\n 'gen_ai.usage.cache_write_tokens',\n 'gen_ai.usage.reasoning_tokens',\n]);\nconst SAFE_IDENTIFIER_KEY_PARTS = [\n 'id',\n 'correlation',\n 'session',\n 'trace',\n 'span',\n 'call',\n 'run',\n 'job',\n 'step',\n] as const;\nconst SAFE_STRING_KEY_PARTS = [\n 'name',\n 'operation',\n 'outcome',\n 'reason',\n 'status',\n 'mode',\n 'source',\n 'phase',\n 'engine',\n 'provider',\n 'model',\n 'level',\n 'type',\n 'code',\n 'signal',\n 'finish_reasons',\n 'trigger',\n 'action',\n 'kind',\n 'version',\n 'scope',\n 'layer',\n 'profile',\n 'domain',\n 'theme',\n 'leader',\n 'pass',\n 'role',\n 'stage',\n 'state',\n 'language',\n 'transport',\n 'adapter',\n 'runtime',\n 'backend',\n 'launcher',\n 'event',\n 'component',\n 'package',\n 'command_name',\n 'tool_name',\n 'token_attribution',\n] as const;\n\nconst recordObservers = new Set<(record: DoomTelemetryRecord) => void>();\n\nexport function subscribeTelemetryRecords(observer: (record: DoomTelemetryRecord) => void): () => void {\n recordObservers.add(observer);\n return () => recordObservers.delete(observer);\n}\n\nfunction isTruthy(value: string | undefined): boolean {\n return value !== undefined && TRUE_VALUES.has(value.toLowerCase());\n}\n\nfunction normalizeToken(value: string, fallback: string): string {\n const normalized = value.replace(/[^a-zA-Z0-9._:-]/g, '_').slice(0, MAX_ATTRIBUTE_STRING_LENGTH);\n return normalized || fallback;\n}\n\nfunction hashIdentifier(value: string): string {\n let hash = 2166136261;\n for (let index = 0; index < value.length; index += 1) {\n hash ^= value.charCodeAt(index);\n hash = Math.imul(hash, 16777619);\n }\n return `id_${(hash >>> 0).toString(16).padStart(8, '0')}`;\n}\n\nfunction isSafeMetadataKey(key: string): boolean {\n const normalized = key.toLowerCase();\n return [...SAFE_METADATA_KEY_PARTS].some(\n (part) => normalized === part || normalized.endsWith(`.${part}`) || normalized.endsWith(`_${part}`),\n );\n}\n\nfunction isSensitiveKey(key: string): boolean {\n const normalized = key.toLowerCase();\n if (SAFE_RESULT_KEYS.has(normalized) || SAFE_INPUT_KEYS.has(normalized) || isSafeMetadataKey(normalized))\n return false;\n return SENSITIVE_ATTRIBUTE_PARTS.some((part) => normalized.split(/[._-]/u).includes(part));\n}\n\nfunction hasSafeStringMeaning(key: string): boolean {\n const normalized = key.toLowerCase();\n return SAFE_STRING_KEY_PARTS.some(\n (part) => normalized === part || normalized.endsWith(`.${part}`) || normalized.endsWith(`_${part}`),\n );\n}\n\nfunction hasSafeIdentifierMeaning(key: string): boolean {\n const normalized = key.toLowerCase();\n return SAFE_IDENTIFIER_KEY_PARTS.some(\n (part) => normalized === part || normalized.endsWith(`.${part}`) || normalized.endsWith(`_${part}`),\n );\n}\n\nfunction isScalar(value: unknown): value is string | number | boolean {\n return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n}\n\nfunction sanitizeValue(key: string, value: string | number | boolean): string | number | boolean | undefined {\n if (typeof value === 'number') return Number.isFinite(value) ? value : undefined;\n if (typeof value === 'boolean') return value;\n if (value.length === 0 || value.length > MAX_ATTRIBUTE_STRING_LENGTH) return undefined;\n if (hasSafeIdentifierMeaning(key)) return hashIdentifier(value);\n if (!hasSafeStringMeaning(key)) return undefined;\n if (key === 'telemetry.package' || key.endsWith('.package')) {\n if (value.startsWith('/') || value.includes('\\\\')) return undefined;\n return value.replace(/[^a-zA-Z0-9@/._:-]/g, '_');\n }\n return normalizeToken(value, 'unknown');\n}\n\nexport function sanitizeTelemetryAttributes(attributes: Record<string, unknown> = {}): DoomTelemetryAttributes {\n const sanitized: DoomTelemetryAttributes = {};\n for (const [key, value] of Object.entries(attributes)) {\n if (isSensitiveKey(key) || !isScalar(value)) continue;\n const safeValue = sanitizeValue(key, value);\n if (safeValue !== undefined) sanitized[key] = safeValue;\n }\n return sanitized;\n}\n\nfunction safeErrorToken(value: string, fallback: string): string {\n if (!/^[a-zA-Z][a-zA-Z0-9._:-]{0,63}$/u.test(value)) return fallback;\n return normalizeToken(value, fallback);\n}\n\nfunction errorType(error: unknown): string {\n if (error instanceof Error) return safeErrorToken(error.name, 'Error');\n if (typeof error === 'string') return 'StringError';\n if (error && typeof error === 'object') return 'ObjectError';\n return 'UnknownError';\n}\n\n/**\n * Format an error for a local diagnostic warning.\n *\n * Deliberately separate from errorType: that produces a redacted token for the\n * exported `error.type` attribute and must stay metadata-only, whereas warnings\n * go to the local operator and are useless without the actual cause. Arrays are\n * unwrapped because OpenTelemetry's forceFlush rejects with one.\n */\nfunction describeError(error: unknown, depth = 0): string {\n if (depth > MAX_WARNING_DETAIL_DEPTH) return '...';\n if (Array.isArray(error)) return error.map((entry) => describeError(entry, depth + 1)).join('; ');\n if (error instanceof Error) {\n const rawCode = 'code' in error ? (error as { code?: unknown }).code : undefined;\n const code = typeof rawCode === 'string' || typeof rawCode === 'number' ? ` (code ${rawCode})` : '';\n const aggregate = error instanceof AggregateError ? `: ${describeError(error.errors, depth + 1)}` : '';\n const cause = error.cause === undefined ? '' : ` <- caused by ${describeError(error.cause, depth + 1)}`;\n return `${error.name}: ${error.message}${code}${aggregate}${cause}`;\n }\n if (typeof error === 'string') return error;\n if (error && typeof error === 'object') {\n try {\n return JSON.stringify(error);\n } catch {\n return 'ObjectError';\n }\n }\n return String(error);\n}\n\nfunction warningDetail(error: unknown): string {\n return describeError(error).slice(0, MAX_WARNING_DETAIL_LENGTH);\n}\n\nfunction errorCode(error: unknown): string | undefined {\n if (!error || typeof error !== 'object' || !('code' in error)) return undefined;\n const code = (error as { code?: unknown }).code;\n if (typeof code !== 'string' && typeof code !== 'number') return undefined;\n const normalized = String(code);\n return /^[a-zA-Z0-9][a-zA-Z0-9._:-]{0,63}$/u.test(normalized) ? normalizeToken(normalized, 'unknown') : undefined;\n}\n\nfunction errorAttributes(error: unknown): DoomTelemetryAttributes {\n const attributes: DoomTelemetryAttributes = {\n 'error.type': errorType(error),\n outcome: 'error',\n };\n const code = errorCode(error);\n if (code) attributes['error.code'] = code;\n return attributes;\n}\n\nfunction firstEnvironmentValue(env: NodeJS.ProcessEnv, keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const value = env[key]?.trim();\n if (value) return value;\n }\n return undefined;\n}\n\nexport function createTelemetryHeaders(serviceName: string, env: NodeJS.ProcessEnv): Record<string, string> {\n const headers: Record<string, string> = { 'x-agent': normalizeToken(serviceName, 'doom') };\n const sessionId = firstEnvironmentValue(env, SESSION_ID_HEADERS);\n const parentSessionId = firstEnvironmentValue(env, PARENT_SESSION_ID_HEADERS);\n if (sessionId) headers['x-agent-session-id'] = hashIdentifier(sessionId);\n if (parentSessionId) headers['x-agent-parent-session-id'] = hashIdentifier(parentSessionId);\n return headers;\n}\n\nfunction createTransportEnvironment(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const transportEnv = { ...env };\n const sessionId = firstEnvironmentValue(env, SESSION_ID_HEADERS);\n const parentSessionId = firstEnvironmentValue(env, PARENT_SESSION_ID_HEADERS);\n if (sessionId) transportEnv.AGENT_SESSION_ID = hashIdentifier(sessionId);\n else delete transportEnv.AGENT_SESSION_ID;\n if (parentSessionId) transportEnv.PARENT_AGENT_SESSION_ID = hashIdentifier(parentSessionId);\n else delete transportEnv.PARENT_AGENT_SESSION_ID;\n for (const key of TRANSPORT_SESSION_HEADERS) delete transportEnv[key];\n for (const key of Object.keys(transportEnv)) {\n if (key.startsWith('WORKFLOW_')) delete transportEnv[key];\n }\n return transportEnv;\n}\n\nfunction defaultStatus(options: DoomTelemetryOptions): DoomTelemetryStatus {\n return {\n serviceName: options.serviceName,\n packageName: options.packageName,\n backend: 'disabled',\n enabled: false,\n endpointSource: 'none',\n traces: false,\n fileFallback: false,\n };\n}\n\nfunction createSafeCallbackError(error: unknown): Error {\n return new Error(`Doom telemetry callback failed: ${errorType(error)}`);\n}\n\nexport function createDoomTelemetryService(\n options: DoomTelemetryOptions,\n runtimeLoader?: DoomTelemetryRuntimeLoader,\n): DoomTelemetry {\n const env = options.env ?? process.env;\n const telemetryFactory = options.telemetryFactory;\n const endpointResolver = options.endpointResolver;\n const transportEnv = createTransportEnvironment(env);\n const warn = options.warn ?? ((message: string) => process.emitWarning(message));\n const reportWarning = (message: string): void => {\n try {\n warn(message);\n } catch (error) {\n process.emitWarning(`Doom telemetry warning callback failed: ${warningDetail(error)}`);\n }\n };\n const retryDelayMs = options.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS;\n const allowFileFallback = options.allowFileFallback ?? isTruthy(env.LOG_SINK_PI_FILE_FALLBACK);\n const defaultTelemetryStatus = defaultStatus(options);\n let currentStatus = defaultTelemetryStatus;\n let handle: DoomTelemetryHandle | undefined;\n let initialization: Promise<DoomTelemetryHandle | undefined> | undefined;\n let retryAfter = 0;\n let shutdownPromise: Promise<void> | undefined;\n let shutdownRequested = false;\n const reportedFailures = new Set<string>();\n\n const disabledByEnvironment = (): boolean =>\n isTruthy(env.AGENT_TELEMETRY_DISABLED) || isTruthy(env.OTEL_SDK_DISABLED);\n\n const publish = (record: DoomTelemetryRecord): void => {\n for (const observer of [...recordObservers, ...(options.onRecord ? [options.onRecord] : [])]) {\n try {\n observer(record);\n } catch (error) {\n reportWarning(`Doom telemetry observer failed: ${warningDetail(error)}`);\n }\n }\n };\n\n const initialize = async (): Promise<DoomTelemetryHandle | undefined> => {\n if (disabledByEnvironment() || shutdownRequested) return undefined;\n const defaults = telemetryFactory && endpointResolver ? undefined : await runtimeLoader?.();\n const resolveEndpoints = endpointResolver ?? defaults?.resolveNodeTelemetryEndpoints;\n const createTelemetry = telemetryFactory ?? defaults?.createNodeTelemetry;\n if (!resolveEndpoints || !createTelemetry) throw new Error('Node telemetry runtime is unavailable.');\n const endpoints =\n options.telemetryFactory && !options.endpointResolver\n ? { endpointSource: 'env' as const, endpoint: 'injected' }\n : await resolveEndpoints({\n cwd: options.cwd,\n env,\n packageName: options.packageName,\n serviceName: options.serviceName,\n workspaceRoot: options.workspaceRoot,\n discoverEndpoint: true,\n healthCheck: true,\n });\n if (!endpoints.endpoint && !endpoints.tracesEndpoint && !endpoints.logsEndpoint && !allowFileFallback) {\n retryAfter = Date.now() + retryDelayMs;\n currentStatus = { ...defaultTelemetryStatus };\n return undefined;\n }\n const nextHandle = await createTelemetry({\n serviceName: options.serviceName,\n packageName: options.packageName,\n cwd: options.cwd,\n workspaceRoot: options.workspaceRoot,\n env: transportEnv,\n discoverEndpoint: true,\n enableLogs: options.enableLogs ?? true,\n enableTraces: options.enableTraces ?? true,\n headers: createTelemetryHeaders(options.serviceName, env),\n });\n if (shutdownRequested) {\n await nextHandle.shutdown().catch((error: unknown) => {\n reportWarning(`Doom telemetry late initialization shutdown failed: ${warningDetail(error)}`);\n });\n return undefined;\n }\n if (nextHandle.backend === 'file' && !allowFileFallback) {\n await nextHandle\n .shutdown()\n .catch((error: unknown) => reportWarning(`Doom telemetry fallback shutdown failed: ${warningDetail(error)}`));\n currentStatus = { ...defaultTelemetryStatus };\n return undefined;\n }\n handle = nextHandle;\n currentStatus = {\n serviceName: options.serviceName,\n packageName: options.packageName,\n backend: nextHandle.backend,\n enabled: nextHandle.enabled,\n endpoint: nextHandle.endpoint,\n endpointSource: nextHandle.endpointSource,\n traces: Boolean(options.enableTraces ?? true),\n fileFallback: nextHandle.backend === 'file',\n };\n try {\n options.onStatus?.({ ...currentStatus });\n } catch (error) {\n reportWarning(`Doom telemetry status observer failed: ${warningDetail(error)}`);\n }\n return nextHandle;\n };\n\n const getHandle = async (): Promise<DoomTelemetryHandle | undefined> => {\n if (disabledByEnvironment() || shutdownRequested) return undefined;\n if (handle) return handle;\n if (Date.now() < retryAfter) return undefined;\n initialization ??= initialize()\n .catch((error: unknown) => {\n retryAfter = Date.now() + retryDelayMs;\n reportWarning(`Doom telemetry initialization failed: ${warningDetail(error)}`);\n return undefined;\n })\n .finally(() => {\n initialization = undefined;\n });\n return initialization;\n };\n\n const emit = async (\n level: DoomTelemetryEventLevel,\n event: string,\n error: unknown,\n attributes: Record<string, unknown> | undefined,\n errorOptions?: DoomTelemetryErrorOptions,\n ): Promise<void> => {\n const safeEvent = normalizeToken(event, 'doom.telemetry.event').slice(0, MAX_EVENT_NAME_LENGTH);\n const safeAttributes = sanitizeTelemetryAttributes({\n 'telemetry.package': options.packageName,\n ...attributes,\n ...(error === undefined ? {} : errorAttributes(error)),\n });\n if (error !== undefined) {\n const failureKey = `${safeEvent}:${level}:${JSON.stringify(safeAttributes)}`;\n if (reportedFailures.has(failureKey)) return;\n if (reportedFailures.size >= MAX_REPORTED_FAILURES) reportedFailures.clear();\n reportedFailures.add(failureKey);\n }\n const record: DoomTelemetryRecord = { event: safeEvent, level, attributes: safeAttributes };\n publish(record);\n try {\n const nextHandle = await getHandle();\n nextHandle?.logger[level](safeEvent, {\n attributes: safeAttributes,\n ...(errorOptions?.includeException === true && error !== undefined ? { exception: error } : {}),\n });\n } catch (failure) {\n reportWarning(`Doom telemetry record failed: ${warningDetail(failure)}`);\n }\n };\n\n const flush = async (): Promise<void> => {\n try {\n const pendingInitialization = initialization;\n if (pendingInitialization) await pendingInitialization;\n await handle?.flush();\n } catch (error) {\n reportWarning(`Doom telemetry flush failed: ${warningDetail(error)}`);\n }\n };\n\n return {\n recordDebug(event, attributes) {\n return emit('debug', event, undefined, attributes);\n },\n recordEvent(event, attributes) {\n return emit('info', event, undefined, attributes);\n },\n recordWarning(event, error, attributes) {\n return emit('warn', event, error, attributes);\n },\n recordError(event, error, attributes, errorOptions) {\n return emit('error', event, error, attributes, errorOptions);\n },\n async runInSpan<T>(name: string, attributes: Record<string, unknown>, callback: () => Promise<T> | T) {\n let callbackPromise: Promise<T> | undefined;\n let callbackFailure: { value: unknown } | undefined;\n const invokeCallback = (): Promise<T> => {\n callbackPromise ??= Promise.resolve().then(callback);\n return callbackPromise;\n };\n const nextHandle = await getHandle();\n if (!nextHandle) return invokeCallback();\n const startedAt = Date.now();\n try {\n return await nextHandle.runInSpan(\n normalizeToken(name, 'doom.telemetry.span'),\n { attributes: sanitizeTelemetryAttributes(attributes) },\n async (span) => {\n try {\n const result = await invokeCallback();\n span?.setAttribute('duration_ms', Date.now() - startedAt);\n span?.setAttribute('outcome', 'success');\n return result;\n } catch (error) {\n callbackFailure = { value: error };\n const safeError = errorAttributes(error);\n for (const [key, value] of Object.entries(safeError)) span?.setAttribute(key, value);\n span?.setAttribute('duration_ms', Date.now() - startedAt);\n span?.setStatus({ code: SPAN_STATUS_ERROR });\n throw createSafeCallbackError(error);\n }\n },\n );\n } catch (error) {\n if (callbackFailure) return Promise.reject(callbackFailure.value);\n if (callbackPromise) return callbackPromise;\n reportWarning(`Doom telemetry span failed: ${warningDetail(error)}`);\n return invokeCallback();\n }\n },\n flush,\n async shutdown() {\n if (shutdownPromise) return shutdownPromise;\n shutdownRequested = true;\n shutdownPromise = (async () => {\n await flush();\n const currentHandle = handle;\n handle = undefined;\n if (!currentHandle) return;\n try {\n await currentHandle.shutdown();\n } catch (error) {\n reportWarning(`Doom telemetry shutdown failed: ${warningDetail(error)}`);\n }\n })();\n return shutdownPromise;\n },\n status() {\n return { ...currentStatus };\n },\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { DoomTelemetryAttributes, DoomTelemetryRecord } from "../types/telemetry.cjs";
2
+ //#region src/services/telemetry.d.ts
3
+ declare function subscribeTelemetryRecords(observer: (record: DoomTelemetryRecord) => void): () => void;
4
+ declare function sanitizeTelemetryAttributes(attributes?: Record<string, unknown>): DoomTelemetryAttributes;
5
+ declare function createTelemetryHeaders(serviceName: string, env: NodeJS.ProcessEnv): Record<string, string>;
6
+ //#endregion
7
+ export { createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords };
8
+ //# sourceMappingURL=telemetry.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.cts","names":[],"sources":["../../src/services/telemetry.ts"],"mappings":";;iBA8IgB,0BAA0B,WAAW,QAAQ;iBAoE7C,4BAA4B,aAAY,0BAA+B;iBAiFvE,uBAAuB,qBAAqB,KAAK,OAAO,aAAa"}
@@ -0,0 +1,8 @@
1
+ import { DoomTelemetryAttributes, DoomTelemetryRecord } from "../types/telemetry.mjs";
2
+ //#region src/services/telemetry.d.ts
3
+ declare function subscribeTelemetryRecords(observer: (record: DoomTelemetryRecord) => void): () => void;
4
+ declare function sanitizeTelemetryAttributes(attributes?: Record<string, unknown>): DoomTelemetryAttributes;
5
+ declare function createTelemetryHeaders(serviceName: string, env: NodeJS.ProcessEnv): Record<string, string>;
6
+ //#endregion
7
+ export { createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords };
8
+ //# sourceMappingURL=telemetry.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.mts","names":[],"sources":["../../src/services/telemetry.ts"],"mappings":";;iBA8IgB,0BAA0B,WAAW,QAAQ;iBAoE7C,4BAA4B,aAAY,0BAA+B;iBAiFvE,uBAAuB,qBAAqB,KAAK,OAAO,aAAa"}
@@ -0,0 +1,2 @@
1
+ const e=[`AGENT_SESSION_ID`,`PI_SESSION_ID`],t=[`AGENT_PARENT_SESSION_ID`,`PARENT_AGENT_SESSION_ID`],n=[`PI_SESSION_ID`,`AGENT_PARENT_SESSION_ID`],r=new Set([`1`,`true`,`yes`]),i=[`prompt`,`message`,`content`,`payload`,`command`,`cwd`,`path`,`file`,`stack`,`traceback`,`transcript`,`diff`,`secret`,`authorization`,`header`,`environment`,`env`,`details`,`args`],a=new Set([`tool.result.error`,`tool.result.count`,`tool.result.bytes`,`tool.result.duration_ms`]),o=new Set([`count`,`length`,`bytes`,`duration`,`duration_ms`,`size`,`index`,`number`,`active`,`enabled`,`previous`,`empty`,`silent`,`fallback`,`bypass`,`success`,`is_error`,`has_ui`,`requires_confirmation`,`exit_code`,`status_code`,`interval_seconds`,`concurrency`,`budget`]),s=new Set([`gen_ai.usage.input_tokens`,`gen_ai.usage.output_tokens`,`gen_ai.usage.total_tokens`,`gen_ai.usage.cache_read_tokens`,`gen_ai.usage.cache_write_tokens`,`gen_ai.usage.reasoning_tokens`]),c=[`id`,`correlation`,`session`,`trace`,`span`,`call`,`run`,`job`,`step`],l=`name.operation.outcome.reason.status.mode.source.phase.engine.provider.model.level.type.code.signal.finish_reasons.trigger.action.kind.version.scope.layer.profile.domain.theme.leader.pass.role.stage.state.language.transport.adapter.runtime.backend.launcher.event.component.package.command_name.tool_name.token_attribution`.split(`.`),u=new Set;function d(e){return u.add(e),()=>u.delete(e)}function f(e){return e!==void 0&&r.has(e.toLowerCase())}function p(e,t){return e.replace(/[^a-zA-Z0-9._:-]/g,`_`).slice(0,128)||t}function m(e){let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return`id_${(t>>>0).toString(16).padStart(8,`0`)}`}function h(e){let t=e.toLowerCase();return[...o].some(e=>t===e||t.endsWith(`.${e}`)||t.endsWith(`_${e}`))}function g(e){let t=e.toLowerCase();return a.has(t)||s.has(t)||h(t)?!1:i.some(e=>t.split(/[._-]/u).includes(e))}function _(e){let t=e.toLowerCase();return l.some(e=>t===e||t.endsWith(`.${e}`)||t.endsWith(`_${e}`))}function v(e){let t=e.toLowerCase();return c.some(e=>t===e||t.endsWith(`.${e}`)||t.endsWith(`_${e}`))}function y(e){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`}function b(e,t){if(typeof t==`number`)return Number.isFinite(t)?t:void 0;if(typeof t==`boolean`)return t;if(!(t.length===0||t.length>128)){if(v(e))return m(t);if(_(e))return e===`telemetry.package`||e.endsWith(`.package`)?t.startsWith(`/`)||t.includes(`\\`)?void 0:t.replace(/[^a-zA-Z0-9@/._:-]/g,`_`):p(t,`unknown`)}}function x(e={}){let t={};for(let[n,r]of Object.entries(e)){if(g(n)||!y(r))continue;let e=b(n,r);e!==void 0&&(t[n]=e)}return t}function S(e,t){return/^[a-zA-Z][a-zA-Z0-9._:-]{0,63}$/u.test(e)?p(e,t):t}function C(e){return e instanceof Error?S(e.name,`Error`):typeof e==`string`?`StringError`:e&&typeof e==`object`?`ObjectError`:`UnknownError`}function w(e,t=0){if(t>3)return`...`;if(Array.isArray(e))return e.map(e=>w(e,t+1)).join(`; `);if(e instanceof Error){let n=`code`in e?e.code:void 0,r=typeof n==`string`||typeof n==`number`?` (code ${n})`:``,i=e instanceof AggregateError?`: ${w(e.errors,t+1)}`:``,a=e.cause===void 0?``:` <- caused by ${w(e.cause,t+1)}`;return`${e.name}: ${e.message}${r}${i}${a}`}if(typeof e==`string`)return e;if(e&&typeof e==`object`)try{return JSON.stringify(e)}catch{return`ObjectError`}return String(e)}function T(e){return w(e).slice(0,512)}function E(e){if(!e||typeof e!=`object`||!(`code`in e))return;let t=e.code;if(typeof t!=`string`&&typeof t!=`number`)return;let n=String(t);return/^[a-zA-Z0-9][a-zA-Z0-9._:-]{0,63}$/u.test(n)?p(n,`unknown`):void 0}function D(e){let t={"error.type":C(e),outcome:`error`},n=E(e);return n&&(t[`error.code`]=n),t}function O(e,t){for(let n of t){let t=e[n]?.trim();if(t)return t}}function k(n,r){let i={"x-agent":p(n,`doom`)},a=O(r,e),o=O(r,t);return a&&(i[`x-agent-session-id`]=m(a)),o&&(i[`x-agent-parent-session-id`]=m(o)),i}function A(r){let i={...r},a=O(r,e),o=O(r,t);a?i.AGENT_SESSION_ID=m(a):delete i.AGENT_SESSION_ID,o?i.PARENT_AGENT_SESSION_ID=m(o):delete i.PARENT_AGENT_SESSION_ID;for(let e of n)delete i[e];for(let e of Object.keys(i))e.startsWith(`WORKFLOW_`)&&delete i[e];return i}function j(e){return{serviceName:e.serviceName,packageName:e.packageName,backend:`disabled`,enabled:!1,endpointSource:`none`,traces:!1,fileFallback:!1}}function M(e){return Error(`Doom telemetry callback failed: ${C(e)}`)}function N(e,t){let n=e.env??process.env,r=e.telemetryFactory,i=e.endpointResolver,a=A(n),o=e.warn??(e=>process.emitWarning(e)),s=e=>{try{o(e)}catch(e){process.emitWarning(`Doom telemetry warning callback failed: ${T(e)}`)}},c=e.retryDelayMs??1e3,l=e.allowFileFallback??f(n.LOG_SINK_PI_FILE_FALLBACK),d=j(e),m=d,h,g,_=0,v,y=!1,b=new Set,S=()=>f(n.AGENT_TELEMETRY_DISABLED)||f(n.OTEL_SDK_DISABLED),C=t=>{for(let n of[...u,...e.onRecord?[e.onRecord]:[]])try{n(t)}catch(e){s(`Doom telemetry observer failed: ${T(e)}`)}},w=async()=>{if(S()||y)return;let o=r&&i?void 0:await t?.(),u=i??o?.resolveNodeTelemetryEndpoints,f=r??o?.createNodeTelemetry;if(!u||!f)throw Error(`Node telemetry runtime is unavailable.`);let p=e.telemetryFactory&&!e.endpointResolver?{endpointSource:`env`,endpoint:`injected`}:await u({cwd:e.cwd,env:n,packageName:e.packageName,serviceName:e.serviceName,workspaceRoot:e.workspaceRoot,discoverEndpoint:!0,healthCheck:!0});if(!p.endpoint&&!p.tracesEndpoint&&!p.logsEndpoint&&!l){_=Date.now()+c,m={...d};return}let g=await f({serviceName:e.serviceName,packageName:e.packageName,cwd:e.cwd,workspaceRoot:e.workspaceRoot,env:a,discoverEndpoint:!0,enableLogs:e.enableLogs??!0,enableTraces:e.enableTraces??!0,headers:k(e.serviceName,n)});if(y){await g.shutdown().catch(e=>{s(`Doom telemetry late initialization shutdown failed: ${T(e)}`)});return}if(g.backend===`file`&&!l){await g.shutdown().catch(e=>s(`Doom telemetry fallback shutdown failed: ${T(e)}`)),m={...d};return}h=g,m={serviceName:e.serviceName,packageName:e.packageName,backend:g.backend,enabled:g.enabled,endpoint:g.endpoint,endpointSource:g.endpointSource,traces:!!(e.enableTraces??!0),fileFallback:g.backend===`file`};try{e.onStatus?.({...m})}catch(e){s(`Doom telemetry status observer failed: ${T(e)}`)}return g},E=async()=>{if(!(S()||y)){if(h)return h;if(!(Date.now()<_))return g??=w().catch(e=>{_=Date.now()+c,s(`Doom telemetry initialization failed: ${T(e)}`)}).finally(()=>{g=void 0}),g}},O=async(t,n,r,i,a)=>{let o=p(n,`doom.telemetry.event`).slice(0,128),c=x({"telemetry.package":e.packageName,...i,...r===void 0?{}:D(r)});if(r!==void 0){let e=`${o}:${t}:${JSON.stringify(c)}`;if(b.has(e))return;b.size>=500&&b.clear(),b.add(e)}C({event:o,level:t,attributes:c});try{(await E())?.logger[t](o,{attributes:c,...a?.includeException===!0&&r!==void 0?{exception:r}:{}})}catch(e){s(`Doom telemetry record failed: ${T(e)}`)}},N=async()=>{try{let e=g;e&&await e,await h?.flush()}catch(e){s(`Doom telemetry flush failed: ${T(e)}`)}};return{recordDebug(e,t){return O(`debug`,e,void 0,t)},recordEvent(e,t){return O(`info`,e,void 0,t)},recordWarning(e,t,n){return O(`warn`,e,t,n)},recordError(e,t,n,r){return O(`error`,e,t,n,r)},async runInSpan(e,t,n){let r,i,a=()=>(r??=Promise.resolve().then(n),r),o=await E();if(!o)return a();let c=Date.now();try{return await o.runInSpan(p(e,`doom.telemetry.span`),{attributes:x(t)},async e=>{try{let t=await a();return e?.setAttribute(`duration_ms`,Date.now()-c),e?.setAttribute(`outcome`,`success`),t}catch(t){i={value:t};let n=D(t);for(let[t,r]of Object.entries(n))e?.setAttribute(t,r);throw e?.setAttribute(`duration_ms`,Date.now()-c),e?.setStatus({code:2}),M(t)}})}catch(e){return i?Promise.reject(i.value):r||(s(`Doom telemetry span failed: ${T(e)}`),a())}},flush:N,async shutdown(){return v||(y=!0,v=(async()=>{await N();let e=h;if(h=void 0,e)try{await e.shutdown()}catch(e){s(`Doom telemetry shutdown failed: ${T(e)}`)}})(),v)},status(){return{...m}}}}export{N as createDoomTelemetryService,k as createTelemetryHeaders,x as sanitizeTelemetryAttributes,d as subscribeTelemetryRecords};
2
+ //# sourceMappingURL=telemetry.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.mjs","names":[],"sources":["../../src/services/telemetry.ts"],"sourcesContent":["import type {\n DoomTelemetry,\n DoomTelemetryAttributes,\n DoomTelemetryErrorOptions,\n DoomTelemetryEventLevel,\n DoomTelemetryHandle,\n DoomTelemetryOptions,\n DoomTelemetryRecord,\n DoomTelemetryRuntimeLoader,\n DoomTelemetryStatus,\n} from '../types/telemetry.js';\n\nconst DEFAULT_RETRY_DELAY_MS = 1_000;\nconst MAX_WARNING_DETAIL_LENGTH = 512;\nconst MAX_WARNING_DETAIL_DEPTH = 3;\nconst MAX_ATTRIBUTE_STRING_LENGTH = 128;\nconst MAX_REPORTED_FAILURES = 500;\nconst MAX_EVENT_NAME_LENGTH = 128;\nconst SESSION_ID_HEADERS = ['AGENT_SESSION_ID', 'PI_SESSION_ID'] as const;\nconst PARENT_SESSION_ID_HEADERS = ['AGENT_PARENT_SESSION_ID', 'PARENT_AGENT_SESSION_ID'] as const;\nconst TRANSPORT_SESSION_HEADERS = ['PI_SESSION_ID', 'AGENT_PARENT_SESSION_ID'] as const;\nconst TRUE_VALUES = new Set(['1', 'true', 'yes']);\nconst SPAN_STATUS_ERROR = 2;\nconst SENSITIVE_ATTRIBUTE_PARTS = [\n 'prompt',\n 'message',\n 'content',\n 'payload',\n 'command',\n 'cwd',\n 'path',\n 'file',\n 'stack',\n 'traceback',\n 'transcript',\n 'diff',\n 'secret',\n 'authorization',\n 'header',\n 'environment',\n 'env',\n 'details',\n 'args',\n] as const;\nconst SAFE_RESULT_KEYS = new Set([\n 'tool.result.error',\n 'tool.result.count',\n 'tool.result.bytes',\n 'tool.result.duration_ms',\n]);\nconst SAFE_METADATA_KEY_PARTS = new Set([\n 'count',\n 'length',\n 'bytes',\n 'duration',\n 'duration_ms',\n 'size',\n 'index',\n 'number',\n 'active',\n 'enabled',\n 'previous',\n 'empty',\n 'silent',\n 'fallback',\n 'bypass',\n 'success',\n 'is_error',\n 'has_ui',\n 'requires_confirmation',\n 'exit_code',\n 'status_code',\n 'interval_seconds',\n 'concurrency',\n 'budget',\n]);\nconst SAFE_INPUT_KEYS = new Set([\n 'gen_ai.usage.input_tokens',\n 'gen_ai.usage.output_tokens',\n 'gen_ai.usage.total_tokens',\n 'gen_ai.usage.cache_read_tokens',\n 'gen_ai.usage.cache_write_tokens',\n 'gen_ai.usage.reasoning_tokens',\n]);\nconst SAFE_IDENTIFIER_KEY_PARTS = [\n 'id',\n 'correlation',\n 'session',\n 'trace',\n 'span',\n 'call',\n 'run',\n 'job',\n 'step',\n] as const;\nconst SAFE_STRING_KEY_PARTS = [\n 'name',\n 'operation',\n 'outcome',\n 'reason',\n 'status',\n 'mode',\n 'source',\n 'phase',\n 'engine',\n 'provider',\n 'model',\n 'level',\n 'type',\n 'code',\n 'signal',\n 'finish_reasons',\n 'trigger',\n 'action',\n 'kind',\n 'version',\n 'scope',\n 'layer',\n 'profile',\n 'domain',\n 'theme',\n 'leader',\n 'pass',\n 'role',\n 'stage',\n 'state',\n 'language',\n 'transport',\n 'adapter',\n 'runtime',\n 'backend',\n 'launcher',\n 'event',\n 'component',\n 'package',\n 'command_name',\n 'tool_name',\n 'token_attribution',\n] as const;\n\nconst recordObservers = new Set<(record: DoomTelemetryRecord) => void>();\n\nexport function subscribeTelemetryRecords(observer: (record: DoomTelemetryRecord) => void): () => void {\n recordObservers.add(observer);\n return () => recordObservers.delete(observer);\n}\n\nfunction isTruthy(value: string | undefined): boolean {\n return value !== undefined && TRUE_VALUES.has(value.toLowerCase());\n}\n\nfunction normalizeToken(value: string, fallback: string): string {\n const normalized = value.replace(/[^a-zA-Z0-9._:-]/g, '_').slice(0, MAX_ATTRIBUTE_STRING_LENGTH);\n return normalized || fallback;\n}\n\nfunction hashIdentifier(value: string): string {\n let hash = 2166136261;\n for (let index = 0; index < value.length; index += 1) {\n hash ^= value.charCodeAt(index);\n hash = Math.imul(hash, 16777619);\n }\n return `id_${(hash >>> 0).toString(16).padStart(8, '0')}`;\n}\n\nfunction isSafeMetadataKey(key: string): boolean {\n const normalized = key.toLowerCase();\n return [...SAFE_METADATA_KEY_PARTS].some(\n (part) => normalized === part || normalized.endsWith(`.${part}`) || normalized.endsWith(`_${part}`),\n );\n}\n\nfunction isSensitiveKey(key: string): boolean {\n const normalized = key.toLowerCase();\n if (SAFE_RESULT_KEYS.has(normalized) || SAFE_INPUT_KEYS.has(normalized) || isSafeMetadataKey(normalized))\n return false;\n return SENSITIVE_ATTRIBUTE_PARTS.some((part) => normalized.split(/[._-]/u).includes(part));\n}\n\nfunction hasSafeStringMeaning(key: string): boolean {\n const normalized = key.toLowerCase();\n return SAFE_STRING_KEY_PARTS.some(\n (part) => normalized === part || normalized.endsWith(`.${part}`) || normalized.endsWith(`_${part}`),\n );\n}\n\nfunction hasSafeIdentifierMeaning(key: string): boolean {\n const normalized = key.toLowerCase();\n return SAFE_IDENTIFIER_KEY_PARTS.some(\n (part) => normalized === part || normalized.endsWith(`.${part}`) || normalized.endsWith(`_${part}`),\n );\n}\n\nfunction isScalar(value: unknown): value is string | number | boolean {\n return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n}\n\nfunction sanitizeValue(key: string, value: string | number | boolean): string | number | boolean | undefined {\n if (typeof value === 'number') return Number.isFinite(value) ? value : undefined;\n if (typeof value === 'boolean') return value;\n if (value.length === 0 || value.length > MAX_ATTRIBUTE_STRING_LENGTH) return undefined;\n if (hasSafeIdentifierMeaning(key)) return hashIdentifier(value);\n if (!hasSafeStringMeaning(key)) return undefined;\n if (key === 'telemetry.package' || key.endsWith('.package')) {\n if (value.startsWith('/') || value.includes('\\\\')) return undefined;\n return value.replace(/[^a-zA-Z0-9@/._:-]/g, '_');\n }\n return normalizeToken(value, 'unknown');\n}\n\nexport function sanitizeTelemetryAttributes(attributes: Record<string, unknown> = {}): DoomTelemetryAttributes {\n const sanitized: DoomTelemetryAttributes = {};\n for (const [key, value] of Object.entries(attributes)) {\n if (isSensitiveKey(key) || !isScalar(value)) continue;\n const safeValue = sanitizeValue(key, value);\n if (safeValue !== undefined) sanitized[key] = safeValue;\n }\n return sanitized;\n}\n\nfunction safeErrorToken(value: string, fallback: string): string {\n if (!/^[a-zA-Z][a-zA-Z0-9._:-]{0,63}$/u.test(value)) return fallback;\n return normalizeToken(value, fallback);\n}\n\nfunction errorType(error: unknown): string {\n if (error instanceof Error) return safeErrorToken(error.name, 'Error');\n if (typeof error === 'string') return 'StringError';\n if (error && typeof error === 'object') return 'ObjectError';\n return 'UnknownError';\n}\n\n/**\n * Format an error for a local diagnostic warning.\n *\n * Deliberately separate from errorType: that produces a redacted token for the\n * exported `error.type` attribute and must stay metadata-only, whereas warnings\n * go to the local operator and are useless without the actual cause. Arrays are\n * unwrapped because OpenTelemetry's forceFlush rejects with one.\n */\nfunction describeError(error: unknown, depth = 0): string {\n if (depth > MAX_WARNING_DETAIL_DEPTH) return '...';\n if (Array.isArray(error)) return error.map((entry) => describeError(entry, depth + 1)).join('; ');\n if (error instanceof Error) {\n const rawCode = 'code' in error ? (error as { code?: unknown }).code : undefined;\n const code = typeof rawCode === 'string' || typeof rawCode === 'number' ? ` (code ${rawCode})` : '';\n const aggregate = error instanceof AggregateError ? `: ${describeError(error.errors, depth + 1)}` : '';\n const cause = error.cause === undefined ? '' : ` <- caused by ${describeError(error.cause, depth + 1)}`;\n return `${error.name}: ${error.message}${code}${aggregate}${cause}`;\n }\n if (typeof error === 'string') return error;\n if (error && typeof error === 'object') {\n try {\n return JSON.stringify(error);\n } catch {\n return 'ObjectError';\n }\n }\n return String(error);\n}\n\nfunction warningDetail(error: unknown): string {\n return describeError(error).slice(0, MAX_WARNING_DETAIL_LENGTH);\n}\n\nfunction errorCode(error: unknown): string | undefined {\n if (!error || typeof error !== 'object' || !('code' in error)) return undefined;\n const code = (error as { code?: unknown }).code;\n if (typeof code !== 'string' && typeof code !== 'number') return undefined;\n const normalized = String(code);\n return /^[a-zA-Z0-9][a-zA-Z0-9._:-]{0,63}$/u.test(normalized) ? normalizeToken(normalized, 'unknown') : undefined;\n}\n\nfunction errorAttributes(error: unknown): DoomTelemetryAttributes {\n const attributes: DoomTelemetryAttributes = {\n 'error.type': errorType(error),\n outcome: 'error',\n };\n const code = errorCode(error);\n if (code) attributes['error.code'] = code;\n return attributes;\n}\n\nfunction firstEnvironmentValue(env: NodeJS.ProcessEnv, keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const value = env[key]?.trim();\n if (value) return value;\n }\n return undefined;\n}\n\nexport function createTelemetryHeaders(serviceName: string, env: NodeJS.ProcessEnv): Record<string, string> {\n const headers: Record<string, string> = { 'x-agent': normalizeToken(serviceName, 'doom') };\n const sessionId = firstEnvironmentValue(env, SESSION_ID_HEADERS);\n const parentSessionId = firstEnvironmentValue(env, PARENT_SESSION_ID_HEADERS);\n if (sessionId) headers['x-agent-session-id'] = hashIdentifier(sessionId);\n if (parentSessionId) headers['x-agent-parent-session-id'] = hashIdentifier(parentSessionId);\n return headers;\n}\n\nfunction createTransportEnvironment(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const transportEnv = { ...env };\n const sessionId = firstEnvironmentValue(env, SESSION_ID_HEADERS);\n const parentSessionId = firstEnvironmentValue(env, PARENT_SESSION_ID_HEADERS);\n if (sessionId) transportEnv.AGENT_SESSION_ID = hashIdentifier(sessionId);\n else delete transportEnv.AGENT_SESSION_ID;\n if (parentSessionId) transportEnv.PARENT_AGENT_SESSION_ID = hashIdentifier(parentSessionId);\n else delete transportEnv.PARENT_AGENT_SESSION_ID;\n for (const key of TRANSPORT_SESSION_HEADERS) delete transportEnv[key];\n for (const key of Object.keys(transportEnv)) {\n if (key.startsWith('WORKFLOW_')) delete transportEnv[key];\n }\n return transportEnv;\n}\n\nfunction defaultStatus(options: DoomTelemetryOptions): DoomTelemetryStatus {\n return {\n serviceName: options.serviceName,\n packageName: options.packageName,\n backend: 'disabled',\n enabled: false,\n endpointSource: 'none',\n traces: false,\n fileFallback: false,\n };\n}\n\nfunction createSafeCallbackError(error: unknown): Error {\n return new Error(`Doom telemetry callback failed: ${errorType(error)}`);\n}\n\nexport function createDoomTelemetryService(\n options: DoomTelemetryOptions,\n runtimeLoader?: DoomTelemetryRuntimeLoader,\n): DoomTelemetry {\n const env = options.env ?? process.env;\n const telemetryFactory = options.telemetryFactory;\n const endpointResolver = options.endpointResolver;\n const transportEnv = createTransportEnvironment(env);\n const warn = options.warn ?? ((message: string) => process.emitWarning(message));\n const reportWarning = (message: string): void => {\n try {\n warn(message);\n } catch (error) {\n process.emitWarning(`Doom telemetry warning callback failed: ${warningDetail(error)}`);\n }\n };\n const retryDelayMs = options.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS;\n const allowFileFallback = options.allowFileFallback ?? isTruthy(env.LOG_SINK_PI_FILE_FALLBACK);\n const defaultTelemetryStatus = defaultStatus(options);\n let currentStatus = defaultTelemetryStatus;\n let handle: DoomTelemetryHandle | undefined;\n let initialization: Promise<DoomTelemetryHandle | undefined> | undefined;\n let retryAfter = 0;\n let shutdownPromise: Promise<void> | undefined;\n let shutdownRequested = false;\n const reportedFailures = new Set<string>();\n\n const disabledByEnvironment = (): boolean =>\n isTruthy(env.AGENT_TELEMETRY_DISABLED) || isTruthy(env.OTEL_SDK_DISABLED);\n\n const publish = (record: DoomTelemetryRecord): void => {\n for (const observer of [...recordObservers, ...(options.onRecord ? [options.onRecord] : [])]) {\n try {\n observer(record);\n } catch (error) {\n reportWarning(`Doom telemetry observer failed: ${warningDetail(error)}`);\n }\n }\n };\n\n const initialize = async (): Promise<DoomTelemetryHandle | undefined> => {\n if (disabledByEnvironment() || shutdownRequested) return undefined;\n const defaults = telemetryFactory && endpointResolver ? undefined : await runtimeLoader?.();\n const resolveEndpoints = endpointResolver ?? defaults?.resolveNodeTelemetryEndpoints;\n const createTelemetry = telemetryFactory ?? defaults?.createNodeTelemetry;\n if (!resolveEndpoints || !createTelemetry) throw new Error('Node telemetry runtime is unavailable.');\n const endpoints =\n options.telemetryFactory && !options.endpointResolver\n ? { endpointSource: 'env' as const, endpoint: 'injected' }\n : await resolveEndpoints({\n cwd: options.cwd,\n env,\n packageName: options.packageName,\n serviceName: options.serviceName,\n workspaceRoot: options.workspaceRoot,\n discoverEndpoint: true,\n healthCheck: true,\n });\n if (!endpoints.endpoint && !endpoints.tracesEndpoint && !endpoints.logsEndpoint && !allowFileFallback) {\n retryAfter = Date.now() + retryDelayMs;\n currentStatus = { ...defaultTelemetryStatus };\n return undefined;\n }\n const nextHandle = await createTelemetry({\n serviceName: options.serviceName,\n packageName: options.packageName,\n cwd: options.cwd,\n workspaceRoot: options.workspaceRoot,\n env: transportEnv,\n discoverEndpoint: true,\n enableLogs: options.enableLogs ?? true,\n enableTraces: options.enableTraces ?? true,\n headers: createTelemetryHeaders(options.serviceName, env),\n });\n if (shutdownRequested) {\n await nextHandle.shutdown().catch((error: unknown) => {\n reportWarning(`Doom telemetry late initialization shutdown failed: ${warningDetail(error)}`);\n });\n return undefined;\n }\n if (nextHandle.backend === 'file' && !allowFileFallback) {\n await nextHandle\n .shutdown()\n .catch((error: unknown) => reportWarning(`Doom telemetry fallback shutdown failed: ${warningDetail(error)}`));\n currentStatus = { ...defaultTelemetryStatus };\n return undefined;\n }\n handle = nextHandle;\n currentStatus = {\n serviceName: options.serviceName,\n packageName: options.packageName,\n backend: nextHandle.backend,\n enabled: nextHandle.enabled,\n endpoint: nextHandle.endpoint,\n endpointSource: nextHandle.endpointSource,\n traces: Boolean(options.enableTraces ?? true),\n fileFallback: nextHandle.backend === 'file',\n };\n try {\n options.onStatus?.({ ...currentStatus });\n } catch (error) {\n reportWarning(`Doom telemetry status observer failed: ${warningDetail(error)}`);\n }\n return nextHandle;\n };\n\n const getHandle = async (): Promise<DoomTelemetryHandle | undefined> => {\n if (disabledByEnvironment() || shutdownRequested) return undefined;\n if (handle) return handle;\n if (Date.now() < retryAfter) return undefined;\n initialization ??= initialize()\n .catch((error: unknown) => {\n retryAfter = Date.now() + retryDelayMs;\n reportWarning(`Doom telemetry initialization failed: ${warningDetail(error)}`);\n return undefined;\n })\n .finally(() => {\n initialization = undefined;\n });\n return initialization;\n };\n\n const emit = async (\n level: DoomTelemetryEventLevel,\n event: string,\n error: unknown,\n attributes: Record<string, unknown> | undefined,\n errorOptions?: DoomTelemetryErrorOptions,\n ): Promise<void> => {\n const safeEvent = normalizeToken(event, 'doom.telemetry.event').slice(0, MAX_EVENT_NAME_LENGTH);\n const safeAttributes = sanitizeTelemetryAttributes({\n 'telemetry.package': options.packageName,\n ...attributes,\n ...(error === undefined ? {} : errorAttributes(error)),\n });\n if (error !== undefined) {\n const failureKey = `${safeEvent}:${level}:${JSON.stringify(safeAttributes)}`;\n if (reportedFailures.has(failureKey)) return;\n if (reportedFailures.size >= MAX_REPORTED_FAILURES) reportedFailures.clear();\n reportedFailures.add(failureKey);\n }\n const record: DoomTelemetryRecord = { event: safeEvent, level, attributes: safeAttributes };\n publish(record);\n try {\n const nextHandle = await getHandle();\n nextHandle?.logger[level](safeEvent, {\n attributes: safeAttributes,\n ...(errorOptions?.includeException === true && error !== undefined ? { exception: error } : {}),\n });\n } catch (failure) {\n reportWarning(`Doom telemetry record failed: ${warningDetail(failure)}`);\n }\n };\n\n const flush = async (): Promise<void> => {\n try {\n const pendingInitialization = initialization;\n if (pendingInitialization) await pendingInitialization;\n await handle?.flush();\n } catch (error) {\n reportWarning(`Doom telemetry flush failed: ${warningDetail(error)}`);\n }\n };\n\n return {\n recordDebug(event, attributes) {\n return emit('debug', event, undefined, attributes);\n },\n recordEvent(event, attributes) {\n return emit('info', event, undefined, attributes);\n },\n recordWarning(event, error, attributes) {\n return emit('warn', event, error, attributes);\n },\n recordError(event, error, attributes, errorOptions) {\n return emit('error', event, error, attributes, errorOptions);\n },\n async runInSpan<T>(name: string, attributes: Record<string, unknown>, callback: () => Promise<T> | T) {\n let callbackPromise: Promise<T> | undefined;\n let callbackFailure: { value: unknown } | undefined;\n const invokeCallback = (): Promise<T> => {\n callbackPromise ??= Promise.resolve().then(callback);\n return callbackPromise;\n };\n const nextHandle = await getHandle();\n if (!nextHandle) return invokeCallback();\n const startedAt = Date.now();\n try {\n return await nextHandle.runInSpan(\n normalizeToken(name, 'doom.telemetry.span'),\n { attributes: sanitizeTelemetryAttributes(attributes) },\n async (span) => {\n try {\n const result = await invokeCallback();\n span?.setAttribute('duration_ms', Date.now() - startedAt);\n span?.setAttribute('outcome', 'success');\n return result;\n } catch (error) {\n callbackFailure = { value: error };\n const safeError = errorAttributes(error);\n for (const [key, value] of Object.entries(safeError)) span?.setAttribute(key, value);\n span?.setAttribute('duration_ms', Date.now() - startedAt);\n span?.setStatus({ code: SPAN_STATUS_ERROR });\n throw createSafeCallbackError(error);\n }\n },\n );\n } catch (error) {\n if (callbackFailure) return Promise.reject(callbackFailure.value);\n if (callbackPromise) return callbackPromise;\n reportWarning(`Doom telemetry span failed: ${warningDetail(error)}`);\n return invokeCallback();\n }\n },\n flush,\n async shutdown() {\n if (shutdownPromise) return shutdownPromise;\n shutdownRequested = true;\n shutdownPromise = (async () => {\n await flush();\n const currentHandle = handle;\n handle = undefined;\n if (!currentHandle) return;\n try {\n await currentHandle.shutdown();\n } catch (error) {\n reportWarning(`Doom telemetry shutdown failed: ${warningDetail(error)}`);\n }\n })();\n return shutdownPromise;\n },\n status() {\n return { ...currentStatus };\n },\n };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./adapters/telemetry.cjs");exports.createDoomTelemetry=e.createDoomTelemetry,exports.createTelemetryHeaders=e.createTelemetryHeaders,exports.sanitizeTelemetryAttributes=e.sanitizeTelemetryAttributes,exports.subscribeTelemetryRecords=e.subscribeTelemetryRecords;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./services/telemetry.cjs"),t=require("./adapters/logSinkTelemetry.cjs");exports.createDoomTelemetry=t.createDoomTelemetry,exports.createTelemetryHeaders=e.createTelemetryHeaders,exports.sanitizeTelemetryAttributes=e.sanitizeTelemetryAttributes,exports.subscribeTelemetryRecords=e.subscribeTelemetryRecords;
@@ -1,2 +1,4 @@
1
- import { DoomTelemetry, DoomTelemetryAttributes, DoomTelemetryEventLevel, DoomTelemetryOptions, DoomTelemetryRecord, DoomTelemetryStatus, createDoomTelemetry, createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords } from "./adapters/telemetry.cjs";
2
- export { DoomTelemetry, DoomTelemetryAttributes, DoomTelemetryEventLevel, DoomTelemetryOptions, DoomTelemetryRecord, DoomTelemetryStatus, createDoomTelemetry, createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords };
1
+ import { DoomTelemetry, DoomTelemetryAttributes, DoomTelemetryErrorOptions, DoomTelemetryEventLevel, DoomTelemetryOptions, DoomTelemetryRecord, DoomTelemetryStatus } from "./types/telemetry.cjs";
2
+ import { createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords } from "./services/telemetry.cjs";
3
+ import { createDoomTelemetry } from "./adapters/logSinkTelemetry.cjs";
4
+ export { type DoomTelemetry, type DoomTelemetryAttributes, type DoomTelemetryErrorOptions, type DoomTelemetryEventLevel, type DoomTelemetryOptions, type DoomTelemetryRecord, type DoomTelemetryStatus, createDoomTelemetry, createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords };
@@ -1,2 +1,4 @@
1
- import { DoomTelemetry, DoomTelemetryAttributes, DoomTelemetryEventLevel, DoomTelemetryOptions, DoomTelemetryRecord, DoomTelemetryStatus, createDoomTelemetry, createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords } from "./adapters/telemetry.mjs";
2
- export { DoomTelemetry, DoomTelemetryAttributes, DoomTelemetryEventLevel, DoomTelemetryOptions, DoomTelemetryRecord, DoomTelemetryStatus, createDoomTelemetry, createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords };
1
+ import { DoomTelemetry, DoomTelemetryAttributes, DoomTelemetryErrorOptions, DoomTelemetryEventLevel, DoomTelemetryOptions, DoomTelemetryRecord, DoomTelemetryStatus } from "./types/telemetry.mjs";
2
+ import { createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords } from "./services/telemetry.mjs";
3
+ import { createDoomTelemetry } from "./adapters/logSinkTelemetry.mjs";
4
+ export { type DoomTelemetry, type DoomTelemetryAttributes, type DoomTelemetryErrorOptions, type DoomTelemetryEventLevel, type DoomTelemetryOptions, type DoomTelemetryRecord, type DoomTelemetryStatus, createDoomTelemetry, createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords };
@@ -1 +1 @@
1
- import{createDoomTelemetry as e,createTelemetryHeaders as t,sanitizeTelemetryAttributes as n,subscribeTelemetryRecords as r}from"./adapters/telemetry.mjs";export{e as createDoomTelemetry,t as createTelemetryHeaders,n as sanitizeTelemetryAttributes,r as subscribeTelemetryRecords};
1
+ import{createTelemetryHeaders as e,sanitizeTelemetryAttributes as t,subscribeTelemetryRecords as n}from"./services/telemetry.mjs";import{createDoomTelemetry as r}from"./adapters/logSinkTelemetry.mjs";export{r as createDoomTelemetry,e as createTelemetryHeaders,t as sanitizeTelemetryAttributes,n as subscribeTelemetryRecords};
@@ -1,5 +1,5 @@
1
1
  import { NodeTelemetryHandle, NodeTelemetryOptions } from "@agimon-ai/log-sink-mcp/telemetry/node";
2
- //#region src/adapters/telemetry.d.ts
2
+ //#region src/types/telemetry.d.ts
3
3
  type DoomTelemetryEventLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal';
4
4
  type DoomTelemetryAttributes = Record<string, string | number | boolean>;
5
5
  interface DoomTelemetryRecord {
@@ -33,11 +33,15 @@ interface DoomTelemetryOptions {
33
33
  onRecord?: (record: DoomTelemetryRecord) => void;
34
34
  onStatus?: (status: DoomTelemetryStatus) => void;
35
35
  }
36
+ interface DoomTelemetryErrorOptions {
37
+ /** Export the error as an OTEL exception. Callers must opt in because exception details can contain sensitive data. */
38
+ includeException?: boolean;
39
+ }
36
40
  interface DoomTelemetry {
37
41
  recordDebug(event: string, attributes?: Record<string, unknown>): Promise<void>;
38
42
  recordEvent(event: string, attributes?: Record<string, unknown>): Promise<void>;
39
43
  recordWarning(event: string, error?: unknown, attributes?: Record<string, unknown>): Promise<void>;
40
- recordError(event: string, error?: unknown, attributes?: Record<string, unknown>): Promise<void>;
44
+ recordError(event: string, error?: unknown, attributes?: Record<string, unknown>, options?: DoomTelemetryErrorOptions): Promise<void>;
41
45
  runInSpan<T>(name: string, attributes: Record<string, unknown>, callback: () => Promise<T> | T): Promise<T>;
42
46
  flush(): Promise<void>;
43
47
  shutdown(): Promise<void>;
@@ -58,10 +62,6 @@ type EndpointResolver = (options: {
58
62
  tracesEndpoint?: string;
59
63
  logsEndpoint?: string;
60
64
  }>;
61
- declare function subscribeTelemetryRecords(observer: (record: DoomTelemetryRecord) => void): () => void;
62
- declare function sanitizeTelemetryAttributes(attributes?: Record<string, unknown>): DoomTelemetryAttributes;
63
- declare function createTelemetryHeaders(serviceName: string, env: NodeJS.ProcessEnv): Record<string, string>;
64
- declare function createDoomTelemetry(options: DoomTelemetryOptions): DoomTelemetry;
65
65
  //#endregion
66
- export { DoomTelemetry, DoomTelemetryAttributes, DoomTelemetryEventLevel, DoomTelemetryOptions, DoomTelemetryRecord, DoomTelemetryStatus, createDoomTelemetry, createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords };
66
+ export { DoomTelemetry, DoomTelemetryAttributes, DoomTelemetryErrorOptions, DoomTelemetryEventLevel, DoomTelemetryOptions, DoomTelemetryRecord, DoomTelemetryStatus, EndpointResolver, TelemetryFactory };
67
67
  //# sourceMappingURL=telemetry.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.cts","names":[],"sources":["../../src/types/telemetry.ts"],"mappings":";;KAIY;KACA,0BAA0B;UAErB;EACf;EACA,OAAO;EACP,YAAY;;UAGG;EACf;EACA;EACA,SAAS;EACT;EACA;EACA,gBAAgB;EAChB;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA,MAAM,OAAO;EACb;EACA;EACA;EACA;EACA,mBAAmB;EACnB,mBAAmB;EACnB,QAAQ;EACR,YAAY,QAAQ;EACpB,YAAY,QAAQ;;UAGL;;EAEf;;UAGe;EACf,YAAY,eAAe,aAAa,0BAA0B;EAClE,YAAY,eAAe,aAAa,0BAA0B;EAClE,cAAc,eAAe,iBAAiB,aAAa,0BAA0B;EACrF,YACE,eACA,iBACA,aAAa,yBACb,UAAU,4BACT;EACH,UAAU,GAAG,cAAc,YAAY,yBAAyB,gBAAgB,QAAQ,KAAK,IAAI,QAAQ;EACzG,SAAS;EACT,YAAY;EACZ,UAAU;;KAGA,oBAAoB,SAAS,yBAAyB,QAAQ;KAC9D,oBAAoB;EAC9B;EACA,MAAM,OAAO;EACb;EACA;EACA;EACA;EACA;MACI;EACJ,gBAAgB;EAChB;EACA;EACA"}
@@ -1,5 +1,5 @@
1
1
  import { NodeTelemetryHandle, NodeTelemetryOptions } from "@agimon-ai/log-sink-mcp/telemetry/node";
2
- //#region src/adapters/telemetry.d.ts
2
+ //#region src/types/telemetry.d.ts
3
3
  type DoomTelemetryEventLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal';
4
4
  type DoomTelemetryAttributes = Record<string, string | number | boolean>;
5
5
  interface DoomTelemetryRecord {
@@ -33,11 +33,15 @@ interface DoomTelemetryOptions {
33
33
  onRecord?: (record: DoomTelemetryRecord) => void;
34
34
  onStatus?: (status: DoomTelemetryStatus) => void;
35
35
  }
36
+ interface DoomTelemetryErrorOptions {
37
+ /** Export the error as an OTEL exception. Callers must opt in because exception details can contain sensitive data. */
38
+ includeException?: boolean;
39
+ }
36
40
  interface DoomTelemetry {
37
41
  recordDebug(event: string, attributes?: Record<string, unknown>): Promise<void>;
38
42
  recordEvent(event: string, attributes?: Record<string, unknown>): Promise<void>;
39
43
  recordWarning(event: string, error?: unknown, attributes?: Record<string, unknown>): Promise<void>;
40
- recordError(event: string, error?: unknown, attributes?: Record<string, unknown>): Promise<void>;
44
+ recordError(event: string, error?: unknown, attributes?: Record<string, unknown>, options?: DoomTelemetryErrorOptions): Promise<void>;
41
45
  runInSpan<T>(name: string, attributes: Record<string, unknown>, callback: () => Promise<T> | T): Promise<T>;
42
46
  flush(): Promise<void>;
43
47
  shutdown(): Promise<void>;
@@ -58,10 +62,6 @@ type EndpointResolver = (options: {
58
62
  tracesEndpoint?: string;
59
63
  logsEndpoint?: string;
60
64
  }>;
61
- declare function subscribeTelemetryRecords(observer: (record: DoomTelemetryRecord) => void): () => void;
62
- declare function sanitizeTelemetryAttributes(attributes?: Record<string, unknown>): DoomTelemetryAttributes;
63
- declare function createTelemetryHeaders(serviceName: string, env: NodeJS.ProcessEnv): Record<string, string>;
64
- declare function createDoomTelemetry(options: DoomTelemetryOptions): DoomTelemetry;
65
65
  //#endregion
66
- export { DoomTelemetry, DoomTelemetryAttributes, DoomTelemetryEventLevel, DoomTelemetryOptions, DoomTelemetryRecord, DoomTelemetryStatus, createDoomTelemetry, createTelemetryHeaders, sanitizeTelemetryAttributes, subscribeTelemetryRecords };
66
+ export { DoomTelemetry, DoomTelemetryAttributes, DoomTelemetryErrorOptions, DoomTelemetryEventLevel, DoomTelemetryOptions, DoomTelemetryRecord, DoomTelemetryStatus, EndpointResolver, TelemetryFactory };
67
67
  //# sourceMappingURL=telemetry.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.mts","names":[],"sources":["../../src/types/telemetry.ts"],"mappings":";;KAIY;KACA,0BAA0B;UAErB;EACf;EACA,OAAO;EACP,YAAY;;UAGG;EACf;EACA;EACA,SAAS;EACT;EACA;EACA,gBAAgB;EAChB;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA,MAAM,OAAO;EACb;EACA;EACA;EACA;EACA,mBAAmB;EACnB,mBAAmB;EACnB,QAAQ;EACR,YAAY,QAAQ;EACpB,YAAY,QAAQ;;UAGL;;EAEf;;UAGe;EACf,YAAY,eAAe,aAAa,0BAA0B;EAClE,YAAY,eAAe,aAAa,0BAA0B;EAClE,cAAc,eAAe,iBAAiB,aAAa,0BAA0B;EACrF,YACE,eACA,iBACA,aAAa,yBACb,UAAU,4BACT;EACH,UAAU,GAAG,cAAc,YAAY,yBAAyB,gBAAgB,QAAQ,KAAK,IAAI,QAAQ;EACzG,SAAS;EACT,YAAY;EACZ,UAAU;;KAGA,oBAAoB,SAAS,yBAAyB,QAAQ;KAC9D,oBAAoB;EAC9B;EACA,MAAM,OAAO;EACb;EACA;EACA;EACA;EACA;MACI;EACJ,gBAAgB;EAChB;EACA;EACA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agimon-ai/doompi-telemetry",
3
- "version": "0.0.1-alpha.13",
3
+ "version": "0.0.1-alpha.15",
4
4
  "description": "Metadata-only LogSink telemetry for Doompi runtimes",
5
5
  "homepage": "https://agimon.ai",
6
6
  "license": "MIT",
@@ -30,7 +30,7 @@
30
30
  "registry": "https://registry.npmjs.org/"
31
31
  },
32
32
  "dependencies": {
33
- "@agimon-ai/log-sink-mcp": "0.29.3"
33
+ "@agimon-ai/log-sink-mcp": "0.29.5"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@types/node": "26.1.1",
@@ -1,2 +0,0 @@
1
- let e=require("node:util");const t=[`AGENT_SESSION_ID`,`PI_SESSION_ID`],n=[`AGENT_PARENT_SESSION_ID`,`PARENT_AGENT_SESSION_ID`],r=[`PI_SESSION_ID`,`AGENT_PARENT_SESSION_ID`],i=new Set([`1`,`true`,`yes`]),a=[`prompt`,`message`,`content`,`payload`,`command`,`cwd`,`path`,`file`,`stack`,`traceback`,`transcript`,`diff`,`secret`,`authorization`,`header`,`environment`,`env`,`details`,`args`],o=new Set([`tool.result.error`,`tool.result.count`,`tool.result.bytes`,`tool.result.duration_ms`]),s=new Set([`count`,`length`,`bytes`,`duration`,`duration_ms`,`size`,`index`,`number`,`active`,`enabled`,`previous`,`empty`,`silent`,`fallback`,`bypass`,`success`,`is_error`,`has_ui`,`requires_confirmation`,`exit_code`,`status_code`,`interval_seconds`,`concurrency`,`budget`]),c=new Set([`gen_ai.usage.input_tokens`,`gen_ai.usage.output_tokens`,`gen_ai.usage.total_tokens`,`gen_ai.usage.cache_read_tokens`,`gen_ai.usage.cache_write_tokens`,`gen_ai.usage.reasoning_tokens`]),l=[`id`,`correlation`,`session`,`trace`,`span`,`call`,`run`,`job`,`step`],u=`name.operation.outcome.reason.status.mode.source.phase.engine.provider.model.level.type.code.signal.finish_reasons.trigger.action.kind.version.scope.layer.profile.domain.theme.leader.pass.role.stage.state.language.transport.adapter.runtime.backend.launcher.event.component.package.command_name.tool_name.token_attribution`.split(`.`);let d;function f(){return d??=import(`@agimon-ai/log-sink-mcp/telemetry/node`),d}const p=new Set;function m(e){return p.add(e),()=>p.delete(e)}function h(e){return e!==void 0&&i.has(e.toLowerCase())}function g(e,t){return e.replace(/[^a-zA-Z0-9._:-]/g,`_`).slice(0,128)||t}function _(e){let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return`id_${(t>>>0).toString(16).padStart(8,`0`)}`}function v(e){let t=e.toLowerCase();return[...s].some(e=>t===e||t.endsWith(`.${e}`)||t.endsWith(`_${e}`))}function y(e){let t=e.toLowerCase();return o.has(t)||c.has(t)||v(t)?!1:a.some(e=>t.split(/[._-]/u).includes(e))}function b(e){let t=e.toLowerCase();return u.some(e=>t===e||t.endsWith(`.${e}`)||t.endsWith(`_${e}`))}function x(e){let t=e.toLowerCase();return l.some(e=>t===e||t.endsWith(`.${e}`)||t.endsWith(`_${e}`))}function S(e){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`}function C(e,t){if(typeof t==`number`)return Number.isFinite(t)?t:void 0;if(typeof t==`boolean`)return t;if(!(t.length===0||t.length>128)){if(x(e))return _(t);if(b(e))return e===`telemetry.package`||e.endsWith(`.package`)?t.startsWith(`/`)||t.includes(`\\`)?void 0:t.replace(/[^a-zA-Z0-9@/._:-]/g,`_`):g(t,`unknown`)}}function w(e={}){let t={};for(let[n,r]of Object.entries(e)){if(y(n)||!S(r))continue;let e=C(n,r);e!==void 0&&(t[n]=e)}return t}function T(e,t){return/^[a-zA-Z][a-zA-Z0-9._:-]{0,63}$/u.test(e)?g(e,t):t}function E(e){return e instanceof Error?T(e.name,`Error`):typeof e==`string`?`StringError`:e&&typeof e==`object`?`ObjectError`:`UnknownError`}function D(t,n=0){if(n>3)return`...`;if(Array.isArray(t))return t.map(e=>D(e,n+1)).join(`; `);if(t instanceof Error){let e=`code`in t?t.code:void 0,r=typeof e==`string`||typeof e==`number`?` (code ${e})`:``,i=t instanceof AggregateError?`: ${D(t.errors,n+1)}`:``,a=t.cause===void 0?``:` <- caused by ${D(t.cause,n+1)}`;return`${t.name}: ${t.message}${r}${i}${a}`}return typeof t==`string`?t:t&&typeof t==`object`?(0,e.inspect)(t,{depth:2,breakLength:1/0}):String(t)}function O(e){return D(e).slice(0,512)}function k(e){if(!e||typeof e!=`object`||!(`code`in e))return;let t=e.code;if(typeof t!=`string`&&typeof t!=`number`)return;let n=String(t);return/^[a-zA-Z0-9][a-zA-Z0-9._:-]{0,63}$/u.test(n)?g(n,`unknown`):void 0}function A(e){let t={"error.type":E(e),outcome:`error`},n=k(e);return n&&(t[`error.code`]=n),t}function j(e,t){for(let n of t){let t=e[n]?.trim();if(t)return t}}function M(e,r){let i={"x-agent":g(e,`doom`)},a=j(r,t),o=j(r,n);return a&&(i[`x-agent-session-id`]=_(a)),o&&(i[`x-agent-parent-session-id`]=_(o)),i}function N(e){let i={...e},a=j(e,t),o=j(e,n);a?i.AGENT_SESSION_ID=_(a):delete i.AGENT_SESSION_ID,o?i.PARENT_AGENT_SESSION_ID=_(o):delete i.PARENT_AGENT_SESSION_ID;for(let e of r)delete i[e];for(let e of Object.keys(i))e.startsWith(`WORKFLOW_`)&&delete i[e];return i}function P(e){return{serviceName:e.serviceName,packageName:e.packageName,backend:`disabled`,enabled:!1,endpointSource:`none`,traces:!1,fileFallback:!1}}function F(e){return Error(`Doom telemetry callback failed: ${E(e)}`)}function I(e){let t=e.env??process.env,n=e.telemetryFactory,r=e.endpointResolver,i=N(t),a=e.warn??(e=>process.emitWarning(e)),o=e=>{try{a(e)}catch(e){process.emitWarning(`Doom telemetry warning callback failed: ${O(e)}`)}},s=e.retryDelayMs??1e3,c=e.allowFileFallback??h(t.LOG_SINK_PI_FILE_FALLBACK),l=P(e),u=l,d,m,_=0,v,y=!1,b=new Set,x=()=>h(t.AGENT_TELEMETRY_DISABLED)||h(t.OTEL_SDK_DISABLED),S=t=>{for(let n of[...p,...e.onRecord?[e.onRecord]:[]])try{n(t)}catch(e){o(`Doom telemetry observer failed: ${O(e)}`)}},C=async()=>{if(x()||y)return;let a=n&&r?void 0:await f(),p=r??a?.resolveNodeTelemetryEndpoints,m=n??a?.createNodeTelemetry;if(!p||!m)throw Error(`Node telemetry runtime is unavailable.`);let h=e.telemetryFactory&&!e.endpointResolver?{endpointSource:`env`,endpoint:`injected`}:await p({cwd:e.cwd,env:t,packageName:e.packageName,serviceName:e.serviceName,workspaceRoot:e.workspaceRoot,discoverEndpoint:!0,healthCheck:!0});if(!h.endpoint&&!h.tracesEndpoint&&!h.logsEndpoint&&!c){_=Date.now()+s,u={...l};return}let g=await m({serviceName:e.serviceName,packageName:e.packageName,cwd:e.cwd,workspaceRoot:e.workspaceRoot,env:i,discoverEndpoint:!0,enableLogs:e.enableLogs??!0,enableTraces:e.enableTraces??!0,headers:M(e.serviceName,t)});if(y){await g.shutdown().catch(e=>{o(`Doom telemetry late initialization shutdown failed: ${O(e)}`)});return}if(g.backend===`file`&&!c){await g.shutdown().catch(e=>o(`Doom telemetry fallback shutdown failed: ${O(e)}`)),u={...l};return}d=g,u={serviceName:e.serviceName,packageName:e.packageName,backend:g.backend,enabled:g.enabled,endpoint:g.endpoint,endpointSource:g.endpointSource,traces:!!(e.enableTraces??!0),fileFallback:g.backend===`file`};try{e.onStatus?.({...u})}catch(e){o(`Doom telemetry status observer failed: ${O(e)}`)}return g},T=async()=>{if(!(x()||y)){if(d)return d;if(!(Date.now()<_))return m??=C().catch(e=>{_=Date.now()+s,o(`Doom telemetry initialization failed: ${O(e)}`)}).finally(()=>{m=void 0}),m}},E=async(t,n,r,i)=>{let a=g(n,`doom.telemetry.event`).slice(0,128),s=w({"telemetry.package":e.packageName,...i,...r===void 0?{}:A(r)});if(r!==void 0){let e=`${a}:${t}:${JSON.stringify(s)}`;if(b.has(e))return;b.size>=500&&b.clear(),b.add(e)}S({event:a,level:t,attributes:s});try{(await T())?.logger[t](a,{attributes:s})}catch(e){o(`Doom telemetry record failed: ${O(e)}`)}},D=async()=>{try{let e=m;e&&await e,await d?.flush()}catch(e){o(`Doom telemetry flush failed: ${O(e)}`)}};return{recordDebug(e,t){return E(`debug`,e,void 0,t)},recordEvent(e,t){return E(`info`,e,void 0,t)},recordWarning(e,t,n){return E(`warn`,e,t,n)},recordError(e,t,n){return E(`error`,e,t,n)},async runInSpan(e,t,n){let r,i,a=()=>(r??=Promise.resolve().then(n),r),s=await T();if(!s)return a();let c=Date.now();try{return await s.runInSpan(g(e,`doom.telemetry.span`),{attributes:w(t)},async e=>{try{let t=await a();return e?.setAttribute(`duration_ms`,Date.now()-c),e?.setAttribute(`outcome`,`success`),t}catch(t){i={value:t};let n=A(t);for(let[t,r]of Object.entries(n))e?.setAttribute(t,r);throw e?.setAttribute(`duration_ms`,Date.now()-c),e?.setStatus({code:2}),F(t)}})}catch(e){return i?Promise.reject(i.value):r||(o(`Doom telemetry span failed: ${O(e)}`),a())}},flush:D,async shutdown(){return v||(y=!0,v=(async()=>{await D();let e=d;if(d=void 0,e)try{await e.shutdown()}catch(e){o(`Doom telemetry shutdown failed: ${O(e)}`)}})(),v)},status(){return{...u}}}}exports.createDoomTelemetry=I,exports.createTelemetryHeaders=M,exports.sanitizeTelemetryAttributes=w,exports.subscribeTelemetryRecords=m;
2
- //# sourceMappingURL=telemetry.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"telemetry.cjs","names":["inspect"],"sources":["../../src/adapters/telemetry.ts"],"sourcesContent":["import { inspect } from 'node:util';\nimport type { NodeTelemetryHandle, NodeTelemetryOptions } from '@agimon-ai/log-sink-mcp/telemetry/node';\n\nconst DEFAULT_RETRY_DELAY_MS = 1_000;\nconst MAX_WARNING_DETAIL_LENGTH = 512;\nconst MAX_WARNING_DETAIL_DEPTH = 3;\nconst MAX_ATTRIBUTE_STRING_LENGTH = 128;\nconst MAX_REPORTED_FAILURES = 500;\nconst MAX_EVENT_NAME_LENGTH = 128;\nconst SESSION_ID_HEADERS = ['AGENT_SESSION_ID', 'PI_SESSION_ID'] as const;\nconst PARENT_SESSION_ID_HEADERS = ['AGENT_PARENT_SESSION_ID', 'PARENT_AGENT_SESSION_ID'] as const;\nconst TRANSPORT_SESSION_HEADERS = ['PI_SESSION_ID', 'AGENT_PARENT_SESSION_ID'] as const;\nconst TRUE_VALUES = new Set(['1', 'true', 'yes']);\nconst SPAN_STATUS_ERROR = 2;\nconst SENSITIVE_ATTRIBUTE_PARTS = [\n 'prompt',\n 'message',\n 'content',\n 'payload',\n 'command',\n 'cwd',\n 'path',\n 'file',\n 'stack',\n 'traceback',\n 'transcript',\n 'diff',\n 'secret',\n 'authorization',\n 'header',\n 'environment',\n 'env',\n 'details',\n 'args',\n] as const;\nconst SAFE_RESULT_KEYS = new Set([\n 'tool.result.error',\n 'tool.result.count',\n 'tool.result.bytes',\n 'tool.result.duration_ms',\n]);\nconst SAFE_METADATA_KEY_PARTS = new Set([\n 'count',\n 'length',\n 'bytes',\n 'duration',\n 'duration_ms',\n 'size',\n 'index',\n 'number',\n 'active',\n 'enabled',\n 'previous',\n 'empty',\n 'silent',\n 'fallback',\n 'bypass',\n 'success',\n 'is_error',\n 'has_ui',\n 'requires_confirmation',\n 'exit_code',\n 'status_code',\n 'interval_seconds',\n 'concurrency',\n 'budget',\n]);\nconst SAFE_INPUT_KEYS = new Set([\n 'gen_ai.usage.input_tokens',\n 'gen_ai.usage.output_tokens',\n 'gen_ai.usage.total_tokens',\n 'gen_ai.usage.cache_read_tokens',\n 'gen_ai.usage.cache_write_tokens',\n 'gen_ai.usage.reasoning_tokens',\n]);\nconst SAFE_IDENTIFIER_KEY_PARTS = [\n 'id',\n 'correlation',\n 'session',\n 'trace',\n 'span',\n 'call',\n 'run',\n 'job',\n 'step',\n] as const;\nconst SAFE_STRING_KEY_PARTS = [\n 'name',\n 'operation',\n 'outcome',\n 'reason',\n 'status',\n 'mode',\n 'source',\n 'phase',\n 'engine',\n 'provider',\n 'model',\n 'level',\n 'type',\n 'code',\n 'signal',\n 'finish_reasons',\n 'trigger',\n 'action',\n 'kind',\n 'version',\n 'scope',\n 'layer',\n 'profile',\n 'domain',\n 'theme',\n 'leader',\n 'pass',\n 'role',\n 'stage',\n 'state',\n 'language',\n 'transport',\n 'adapter',\n 'runtime',\n 'backend',\n 'launcher',\n 'event',\n 'component',\n 'package',\n 'command_name',\n 'tool_name',\n 'token_attribution',\n] as const;\n\nexport type DoomTelemetryEventLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal';\nexport type DoomTelemetryAttributes = Record<string, string | number | boolean>;\n\nexport interface DoomTelemetryRecord {\n event: string;\n level: DoomTelemetryEventLevel;\n attributes: DoomTelemetryAttributes;\n}\n\nexport interface DoomTelemetryStatus {\n serviceName: string;\n packageName?: string;\n backend: NodeTelemetryHandle['backend'] | 'disabled';\n enabled: boolean;\n endpoint?: string;\n endpointSource: NodeTelemetryHandle['endpointSource'];\n traces: boolean;\n fileFallback: boolean;\n}\n\nexport interface DoomTelemetryOptions {\n serviceName: string;\n packageName?: string;\n cwd?: string;\n workspaceRoot?: string;\n env?: NodeJS.ProcessEnv;\n enableTraces?: boolean;\n enableLogs?: boolean;\n allowFileFallback?: boolean;\n retryDelayMs?: number;\n telemetryFactory?: TelemetryFactory;\n endpointResolver?: EndpointResolver;\n warn?: (message: string) => void;\n onRecord?: (record: DoomTelemetryRecord) => void;\n onStatus?: (status: DoomTelemetryStatus) => void;\n}\n\nexport interface DoomTelemetry {\n recordDebug(event: string, attributes?: Record<string, unknown>): Promise<void>;\n recordEvent(event: string, attributes?: Record<string, unknown>): Promise<void>;\n recordWarning(event: string, error?: unknown, attributes?: Record<string, unknown>): Promise<void>;\n recordError(event: string, error?: unknown, attributes?: Record<string, unknown>): Promise<void>;\n runInSpan<T>(name: string, attributes: Record<string, unknown>, callback: () => Promise<T> | T): Promise<T>;\n flush(): Promise<void>;\n shutdown(): Promise<void>;\n status(): DoomTelemetryStatus;\n}\n\ntype TelemetryFactory = (options: NodeTelemetryOptions) => Promise<NodeTelemetryHandle>;\ntype EndpointResolver = (options: {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n packageName?: string;\n serviceName?: string;\n workspaceRoot?: string;\n discoverEndpoint?: boolean;\n healthCheck?: boolean;\n}) => Promise<{\n endpointSource: NodeTelemetryHandle['endpointSource'];\n endpoint?: string;\n tracesEndpoint?: string;\n logsEndpoint?: string;\n}>;\n\ntype NodeTelemetryModule = typeof import('@agimon-ai/log-sink-mcp/telemetry/node');\nlet nodeTelemetryModule: Promise<NodeTelemetryModule> | undefined;\n\nfunction loadNodeTelemetryModule(): Promise<NodeTelemetryModule> {\n nodeTelemetryModule ??= import('@agimon-ai/log-sink-mcp/telemetry/node');\n return nodeTelemetryModule;\n}\n\nconst recordObservers = new Set<(record: DoomTelemetryRecord) => void>();\n\nexport function subscribeTelemetryRecords(observer: (record: DoomTelemetryRecord) => void): () => void {\n recordObservers.add(observer);\n return () => recordObservers.delete(observer);\n}\n\nfunction isTruthy(value: string | undefined): boolean {\n return value !== undefined && TRUE_VALUES.has(value.toLowerCase());\n}\n\nfunction normalizeToken(value: string, fallback: string): string {\n const normalized = value.replace(/[^a-zA-Z0-9._:-]/g, '_').slice(0, MAX_ATTRIBUTE_STRING_LENGTH);\n return normalized || fallback;\n}\n\nfunction hashIdentifier(value: string): string {\n let hash = 2166136261;\n for (let index = 0; index < value.length; index += 1) {\n hash ^= value.charCodeAt(index);\n hash = Math.imul(hash, 16777619);\n }\n return `id_${(hash >>> 0).toString(16).padStart(8, '0')}`;\n}\n\nfunction isSafeMetadataKey(key: string): boolean {\n const normalized = key.toLowerCase();\n return [...SAFE_METADATA_KEY_PARTS].some(\n (part) => normalized === part || normalized.endsWith(`.${part}`) || normalized.endsWith(`_${part}`),\n );\n}\n\nfunction isSensitiveKey(key: string): boolean {\n const normalized = key.toLowerCase();\n if (SAFE_RESULT_KEYS.has(normalized) || SAFE_INPUT_KEYS.has(normalized) || isSafeMetadataKey(normalized))\n return false;\n return SENSITIVE_ATTRIBUTE_PARTS.some((part) => normalized.split(/[._-]/u).includes(part));\n}\n\nfunction hasSafeStringMeaning(key: string): boolean {\n const normalized = key.toLowerCase();\n return SAFE_STRING_KEY_PARTS.some(\n (part) => normalized === part || normalized.endsWith(`.${part}`) || normalized.endsWith(`_${part}`),\n );\n}\n\nfunction hasSafeIdentifierMeaning(key: string): boolean {\n const normalized = key.toLowerCase();\n return SAFE_IDENTIFIER_KEY_PARTS.some(\n (part) => normalized === part || normalized.endsWith(`.${part}`) || normalized.endsWith(`_${part}`),\n );\n}\n\nfunction isScalar(value: unknown): value is string | number | boolean {\n return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n}\n\nfunction sanitizeValue(key: string, value: string | number | boolean): string | number | boolean | undefined {\n if (typeof value === 'number') return Number.isFinite(value) ? value : undefined;\n if (typeof value === 'boolean') return value;\n if (value.length === 0 || value.length > MAX_ATTRIBUTE_STRING_LENGTH) return undefined;\n if (hasSafeIdentifierMeaning(key)) return hashIdentifier(value);\n if (!hasSafeStringMeaning(key)) return undefined;\n if (key === 'telemetry.package' || key.endsWith('.package')) {\n if (value.startsWith('/') || value.includes('\\\\')) return undefined;\n return value.replace(/[^a-zA-Z0-9@/._:-]/g, '_');\n }\n return normalizeToken(value, 'unknown');\n}\n\nexport function sanitizeTelemetryAttributes(attributes: Record<string, unknown> = {}): DoomTelemetryAttributes {\n const sanitized: DoomTelemetryAttributes = {};\n for (const [key, value] of Object.entries(attributes)) {\n if (isSensitiveKey(key) || !isScalar(value)) continue;\n const safeValue = sanitizeValue(key, value);\n if (safeValue !== undefined) sanitized[key] = safeValue;\n }\n return sanitized;\n}\n\nfunction safeErrorToken(value: string, fallback: string): string {\n if (!/^[a-zA-Z][a-zA-Z0-9._:-]{0,63}$/u.test(value)) return fallback;\n return normalizeToken(value, fallback);\n}\n\nfunction errorType(error: unknown): string {\n if (error instanceof Error) return safeErrorToken(error.name, 'Error');\n if (typeof error === 'string') return 'StringError';\n if (error && typeof error === 'object') return 'ObjectError';\n return 'UnknownError';\n}\n\n/**\n * Format an error for a local diagnostic warning.\n *\n * Deliberately separate from errorType: that produces a redacted token for the\n * exported `error.type` attribute and must stay metadata-only, whereas warnings\n * go to the local operator and are useless without the actual cause. Arrays are\n * unwrapped because OpenTelemetry's forceFlush rejects with one.\n */\nfunction describeError(error: unknown, depth = 0): string {\n if (depth > MAX_WARNING_DETAIL_DEPTH) return '...';\n if (Array.isArray(error)) return error.map((entry) => describeError(entry, depth + 1)).join('; ');\n if (error instanceof Error) {\n const rawCode = 'code' in error ? (error as { code?: unknown }).code : undefined;\n const code = typeof rawCode === 'string' || typeof rawCode === 'number' ? ` (code ${rawCode})` : '';\n const aggregate = error instanceof AggregateError ? `: ${describeError(error.errors, depth + 1)}` : '';\n const cause = error.cause === undefined ? '' : ` <- caused by ${describeError(error.cause, depth + 1)}`;\n return `${error.name}: ${error.message}${code}${aggregate}${cause}`;\n }\n if (typeof error === 'string') return error;\n if (error && typeof error === 'object') return inspect(error, { depth: 2, breakLength: Infinity });\n return String(error);\n}\n\nfunction warningDetail(error: unknown): string {\n return describeError(error).slice(0, MAX_WARNING_DETAIL_LENGTH);\n}\n\nfunction errorCode(error: unknown): string | undefined {\n if (!error || typeof error !== 'object' || !('code' in error)) return undefined;\n const code = (error as { code?: unknown }).code;\n if (typeof code !== 'string' && typeof code !== 'number') return undefined;\n const normalized = String(code);\n return /^[a-zA-Z0-9][a-zA-Z0-9._:-]{0,63}$/u.test(normalized) ? normalizeToken(normalized, 'unknown') : undefined;\n}\n\nfunction errorAttributes(error: unknown): DoomTelemetryAttributes {\n const attributes: DoomTelemetryAttributes = {\n 'error.type': errorType(error),\n outcome: 'error',\n };\n const code = errorCode(error);\n if (code) attributes['error.code'] = code;\n return attributes;\n}\n\nfunction firstEnvironmentValue(env: NodeJS.ProcessEnv, keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const value = env[key]?.trim();\n if (value) return value;\n }\n return undefined;\n}\n\nexport function createTelemetryHeaders(serviceName: string, env: NodeJS.ProcessEnv): Record<string, string> {\n const headers: Record<string, string> = { 'x-agent': normalizeToken(serviceName, 'doom') };\n const sessionId = firstEnvironmentValue(env, SESSION_ID_HEADERS);\n const parentSessionId = firstEnvironmentValue(env, PARENT_SESSION_ID_HEADERS);\n if (sessionId) headers['x-agent-session-id'] = hashIdentifier(sessionId);\n if (parentSessionId) headers['x-agent-parent-session-id'] = hashIdentifier(parentSessionId);\n return headers;\n}\n\nfunction createTransportEnvironment(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const transportEnv = { ...env };\n const sessionId = firstEnvironmentValue(env, SESSION_ID_HEADERS);\n const parentSessionId = firstEnvironmentValue(env, PARENT_SESSION_ID_HEADERS);\n if (sessionId) transportEnv.AGENT_SESSION_ID = hashIdentifier(sessionId);\n else delete transportEnv.AGENT_SESSION_ID;\n if (parentSessionId) transportEnv.PARENT_AGENT_SESSION_ID = hashIdentifier(parentSessionId);\n else delete transportEnv.PARENT_AGENT_SESSION_ID;\n for (const key of TRANSPORT_SESSION_HEADERS) delete transportEnv[key];\n for (const key of Object.keys(transportEnv)) {\n if (key.startsWith('WORKFLOW_')) delete transportEnv[key];\n }\n return transportEnv;\n}\n\nfunction defaultStatus(options: DoomTelemetryOptions): DoomTelemetryStatus {\n return {\n serviceName: options.serviceName,\n packageName: options.packageName,\n backend: 'disabled',\n enabled: false,\n endpointSource: 'none',\n traces: false,\n fileFallback: false,\n };\n}\n\nfunction createSafeCallbackError(error: unknown): Error {\n return new Error(`Doom telemetry callback failed: ${errorType(error)}`);\n}\n\nexport function createDoomTelemetry(options: DoomTelemetryOptions): DoomTelemetry {\n const env = options.env ?? process.env;\n const telemetryFactory = options.telemetryFactory;\n const endpointResolver = options.endpointResolver;\n const transportEnv = createTransportEnvironment(env);\n const warn = options.warn ?? ((message: string) => process.emitWarning(message));\n const reportWarning = (message: string): void => {\n try {\n warn(message);\n } catch (error) {\n process.emitWarning(`Doom telemetry warning callback failed: ${warningDetail(error)}`);\n }\n };\n const retryDelayMs = options.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS;\n const allowFileFallback = options.allowFileFallback ?? isTruthy(env.LOG_SINK_PI_FILE_FALLBACK);\n const defaultTelemetryStatus = defaultStatus(options);\n let currentStatus = defaultTelemetryStatus;\n let handle: NodeTelemetryHandle | undefined;\n let initialization: Promise<NodeTelemetryHandle | undefined> | undefined;\n let retryAfter = 0;\n let shutdownPromise: Promise<void> | undefined;\n let shutdownRequested = false;\n const reportedFailures = new Set<string>();\n\n const disabledByEnvironment = (): boolean =>\n isTruthy(env.AGENT_TELEMETRY_DISABLED) || isTruthy(env.OTEL_SDK_DISABLED);\n\n const publish = (record: DoomTelemetryRecord): void => {\n for (const observer of [...recordObservers, ...(options.onRecord ? [options.onRecord] : [])]) {\n try {\n observer(record);\n } catch (error) {\n reportWarning(`Doom telemetry observer failed: ${warningDetail(error)}`);\n }\n }\n };\n\n const initialize = async (): Promise<NodeTelemetryHandle | undefined> => {\n if (disabledByEnvironment() || shutdownRequested) return undefined;\n const defaults = telemetryFactory && endpointResolver ? undefined : await loadNodeTelemetryModule();\n const resolveEndpoints = endpointResolver ?? defaults?.resolveNodeTelemetryEndpoints;\n const createTelemetry = telemetryFactory ?? defaults?.createNodeTelemetry;\n if (!resolveEndpoints || !createTelemetry) throw new Error('Node telemetry runtime is unavailable.');\n const endpoints =\n options.telemetryFactory && !options.endpointResolver\n ? { endpointSource: 'env' as const, endpoint: 'injected' }\n : await resolveEndpoints({\n cwd: options.cwd,\n env,\n packageName: options.packageName,\n serviceName: options.serviceName,\n workspaceRoot: options.workspaceRoot,\n discoverEndpoint: true,\n healthCheck: true,\n });\n if (!endpoints.endpoint && !endpoints.tracesEndpoint && !endpoints.logsEndpoint && !allowFileFallback) {\n retryAfter = Date.now() + retryDelayMs;\n currentStatus = { ...defaultTelemetryStatus };\n return undefined;\n }\n const nextHandle = await createTelemetry({\n serviceName: options.serviceName,\n packageName: options.packageName,\n cwd: options.cwd,\n workspaceRoot: options.workspaceRoot,\n env: transportEnv,\n discoverEndpoint: true,\n enableLogs: options.enableLogs ?? true,\n enableTraces: options.enableTraces ?? true,\n headers: createTelemetryHeaders(options.serviceName, env),\n });\n if (shutdownRequested) {\n await nextHandle.shutdown().catch((error: unknown) => {\n reportWarning(`Doom telemetry late initialization shutdown failed: ${warningDetail(error)}`);\n });\n return undefined;\n }\n if (nextHandle.backend === 'file' && !allowFileFallback) {\n await nextHandle\n .shutdown()\n .catch((error: unknown) => reportWarning(`Doom telemetry fallback shutdown failed: ${warningDetail(error)}`));\n currentStatus = { ...defaultTelemetryStatus };\n return undefined;\n }\n handle = nextHandle;\n currentStatus = {\n serviceName: options.serviceName,\n packageName: options.packageName,\n backend: nextHandle.backend,\n enabled: nextHandle.enabled,\n endpoint: nextHandle.endpoint,\n endpointSource: nextHandle.endpointSource,\n traces: Boolean(options.enableTraces ?? true),\n fileFallback: nextHandle.backend === 'file',\n };\n try {\n options.onStatus?.({ ...currentStatus });\n } catch (error) {\n reportWarning(`Doom telemetry status observer failed: ${warningDetail(error)}`);\n }\n return nextHandle;\n };\n\n const getHandle = async (): Promise<NodeTelemetryHandle | undefined> => {\n if (disabledByEnvironment() || shutdownRequested) return undefined;\n if (handle) return handle;\n if (Date.now() < retryAfter) return undefined;\n initialization ??= initialize()\n .catch((error: unknown) => {\n retryAfter = Date.now() + retryDelayMs;\n reportWarning(`Doom telemetry initialization failed: ${warningDetail(error)}`);\n return undefined;\n })\n .finally(() => {\n initialization = undefined;\n });\n return initialization;\n };\n\n const emit = async (\n level: DoomTelemetryEventLevel,\n event: string,\n error: unknown,\n attributes: Record<string, unknown> | undefined,\n ): Promise<void> => {\n const safeEvent = normalizeToken(event, 'doom.telemetry.event').slice(0, MAX_EVENT_NAME_LENGTH);\n const safeAttributes = sanitizeTelemetryAttributes({\n 'telemetry.package': options.packageName,\n ...attributes,\n ...(error === undefined ? {} : errorAttributes(error)),\n });\n if (error !== undefined) {\n const failureKey = `${safeEvent}:${level}:${JSON.stringify(safeAttributes)}`;\n if (reportedFailures.has(failureKey)) return;\n if (reportedFailures.size >= MAX_REPORTED_FAILURES) reportedFailures.clear();\n reportedFailures.add(failureKey);\n }\n const record: DoomTelemetryRecord = { event: safeEvent, level, attributes: safeAttributes };\n publish(record);\n try {\n const nextHandle = await getHandle();\n nextHandle?.logger[level](safeEvent, { attributes: safeAttributes });\n } catch (failure) {\n reportWarning(`Doom telemetry record failed: ${warningDetail(failure)}`);\n }\n };\n\n const flush = async (): Promise<void> => {\n try {\n const pendingInitialization = initialization;\n if (pendingInitialization) await pendingInitialization;\n await handle?.flush();\n } catch (error) {\n reportWarning(`Doom telemetry flush failed: ${warningDetail(error)}`);\n }\n };\n\n return {\n recordDebug(event, attributes) {\n return emit('debug', event, undefined, attributes);\n },\n recordEvent(event, attributes) {\n return emit('info', event, undefined, attributes);\n },\n recordWarning(event, error, attributes) {\n return emit('warn', event, error, attributes);\n },\n recordError(event, error, attributes) {\n return emit('error', event, error, attributes);\n },\n async runInSpan<T>(name: string, attributes: Record<string, unknown>, callback: () => Promise<T> | T) {\n let callbackPromise: Promise<T> | undefined;\n let callbackFailure: { value: unknown } | undefined;\n const invokeCallback = (): Promise<T> => {\n callbackPromise ??= Promise.resolve().then(callback);\n return callbackPromise;\n };\n const nextHandle = await getHandle();\n if (!nextHandle) return invokeCallback();\n const startedAt = Date.now();\n try {\n return await nextHandle.runInSpan(\n normalizeToken(name, 'doom.telemetry.span'),\n { attributes: sanitizeTelemetryAttributes(attributes) },\n async (span) => {\n try {\n const result = await invokeCallback();\n span?.setAttribute('duration_ms', Date.now() - startedAt);\n span?.setAttribute('outcome', 'success');\n return result;\n } catch (error) {\n callbackFailure = { value: error };\n const safeError = errorAttributes(error);\n for (const [key, value] of Object.entries(safeError)) span?.setAttribute(key, value);\n span?.setAttribute('duration_ms', Date.now() - startedAt);\n span?.setStatus({ code: SPAN_STATUS_ERROR });\n throw createSafeCallbackError(error);\n }\n },\n );\n } catch (error) {\n if (callbackFailure) return Promise.reject(callbackFailure.value);\n if (callbackPromise) return callbackPromise;\n reportWarning(`Doom telemetry span failed: ${warningDetail(error)}`);\n return invokeCallback();\n }\n },\n flush,\n async shutdown() {\n if (shutdownPromise) return shutdownPromise;\n shutdownRequested = true;\n shutdownPromise = (async () => {\n await flush();\n const currentHandle = handle;\n handle = undefined;\n if (!currentHandle) return;\n try {\n await currentHandle.shutdown();\n } catch (error) {\n reportWarning(`Doom telemetry shutdown failed: ${warningDetail(error)}`);\n }\n })();\n return shutdownPromise;\n },\n status() {\n return { ...currentStatus };\n },\n };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"telemetry.d.cts","names":[],"sources":["../../src/adapters/telemetry.ts"],"mappings":";;KAmIY;KACA,0BAA0B;UAErB;EACf;EACA,OAAO;EACP,YAAY;;UAGG;EACf;EACA;EACA,SAAS;EACT;EACA;EACA,gBAAgB;EAChB;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA,MAAM,OAAO;EACb;EACA;EACA;EACA;EACA,mBAAmB;EACnB,mBAAmB;EACnB,QAAQ;EACR,YAAY,QAAQ;EACpB,YAAY,QAAQ;;UAGL;EACf,YAAY,eAAe,aAAa,0BAA0B;EAClE,YAAY,eAAe,aAAa,0BAA0B;EAClE,cAAc,eAAe,iBAAiB,aAAa,0BAA0B;EACrF,YAAY,eAAe,iBAAiB,aAAa,0BAA0B;EACnF,UAAU,GAAG,cAAc,YAAY,yBAAyB,gBAAgB,QAAQ,KAAK,IAAI,QAAQ;EACzG,SAAS;EACT,YAAY;EACZ,UAAU;;KAGP,oBAAoB,SAAS,yBAAyB,QAAQ;KAC9D,oBAAoB;EACvB;EACA,MAAM,OAAO;EACb;EACA;EACA;EACA;EACA;MACI;EACJ,gBAAgB;EAChB;EACA;EACA;;iBAac,0BAA0B,WAAW,QAAQ;iBAoE7C,4BAA4B,aAAY,0BAA+B;iBA2EvE,uBAAuB,qBAAqB,KAAK,OAAO,aAAa;iBAwCrE,oBAAoB,SAAS,uBAAuB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"telemetry.d.mts","names":[],"sources":["../../src/adapters/telemetry.ts"],"mappings":";;KAmIY;KACA,0BAA0B;UAErB;EACf;EACA,OAAO;EACP,YAAY;;UAGG;EACf;EACA;EACA,SAAS;EACT;EACA;EACA,gBAAgB;EAChB;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA,MAAM,OAAO;EACb;EACA;EACA;EACA;EACA,mBAAmB;EACnB,mBAAmB;EACnB,QAAQ;EACR,YAAY,QAAQ;EACpB,YAAY,QAAQ;;UAGL;EACf,YAAY,eAAe,aAAa,0BAA0B;EAClE,YAAY,eAAe,aAAa,0BAA0B;EAClE,cAAc,eAAe,iBAAiB,aAAa,0BAA0B;EACrF,YAAY,eAAe,iBAAiB,aAAa,0BAA0B;EACnF,UAAU,GAAG,cAAc,YAAY,yBAAyB,gBAAgB,QAAQ,KAAK,IAAI,QAAQ;EACzG,SAAS;EACT,YAAY;EACZ,UAAU;;KAGP,oBAAoB,SAAS,yBAAyB,QAAQ;KAC9D,oBAAoB;EACvB;EACA,MAAM,OAAO;EACb;EACA;EACA;EACA;EACA;MACI;EACJ,gBAAgB;EAChB;EACA;EACA;;iBAac,0BAA0B,WAAW,QAAQ;iBAoE7C,4BAA4B,aAAY,0BAA+B;iBA2EvE,uBAAuB,qBAAqB,KAAK,OAAO,aAAa;iBAwCrE,oBAAoB,SAAS,uBAAuB"}
@@ -1,2 +0,0 @@
1
- import{inspect as e}from"node:util";const t=[`AGENT_SESSION_ID`,`PI_SESSION_ID`],n=[`AGENT_PARENT_SESSION_ID`,`PARENT_AGENT_SESSION_ID`],r=[`PI_SESSION_ID`,`AGENT_PARENT_SESSION_ID`],i=new Set([`1`,`true`,`yes`]),a=[`prompt`,`message`,`content`,`payload`,`command`,`cwd`,`path`,`file`,`stack`,`traceback`,`transcript`,`diff`,`secret`,`authorization`,`header`,`environment`,`env`,`details`,`args`],o=new Set([`tool.result.error`,`tool.result.count`,`tool.result.bytes`,`tool.result.duration_ms`]),s=new Set([`count`,`length`,`bytes`,`duration`,`duration_ms`,`size`,`index`,`number`,`active`,`enabled`,`previous`,`empty`,`silent`,`fallback`,`bypass`,`success`,`is_error`,`has_ui`,`requires_confirmation`,`exit_code`,`status_code`,`interval_seconds`,`concurrency`,`budget`]),c=new Set([`gen_ai.usage.input_tokens`,`gen_ai.usage.output_tokens`,`gen_ai.usage.total_tokens`,`gen_ai.usage.cache_read_tokens`,`gen_ai.usage.cache_write_tokens`,`gen_ai.usage.reasoning_tokens`]),l=[`id`,`correlation`,`session`,`trace`,`span`,`call`,`run`,`job`,`step`],u=`name.operation.outcome.reason.status.mode.source.phase.engine.provider.model.level.type.code.signal.finish_reasons.trigger.action.kind.version.scope.layer.profile.domain.theme.leader.pass.role.stage.state.language.transport.adapter.runtime.backend.launcher.event.component.package.command_name.tool_name.token_attribution`.split(`.`);let d;function f(){return d??=import(`@agimon-ai/log-sink-mcp/telemetry/node`),d}const p=new Set;function m(e){return p.add(e),()=>p.delete(e)}function h(e){return e!==void 0&&i.has(e.toLowerCase())}function g(e,t){return e.replace(/[^a-zA-Z0-9._:-]/g,`_`).slice(0,128)||t}function _(e){let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return`id_${(t>>>0).toString(16).padStart(8,`0`)}`}function v(e){let t=e.toLowerCase();return[...s].some(e=>t===e||t.endsWith(`.${e}`)||t.endsWith(`_${e}`))}function y(e){let t=e.toLowerCase();return o.has(t)||c.has(t)||v(t)?!1:a.some(e=>t.split(/[._-]/u).includes(e))}function b(e){let t=e.toLowerCase();return u.some(e=>t===e||t.endsWith(`.${e}`)||t.endsWith(`_${e}`))}function x(e){let t=e.toLowerCase();return l.some(e=>t===e||t.endsWith(`.${e}`)||t.endsWith(`_${e}`))}function S(e){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`}function C(e,t){if(typeof t==`number`)return Number.isFinite(t)?t:void 0;if(typeof t==`boolean`)return t;if(!(t.length===0||t.length>128)){if(x(e))return _(t);if(b(e))return e===`telemetry.package`||e.endsWith(`.package`)?t.startsWith(`/`)||t.includes(`\\`)?void 0:t.replace(/[^a-zA-Z0-9@/._:-]/g,`_`):g(t,`unknown`)}}function w(e={}){let t={};for(let[n,r]of Object.entries(e)){if(y(n)||!S(r))continue;let e=C(n,r);e!==void 0&&(t[n]=e)}return t}function T(e,t){return/^[a-zA-Z][a-zA-Z0-9._:-]{0,63}$/u.test(e)?g(e,t):t}function E(e){return e instanceof Error?T(e.name,`Error`):typeof e==`string`?`StringError`:e&&typeof e==`object`?`ObjectError`:`UnknownError`}function D(t,n=0){if(n>3)return`...`;if(Array.isArray(t))return t.map(e=>D(e,n+1)).join(`; `);if(t instanceof Error){let e=`code`in t?t.code:void 0,r=typeof e==`string`||typeof e==`number`?` (code ${e})`:``,i=t instanceof AggregateError?`: ${D(t.errors,n+1)}`:``,a=t.cause===void 0?``:` <- caused by ${D(t.cause,n+1)}`;return`${t.name}: ${t.message}${r}${i}${a}`}return typeof t==`string`?t:t&&typeof t==`object`?e(t,{depth:2,breakLength:1/0}):String(t)}function O(e){return D(e).slice(0,512)}function k(e){if(!e||typeof e!=`object`||!(`code`in e))return;let t=e.code;if(typeof t!=`string`&&typeof t!=`number`)return;let n=String(t);return/^[a-zA-Z0-9][a-zA-Z0-9._:-]{0,63}$/u.test(n)?g(n,`unknown`):void 0}function A(e){let t={"error.type":E(e),outcome:`error`},n=k(e);return n&&(t[`error.code`]=n),t}function j(e,t){for(let n of t){let t=e[n]?.trim();if(t)return t}}function M(e,r){let i={"x-agent":g(e,`doom`)},a=j(r,t),o=j(r,n);return a&&(i[`x-agent-session-id`]=_(a)),o&&(i[`x-agent-parent-session-id`]=_(o)),i}function N(e){let i={...e},a=j(e,t),o=j(e,n);a?i.AGENT_SESSION_ID=_(a):delete i.AGENT_SESSION_ID,o?i.PARENT_AGENT_SESSION_ID=_(o):delete i.PARENT_AGENT_SESSION_ID;for(let e of r)delete i[e];for(let e of Object.keys(i))e.startsWith(`WORKFLOW_`)&&delete i[e];return i}function P(e){return{serviceName:e.serviceName,packageName:e.packageName,backend:`disabled`,enabled:!1,endpointSource:`none`,traces:!1,fileFallback:!1}}function F(e){return Error(`Doom telemetry callback failed: ${E(e)}`)}function I(e){let t=e.env??process.env,n=e.telemetryFactory,r=e.endpointResolver,i=N(t),a=e.warn??(e=>process.emitWarning(e)),o=e=>{try{a(e)}catch(e){process.emitWarning(`Doom telemetry warning callback failed: ${O(e)}`)}},s=e.retryDelayMs??1e3,c=e.allowFileFallback??h(t.LOG_SINK_PI_FILE_FALLBACK),l=P(e),u=l,d,m,_=0,v,y=!1,b=new Set,x=()=>h(t.AGENT_TELEMETRY_DISABLED)||h(t.OTEL_SDK_DISABLED),S=t=>{for(let n of[...p,...e.onRecord?[e.onRecord]:[]])try{n(t)}catch(e){o(`Doom telemetry observer failed: ${O(e)}`)}},C=async()=>{if(x()||y)return;let a=n&&r?void 0:await f(),p=r??a?.resolveNodeTelemetryEndpoints,m=n??a?.createNodeTelemetry;if(!p||!m)throw Error(`Node telemetry runtime is unavailable.`);let h=e.telemetryFactory&&!e.endpointResolver?{endpointSource:`env`,endpoint:`injected`}:await p({cwd:e.cwd,env:t,packageName:e.packageName,serviceName:e.serviceName,workspaceRoot:e.workspaceRoot,discoverEndpoint:!0,healthCheck:!0});if(!h.endpoint&&!h.tracesEndpoint&&!h.logsEndpoint&&!c){_=Date.now()+s,u={...l};return}let g=await m({serviceName:e.serviceName,packageName:e.packageName,cwd:e.cwd,workspaceRoot:e.workspaceRoot,env:i,discoverEndpoint:!0,enableLogs:e.enableLogs??!0,enableTraces:e.enableTraces??!0,headers:M(e.serviceName,t)});if(y){await g.shutdown().catch(e=>{o(`Doom telemetry late initialization shutdown failed: ${O(e)}`)});return}if(g.backend===`file`&&!c){await g.shutdown().catch(e=>o(`Doom telemetry fallback shutdown failed: ${O(e)}`)),u={...l};return}d=g,u={serviceName:e.serviceName,packageName:e.packageName,backend:g.backend,enabled:g.enabled,endpoint:g.endpoint,endpointSource:g.endpointSource,traces:!!(e.enableTraces??!0),fileFallback:g.backend===`file`};try{e.onStatus?.({...u})}catch(e){o(`Doom telemetry status observer failed: ${O(e)}`)}return g},T=async()=>{if(!(x()||y)){if(d)return d;if(!(Date.now()<_))return m??=C().catch(e=>{_=Date.now()+s,o(`Doom telemetry initialization failed: ${O(e)}`)}).finally(()=>{m=void 0}),m}},E=async(t,n,r,i)=>{let a=g(n,`doom.telemetry.event`).slice(0,128),s=w({"telemetry.package":e.packageName,...i,...r===void 0?{}:A(r)});if(r!==void 0){let e=`${a}:${t}:${JSON.stringify(s)}`;if(b.has(e))return;b.size>=500&&b.clear(),b.add(e)}S({event:a,level:t,attributes:s});try{(await T())?.logger[t](a,{attributes:s})}catch(e){o(`Doom telemetry record failed: ${O(e)}`)}},D=async()=>{try{let e=m;e&&await e,await d?.flush()}catch(e){o(`Doom telemetry flush failed: ${O(e)}`)}};return{recordDebug(e,t){return E(`debug`,e,void 0,t)},recordEvent(e,t){return E(`info`,e,void 0,t)},recordWarning(e,t,n){return E(`warn`,e,t,n)},recordError(e,t,n){return E(`error`,e,t,n)},async runInSpan(e,t,n){let r,i,a=()=>(r??=Promise.resolve().then(n),r),s=await T();if(!s)return a();let c=Date.now();try{return await s.runInSpan(g(e,`doom.telemetry.span`),{attributes:w(t)},async e=>{try{let t=await a();return e?.setAttribute(`duration_ms`,Date.now()-c),e?.setAttribute(`outcome`,`success`),t}catch(t){i={value:t};let n=A(t);for(let[t,r]of Object.entries(n))e?.setAttribute(t,r);throw e?.setAttribute(`duration_ms`,Date.now()-c),e?.setStatus({code:2}),F(t)}})}catch(e){return i?Promise.reject(i.value):r||(o(`Doom telemetry span failed: ${O(e)}`),a())}},flush:D,async shutdown(){return v||(y=!0,v=(async()=>{await D();let e=d;if(d=void 0,e)try{await e.shutdown()}catch(e){o(`Doom telemetry shutdown failed: ${O(e)}`)}})(),v)},status(){return{...u}}}}export{I as createDoomTelemetry,M as createTelemetryHeaders,w as sanitizeTelemetryAttributes,m as subscribeTelemetryRecords};
2
- //# sourceMappingURL=telemetry.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"telemetry.mjs","names":[],"sources":["../../src/adapters/telemetry.ts"],"sourcesContent":["import { inspect } from 'node:util';\nimport type { NodeTelemetryHandle, NodeTelemetryOptions } from '@agimon-ai/log-sink-mcp/telemetry/node';\n\nconst DEFAULT_RETRY_DELAY_MS = 1_000;\nconst MAX_WARNING_DETAIL_LENGTH = 512;\nconst MAX_WARNING_DETAIL_DEPTH = 3;\nconst MAX_ATTRIBUTE_STRING_LENGTH = 128;\nconst MAX_REPORTED_FAILURES = 500;\nconst MAX_EVENT_NAME_LENGTH = 128;\nconst SESSION_ID_HEADERS = ['AGENT_SESSION_ID', 'PI_SESSION_ID'] as const;\nconst PARENT_SESSION_ID_HEADERS = ['AGENT_PARENT_SESSION_ID', 'PARENT_AGENT_SESSION_ID'] as const;\nconst TRANSPORT_SESSION_HEADERS = ['PI_SESSION_ID', 'AGENT_PARENT_SESSION_ID'] as const;\nconst TRUE_VALUES = new Set(['1', 'true', 'yes']);\nconst SPAN_STATUS_ERROR = 2;\nconst SENSITIVE_ATTRIBUTE_PARTS = [\n 'prompt',\n 'message',\n 'content',\n 'payload',\n 'command',\n 'cwd',\n 'path',\n 'file',\n 'stack',\n 'traceback',\n 'transcript',\n 'diff',\n 'secret',\n 'authorization',\n 'header',\n 'environment',\n 'env',\n 'details',\n 'args',\n] as const;\nconst SAFE_RESULT_KEYS = new Set([\n 'tool.result.error',\n 'tool.result.count',\n 'tool.result.bytes',\n 'tool.result.duration_ms',\n]);\nconst SAFE_METADATA_KEY_PARTS = new Set([\n 'count',\n 'length',\n 'bytes',\n 'duration',\n 'duration_ms',\n 'size',\n 'index',\n 'number',\n 'active',\n 'enabled',\n 'previous',\n 'empty',\n 'silent',\n 'fallback',\n 'bypass',\n 'success',\n 'is_error',\n 'has_ui',\n 'requires_confirmation',\n 'exit_code',\n 'status_code',\n 'interval_seconds',\n 'concurrency',\n 'budget',\n]);\nconst SAFE_INPUT_KEYS = new Set([\n 'gen_ai.usage.input_tokens',\n 'gen_ai.usage.output_tokens',\n 'gen_ai.usage.total_tokens',\n 'gen_ai.usage.cache_read_tokens',\n 'gen_ai.usage.cache_write_tokens',\n 'gen_ai.usage.reasoning_tokens',\n]);\nconst SAFE_IDENTIFIER_KEY_PARTS = [\n 'id',\n 'correlation',\n 'session',\n 'trace',\n 'span',\n 'call',\n 'run',\n 'job',\n 'step',\n] as const;\nconst SAFE_STRING_KEY_PARTS = [\n 'name',\n 'operation',\n 'outcome',\n 'reason',\n 'status',\n 'mode',\n 'source',\n 'phase',\n 'engine',\n 'provider',\n 'model',\n 'level',\n 'type',\n 'code',\n 'signal',\n 'finish_reasons',\n 'trigger',\n 'action',\n 'kind',\n 'version',\n 'scope',\n 'layer',\n 'profile',\n 'domain',\n 'theme',\n 'leader',\n 'pass',\n 'role',\n 'stage',\n 'state',\n 'language',\n 'transport',\n 'adapter',\n 'runtime',\n 'backend',\n 'launcher',\n 'event',\n 'component',\n 'package',\n 'command_name',\n 'tool_name',\n 'token_attribution',\n] as const;\n\nexport type DoomTelemetryEventLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal';\nexport type DoomTelemetryAttributes = Record<string, string | number | boolean>;\n\nexport interface DoomTelemetryRecord {\n event: string;\n level: DoomTelemetryEventLevel;\n attributes: DoomTelemetryAttributes;\n}\n\nexport interface DoomTelemetryStatus {\n serviceName: string;\n packageName?: string;\n backend: NodeTelemetryHandle['backend'] | 'disabled';\n enabled: boolean;\n endpoint?: string;\n endpointSource: NodeTelemetryHandle['endpointSource'];\n traces: boolean;\n fileFallback: boolean;\n}\n\nexport interface DoomTelemetryOptions {\n serviceName: string;\n packageName?: string;\n cwd?: string;\n workspaceRoot?: string;\n env?: NodeJS.ProcessEnv;\n enableTraces?: boolean;\n enableLogs?: boolean;\n allowFileFallback?: boolean;\n retryDelayMs?: number;\n telemetryFactory?: TelemetryFactory;\n endpointResolver?: EndpointResolver;\n warn?: (message: string) => void;\n onRecord?: (record: DoomTelemetryRecord) => void;\n onStatus?: (status: DoomTelemetryStatus) => void;\n}\n\nexport interface DoomTelemetry {\n recordDebug(event: string, attributes?: Record<string, unknown>): Promise<void>;\n recordEvent(event: string, attributes?: Record<string, unknown>): Promise<void>;\n recordWarning(event: string, error?: unknown, attributes?: Record<string, unknown>): Promise<void>;\n recordError(event: string, error?: unknown, attributes?: Record<string, unknown>): Promise<void>;\n runInSpan<T>(name: string, attributes: Record<string, unknown>, callback: () => Promise<T> | T): Promise<T>;\n flush(): Promise<void>;\n shutdown(): Promise<void>;\n status(): DoomTelemetryStatus;\n}\n\ntype TelemetryFactory = (options: NodeTelemetryOptions) => Promise<NodeTelemetryHandle>;\ntype EndpointResolver = (options: {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n packageName?: string;\n serviceName?: string;\n workspaceRoot?: string;\n discoverEndpoint?: boolean;\n healthCheck?: boolean;\n}) => Promise<{\n endpointSource: NodeTelemetryHandle['endpointSource'];\n endpoint?: string;\n tracesEndpoint?: string;\n logsEndpoint?: string;\n}>;\n\ntype NodeTelemetryModule = typeof import('@agimon-ai/log-sink-mcp/telemetry/node');\nlet nodeTelemetryModule: Promise<NodeTelemetryModule> | undefined;\n\nfunction loadNodeTelemetryModule(): Promise<NodeTelemetryModule> {\n nodeTelemetryModule ??= import('@agimon-ai/log-sink-mcp/telemetry/node');\n return nodeTelemetryModule;\n}\n\nconst recordObservers = new Set<(record: DoomTelemetryRecord) => void>();\n\nexport function subscribeTelemetryRecords(observer: (record: DoomTelemetryRecord) => void): () => void {\n recordObservers.add(observer);\n return () => recordObservers.delete(observer);\n}\n\nfunction isTruthy(value: string | undefined): boolean {\n return value !== undefined && TRUE_VALUES.has(value.toLowerCase());\n}\n\nfunction normalizeToken(value: string, fallback: string): string {\n const normalized = value.replace(/[^a-zA-Z0-9._:-]/g, '_').slice(0, MAX_ATTRIBUTE_STRING_LENGTH);\n return normalized || fallback;\n}\n\nfunction hashIdentifier(value: string): string {\n let hash = 2166136261;\n for (let index = 0; index < value.length; index += 1) {\n hash ^= value.charCodeAt(index);\n hash = Math.imul(hash, 16777619);\n }\n return `id_${(hash >>> 0).toString(16).padStart(8, '0')}`;\n}\n\nfunction isSafeMetadataKey(key: string): boolean {\n const normalized = key.toLowerCase();\n return [...SAFE_METADATA_KEY_PARTS].some(\n (part) => normalized === part || normalized.endsWith(`.${part}`) || normalized.endsWith(`_${part}`),\n );\n}\n\nfunction isSensitiveKey(key: string): boolean {\n const normalized = key.toLowerCase();\n if (SAFE_RESULT_KEYS.has(normalized) || SAFE_INPUT_KEYS.has(normalized) || isSafeMetadataKey(normalized))\n return false;\n return SENSITIVE_ATTRIBUTE_PARTS.some((part) => normalized.split(/[._-]/u).includes(part));\n}\n\nfunction hasSafeStringMeaning(key: string): boolean {\n const normalized = key.toLowerCase();\n return SAFE_STRING_KEY_PARTS.some(\n (part) => normalized === part || normalized.endsWith(`.${part}`) || normalized.endsWith(`_${part}`),\n );\n}\n\nfunction hasSafeIdentifierMeaning(key: string): boolean {\n const normalized = key.toLowerCase();\n return SAFE_IDENTIFIER_KEY_PARTS.some(\n (part) => normalized === part || normalized.endsWith(`.${part}`) || normalized.endsWith(`_${part}`),\n );\n}\n\nfunction isScalar(value: unknown): value is string | number | boolean {\n return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n}\n\nfunction sanitizeValue(key: string, value: string | number | boolean): string | number | boolean | undefined {\n if (typeof value === 'number') return Number.isFinite(value) ? value : undefined;\n if (typeof value === 'boolean') return value;\n if (value.length === 0 || value.length > MAX_ATTRIBUTE_STRING_LENGTH) return undefined;\n if (hasSafeIdentifierMeaning(key)) return hashIdentifier(value);\n if (!hasSafeStringMeaning(key)) return undefined;\n if (key === 'telemetry.package' || key.endsWith('.package')) {\n if (value.startsWith('/') || value.includes('\\\\')) return undefined;\n return value.replace(/[^a-zA-Z0-9@/._:-]/g, '_');\n }\n return normalizeToken(value, 'unknown');\n}\n\nexport function sanitizeTelemetryAttributes(attributes: Record<string, unknown> = {}): DoomTelemetryAttributes {\n const sanitized: DoomTelemetryAttributes = {};\n for (const [key, value] of Object.entries(attributes)) {\n if (isSensitiveKey(key) || !isScalar(value)) continue;\n const safeValue = sanitizeValue(key, value);\n if (safeValue !== undefined) sanitized[key] = safeValue;\n }\n return sanitized;\n}\n\nfunction safeErrorToken(value: string, fallback: string): string {\n if (!/^[a-zA-Z][a-zA-Z0-9._:-]{0,63}$/u.test(value)) return fallback;\n return normalizeToken(value, fallback);\n}\n\nfunction errorType(error: unknown): string {\n if (error instanceof Error) return safeErrorToken(error.name, 'Error');\n if (typeof error === 'string') return 'StringError';\n if (error && typeof error === 'object') return 'ObjectError';\n return 'UnknownError';\n}\n\n/**\n * Format an error for a local diagnostic warning.\n *\n * Deliberately separate from errorType: that produces a redacted token for the\n * exported `error.type` attribute and must stay metadata-only, whereas warnings\n * go to the local operator and are useless without the actual cause. Arrays are\n * unwrapped because OpenTelemetry's forceFlush rejects with one.\n */\nfunction describeError(error: unknown, depth = 0): string {\n if (depth > MAX_WARNING_DETAIL_DEPTH) return '...';\n if (Array.isArray(error)) return error.map((entry) => describeError(entry, depth + 1)).join('; ');\n if (error instanceof Error) {\n const rawCode = 'code' in error ? (error as { code?: unknown }).code : undefined;\n const code = typeof rawCode === 'string' || typeof rawCode === 'number' ? ` (code ${rawCode})` : '';\n const aggregate = error instanceof AggregateError ? `: ${describeError(error.errors, depth + 1)}` : '';\n const cause = error.cause === undefined ? '' : ` <- caused by ${describeError(error.cause, depth + 1)}`;\n return `${error.name}: ${error.message}${code}${aggregate}${cause}`;\n }\n if (typeof error === 'string') return error;\n if (error && typeof error === 'object') return inspect(error, { depth: 2, breakLength: Infinity });\n return String(error);\n}\n\nfunction warningDetail(error: unknown): string {\n return describeError(error).slice(0, MAX_WARNING_DETAIL_LENGTH);\n}\n\nfunction errorCode(error: unknown): string | undefined {\n if (!error || typeof error !== 'object' || !('code' in error)) return undefined;\n const code = (error as { code?: unknown }).code;\n if (typeof code !== 'string' && typeof code !== 'number') return undefined;\n const normalized = String(code);\n return /^[a-zA-Z0-9][a-zA-Z0-9._:-]{0,63}$/u.test(normalized) ? normalizeToken(normalized, 'unknown') : undefined;\n}\n\nfunction errorAttributes(error: unknown): DoomTelemetryAttributes {\n const attributes: DoomTelemetryAttributes = {\n 'error.type': errorType(error),\n outcome: 'error',\n };\n const code = errorCode(error);\n if (code) attributes['error.code'] = code;\n return attributes;\n}\n\nfunction firstEnvironmentValue(env: NodeJS.ProcessEnv, keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const value = env[key]?.trim();\n if (value) return value;\n }\n return undefined;\n}\n\nexport function createTelemetryHeaders(serviceName: string, env: NodeJS.ProcessEnv): Record<string, string> {\n const headers: Record<string, string> = { 'x-agent': normalizeToken(serviceName, 'doom') };\n const sessionId = firstEnvironmentValue(env, SESSION_ID_HEADERS);\n const parentSessionId = firstEnvironmentValue(env, PARENT_SESSION_ID_HEADERS);\n if (sessionId) headers['x-agent-session-id'] = hashIdentifier(sessionId);\n if (parentSessionId) headers['x-agent-parent-session-id'] = hashIdentifier(parentSessionId);\n return headers;\n}\n\nfunction createTransportEnvironment(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const transportEnv = { ...env };\n const sessionId = firstEnvironmentValue(env, SESSION_ID_HEADERS);\n const parentSessionId = firstEnvironmentValue(env, PARENT_SESSION_ID_HEADERS);\n if (sessionId) transportEnv.AGENT_SESSION_ID = hashIdentifier(sessionId);\n else delete transportEnv.AGENT_SESSION_ID;\n if (parentSessionId) transportEnv.PARENT_AGENT_SESSION_ID = hashIdentifier(parentSessionId);\n else delete transportEnv.PARENT_AGENT_SESSION_ID;\n for (const key of TRANSPORT_SESSION_HEADERS) delete transportEnv[key];\n for (const key of Object.keys(transportEnv)) {\n if (key.startsWith('WORKFLOW_')) delete transportEnv[key];\n }\n return transportEnv;\n}\n\nfunction defaultStatus(options: DoomTelemetryOptions): DoomTelemetryStatus {\n return {\n serviceName: options.serviceName,\n packageName: options.packageName,\n backend: 'disabled',\n enabled: false,\n endpointSource: 'none',\n traces: false,\n fileFallback: false,\n };\n}\n\nfunction createSafeCallbackError(error: unknown): Error {\n return new Error(`Doom telemetry callback failed: ${errorType(error)}`);\n}\n\nexport function createDoomTelemetry(options: DoomTelemetryOptions): DoomTelemetry {\n const env = options.env ?? process.env;\n const telemetryFactory = options.telemetryFactory;\n const endpointResolver = options.endpointResolver;\n const transportEnv = createTransportEnvironment(env);\n const warn = options.warn ?? ((message: string) => process.emitWarning(message));\n const reportWarning = (message: string): void => {\n try {\n warn(message);\n } catch (error) {\n process.emitWarning(`Doom telemetry warning callback failed: ${warningDetail(error)}`);\n }\n };\n const retryDelayMs = options.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS;\n const allowFileFallback = options.allowFileFallback ?? isTruthy(env.LOG_SINK_PI_FILE_FALLBACK);\n const defaultTelemetryStatus = defaultStatus(options);\n let currentStatus = defaultTelemetryStatus;\n let handle: NodeTelemetryHandle | undefined;\n let initialization: Promise<NodeTelemetryHandle | undefined> | undefined;\n let retryAfter = 0;\n let shutdownPromise: Promise<void> | undefined;\n let shutdownRequested = false;\n const reportedFailures = new Set<string>();\n\n const disabledByEnvironment = (): boolean =>\n isTruthy(env.AGENT_TELEMETRY_DISABLED) || isTruthy(env.OTEL_SDK_DISABLED);\n\n const publish = (record: DoomTelemetryRecord): void => {\n for (const observer of [...recordObservers, ...(options.onRecord ? [options.onRecord] : [])]) {\n try {\n observer(record);\n } catch (error) {\n reportWarning(`Doom telemetry observer failed: ${warningDetail(error)}`);\n }\n }\n };\n\n const initialize = async (): Promise<NodeTelemetryHandle | undefined> => {\n if (disabledByEnvironment() || shutdownRequested) return undefined;\n const defaults = telemetryFactory && endpointResolver ? undefined : await loadNodeTelemetryModule();\n const resolveEndpoints = endpointResolver ?? defaults?.resolveNodeTelemetryEndpoints;\n const createTelemetry = telemetryFactory ?? defaults?.createNodeTelemetry;\n if (!resolveEndpoints || !createTelemetry) throw new Error('Node telemetry runtime is unavailable.');\n const endpoints =\n options.telemetryFactory && !options.endpointResolver\n ? { endpointSource: 'env' as const, endpoint: 'injected' }\n : await resolveEndpoints({\n cwd: options.cwd,\n env,\n packageName: options.packageName,\n serviceName: options.serviceName,\n workspaceRoot: options.workspaceRoot,\n discoverEndpoint: true,\n healthCheck: true,\n });\n if (!endpoints.endpoint && !endpoints.tracesEndpoint && !endpoints.logsEndpoint && !allowFileFallback) {\n retryAfter = Date.now() + retryDelayMs;\n currentStatus = { ...defaultTelemetryStatus };\n return undefined;\n }\n const nextHandle = await createTelemetry({\n serviceName: options.serviceName,\n packageName: options.packageName,\n cwd: options.cwd,\n workspaceRoot: options.workspaceRoot,\n env: transportEnv,\n discoverEndpoint: true,\n enableLogs: options.enableLogs ?? true,\n enableTraces: options.enableTraces ?? true,\n headers: createTelemetryHeaders(options.serviceName, env),\n });\n if (shutdownRequested) {\n await nextHandle.shutdown().catch((error: unknown) => {\n reportWarning(`Doom telemetry late initialization shutdown failed: ${warningDetail(error)}`);\n });\n return undefined;\n }\n if (nextHandle.backend === 'file' && !allowFileFallback) {\n await nextHandle\n .shutdown()\n .catch((error: unknown) => reportWarning(`Doom telemetry fallback shutdown failed: ${warningDetail(error)}`));\n currentStatus = { ...defaultTelemetryStatus };\n return undefined;\n }\n handle = nextHandle;\n currentStatus = {\n serviceName: options.serviceName,\n packageName: options.packageName,\n backend: nextHandle.backend,\n enabled: nextHandle.enabled,\n endpoint: nextHandle.endpoint,\n endpointSource: nextHandle.endpointSource,\n traces: Boolean(options.enableTraces ?? true),\n fileFallback: nextHandle.backend === 'file',\n };\n try {\n options.onStatus?.({ ...currentStatus });\n } catch (error) {\n reportWarning(`Doom telemetry status observer failed: ${warningDetail(error)}`);\n }\n return nextHandle;\n };\n\n const getHandle = async (): Promise<NodeTelemetryHandle | undefined> => {\n if (disabledByEnvironment() || shutdownRequested) return undefined;\n if (handle) return handle;\n if (Date.now() < retryAfter) return undefined;\n initialization ??= initialize()\n .catch((error: unknown) => {\n retryAfter = Date.now() + retryDelayMs;\n reportWarning(`Doom telemetry initialization failed: ${warningDetail(error)}`);\n return undefined;\n })\n .finally(() => {\n initialization = undefined;\n });\n return initialization;\n };\n\n const emit = async (\n level: DoomTelemetryEventLevel,\n event: string,\n error: unknown,\n attributes: Record<string, unknown> | undefined,\n ): Promise<void> => {\n const safeEvent = normalizeToken(event, 'doom.telemetry.event').slice(0, MAX_EVENT_NAME_LENGTH);\n const safeAttributes = sanitizeTelemetryAttributes({\n 'telemetry.package': options.packageName,\n ...attributes,\n ...(error === undefined ? {} : errorAttributes(error)),\n });\n if (error !== undefined) {\n const failureKey = `${safeEvent}:${level}:${JSON.stringify(safeAttributes)}`;\n if (reportedFailures.has(failureKey)) return;\n if (reportedFailures.size >= MAX_REPORTED_FAILURES) reportedFailures.clear();\n reportedFailures.add(failureKey);\n }\n const record: DoomTelemetryRecord = { event: safeEvent, level, attributes: safeAttributes };\n publish(record);\n try {\n const nextHandle = await getHandle();\n nextHandle?.logger[level](safeEvent, { attributes: safeAttributes });\n } catch (failure) {\n reportWarning(`Doom telemetry record failed: ${warningDetail(failure)}`);\n }\n };\n\n const flush = async (): Promise<void> => {\n try {\n const pendingInitialization = initialization;\n if (pendingInitialization) await pendingInitialization;\n await handle?.flush();\n } catch (error) {\n reportWarning(`Doom telemetry flush failed: ${warningDetail(error)}`);\n }\n };\n\n return {\n recordDebug(event, attributes) {\n return emit('debug', event, undefined, attributes);\n },\n recordEvent(event, attributes) {\n return emit('info', event, undefined, attributes);\n },\n recordWarning(event, error, attributes) {\n return emit('warn', event, error, attributes);\n },\n recordError(event, error, attributes) {\n return emit('error', event, error, attributes);\n },\n async runInSpan<T>(name: string, attributes: Record<string, unknown>, callback: () => Promise<T> | T) {\n let callbackPromise: Promise<T> | undefined;\n let callbackFailure: { value: unknown } | undefined;\n const invokeCallback = (): Promise<T> => {\n callbackPromise ??= Promise.resolve().then(callback);\n return callbackPromise;\n };\n const nextHandle = await getHandle();\n if (!nextHandle) return invokeCallback();\n const startedAt = Date.now();\n try {\n return await nextHandle.runInSpan(\n normalizeToken(name, 'doom.telemetry.span'),\n { attributes: sanitizeTelemetryAttributes(attributes) },\n async (span) => {\n try {\n const result = await invokeCallback();\n span?.setAttribute('duration_ms', Date.now() - startedAt);\n span?.setAttribute('outcome', 'success');\n return result;\n } catch (error) {\n callbackFailure = { value: error };\n const safeError = errorAttributes(error);\n for (const [key, value] of Object.entries(safeError)) span?.setAttribute(key, value);\n span?.setAttribute('duration_ms', Date.now() - startedAt);\n span?.setStatus({ code: SPAN_STATUS_ERROR });\n throw createSafeCallbackError(error);\n }\n },\n );\n } catch (error) {\n if (callbackFailure) return Promise.reject(callbackFailure.value);\n if (callbackPromise) return callbackPromise;\n reportWarning(`Doom telemetry span failed: ${warningDetail(error)}`);\n return invokeCallback();\n }\n },\n flush,\n async shutdown() {\n if (shutdownPromise) return shutdownPromise;\n shutdownRequested = true;\n shutdownPromise = (async () => {\n await flush();\n const currentHandle = handle;\n handle = undefined;\n if (!currentHandle) return;\n try {\n await currentHandle.shutdown();\n } catch (error) {\n reportWarning(`Doom telemetry shutdown failed: ${warningDetail(error)}`);\n }\n })();\n return shutdownPromise;\n },\n status() {\n return { ...currentStatus };\n },\n };\n}\n"],"mappings":"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"}