@portel/photon 1.21.0 → 1.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ag-ui/adapter.d.ts +4 -1
- package/dist/ag-ui/adapter.d.ts.map +1 -1
- package/dist/ag-ui/adapter.js +33 -3
- package/dist/ag-ui/adapter.js.map +1 -1
- package/dist/ag-ui/types.d.ts +12 -0
- package/dist/ag-ui/types.d.ts.map +1 -1
- package/dist/auto-ui/beam/routes/api-config.d.ts +1 -1
- package/dist/auto-ui/beam/routes/api-config.d.ts.map +1 -1
- package/dist/auto-ui/beam/routes/api-config.js +79 -1
- package/dist/auto-ui/beam/routes/api-config.js.map +1 -1
- package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -1
- package/dist/auto-ui/streamable-http-transport.js +24 -2
- package/dist/auto-ui/streamable-http-transport.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +3 -3
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +11 -1
- package/dist/cli.js.map +1 -1
- package/dist/daemon/protocol.d.ts +1 -1
- package/dist/daemon/protocol.d.ts.map +1 -1
- package/dist/daemon/protocol.js +1 -0
- package/dist/daemon/protocol.js.map +1 -1
- package/dist/daemon/server.js +8 -0
- package/dist/daemon/server.js.map +1 -1
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +247 -28
- package/dist/loader.js.map +1 -1
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +67 -37
- package/dist/server.js.map +1 -1
- package/dist/shared/error-handler.d.ts +1 -0
- package/dist/shared/error-handler.d.ts.map +1 -1
- package/dist/shared/error-handler.js +68 -10
- package/dist/shared/error-handler.js.map +1 -1
- package/dist/shared/logger.d.ts.map +1 -1
- package/dist/shared/logger.js +34 -0
- package/dist/shared/logger.js.map +1 -1
- package/dist/telemetry/context.d.ts +24 -0
- package/dist/telemetry/context.d.ts.map +1 -0
- package/dist/telemetry/context.js +17 -0
- package/dist/telemetry/context.js.map +1 -0
- package/dist/telemetry/logs.d.ts +38 -0
- package/dist/telemetry/logs.d.ts.map +1 -0
- package/dist/telemetry/logs.js +108 -0
- package/dist/telemetry/logs.js.map +1 -0
- package/dist/telemetry/metrics.d.ts +71 -0
- package/dist/telemetry/metrics.d.ts.map +1 -0
- package/dist/telemetry/metrics.js +184 -0
- package/dist/telemetry/metrics.js.map +1 -0
- package/dist/telemetry/otel.d.ts +20 -1
- package/dist/telemetry/otel.d.ts.map +1 -1
- package/dist/telemetry/otel.js +79 -2
- package/dist/telemetry/otel.js.map +1 -1
- package/dist/telemetry/sdk.d.ts +49 -0
- package/dist/telemetry/sdk.d.ts.map +1 -0
- package/dist/telemetry/sdk.js +110 -0
- package/dist/telemetry/sdk.js.map +1 -0
- package/package.json +2 -2
package/dist/telemetry/otel.js
CHANGED
|
@@ -9,6 +9,7 @@ const noopSpan = {
|
|
|
9
9
|
setAttribute() { },
|
|
10
10
|
addEvent() { },
|
|
11
11
|
setStatus() { },
|
|
12
|
+
recordException() { },
|
|
12
13
|
end() { },
|
|
13
14
|
};
|
|
14
15
|
// Cached reference to the OTel API (undefined = not yet checked, null = not available)
|
|
@@ -53,23 +54,99 @@ function wrapOtelSpan(otelSpan, otelApi) {
|
|
|
53
54
|
setStatus(code, message) {
|
|
54
55
|
const statusCode = code === 'OK' ? otelApi.SpanStatusCode.OK : otelApi.SpanStatusCode.ERROR;
|
|
55
56
|
otelSpan.setStatus({ code: statusCode, message });
|
|
57
|
+
// Force-sample failed spans even under head-based sampling
|
|
58
|
+
if (code === 'ERROR') {
|
|
59
|
+
try {
|
|
60
|
+
otelSpan.setAttribute('sampling.priority', 1);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
/* best-effort */
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
recordException(error) {
|
|
68
|
+
try {
|
|
69
|
+
if (error instanceof Error) {
|
|
70
|
+
otelSpan.recordException(error);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
otelSpan.recordException(new Error(String(error)));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
/* best-effort */
|
|
78
|
+
}
|
|
56
79
|
},
|
|
57
80
|
end() {
|
|
58
81
|
otelSpan.end();
|
|
59
82
|
},
|
|
60
83
|
};
|
|
61
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* Parse a W3C traceparent header into its components.
|
|
87
|
+
* Format: `{version}-{traceId}-{parentSpanId}-{flags}` (e.g. `00-abc...-def...-01`).
|
|
88
|
+
* Returns null if the header is malformed.
|
|
89
|
+
*/
|
|
90
|
+
export function parseTraceparent(traceparent) {
|
|
91
|
+
if (!traceparent || typeof traceparent !== 'string')
|
|
92
|
+
return null;
|
|
93
|
+
const parts = traceparent.trim().split('-');
|
|
94
|
+
if (parts.length !== 4)
|
|
95
|
+
return null;
|
|
96
|
+
const [version, traceId, spanId, flags] = parts;
|
|
97
|
+
if (version.length !== 2 || traceId.length !== 32 || spanId.length !== 16 || flags.length !== 2) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
if (!/^[0-9a-f]+$/i.test(traceId) || !/^[0-9a-f]+$/i.test(spanId))
|
|
101
|
+
return null;
|
|
102
|
+
// All-zero trace/span IDs are invalid per the spec.
|
|
103
|
+
if (/^0+$/.test(traceId) || /^0+$/.test(spanId))
|
|
104
|
+
return null;
|
|
105
|
+
return { version, traceId, spanId, flags };
|
|
106
|
+
}
|
|
62
107
|
/**
|
|
63
108
|
* Start a span for tool execution following GenAI semantic conventions.
|
|
109
|
+
* @param traceId - Optional W3C-compatible trace ID (32 hex chars) for async executions.
|
|
110
|
+
* When provided, set as `photon.trace_id` on the span so async executions are
|
|
111
|
+
* correlated with the execution ID returned to the caller.
|
|
112
|
+
* @param stateful - When true, sets `photon.stateful=true` on the span.
|
|
113
|
+
* @param parentTraceparent - Optional W3C traceparent header. When provided, the new
|
|
114
|
+
* span is created as a child of that remote span context so distributed traces
|
|
115
|
+
* chain across client → photon → downstream calls.
|
|
64
116
|
*/
|
|
65
|
-
export function startToolSpan(photon, tool, params) {
|
|
117
|
+
export function startToolSpan(photon, tool, params, traceId, stateful, parentTraceparent) {
|
|
66
118
|
const tracer = getTracerSync();
|
|
67
119
|
if (!tracer)
|
|
68
120
|
return noopSpan;
|
|
69
|
-
const
|
|
121
|
+
const parent = parseTraceparent(parentTraceparent);
|
|
122
|
+
let span;
|
|
123
|
+
if (parent && otelApi?.trace && otelApi?.context) {
|
|
124
|
+
try {
|
|
125
|
+
const spanContext = {
|
|
126
|
+
traceId: parent.traceId,
|
|
127
|
+
spanId: parent.spanId,
|
|
128
|
+
traceFlags: parseInt(parent.flags, 16) || 0,
|
|
129
|
+
isRemote: true,
|
|
130
|
+
};
|
|
131
|
+
const ctx = otelApi.trace.setSpanContext(otelApi.context.active(), spanContext);
|
|
132
|
+
span = tracer.startSpan(`gen_ai.tool.call ${photon}.${tool}`, undefined, ctx);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
span = tracer.startSpan(`gen_ai.tool.call ${photon}.${tool}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
span = tracer.startSpan(`gen_ai.tool.call ${photon}.${tool}`);
|
|
140
|
+
}
|
|
70
141
|
span.setAttribute('gen_ai.tool.name', tool);
|
|
71
142
|
span.setAttribute('gen_ai.agent.name', photon);
|
|
72
143
|
span.setAttribute('gen_ai.operation.name', 'execute_tool');
|
|
144
|
+
if (traceId) {
|
|
145
|
+
span.setAttribute('photon.trace_id', traceId);
|
|
146
|
+
}
|
|
147
|
+
if (typeof stateful === 'boolean') {
|
|
148
|
+
span.setAttribute('photon.stateful', stateful);
|
|
149
|
+
}
|
|
73
150
|
if (params) {
|
|
74
151
|
const paramKeys = Object.keys(params);
|
|
75
152
|
if (paramKeys.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otel.js","sourceRoot":"","sources":["../../src/telemetry/otel.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"otel.js","sourceRoot":"","sources":["../../src/telemetry/otel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenTelemetry NodeSDK bootstrap for Photon.
|
|
3
|
+
*
|
|
4
|
+
* Zero required dependencies. When `OTEL_EXPORTER_OTLP_ENDPOINT` is set in
|
|
5
|
+
* the environment AND `@opentelemetry/sdk-node` is installed, the runtime
|
|
6
|
+
* wires up OTLP exporters for traces, metrics, and logs so every span,
|
|
7
|
+
* counter, histogram, and log record emitted elsewhere in the codebase
|
|
8
|
+
* lands in an OTLP-compatible backend (Jaeger, Grafana Tempo, SigNoz,
|
|
9
|
+
* Honeycomb, DataDog, etc.) without further configuration.
|
|
10
|
+
*
|
|
11
|
+
* This is the final piece that makes the instrumentation shipped in
|
|
12
|
+
* otel.ts / metrics.ts / logs.ts observable in practice.
|
|
13
|
+
*/
|
|
14
|
+
import type { PhotonSpan } from './otel.js';
|
|
15
|
+
/**
|
|
16
|
+
* Returns true if the caller has opted into OTel export via the standard
|
|
17
|
+
* environment variable. The OTel spec treats `OTEL_EXPORTER_OTLP_ENDPOINT`
|
|
18
|
+
* as the universal switch.
|
|
19
|
+
*/
|
|
20
|
+
export declare function isOtelRequested(): boolean;
|
|
21
|
+
export interface OtelSdkOptions {
|
|
22
|
+
/** Service name attached to every exported record. Defaults to `photon`. */
|
|
23
|
+
serviceName?: string;
|
|
24
|
+
/** Service version. Defaults to PHOTON_VERSION if available. */
|
|
25
|
+
serviceVersion?: string;
|
|
26
|
+
/** Deployment environment (e.g. "prod", "staging"). */
|
|
27
|
+
deploymentEnvironment?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Start the OTel NodeSDK if the env + dependencies are present.
|
|
31
|
+
*
|
|
32
|
+
* Idempotent — safe to call multiple times. Returns true if the SDK was
|
|
33
|
+
* actually started, false if the bootstrap was skipped (env missing, SDK
|
|
34
|
+
* not installed, or already running).
|
|
35
|
+
*
|
|
36
|
+
* Call this as early as possible in process startup, before any photon
|
|
37
|
+
* code runs, so spans from the very first tool call are captured.
|
|
38
|
+
*/
|
|
39
|
+
export declare function initOtelSdk(options?: OtelSdkOptions): Promise<boolean>;
|
|
40
|
+
/**
|
|
41
|
+
* Shut down the SDK and flush exporters. For tests.
|
|
42
|
+
*/
|
|
43
|
+
export declare function shutdownOtelSdk(): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Returns true if the SDK has been started in this process.
|
|
46
|
+
*/
|
|
47
|
+
export declare function isOtelSdkStarted(): boolean;
|
|
48
|
+
export type { PhotonSpan };
|
|
49
|
+
//# sourceMappingURL=sdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/telemetry/sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAK5C;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED,MAAM,WAAW,cAAc;IAC7B,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAyDhF;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAWrD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAID,YAAY,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenTelemetry NodeSDK bootstrap for Photon.
|
|
3
|
+
*
|
|
4
|
+
* Zero required dependencies. When `OTEL_EXPORTER_OTLP_ENDPOINT` is set in
|
|
5
|
+
* the environment AND `@opentelemetry/sdk-node` is installed, the runtime
|
|
6
|
+
* wires up OTLP exporters for traces, metrics, and logs so every span,
|
|
7
|
+
* counter, histogram, and log record emitted elsewhere in the codebase
|
|
8
|
+
* lands in an OTLP-compatible backend (Jaeger, Grafana Tempo, SigNoz,
|
|
9
|
+
* Honeycomb, DataDog, etc.) without further configuration.
|
|
10
|
+
*
|
|
11
|
+
* This is the final piece that makes the instrumentation shipped in
|
|
12
|
+
* otel.ts / metrics.ts / logs.ts observable in practice.
|
|
13
|
+
*/
|
|
14
|
+
let started = false;
|
|
15
|
+
let sdkInstance;
|
|
16
|
+
/**
|
|
17
|
+
* Returns true if the caller has opted into OTel export via the standard
|
|
18
|
+
* environment variable. The OTel spec treats `OTEL_EXPORTER_OTLP_ENDPOINT`
|
|
19
|
+
* as the universal switch.
|
|
20
|
+
*/
|
|
21
|
+
export function isOtelRequested() {
|
|
22
|
+
return Boolean(process.env.OTEL_EXPORTER_OTLP_ENDPOINT || process.env.OTEL_SDK_DISABLED === '0');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Start the OTel NodeSDK if the env + dependencies are present.
|
|
26
|
+
*
|
|
27
|
+
* Idempotent — safe to call multiple times. Returns true if the SDK was
|
|
28
|
+
* actually started, false if the bootstrap was skipped (env missing, SDK
|
|
29
|
+
* not installed, or already running).
|
|
30
|
+
*
|
|
31
|
+
* Call this as early as possible in process startup, before any photon
|
|
32
|
+
* code runs, so spans from the very first tool call are captured.
|
|
33
|
+
*/
|
|
34
|
+
export async function initOtelSdk(options = {}) {
|
|
35
|
+
if (started)
|
|
36
|
+
return false;
|
|
37
|
+
if (!isOtelRequested())
|
|
38
|
+
return false;
|
|
39
|
+
try {
|
|
40
|
+
const sdkNodeModule = '@opentelemetry/sdk-node';
|
|
41
|
+
const resourcesModule = '@opentelemetry/resources';
|
|
42
|
+
const semconvModule = '@opentelemetry/semantic-conventions';
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
44
|
+
const sdkNode = await import(/* webpackIgnore: true */ sdkNodeModule);
|
|
45
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
46
|
+
const resources = await import(/* webpackIgnore: true */ resourcesModule);
|
|
47
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
48
|
+
const semconv = await import(/* webpackIgnore: true */ semconvModule);
|
|
49
|
+
const attrs = {
|
|
50
|
+
[semconv.SemanticResourceAttributes?.SERVICE_NAME ?? 'service.name']: options.serviceName || process.env.OTEL_SERVICE_NAME || 'photon',
|
|
51
|
+
};
|
|
52
|
+
if (options.serviceVersion) {
|
|
53
|
+
attrs[semconv.SemanticResourceAttributes?.SERVICE_VERSION ?? 'service.version'] =
|
|
54
|
+
options.serviceVersion;
|
|
55
|
+
}
|
|
56
|
+
if (options.deploymentEnvironment) {
|
|
57
|
+
attrs['deployment.environment'] = options.deploymentEnvironment;
|
|
58
|
+
}
|
|
59
|
+
const resource = resources.Resource?.default
|
|
60
|
+
? resources.Resource.default().merge(new resources.Resource(attrs))
|
|
61
|
+
: new resources.Resource(attrs);
|
|
62
|
+
const sdk = new sdkNode.NodeSDK({
|
|
63
|
+
resource,
|
|
64
|
+
// The SDK auto-detects OTLP exporters from OTEL_EXPORTER_OTLP_ENDPOINT
|
|
65
|
+
// and OTEL_EXPORTER_OTLP_PROTOCOL (grpc, http/protobuf, http/json).
|
|
66
|
+
});
|
|
67
|
+
sdk.start();
|
|
68
|
+
sdkInstance = sdk;
|
|
69
|
+
started = true;
|
|
70
|
+
// Graceful shutdown on process exit — flush pending spans/metrics/logs.
|
|
71
|
+
const shutdown = () => {
|
|
72
|
+
void sdk.shutdown?.().catch(() => {
|
|
73
|
+
/* best-effort */
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
process.once('SIGTERM', shutdown);
|
|
77
|
+
process.once('SIGINT', shutdown);
|
|
78
|
+
process.once('beforeExit', shutdown);
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// SDK not installed or bootstrap failed — stay silent. The runtime's
|
|
83
|
+
// no-op wrappers in otel.ts/metrics.ts/logs.ts continue to work.
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Shut down the SDK and flush exporters. For tests.
|
|
89
|
+
*/
|
|
90
|
+
export async function shutdownOtelSdk() {
|
|
91
|
+
if (!started)
|
|
92
|
+
return;
|
|
93
|
+
started = false;
|
|
94
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
95
|
+
const sdk = sdkInstance;
|
|
96
|
+
try {
|
|
97
|
+
await sdk?.shutdown?.();
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
/* best-effort */
|
|
101
|
+
}
|
|
102
|
+
sdkInstance = undefined;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Returns true if the SDK has been started in this process.
|
|
106
|
+
*/
|
|
107
|
+
export function isOtelSdkStarted() {
|
|
108
|
+
return started;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=sdk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/telemetry/sdk.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@portel/photon",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.22.0",
|
|
4
4
|
"description": "You focus on the business logic. We'll enable the rest. Build MCP servers and CLI tools in a single TypeScript file.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -112,7 +112,7 @@
|
|
|
112
112
|
"@modelcontextprotocol/ext-apps": "^1.0.1",
|
|
113
113
|
"@modelcontextprotocol/sdk": "^1.25.2",
|
|
114
114
|
"@portel/cli": "^1.1.0",
|
|
115
|
-
"@portel/photon-core": "^2.
|
|
115
|
+
"@portel/photon-core": "^2.22.0",
|
|
116
116
|
"boxen": "^8.0.1",
|
|
117
117
|
"chalk": "^5.4.1",
|
|
118
118
|
"chart.js": "^4.5.1",
|