@armoriq/sdk-dev 0.8.0 → 0.8.3

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 (54) hide show
  1. package/dist/_build_env.d.ts +2 -1
  2. package/dist/_build_env.d.ts.map +1 -1
  3. package/dist/_build_env.js +4 -0
  4. package/dist/_build_env.js.map +1 -1
  5. package/dist/_version.d.ts +1 -1
  6. package/dist/_version.js +1 -1
  7. package/dist/cli/commands/auth.d.ts.map +1 -1
  8. package/dist/cli/commands/auth.js +68 -38
  9. package/dist/cli/commands/auth.js.map +1 -1
  10. package/dist/cli/commands/orgs.js +1 -1
  11. package/dist/cli/commands/orgs.js.map +1 -1
  12. package/dist/cli/commands/status.d.ts.map +1 -1
  13. package/dist/cli/commands/status.js +4 -3
  14. package/dist/cli/commands/status.js.map +1 -1
  15. package/dist/cli/index.d.ts.map +1 -1
  16. package/dist/cli/index.js +6 -0
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/cli/state.d.ts +3 -3
  19. package/dist/cli/state.d.ts.map +1 -1
  20. package/dist/cli/state.js +24 -12
  21. package/dist/cli/state.js.map +1 -1
  22. package/dist/client.d.ts +3 -0
  23. package/dist/client.d.ts.map +1 -1
  24. package/dist/client.js +26 -6
  25. package/dist/client.js.map +1 -1
  26. package/dist/index.d.ts +1 -1
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +2 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/token_usage.d.ts +23 -0
  31. package/dist/token_usage.d.ts.map +1 -1
  32. package/dist/token_usage.js +107 -26
  33. package/dist/token_usage.js.map +1 -1
  34. package/package.json +1 -1
  35. package/dist/observability/handle.d.ts +0 -41
  36. package/dist/observability/handle.d.ts.map +0 -1
  37. package/dist/observability/handle.js +0 -54
  38. package/dist/observability/handle.js.map +0 -1
  39. package/dist/observability/recorder.d.ts +0 -245
  40. package/dist/observability/recorder.d.ts.map +0 -1
  41. package/dist/observability/recorder.js +0 -475
  42. package/dist/observability/recorder.js.map +0 -1
  43. package/dist/observability/schema.d.ts +0 -163
  44. package/dist/observability/schema.d.ts.map +0 -1
  45. package/dist/observability/schema.js +0 -291
  46. package/dist/observability/schema.js.map +0 -1
  47. package/dist/observability/shipper.d.ts +0 -84
  48. package/dist/observability/shipper.d.ts.map +0 -1
  49. package/dist/observability/shipper.js +0 -206
  50. package/dist/observability/shipper.js.map +0 -1
  51. package/dist/observability/trace-summary.d.ts +0 -34
  52. package/dist/observability/trace-summary.d.ts.map +0 -1
  53. package/dist/observability/trace-summary.js +0 -108
  54. package/dist/observability/trace-summary.js.map +0 -1
@@ -1,291 +0,0 @@
1
- "use strict";
2
- /**
3
- * Observability wire schema — hand-written types and runtime validators.
4
- *
5
- * The contract mirrors `conmap-auto/src/observability/schema.ts` (zod on the
6
- * backend). The SDK cannot use zod (per plan §9 Q1) — adding it would balloon
7
- * the bundle for a small, stable shape. The backend's zod parser is the
8
- * safety net at the ingest boundary; if the wire shape ever drifts, the
9
- * backend rejects the bad batch and the SDK's no-throw invariant swallows
10
- * the warning.
11
- *
12
- * The validators below are deliberately cheap (typeof, structural) — they
13
- * run on every emitted span and must not become a hot-path cost.
14
- */
15
- Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.isValidSpanStatus = isValidSpanStatus;
17
- exports.isValidSpanKind = isValidSpanKind;
18
- exports.isValidPolicyDecision = isValidPolicyDecision;
19
- exports.isValidPolicySource = isValidPolicySource;
20
- exports.isValidPolicyEnforcementAction = isValidPolicyEnforcementAction;
21
- exports.isValidEventLevel = isValidEventLevel;
22
- exports.isValidGenericSpanAttributes = isValidGenericSpanAttributes;
23
- exports.isValidPolicyCallAttributes = isValidPolicyCallAttributes;
24
- exports.isValidGenerationAttributes = isValidGenerationAttributes;
25
- exports.isValidEventAttributes = isValidEventAttributes;
26
- exports.isValidSpanAttributes = isValidSpanAttributes;
27
- exports.isValidTraceRecord = isValidTraceRecord;
28
- exports.isValidSpanRecord = isValidSpanRecord;
29
- exports.isValidIngestBatch = isValidIngestBatch;
30
- exports.isValidIngestPayload = isValidIngestPayload;
31
- exports.mintId = mintId;
32
- exports.isValidUuid = isValidUuid;
33
- const crypto_1 = require("crypto");
34
- const SPAN_KINDS = new Set([
35
- 'span',
36
- 'policy_call',
37
- 'generation',
38
- 'event',
39
- ]);
40
- const SPAN_STATUSES = new Set(['ok', 'error', 'denied']);
41
- const POLICY_DECISIONS = new Set([
42
- 'allow',
43
- 'deny',
44
- 'hold',
45
- 'ask',
46
- ]);
47
- const POLICY_SOURCES = new Set([
48
- 'native',
49
- 'sdk-local',
50
- 'sdk',
51
- 'proxy',
52
- 'opa',
53
- 'opa_fallback',
54
- ]);
55
- const POLICY_ENFORCEMENT_ACTIONS = new Set([
56
- 'allow',
57
- 'allow_log',
58
- 'hold',
59
- 'block',
60
- ]);
61
- const EVENT_LEVELS = new Set(['info', 'warn', 'error']);
62
- function isPlainObject(x) {
63
- return typeof x === 'object' && x !== null && !Array.isArray(x);
64
- }
65
- // ─── Validators (cheap, return boolean) ──────────────────────────────────
66
- function isValidSpanStatus(x) {
67
- return typeof x === 'string' && SPAN_STATUSES.has(x);
68
- }
69
- function isValidSpanKind(x) {
70
- return typeof x === 'string' && SPAN_KINDS.has(x);
71
- }
72
- function isValidPolicyDecision(x) {
73
- return typeof x === 'string' && POLICY_DECISIONS.has(x);
74
- }
75
- function isValidPolicySource(x) {
76
- return typeof x === 'string' && POLICY_SOURCES.has(x);
77
- }
78
- function isValidPolicyEnforcementAction(x) {
79
- return (typeof x === 'string' && POLICY_ENFORCEMENT_ACTIONS.has(x));
80
- }
81
- function isValidEventLevel(x) {
82
- return typeof x === 'string' && EVENT_LEVELS.has(x);
83
- }
84
- function isStringOrNull(x) {
85
- return x === null || typeof x === 'string';
86
- }
87
- function isStringArrayOrEmpty(x) {
88
- return Array.isArray(x) && x.every((v) => typeof v === 'string');
89
- }
90
- function isValidGenericSpanAttributes(x) {
91
- if (!isPlainObject(x))
92
- return false;
93
- if (x.kind !== 'span')
94
- return false;
95
- if ('toolName' in x &&
96
- x.toolName !== undefined &&
97
- typeof x.toolName !== 'string')
98
- return false;
99
- if ('errorMessage' in x &&
100
- x.errorMessage !== undefined &&
101
- typeof x.errorMessage !== 'string')
102
- return false;
103
- return true;
104
- }
105
- function isValidPolicyCallAttributes(x) {
106
- if (!isPlainObject(x))
107
- return false;
108
- if (x.kind !== 'policy_call')
109
- return false;
110
- if (!isValidPolicyDecision(x.decision))
111
- return false;
112
- if (!isValidPolicySource(x.source))
113
- return false;
114
- if (!isStringOrNull(x.policyId))
115
- return false;
116
- if (!isStringOrNull(x.policyName))
117
- return false;
118
- if (!isStringOrNull(x.policyHash))
119
- return false;
120
- if (!isStringOrNull(x.policyVersion))
121
- return false;
122
- if (!isStringOrNull(x.matchedRuleId))
123
- return false;
124
- if (!isStringOrNull(x.reason))
125
- return false;
126
- if (!isStringOrNull(x.delegationId))
127
- return false;
128
- if (!isStringArrayOrEmpty(x.dataClasses))
129
- return false;
130
- if ('enforcementAction' in x &&
131
- x.enforcementAction !== null &&
132
- !isValidPolicyEnforcementAction(x.enforcementAction))
133
- return false;
134
- return true;
135
- }
136
- function isValidGenerationAttributes(x) {
137
- if (!isPlainObject(x))
138
- return false;
139
- if (x.kind !== 'generation')
140
- return false;
141
- if (typeof x.model !== 'string')
142
- return false;
143
- if (typeof x.inputTokens !== 'number' || !Number.isFinite(x.inputTokens))
144
- return false;
145
- if (typeof x.outputTokens !== 'number' || !Number.isFinite(x.outputTokens))
146
- return false;
147
- if (typeof x.costUsd !== 'number' || !Number.isFinite(x.costUsd))
148
- return false;
149
- if ('cacheReadTokens' in x &&
150
- x.cacheReadTokens !== null &&
151
- (typeof x.cacheReadTokens !== 'number' || !Number.isFinite(x.cacheReadTokens)))
152
- return false;
153
- if ('cacheWriteTokens' in x &&
154
- x.cacheWriteTokens !== null &&
155
- (typeof x.cacheWriteTokens !== 'number' || !Number.isFinite(x.cacheWriteTokens)))
156
- return false;
157
- if ('prompt' in x && x.prompt !== null && typeof x.prompt !== 'string')
158
- return false;
159
- if ('completion' in x &&
160
- x.completion !== null &&
161
- typeof x.completion !== 'string')
162
- return false;
163
- if ('finishReason' in x &&
164
- x.finishReason !== null &&
165
- typeof x.finishReason !== 'string')
166
- return false;
167
- return true;
168
- }
169
- function isValidEventAttributes(x) {
170
- if (!isPlainObject(x))
171
- return false;
172
- if (x.kind !== 'event')
173
- return false;
174
- if (typeof x.message !== 'string')
175
- return false;
176
- return isValidEventLevel(x.level);
177
- }
178
- function isValidSpanAttributes(x) {
179
- if (!isPlainObject(x))
180
- return false;
181
- const k = x.kind;
182
- if (k === 'span')
183
- return isValidGenericSpanAttributes(x);
184
- if (k === 'policy_call')
185
- return isValidPolicyCallAttributes(x);
186
- if (k === 'generation')
187
- return isValidGenerationAttributes(x);
188
- if (k === 'event')
189
- return isValidEventAttributes(x);
190
- return false;
191
- }
192
- function isValidTraceRecord(x) {
193
- if (!isPlainObject(x))
194
- return false;
195
- if (typeof x.id !== 'string' || x.id.length === 0)
196
- return false;
197
- if (typeof x.name !== 'string' || x.name.length === 0)
198
- return false;
199
- if (typeof x.startTime !== 'string')
200
- return false;
201
- if ('endTime' in x &&
202
- x.endTime !== null &&
203
- typeof x.endTime !== 'string')
204
- return false;
205
- if ('durationMs' in x &&
206
- x.durationMs !== null &&
207
- (typeof x.durationMs !== 'number' || !Number.isInteger(x.durationMs)))
208
- return false;
209
- if (!isValidSpanStatus(x.status))
210
- return false;
211
- if (!isStringOrNull(x.sessionId))
212
- return false;
213
- if (!isStringOrNull(x.userId))
214
- return false;
215
- if (!isStringOrNull(x.agentId))
216
- return false;
217
- if (!isPlainObject(x.attributes))
218
- return false;
219
- if (!isStringArrayOrEmpty(x.tags))
220
- return false;
221
- return true;
222
- }
223
- function isValidSpanRecord(x) {
224
- if (!isPlainObject(x))
225
- return false;
226
- if (typeof x.id !== 'string' || x.id.length === 0)
227
- return false;
228
- if (typeof x.name !== 'string' || x.name.length === 0)
229
- return false;
230
- if (typeof x.startTime !== 'string')
231
- return false;
232
- if ('endTime' in x &&
233
- x.endTime !== null &&
234
- typeof x.endTime !== 'string')
235
- return false;
236
- if ('durationMs' in x &&
237
- x.durationMs !== null &&
238
- (typeof x.durationMs !== 'number' || !Number.isInteger(x.durationMs)))
239
- return false;
240
- if (!isValidSpanKind(x.kind))
241
- return false;
242
- if (!isValidSpanStatus(x.status))
243
- return false;
244
- if (!isStringOrNull(x.parentSpanId))
245
- return false;
246
- if (!isStringOrNull(x.sessionId))
247
- return false;
248
- return isValidSpanAttributes(x.attributes);
249
- }
250
- function isValidIngestBatch(x) {
251
- if (!isPlainObject(x))
252
- return false;
253
- if (!isValidTraceRecord(x.trace))
254
- return false;
255
- if (!Array.isArray(x.spans))
256
- return false;
257
- for (const s of x.spans) {
258
- if (!isValidSpanRecord(s))
259
- return false;
260
- }
261
- return true;
262
- }
263
- function isValidIngestPayload(x) {
264
- if (!isPlainObject(x))
265
- return false;
266
- if (typeof x.product !== 'string' || x.product.length === 0)
267
- return false;
268
- if (!isStringOrNull(x.sessionId))
269
- return false;
270
- if (!Array.isArray(x.batches) || x.batches.length === 0)
271
- return false;
272
- for (const b of x.batches) {
273
- if (!isValidIngestBatch(b))
274
- return false;
275
- }
276
- return true;
277
- }
278
- // ─── ID minting helper (used by recorder) ────────────────────────────────
279
- function mintId() {
280
- return (0, crypto_1.randomUUID)();
281
- }
282
- // ─── UUID validation ──────────────────────────────────────────────────────
283
- // The backend's `obs_sessions.id` column is a UUID. A trace's `sessionId`
284
- // must therefore either be a valid UUID or `null` — never an arbitrary
285
- // string like the literal `'default'` — or the trace can never be grouped
286
- // into a session (see ArmorIQSession's sessionId resolution in session.ts).
287
- const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
288
- function isValidUuid(x) {
289
- return typeof x === 'string' && UUID_RE.test(x);
290
- }
291
- //# sourceMappingURL=schema.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/observability/schema.ts"],"names":[],"mappings":"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"}
@@ -1,84 +0,0 @@
1
- /**
2
- * ObservabilityShipper — batches ended traces + their spans and POSTs them
3
- * to the backend ingest endpoint.
4
- *
5
- * Failure handling (the no-throw invariant):
6
- * - 4xx: log warning, drop the batches. The backend has rejected the
7
- * payload as malformed; retrying won't help.
8
- * - 5xx and network errors: exponential backoff (500ms, 1s, 2s) up to
9
- * 3 retries; then log warning, drop.
10
- * - Any throw from the httpClient is caught and treated as a network
11
- * error (retried per the same schedule).
12
- *
13
- * The shipper is owned by `ObservabilityRecorder` — SDK consumers should
14
- * not construct it directly. It's exported so the recorder module can
15
- * import it without circular dep issues.
16
- */
17
- import { AxiosInstance } from 'axios';
18
- import { type IngestBatch } from './schema';
19
- export interface ShipperConfig {
20
- /** Backend base URL (no trailing slash). Shipper appends `/observability/spans`. */
21
- endpoint: string;
22
- /** API key sent in the `X-API-Key` header. */
23
- apiKey: string;
24
- /** Product tag included in every payload. */
25
- product: string;
26
- /** Optional top-level session id (used as the fallback for batches without one). */
27
- sessionId?: string | null;
28
- /**
29
- * Max batches per POST. Default 100. `flush()` chunks the queue into
30
- * groups of at most this size and sends one POST per chunk — a burst of
31
- * traces never sends a single unbounded giant POST.
32
- */
33
- batchSize?: number;
34
- /** Auto-flush interval (ms). Default 5000. */
35
- flushIntervalMs?: number;
36
- /** Override the HTTP client (axios instance). Defaults to axios.create({ timeout: 10000 }). */
37
- httpClient?: AxiosInstance;
38
- }
39
- export declare class ObservabilityShipper {
40
- private readonly endpoint;
41
- private readonly apiKey;
42
- private readonly product;
43
- private readonly sessionId;
44
- private readonly batchSize;
45
- private readonly flushIntervalMs;
46
- private readonly httpClient;
47
- private readonly queue;
48
- private intervalHandle;
49
- private stopPromise;
50
- constructor(config: ShipperConfig);
51
- /**
52
- * Append a batch to the internal queue. The shipper does not validate
53
- * the batch here (the recorder already validates on record); invalid
54
- * batches are filtered at flush time.
55
- */
56
- enqueue(batch: IngestBatch): void;
57
- /**
58
- * Start the periodic auto-flush. Idempotent — calling start() while
59
- * already running is a no-op.
60
- */
61
- start(): void;
62
- /**
63
- * Stop the periodic auto-flush and do a final flush of anything still
64
- * in the queue. Safe to call multiple times.
65
- */
66
- stop(): Promise<void>;
67
- /**
68
- * POST all queued batches, chunked so each POST carries at most
69
- * `this.batchSize` batches (default 100) — a burst of traces no longer
70
- * sends one unbounded giant POST. Chunks are sent sequentially (simpler
71
- * failure semantics than parallel: a failing chunk doesn't race with a
72
- * later chunk's retry backoff). Returns the summed `{ accepted, rejected }`
73
- * across all chunks. NEVER throws — observability failures must not break
74
- * the consumer.
75
- */
76
- flush(): Promise<{
77
- accepted: number;
78
- rejected: number;
79
- }>;
80
- /** Test-only accessor: inspect the current queue size. */
81
- get __queueSize(): number;
82
- private postWithRetry;
83
- }
84
- //# sourceMappingURL=shipper.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shipper.d.ts","sourceRoot":"","sources":["../../src/observability/shipper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAc,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAsB,KAAK,WAAW,EAAsB,MAAM,UAAU,CAAC;AAEpF,MAAM,WAAW,aAAa;IAC5B,oFAAoF;IACpF,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+FAA+F;IAC/F,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B;AAwCD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,WAAW,CAA8B;gBAErC,MAAM,EAAE,aAAa;IAWjC;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAIjC;;;OAGG;IACH,KAAK,IAAI,IAAI;IAab;;;OAGG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAarB;;;;;;;;OAQG;IACG,KAAK,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAiC9D,0DAA0D;IAC1D,IAAI,WAAW,IAAI,MAAM,CAExB;YAIa,aAAa;CA+C5B"}
@@ -1,206 +0,0 @@
1
- "use strict";
2
- /**
3
- * ObservabilityShipper — batches ended traces + their spans and POSTs them
4
- * to the backend ingest endpoint.
5
- *
6
- * Failure handling (the no-throw invariant):
7
- * - 4xx: log warning, drop the batches. The backend has rejected the
8
- * payload as malformed; retrying won't help.
9
- * - 5xx and network errors: exponential backoff (500ms, 1s, 2s) up to
10
- * 3 retries; then log warning, drop.
11
- * - Any throw from the httpClient is caught and treated as a network
12
- * error (retried per the same schedule).
13
- *
14
- * The shipper is owned by `ObservabilityRecorder` — SDK consumers should
15
- * not construct it directly. It's exported so the recorder module can
16
- * import it without circular dep issues.
17
- */
18
- var __importDefault = (this && this.__importDefault) || function (mod) {
19
- return (mod && mod.__esModule) ? mod : { "default": mod };
20
- };
21
- Object.defineProperty(exports, "__esModule", { value: true });
22
- exports.ObservabilityShipper = void 0;
23
- const axios_1 = __importDefault(require("axios"));
24
- const crypto_1 = require("crypto");
25
- const schema_1 = require("./schema");
26
- const DEFAULT_BATCH_SIZE = 100;
27
- const DEFAULT_FLUSH_INTERVAL_MS = 5000;
28
- const MAX_RETRIES = 3;
29
- const BACKOFF_BASE_MS = 500;
30
- const HTTP_TIMEOUT_MS = 10000;
31
- function sleep(ms) {
32
- return new Promise((resolve) => setTimeout(resolve, ms));
33
- }
34
- /** Split `batches` into chunks of at most `size` batches each (size >= 1). */
35
- function chunkBatches(batches, size) {
36
- const effectiveSize = size > 0 ? size : DEFAULT_BATCH_SIZE;
37
- const chunks = [];
38
- for (let i = 0; i < batches.length; i += effectiveSize) {
39
- chunks.push(batches.slice(i, i + effectiveSize));
40
- }
41
- return chunks;
42
- }
43
- // ─── beforeExit singleton ──────────────────────────────────────────────────
44
- // Each shipper registers itself here on start(). A single beforeExit listener
45
- // drains all active shippers so we never leak listeners (Node warns at 11).
46
- const activeShippers = new Set();
47
- let beforeExitRegistered = false;
48
- function registerBeforeExitHandler() {
49
- if (beforeExitRegistered)
50
- return;
51
- if (typeof process === 'undefined' || typeof process.on !== 'function')
52
- return;
53
- beforeExitRegistered = true;
54
- process.on('beforeExit', () => {
55
- for (const s of activeShippers) {
56
- void s.stop();
57
- }
58
- });
59
- }
60
- class ObservabilityShipper {
61
- endpoint;
62
- apiKey;
63
- product;
64
- sessionId;
65
- batchSize;
66
- flushIntervalMs;
67
- httpClient;
68
- queue = [];
69
- intervalHandle = null;
70
- stopPromise = null;
71
- constructor(config) {
72
- this.endpoint = config.endpoint.replace(/\/+$/, '');
73
- this.apiKey = config.apiKey;
74
- this.product = config.product;
75
- this.sessionId = config.sessionId ?? null;
76
- this.batchSize = config.batchSize ?? DEFAULT_BATCH_SIZE;
77
- this.flushIntervalMs = config.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS;
78
- this.httpClient =
79
- config.httpClient ?? axios_1.default.create({ timeout: HTTP_TIMEOUT_MS });
80
- }
81
- /**
82
- * Append a batch to the internal queue. The shipper does not validate
83
- * the batch here (the recorder already validates on record); invalid
84
- * batches are filtered at flush time.
85
- */
86
- enqueue(batch) {
87
- this.queue.push(batch);
88
- }
89
- /**
90
- * Start the periodic auto-flush. Idempotent — calling start() while
91
- * already running is a no-op.
92
- */
93
- start() {
94
- if (this.intervalHandle)
95
- return;
96
- this.intervalHandle = setInterval(() => {
97
- void this.flush();
98
- }, this.flushIntervalMs);
99
- if (typeof this.intervalHandle === 'object' && this.intervalHandle !== null) {
100
- // Don't keep the event loop alive solely for the flush interval.
101
- this.intervalHandle.unref?.();
102
- }
103
- activeShippers.add(this);
104
- registerBeforeExitHandler();
105
- }
106
- /**
107
- * Stop the periodic auto-flush and do a final flush of anything still
108
- * in the queue. Safe to call multiple times.
109
- */
110
- stop() {
111
- if (this.stopPromise)
112
- return this.stopPromise;
113
- activeShippers.delete(this);
114
- this.stopPromise = (async () => {
115
- if (this.intervalHandle) {
116
- clearInterval(this.intervalHandle);
117
- this.intervalHandle = null;
118
- }
119
- await this.flush();
120
- })();
121
- return this.stopPromise;
122
- }
123
- /**
124
- * POST all queued batches, chunked so each POST carries at most
125
- * `this.batchSize` batches (default 100) — a burst of traces no longer
126
- * sends one unbounded giant POST. Chunks are sent sequentially (simpler
127
- * failure semantics than parallel: a failing chunk doesn't race with a
128
- * later chunk's retry backoff). Returns the summed `{ accepted, rejected }`
129
- * across all chunks. NEVER throws — observability failures must not break
130
- * the consumer.
131
- */
132
- async flush() {
133
- if (this.queue.length === 0) {
134
- return { accepted: 0, rejected: 0 };
135
- }
136
- // Snapshot the queue and clear it before the network call so a
137
- // concurrent enqueue lands in the next flush.
138
- const batches = this.queue.splice(0, this.queue.length);
139
- const valid = batches.filter((b) => (0, schema_1.isValidIngestBatch)(b));
140
- const invalid = batches.length - valid.length;
141
- if (invalid > 0) {
142
- // eslint-disable-next-line no-console
143
- console.warn(`[observability] shipper dropped ${invalid} invalid batch(es) at flush`);
144
- }
145
- if (valid.length === 0) {
146
- return { accepted: 0, rejected: invalid };
147
- }
148
- let accepted = 0;
149
- let rejected = invalid;
150
- for (const chunk of chunkBatches(valid, this.batchSize)) {
151
- const payload = {
152
- product: this.product,
153
- sessionId: this.sessionId,
154
- batches: chunk,
155
- };
156
- const result = await this.postWithRetry(payload);
157
- accepted += result.accepted;
158
- rejected += result.rejected;
159
- }
160
- return { accepted, rejected };
161
- }
162
- /** Test-only accessor: inspect the current queue size. */
163
- get __queueSize() {
164
- return this.queue.length;
165
- }
166
- // ─── Internals ────────────────────────────────────────────────────────
167
- async postWithRetry(payload) {
168
- const url = `${this.endpoint}/observability/spans`;
169
- const headers = {
170
- 'X-API-Key': this.apiKey,
171
- 'Content-Type': 'application/json',
172
- 'X-Request-Id': (0, crypto_1.randomUUID)(),
173
- };
174
- let lastError = null;
175
- for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
176
- try {
177
- const response = await this.httpClient.post(url, payload, { headers });
178
- const status = response.status;
179
- if (status >= 200 && status < 300) {
180
- const data = (response.data ?? {});
181
- return {
182
- accepted: typeof data.accepted === 'number' ? data.accepted : 0,
183
- rejected: typeof data.rejected === 'number' ? data.rejected : 0,
184
- };
185
- }
186
- if (status >= 400 && status < 500) {
187
- // eslint-disable-next-line no-console
188
- console.warn(`[observability] shipper got ${status} from ${url}; dropping ${payload.batches.length} batch(es)`);
189
- return { accepted: 0, rejected: payload.batches.length };
190
- }
191
- lastError = new Error(`HTTP ${status}`);
192
- }
193
- catch (e) {
194
- lastError = e;
195
- }
196
- if (attempt < MAX_RETRIES) {
197
- await sleep(BACKOFF_BASE_MS * 2 ** attempt);
198
- }
199
- }
200
- // eslint-disable-next-line no-console
201
- console.warn(`[observability] shipper failed after ${MAX_RETRIES} retries; dropping ${payload.batches.length} batch(es): ${lastError?.message ?? 'unknown error'}`);
202
- return { accepted: 0, rejected: payload.batches.length };
203
- }
204
- }
205
- exports.ObservabilityShipper = ObservabilityShipper;
206
- //# sourceMappingURL=shipper.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shipper.js","sourceRoot":"","sources":["../../src/observability/shipper.ts"],"names":[],"mappings":"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"}
@@ -1,34 +0,0 @@
1
- /**
2
- * Trace-level tag/output-summary derivation.
3
- *
4
- * A trace's own `tags`/`attributes.output` are never populated by callers
5
- * today (every chokepoint only passes freeform `attributes` at
6
- * `startTrace()` time, before any child span exists) — so without this
7
- * module every trace ships with `tags: []` and no output summary, even
8
- * though the information needed to compute both already lives on the
9
- * trace's own spans by the time `endTrace()` runs.
10
- *
11
- * This is intentionally derived, not caller-supplied: it's computed once,
12
- * in one place (`ObservabilityRecorder.endTrace`), from the same in-memory
13
- * `spans` array the recorder already holds — no new public API surface,
14
- * no risk of callers drifting from each other's tagging conventions.
15
- *
16
- * Kept deliberately conservative and low-cardinality (per the dashboard's
17
- * TAGS column contract): product + distinct tool names + one decision
18
- * verdict, nothing free-text or unbounded.
19
- */
20
- import type { SpanRecord } from './schema';
21
- export interface TraceSummary {
22
- /** Low-cardinality tags: product + distinct tool names + decision verdict. */
23
- tags: string[];
24
- /** Concise outcome summary derived from policy_call spans, or null if none. */
25
- output: string | null;
26
- }
27
- /**
28
- * Derive `{ tags, output }` for a trace from its accumulated spans. Pure
29
- * and read-only — never mutates `spans`. Callers merge the result onto the
30
- * trace record themselves (see `ObservabilityRecorder.endTrace`), preserving
31
- * any tags/output the caller already set explicitly.
32
- */
33
- export declare function deriveTraceSummary(spans: readonly SpanRecord[], product: string | null | undefined): TraceSummary;
34
- //# sourceMappingURL=trace-summary.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trace-summary.d.ts","sourceRoot":"","sources":["../../src/observability/trace-summary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAwB,UAAU,EAAE,MAAM,UAAU,CAAC;AAqEjE,MAAM,WAAW,YAAY;IAC3B,8EAA8E;IAC9E,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,+EAA+E;IAC/E,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACjC,YAAY,CAad"}