@ironbee-ai/cli 0.13.0 → 0.14.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.
Files changed (100) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +9 -0
  3. package/dist/clients/claude/hooks/activity-start.d.ts.map +1 -1
  4. package/dist/clients/claude/hooks/activity-start.js +4 -0
  5. package/dist/clients/claude/hooks/activity-start.js.map +1 -1
  6. package/dist/clients/claude/hooks/session-start.d.ts.map +1 -1
  7. package/dist/clients/claude/hooks/session-start.js +4 -0
  8. package/dist/clients/claude/hooks/session-start.js.map +1 -1
  9. package/dist/clients/claude/index.d.ts +10 -0
  10. package/dist/clients/claude/index.d.ts.map +1 -1
  11. package/dist/clients/claude/index.js +105 -0
  12. package/dist/clients/claude/index.js.map +1 -1
  13. package/dist/commands/config.d.ts.map +1 -1
  14. package/dist/commands/config.js +1 -0
  15. package/dist/commands/config.js.map +1 -1
  16. package/dist/commands/otel.d.ts +20 -0
  17. package/dist/commands/otel.d.ts.map +1 -0
  18. package/dist/commands/otel.js +132 -0
  19. package/dist/commands/otel.js.map +1 -0
  20. package/dist/index.js +4 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/lib/config.d.ts +47 -0
  23. package/dist/lib/config.d.ts.map +1 -1
  24. package/dist/lib/config.js +57 -3
  25. package/dist/lib/config.js.map +1 -1
  26. package/dist/lib/event.d.ts +112 -0
  27. package/dist/lib/event.d.ts.map +1 -1
  28. package/dist/lib/event.js +1 -0
  29. package/dist/lib/event.js.map +1 -1
  30. package/dist/lib/gitignore.d.ts.map +1 -1
  31. package/dist/lib/gitignore.js +6 -0
  32. package/dist/lib/gitignore.js.map +1 -1
  33. package/dist/lib/version.d.ts +5 -0
  34. package/dist/lib/version.d.ts.map +1 -1
  35. package/dist/lib/version.js +5 -0
  36. package/dist/lib/version.js.map +1 -1
  37. package/dist/otel/collector.d.ts +66 -0
  38. package/dist/otel/collector.d.ts.map +1 -0
  39. package/dist/otel/collector.js +317 -0
  40. package/dist/otel/collector.js.map +1 -0
  41. package/dist/otel/context/build.d.ts +37 -0
  42. package/dist/otel/context/build.d.ts.map +1 -0
  43. package/dist/otel/context/build.js +103 -0
  44. package/dist/otel/context/build.js.map +1 -0
  45. package/dist/otel/context/classify.d.ts +40 -0
  46. package/dist/otel/context/classify.d.ts.map +1 -0
  47. package/dist/otel/context/classify.js +228 -0
  48. package/dist/otel/context/classify.js.map +1 -0
  49. package/dist/otel/context/extract.d.ts +39 -0
  50. package/dist/otel/context/extract.d.ts.map +1 -0
  51. package/dist/otel/context/extract.js +76 -0
  52. package/dist/otel/context/extract.js.map +1 -0
  53. package/dist/otel/context/markers.d.ts +37 -0
  54. package/dist/otel/context/markers.d.ts.map +1 -0
  55. package/dist/otel/context/markers.js +179 -0
  56. package/dist/otel/context/markers.js.map +1 -0
  57. package/dist/otel/context/util.d.ts +15 -0
  58. package/dist/otel/context/util.d.ts.map +1 -0
  59. package/dist/otel/context/util.js +33 -0
  60. package/dist/otel/context/util.js.map +1 -0
  61. package/dist/otel/daemon/ensure.d.ts +52 -0
  62. package/dist/otel/daemon/ensure.d.ts.map +1 -0
  63. package/dist/otel/daemon/ensure.js +226 -0
  64. package/dist/otel/daemon/ensure.js.map +1 -0
  65. package/dist/otel/daemon/forward.d.ts +47 -0
  66. package/dist/otel/daemon/forward.d.ts.map +1 -0
  67. package/dist/otel/daemon/forward.js +0 -0
  68. package/dist/otel/daemon/forward.js.map +1 -0
  69. package/dist/otel/daemon/paths.d.ts +24 -0
  70. package/dist/otel/daemon/paths.d.ts.map +1 -0
  71. package/dist/otel/daemon/paths.js +47 -0
  72. package/dist/otel/daemon/paths.js.map +1 -0
  73. package/dist/otel/daemon/process.d.ts +21 -0
  74. package/dist/otel/daemon/process.d.ts.map +1 -0
  75. package/dist/otel/daemon/process.js +149 -0
  76. package/dist/otel/daemon/process.js.map +1 -0
  77. package/dist/otel/daemon/reprocess.d.ts +27 -0
  78. package/dist/otel/daemon/reprocess.d.ts.map +1 -0
  79. package/dist/otel/daemon/reprocess.js +112 -0
  80. package/dist/otel/daemon/reprocess.js.map +1 -0
  81. package/dist/otel/log-handler.d.ts +37 -0
  82. package/dist/otel/log-handler.d.ts.map +1 -0
  83. package/dist/otel/log-handler.js +332 -0
  84. package/dist/otel/log-handler.js.map +1 -0
  85. package/dist/otel/metric-handler.d.ts +12 -0
  86. package/dist/otel/metric-handler.d.ts.map +1 -0
  87. package/dist/otel/metric-handler.js +18 -0
  88. package/dist/otel/metric-handler.js.map +1 -0
  89. package/dist/otel/trace-handler.d.ts +12 -0
  90. package/dist/otel/trace-handler.d.ts.map +1 -0
  91. package/dist/otel/trace-handler.js +18 -0
  92. package/dist/otel/trace-handler.js.map +1 -0
  93. package/dist/otel/types.d.ts +105 -0
  94. package/dist/otel/types.d.ts.map +1 -0
  95. package/dist/otel/types.js +15 -0
  96. package/dist/otel/types.js.map +1 -0
  97. package/dist/tui/config/schema.d.ts.map +1 -1
  98. package/dist/tui/config/schema.js +44 -0
  99. package/dist/tui/config/schema.js.map +1 -1
  100. package/package.json +2 -1
package/dist/lib/event.js CHANGED
@@ -40,5 +40,6 @@ exports.EventType = {
40
40
  SESSION_TURN_STEP: "session_turn_step_analytics",
41
41
  API_REQUEST: "api_request",
42
42
  SESSION_STATUS: "session_status",
43
+ SESSION_CONTEXT: "session_context",
43
44
  };
44
45
  //# sourceMappingURL=event.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"event.js","sourceRoot":"","sources":["../../src/lib/event.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;AAEH,8DAA8D;AACjD,QAAA,SAAS,GAkBlB;IACA,aAAa,EAAE,eAAe;IAC9B,WAAW,EAAE,aAAa;IAC1B,cAAc,EAAE,gBAAgB;IAChC,YAAY,EAAE,cAAc;IAC5B,kBAAkB,EAAE,oBAAoB;IACxC,gBAAgB,EAAE,kBAAkB;IACpC,sBAAsB,EAAE,wBAAwB;IAChD,aAAa,EAAE,eAAe;IAC9B,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,SAAS;IAClB,WAAW,EAAE,aAAa;IAC1B,SAAS,EAAE,WAAW;IACtB,iBAAiB,EAAE,mBAAmB;IACtC,YAAY,EAAE,wBAAwB;IACtC,iBAAiB,EAAE,6BAA6B;IAChD,WAAW,EAAE,aAAa;IAC1B,cAAc,EAAE,gBAAgB;CAC1B,CAAC"}
1
+ {"version":3,"file":"event.js","sourceRoot":"","sources":["../../src/lib/event.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;AAEH,8DAA8D;AACjD,QAAA,SAAS,GAmBlB;IACA,aAAa,EAAE,eAAe;IAC9B,WAAW,EAAE,aAAa;IAC1B,cAAc,EAAE,gBAAgB;IAChC,YAAY,EAAE,cAAc;IAC5B,kBAAkB,EAAE,oBAAoB;IACxC,gBAAgB,EAAE,kBAAkB;IACpC,sBAAsB,EAAE,wBAAwB;IAChD,aAAa,EAAE,eAAe;IAC9B,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,SAAS;IAClB,WAAW,EAAE,aAAa;IAC1B,SAAS,EAAE,WAAW;IACtB,iBAAiB,EAAE,mBAAmB;IACtC,YAAY,EAAE,wBAAwB;IACtC,iBAAiB,EAAE,6BAA6B;IAChD,WAAW,EAAE,aAAa;IAC1B,cAAc,EAAE,gBAAgB;IAChC,eAAe,EAAE,iBAAiB;CAC5B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../../src/lib/gitignore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAqEH;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CA2BhE"}
1
+ {"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../../src/lib/gitignore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AA2EH;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CA2BhE"}
@@ -37,6 +37,12 @@ const IGNORE_ENTRIES = [
37
37
  pattern: ".ironbee/sessions/",
38
38
  lines: ["", IRONBEE_HEADER, ".ironbee/sessions/"],
39
39
  },
40
+ {
41
+ // Raw OTLP request/response bodies the OTEL collector daemon consumes
42
+ // (consume-once; never committed — they carry full prompts / outputs).
43
+ pattern: ".ironbee/otel/",
44
+ lines: [".ironbee/otel/"],
45
+ },
40
46
  {
41
47
  pattern: ".ironbee/config.local.json",
42
48
  // Standalone append — do NOT re-print the header, the sessions
@@ -1 +1 @@
1
- {"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../src/lib/gitignore.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;;AA4EH,0DA2BC;AArGD,2BAA6D;AAC7D,+BAA4B;AAC5B,qCAAkC;AAoBlC,MAAM,cAAc,GAAW,6BAA6B,CAAC;AAE7D,MAAM,cAAc,GAAkB;IAClC;QACI,OAAO,EAAE,oBAAoB;QAC7B,KAAK,EAAE,CAAC,EAAE,EAAE,cAAc,EAAE,oBAAoB,CAAC;KACpD;IACD;QACI,OAAO,EAAE,4BAA4B;QACrC,+DAA+D;QAC/D,oEAAoE;QACpE,KAAK,EAAE,CAAC,4BAA4B,CAAC;KACxC;IACD;QACI,qEAAqE;QACrE,mEAAmE;QACnE,iEAAiE;QACjE,kEAAkE;QAClE,kEAAkE;QAClE,qEAAqE;QACrE,iCAAiC;QACjC,OAAO,EAAE,6BAA6B;QACtC,KAAK,EAAE,CAAC,6BAA6B,CAAC;KACzC;CACJ,CAAC;AAEF;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,QAAgB,EAAE,OAAe;IAC5D,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,GAAW,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACvD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACpE,SAAS;QACb,CAAC;QACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,uBAAuB,CAAC,UAAkB;IACtD,IAAI,CAAC,IAAA,eAAU,EAAC,UAAU,CAAC,EAAE,CAAC;QAC1B,eAAM,CAAC,KAAK,CAAC,yBAAyB,UAAU,4BAA4B,CAAC,CAAC;QAC9E,OAAO;IACX,CAAC;IACD,MAAM,aAAa,GAAW,IAAA,WAAI,EAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAC7D,IAAI,CAAC;QACD,IAAI,QAAQ,GAAW,IAAA,eAAU,EAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAA,iBAAY,EAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,IAAI,OAAO,GAAY,KAAK,CAAC;QAC7B,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,IAAI,qBAAqB,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjD,SAAS;YACb,CAAC;YACD,gEAAgE;YAChE,qDAAqD;YACrD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,QAAQ,IAAI,IAAI,CAAC;YACrB,CAAC;YACD,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YAC1C,OAAO,GAAG,IAAI,CAAC;QACnB,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACV,IAAA,kBAAa,EAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QAC3C,CAAC;IACL,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,CAAC,oBAAoB,aAAa,YAAY,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpG,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../src/lib/gitignore.ts"],"names":[],"mappings":"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"}
@@ -6,5 +6,10 @@
6
6
  */
7
7
  export declare function getLocalVersion(): string;
8
8
  export declare function fetchLatestVersion(): Promise<string | null>;
9
+ /**
10
+ * Compare two dotted numeric versions (`x.y.z`). Returns `1` if `a > b`, `-1`
11
+ * if `a < b`, `0` if equal. Missing segments are treated as `0`.
12
+ */
13
+ export declare function compareVersions(a: string, b: string): number;
9
14
  export declare function checkForUpdates(): Promise<void>;
10
15
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,wBAAgB,eAAe,IAAI,MAAM,CASxC;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAwB3D;AAmBD,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA2BrD"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,wBAAgB,eAAe,IAAI,MAAM,CASxC;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAwB3D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAe5D;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA2BrD"}
@@ -8,6 +8,7 @@
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.getLocalVersion = getLocalVersion;
10
10
  exports.fetchLatestVersion = fetchLatestVersion;
11
+ exports.compareVersions = compareVersions;
11
12
  exports.checkForUpdates = checkForUpdates;
12
13
  const https_1 = require("https");
13
14
  const fs_1 = require("fs");
@@ -48,6 +49,10 @@ function fetchLatestVersion() {
48
49
  });
49
50
  });
50
51
  }
52
+ /**
53
+ * Compare two dotted numeric versions (`x.y.z`). Returns `1` if `a > b`, `-1`
54
+ * if `a < b`, `0` if equal. Missing segments are treated as `0`.
55
+ */
51
56
  function compareVersions(a, b) {
52
57
  const pa = a.split(".").map(Number);
53
58
  const pb = b.split(".").map(Number);
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * IronBee — OTEL Collector daemon
3
+ *
4
+ * A machine-global OTLP/HTTP (JSON) receiver. Claude Code, when run with
5
+ * telemetry enabled, exports its log/event records over OTLP to this daemon
6
+ * (one per machine, shared by every concurrent session). Point it at the
7
+ * daemon with:
8
+ *
9
+ * export CLAUDE_CODE_ENABLE_TELEMETRY=1
10
+ * export OTEL_LOGS_EXPORTER=otlp
11
+ * export OTEL_EXPORTER_OTLP_PROTOCOL=http/json
12
+ * export OTEL_EXPORTER_OTLP_ENDPOINT=http://127.0.0.1:15986
13
+ *
14
+ * Endpoints:
15
+ * - `POST /v1/logs` → `log-handler.ts`
16
+ * - `POST /v1/traces` → `trace-handler.ts` (noop)
17
+ * - `POST /v1/metrics` → `metric-handler.ts` (noop)
18
+ * - `GET /health` → version / pid / idle / observability counters
19
+ * - `POST /admin/shutdown` → graceful shutdown (used by version self-replace)
20
+ *
21
+ * Singleton via port-bind arbitration: only one process can `listen()` on the
22
+ * port, so a losing race just gets `EADDRINUSE` and exits. Idle self-reap and
23
+ * graceful shutdown are HTTP/timer driven (no signals — cross-platform).
24
+ *
25
+ * Zero third-party deps: Node `http` + `zlib` only.
26
+ */
27
+ import { OTELCollectorOptions } from "./types";
28
+ export declare class OTELLogCollector {
29
+ private server;
30
+ private readonly host;
31
+ private readonly requestedPort;
32
+ private readonly idleTimeoutMs;
33
+ private readonly onShutdown?;
34
+ private readonly metricsProvider;
35
+ private readonly pipeline;
36
+ private startedAt;
37
+ private lastActiveAt;
38
+ private idleTimer;
39
+ private shuttingDown;
40
+ constructor(opts?: OTELCollectorOptions);
41
+ /** Start listening. Resolves once bound; rejects on a bind error (e.g. EADDRINUSE). */
42
+ start(): Promise<void>;
43
+ /** The actually-bound port (handles `port: 0` / OS-assigned). `null` before start. */
44
+ boundPort(): number | null;
45
+ /** Stop listening. Resolves once the server is closed (no-op when not started). */
46
+ stop(): Promise<void>;
47
+ private armIdleTimer;
48
+ private disarmIdleTimer;
49
+ /**
50
+ * Graceful shutdown (idle-reap or `/admin/shutdown`): stop accepting, close
51
+ * the server, then invoke `onShutdown`. Idempotent. (The work-queue drain +
52
+ * forward flush land with the forward pipeline.)
53
+ */
54
+ private gracefulShutdown;
55
+ private handleRequest;
56
+ private buildHealth;
57
+ /** Read the (optionally gzip'd) request body, then run `fn`; body-read errors → HTTP 400. */
58
+ private withBody;
59
+ private collectBody;
60
+ /** Consume and discard a request body, then run `done` (used for unknown paths). */
61
+ private drain;
62
+ private respond;
63
+ }
64
+ /** Construct and start an {@link OTELLogCollector} in one call. */
65
+ export declare function startOTELLogCollector(opts?: OTELCollectorOptions): Promise<OTELLogCollector>;
66
+ //# sourceMappingURL=collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../src/otel/collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAOH,OAAO,EACH,oBAAoB,EAIvB,MAAM,SAAS,CAAC;AAuBjB,qBAAa,gBAAgB;IACzB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA2B;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAE3C,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,YAAY,CAAkB;gBAE1B,IAAI,CAAC,EAAE,oBAAoB;IAUvC,uFAAuF;IAChF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB7B,sFAAsF;IAC/E,SAAS,IAAI,MAAM,GAAG,IAAI;IAKjC,mFAAmF;IAC5E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB5B,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,eAAe;IAOvB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,aAAa;IAwErB,OAAO,CAAC,WAAW;IAiBnB,6FAA6F;IAC7F,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,WAAW;IA6CnB,oFAAoF;IACpF,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,OAAO;CAQlB;AAED,mEAAmE;AACnE,wBAAsB,qBAAqB,CAAC,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAIlG"}
@@ -0,0 +1,317 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee — OTEL Collector daemon
4
+ *
5
+ * A machine-global OTLP/HTTP (JSON) receiver. Claude Code, when run with
6
+ * telemetry enabled, exports its log/event records over OTLP to this daemon
7
+ * (one per machine, shared by every concurrent session). Point it at the
8
+ * daemon with:
9
+ *
10
+ * export CLAUDE_CODE_ENABLE_TELEMETRY=1
11
+ * export OTEL_LOGS_EXPORTER=otlp
12
+ * export OTEL_EXPORTER_OTLP_PROTOCOL=http/json
13
+ * export OTEL_EXPORTER_OTLP_ENDPOINT=http://127.0.0.1:15986
14
+ *
15
+ * Endpoints:
16
+ * - `POST /v1/logs` → `log-handler.ts`
17
+ * - `POST /v1/traces` → `trace-handler.ts` (noop)
18
+ * - `POST /v1/metrics` → `metric-handler.ts` (noop)
19
+ * - `GET /health` → version / pid / idle / observability counters
20
+ * - `POST /admin/shutdown` → graceful shutdown (used by version self-replace)
21
+ *
22
+ * Singleton via port-bind arbitration: only one process can `listen()` on the
23
+ * port, so a losing race just gets `EADDRINUSE` and exits. Idle self-reap and
24
+ * graceful shutdown are HTTP/timer driven (no signals — cross-platform).
25
+ *
26
+ * Zero third-party deps: Node `http` + `zlib` only.
27
+ */
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.OTELLogCollector = void 0;
30
+ exports.startOTELLogCollector = startOTELLogCollector;
31
+ const http_1 = require("http");
32
+ const zlib_1 = require("zlib");
33
+ const output_1 = require("../lib/output");
34
+ const version_1 = require("../lib/version");
35
+ const types_1 = require("./types");
36
+ const log_handler_1 = require("./log-handler");
37
+ const trace_handler_1 = require("./trace-handler");
38
+ const metric_handler_1 = require("./metric-handler");
39
+ const forward_1 = require("./daemon/forward");
40
+ /** Default port the collector binds to (IronBee convention; the OTLP/HTTP spec port is 4318). */
41
+ const DEFAULT_PORT = 15986;
42
+ /** Bind loopback only by default. */
43
+ const DEFAULT_HOST = "127.0.0.1";
44
+ /** Default idle-reap threshold (seconds). */
45
+ const DEFAULT_IDLE_TIMEOUT_SECONDS = 600;
46
+ const LOGS_PATH = "/v1/logs";
47
+ const TRACES_PATH = "/v1/traces";
48
+ const METRICS_PATH = "/v1/metrics";
49
+ const HEALTH_PATH = "/health";
50
+ const SHUTDOWN_PATH = "/admin/shutdown";
51
+ const REPROCESS_PATH = "/admin/reprocess";
52
+ /** Cap on a single request body to avoid unbounded memory growth. */
53
+ const MAX_BODY_BYTES = 16 * 1024 * 1024; // 16 MB
54
+ class OTELLogCollector {
55
+ constructor(opts) {
56
+ this.server = null;
57
+ this.startedAt = 0;
58
+ this.lastActiveAt = 0;
59
+ this.idleTimer = null;
60
+ this.shuttingDown = false;
61
+ this.requestedPort = opts?.port ?? DEFAULT_PORT;
62
+ this.host = opts?.host ?? DEFAULT_HOST;
63
+ const idle = opts?.idleTimeoutSeconds ?? DEFAULT_IDLE_TIMEOUT_SECONDS;
64
+ this.idleTimeoutMs = idle > 0 ? idle * 1000 : 0;
65
+ this.onShutdown = opts?.onShutdown;
66
+ this.pipeline = new forward_1.ForwardPipeline();
67
+ this.metricsProvider = opts?.metricsProvider ?? (() => this.pipeline.counters());
68
+ }
69
+ /** Start listening. Resolves once bound; rejects on a bind error (e.g. EADDRINUSE). */
70
+ start() {
71
+ return new Promise((resolve, reject) => {
72
+ const server = (0, http_1.createServer)((req, res) => {
73
+ this.handleRequest(req, res);
74
+ });
75
+ server.on("error", reject);
76
+ server.listen(this.requestedPort, this.host, () => {
77
+ server.off("error", reject);
78
+ this.server = server;
79
+ this.startedAt = Date.now();
80
+ this.lastActiveAt = this.startedAt;
81
+ this.armIdleTimer();
82
+ const port = this.boundPort() ?? this.requestedPort;
83
+ output_1.log.success(`OTEL collector listening on http://${this.host}:${port}`);
84
+ resolve();
85
+ });
86
+ });
87
+ }
88
+ /** The actually-bound port (handles `port: 0` / OS-assigned). `null` before start. */
89
+ boundPort() {
90
+ const addr = this.server?.address();
91
+ return addr && typeof addr === "object" ? addr.port : null;
92
+ }
93
+ /** Stop listening. Resolves once the server is closed (no-op when not started). */
94
+ stop() {
95
+ this.disarmIdleTimer();
96
+ return new Promise((resolve) => {
97
+ if (!this.server) {
98
+ resolve();
99
+ return;
100
+ }
101
+ const srv = this.server;
102
+ srv.close(() => {
103
+ this.server = null;
104
+ resolve();
105
+ });
106
+ // Force idle keep-alive sockets closed so `close()`'s callback fires
107
+ // promptly (otherwise a lingering client connection delays shutdown).
108
+ srv.closeAllConnections();
109
+ });
110
+ }
111
+ // ── idle reaping ────────────────────────────────────────────────────────
112
+ armIdleTimer() {
113
+ if (this.idleTimeoutMs <= 0) {
114
+ return; // idle reaping disabled
115
+ }
116
+ // Check on a cadence proportional to the timeout, clamped to [0.2s, 30s].
117
+ const checkMs = Math.min(30000, Math.max(200, Math.floor(this.idleTimeoutMs / 2)));
118
+ this.idleTimer = setInterval(() => {
119
+ if (Date.now() - this.lastActiveAt > this.idleTimeoutMs) {
120
+ this.gracefulShutdown("idle");
121
+ }
122
+ }, checkMs);
123
+ // Don't let the timer alone keep the event loop alive — the server does.
124
+ this.idleTimer.unref?.();
125
+ }
126
+ disarmIdleTimer() {
127
+ if (this.idleTimer) {
128
+ clearInterval(this.idleTimer);
129
+ this.idleTimer = null;
130
+ }
131
+ }
132
+ /**
133
+ * Graceful shutdown (idle-reap or `/admin/shutdown`): stop accepting, close
134
+ * the server, then invoke `onShutdown`. Idempotent. (The work-queue drain +
135
+ * forward flush land with the forward pipeline.)
136
+ */
137
+ gracefulShutdown(reason) {
138
+ if (this.shuttingDown) {
139
+ return;
140
+ }
141
+ this.shuttingDown = true;
142
+ output_1.log.info(`OTEL collector shutting down (${reason})`);
143
+ void this.stop().then(() => {
144
+ this.onShutdown?.();
145
+ });
146
+ }
147
+ // ── request handling ──────────────────────────────────────────────────
148
+ handleRequest(req, res) {
149
+ const url = req.url ?? "";
150
+ const path = url.split("?")[0];
151
+ const method = req.method ?? "GET";
152
+ // Any request counts as activity → resets the idle clock.
153
+ this.lastActiveAt = Date.now();
154
+ if (method === "GET" && path === HEALTH_PATH) {
155
+ this.respond(res, 200, this.buildHealth());
156
+ return;
157
+ }
158
+ if (method === "POST" && path === SHUTDOWN_PATH) {
159
+ // Reap only AFTER the ack is fully flushed, so the caller (version
160
+ // self-replace / `otel stop`) reliably sees the 200.
161
+ res.on("finish", () => { this.gracefulShutdown("admin"); });
162
+ this.respond(res, 200, { stopping: true });
163
+ return;
164
+ }
165
+ if (method === "POST" && path === REPROCESS_PATH) {
166
+ this.respond(res, 200, { reprocessing: true });
167
+ this.pipeline.reprocess();
168
+ return;
169
+ }
170
+ if (method === "POST" && path === LOGS_PATH) {
171
+ this.withBody(req, res, (raw) => {
172
+ // A throw here is an invalid-JSON parse failure → HTTP 400.
173
+ try {
174
+ (0, log_handler_1.handleLogs)(raw, this.pipeline);
175
+ }
176
+ catch (e) {
177
+ const msg = e instanceof Error ? e.message : String(e);
178
+ output_1.log.error(`otel: invalid OTLP/JSON log payload: ${msg}`);
179
+ this.respond(res, 400, { error: "invalid json" });
180
+ return;
181
+ }
182
+ this.respond(res, 200, {});
183
+ });
184
+ return;
185
+ }
186
+ if (method === "POST" && path === TRACES_PATH) {
187
+ this.withBody(req, res, (raw) => {
188
+ (0, trace_handler_1.handleTraces)(raw);
189
+ this.respond(res, 200, {});
190
+ });
191
+ return;
192
+ }
193
+ if (method === "POST" && path === METRICS_PATH) {
194
+ this.withBody(req, res, (raw) => {
195
+ (0, metric_handler_1.handleMetrics)(raw);
196
+ this.respond(res, 200, {});
197
+ });
198
+ return;
199
+ }
200
+ if (method !== "POST") {
201
+ // The only GET we serve is /health (handled above).
202
+ this.drain(req, () => {
203
+ this.respond(res, 405, { error: "method not allowed" });
204
+ });
205
+ return;
206
+ }
207
+ this.drain(req, () => {
208
+ this.respond(res, 404, { error: "not found" });
209
+ });
210
+ }
211
+ buildHealth() {
212
+ const counters = this.metricsProvider();
213
+ return {
214
+ status: "ok",
215
+ service: types_1.OTEL_SERVICE_NAME,
216
+ version: (0, version_1.getLocalVersion)(),
217
+ pid: process.pid,
218
+ started_at: this.startedAt,
219
+ idle_seconds: Math.floor((Date.now() - this.lastActiveAt) / 1000),
220
+ idle_timeout_seconds: Math.floor(this.idleTimeoutMs / 1000),
221
+ pending_work: counters.pending_work,
222
+ failed_forwards: counters.failed_forwards,
223
+ dropped: counters.dropped,
224
+ orphan_files: counters.orphan_files,
225
+ };
226
+ }
227
+ /** Read the (optionally gzip'd) request body, then run `fn`; body-read errors → HTTP 400. */
228
+ withBody(req, res, fn) {
229
+ this.collectBody(req, (err, raw) => {
230
+ if (err) {
231
+ output_1.log.error(`otel: failed to read request body: ${err.message}`);
232
+ this.respond(res, 400, { error: err.message });
233
+ return;
234
+ }
235
+ fn(raw);
236
+ });
237
+ }
238
+ collectBody(req, cb) {
239
+ const chunks = [];
240
+ let size = 0;
241
+ let aborted = false;
242
+ req.on("data", (chunk) => {
243
+ if (aborted) {
244
+ return;
245
+ }
246
+ size += chunk.length;
247
+ if (size > MAX_BODY_BYTES) {
248
+ aborted = true;
249
+ req.destroy();
250
+ cb(new Error(`request body exceeds ${MAX_BODY_BYTES} bytes`), Buffer.alloc(0));
251
+ return;
252
+ }
253
+ chunks.push(chunk);
254
+ });
255
+ req.on("end", () => {
256
+ if (aborted) {
257
+ return;
258
+ }
259
+ let buf = Buffer.concat(chunks);
260
+ const encoding = req.headers["content-encoding"];
261
+ if (encoding && encoding.includes("gzip")) {
262
+ try {
263
+ buf = (0, zlib_1.gunzipSync)(buf);
264
+ }
265
+ catch (e) {
266
+ cb(e instanceof Error ? e : new Error(String(e)), Buffer.alloc(0));
267
+ return;
268
+ }
269
+ }
270
+ cb(null, buf);
271
+ });
272
+ req.on("error", (e) => {
273
+ if (aborted) {
274
+ return;
275
+ }
276
+ aborted = true;
277
+ cb(e, Buffer.alloc(0));
278
+ });
279
+ }
280
+ /** Consume and discard a request body, then run `done` (used for unknown paths). */
281
+ drain(req, done) {
282
+ req.on("data", () => { });
283
+ req.on("end", done);
284
+ req.on("error", done);
285
+ }
286
+ respond(res, status, body) {
287
+ const json = JSON.stringify(body);
288
+ res.writeHead(status, {
289
+ "Content-Type": "application/json",
290
+ "Content-Length": Buffer.byteLength(json),
291
+ });
292
+ res.end(json);
293
+ }
294
+ }
295
+ exports.OTELLogCollector = OTELLogCollector;
296
+ /** Construct and start an {@link OTELLogCollector} in one call. */
297
+ async function startOTELLogCollector(opts) {
298
+ const collector = new OTELLogCollector(opts);
299
+ await collector.start();
300
+ return collector;
301
+ }
302
+ // Standalone entry: `node dist/otel/collector.js` (or `ts-node src/otel/collector.ts`).
303
+ // Port overridable via OTEL_COLLECTOR_PORT. (`ironbee otel run` is the production
304
+ // entry — it resolves port / idle-timeout from config; see src/commands/otel.ts.)
305
+ if (require.main === module) {
306
+ const envPort = process.env.OTEL_COLLECTOR_PORT;
307
+ const port = envPort ? Number(envPort) : DEFAULT_PORT;
308
+ void startOTELLogCollector({
309
+ port,
310
+ onShutdown: () => process.exit(0),
311
+ }).catch((e) => {
312
+ const msg = e instanceof Error ? e.message : String(e);
313
+ output_1.log.error(`otel: failed to start collector: ${msg}`);
314
+ process.exit(1);
315
+ });
316
+ }
317
+ //# sourceMappingURL=collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/otel/collector.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;;;AAsTH,sDAIC;AAxTD,+BAA6E;AAE7E,+BAAkC;AAClC,0CAAoC;AACpC,4CAAiD;AACjD,mCAKiB;AACjB,+CAA2C;AAC3C,mDAA+C;AAC/C,qDAAiD;AACjD,8CAAmD;AAEnD,iGAAiG;AACjG,MAAM,YAAY,GAAW,KAAK,CAAC;AACnC,qCAAqC;AACrC,MAAM,YAAY,GAAW,WAAW,CAAC;AACzC,6CAA6C;AAC7C,MAAM,4BAA4B,GAAW,GAAG,CAAC;AAEjD,MAAM,SAAS,GAAW,UAAU,CAAC;AACrC,MAAM,WAAW,GAAW,YAAY,CAAC;AACzC,MAAM,YAAY,GAAW,aAAa,CAAC;AAC3C,MAAM,WAAW,GAAW,SAAS,CAAC;AACtC,MAAM,aAAa,GAAW,iBAAiB,CAAC;AAChD,MAAM,cAAc,GAAW,kBAAkB,CAAC;AAElD,qEAAqE;AACrE,MAAM,cAAc,GAAW,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,QAAQ;AAEzD,MAAa,gBAAgB;IAczB,YAAY,IAA2B;QAb/B,WAAM,GAAkB,IAAI,CAAC;QAQ7B,cAAS,GAAW,CAAC,CAAC;QACtB,iBAAY,GAAW,CAAC,CAAC;QACzB,cAAS,GAA0B,IAAI,CAAC;QACxC,iBAAY,GAAY,KAAK,CAAC;QAGlC,IAAI,CAAC,aAAa,GAAG,IAAI,EAAE,IAAI,IAAI,YAAY,CAAC;QAChD,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,YAAY,CAAC;QACvC,MAAM,IAAI,GAAW,IAAI,EAAE,kBAAkB,IAAI,4BAA4B,CAAC;QAC9E,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC,UAAU,GAAG,IAAI,EAAE,UAAU,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,IAAI,yBAAe,EAAE,CAAC;QACtC,IAAI,CAAC,eAAe,GAAG,IAAI,EAAE,eAAe,IAAI,CAAC,GAAuB,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACzG,CAAC;IAED,uFAAuF;IAChF,KAAK;QACR,OAAO,IAAI,OAAO,CAAO,CAAC,OAAmB,EAAE,MAA0B,EAAQ,EAAE;YAC/E,MAAM,MAAM,GAAW,IAAA,mBAAY,EAAC,CAAC,GAAoB,EAAE,GAAmB,EAAQ,EAAE;gBACpF,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,GAAS,EAAE;gBACpD,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;gBACrB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC5B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC;gBACnC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,MAAM,IAAI,GAAW,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC;gBAC5D,YAAG,CAAC,OAAO,CAAC,sCAAsC,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;gBACvE,OAAO,EAAE,CAAC;YACd,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAED,sFAAsF;IAC/E,SAAS;QACZ,MAAM,IAAI,GAA4C,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QAC7E,OAAO,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/D,CAAC;IAED,mFAAmF;IAC5E,IAAI;QACP,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,IAAI,OAAO,CAAO,CAAC,OAAmB,EAAQ,EAAE;YACnD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,OAAO;YACX,CAAC;YACD,MAAM,GAAG,GAAW,IAAI,CAAC,MAAM,CAAC;YAChC,GAAG,CAAC,KAAK,CAAC,GAAS,EAAE;gBACjB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,OAAO,EAAE,CAAC;YACd,CAAC,CAAC,CAAC;YACH,qEAAqE;YACrE,sEAAsE;YACtE,GAAG,CAAC,mBAAmB,EAAE,CAAC;QAC9B,CAAC,CAAC,CAAC;IACP,CAAC;IAED,2EAA2E;IAEnE,YAAY;QAChB,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,wBAAwB;QACpC,CAAC;QACD,0EAA0E;QAC1E,MAAM,OAAO,GAAW,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3F,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAS,EAAE;YACpC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;gBACtD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAClC,CAAC;QACL,CAAC,EAAE,OAAO,CAAC,CAAC;QACZ,yEAAyE;QACzE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;IAC7B,CAAC;IAEO,eAAe;QACnB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAC1B,CAAC;IACL,CAAC;IAED;;;;OAIG;IACK,gBAAgB,CAAC,MAAc;QACnC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,OAAO;QACX,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,YAAG,CAAC,IAAI,CAAC,iCAAiC,MAAM,GAAG,CAAC,CAAC;QACrD,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAS,EAAE;YAC7B,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;QACxB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,yEAAyE;IAEjE,aAAa,CAAC,GAAoB,EAAE,GAAmB;QAC3D,MAAM,GAAG,GAAW,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;QAClC,MAAM,IAAI,GAAW,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,MAAM,GAAW,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;QAE3C,0DAA0D;QAC1D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE/B,IAAI,MAAM,KAAK,KAAK,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YAC3C,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YAC3C,OAAO;QACX,CAAC;QAED,IAAI,MAAM,KAAK,MAAM,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAC9C,mEAAmE;YACnE,qDAAqD;YACrD,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAS,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3C,OAAO;QACX,CAAC;QAED,IAAI,MAAM,KAAK,MAAM,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;YAC/C,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC1B,OAAO;QACX,CAAC;QAED,IAAI,MAAM,KAAK,MAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAW,EAAQ,EAAE;gBAC1C,4DAA4D;gBAC5D,IAAI,CAAC;oBACD,IAAA,wBAAU,EAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACnC,CAAC;gBAAC,OAAO,CAAU,EAAE,CAAC;oBAClB,MAAM,GAAG,GAAW,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBAC/D,YAAG,CAAC,KAAK,CAAC,wCAAwC,GAAG,EAAE,CAAC,CAAC;oBACzD,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;oBAClD,OAAO;gBACX,CAAC;gBACD,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC;YACH,OAAO;QACX,CAAC;QAED,IAAI,MAAM,KAAK,MAAM,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YAC5C,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAW,EAAQ,EAAE;gBAC1C,IAAA,4BAAY,EAAC,GAAG,CAAC,CAAC;gBAClB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC;YACH,OAAO;QACX,CAAC;QAED,IAAI,MAAM,KAAK,MAAM,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YAC7C,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAW,EAAQ,EAAE;gBAC1C,IAAA,8BAAa,EAAC,GAAG,CAAC,CAAC;gBACnB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC;YACH,OAAO;QACX,CAAC;QAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACpB,oDAAoD;YACpD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAS,EAAE;gBACvB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;YAC5D,CAAC,CAAC,CAAC;YACH,OAAO;QACX,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAS,EAAE;YACvB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,WAAW;QACf,MAAM,QAAQ,GAAuB,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5D,OAAO;YACH,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,yBAAiB;YAC1B,OAAO,EAAE,IAAA,yBAAe,GAAE;YAC1B,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,UAAU,EAAE,IAAI,CAAC,SAAS;YAC1B,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;YACjE,oBAAoB,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC3D,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,YAAY,EAAE,QAAQ,CAAC,YAAY;SACtC,CAAC;IACN,CAAC;IAED,6FAA6F;IACrF,QAAQ,CAAC,GAAoB,EAAE,GAAmB,EAAE,EAAyB;QACjF,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,GAAiB,EAAE,GAAW,EAAQ,EAAE;YAC3D,IAAI,GAAG,EAAE,CAAC;gBACN,YAAG,CAAC,KAAK,CAAC,sCAAsC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC/D,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC/C,OAAO;YACX,CAAC;YACD,EAAE,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,WAAW,CAAC,GAAoB,EAAE,EAA6C;QACnF,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,IAAI,GAAW,CAAC,CAAC;QACrB,IAAI,OAAO,GAAY,KAAK,CAAC;QAE7B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAQ,EAAE;YACnC,IAAI,OAAO,EAAE,CAAC;gBACV,OAAO;YACX,CAAC;YACD,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;YACrB,IAAI,IAAI,GAAG,cAAc,EAAE,CAAC;gBACxB,OAAO,GAAG,IAAI,CAAC;gBACf,GAAG,CAAC,OAAO,EAAE,CAAC;gBACd,EAAE,CAAC,IAAI,KAAK,CAAC,wBAAwB,cAAc,QAAQ,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/E,OAAO;YACX,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAS,EAAE;YACrB,IAAI,OAAO,EAAE,CAAC;gBACV,OAAO;YACX,CAAC;YACD,IAAI,GAAG,GAAW,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAuB,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;YACrE,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxC,IAAI,CAAC;oBACD,GAAG,GAAG,IAAA,iBAAU,EAAC,GAAG,CAAC,CAAC;gBAC1B,CAAC;gBAAC,OAAO,CAAU,EAAE,CAAC;oBAClB,EAAE,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBACnE,OAAO;gBACX,CAAC;YACL,CAAC;YACD,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAQ,EAAQ,EAAE;YAC/B,IAAI,OAAO,EAAE,CAAC;gBACV,OAAO;YACX,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;YACf,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACP,CAAC;IAED,oFAAoF;IAC5E,KAAK,CAAC,GAAoB,EAAE,IAAgB;QAChD,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,GAAS,EAAE,GAAiB,CAAC,CAAC,CAAC;QAC9C,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACpB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IAEO,OAAO,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAa;QAC9D,MAAM,IAAI,GAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE;YAClB,cAAc,EAAE,kBAAkB;YAClC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;SAC5C,CAAC,CAAC;QACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;CACJ;AAhRD,4CAgRC;AAED,mEAAmE;AAC5D,KAAK,UAAU,qBAAqB,CAAC,IAA2B;IACnE,MAAM,SAAS,GAAqB,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IACxB,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,wFAAwF;AACxF,kFAAkF;AAClF,kFAAkF;AAClF,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAuB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACpE,MAAM,IAAI,GAAW,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAC9D,KAAK,qBAAqB,CAAC;QACvB,IAAI;QACJ,UAAU,EAAE,GAAS,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;KAC1C,CAAC,CAAC,KAAK,CAAC,CAAC,CAAU,EAAQ,EAAE;QAC1B,MAAM,GAAG,GAAW,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/D,YAAG,CAAC,KAAK,CAAC,oCAAoC,GAAG,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * IronBee — OTEL `session_context` event builder (pure).
3
+ *
4
+ * Turns a {@link ContextClassification} + per-request metadata into a wire
5
+ * `SessionContextEvent`. Only structural signals (bytes / approx tokens /
6
+ * counts / labels) — never content. The event id is deterministic on
7
+ * `(session_id, request_uuid)` so a re-transmit (live ↔ catch-up) collides for
8
+ * backend dedup.
9
+ */
10
+ import { SessionContextEvent, UsageType } from "../../lib/event";
11
+ import { ContextClassification } from "./classify";
12
+ /** Per-request metadata the daemon collects from the OTLP event + identity resolution. */
13
+ export interface SessionContextMeta {
14
+ session_id: string;
15
+ project_name: string;
16
+ model: string;
17
+ /** OTEL `query_source` (`repl_main_thread` / `compact` / …); `null` on catch-up. */
18
+ query_source: string | null;
19
+ /** OTEL `event.sequence`; `null` on the catch-up path. */
20
+ sequence_number: number | null;
21
+ /** Request time (ms) — OTEL `event.timestamp`, or body-file mtime on catch-up. */
22
+ timestamp: number;
23
+ /** The `<uuid>` of `<uuid>.request.json` — keys the deterministic event id. */
24
+ request_uuid: string;
25
+ user_email?: string;
26
+ usage_type?: UsageType;
27
+ usage_plan?: string;
28
+ }
29
+ /**
30
+ * Deterministic event id keyed on the request file uuid — identical whether the
31
+ * event is derived live or via the catch-up scan, so duplicates collapse at the
32
+ * backend on `(session_id, id)`.
33
+ */
34
+ export declare function deriveSessionContextId(sessionId: string, requestUuid: string): string;
35
+ /** Assemble a `session_context` wire event. */
36
+ export declare function buildSessionContextEvent(meta: SessionContextMeta, classification: ContextClassification): SessionContextEvent;
37
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/otel/context/build.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAa,mBAAmB,EAA0C,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACpH,OAAO,EAAE,qBAAqB,EAAqB,MAAM,YAAY,CAAC;AAEtE,0FAA0F;AAC1F,MAAM,WAAW,kBAAkB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,oFAAoF;IACpF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,0DAA0D;IAC1D,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kFAAkF;IAClF,SAAS,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAOD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAKrF;AA4CD,+CAA+C;AAC/C,wBAAgB,wBAAwB,CACpC,IAAI,EAAE,kBAAkB,EACxB,cAAc,EAAE,qBAAqB,GACtC,mBAAmB,CAgCrB"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee — OTEL `session_context` event builder (pure).
4
+ *
5
+ * Turns a {@link ContextClassification} + per-request metadata into a wire
6
+ * `SessionContextEvent`. Only structural signals (bytes / approx tokens /
7
+ * counts / labels) — never content. The event id is deterministic on
8
+ * `(session_id, request_uuid)` so a re-transmit (live ↔ catch-up) collides for
9
+ * backend dedup.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.deriveSessionContextId = deriveSessionContextId;
13
+ exports.buildSessionContextEvent = buildSessionContextEvent;
14
+ const node_crypto_1 = require("node:crypto");
15
+ const pricing_1 = require("../../analytics/pricing");
16
+ const event_1 = require("../../lib/event");
17
+ function formatHexAsUuid(hex32) {
18
+ return `${hex32.slice(0, 8)}-${hex32.slice(8, 12)}-${hex32.slice(12, 16)}-`
19
+ + `${hex32.slice(16, 20)}-${hex32.slice(20, 32)}`;
20
+ }
21
+ /**
22
+ * Deterministic event id keyed on the request file uuid — identical whether the
23
+ * event is derived live or via the catch-up scan, so duplicates collapse at the
24
+ * backend on `(session_id, id)`.
25
+ */
26
+ function deriveSessionContextId(sessionId, requestUuid) {
27
+ const hex = (0, node_crypto_1.createHash)("sha256")
28
+ .update(`session_context:${sessionId}:${requestUuid}`)
29
+ .digest("hex");
30
+ return formatHexAsUuid(hex.slice(0, 32));
31
+ }
32
+ /** `bytes / BYTES_PER_TOKEN`, rounded. Indicative only (bytes are exact). */
33
+ function approxTokens(bytes) {
34
+ return Math.round(bytes / pricing_1.BYTES_PER_TOKEN);
35
+ }
36
+ /** `bytes` as a percent of `total`, rounded to 2 dp. `0` when `total` is 0. */
37
+ function percentOf(bytes, total) {
38
+ if (total <= 0) {
39
+ return 0;
40
+ }
41
+ return Math.round((bytes / total) * 10000) / 100;
42
+ }
43
+ function usage(bytes, total) {
44
+ return { bytes, approx_tokens: approxTokens(bytes), percent: percentOf(bytes, total) };
45
+ }
46
+ /** Map a per-name `Record<string, bytes>` to a `Record<string, CategoryUsage>`. */
47
+ function usageMap(byName, total) {
48
+ const out = {};
49
+ for (const key of Object.keys(byName)) {
50
+ out[key] = usage(byName[key], total);
51
+ }
52
+ return out;
53
+ }
54
+ function buildBreakdown(b, total) {
55
+ return {
56
+ system_prompt: usage(b.system_prompt, total),
57
+ builtin_tools: usage(b.builtin_tools, total),
58
+ mcp_tools: usage(b.mcp_tools, total),
59
+ rules: usage(b.rules, total),
60
+ memory: usage(b.memory, total),
61
+ skills: usage(b.skills, total),
62
+ system_messages: usage(b.system_messages, total),
63
+ user_messages: usage(b.user_messages, total),
64
+ assistant_messages: usage(b.assistant_messages, total),
65
+ tool_result: usage(b.tool_result, total),
66
+ others: usage(b.others, total),
67
+ };
68
+ }
69
+ /** Assemble a `session_context` wire event. */
70
+ function buildSessionContextEvent(meta, classification) {
71
+ const event = {
72
+ id: deriveSessionContextId(meta.session_id, meta.request_uuid),
73
+ type: event_1.EventType.SESSION_CONTEXT,
74
+ timestamp: meta.timestamp,
75
+ session_id: meta.session_id,
76
+ project_name: meta.project_name,
77
+ sequence_number: meta.sequence_number,
78
+ model: meta.model,
79
+ query_source: meta.query_source,
80
+ total_input_bytes: classification.total_input_bytes,
81
+ total_input_tokens_approx: approxTokens(classification.total_input_bytes),
82
+ breakdown: buildBreakdown(classification.bytes, classification.total_input_bytes),
83
+ breakdown_detail: {
84
+ mcp_tools_by_server: usageMap(classification.mcp_tools_by_server, classification.total_input_bytes),
85
+ rules_by_name: usageMap(classification.rules_by_name, classification.total_input_bytes),
86
+ skills_by_name: usageMap(classification.skills_by_name, classification.total_input_bytes),
87
+ tool_results_by_name: usageMap(classification.tool_results_by_name, classification.total_input_bytes),
88
+ },
89
+ tool_counts: classification.tool_counts,
90
+ message_counts: classification.message_counts,
91
+ };
92
+ if (meta.user_email !== undefined) {
93
+ event.user_email = meta.user_email;
94
+ }
95
+ if (meta.usage_type !== undefined) {
96
+ event.usage_type = meta.usage_type;
97
+ }
98
+ if (meta.usage_plan !== undefined) {
99
+ event.usage_plan = meta.usage_plan;
100
+ }
101
+ return event;
102
+ }
103
+ //# sourceMappingURL=build.js.map