@cybernetyx1/atlasflow-opentelemetry 0.1.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/LICENSE ADDED
@@ -0,0 +1,18 @@
1
+ PROPRIETARY SOFTWARE LICENSE
2
+
3
+ Copyright (c) 2026 Cybernetyx. All rights reserved.
4
+
5
+ This software and its source code are the proprietary and confidential property
6
+ of the copyright holder. The software is original work authored independently.
7
+
8
+ No part of this software may be copied, reproduced, modified, published,
9
+ distributed, sublicensed, or sold in any form or by any means without the prior
10
+ written permission of the copyright holder, except as expressly permitted by a
11
+ separate written agreement.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
15
+ FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT
16
+ HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION
17
+ OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION WITH THE
18
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # @cybernetyx1/atlasflow-opentelemetry
2
+
3
+ Maps the AtlasFlow runtime event stream onto OpenTelemetry spans — one span per run and per operation, with tool calls and token usage recorded.
4
+
5
+ ## Install
6
+
7
+ ```sh
8
+ pnpm add @cybernetyx1/atlasflow-opentelemetry
9
+ ```
10
+
11
+ Part of the AtlasFlow monorepo. Proprietary.
12
+
13
+ ## Usage
14
+
15
+ `createOpenTelemetryObserver(options)` returns an event subscriber. Subscribe it with `observe()`; spans export through whatever OpenTelemetry tracer provider you have configured (OTLP, Braintrust, Sentry, etc.).
16
+
17
+ ```ts
18
+ import { observe } from "@cybernetyx1/atlasflow-runtime";
19
+ import { createOpenTelemetryObserver } from "@cybernetyx1/atlasflow-opentelemetry";
20
+
21
+ observe(createOpenTelemetryObserver());
22
+ ```
23
+
24
+ Pass a custom `tracer` or a `sanitize` hook to inspect or drop events before they become spans:
25
+
26
+ ```ts
27
+ observe(
28
+ createOpenTelemetryObserver({
29
+ tracer: myTracer,
30
+ sanitize: (event) => (event.type === "tool_call" ? undefined : event),
31
+ }),
32
+ );
33
+ ```
34
+
35
+ Exports: `createOpenTelemetryObserver` and the `OpenTelemetryObserverOptions` type. Requires `@opentelemetry/api`.
36
+
37
+ ## License
38
+
39
+ Proprietary. © 2026 Cybernetyx. See LICENSE.
@@ -0,0 +1,25 @@
1
+ import { Tracer } from '@opentelemetry/api';
2
+ import { AtlasEvent, EventSubscriber } from '@cybernetyx1/atlasflow-runtime';
3
+
4
+ /**
5
+ * @cybernetyx1/atlasflow-opentelemetry — map the AtlasFlow event stream to OpenTelemetry
6
+ * spans. Subscribe the returned observer via `observe()`:
7
+ *
8
+ * import { observe } from "@cybernetyx1/atlasflow-runtime";
9
+ * import { createOpenTelemetryObserver } from "@cybernetyx1/atlasflow-opentelemetry";
10
+ * observe(createOpenTelemetryObserver());
11
+ *
12
+ * Emits a span per run and per operation, records tool calls and token usage,
13
+ * and sets span status from run/operation outcomes. Exports through whatever
14
+ * OpenTelemetry tracer provider you've configured (OTLP, Braintrust, Sentry...).
15
+ */
16
+
17
+ interface OpenTelemetryObserverOptions {
18
+ /** Tracer to use; defaults to the global tracer named "atlasflow". */
19
+ tracer?: Tracer;
20
+ /** Inspect/redact events before they become spans. Return undefined to drop. */
21
+ sanitize?: (event: AtlasEvent) => AtlasEvent | undefined;
22
+ }
23
+ declare function createOpenTelemetryObserver(options?: OpenTelemetryObserverOptions): EventSubscriber;
24
+
25
+ export { type OpenTelemetryObserverOptions, createOpenTelemetryObserver };
package/dist/index.js ADDED
@@ -0,0 +1,70 @@
1
+ // src/index.ts
2
+ import { SpanStatusCode, trace } from "@opentelemetry/api";
3
+ function createOpenTelemetryObserver(options = {}) {
4
+ const tracer = options.tracer ?? trace.getTracer("atlasflow");
5
+ const runSpans = /* @__PURE__ */ new Map();
6
+ const opSpans = /* @__PURE__ */ new Map();
7
+ return (raw) => {
8
+ const event = options.sanitize ? options.sanitize(raw) : raw;
9
+ if (!event) return;
10
+ switch (event.type) {
11
+ case "run_start": {
12
+ if (!event.runId) break;
13
+ const span = tracer.startSpan(`atlasflow.run ${event.agent}`, {
14
+ attributes: { "atlasflow.run_id": event.runId, "atlasflow.agent": event.agent, "atlasflow.instance_id": event.instanceId }
15
+ });
16
+ runSpans.set(event.runId, span);
17
+ break;
18
+ }
19
+ case "operation_start": {
20
+ if (!event.runId) break;
21
+ const span = tracer.startSpan(`atlasflow.operation ${event.kind}`, {
22
+ attributes: { "atlasflow.operation.kind": event.kind, "atlasflow.run_id": event.runId }
23
+ });
24
+ opSpans.set(event.operationId, span);
25
+ break;
26
+ }
27
+ case "operation_end": {
28
+ const span = opSpans.get(event.operationId);
29
+ span?.setStatus({ code: event.ok ? SpanStatusCode.OK : SpanStatusCode.ERROR });
30
+ span?.end();
31
+ opSpans.delete(event.operationId);
32
+ break;
33
+ }
34
+ case "turn_end": {
35
+ const span = event.runId ? runSpans.get(event.runId) : void 0;
36
+ span?.addEvent("gen_ai.generate", {
37
+ "gen_ai.usage.input_tokens": event.usage.inputTokens,
38
+ "gen_ai.usage.output_tokens": event.usage.outputTokens,
39
+ "gen_ai.usage.cache_read_tokens": event.usage.cacheReadTokens,
40
+ "gen_ai.usage.cost_total": event.usage.costTotal,
41
+ "atlasflow.stop_reason": event.stopReason
42
+ });
43
+ break;
44
+ }
45
+ case "tool_call": {
46
+ const span = event.runId ? runSpans.get(event.runId) : void 0;
47
+ span?.addEvent("atlasflow.tool_call", { "atlasflow.tool": event.tool, "atlasflow.call_id": event.callId });
48
+ break;
49
+ }
50
+ case "run_error": {
51
+ const span = event.runId ? runSpans.get(event.runId) : void 0;
52
+ span?.recordException({ name: event.code, message: event.message });
53
+ break;
54
+ }
55
+ case "run_end": {
56
+ if (!event.runId) break;
57
+ const span = runSpans.get(event.runId);
58
+ span?.setStatus({ code: event.ok ? SpanStatusCode.OK : SpanStatusCode.ERROR });
59
+ span?.end();
60
+ runSpans.delete(event.runId);
61
+ break;
62
+ }
63
+ default:
64
+ break;
65
+ }
66
+ };
67
+ }
68
+ export {
69
+ createOpenTelemetryObserver
70
+ };
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@cybernetyx1/atlasflow-opentelemetry",
3
+ "version": "0.1.0",
4
+ "description": "OpenTelemetry span observer for AtlasFlow runtime events.",
5
+ "type": "module",
6
+ "license": "SEE LICENSE IN LICENSE",
7
+ "author": "Cybernetyx",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/Cybernetyx/atlasflow.git",
11
+ "directory": "packages/opentelemetry"
12
+ },
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist"
21
+ ],
22
+ "dependencies": {
23
+ "@opentelemetry/api": "^1.9.0",
24
+ "@cybernetyx1/atlasflow-runtime": "0.1.0"
25
+ },
26
+ "devDependencies": {
27
+ "@opentelemetry/sdk-trace-base": "^1.30.0",
28
+ "@types/node": "^22.10.0",
29
+ "tsup": "^8.3.5",
30
+ "typescript": "^5.7.2"
31
+ },
32
+ "publishConfig": {
33
+ "access": "public"
34
+ },
35
+ "scripts": {
36
+ "build": "tsup",
37
+ "typecheck": "tsc --noEmit",
38
+ "test": "node --import tsx --test test/*.test.ts"
39
+ }
40
+ }