@noodleseed/one 0.139.3 → 0.140.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 (40) hide show
  1. package/dist/metrics-render.d.ts +8 -0
  2. package/dist/metrics-render.d.ts.map +1 -1
  3. package/dist/metrics-render.js +7 -1
  4. package/dist/metrics-render.js.map +1 -1
  5. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  6. package/node_modules/@noodle-borg/control-plane/dist/personal-workspace.d.ts +7 -0
  7. package/node_modules/@noodle-borg/{service → control-plane}/dist/personal-workspace.js +1 -2
  8. package/node_modules/@noodle-borg/control-plane/dist/portable.d.ts +1 -0
  9. package/node_modules/@noodle-borg/control-plane/dist/portable.js +1 -0
  10. package/node_modules/@noodle-borg/module/dist/contract.d.ts +0 -64
  11. package/node_modules/@noodle-borg/module/dist/contract.js +3 -2
  12. package/node_modules/@noodle-borg/module/dist/index.d.ts +1 -0
  13. package/node_modules/@noodle-borg/module/dist/index.js +1 -0
  14. package/node_modules/@noodle-borg/module/dist/intent.d.ts +1 -1
  15. package/node_modules/@noodle-borg/module/dist/request-analytics.d.ts +80 -0
  16. package/node_modules/@noodle-borg/module/dist/request-analytics.js +10 -0
  17. package/node_modules/@noodle-borg/observability/dist/intent-capture.js +4 -0
  18. package/node_modules/@noodle-borg/observability/dist/request-event-buffer.js +4 -0
  19. package/node_modules/@noodle-borg/observability/dist/request-event-metrics.js +15 -0
  20. package/node_modules/@noodle-borg/observability/dist/request-events-postgres.js +19 -3
  21. package/node_modules/@noodle-borg/observability/dist/request-events.js +3 -0
  22. package/node_modules/@noodle-borg/observability/dist/runtime.js +61 -1
  23. package/node_modules/@noodle-borg/protocol/dist/handlers/prompts.js +2 -2
  24. package/node_modules/@noodle-borg/protocol/dist/handlers/resources.js +2 -2
  25. package/node_modules/@noodle-borg/protocol/dist/handlers/tools.js +3 -3
  26. package/node_modules/@noodle-borg/protocol/dist/observation.d.ts +17 -0
  27. package/node_modules/@noodle-borg/protocol/dist/observation.js +14 -0
  28. package/node_modules/@noodle-borg/protocol/dist/v2/server.js +5 -5
  29. package/node_modules/@noodle-borg/runtime/dist/index.d.ts +1 -1
  30. package/node_modules/@noodle-borg/runtime/dist/operation-execution.d.ts +1 -1
  31. package/node_modules/@noodle-borg/runtime/dist/operation-execution.js +34 -6
  32. package/node_modules/@noodle-borg/runtime/dist/result.d.ts +18 -0
  33. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js +1 -1
  34. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.js +1 -6
  35. package/node_modules/@noodle-borg/service/package.json +1 -1
  36. package/node_modules/@noodle-borg/transport-http/dist/client-identity.js +124 -0
  37. package/node_modules/@noodle-borg/transport-http/dist/identity-authorization.js +8 -8
  38. package/node_modules/@noodle-borg/transport-http/dist/request-capture.js +97 -10
  39. package/node_modules/@noodle-borg/transport-http/dist/serve-request.js +40 -10
  40. package/package.json +2 -2
@@ -50,6 +50,13 @@ export interface MetricsData {
50
50
  readonly sessions: number;
51
51
  readonly share: number;
52
52
  }[];
53
+ /** Bounded per-request family mix (schema v2, #1309); absent from older services. */
54
+ readonly byClientFamily?: readonly {
55
+ readonly family: string;
56
+ readonly requests: number;
57
+ readonly errors: number;
58
+ readonly share: number;
59
+ }[];
53
60
  readonly byMethod: readonly {
54
61
  readonly method: string;
55
62
  readonly requests: number;
@@ -70,6 +77,7 @@ export interface EventRecord {
70
77
  readonly resourceName?: string;
71
78
  readonly promptName?: string;
72
79
  readonly clientName?: string;
80
+ readonly clientFamily?: string;
73
81
  readonly outcome?: string;
74
82
  readonly errorKind?: string;
75
83
  readonly durationMs?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"metrics-render.d.ts","sourceRoot":"","sources":["../src/metrics-render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metrics-render.d.ts","sourceRoot":"","sources":["../src/metrics-render.ts"],"names":[],"mappings":"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"}
@@ -91,6 +91,12 @@ export function renderMetricsReport(context, metrics, opts) {
91
91
  .map((c) => `${c.client} ${pct(c.share)} ${shareBar(c.share, MIX_BAR_WIDTH, opts)}`)
92
92
  .join(' ')}`);
93
93
  }
94
+ const families = metrics.byClientFamily ?? [];
95
+ if (families.length > 0) {
96
+ mixes.push(`${dim('families', opts)} ${families
97
+ .map((f) => `${f.family} ${pct(f.share)} ${shareBar(f.share, MIX_BAR_WIDTH, opts)}`)
98
+ .join(' ')}`);
99
+ }
94
100
  if (metrics.byMethod.length > 0) {
95
101
  mixes.push(`${dim('methods', opts)} ${metrics.byMethod
96
102
  .map((m) => `${m.method} ${pct(m.share)}`)
@@ -167,7 +173,7 @@ export function renderEventRow(event, opts) {
167
173
  const error = event.errorKind !== undefined
168
174
  ? ` ${paint(outcome === 'mcp_error' ? ROSE : AMBER, event.errorKind, opts.color)}`
169
175
  : '';
170
- const client = fit(event.clientName ?? '—', CLIENT_W - 1).padEnd(CLIENT_W);
176
+ const client = fit(event.clientName ?? event.clientFamily ?? '—', CLIENT_W - 1).padEnd(CLIENT_W);
171
177
  const method = fit(event.method ?? '', METHOD_W - 1).padEnd(METHOD_W);
172
178
  const target = fit(name, NAME_W - 1).padEnd(NAME_W);
173
179
  return ` ${time.padEnd(TIME_W)} ${cell} ${client}${method}${target}${dur.padStart(6)}${error}`;
@@ -1 +1 @@
1
- {"version":3,"file":"metrics-render.js","sourceRoot":"","sources":["../src/metrics-render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metrics-render.js","sourceRoot":"","sources":["../src/metrics-render.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noodle-borg/agent-kit",
3
- "version": "0.84.0",
3
+ "version": "0.84.1",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "engines": {
@@ -0,0 +1,7 @@
1
+ import type { ControlPlaneIdentity, OrganizationStore, OrgRecord } from './contracts.js';
2
+ export interface PersonalWorkspace {
3
+ readonly org: OrgRecord;
4
+ readonly created: boolean;
5
+ }
6
+ export declare function ensurePersonalWorkspace(controlPlane: Pick<OrganizationStore, 'provisionPersonalWorkspace'>, identity: ControlPlaneIdentity): Promise<PersonalWorkspace>;
7
+ //# sourceMappingURL=personal-workspace.d.ts.map
@@ -1,5 +1,4 @@
1
- import { personalOrgSlug } from '@noodle-borg/control-plane/portable';
2
- export { personalOrgSlug, personalOrgSlugSuffix } from '@noodle-borg/control-plane/portable';
1
+ import { personalOrgSlug } from './organization-helpers.js';
3
2
  export async function ensurePersonalWorkspace(controlPlane, identity) {
4
3
  const slug = personalOrgSlug(identity);
5
4
  return controlPlane.provisionPersonalWorkspace({
@@ -4,6 +4,7 @@ export { InMemoryControlPlaneStore } from './in-memory-control-plane-store.js';
4
4
  export { bindInMemoryOrganizationStore, type InMemoryOrganizationOperations, InMemoryOrganizationStore, } from './in-memory-organization-store.js';
5
5
  export { InMemoryMcpSubdomainClaimStore, McpSubdomainCooldownError, McpSubdomainIdempotencyConflictError, McpSubdomainOwnerRequiredError, type McpSubdomainRouteRef, McpSubdomainUnavailableError, mcpSubdomainEndpointOptions, type ResolvedMcpTenantRef, resolveMcpSubdomainTenant, } from './mcp-subdomain-claims.js';
6
6
  export { domainFromEmail, domainKey, memberKey, normalizeSignupAllowlistValue, personalOrgSlug, personalOrgSlugSuffix, signupKey, } from './organization-helpers.js';
7
+ export { ensurePersonalWorkspace } from './personal-workspace.js';
7
8
  export { type RollbackControlPlane, type RollbackOperationDependencies, type RollbackOperationInput, type RollbackOperationResult, type RollbackRegistry, rollbackDeploymentOperation, } from './rollback-deployment.js';
8
9
  export type { RollbackResult } from './rollback-result.js';
9
10
  export { DOMAIN_PATTERN, isSystemOwnedOrgSlug, OPENAI_APPS_CHALLENGE_MAX_LENGTH, SLUG_PATTERN, validateDomain, validateMcpSubdomain, validateOpenAIAppsChallenge, validateOrgMembershipDomain, validateOrgRole, validateSignupAllowlistKind, validateSlug, validateUserOwnedOrgSlug, } from './validation.js';
@@ -3,6 +3,7 @@ export { InMemoryControlPlaneStore } from './in-memory-control-plane-store.js';
3
3
  export { bindInMemoryOrganizationStore, InMemoryOrganizationStore, } from './in-memory-organization-store.js';
4
4
  export { InMemoryMcpSubdomainClaimStore, McpSubdomainCooldownError, McpSubdomainIdempotencyConflictError, McpSubdomainOwnerRequiredError, McpSubdomainUnavailableError, mcpSubdomainEndpointOptions, resolveMcpSubdomainTenant, } from './mcp-subdomain-claims.js';
5
5
  export { domainFromEmail, domainKey, memberKey, normalizeSignupAllowlistValue, personalOrgSlug, personalOrgSlugSuffix, signupKey, } from './organization-helpers.js';
6
+ export { ensurePersonalWorkspace } from './personal-workspace.js';
6
7
  export { rollbackDeploymentOperation, } from './rollback-deployment.js';
7
8
  export { DOMAIN_PATTERN, isSystemOwnedOrgSlug, OPENAI_APPS_CHALLENGE_MAX_LENGTH, SLUG_PATTERN, validateDomain, validateMcpSubdomain, validateOpenAIAppsChallenge, validateOrgMembershipDomain, validateOrgRole, validateSignupAllowlistKind, validateSlug, validateUserOwnedOrgSlug, } from './validation.js';
8
9
  //# sourceMappingURL=portable.js.map
@@ -351,70 +351,6 @@ export interface AuditStore extends AuditSink {
351
351
  list(filter: AuditFilter): Promise<readonly AuditEvent[]>;
352
352
  }
353
353
  export declare const AUDIT_SCHEMA_VERSION = 1;
354
- /** Two-tier MCP request outcome: recoverable tool error vs protocol/MCP error. */
355
- export type RequestOutcome = 'ok' | 'tool_error' | 'mcp_error';
356
- /** Real usage vs protocol discovery (list-style discovery calls, excluded from usage metrics). */
357
- export type RequestKind = 'usage' | 'discovery';
358
- /** How the session id was derived (stateless transport mints synthetic ids). */
359
- export type SessionSource = 'mcp' | 'synthetic' | 'none';
360
- /** Whether the caller was an anonymous or an authenticated identity (never the raw subject). */
361
- export type SubjectKind = 'anonymous' | 'authenticated';
362
- export interface RequestEventInput {
363
- readonly org: string;
364
- readonly app?: string;
365
- readonly env?: string;
366
- readonly deploymentId?: string;
367
- readonly serverVersion?: string;
368
- readonly sdkProtocolVersion?: string;
369
- /** Server-observed wire era; never inferred from app or deployment configuration. */
370
- readonly protocolEra?: 'legacy' | 'modern';
371
- readonly requestId: string;
372
- readonly sessionId?: string;
373
- readonly sessionSource: SessionSource;
374
- readonly clientName?: string;
375
- readonly clientVersion?: string;
376
- readonly accessMode?: AccessMode;
377
- readonly subjectKind: SubjectKind;
378
- readonly method: string;
379
- readonly kind: RequestKind;
380
- readonly toolName?: string;
381
- readonly resourceName?: string;
382
- readonly promptName?: string;
383
- readonly outcome: RequestOutcome;
384
- readonly errorKind?: string;
385
- readonly durationMs: number;
386
- readonly outputTokensEst?: number;
387
- readonly country?: string;
388
- readonly details?: Readonly<Record<string, unknown>>;
389
- }
390
- /** A persisted analytics event: the input shape plus store-stamped identity and redacted details. */
391
- export interface RequestEvent extends Omit<RequestEventInput, 'details'> {
392
- readonly seq?: number;
393
- readonly id: string;
394
- readonly schemaVersion: number;
395
- readonly createdAt: string;
396
- readonly details?: AuditDetails;
397
- }
398
- export interface RequestEventFilter {
399
- readonly org: string;
400
- readonly app?: string;
401
- readonly env?: string;
402
- readonly method?: string;
403
- readonly outcome?: RequestOutcome;
404
- readonly toolName?: string;
405
- readonly clientName?: string;
406
- readonly sessionId?: string;
407
- readonly since?: string;
408
- readonly until?: string;
409
- readonly limit?: number;
410
- }
411
- export interface RequestEventSink {
412
- emit(event: RequestEventInput): Promise<void>;
413
- }
414
- export interface RequestEventStore extends RequestEventSink {
415
- list(filter: RequestEventFilter): Promise<readonly RequestEvent[]>;
416
- }
417
- export declare const REQUEST_EVENT_SCHEMA_VERSION = 1;
418
354
  export declare const SERVER_VERSION_PATTERN: RegExp;
419
355
  export declare const TENANT_SLUG_PATTERN: RegExp;
420
356
  /**
@@ -1,7 +1,6 @@
1
1
  export const LEGACY_MODULE_API_VERSION = 1;
2
2
  export const MODULE_API_VERSION = 2;
3
3
  export const AUDIT_SCHEMA_VERSION = 1;
4
- export const REQUEST_EVENT_SCHEMA_VERSION = 1;
5
4
  export const SERVER_VERSION_PATTERN = /^\d+(?:\.\d+){0,2}$/;
6
5
  export const TENANT_SLUG_PATTERN = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;
7
6
  const RESERVED_TENANT_SLUGS = new Set(['deploy', 'healthz', 'readyz', 'v1', 'o', 'mcp']);
@@ -207,12 +206,14 @@ export function redactDetails(details) {
207
206
  }
208
207
  return Object.keys(out).length > 0 ? out : undefined;
209
208
  }
209
+ /** Structural coercion (ADR 0031/0110): a non-scalar value becomes the `[unloggable]` marker rather
210
+ * than ever being serialized. Key safety is the caller's allowlist; the field set IS the contract. */
210
211
  function auditScalar(value) {
211
212
  const type = typeof value;
212
213
  if (type === 'string' || type === 'number' || type === 'boolean') {
213
214
  return value;
214
215
  }
215
- return '[redacted]';
216
+ return '[unloggable]';
216
217
  }
217
218
  function serverVersionParts(version) {
218
219
  return normalizeServerVersion(version)
@@ -6,6 +6,7 @@ export * from './endpoint-url.js';
6
6
  export * from './intent.js';
7
7
  export * from './organization-provisioning.js';
8
8
  export * from './platform-human-identity.js';
9
+ export * from './request-analytics.js';
9
10
  export * from './sql-transaction.js';
10
11
  export * from './tool-dispatch.js';
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -6,6 +6,7 @@ export * from './endpoint-url.js';
6
6
  export * from './intent.js';
7
7
  export * from './organization-provisioning.js';
8
8
  export * from './platform-human-identity.js';
9
+ export * from './request-analytics.js';
9
10
  export * from './sql-transaction.js';
10
11
  export * from './tool-dispatch.js';
11
12
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- import type { RequestOutcome } from './contract.js';
1
+ import type { RequestOutcome } from './request-analytics.js';
2
2
  export declare const INTENT_CATEGORIES: readonly ["discover", "evaluate", "transact", "operate", "support", "other"];
3
3
  export type IntentCategory = (typeof INTENT_CATEGORIES)[number];
4
4
  export declare const INTENT_MATCHES: readonly ["direct", "partial", "workaround", "unknown"];
@@ -0,0 +1,80 @@
1
+ import type { AccessMode, AuditDetails } from './contract.js';
2
+ /** Two-tier MCP request outcome: recoverable tool error vs protocol/MCP error. */
3
+ export type RequestOutcome = 'ok' | 'tool_error' | 'mcp_error';
4
+ /** Real usage vs protocol discovery (list-style discovery calls, excluded from usage metrics). */
5
+ export type RequestKind = 'usage' | 'discovery';
6
+ /** How the session id was derived (stateless transport mints synthetic ids). */
7
+ export type SessionSource = 'mcp' | 'synthetic' | 'none';
8
+ /** Whether the caller was an anonymous or an authenticated identity (never the raw subject). */
9
+ export type SubjectKind = 'anonymous' | 'authenticated';
10
+ /**
11
+ * Bounded client-family projection (issue #1309): a stable low-cardinality token derived from MCP
12
+ * `clientInfo` when supplied, else from a closed table of known HTTP client user agents (`other`
13
+ * when unmatched, `unknown` when absent). Never a raw user-agent string.
14
+ */
15
+ export declare const CLIENT_FAMILY_UNKNOWN = "unknown";
16
+ export declare const CLIENT_FAMILY_OTHER = "other";
17
+ export interface RequestEventInput {
18
+ readonly org: string;
19
+ readonly app?: string;
20
+ readonly env?: string;
21
+ readonly deploymentId?: string;
22
+ readonly serverVersion?: string;
23
+ readonly sdkProtocolVersion?: string;
24
+ /** Server-observed wire era; never inferred from app or deployment configuration. */
25
+ readonly protocolEra?: 'legacy' | 'modern';
26
+ readonly requestId: string;
27
+ readonly sessionId?: string;
28
+ readonly sessionSource: SessionSource;
29
+ readonly clientName?: string;
30
+ readonly clientVersion?: string;
31
+ /** Bounded client family; always present in practice (`unknown` when nothing safe was supplied). */
32
+ readonly clientFamily?: string;
33
+ readonly accessMode?: AccessMode;
34
+ readonly subjectKind: SubjectKind;
35
+ readonly method: string;
36
+ readonly kind: RequestKind;
37
+ readonly toolName?: string;
38
+ readonly resourceName?: string;
39
+ readonly promptName?: string;
40
+ readonly outcome: RequestOutcome;
41
+ readonly errorKind?: string;
42
+ readonly durationMs: number;
43
+ /** Front-door wait (auth, admission, authorization preflight) before protocol dispatch began. */
44
+ readonly queueMs?: number;
45
+ /** Protocol-handler execution time; `durationMs` remains the full request wall clock. */
46
+ readonly execMs?: number;
47
+ readonly outputTokensEst?: number;
48
+ readonly country?: string;
49
+ readonly details?: Readonly<Record<string, unknown>>;
50
+ }
51
+ /** A persisted analytics event: the input shape plus store-stamped identity and redacted details. */
52
+ export interface RequestEvent extends Omit<RequestEventInput, 'details'> {
53
+ readonly seq?: number;
54
+ readonly id: string;
55
+ readonly schemaVersion: number;
56
+ readonly createdAt: string;
57
+ readonly details?: AuditDetails;
58
+ }
59
+ export interface RequestEventFilter {
60
+ readonly org: string;
61
+ readonly app?: string;
62
+ readonly env?: string;
63
+ readonly method?: string;
64
+ readonly outcome?: RequestOutcome;
65
+ readonly toolName?: string;
66
+ readonly clientName?: string;
67
+ readonly sessionId?: string;
68
+ readonly since?: string;
69
+ readonly until?: string;
70
+ readonly limit?: number;
71
+ }
72
+ export interface RequestEventSink {
73
+ emit(event: RequestEventInput): Promise<void>;
74
+ }
75
+ export interface RequestEventStore extends RequestEventSink {
76
+ list(filter: RequestEventFilter): Promise<readonly RequestEvent[]>;
77
+ }
78
+ /** v2 (issue #1309): adds `clientFamily`, `queueMs`, `execMs`, and connector-attribution `details`. */
79
+ export declare const REQUEST_EVENT_SCHEMA_VERSION = 2;
80
+ //# sourceMappingURL=request-analytics.d.ts.map
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Bounded client-family projection (issue #1309): a stable low-cardinality token derived from MCP
3
+ * `clientInfo` when supplied, else from a closed table of known HTTP client user agents (`other`
4
+ * when unmatched, `unknown` when absent). Never a raw user-agent string.
5
+ */
6
+ export const CLIENT_FAMILY_UNKNOWN = 'unknown';
7
+ export const CLIENT_FAMILY_OTHER = 'other';
8
+ /** v2 (issue #1309): adds `clientFamily`, `queueMs`, `execMs`, and connector-attribution `details`. */
9
+ export const REQUEST_EVENT_SCHEMA_VERSION = 2;
10
+ //# sourceMappingURL=request-analytics.js.map
@@ -180,6 +180,10 @@ export class IntentEventBuffer {
180
180
  }
181
181
  this.#inFlight = false;
182
182
  }
183
+ /** Events currently queued and not yet durably written. */
184
+ get depth() {
185
+ return this.#queue.length;
186
+ }
183
187
  get droppedTotal() {
184
188
  return this.#dropped;
185
189
  }
@@ -45,6 +45,10 @@ export class RequestEventBuffer {
45
45
  }
46
46
  this.#inFlight = false;
47
47
  }
48
+ /** Events currently queued and not yet durably written. */
49
+ get depth() {
50
+ return this.#queue.length;
51
+ }
48
52
  /** Events dropped because the buffer was full or closed. */
49
53
  get droppedTotal() {
50
54
  return this.#dropped;
@@ -24,6 +24,7 @@ export function aggregateRequestEvents(events) {
24
24
  let tokensTotal = 0;
25
25
  const byTool = new Map();
26
26
  const byClient = new Map();
27
+ const byClientFamily = new Map();
27
28
  const byMethod = new Map();
28
29
  const series = new Map();
29
30
  for (const event of usage) {
@@ -39,6 +40,12 @@ export function aggregateRequestEvents(events) {
39
40
  byClient.set(client, (byClient.get(client) ?? 0) + 1);
40
41
  }
41
42
  byMethod.set(event.method, (byMethod.get(event.method) ?? 0) + 1);
43
+ const family = event.clientFamily ?? 'unknown';
44
+ const familyRow = byClientFamily.get(family) ?? { requests: 0, errors: 0 };
45
+ familyRow.requests += 1;
46
+ if (event.outcome !== 'ok')
47
+ familyRow.errors += 1;
48
+ byClientFamily.set(family, familyRow);
42
49
  if (event.toolName !== undefined) {
43
50
  toolCalls += 1;
44
51
  const tool = byTool.get(event.toolName) ?? { calls: 0, errors: 0, durations: [] };
@@ -95,6 +102,14 @@ export function aggregateRequestEvents(events) {
95
102
  share: sessions === 0 ? 0 : count / sessions,
96
103
  }))
97
104
  .sort((a, b) => b.sessions - a.sessions),
105
+ byClientFamily: [...byClientFamily.entries()]
106
+ .map(([family, row]) => ({
107
+ family,
108
+ requests: row.requests,
109
+ errors: row.errors,
110
+ share: rate(row.requests),
111
+ }))
112
+ .sort((a, b) => b.requests - a.requests),
98
113
  byMethod: [...byMethod.entries()]
99
114
  .map(([method, requests]) => ({ method, requests, share: rate(requests) }))
100
115
  .sort((a, b) => b.requests - a.requests),
@@ -29,6 +29,7 @@ export async function ensureRequestEventSchema(pool) {
29
29
  session_source text NOT NULL,
30
30
  client_name text,
31
31
  client_version text,
32
+ client_family text,
32
33
  access_mode text,
33
34
  subject_kind text NOT NULL,
34
35
  method text NOT NULL,
@@ -39,6 +40,8 @@ export async function ensureRequestEventSchema(pool) {
39
40
  outcome text NOT NULL,
40
41
  error_kind text,
41
42
  duration_ms double precision NOT NULL,
43
+ queue_ms double precision,
44
+ exec_ms double precision,
42
45
  output_tokens_est int,
43
46
  country text,
44
47
  details jsonb
@@ -47,6 +50,13 @@ export async function ensureRequestEventSchema(pool) {
47
50
  await pool.query(`
48
51
  ALTER TABLE request_events
49
52
  ADD COLUMN IF NOT EXISTS protocol_era text
53
+ `);
54
+ // Schema v2 (#1309): bounded client family, and the queue-vs-execution latency split.
55
+ await pool.query(`
56
+ ALTER TABLE request_events
57
+ ADD COLUMN IF NOT EXISTS client_family text,
58
+ ADD COLUMN IF NOT EXISTS queue_ms double precision,
59
+ ADD COLUMN IF NOT EXISTS exec_ms double precision
50
60
  `);
51
61
  await pool.query(`
52
62
  CREATE INDEX IF NOT EXISTS request_events_tenant_time_idx
@@ -87,10 +97,10 @@ export class PostgresRequestEventStore {
87
97
  await this.#pool.query(`INSERT INTO request_events
88
98
  (id, schema_version, created_at, org_slug, app_slug, environment, deployment_id,
89
99
  server_version, sdk_protocol_version, protocol_era, request_id, session_id, session_source,
90
- client_name, client_version, access_mode, subject_kind, method, kind,
91
- tool_name, resource_name, prompt_name, outcome, error_kind, duration_ms,
100
+ client_name, client_version, client_family, access_mode, subject_kind, method, kind,
101
+ tool_name, resource_name, prompt_name, outcome, error_kind, duration_ms, queue_ms, exec_ms,
92
102
  output_tokens_est, country, details)
93
- VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28)`, [
103
+ VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$30,$31)`, [
94
104
  randomUUID(),
95
105
  REQUEST_EVENT_SCHEMA_VERSION,
96
106
  this.#now(),
@@ -106,6 +116,7 @@ export class PostgresRequestEventStore {
106
116
  input.sessionSource,
107
117
  input.clientName ?? null,
108
118
  input.clientVersion ?? null,
119
+ input.clientFamily ?? null,
109
120
  input.accessMode ?? null,
110
121
  input.subjectKind,
111
122
  input.method,
@@ -116,6 +127,8 @@ export class PostgresRequestEventStore {
116
127
  input.outcome,
117
128
  input.errorKind ?? null,
118
129
  input.durationMs,
130
+ input.queueMs ?? null,
131
+ input.execMs ?? null,
119
132
  input.outputTokensEst ?? null,
120
133
  input.country ?? null,
121
134
  details !== undefined ? JSON.stringify(details) : null,
@@ -188,11 +201,14 @@ function rowToEvent(row) {
188
201
  ...(row.session_id !== null ? { sessionId: row.session_id } : {}),
189
202
  ...(row.client_name !== null ? { clientName: row.client_name } : {}),
190
203
  ...(row.client_version !== null ? { clientVersion: row.client_version } : {}),
204
+ ...(row.client_family !== null ? { clientFamily: row.client_family } : {}),
191
205
  ...(row.access_mode !== null ? { accessMode: row.access_mode } : {}),
192
206
  ...(row.tool_name !== null ? { toolName: row.tool_name } : {}),
193
207
  ...(row.resource_name !== null ? { resourceName: row.resource_name } : {}),
194
208
  ...(row.prompt_name !== null ? { promptName: row.prompt_name } : {}),
195
209
  ...(row.error_kind !== null ? { errorKind: row.error_kind } : {}),
210
+ ...(row.queue_ms !== null ? { queueMs: row.queue_ms } : {}),
211
+ ...(row.exec_ms !== null ? { execMs: row.exec_ms } : {}),
196
212
  ...(row.output_tokens_est !== null ? { outputTokensEst: row.output_tokens_est } : {}),
197
213
  ...(row.country !== null ? { country: row.country } : {}),
198
214
  ...(row.details !== null ? { details: row.details } : {}),
@@ -26,11 +26,14 @@ function toRequestEvent(input) {
26
26
  ...(input.sessionId !== undefined ? { sessionId: input.sessionId } : {}),
27
27
  ...(input.clientName !== undefined ? { clientName: input.clientName } : {}),
28
28
  ...(input.clientVersion !== undefined ? { clientVersion: input.clientVersion } : {}),
29
+ ...(input.clientFamily !== undefined ? { clientFamily: input.clientFamily } : {}),
29
30
  ...(input.accessMode !== undefined ? { accessMode: input.accessMode } : {}),
30
31
  ...(input.toolName !== undefined ? { toolName: input.toolName } : {}),
31
32
  ...(input.resourceName !== undefined ? { resourceName: input.resourceName } : {}),
32
33
  ...(input.promptName !== undefined ? { promptName: input.promptName } : {}),
33
34
  ...(input.errorKind !== undefined ? { errorKind: input.errorKind } : {}),
35
+ ...(input.queueMs !== undefined ? { queueMs: input.queueMs } : {}),
36
+ ...(input.execMs !== undefined ? { execMs: input.execMs } : {}),
34
37
  ...(input.outputTokensEst !== undefined ? { outputTokensEst: input.outputTokensEst } : {}),
35
38
  ...(input.country !== undefined ? { country: input.country } : {}),
36
39
  ...(details !== undefined ? { details } : {}),
@@ -1,7 +1,8 @@
1
1
  import { IntentEventBuffer, PostgresIntentEventStore } from './intent-capture.js';
2
2
  import { RequestEventBuffer } from './request-event-buffer.js';
3
3
  import { PostgresRequestEventStore } from './request-events-postgres.js';
4
- export function createTelemetryRuntime(requestEvents, intentEvents, requestRetentionDays) {
4
+ const DEFAULT_HEARTBEAT_INTERVAL_MS = 5 * 60 * 1000;
5
+ export function createTelemetryRuntime(requestEvents, intentEvents, requestRetentionDays, options = {}) {
5
6
  const requestEventBuffer = new RequestEventBuffer(requestEvents);
6
7
  const intentEventBuffer = new IntentEventBuffer(intentEvents);
7
8
  const retentionTimer = requestEvents instanceof PostgresRequestEventStore
@@ -10,13 +11,72 @@ export function createTelemetryRuntime(requestEvents, intentEvents, requestReten
10
11
  const intentRetentionTimer = intentEvents instanceof PostgresIntentEventStore
11
12
  ? startPruner(14, (cutoff) => intentEvents.prune(cutoff))
12
13
  : undefined;
14
+ const heartbeatTimer = options.onHeartbeat === undefined && options.heartbeatLogger === undefined
15
+ ? undefined
16
+ : startHeartbeat(requestEventBuffer, intentEventBuffer, options, options.heartbeatIntervalMs ?? DEFAULT_HEARTBEAT_INTERVAL_MS);
17
+ const timers = [retentionTimer, intentRetentionTimer, heartbeatTimer];
13
18
  return {
14
19
  requestEventBuffer,
15
20
  intentEventBuffer,
16
21
  ...(retentionTimer === undefined ? {} : { retentionTimer }),
17
22
  ...(intentRetentionTimer === undefined ? {} : { intentRetentionTimer }),
23
+ ...(heartbeatTimer === undefined ? {} : { heartbeatTimer }),
24
+ async dispose() {
25
+ for (const timer of timers)
26
+ if (timer !== undefined)
27
+ clearInterval(timer);
28
+ const failures = [];
29
+ for (const drain of [requestEventBuffer, intentEventBuffer]) {
30
+ try {
31
+ await drain.close();
32
+ }
33
+ catch (error) {
34
+ failures.push(error);
35
+ }
36
+ }
37
+ if (failures.length > 0) {
38
+ throw new AggregateError(failures, 'telemetry runtime dispose failed');
39
+ }
40
+ },
18
41
  };
19
42
  }
43
+ /** Snapshot both buffers' health counters; shared by the timer and direct callers/tests. */
44
+ export function telemetryHealthSnapshot(requestEventBuffer, intentEventBuffer) {
45
+ return {
46
+ requestEvents: {
47
+ depth: requestEventBuffer.depth,
48
+ dropped: requestEventBuffer.droppedTotal,
49
+ failed: requestEventBuffer.failedTotal,
50
+ },
51
+ intentEvents: {
52
+ depth: intentEventBuffer.depth,
53
+ dropped: intentEventBuffer.droppedTotal,
54
+ failed: intentEventBuffer.failedTotal,
55
+ },
56
+ };
57
+ }
58
+ function startHeartbeat(requestEventBuffer, intentEventBuffer, options, intervalMs) {
59
+ const beat = () => {
60
+ try {
61
+ const health = telemetryHealthSnapshot(requestEventBuffer, intentEventBuffer);
62
+ options.onHeartbeat?.(health);
63
+ options.heartbeatLogger?.info('telemetry.health', {
64
+ requestEventsDepth: health.requestEvents.depth,
65
+ requestEventsDropped: health.requestEvents.dropped,
66
+ requestEventsFailed: health.requestEvents.failed,
67
+ intentEventsDepth: health.intentEvents.depth,
68
+ intentEventsDropped: health.intentEvents.dropped,
69
+ intentEventsFailed: health.intentEvents.failed,
70
+ });
71
+ }
72
+ catch {
73
+ // Health reporting must never disturb the pipeline it watches.
74
+ }
75
+ };
76
+ const timer = setInterval(beat, intervalMs);
77
+ timer.unref?.();
78
+ return timer;
79
+ }
20
80
  function startPruner(days, prune) {
21
81
  const run = () => {
22
82
  void prune(new Date(Date.now() - days * 24 * 60 * 60 * 1000)).catch(() => undefined);
@@ -1,7 +1,7 @@
1
1
  import { ErrorCode, GetPromptRequestSchema, ListPromptsRequestSchema, McpError, } from '@modelcontextprotocol/sdk/types.js';
2
2
  import { executePrompt } from '@noodle-borg/runtime';
3
3
  import { mapPromptMessages, mapPromptsList } from '../mapping.js';
4
- import { estimateTokens, notify, } from '../observation.js';
4
+ import { estimateTokens, executionErrorObservation, notify, } from '../observation.js';
5
5
  export function registerPrompts(server, artifact, deps, context) {
6
6
  server.setRequestHandler(ListPromptsRequestSchema, () => mapPromptsList(artifact));
7
7
  server.setRequestHandler(GetPromptRequestSchema, async (request) => {
@@ -20,7 +20,7 @@ export function registerPrompts(server, artifact, deps, context) {
20
20
  }
21
21
  const result = await executePrompt(artifact, name, args ?? {}, deps);
22
22
  if (!result.ok) {
23
- observe('mcp_error', { errorKind: result.error.code });
23
+ observe('mcp_error', executionErrorObservation(result.error));
24
24
  throw new McpError(ErrorCode.InternalError, result.error.message);
25
25
  }
26
26
  const mapped = mapPromptMessages(result.output, prompt.description);