@ironbee-ai/cli 0.12.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 (227) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +12 -2
  3. package/dist/assets/banner.txt +1 -1
  4. package/dist/clients/claude/hooks/activity-start.d.ts.map +1 -1
  5. package/dist/clients/claude/hooks/activity-start.js +4 -0
  6. package/dist/clients/claude/hooks/activity-start.js.map +1 -1
  7. package/dist/clients/claude/hooks/session-start.d.ts.map +1 -1
  8. package/dist/clients/claude/hooks/session-start.js +4 -0
  9. package/dist/clients/claude/hooks/session-start.js.map +1 -1
  10. package/dist/clients/claude/hooks/session-status.d.ts.map +1 -1
  11. package/dist/clients/claude/hooks/session-status.js +8 -2
  12. package/dist/clients/claude/hooks/session-status.js.map +1 -1
  13. package/dist/clients/claude/index.d.ts +10 -0
  14. package/dist/clients/claude/index.d.ts.map +1 -1
  15. package/dist/clients/claude/index.js +110 -0
  16. package/dist/clients/claude/index.js.map +1 -1
  17. package/dist/clients/cursor/index.d.ts.map +1 -1
  18. package/dist/clients/cursor/index.js +6 -0
  19. package/dist/clients/cursor/index.js.map +1 -1
  20. package/dist/clients/registry.d.ts +8 -9
  21. package/dist/clients/registry.d.ts.map +1 -1
  22. package/dist/clients/registry.js +13 -11
  23. package/dist/clients/registry.js.map +1 -1
  24. package/dist/commands/config.d.ts.map +1 -1
  25. package/dist/commands/config.js +1 -0
  26. package/dist/commands/config.js.map +1 -1
  27. package/dist/commands/install.d.ts.map +1 -1
  28. package/dist/commands/install.js +4 -5
  29. package/dist/commands/install.js.map +1 -1
  30. package/dist/commands/otel.d.ts +20 -0
  31. package/dist/commands/otel.d.ts.map +1 -0
  32. package/dist/commands/otel.js +132 -0
  33. package/dist/commands/otel.js.map +1 -0
  34. package/dist/commands/register.d.ts +0 -1
  35. package/dist/commands/register.d.ts.map +1 -1
  36. package/dist/commands/register.js +7 -27
  37. package/dist/commands/register.js.map +1 -1
  38. package/dist/commands/uninstall.d.ts +2 -3
  39. package/dist/commands/uninstall.d.ts.map +1 -1
  40. package/dist/commands/uninstall.js +3 -4
  41. package/dist/commands/uninstall.js.map +1 -1
  42. package/dist/commands/unregister.d.ts +0 -1
  43. package/dist/commands/unregister.d.ts.map +1 -1
  44. package/dist/commands/unregister.js +3 -24
  45. package/dist/commands/unregister.js.map +1 -1
  46. package/dist/index.js +37 -16
  47. package/dist/index.js.map +1 -1
  48. package/dist/lib/config.d.ts +47 -0
  49. package/dist/lib/config.d.ts.map +1 -1
  50. package/dist/lib/config.js +57 -3
  51. package/dist/lib/config.js.map +1 -1
  52. package/dist/lib/event.d.ts +112 -0
  53. package/dist/lib/event.d.ts.map +1 -1
  54. package/dist/lib/event.js +1 -0
  55. package/dist/lib/event.js.map +1 -1
  56. package/dist/lib/fs-prune.d.ts +20 -0
  57. package/dist/lib/fs-prune.d.ts.map +1 -0
  58. package/dist/lib/fs-prune.js +72 -0
  59. package/dist/lib/fs-prune.js.map +1 -0
  60. package/dist/lib/gitignore.d.ts.map +1 -1
  61. package/dist/lib/gitignore.js +6 -0
  62. package/dist/lib/gitignore.js.map +1 -1
  63. package/dist/lib/projects-registry.d.ts +6 -13
  64. package/dist/lib/projects-registry.d.ts.map +1 -1
  65. package/dist/lib/projects-registry.js +11 -46
  66. package/dist/lib/projects-registry.js.map +1 -1
  67. package/dist/lib/version.d.ts +5 -0
  68. package/dist/lib/version.d.ts.map +1 -1
  69. package/dist/lib/version.js +5 -0
  70. package/dist/lib/version.js.map +1 -1
  71. package/dist/otel/collector.d.ts +66 -0
  72. package/dist/otel/collector.d.ts.map +1 -0
  73. package/dist/otel/collector.js +317 -0
  74. package/dist/otel/collector.js.map +1 -0
  75. package/dist/otel/context/build.d.ts +37 -0
  76. package/dist/otel/context/build.d.ts.map +1 -0
  77. package/dist/otel/context/build.js +103 -0
  78. package/dist/otel/context/build.js.map +1 -0
  79. package/dist/otel/context/classify.d.ts +40 -0
  80. package/dist/otel/context/classify.d.ts.map +1 -0
  81. package/dist/otel/context/classify.js +228 -0
  82. package/dist/otel/context/classify.js.map +1 -0
  83. package/dist/otel/context/extract.d.ts +39 -0
  84. package/dist/otel/context/extract.d.ts.map +1 -0
  85. package/dist/otel/context/extract.js +76 -0
  86. package/dist/otel/context/extract.js.map +1 -0
  87. package/dist/otel/context/markers.d.ts +37 -0
  88. package/dist/otel/context/markers.d.ts.map +1 -0
  89. package/dist/otel/context/markers.js +179 -0
  90. package/dist/otel/context/markers.js.map +1 -0
  91. package/dist/otel/context/util.d.ts +15 -0
  92. package/dist/otel/context/util.d.ts.map +1 -0
  93. package/dist/otel/context/util.js +33 -0
  94. package/dist/otel/context/util.js.map +1 -0
  95. package/dist/otel/daemon/ensure.d.ts +52 -0
  96. package/dist/otel/daemon/ensure.d.ts.map +1 -0
  97. package/dist/otel/daemon/ensure.js +226 -0
  98. package/dist/otel/daemon/ensure.js.map +1 -0
  99. package/dist/otel/daemon/forward.d.ts +47 -0
  100. package/dist/otel/daemon/forward.d.ts.map +1 -0
  101. package/dist/otel/daemon/forward.js +0 -0
  102. package/dist/otel/daemon/forward.js.map +1 -0
  103. package/dist/otel/daemon/paths.d.ts +24 -0
  104. package/dist/otel/daemon/paths.d.ts.map +1 -0
  105. package/dist/otel/daemon/paths.js +47 -0
  106. package/dist/otel/daemon/paths.js.map +1 -0
  107. package/dist/otel/daemon/process.d.ts +21 -0
  108. package/dist/otel/daemon/process.d.ts.map +1 -0
  109. package/dist/otel/daemon/process.js +149 -0
  110. package/dist/otel/daemon/process.js.map +1 -0
  111. package/dist/otel/daemon/reprocess.d.ts +27 -0
  112. package/dist/otel/daemon/reprocess.d.ts.map +1 -0
  113. package/dist/otel/daemon/reprocess.js +112 -0
  114. package/dist/otel/daemon/reprocess.js.map +1 -0
  115. package/dist/otel/log-handler.d.ts +37 -0
  116. package/dist/otel/log-handler.d.ts.map +1 -0
  117. package/dist/otel/log-handler.js +332 -0
  118. package/dist/otel/log-handler.js.map +1 -0
  119. package/dist/otel/metric-handler.d.ts +12 -0
  120. package/dist/otel/metric-handler.d.ts.map +1 -0
  121. package/dist/otel/metric-handler.js +18 -0
  122. package/dist/otel/metric-handler.js.map +1 -0
  123. package/dist/otel/trace-handler.d.ts +12 -0
  124. package/dist/otel/trace-handler.d.ts.map +1 -0
  125. package/dist/otel/trace-handler.js +18 -0
  126. package/dist/otel/trace-handler.js.map +1 -0
  127. package/dist/otel/types.d.ts +105 -0
  128. package/dist/otel/types.d.ts.map +1 -0
  129. package/dist/otel/types.js +15 -0
  130. package/dist/otel/types.js.map +1 -0
  131. package/dist/tui/command.d.ts +18 -0
  132. package/dist/tui/command.d.ts.map +1 -0
  133. package/dist/tui/command.js +87 -0
  134. package/dist/tui/command.js.map +1 -0
  135. package/dist/tui/config/area.d.ts +6 -0
  136. package/dist/tui/config/area.d.ts.map +1 -0
  137. package/dist/tui/config/area.js +16 -0
  138. package/dist/tui/config/area.js.map +1 -0
  139. package/dist/tui/config/docs.d.ts +28 -0
  140. package/dist/tui/config/docs.d.ts.map +1 -0
  141. package/dist/tui/config/docs.js +68 -0
  142. package/dist/tui/config/docs.js.map +1 -0
  143. package/dist/tui/config/edit.d.ts +36 -0
  144. package/dist/tui/config/edit.d.ts.map +1 -0
  145. package/dist/tui/config/edit.js +69 -0
  146. package/dist/tui/config/edit.js.map +1 -0
  147. package/dist/tui/config/introspect.d.ts +58 -0
  148. package/dist/tui/config/introspect.d.ts.map +1 -0
  149. package/dist/tui/config/introspect.js +93 -0
  150. package/dist/tui/config/introspect.js.map +1 -0
  151. package/dist/tui/config/schema.d.ts +81 -0
  152. package/dist/tui/config/schema.d.ts.map +1 -0
  153. package/dist/tui/config/schema.js +578 -0
  154. package/dist/tui/config/schema.js.map +1 -0
  155. package/dist/tui/config/tree.d.ts +39 -0
  156. package/dist/tui/config/tree.d.ts.map +1 -0
  157. package/dist/tui/config/tree.js +59 -0
  158. package/dist/tui/config/tree.js.map +1 -0
  159. package/dist/tui/config/value.d.ts +75 -0
  160. package/dist/tui/config/value.d.ts.map +1 -0
  161. package/dist/tui/config/value.js +228 -0
  162. package/dist/tui/config/value.js.map +1 -0
  163. package/dist/tui/config/view.d.ts +13 -0
  164. package/dist/tui/config/view.d.ts.map +1 -0
  165. package/dist/tui/config/view.js +423 -0
  166. package/dist/tui/config/view.js.map +1 -0
  167. package/dist/tui/import/area.d.ts +11 -0
  168. package/dist/tui/import/area.d.ts.map +1 -0
  169. package/dist/tui/import/area.js +202 -0
  170. package/dist/tui/import/area.js.map +1 -0
  171. package/dist/tui/index.d.ts +9 -0
  172. package/dist/tui/index.d.ts.map +1 -0
  173. package/dist/tui/index.js +14 -0
  174. package/dist/tui/index.js.map +1 -0
  175. package/dist/tui/platforms/area.d.ts +12 -0
  176. package/dist/tui/platforms/area.d.ts.map +1 -0
  177. package/dist/tui/platforms/area.js +228 -0
  178. package/dist/tui/platforms/area.js.map +1 -0
  179. package/dist/tui/projects/area.d.ts +26 -0
  180. package/dist/tui/projects/area.d.ts.map +1 -0
  181. package/dist/tui/projects/area.js +588 -0
  182. package/dist/tui/projects/area.js.map +1 -0
  183. package/dist/tui/queue/area.d.ts +11 -0
  184. package/dist/tui/queue/area.d.ts.map +1 -0
  185. package/dist/tui/queue/area.js +338 -0
  186. package/dist/tui/queue/area.js.map +1 -0
  187. package/dist/tui/queue/read.d.ts +49 -0
  188. package/dist/tui/queue/read.d.ts.map +1 -0
  189. package/dist/tui/queue/read.js +261 -0
  190. package/dist/tui/queue/read.js.map +1 -0
  191. package/dist/tui/sessions/area.d.ts +10 -0
  192. package/dist/tui/sessions/area.d.ts.map +1 -0
  193. package/dist/tui/sessions/area.js +266 -0
  194. package/dist/tui/sessions/area.js.map +1 -0
  195. package/dist/tui/sessions/read.d.ts +79 -0
  196. package/dist/tui/sessions/read.d.ts.map +1 -0
  197. package/dist/tui/sessions/read.js +202 -0
  198. package/dist/tui/sessions/read.js.map +1 -0
  199. package/dist/tui/shell/area.d.ts +47 -0
  200. package/dist/tui/shell/area.d.ts.map +1 -0
  201. package/dist/tui/shell/area.js +13 -0
  202. package/dist/tui/shell/area.js.map +1 -0
  203. package/dist/tui/shell/frame.d.ts +23 -0
  204. package/dist/tui/shell/frame.d.ts.map +1 -0
  205. package/dist/tui/shell/frame.js +91 -0
  206. package/dist/tui/shell/frame.js.map +1 -0
  207. package/dist/tui/shell/registry.d.ts +11 -0
  208. package/dist/tui/shell/registry.d.ts.map +1 -0
  209. package/dist/tui/shell/registry.js +29 -0
  210. package/dist/tui/shell/registry.js.map +1 -0
  211. package/dist/tui/shell/rerender.d.ts +16 -0
  212. package/dist/tui/shell/rerender.d.ts.map +1 -0
  213. package/dist/tui/shell/rerender.js +34 -0
  214. package/dist/tui/shell/rerender.js.map +1 -0
  215. package/dist/tui/shell/session.d.ts +75 -0
  216. package/dist/tui/shell/session.d.ts.map +1 -0
  217. package/dist/tui/shell/session.js +333 -0
  218. package/dist/tui/shell/session.js.map +1 -0
  219. package/dist/tui/shell/shell.d.ts +16 -0
  220. package/dist/tui/shell/shell.d.ts.map +1 -0
  221. package/dist/tui/shell/shell.js +213 -0
  222. package/dist/tui/shell/shell.js.map +1 -0
  223. package/dist/tui/shell/util.d.ts +18 -0
  224. package/dist/tui/shell/util.d.ts.map +1 -0
  225. package/dist/tui/shell/util.js +31 -0
  226. package/dist/tui/shell/util.js.map +1 -0
  227. package/package.json +4 -1
@@ -0,0 +1,27 @@
1
+ /**
2
+ * IronBee — OTEL orphan body reprocessing (catch-up + on-demand retry).
3
+ *
4
+ * Scans every registered project's `<project>/.ironbee/otel/` for leftover
5
+ * `*.request.json` files (requests whose announcing OTLP event was dropped while
6
+ * the daemon was down, or whose forward failed) and resubmits each to the
7
+ * forward pipeline. Orphan `*.response.json` files are deleted outright (the
8
+ * response is disposable).
9
+ */
10
+ import { ApiRequestBodyMeta } from "../context/extract";
11
+ /** Minimal sink the scan submits to (ForwardPipeline satisfies it structurally). */
12
+ export interface OrphanSubmitter {
13
+ submit(meta: ApiRequestBodyMeta): void;
14
+ }
15
+ /**
16
+ * Count unprocessed `*.request.json` files across registered projects' otel dirs
17
+ * (the on-disk undelivered backlog) for `/health`'s `orphan_files`. Fully
18
+ * defensive — any read error contributes 0 rather than throwing.
19
+ */
20
+ export declare function countOrphanFiles(): number;
21
+ /**
22
+ * Resubmit every unprocessed `*.request.json` across registered projects and
23
+ * sweep orphan `*.response.json`. Returns the number of request files
24
+ * resubmitted. Synchronous scan; `submit` itself is fire-and-forget.
25
+ */
26
+ export declare function reprocessOrphans(pipeline: OrphanSubmitter): number;
27
+ //# sourceMappingURL=reprocess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reprocess.d.ts","sourceRoot":"","sources":["../../../src/otel/daemon/reprocess.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,oFAAoF;AACpF,MAAM,WAAW,eAAe;IAC5B,MAAM,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAC1C;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAoBzC;AAiBD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CA0ClE"}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee — OTEL orphan body reprocessing (catch-up + on-demand retry).
4
+ *
5
+ * Scans every registered project's `<project>/.ironbee/otel/` for leftover
6
+ * `*.request.json` files (requests whose announcing OTLP event was dropped while
7
+ * the daemon was down, or whose forward failed) and resubmits each to the
8
+ * forward pipeline. Orphan `*.response.json` files are deleted outright (the
9
+ * response is disposable).
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.countOrphanFiles = countOrphanFiles;
13
+ exports.reprocessOrphans = reprocessOrphans;
14
+ const fs_1 = require("fs");
15
+ const path_1 = require("path");
16
+ const projects_registry_1 = require("../../lib/projects-registry");
17
+ const logger_1 = require("../../lib/logger");
18
+ /**
19
+ * Count unprocessed `*.request.json` files across registered projects' otel dirs
20
+ * (the on-disk undelivered backlog) for `/health`'s `orphan_files`. Fully
21
+ * defensive — any read error contributes 0 rather than throwing.
22
+ */
23
+ function countOrphanFiles() {
24
+ let projects;
25
+ try {
26
+ projects = (0, projects_registry_1.listProjects)();
27
+ }
28
+ catch {
29
+ return 0;
30
+ }
31
+ let count = 0;
32
+ for (const proj of projects) {
33
+ try {
34
+ for (const name of (0, fs_1.readdirSync)((0, path_1.join)(proj.path, ".ironbee", "otel"))) {
35
+ if (name.endsWith(".request.json")) {
36
+ count += 1;
37
+ }
38
+ }
39
+ }
40
+ catch {
41
+ // no otel dir for this project — skip
42
+ }
43
+ }
44
+ return count;
45
+ }
46
+ /** Catch-up meta for a file with no announcing event: timestamp = file mtime. */
47
+ function orphanMeta(bodyRef, mtimeMs) {
48
+ return {
49
+ body_ref: bodyRef,
50
+ sequence_number: null,
51
+ model: "",
52
+ query_source: null,
53
+ body_length: null,
54
+ session_id: null,
55
+ project_name: null,
56
+ timestamp: mtimeMs,
57
+ from_catchup: true,
58
+ };
59
+ }
60
+ /**
61
+ * Resubmit every unprocessed `*.request.json` across registered projects and
62
+ * sweep orphan `*.response.json`. Returns the number of request files
63
+ * resubmitted. Synchronous scan; `submit` itself is fire-and-forget.
64
+ */
65
+ function reprocessOrphans(pipeline) {
66
+ let projects;
67
+ try {
68
+ projects = (0, projects_registry_1.listProjects)();
69
+ }
70
+ catch (e) {
71
+ logger_1.logger.debug(`otel: reprocess could not read project registry: ${e instanceof Error ? e.message : String(e)}`);
72
+ return 0;
73
+ }
74
+ let submitted = 0;
75
+ for (const proj of projects) {
76
+ const otelDir = (0, path_1.join)(proj.path, ".ironbee", "otel");
77
+ let names;
78
+ try {
79
+ names = (0, fs_1.readdirSync)(otelDir);
80
+ }
81
+ catch {
82
+ continue; // no otel dir for this project
83
+ }
84
+ for (const name of names) {
85
+ const full = (0, path_1.join)(otelDir, name);
86
+ if (name.endsWith(".request.json")) {
87
+ let mtimeMs = Date.now();
88
+ try {
89
+ mtimeMs = (0, fs_1.statSync)(full).mtimeMs;
90
+ }
91
+ catch {
92
+ continue;
93
+ }
94
+ pipeline.submit(orphanMeta(full, mtimeMs));
95
+ submitted += 1;
96
+ }
97
+ else if (name.endsWith(".response.json")) {
98
+ try {
99
+ (0, fs_1.unlinkSync)(full);
100
+ }
101
+ catch {
102
+ // disposable in v1; ignore
103
+ }
104
+ }
105
+ }
106
+ }
107
+ if (submitted > 0) {
108
+ logger_1.logger.debug(`otel: reprocess resubmitted ${submitted} orphan request bodies`);
109
+ }
110
+ return submitted;
111
+ }
112
+ //# sourceMappingURL=reprocess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reprocess.js","sourceRoot":"","sources":["../../../src/otel/daemon/reprocess.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * IronBee — OTEL log signal handler
3
+ *
4
+ * Decodes the OTLP/HTTP JSON logs envelope (resourceLogs → scopeLogs →
5
+ * logRecords), filters down to the event names we care about, and prints each
6
+ * surviving record to the console. In `OTEL_LOG_RAW_API_BODIES=file:<dir>`
7
+ * mode the raw Anthropic Messages API bodies live on disk; a `body_ref`
8
+ * attribute points at the file, which this handler reads and renders inline.
9
+ *
10
+ * Only `handleLogs` is consumed by `collector.ts`; everything else is internal.
11
+ */
12
+ import { ApiRequestBodyMeta } from "./context/extract";
13
+ /**
14
+ * Log event names (the `event.name` attribute Claude Code sets on each record)
15
+ * the collector actually processes — every other event is ignored (noop). Kept
16
+ * deliberately narrow: the raw API request/response bodies are all we want
17
+ * today. Add an entry here to start surfacing another event.
18
+ */
19
+ export declare const HANDLED_LOG_EVENTS: ReadonlySet<string>;
20
+ /**
21
+ * Handle one OTLP/HTTP JSON logs request body. Throws on invalid JSON (the
22
+ * collector maps that to HTTP 400); printing failures are caught and logged so
23
+ * one malformed record never takes the server down.
24
+ */
25
+ /** Minimal sink the live daemon routes request bodies to (ForwardPipeline satisfies it). */
26
+ export interface OTELLogSink {
27
+ submit(meta: ApiRequestBodyMeta): void;
28
+ }
29
+ /**
30
+ * Handle one OTLP/HTTP JSON logs request body. With a `sink` (the live daemon),
31
+ * `api_request_body` records are submitted to the forward pipeline and
32
+ * `api_response_body` files are deleted; without one (dev / direct callers),
33
+ * handled records are pretty-printed to the console. Throws on invalid JSON
34
+ * (the collector maps that to HTTP 400).
35
+ */
36
+ export declare function handleLogs(raw: Buffer, sink?: OTELLogSink): void;
37
+ //# sourceMappingURL=log-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-handler.d.ts","sourceRoot":"","sources":["../../src/otel/log-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAWH,OAAO,EAA6B,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGlF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAGjD,CAAC;AA8QH;;;;GAIG;AACH,4FAA4F;AAC5F,MAAM,WAAW,WAAW;IACxB,MAAM,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAC1C;AA4CD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,IAAI,CAYhE"}
@@ -0,0 +1,332 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee — OTEL log signal handler
4
+ *
5
+ * Decodes the OTLP/HTTP JSON logs envelope (resourceLogs → scopeLogs →
6
+ * logRecords), filters down to the event names we care about, and prints each
7
+ * surviving record to the console. In `OTEL_LOG_RAW_API_BODIES=file:<dir>`
8
+ * mode the raw Anthropic Messages API bodies live on disk; a `body_ref`
9
+ * attribute points at the file, which this handler reads and renders inline.
10
+ *
11
+ * Only `handleLogs` is consumed by `collector.ts`; everything else is internal.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.HANDLED_LOG_EVENTS = void 0;
15
+ exports.handleLogs = handleLogs;
16
+ const fs_1 = require("fs");
17
+ const output_1 = require("../lib/output");
18
+ const extract_1 = require("./context/extract");
19
+ const paths_1 = require("./daemon/paths");
20
+ /**
21
+ * Log event names (the `event.name` attribute Claude Code sets on each record)
22
+ * the collector actually processes — every other event is ignored (noop). Kept
23
+ * deliberately narrow: the raw API request/response bodies are all we want
24
+ * today. Add an entry here to start surfacing another event.
25
+ */
26
+ exports.HANDLED_LOG_EVENTS = new Set([
27
+ "api_request_body",
28
+ "api_response_body",
29
+ ]);
30
+ /**
31
+ * Attribute Claude Code sets in `OTEL_LOG_RAW_API_BODIES=file:<dir>` mode on
32
+ * the `api_request_body` / `api_response_body` events. Its value is an
33
+ * absolute path to a `.request.json` / `.response.json` file holding the
34
+ * untruncated body; the handler reads that file and surfaces the body.
35
+ */
36
+ const BODY_REF_KEY = "body_ref";
37
+ /**
38
+ * Max characters of a resolved `body_ref` body (or any long attribute value)
39
+ * printed to the console before truncation. Claude Code's file-mode raw API
40
+ * bodies carry the full conversation history and can be hundreds of KB, so a
41
+ * cap keeps the terminal usable. Override with `OTEL_BODY_PRINT_LIMIT` (chars;
42
+ * `0` = unlimited). The full body always remains on disk at the `body_ref`.
43
+ */
44
+ const DEFAULT_BODY_PRINT_LIMIT = 8192;
45
+ /** Resolve the console body-print cap once, honoring `OTEL_BODY_PRINT_LIMIT`. */
46
+ function resolveBodyPrintLimit() {
47
+ const raw = process.env.OTEL_BODY_PRINT_LIMIT;
48
+ if (raw === undefined || raw === "") {
49
+ return DEFAULT_BODY_PRINT_LIMIT;
50
+ }
51
+ const n = Number(raw);
52
+ return Number.isFinite(n) && n >= 0 ? n : DEFAULT_BODY_PRINT_LIMIT;
53
+ }
54
+ const BODY_PRINT_LIMIT = resolveBodyPrintLimit();
55
+ // ---------------------------------------------------------------------------
56
+ // OTLP/JSON value decoding
57
+ // ---------------------------------------------------------------------------
58
+ /** Collapse an OTLP `AnyValue` to a plain JS value (recursing into arrays / kvlists). */
59
+ function decodeAnyValue(value) {
60
+ if (!value) {
61
+ return undefined;
62
+ }
63
+ if (value.stringValue !== undefined) {
64
+ return value.stringValue;
65
+ }
66
+ if (value.boolValue !== undefined) {
67
+ return value.boolValue;
68
+ }
69
+ if (value.intValue !== undefined) {
70
+ // int64 arrives as a decimal string; keep a number when it round-trips safely.
71
+ const n = Number(value.intValue);
72
+ return Number.isSafeInteger(n) ? n : value.intValue;
73
+ }
74
+ if (value.doubleValue !== undefined) {
75
+ return value.doubleValue;
76
+ }
77
+ if (value.bytesValue !== undefined) {
78
+ return value.bytesValue;
79
+ }
80
+ if (value.arrayValue) {
81
+ const values = value.arrayValue.values ?? [];
82
+ return values.map((v) => decodeAnyValue(v));
83
+ }
84
+ if (value.kvlistValue) {
85
+ return decodeAttributes(value.kvlistValue.values ?? []);
86
+ }
87
+ return undefined;
88
+ }
89
+ /** Turn an OTLP `KeyValue[]` (resource / scope / record attributes) into a plain object. */
90
+ function decodeAttributes(attrs) {
91
+ const out = {};
92
+ for (const kv of attrs) {
93
+ if (kv && typeof kv.key === "string") {
94
+ out[kv.key] = decodeAnyValue(kv.value);
95
+ }
96
+ }
97
+ return out;
98
+ }
99
+ /** Cheaply read a record's event name (the `event.name` attribute, else the body string). */
100
+ function extractEventName(record) {
101
+ for (const kv of record.attributes ?? []) {
102
+ if (kv.key === "event.name" && kv.value?.stringValue !== undefined) {
103
+ return kv.value.stringValue;
104
+ }
105
+ }
106
+ if (record.body?.stringValue !== undefined) {
107
+ return record.body.stringValue;
108
+ }
109
+ return "";
110
+ }
111
+ /** Epoch-nanoseconds string → ISO timestamp; falls back to "now" / the raw value. */
112
+ function nanoToIso(nano) {
113
+ if (!nano) {
114
+ return new Date().toISOString();
115
+ }
116
+ try {
117
+ const ms = Number(BigInt(nano) / 1000000n);
118
+ return new Date(ms).toISOString();
119
+ }
120
+ catch {
121
+ return nano;
122
+ }
123
+ }
124
+ /** Map an OTEL `severityNumber` to its text band when `severityText` is absent. */
125
+ function severityFromNumber(n) {
126
+ if (n === undefined) {
127
+ return "INFO";
128
+ }
129
+ if (n <= 4) {
130
+ return "TRACE";
131
+ }
132
+ if (n <= 8) {
133
+ return "DEBUG";
134
+ }
135
+ if (n <= 12) {
136
+ return "INFO";
137
+ }
138
+ if (n <= 16) {
139
+ return "WARN";
140
+ }
141
+ if (n <= 20) {
142
+ return "ERROR";
143
+ }
144
+ return "FATAL";
145
+ }
146
+ /** Render a decoded value for a single console line, capped at the body-print limit. */
147
+ function formatScalar(value) {
148
+ if (value === null || value === undefined) {
149
+ return output_1.pc.dim("null");
150
+ }
151
+ const text = typeof value === "object" ? JSON.stringify(value) : String(value);
152
+ return truncateForConsole(text);
153
+ }
154
+ /** Truncate `text` to BODY_PRINT_LIMIT chars (0 = unlimited) with a footer noting the omission. */
155
+ function truncateForConsole(text) {
156
+ if (BODY_PRINT_LIMIT <= 0 || text.length <= BODY_PRINT_LIMIT) {
157
+ return text;
158
+ }
159
+ const omitted = text.length - BODY_PRINT_LIMIT;
160
+ return `${text.slice(0, BODY_PRINT_LIMIT)}${output_1.pc.dim(`… (+${omitted} chars truncated)`)}`;
161
+ }
162
+ /** Pretty-print JSON when parseable; otherwise return the raw string unchanged. */
163
+ function prettyJsonMaybe(raw) {
164
+ try {
165
+ return JSON.stringify(JSON.parse(raw), null, 2);
166
+ }
167
+ catch {
168
+ return raw;
169
+ }
170
+ }
171
+ /**
172
+ * Resolve a `body_ref` attribute: read the file Claude Code wrote in
173
+ * `OTEL_LOG_RAW_API_BODIES=file:<dir>` mode and print its (pretty-printed,
174
+ * capped) contents under the event. Read failures degrade to a warning — the
175
+ * collector keeps running and the path is still printed for manual inspection.
176
+ */
177
+ function printBodyRef(ref) {
178
+ console.log(` ${output_1.pc.dim(`${BODY_REF_KEY}:`)} ${ref}`);
179
+ let raw;
180
+ try {
181
+ raw = (0, fs_1.readFileSync)(ref, "utf-8");
182
+ }
183
+ catch (e) {
184
+ const msg = e instanceof Error ? e.message : String(e);
185
+ console.log(` ${output_1.pc.yellow(`⚠ could not read body file: ${msg}`)}`);
186
+ return;
187
+ }
188
+ const rendered = truncateForConsole(prettyJsonMaybe(raw));
189
+ for (const line of rendered.split("\n")) {
190
+ console.log(` ${output_1.pc.dim("│")} ${line}`);
191
+ }
192
+ }
193
+ // ---------------------------------------------------------------------------
194
+ // Console rendering
195
+ // ---------------------------------------------------------------------------
196
+ /** Print every key/value of an attribute object at the given indent. */
197
+ function printAttributes(attrs, indent) {
198
+ for (const key of Object.keys(attrs)) {
199
+ console.log(`${indent}${output_1.pc.dim(`${key}:`)} ${formatScalar(attrs[key])}`);
200
+ }
201
+ }
202
+ /** One-line label for an instrumentation scope (`name@version`). */
203
+ function formatScope(scope) {
204
+ if (!scope || !scope.name) {
205
+ return output_1.pc.dim("(unnamed)");
206
+ }
207
+ return scope.version ? `${scope.name}@${scope.version}` : scope.name;
208
+ }
209
+ /** Print a single log record (header + body + every event attribute) at record indent. */
210
+ function printLogRecord(record) {
211
+ const ts = nanoToIso(record.timeUnixNano ?? record.observedTimeUnixNano);
212
+ const severity = record.severityText ?? severityFromNumber(record.severityNumber);
213
+ const attrs = decodeAttributes(record.attributes ?? []);
214
+ const body = decodeAnyValue(record.body);
215
+ const eventName = extractEventName(record) || "(log record)";
216
+ console.log(` ${output_1.pc.dim(ts)} ${output_1.pc.cyan(severity.padEnd(5))} ${output_1.pc.bold(eventName)}`);
217
+ if (body !== undefined && body !== eventName) {
218
+ console.log(` ${output_1.pc.dim("body:")} ${formatScalar(body)}`);
219
+ }
220
+ for (const key of Object.keys(attrs)) {
221
+ if (key === "event.name") {
222
+ continue;
223
+ }
224
+ if (key === BODY_REF_KEY && typeof attrs[key] === "string") {
225
+ printBodyRef(attrs[key]);
226
+ continue;
227
+ }
228
+ console.log(` ${output_1.pc.dim(`${key}:`)} ${formatScalar(attrs[key])}`);
229
+ }
230
+ }
231
+ /**
232
+ * Render the OTLP hierarchy resource → scope → record. Each handled record is
233
+ * printed beneath its full resource attribute set and its owning scope, so the
234
+ * surrounding context (service identity, SDK / OS / host info, scope name) is
235
+ * always visible. A resource whose every record is ignored produces no output.
236
+ */
237
+ function printLogsPayload(payload) {
238
+ for (const rl of payload.resourceLogs ?? []) {
239
+ // Filter to handled events first, grouped by scope.
240
+ const scopes = [];
241
+ let total = 0;
242
+ for (const sl of rl.scopeLogs ?? []) {
243
+ const records = (sl.logRecords ?? []).filter((r) => exports.HANDLED_LOG_EVENTS.has(extractEventName(r)));
244
+ if (records.length > 0) {
245
+ scopes.push({ scope: sl.scope, records });
246
+ total += records.length;
247
+ }
248
+ }
249
+ if (total === 0) {
250
+ continue;
251
+ }
252
+ const resourceAttrs = decodeAttributes(rl.resource?.attributes ?? []);
253
+ const serviceName = String(resourceAttrs["service.name"] ?? "unknown-service");
254
+ console.log(output_1.pc.dim("─".repeat(60)));
255
+ console.log(`${output_1.pc.bold((0, output_1.orange)("OTEL"))} ${output_1.pc.dim("logs from")} ${output_1.pc.bold(serviceName)}`
256
+ + ` ${output_1.pc.dim(`(${total} record${total === 1 ? "" : "s"})`)}`);
257
+ if (Object.keys(resourceAttrs).length > 0) {
258
+ console.log(` ${output_1.pc.dim("resource:")}`);
259
+ printAttributes(resourceAttrs, " ");
260
+ }
261
+ for (const s of scopes) {
262
+ console.log(` ${output_1.pc.dim("scope:")} ${formatScope(s.scope)}`);
263
+ for (const record of s.records) {
264
+ printLogRecord(record);
265
+ }
266
+ }
267
+ }
268
+ }
269
+ /** Read a string attribute off a log record. */
270
+ function recordStringAttr(record, key) {
271
+ for (const kv of record.attributes ?? []) {
272
+ if (kv && kv.key === key && typeof kv.value?.stringValue === "string") {
273
+ return kv.value.stringValue;
274
+ }
275
+ }
276
+ return undefined;
277
+ }
278
+ /** Consume-once delete of an `api_response_body` file (v1 derives nothing from it). */
279
+ function deleteResponseBody(record) {
280
+ const ref = recordStringAttr(record, "body_ref");
281
+ if (ref && (0, paths_1.isInsideOTELDir)(ref)) {
282
+ try {
283
+ (0, fs_1.unlinkSync)(ref);
284
+ }
285
+ catch {
286
+ // gone already / race — fine
287
+ }
288
+ }
289
+ }
290
+ /** Route handled records to the forward pipeline (live daemon path). */
291
+ function routeToSink(payload, sink) {
292
+ for (const rl of payload.resourceLogs ?? []) {
293
+ const resourceAttrs = rl.resource?.attributes ?? [];
294
+ for (const sl of rl.scopeLogs ?? []) {
295
+ for (const record of sl.logRecords ?? []) {
296
+ const name = extractEventName(record);
297
+ if (name === "api_request_body") {
298
+ const meta = (0, extract_1.extractApiRequestBodyMeta)(record, resourceAttrs);
299
+ if (meta) {
300
+ sink.submit(meta);
301
+ }
302
+ }
303
+ else if (name === "api_response_body") {
304
+ deleteResponseBody(record);
305
+ }
306
+ }
307
+ }
308
+ }
309
+ }
310
+ /**
311
+ * Handle one OTLP/HTTP JSON logs request body. With a `sink` (the live daemon),
312
+ * `api_request_body` records are submitted to the forward pipeline and
313
+ * `api_response_body` files are deleted; without one (dev / direct callers),
314
+ * handled records are pretty-printed to the console. Throws on invalid JSON
315
+ * (the collector maps that to HTTP 400).
316
+ */
317
+ function handleLogs(raw, sink) {
318
+ const payload = JSON.parse(raw.toString("utf-8"));
319
+ try {
320
+ if (sink) {
321
+ routeToSink(payload, sink);
322
+ }
323
+ else {
324
+ printLogsPayload(payload);
325
+ }
326
+ }
327
+ catch (e) {
328
+ const msg = e instanceof Error ? e.message : String(e);
329
+ output_1.log.error(`otel: failed to handle log records: ${msg}`);
330
+ }
331
+ }
332
+ //# sourceMappingURL=log-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-handler.js","sourceRoot":"","sources":["../../src/otel/log-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * IronBee — OTEL metric signal handler (noop)
3
+ *
4
+ * The collector exposes a `/v1/metrics` endpoint so an exporter configured for
5
+ * the metrics signal gets a clean HTTP 200 instead of spinning on retries, but
6
+ * metrics are not decoded yet. This handler accepts and discards the body.
7
+ * Flesh it out (decode `resourceMetrics → scopeMetrics → metrics`) when
8
+ * metrics become interesting.
9
+ */
10
+ /** Accept and discard an OTLP/HTTP metrics request body. */
11
+ export declare function handleMetrics(raw: Buffer): void;
12
+ //# sourceMappingURL=metric-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metric-handler.d.ts","sourceRoot":"","sources":["../../src/otel/metric-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE/C"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee — OTEL metric signal handler (noop)
4
+ *
5
+ * The collector exposes a `/v1/metrics` endpoint so an exporter configured for
6
+ * the metrics signal gets a clean HTTP 200 instead of spinning on retries, but
7
+ * metrics are not decoded yet. This handler accepts and discards the body.
8
+ * Flesh it out (decode `resourceMetrics → scopeMetrics → metrics`) when
9
+ * metrics become interesting.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.handleMetrics = handleMetrics;
13
+ const logger_1 = require("../lib/logger");
14
+ /** Accept and discard an OTLP/HTTP metrics request body. */
15
+ function handleMetrics(raw) {
16
+ logger_1.logger.debug(`otel: discarded ${raw.length} bytes on /v1/metrics (noop)`);
17
+ }
18
+ //# sourceMappingURL=metric-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metric-handler.js","sourceRoot":"","sources":["../../src/otel/metric-handler.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAKH,sCAEC;AALD,0CAAuC;AAEvC,4DAA4D;AAC5D,SAAgB,aAAa,CAAC,GAAW;IACrC,eAAM,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,MAAM,8BAA8B,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * IronBee — OTEL trace signal handler (noop)
3
+ *
4
+ * The collector exposes a `/v1/traces` endpoint so an exporter configured for
5
+ * the traces signal gets a clean HTTP 200 instead of spinning on retries, but
6
+ * spans are not decoded yet. This handler accepts and discards the body.
7
+ * Flesh it out (decode `resourceSpans → scopeSpans → spans`) when traces
8
+ * become interesting.
9
+ */
10
+ /** Accept and discard an OTLP/HTTP traces request body. */
11
+ export declare function handleTraces(raw: Buffer): void;
12
+ //# sourceMappingURL=trace-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-handler.d.ts","sourceRoot":"","sources":["../../src/otel/trace-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,2DAA2D;AAC3D,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE9C"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee — OTEL trace signal handler (noop)
4
+ *
5
+ * The collector exposes a `/v1/traces` endpoint so an exporter configured for
6
+ * the traces signal gets a clean HTTP 200 instead of spinning on retries, but
7
+ * spans are not decoded yet. This handler accepts and discards the body.
8
+ * Flesh it out (decode `resourceSpans → scopeSpans → spans`) when traces
9
+ * become interesting.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.handleTraces = handleTraces;
13
+ const logger_1 = require("../lib/logger");
14
+ /** Accept and discard an OTLP/HTTP traces request body. */
15
+ function handleTraces(raw) {
16
+ logger_1.logger.debug(`otel: discarded ${raw.length} bytes on /v1/traces (noop)`);
17
+ }
18
+ //# sourceMappingURL=trace-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-handler.js","sourceRoot":"","sources":["../../src/otel/trace-handler.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAKH,oCAEC;AALD,0CAAuC;AAEvC,2DAA2D;AAC3D,SAAgB,YAAY,CAAC,GAAW;IACpC,eAAM,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,MAAM,6BAA6B,CAAC,CAAC;AAC7E,CAAC"}