@portel/photon 1.21.0 → 1.22.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/ag-ui/adapter.d.ts +4 -1
  2. package/dist/ag-ui/adapter.d.ts.map +1 -1
  3. package/dist/ag-ui/adapter.js +33 -3
  4. package/dist/ag-ui/adapter.js.map +1 -1
  5. package/dist/ag-ui/types.d.ts +12 -0
  6. package/dist/ag-ui/types.d.ts.map +1 -1
  7. package/dist/auto-ui/beam/routes/api-config.d.ts +1 -1
  8. package/dist/auto-ui/beam/routes/api-config.d.ts.map +1 -1
  9. package/dist/auto-ui/beam/routes/api-config.js +79 -1
  10. package/dist/auto-ui/beam/routes/api-config.js.map +1 -1
  11. package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -1
  12. package/dist/auto-ui/streamable-http-transport.js +24 -2
  13. package/dist/auto-ui/streamable-http-transport.js.map +1 -1
  14. package/dist/cli/commands/init.d.ts.map +1 -1
  15. package/dist/cli/commands/init.js +3 -3
  16. package/dist/cli/commands/init.js.map +1 -1
  17. package/dist/cli.d.ts +4 -0
  18. package/dist/cli.d.ts.map +1 -1
  19. package/dist/cli.js +11 -1
  20. package/dist/cli.js.map +1 -1
  21. package/dist/daemon/protocol.d.ts +1 -1
  22. package/dist/daemon/protocol.d.ts.map +1 -1
  23. package/dist/daemon/protocol.js +1 -0
  24. package/dist/daemon/protocol.js.map +1 -1
  25. package/dist/daemon/server.js +8 -0
  26. package/dist/daemon/server.js.map +1 -1
  27. package/dist/loader.d.ts +14 -0
  28. package/dist/loader.d.ts.map +1 -1
  29. package/dist/loader.js +247 -28
  30. package/dist/loader.js.map +1 -1
  31. package/dist/server.d.ts +7 -0
  32. package/dist/server.d.ts.map +1 -1
  33. package/dist/server.js +67 -37
  34. package/dist/server.js.map +1 -1
  35. package/dist/shared/error-handler.d.ts +1 -0
  36. package/dist/shared/error-handler.d.ts.map +1 -1
  37. package/dist/shared/error-handler.js +68 -10
  38. package/dist/shared/error-handler.js.map +1 -1
  39. package/dist/shared/logger.d.ts.map +1 -1
  40. package/dist/shared/logger.js +34 -0
  41. package/dist/shared/logger.js.map +1 -1
  42. package/dist/telemetry/context.d.ts +24 -0
  43. package/dist/telemetry/context.d.ts.map +1 -0
  44. package/dist/telemetry/context.js +17 -0
  45. package/dist/telemetry/context.js.map +1 -0
  46. package/dist/telemetry/logs.d.ts +38 -0
  47. package/dist/telemetry/logs.d.ts.map +1 -0
  48. package/dist/telemetry/logs.js +108 -0
  49. package/dist/telemetry/logs.js.map +1 -0
  50. package/dist/telemetry/metrics.d.ts +71 -0
  51. package/dist/telemetry/metrics.d.ts.map +1 -0
  52. package/dist/telemetry/metrics.js +184 -0
  53. package/dist/telemetry/metrics.js.map +1 -0
  54. package/dist/telemetry/otel.d.ts +20 -1
  55. package/dist/telemetry/otel.d.ts.map +1 -1
  56. package/dist/telemetry/otel.js +79 -2
  57. package/dist/telemetry/otel.js.map +1 -1
  58. package/dist/telemetry/sdk.d.ts +49 -0
  59. package/dist/telemetry/sdk.d.ts.map +1 -0
  60. package/dist/telemetry/sdk.js +110 -0
  61. package/dist/telemetry/sdk.js.map +1 -0
  62. package/package.json +2 -2
@@ -1,3 +1,5 @@
1
+ import { getRequestContext } from '../telemetry/context.js';
2
+ import { emitOtelLog } from '../telemetry/logs.js';
1
3
  const LEVEL_PRIORITY = {
2
4
  error: 0,
3
5
  warn: 1,
@@ -45,6 +47,21 @@ export class Logger {
45
47
  component: this.component,
46
48
  scope: this.scope,
47
49
  };
50
+ // Enrich with ambient request context so every log line emitted during a
51
+ // tool call carries photon/tool/traceId without callers threading it.
52
+ // Static ESM import — same module instance as the rest of the runtime
53
+ // so the AsyncLocalStorage store is shared.
54
+ const ctx = getRequestContext();
55
+ if (ctx) {
56
+ if (ctx.photon && record.photon == null)
57
+ record.photon = ctx.photon;
58
+ if (ctx.tool && record.tool == null)
59
+ record.tool = ctx.tool;
60
+ if (ctx.traceId && record.traceId == null)
61
+ record.traceId = ctx.traceId;
62
+ if (ctx.caller?.id && record.callerId == null)
63
+ record.callerId = ctx.caller.id;
64
+ }
48
65
  if (meta && Object.keys(meta).length > 0) {
49
66
  Object.assign(record, meta);
50
67
  }
@@ -85,6 +102,23 @@ export class Logger {
85
102
  if (this.sink) {
86
103
  this.sink({ ...record });
87
104
  }
105
+ // Forward to the OTel logs bridge when the SDK is installed. The bridge
106
+ // is a no-op otherwise so this adds no cost when unused.
107
+ try {
108
+ const attrs = {};
109
+ if (this.component)
110
+ attrs['log.component'] = this.component;
111
+ if (this.scope)
112
+ attrs['log.scope'] = this.scope;
113
+ if (meta) {
114
+ for (const [k, v] of Object.entries(meta))
115
+ attrs[k] = v;
116
+ }
117
+ emitOtelLog({ level, message, attributes: attrs });
118
+ }
119
+ catch {
120
+ /* logs bridge unavailable */
121
+ }
88
122
  }
89
123
  info(message, meta) {
90
124
  this.log('info', message, meta);
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/shared/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/shared/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Per-request ambient context for Photon tool execution.
3
+ *
4
+ * Uses Node's AsyncLocalStorage to make trace/caller context available
5
+ * anywhere in the async call tree without parameter threading. Populated
6
+ * by PhotonLoader.executeTool; consumed by the structured Logger, metrics
7
+ * recorders, and any user code via getRequestContext().
8
+ */
9
+ import type { CallerInfo } from '@portel/photon-core';
10
+ export interface RequestContext {
11
+ photon: string;
12
+ tool: string;
13
+ /** W3C 32-hex trace ID when the execution is async or correlated. */
14
+ traceId?: string;
15
+ /** Inbound W3C traceparent (`00-{traceId}-{spanId}-{flags}`) when present. */
16
+ parentTraceparent?: string;
17
+ /** Authenticated caller when available. */
18
+ caller?: CallerInfo;
19
+ /** Wall-clock start of the tool call. */
20
+ startedAt: number;
21
+ }
22
+ export declare function runWithRequestContext<T>(ctx: RequestContext, fn: () => T): T;
23
+ export declare function getRequestContext(): RequestContext | undefined;
24
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/telemetry/context.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,2CAA2C;IAC3C,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAE5E;AAED,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,SAAS,CAE9D"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Per-request ambient context for Photon tool execution.
3
+ *
4
+ * Uses Node's AsyncLocalStorage to make trace/caller context available
5
+ * anywhere in the async call tree without parameter threading. Populated
6
+ * by PhotonLoader.executeTool; consumed by the structured Logger, metrics
7
+ * recorders, and any user code via getRequestContext().
8
+ */
9
+ import { AsyncLocalStorage } from 'node:async_hooks';
10
+ const storage = new AsyncLocalStorage();
11
+ export function runWithRequestContext(ctx, fn) {
12
+ return storage.run(ctx, fn);
13
+ }
14
+ export function getRequestContext() {
15
+ return storage.getStore();
16
+ }
17
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/telemetry/context.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAgBrD,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAkB,CAAC;AAExD,MAAM,UAAU,qBAAqB,CAAI,GAAmB,EAAE,EAAW;IACvE,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * OpenTelemetry Logs bridge for Photon.
3
+ *
4
+ * Zero-dep no-op that upgrades gracefully when
5
+ * `@opentelemetry/api-logs` is installed. Mirrors the dynamic-import
6
+ * pattern used in otel.ts and metrics.ts so the runtime stays
7
+ * dependency-free by default and production deployments can wire up
8
+ * any OTLP-compatible log backend by installing the SDK.
9
+ *
10
+ * The photon Logger pushes each emitted record through `emitOtelLog`
11
+ * after writing to its local stream. When the SDK is present the
12
+ * record is forwarded to the OTel logs bridge with severity mapped
13
+ * to the standard scale and ambient trace context auto-attached.
14
+ */
15
+ export interface OtelLogRecord {
16
+ level: 'debug' | 'info' | 'warn' | 'error';
17
+ message: string;
18
+ attributes?: Record<string, unknown>;
19
+ }
20
+ /**
21
+ * Emit a log record to OpenTelemetry if the SDK is installed. No-op otherwise.
22
+ * The ambient request context (photon/tool/traceId/callerId) is pulled lazily
23
+ * so callers do not have to thread it through.
24
+ */
25
+ export declare function emitOtelLog(record: OtelLogRecord): void;
26
+ /**
27
+ * Returns true if the OTel logs SDK is available.
28
+ */
29
+ export declare function isOtelLogsEnabled(): boolean;
30
+ /**
31
+ * Wait for the initial probe. For tests.
32
+ */
33
+ export declare function waitForLogsProbe(): Promise<void>;
34
+ /**
35
+ * Reset cached state. For tests only.
36
+ */
37
+ export declare function _resetLogsCache(): void;
38
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/telemetry/logs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA6CH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAyBvD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEtD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAGtC"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * OpenTelemetry Logs bridge for Photon.
3
+ *
4
+ * Zero-dep no-op that upgrades gracefully when
5
+ * `@opentelemetry/api-logs` is installed. Mirrors the dynamic-import
6
+ * pattern used in otel.ts and metrics.ts so the runtime stays
7
+ * dependency-free by default and production deployments can wire up
8
+ * any OTLP-compatible log backend by installing the SDK.
9
+ *
10
+ * The photon Logger pushes each emitted record through `emitOtelLog`
11
+ * after writing to its local stream. When the SDK is present the
12
+ * record is forwarded to the OTel logs bridge with severity mapped
13
+ * to the standard scale and ambient trace context auto-attached.
14
+ */
15
+ import { getRequestContext } from './context.js';
16
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
+ let otelLogsApi;
18
+ async function loadOtelLogsApi() {
19
+ if (otelLogsApi !== undefined)
20
+ return otelLogsApi;
21
+ try {
22
+ const moduleName = '@opentelemetry/api-logs';
23
+ otelLogsApi = await import(/* webpackIgnore: true */ moduleName);
24
+ return otelLogsApi;
25
+ }
26
+ catch {
27
+ otelLogsApi = null;
28
+ return null;
29
+ }
30
+ }
31
+ const logsReady = loadOtelLogsApi();
32
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
+ let cachedLogger;
34
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
35
+ function getOtelLogger() {
36
+ if (!otelLogsApi)
37
+ return null;
38
+ if (cachedLogger)
39
+ return cachedLogger;
40
+ try {
41
+ cachedLogger = otelLogsApi.logs?.getLogger?.('photon', '1.0.0') ?? null;
42
+ return cachedLogger;
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ }
48
+ // OTel SeverityNumber scale (RFC 5424-ish).
49
+ const SEVERITY = {
50
+ debug: 5,
51
+ info: 9,
52
+ warn: 13,
53
+ error: 17,
54
+ fatal: 21,
55
+ };
56
+ /**
57
+ * Emit a log record to OpenTelemetry if the SDK is installed. No-op otherwise.
58
+ * The ambient request context (photon/tool/traceId/callerId) is pulled lazily
59
+ * so callers do not have to thread it through.
60
+ */
61
+ export function emitOtelLog(record) {
62
+ const otelLogger = getOtelLogger();
63
+ if (!otelLogger)
64
+ return;
65
+ const attributes = { ...(record.attributes ?? {}) };
66
+ const ctx = getRequestContext();
67
+ if (ctx) {
68
+ if (ctx.photon && attributes['photon.name'] == null)
69
+ attributes['photon.name'] = ctx.photon;
70
+ if (ctx.tool && attributes['photon.tool'] == null)
71
+ attributes['photon.tool'] = ctx.tool;
72
+ if (ctx.traceId && attributes['photon.trace_id'] == null)
73
+ attributes['photon.trace_id'] = ctx.traceId;
74
+ if (ctx.caller?.id && attributes['photon.caller_id'] == null)
75
+ attributes['photon.caller_id'] = ctx.caller.id;
76
+ }
77
+ try {
78
+ otelLogger.emit({
79
+ severityNumber: SEVERITY[record.level] ?? SEVERITY.info,
80
+ severityText: record.level.toUpperCase(),
81
+ body: record.message,
82
+ attributes,
83
+ });
84
+ }
85
+ catch {
86
+ /* best-effort */
87
+ }
88
+ }
89
+ /**
90
+ * Returns true if the OTel logs SDK is available.
91
+ */
92
+ export function isOtelLogsEnabled() {
93
+ return otelLogsApi != null && getOtelLogger() != null;
94
+ }
95
+ /**
96
+ * Wait for the initial probe. For tests.
97
+ */
98
+ export async function waitForLogsProbe() {
99
+ await logsReady;
100
+ }
101
+ /**
102
+ * Reset cached state. For tests only.
103
+ */
104
+ export function _resetLogsCache() {
105
+ otelLogsApi = undefined;
106
+ cachedLogger = undefined;
107
+ }
108
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/telemetry/logs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * OpenTelemetry GenAI Metrics for Photon
3
+ *
4
+ * Zero-dependency metrics wrappers that no-op when @opentelemetry/api is not
5
+ * installed. Mirrors the pattern in otel.ts for traces.
6
+ *
7
+ * Metric names follow OTel GenAI semantic conventions where applicable and
8
+ * `photon.*` for runtime-specific instruments.
9
+ */
10
+ export interface PhotonCounter {
11
+ add(value: number, attributes?: Record<string, string | number | boolean>): void;
12
+ }
13
+ export interface PhotonHistogram {
14
+ record(value: number, attributes?: Record<string, string | number | boolean>): void;
15
+ }
16
+ /**
17
+ * Record a tool-call completion. Emits to both a latency histogram and a call
18
+ * counter so operators can derive rate, error rate, and p95/p99 from one pair.
19
+ */
20
+ export declare function recordToolCall(params: {
21
+ photon: string;
22
+ tool: string;
23
+ durationMs: number;
24
+ status: 'ok' | 'error';
25
+ errorType?: string;
26
+ stateful?: boolean;
27
+ }): void;
28
+ /**
29
+ * Record a rate-limit rejection. Incremented every time a `@throttled`
30
+ * or `@rateLimit` middleware throws `PhotonRateLimitError`.
31
+ */
32
+ export declare function recordRateLimitRejection(params: {
33
+ photon: string;
34
+ tool: string;
35
+ instance?: string;
36
+ }): void;
37
+ /**
38
+ * Record a bulkhead rejection. Incremented every time the @bulkhead
39
+ * middleware throws PhotonBulkheadFullError because concurrent-execution
40
+ * cap was reached.
41
+ */
42
+ export declare function recordBulkheadRejection(params: {
43
+ photon: string;
44
+ tool: string;
45
+ instance?: string;
46
+ }): void;
47
+ /**
48
+ * Record a circuit-breaker state transition.
49
+ * Attributes capture the photon/tool key and the new state so dashboards can
50
+ * alert on "open" without sampling the call stream.
51
+ */
52
+ export declare function recordCircuitStateChange(params: {
53
+ photon: string;
54
+ tool: string;
55
+ instance?: string;
56
+ from: 'closed' | 'open' | 'half-open';
57
+ to: 'closed' | 'open' | 'half-open';
58
+ }): void;
59
+ /**
60
+ * Returns true if OpenTelemetry metrics are available.
61
+ */
62
+ export declare function isMetricsEnabled(): boolean;
63
+ /**
64
+ * Wait for the initial OTel probe. For tests.
65
+ */
66
+ export declare function waitForMetricsProbe(): Promise<void>;
67
+ /**
68
+ * Reset cached state. For tests only.
69
+ */
70
+ export declare function _resetMetricsCache(): void;
71
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/telemetry/metrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC;CAClF;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC;CACrF;AA0FD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,IAAI,CAgBP;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAWP;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAWP;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,EAAE,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;CACrC,GAAG,IAAI,CAYP;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAIzC"}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * OpenTelemetry GenAI Metrics for Photon
3
+ *
4
+ * Zero-dependency metrics wrappers that no-op when @opentelemetry/api is not
5
+ * installed. Mirrors the pattern in otel.ts for traces.
6
+ *
7
+ * Metric names follow OTel GenAI semantic conventions where applicable and
8
+ * `photon.*` for runtime-specific instruments.
9
+ */
10
+ const noopCounter = { add() { } };
11
+ const noopHistogram = { record() { } };
12
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
+ let otelApi;
14
+ async function loadOtelApi() {
15
+ if (otelApi !== undefined)
16
+ return otelApi;
17
+ try {
18
+ const moduleName = '@opentelemetry/api';
19
+ otelApi = await import(/* webpackIgnore: true */ moduleName);
20
+ return otelApi;
21
+ }
22
+ catch {
23
+ otelApi = null;
24
+ return null;
25
+ }
26
+ }
27
+ const metricsReady = loadOtelApi();
28
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
+ function getMeterSync() {
30
+ if (!otelApi)
31
+ return null;
32
+ try {
33
+ return otelApi.metrics?.getMeter?.('photon', '1.0.0') ?? null;
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ // Cache instruments — creating them is cheap but caching makes hot paths snappier.
40
+ const counterCache = new Map();
41
+ const histogramCache = new Map();
42
+ function wrapCounter(otelCounter) {
43
+ return {
44
+ add(value, attributes) {
45
+ try {
46
+ otelCounter.add(value, attributes);
47
+ }
48
+ catch {
49
+ /* best-effort */
50
+ }
51
+ },
52
+ };
53
+ }
54
+ function wrapHistogram(otelHistogram) {
55
+ return {
56
+ record(value, attributes) {
57
+ try {
58
+ otelHistogram.record(value, attributes);
59
+ }
60
+ catch {
61
+ /* best-effort */
62
+ }
63
+ },
64
+ };
65
+ }
66
+ function getCounter(name, description, unit) {
67
+ const cached = counterCache.get(name);
68
+ if (cached)
69
+ return cached;
70
+ const meter = getMeterSync();
71
+ if (!meter)
72
+ return noopCounter;
73
+ try {
74
+ const counter = meter.createCounter(name, { description, unit });
75
+ const wrapped = wrapCounter(counter);
76
+ counterCache.set(name, wrapped);
77
+ return wrapped;
78
+ }
79
+ catch {
80
+ return noopCounter;
81
+ }
82
+ }
83
+ function getHistogram(name, description, unit) {
84
+ const cached = histogramCache.get(name);
85
+ if (cached)
86
+ return cached;
87
+ const meter = getMeterSync();
88
+ if (!meter)
89
+ return noopHistogram;
90
+ try {
91
+ const histogram = meter.createHistogram(name, { description, unit });
92
+ const wrapped = wrapHistogram(histogram);
93
+ histogramCache.set(name, wrapped);
94
+ return wrapped;
95
+ }
96
+ catch {
97
+ return noopHistogram;
98
+ }
99
+ }
100
+ /**
101
+ * Record a tool-call completion. Emits to both a latency histogram and a call
102
+ * counter so operators can derive rate, error rate, and p95/p99 from one pair.
103
+ */
104
+ export function recordToolCall(params) {
105
+ const attrs = {
106
+ 'gen_ai.agent.name': params.photon,
107
+ 'gen_ai.tool.name': params.tool,
108
+ 'gen_ai.operation.name': 'execute_tool',
109
+ status: params.status,
110
+ };
111
+ if (typeof params.stateful === 'boolean')
112
+ attrs['photon.stateful'] = params.stateful;
113
+ if (params.errorType)
114
+ attrs['photon.error_type'] = params.errorType;
115
+ getHistogram('photon.tool.duration', 'Tool-call duration', 'ms').record(params.durationMs, attrs);
116
+ getCounter('photon.tool.calls', 'Tool-call count', '1').add(1, attrs);
117
+ if (params.status === 'error') {
118
+ getCounter('photon.tool.errors', 'Tool-call errors', '1').add(1, attrs);
119
+ }
120
+ }
121
+ /**
122
+ * Record a rate-limit rejection. Incremented every time a `@throttled`
123
+ * or `@rateLimit` middleware throws `PhotonRateLimitError`.
124
+ */
125
+ export function recordRateLimitRejection(params) {
126
+ const attrs = {
127
+ 'gen_ai.agent.name': params.photon,
128
+ 'gen_ai.tool.name': params.tool,
129
+ };
130
+ if (params.instance)
131
+ attrs['photon.instance'] = params.instance;
132
+ getCounter('photon.rate_limit.rejections', 'Rate-limit rejections (throttled middleware)', '1').add(1, attrs);
133
+ }
134
+ /**
135
+ * Record a bulkhead rejection. Incremented every time the @bulkhead
136
+ * middleware throws PhotonBulkheadFullError because concurrent-execution
137
+ * cap was reached.
138
+ */
139
+ export function recordBulkheadRejection(params) {
140
+ const attrs = {
141
+ 'gen_ai.agent.name': params.photon,
142
+ 'gen_ai.tool.name': params.tool,
143
+ };
144
+ if (params.instance)
145
+ attrs['photon.instance'] = params.instance;
146
+ getCounter('photon.bulkhead.rejections', 'Bulkhead rejections (concurrent-cap exceeded)', '1').add(1, attrs);
147
+ }
148
+ /**
149
+ * Record a circuit-breaker state transition.
150
+ * Attributes capture the photon/tool key and the new state so dashboards can
151
+ * alert on "open" without sampling the call stream.
152
+ */
153
+ export function recordCircuitStateChange(params) {
154
+ const attrs = {
155
+ 'gen_ai.agent.name': params.photon,
156
+ 'gen_ai.tool.name': params.tool,
157
+ from: params.from,
158
+ to: params.to,
159
+ };
160
+ if (params.instance)
161
+ attrs['photon.instance'] = params.instance;
162
+ getCounter('photon.circuit_breaker.transitions', 'Circuit-breaker state transitions', '1').add(1, attrs);
163
+ }
164
+ /**
165
+ * Returns true if OpenTelemetry metrics are available.
166
+ */
167
+ export function isMetricsEnabled() {
168
+ return otelApi != null && getMeterSync() != null;
169
+ }
170
+ /**
171
+ * Wait for the initial OTel probe. For tests.
172
+ */
173
+ export async function waitForMetricsProbe() {
174
+ await metricsReady;
175
+ }
176
+ /**
177
+ * Reset cached state. For tests only.
178
+ */
179
+ export function _resetMetricsCache() {
180
+ otelApi = undefined;
181
+ counterCache.clear();
182
+ histogramCache.clear();
183
+ }
184
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/telemetry/metrics.ts"],"names":[],"mappings":"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"}
@@ -9,12 +9,31 @@ export interface PhotonSpan {
9
9
  setAttribute(key: string, value: string | number | boolean): void;
10
10
  addEvent(name: string, attributes?: Record<string, string | number | boolean>): void;
11
11
  setStatus(code: 'OK' | 'ERROR', message?: string): void;
12
+ recordException(error: unknown): void;
12
13
  end(): void;
13
14
  }
15
+ /**
16
+ * Parse a W3C traceparent header into its components.
17
+ * Format: `{version}-{traceId}-{parentSpanId}-{flags}` (e.g. `00-abc...-def...-01`).
18
+ * Returns null if the header is malformed.
19
+ */
20
+ export declare function parseTraceparent(traceparent: string | undefined | null): {
21
+ version: string;
22
+ traceId: string;
23
+ spanId: string;
24
+ flags: string;
25
+ } | null;
14
26
  /**
15
27
  * Start a span for tool execution following GenAI semantic conventions.
28
+ * @param traceId - Optional W3C-compatible trace ID (32 hex chars) for async executions.
29
+ * When provided, set as `photon.trace_id` on the span so async executions are
30
+ * correlated with the execution ID returned to the caller.
31
+ * @param stateful - When true, sets `photon.stateful=true` on the span.
32
+ * @param parentTraceparent - Optional W3C traceparent header. When provided, the new
33
+ * span is created as a child of that remote span context so distributed traces
34
+ * chain across client → photon → downstream calls.
16
35
  */
17
- export declare function startToolSpan(photon: string, tool: string, params?: Record<string, unknown>): PhotonSpan;
36
+ export declare function startToolSpan(photon: string, tool: string, params?: Record<string, unknown>, traceId?: string, stateful?: boolean, parentTraceparent?: string): PhotonSpan;
18
37
  /**
19
38
  * Start a span for agent-level invocation following GenAI semantic conventions.
20
39
  */
@@ -1 +1 @@
1
- {"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../../src/telemetry/otel.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IAClE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC;IACrF,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxD,GAAG,IAAI,IAAI,CAAC;CACb;AA0DD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,UAAU,CAmBZ;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,CAa/E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEtD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
1
+ {"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../../src/telemetry/otel.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IAClE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC;IACrF,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxD,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACtC,GAAG,IAAI,IAAI,CAAC;CACb;AA8ED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GACrC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAY5E;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,OAAO,EAClB,iBAAiB,CAAC,EAAE,MAAM,GACzB,UAAU,CA2CZ;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,CAa/E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEtD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}