@semiont/core 0.5.30 → 0.5.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-IQGH6UJN.js → chunk-LAKUQM2K.js} +3 -3
- package/dist/{chunk-IQGH6UJN.js.map → chunk-LAKUQM2K.js.map} +1 -1
- package/dist/{chunk-EWOITHBH.js → chunk-W6N56PWO.js} +2 -3
- package/dist/chunk-W6N56PWO.js.map +1 -0
- package/dist/index.d.ts +145 -56
- package/dist/index.js +37 -21
- package/dist/index.js.map +1 -1
- package/dist/openapi.d.ts +6 -3
- package/dist/openapi.js +1690 -1519
- package/dist/openapi.js.map +1 -1
- package/dist/testing/axioms.js +2 -2
- package/dist/testing.js +2 -2
- package/package.json +2 -2
- package/dist/chunk-EWOITHBH.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { baseUrl, EventBus, BRIDGED_CHANNELS, BUS_OPERATIONS } from './chunk-
|
|
1
|
+
import { baseUrl, EventBus, BRIDGED_CHANNELS, BUS_OPERATIONS } from './chunk-W6N56PWO.js';
|
|
2
2
|
import { BehaviorSubject, Subject } from 'rxjs';
|
|
3
3
|
|
|
4
4
|
function isOperation(channel) {
|
|
@@ -140,5 +140,5 @@ var FaultyTransport = class {
|
|
|
140
140
|
};
|
|
141
141
|
|
|
142
142
|
export { FaultyTransport, retryKeyOf };
|
|
143
|
-
//# sourceMappingURL=chunk-
|
|
144
|
-
//# sourceMappingURL=chunk-
|
|
143
|
+
//# sourceMappingURL=chunk-LAKUQM2K.js.map
|
|
144
|
+
//# sourceMappingURL=chunk-LAKUQM2K.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/faulty-transport.ts"],"names":[],"mappings":"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","file":"chunk-IQGH6UJN.js","sourcesContent":["/**\n * FaultyTransport — a seeded, scriptable `ITransport` simulator for the\n * liveness axioms (`.plans/LIVENESS-AXIOMS.md`). fast-check draws a fault\n * schedule; the transport applies one `FaultAction` per request-channel emit\n * and synthesizes replies from the `BUS_OPERATIONS` registry, so real\n * compositions (`busRequest`, SWR caches, live queries) run unmodified against\n * generated wire behavior no hand-written test names.\n *\n * Home is core (not sdk/test-utils) for the same reason as\n * `assertStateUnitAxioms`: it needs only core types, and every layer —\n * including `http-transport`, below sdk — can consume it via\n * `@semiont/core/testing` without a dependency cycle.\n *\n * Deterministic-by-construction: no `Date.now`, no randomness of its own —\n * all variation comes in through the schedule (fast-check owns the seed).\n * Time is real `setTimeout` at millisecond scale; properties pass a small\n * explicit `timeoutMs` to `busRequest`, so nothing waits 30 s.\n */\n\nimport { BehaviorSubject, Subject, type Observable } from 'rxjs';\nimport type { SemiontError } from './errors';\nimport type { BaseUrl } from './branded-types';\nimport { baseUrl as makeBaseUrl } from './branded-types';\nimport type { ResourceId } from './identifiers';\nimport type { EventMap } from './bus-protocol';\nimport type { ConnectionState, ITransport } from './transport';\nimport { EventBus } from './event-bus';\nimport { BRIDGED_CHANNELS } from './bridged-channels';\nimport { BUS_OPERATIONS, type BusOperationKey } from './bus-operations';\n\n/** One wire behavior, applied to a single request-channel emit. */\nexport type FaultAction =\n | { kind: 'deliver' }\n | { kind: 'drop-reply' }\n | { kind: 'delay'; ms: number }\n | { kind: 'duplicate-reply' }\n | { kind: 'reject-emit' };\n\n/** requestLog entry — one per request-channel emit, in arrival order. */\nexport interface RequestLogEntry {\n channel: BusOperationKey;\n /** The action the schedule assigned to this emit. */\n action: FaultAction;\n correlationId: string | undefined;\n /**\n * Request identity for retry accounting: channel + payload minus the\n * per-issue fields (`correlationId`, `_trace`, `_userId`). Two emits with\n * the same key are the same logical request re-issued.\n */\n retryKey: string;\n /**\n * The payload as emitted — envelope, options, params, `correlationId` and\n * all. This is the surface for \"assert what my orchestrator actually SENT\"\n * (SDK-TESTING-DOUBLE gap 6): without it every consumer harness re-invented\n * a per-channel `transport.on(...)` wire recorder alongside this log.\n *\n * SHALLOW snapshot: the top level is copied at emit time, so a caller that\n * mutates its own payload object afterwards cannot rewrite history. Nested\n * objects are shared by reference — deep-freeze is not worth the cost in a\n * double, and no in-repo caller mutates nested request payloads.\n */\n payload: Record<string, unknown>;\n}\n\nexport interface FaultyTransportConfig {\n /**\n * The i-th request-channel emit applies `schedule[i % schedule.length]`.\n * Empty/omitted → every request delivers.\n */\n schedule?: readonly FaultAction[];\n /**\n * Synthesize the `response` value for a delivered reply. Return `undefined`\n * for a void ack (`{ correlationId }` only). Default: `{}` for every op.\n */\n makeResponse?: (operation: BusOperationKey, payload: Record<string, unknown>) => unknown;\n}\n\nfunction isOperation(channel: string): channel is BusOperationKey {\n return channel in BUS_OPERATIONS;\n}\n\n/** Stable request identity: channel + sorted payload minus per-issue fields. */\nexport function retryKeyOf(channel: string, payload: Record<string, unknown>): string {\n const entries = Object.entries(payload)\n .filter(([k]) => k !== 'correlationId' && k !== '_trace' && k !== '_userId')\n .sort(([a], [b]) => (a < b ? -1 : 1));\n return `${channel} ${JSON.stringify(entries)}`;\n}\n\nexport class FaultyTransport implements ITransport {\n readonly baseUrl: BaseUrl = makeBaseUrl('faulty://simulator');\n readonly state$ = new BehaviorSubject<ConnectionState>('open');\n private readonly errorsSubject = new Subject<SemiontError>();\n readonly errors$: Observable<SemiontError> = this.errorsSubject.asObservable();\n\n /** Every request-channel emit, in order — the L2 accounting surface. */\n readonly requestLog: RequestLogEntry[] = [];\n\n private readonly bus = new EventBus();\n private readonly schedule: readonly FaultAction[];\n private readonly makeResponse: (op: BusOperationKey, payload: Record<string, unknown>) => unknown;\n private readonly replyQueues = new Map<BusOperationKey, unknown[]>();\n private requestCount = 0;\n private readonly timers = new Set<ReturnType<typeof setTimeout>>();\n private disposed = false;\n\n constructor(cfg: FaultyTransportConfig = {}) {\n this.schedule = cfg.schedule ?? [];\n this.makeResponse = cfg.makeResponse ?? (() => ({}));\n }\n\n /**\n * Queue responses for `op`, consumed FIFO — one per request that reaches\n * the simulated gateway — before falling back to `makeResponse`\n * (SDK-TESTING-DOUBLE.md, gap 2). The queue scripts the GATEWAY; the fault\n * schedule scripts the WIRE. Consequences, deliberately: `duplicate-reply`\n * replays one entry's body twice, and a `drop-reply` still consumes its\n * entry (the gateway answered; the wire ate it) — so \"first reply lost,\n * the retry sees the NEXT page\" is expressible. `reject-emit` consumes\n * nothing: that request never reached the gateway.\n */\n queueReply(op: BusOperationKey, ...responses: unknown[]): void {\n const q = this.replyQueues.get(op) ?? [];\n q.push(...responses);\n this.replyQueues.set(op, q);\n }\n\n // ── Bus primitives ──────────────────────────────────────────────────────\n\n async emit<K extends keyof EventMap>(\n channel: K,\n payload: EventMap[K],\n resourceScope?: ResourceId,\n ): Promise<number> {\n // The double models exactly one connected participant, so a delivered\n // emit reports `1`; post-dispose it is inert and reports the `-1`\n // \"count unknown\" sentinel.\n if (this.disposed) return -1;\n const name = channel as string;\n if (!isOperation(name)) {\n // Non-request channel: forward as-is (scoped or global).\n const target = resourceScope === undefined\n ? this.bus.get(channel)\n : this.bus.scope(resourceScope as string).get(channel);\n target.next(payload);\n return 1;\n }\n\n const record = payload as Record<string, unknown>;\n const action: FaultAction = this.schedule.length === 0\n ? { kind: 'deliver' }\n : this.schedule[this.requestCount % this.schedule.length]!;\n this.requestCount += 1;\n this.requestLog.push({\n channel: name,\n action,\n correlationId: typeof record.correlationId === 'string' ? record.correlationId : undefined,\n retryKey: retryKeyOf(name, record),\n payload: { ...record },\n });\n\n if (action.kind === 'reject-emit') {\n // Models a /bus/emit 4xx: the request never reaches the bus.\n throw new Error(`FaultyTransport: emit rejected by schedule (reject-emit) on ${name}`);\n }\n\n // The request itself is observable (handlers-eye view), then the\n // simulator plays gateway: synthesize the registry reply per the action.\n this.bus.get(channel).next(payload);\n\n // The gateway's answer is computed ONCE per request that reaches it —\n // the reply QUEUE scripts the gateway, the fault schedule scripts the\n // wire (SDK-TESTING-DOUBLE.md Phase 2). So `duplicate-reply` replays the\n // same body twice, and a `drop-reply` still consumes its queue entry:\n // the gateway answered, the wire ate it.\n const queue = this.replyQueues.get(name);\n const response = queue && queue.length > 0 ? queue.shift() : this.makeResponse(name, record);\n\n const reply = (): void => {\n if (this.disposed) return;\n const replyPayload = response === undefined\n ? { correlationId: record.correlationId }\n : { correlationId: record.correlationId, response };\n const resultChannel = BUS_OPERATIONS[name].result as keyof EventMap;\n this.bus.get(resultChannel).next(replyPayload as EventMap[keyof EventMap]);\n };\n\n switch (action.kind) {\n case 'deliver':\n queueMicrotask(reply);\n break;\n case 'duplicate-reply':\n queueMicrotask(reply);\n queueMicrotask(reply);\n break;\n case 'delay': {\n const t = setTimeout(() => { this.timers.delete(t); reply(); }, action.ms);\n this.timers.add(t);\n break;\n }\n case 'drop-reply':\n break;\n }\n return 1;\n }\n\n on<K extends keyof EventMap>(channel: K, handler: (payload: EventMap[K]) => void): () => void {\n const sub = this.bus.get(channel).subscribe(handler);\n return () => sub.unsubscribe();\n }\n\n stream<K extends keyof EventMap>(channel: K): Observable<EventMap[K]> {\n return this.bus.get(channel);\n }\n\n subscribeToResource(_rid: ResourceId): () => void {\n // Mirrors the real HttpTransport: distinct scopes COMPOSE\n // (MULTI-RESOURCE-SCOPE). Delivery here is bus-direct and never\n // scope-gated, so acquisition needs no bookkeeping and release\n // (idempotent by construction) is a no-op.\n return () => {};\n }\n\n /**\n * Correlated-reply tracking (BUS-RESUMPTION.md Phase 2 / SDK-DEBT S1),\n * exposed for assertions: `busRequest` registers each cid here before its\n * emit and releases on settle, so a test can pin the tracked set at any\n * point of a request's lifecycle. Delivery in this double is bus-direct\n * (nothing to replay), so tracking has no behavioral effect.\n */\n readonly pendingReplies = new Set<string>();\n\n trackReply(correlationId: string): () => void {\n this.pendingReplies.add(correlationId);\n let released = false;\n return () => {\n if (released) return;\n released = true;\n this.pendingReplies.delete(correlationId);\n };\n }\n\n bridgeInto(bus: EventBus): void {\n for (const channel of BRIDGED_CHANNELS) {\n this.bus.get(channel as keyof EventMap).subscribe((payload) => {\n bus.get(channel as keyof EventMap).next(payload as EventMap[keyof EventMap]);\n });\n }\n }\n\n // ── Lifecycle ───────────────────────────────────────────────────────────\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n for (const t of this.timers) clearTimeout(t);\n this.timers.clear();\n this.state$.next('closed');\n this.state$.complete();\n this.errorsSubject.complete();\n // Completes every subject: in-flight busRequests resolve `bus.closed`.\n this.bus.destroy();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/faulty-transport.ts"],"names":[],"mappings":"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","file":"chunk-LAKUQM2K.js","sourcesContent":["/**\n * FaultyTransport — a seeded, scriptable `ITransport` simulator for the\n * liveness axioms (`.plans/LIVENESS-AXIOMS.md`). fast-check draws a fault\n * schedule; the transport applies one `FaultAction` per request-channel emit\n * and synthesizes replies from the `BUS_OPERATIONS` registry, so real\n * compositions (`busRequest`, SWR caches, live queries) run unmodified against\n * generated wire behavior no hand-written test names.\n *\n * Home is core (not sdk/test-utils) for the same reason as\n * `assertStateUnitAxioms`: it needs only core types, and every layer —\n * including `http-transport`, below sdk — can consume it via\n * `@semiont/core/testing` without a dependency cycle.\n *\n * Deterministic-by-construction: no `Date.now`, no randomness of its own —\n * all variation comes in through the schedule (fast-check owns the seed).\n * Time is real `setTimeout` at millisecond scale; properties pass a small\n * explicit `timeoutMs` to `busRequest`, so nothing waits 30 s.\n */\n\nimport { BehaviorSubject, Subject, type Observable } from 'rxjs';\nimport type { SemiontError } from './errors';\nimport type { BaseUrl } from './branded-types';\nimport { baseUrl as makeBaseUrl } from './branded-types';\nimport type { ResourceId } from './identifiers';\nimport type { EventMap } from './bus-protocol';\nimport type { ConnectionState, ITransport } from './transport';\nimport { EventBus } from './event-bus';\nimport { BRIDGED_CHANNELS } from './bridged-channels';\nimport { BUS_OPERATIONS, type BusOperationKey } from './bus-operations';\n\n/** One wire behavior, applied to a single request-channel emit. */\nexport type FaultAction =\n | { kind: 'deliver' }\n | { kind: 'drop-reply' }\n | { kind: 'delay'; ms: number }\n | { kind: 'duplicate-reply' }\n | { kind: 'reject-emit' };\n\n/** requestLog entry — one per request-channel emit, in arrival order. */\nexport interface RequestLogEntry {\n channel: BusOperationKey;\n /** The action the schedule assigned to this emit. */\n action: FaultAction;\n correlationId: string | undefined;\n /**\n * Request identity for retry accounting: channel + payload minus the\n * per-issue fields (`correlationId`, `_trace`, `_userId`). Two emits with\n * the same key are the same logical request re-issued.\n */\n retryKey: string;\n /**\n * The payload as emitted — envelope, options, params, `correlationId` and\n * all. This is the surface for \"assert what my orchestrator actually SENT\"\n * (SDK-TESTING-DOUBLE gap 6): without it every consumer harness re-invented\n * a per-channel `transport.on(...)` wire recorder alongside this log.\n *\n * SHALLOW snapshot: the top level is copied at emit time, so a caller that\n * mutates its own payload object afterwards cannot rewrite history. Nested\n * objects are shared by reference — deep-freeze is not worth the cost in a\n * double, and no in-repo caller mutates nested request payloads.\n */\n payload: Record<string, unknown>;\n}\n\nexport interface FaultyTransportConfig {\n /**\n * The i-th request-channel emit applies `schedule[i % schedule.length]`.\n * Empty/omitted → every request delivers.\n */\n schedule?: readonly FaultAction[];\n /**\n * Synthesize the `response` value for a delivered reply. Return `undefined`\n * for a void ack (`{ correlationId }` only). Default: `{}` for every op.\n */\n makeResponse?: (operation: BusOperationKey, payload: Record<string, unknown>) => unknown;\n}\n\nfunction isOperation(channel: string): channel is BusOperationKey {\n return channel in BUS_OPERATIONS;\n}\n\n/** Stable request identity: channel + sorted payload minus per-issue fields. */\nexport function retryKeyOf(channel: string, payload: Record<string, unknown>): string {\n const entries = Object.entries(payload)\n .filter(([k]) => k !== 'correlationId' && k !== '_trace' && k !== '_userId')\n .sort(([a], [b]) => (a < b ? -1 : 1));\n return `${channel} ${JSON.stringify(entries)}`;\n}\n\nexport class FaultyTransport implements ITransport {\n readonly baseUrl: BaseUrl = makeBaseUrl('faulty://simulator');\n readonly state$ = new BehaviorSubject<ConnectionState>('open');\n private readonly errorsSubject = new Subject<SemiontError>();\n readonly errors$: Observable<SemiontError> = this.errorsSubject.asObservable();\n\n /** Every request-channel emit, in order — the L2 accounting surface. */\n readonly requestLog: RequestLogEntry[] = [];\n\n private readonly bus = new EventBus();\n private readonly schedule: readonly FaultAction[];\n private readonly makeResponse: (op: BusOperationKey, payload: Record<string, unknown>) => unknown;\n private readonly replyQueues = new Map<BusOperationKey, unknown[]>();\n private requestCount = 0;\n private readonly timers = new Set<ReturnType<typeof setTimeout>>();\n private disposed = false;\n\n constructor(cfg: FaultyTransportConfig = {}) {\n this.schedule = cfg.schedule ?? [];\n this.makeResponse = cfg.makeResponse ?? (() => ({}));\n }\n\n /**\n * Queue responses for `op`, consumed FIFO — one per request that reaches\n * the simulated gateway — before falling back to `makeResponse`\n * (SDK-TESTING-DOUBLE.md, gap 2). The queue scripts the GATEWAY; the fault\n * schedule scripts the WIRE. Consequences, deliberately: `duplicate-reply`\n * replays one entry's body twice, and a `drop-reply` still consumes its\n * entry (the gateway answered; the wire ate it) — so \"first reply lost,\n * the retry sees the NEXT page\" is expressible. `reject-emit` consumes\n * nothing: that request never reached the gateway.\n */\n queueReply(op: BusOperationKey, ...responses: unknown[]): void {\n const q = this.replyQueues.get(op) ?? [];\n q.push(...responses);\n this.replyQueues.set(op, q);\n }\n\n // ── Bus primitives ──────────────────────────────────────────────────────\n\n async emit<K extends keyof EventMap>(\n channel: K,\n payload: EventMap[K],\n resourceScope?: ResourceId,\n ): Promise<number> {\n // The double models exactly one connected participant, so a delivered\n // emit reports `1`; post-dispose it is inert and reports the `-1`\n // \"count unknown\" sentinel.\n if (this.disposed) return -1;\n const name = channel as string;\n if (!isOperation(name)) {\n // Non-request channel: forward as-is (scoped or global).\n const target = resourceScope === undefined\n ? this.bus.get(channel)\n : this.bus.scope(resourceScope as string).get(channel);\n target.next(payload);\n return 1;\n }\n\n const record = payload as Record<string, unknown>;\n const action: FaultAction = this.schedule.length === 0\n ? { kind: 'deliver' }\n : this.schedule[this.requestCount % this.schedule.length]!;\n this.requestCount += 1;\n this.requestLog.push({\n channel: name,\n action,\n correlationId: typeof record.correlationId === 'string' ? record.correlationId : undefined,\n retryKey: retryKeyOf(name, record),\n payload: { ...record },\n });\n\n if (action.kind === 'reject-emit') {\n // Models a /bus/emit 4xx: the request never reaches the bus.\n throw new Error(`FaultyTransport: emit rejected by schedule (reject-emit) on ${name}`);\n }\n\n // The request itself is observable (handlers-eye view), then the\n // simulator plays gateway: synthesize the registry reply per the action.\n this.bus.get(channel).next(payload);\n\n // The gateway's answer is computed ONCE per request that reaches it —\n // the reply QUEUE scripts the gateway, the fault schedule scripts the\n // wire (SDK-TESTING-DOUBLE.md Phase 2). So `duplicate-reply` replays the\n // same body twice, and a `drop-reply` still consumes its queue entry:\n // the gateway answered, the wire ate it.\n const queue = this.replyQueues.get(name);\n const response = queue && queue.length > 0 ? queue.shift() : this.makeResponse(name, record);\n\n const reply = (): void => {\n if (this.disposed) return;\n const replyPayload = response === undefined\n ? { correlationId: record.correlationId }\n : { correlationId: record.correlationId, response };\n const resultChannel = BUS_OPERATIONS[name].result as keyof EventMap;\n this.bus.get(resultChannel).next(replyPayload as EventMap[keyof EventMap]);\n };\n\n switch (action.kind) {\n case 'deliver':\n queueMicrotask(reply);\n break;\n case 'duplicate-reply':\n queueMicrotask(reply);\n queueMicrotask(reply);\n break;\n case 'delay': {\n const t = setTimeout(() => { this.timers.delete(t); reply(); }, action.ms);\n this.timers.add(t);\n break;\n }\n case 'drop-reply':\n break;\n }\n return 1;\n }\n\n on<K extends keyof EventMap>(channel: K, handler: (payload: EventMap[K]) => void): () => void {\n const sub = this.bus.get(channel).subscribe(handler);\n return () => sub.unsubscribe();\n }\n\n stream<K extends keyof EventMap>(channel: K): Observable<EventMap[K]> {\n return this.bus.get(channel);\n }\n\n subscribeToResource(_rid: ResourceId): () => void {\n // Mirrors the real HttpTransport: distinct scopes COMPOSE\n // (MULTI-RESOURCE-SCOPE). Delivery here is bus-direct and never\n // scope-gated, so acquisition needs no bookkeeping and release\n // (idempotent by construction) is a no-op.\n return () => {};\n }\n\n /**\n * Correlated-reply tracking (BUS-RESUMPTION.md Phase 2 / SDK-DEBT S1),\n * exposed for assertions: `busRequest` registers each cid here before its\n * emit and releases on settle, so a test can pin the tracked set at any\n * point of a request's lifecycle. Delivery in this double is bus-direct\n * (nothing to replay), so tracking has no behavioral effect.\n */\n readonly pendingReplies = new Set<string>();\n\n trackReply(correlationId: string): () => void {\n this.pendingReplies.add(correlationId);\n let released = false;\n return () => {\n if (released) return;\n released = true;\n this.pendingReplies.delete(correlationId);\n };\n }\n\n bridgeInto(bus: EventBus): void {\n for (const channel of BRIDGED_CHANNELS) {\n this.bus.get(channel as keyof EventMap).subscribe((payload) => {\n bus.get(channel as keyof EventMap).next(payload as EventMap[keyof EventMap]);\n });\n }\n }\n\n // ── Lifecycle ───────────────────────────────────────────────────────────\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n for (const t of this.timers) clearTimeout(t);\n this.timers.clear();\n this.state$.next('closed');\n this.state$.complete();\n this.errorsSubject.complete();\n // Completes every subject: in-flight busRequests resolve `bus.closed`.\n this.bus.destroy();\n }\n}\n"]}
|
|
@@ -66,7 +66,6 @@ var BUS_OPERATIONS = {
|
|
|
66
66
|
// ── BROWSE (reads) ──────────────────────────────────────────────
|
|
67
67
|
"browse:resource-requested": { result: "browse:resource-result", failure: "browse:resource-failed" },
|
|
68
68
|
"browse:anchored-text-requested": { result: "browse:anchored-text-result", failure: "browse:anchored-text-failed" },
|
|
69
|
-
"browse:anchored-text-by-checksum-requested": { result: "browse:anchored-text-by-checksum-result", failure: "browse:anchored-text-by-checksum-failed" },
|
|
70
69
|
"browse:resources-requested": { result: "browse:resources-result", failure: "browse:resources-failed" },
|
|
71
70
|
"browse:annotation-requested": { result: "browse:annotation-result", failure: "browse:annotation-failed" },
|
|
72
71
|
"browse:annotations-requested": { result: "browse:annotations-result", failure: "browse:annotations-failed" },
|
|
@@ -355,5 +354,5 @@ var ScopedEventBus = class _ScopedEventBus {
|
|
|
355
354
|
};
|
|
356
355
|
|
|
357
356
|
export { BRIDGED_CHANNELS, BUS_OPERATIONS, EventBus, ScopedEventBus, accessToken, annotationUri, authCode, baseUrl, busLog, busLogEnabled, cloneToken, email, entityType, googleCredential, jobId, mcpToken, refreshToken, resourceAnnotationUri, resourceUri, searchQuery, setBusLogTraceIdProvider, userDID };
|
|
358
|
-
//# sourceMappingURL=chunk-
|
|
359
|
-
//# sourceMappingURL=chunk-
|
|
357
|
+
//# sourceMappingURL=chunk-W6N56PWO.js.map
|
|
358
|
+
//# sourceMappingURL=chunk-W6N56PWO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/branded-types.ts","../src/bus-operations.ts","../src/bridged-channels.ts","../src/bus-log.ts","../src/event-bus.ts"],"names":[],"mappings":";;;AA0CO,SAAS,MAAM,KAAA,EAAsB;AAAE,EAAA,OAAO,KAAA;AAAgB;AAC9D,SAAS,SAAS,KAAA,EAAyB;AAAE,EAAA,OAAO,KAAA;AAAmB;AACvE,SAAS,iBAAiB,KAAA,EAAiC;AAAE,EAAA,OAAO,KAAA;AAA2B;AAC/F,SAAS,YAAY,KAAA,EAA4B;AAAE,EAAA,OAAO,KAAA;AAAsB;AAChF,SAAS,aAAa,KAAA,EAA6B;AAAE,EAAA,OAAO,KAAA;AAAuB;AACnF,SAAS,SAAS,KAAA,EAAyB;AAAE,EAAA,OAAO,KAAA;AAAmB;AACvE,SAAS,WAAW,KAAA,EAA2B;AAAE,EAAA,OAAO,KAAA;AAAqB;AAC7E,SAAS,MAAM,KAAA,EAAsB;AAAE,EAAA,OAAO,KAAA;AAAgB;AAC9D,SAAS,QAAQ,KAAA,EAAwB;AAAE,EAAA,OAAO,KAAA;AAAkB;AACpE,SAAS,WAAW,KAAA,EAA2B;AAAE,EAAA,OAAO,KAAA;AAAqB;AAC7E,SAAS,YAAY,KAAA,EAA4B;AAAE,EAAA,OAAO,KAAA;AAAsB;AAChF,SAAS,QAAQ,KAAA,EAAwB;AAAE,EAAA,OAAO,KAAA;AAAkB;AAoBpE,SAAS,YAAY,GAAA,EAA0B;AACpD,EAAA,IAAI,CAAC,IAAI,UAAA,CAAW,SAAS,KAAK,CAAC,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAC7D,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,2BAAA,EAA8B,GAAG,CAAA,CAAE,CAAA;AAAA,EACzD;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,cAAc,GAAA,EAA4B;AACxD,EAAA,IAAI,CAAC,IAAI,UAAA,CAAW,SAAS,KAAK,CAAC,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAC7D,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,6BAAA,EAAgC,GAAG,CAAA,CAAE,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,sBAAsB,GAAA,EAAoC;AACxE,EAAA,IAAI,CAAC,IAAI,UAAA,CAAW,SAAS,KAAK,CAAC,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAC7D,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,qCAAA,EAAwC,GAAG,CAAA,CAAE,CAAA;AAAA,EACnE;AAEA,EAAA,IAAI,CAAC,IAAI,QAAA,CAAS,aAAa,KAAK,CAAC,GAAA,CAAI,QAAA,CAAS,eAAe,CAAA,EAAG;AAClE,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,mDAAA,EAAsD,GAAG,CAAA,CAAE,CAAA;AAAA,EACjF;AACA,EAAA,OAAO,GAAA;AACT;;;ACzDO,IAAM,cAAA,GAAiB;AAAA;AAAA,EAE5B,kBAAA,EAAuC,EAAE,MAAA,EAAQ,mBAAA,EAAkC,SAAS,yBAAA,EAA0B;AAAA;AAAA,EAGtH,2BAAA,EAAuC,EAAE,MAAA,EAAQ,wBAAA,EAAkC,SAAS,wBAAA,EAAyB;AAAA,EACrH,gCAAA,EAAuC,EAAE,MAAA,EAAQ,6BAAA,EAAkC,SAAS,6BAAA,EAA8B;AAAA,EAC1H,4BAAA,EAAuC,EAAE,MAAA,EAAQ,yBAAA,EAAkC,SAAS,yBAAA,EAA0B;AAAA,EACtH,6BAAA,EAAuC,EAAE,MAAA,EAAQ,0BAAA,EAAkC,SAAS,0BAAA,EAA2B;AAAA,EACvH,8BAAA,EAAuC,EAAE,MAAA,EAAQ,2BAAA,EAAkC,SAAS,2BAAA,EAA4B;AAAA,EACxH,qCAAA,EAAuC,EAAE,MAAA,EAAQ,kCAAA,EAAoC,SAAS,kCAAA,EAAmC;AAAA,EACjI,yBAAA,EAAuC,EAAE,MAAA,EAAQ,sBAAA,EAAkC,SAAS,sBAAA,EAAuB;AAAA,EACnH,gCAAA,EAAuC,EAAE,MAAA,EAAQ,6BAAA,EAAkC,SAAS,6BAAA,EAA8B;AAAA,EAC1H,+BAAA,EAAuC,EAAE,MAAA,EAAQ,4BAAA,EAAkC,SAAS,4BAAA,EAA6B;AAAA,EACzH,8BAAA,EAAuC,EAAE,MAAA,EAAQ,2BAAA,EAAkC,SAAS,2BAAA,EAA4B;AAAA,EACxH,yBAAA,EAAuC,EAAE,MAAA,EAAQ,sBAAA,EAAkC,SAAS,sBAAA,EAAuB;AAAA,EACnH,4BAAA,EAAuC,EAAE,MAAA,EAAQ,yBAAA,EAAkC,SAAS,yBAAA,EAA0B;AAAA;AAAA,EAEtH,qCAAA,EAAuC,EAAE,MAAA,EAAQ,kCAAA,EAAoC,SAAS,kCAAA,EAAmC;AAAA;AAAA,EAGjI,uBAAA,EAAuC,EAAE,MAAA,EAAQ,0BAAA,EAAkC,SAAS,8BAAA,EAA+B;AAAA,EAC3H,sBAAA,EAAuC,EAAE,MAAA,EAAQ,yBAAA,EAAkC,SAAS,6BAAA,EAA8B;AAAA;AAAA;AAAA,EAI1H,oBAAuC,EAAE,MAAA,EAAQ,mBAAkC,OAAA,EAAS,eAAA,EAAiB,UAAU,4BAAA,EAA6B;AAAA,EACpJ,2BAAA,EAAuC,EAAE,MAAA,EAAQ,0BAAA,EAAkC,SAAS,wBAAA,EAAyB;AAAA;AAAA,EAErH,0BAAA,EAAuC,EAAE,MAAA,EAAQ,uBAAA,EAAkC,SAAS,uBAAA,EAAwB;AAAA;AAAA,EAGpH,YAAA,EAAuC,EAAE,MAAA,EAAQ,aAAA,EAAkC,SAAS,mBAAA,EAAoB;AAAA,EAChH,sBAAA,EAAuC,EAAE,MAAA,EAAQ,mBAAA,EAAkC,SAAS,mBAAA,EAAoB;AAAA,EAChH,sBAAA,EAAuC,EAAE,MAAA,EAAQ,eAAA,EAAkC,SAAS,mBAAA,EAAoB;AAAA;AAAA,EAEhH,WAAA,EAAuC,EAAE,MAAA,EAAQ,aAAA,EAAkC,SAAS,kBAAA,EAAmB;AAAA;AAAA,EAG/G,qBAAA,EAAuC,EAAE,MAAA,EAAQ,gBAAA,EAAkC,SAAS,oBAAA,EAAqB;AAAA,EACjH,aAAA,EAAuC,EAAE,MAAA,EAAQ,gBAAA,EAAkC,SAAS,oBAAA,EAAqB;AAAA,EACjH,aAAA,EAAuC,EAAE,MAAA,EAAQ,gBAAA,EAAkC,SAAS,oBAAA,EAAqB;AAAA,EACjH,cAAA,EAAuC,EAAE,MAAA,EAAQ,iBAAA,EAAkC,SAAS,qBAAA,EAAsB;AAAA,EAClH,gBAAA,EAAuC,EAAE,MAAA,EAAQ,mBAAA,EAAkC,SAAS,uBAAA,EAAwB;AAAA,EACpH,0BAAA,EAAuC,EAAE,MAAA,EAAQ,6BAAA,EAAkC,SAAS,iCAAA,EAAkC;AAAA;AAAA;AAAA,EAI9H,wBAAA,EAAuC,EAAE,MAAA,EAAQ,sBAAA,EAAkC,SAAS,qBAAA,EAAsB;AAAA;AAAA;AAAA,EAIlH,eAAA,EAAuC,EAAE,MAAA,EAAQ,kBAAA,EAAkC,SAAS,sBAAA,EAAuB;AAAA;AAAA;AAAA,EAInH,uBAAA,EAAuC,EAAE,MAAA,EAAQ,0BAAA,EAAkC,SAAS,8BAAA,EAA+B;AAAA;AAAA;AAAA;AAAA,EAK3H,cAAA,EAAuC,EAAE,MAAA,EAAQ,iBAAA,EAAkC,SAAS,qBAAA,EAAsB;AAAA,EAClH,qBAAA,EAAuC,EAAE,MAAA,EAAQ,wBAAA,EAAkC,SAAS,4BAAA,EAA6B;AAAA;AAAA,EAEzH,cAAA,EAAuC,EAAE,MAAA,EAAQ,iBAAA,EAAkC,SAAS,qBAAA,EAAsB;AAAA,EAClH,oBAAA,EAAuC,EAAE,MAAA,EAAQ,qBAAA,EAAkC,SAAS,2BAAA,EAA4B;AAAA,EACxH,gCAAA,EAAuC,EAAE,MAAA,EAAQ,6BAAA,EAAkC,SAAS,6BAAA,EAA8B;AAAA,EAC1H,6BAAA,EAAuC,EAAE,MAAA,EAAQ,6BAAA,EAAkC,SAAS,0BAAA;AAC9F;;;AClEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,qBAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,yBAAA;AAAA,EACA,wBAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,sBAAA;AAAA,EACA,wBAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA;AAqBA,IAAM,gBAAA,GAAoB,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA,CAAsC,OAAA;AAAA,EACxF,CAAC,GAAA,KAAQ;AACP,IAAA,MAAM,EAAA,GAAK,eAAe,GAAG,CAAA;AAC7B,IAAA,OAAO,UAAA,IAAc,EAAA,GAAK,CAAC,EAAA,CAAG,QAAQ,EAAA,CAAG,OAAA,EAAS,EAAA,CAAG,QAAQ,CAAA,GAAI,CAAC,EAAA,CAAG,MAAA,EAAQ,GAAG,OAAO,CAAA;AAAA,EACzF;AACF,CAAA;AAEO,IAAM,gBAAA,GAA8C;AAAA,EACzD,GAAG,gBAAA;AAAA,EACH,GAAG;AACL;;;ACnEA,IAAM,eACJ,OAAO,OAAA,KAAY,eAAe,CAAC,CAAC,QAAQ,GAAA,EAAK,eAAA;AAEnD,IAAM,UACJ,OAAO,OAAA,KAAY,eAAe,CAAC,CAAC,QAAQ,QAAA,EAAU,IAAA;AAIjD,SAAS,aAAA,GAAyB;AACvC,EAAA,MAAM,CAAA,GAAI,UAAA;AACV,EAAA,IAAI,CAAA,CAAE,qBAAqB,OAAO,IAAA;AAClC,EAAA,OAAO,YAAA;AACT;AAcA,IAAI,eAAA;AAEG,SAAS,yBAAyB,EAAA,EAAkD;AACzF,EAAA,eAAA,GAAkB,EAAA;AACpB;AAEO,SAAS,MAAA,CACd,EAAA,EACA,OAAA,EACA,OAAA,EACA,KAAA,EACM;AACN,EAAA,IAAI,CAAC,eAAc,EAAG;AACtB,EAAA,MAAM,SAAU,OAAA,EAA4D,aAAA;AAC5E,EAAA,MAAM,GAAA,GAAM,OAAO,MAAA,KAAW,QAAA,GAAW,OAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,GAAI,MAAA;AAC9D,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,IAAI;AAAE,MAAA,OAAA,GAAU,eAAA,EAAgB;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAA,IAAa;AAAA,EAC1D;AACA,EAAA,MAAM,GAAA,GACJ,QAAQ,EAAE,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,IACrB,KAAA,GAAQ,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,GAAK,EAAA,CAAA,IAC5B,MAAM,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA,GAAK,EAAA,CAAA,IACtB,OAAA,GAAU,CAAA,OAAA,EAAU,QAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,GAAK,EAAA,CAAA;AAE/C,EAAA,OAAA,CAAQ,KAAA,CAAM,KAAK,OAAO,CAAA;AAC5B;AAcO,SAAS,4BAAA,GAAwC;AACtD,EAAA,OAAO,OAAA;AACT;AAIA,IAAM,qBAAA,uBAA4B,GAAA,EAAY;AAmBvC,SAAS,qBAAA,CACd,OAAA,EACA,OAAA,EACA,aAAA,EACM;AACN,EAAA,IAAI,gBAAgB,CAAA,EAAG;AACvB,EAAA,MAAM,SAAU,OAAA,EAA4D,aAAA;AAC5E,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,WAAW,CAAA,EAAG;AAQvD,EAAA,IAAK,gBAAA,CAAuC,QAAA,CAAS,OAAO,CAAA,EAAG;AAC/D,EAAA,IAAI,qBAAA,CAAsB,GAAA,CAAI,OAAO,CAAA,EAAG;AACxC,EAAA,qBAAA,CAAsB,IAAI,OAAO,CAAA;AAEjC,EAAA,OAAA,CAAQ,IAAA;AAAA,IACN,cAAc,OAAO,CAAA,KAAA,EAAQ,OAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,gZAAA;AAAA,GAKjD;AACF;ACjGO,IAAM,WAAN,MAAe;AAAA,EACZ,QAAA;AAAA,EACA,WAAA;AAAA,EAER,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAA,uBAAe,GAAA,EAAI;AACxB,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBA,IAA8B,SAAA,EAAoC;AAChE,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,MAAA,CAAO,SAAS,CAAC,CAAA,kBAAA,CAAoB,CAAA;AAAA,IAC/E;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,EAAG;AACjC,MAAA,MAAM,OAAA,GAAU,IAAI,OAAA,EAAqB;AAmBzC,MAAA,MAAM,aAAa,aAAA,EAAc;AACjC,MAAA,MAAM,gBAAgB,4BAAA,EAA6B;AACnD,MAAA,IAAI,cAAc,aAAA,EAAe;AAC/B,QAAA,MAAM,OAAA,GAAU,OAAA;AAChB,QAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAC9C,QAAA,OAAA,CAAQ,IAAA,GAAO,CAAC,KAAA,KAA6B;AAC3C,UAAA,IAAI,YAAY,MAAA,CAAO,MAAA,EAAQ,MAAA,CAAO,SAAS,GAAG,KAAe,CAAA;AACjE,UAAA,IAAI,aAAA,wBAAqC,MAAA,CAAO,SAAS,GAAG,KAAA,EAAO,OAAA,CAAQ,UAAU,MAAM,CAAA;AAC3F,UAAA,YAAA,CAAa,KAAK,CAAA;AAAA,QACpB,CAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAe,SAAA,EAAqD;AAClE,IAAA,OAAO,IAAA,CAAK,IAAI,SAA2B,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,gBAAA,GAA6B;AAC3B,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,OAAO,CAAA,IAAK,KAAK,QAAA,EAAU;AAC3C,MAAA,IAAI,QAAQ,QAAA,EAAU,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,QAAA,CAAS,MAAA,EAAO,EAAG;AAC5C,MAAA,OAAA,CAAQ,QAAA,EAAS;AAAA,IACnB;AAEA,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,MAAM,UAAA,EAAoC;AACxC,IAAA,OAAO,IAAI,cAAA,CAAe,IAAA,EAAM,UAAU,CAAA;AAAA,EAC5C;AACF;AAQO,IAAM,cAAA,GAAN,MAAM,eAAA,CAAe;AAAA,EAC1B,WAAA,CACU,QACA,WAAA,EACR;AAFQ,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EACP;AAAA,EAFO,MAAA;AAAA,EACA,WAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYV,IAA8B,KAAA,EAAgC;AAE5D,IAAA,MAAM,SAAA,GAAY,CAAA,EAAG,IAAA,CAAK,WAAW,IAAI,KAAe,CAAA,CAAA;AAGxD,IAAA,MAAM,cAAA,GAAkB,KAAK,MAAA,CAAe,QAAA;AAE5C,IAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA,EAAG;AAClC,MAAA,cAAA,CAAe,GAAA,CAAI,SAAA,EAAW,IAAI,OAAA,EAAsB,CAAA;AAAA,IAC1D;AACA,IAAA,OAAO,cAAA,CAAe,IAAI,SAAS,CAAA;AAAA,EACrC;AAAA;AAAA,EAGA,eAAe,SAAA,EAAqD;AAClE,IAAA,OAAO,IAAA,CAAK,IAAI,SAA2B,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,QAAA,EAAkC;AACtC,IAAA,OAAO,IAAI,gBAAe,IAAA,CAAK,MAAA,EAAQ,GAAG,IAAA,CAAK,WAAW,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,CAAA;AAAA,EAC1E;AACF","file":"chunk-W6N56PWO.js","sourcesContent":["/**\n * Branded string types for compile-time type safety\n *\n * These types are zero-cost at runtime but prevent mixing\n * different string types at compile time.\n */\n\nimport type { components } from './types';\n\n// ============================================================================\n// OPENAPI-GENERATED TYPES (use directly from spec)\n// ============================================================================\n\nexport type Motivation = components['schemas']['Motivation'];\nexport type ContentFormat = components['schemas']['ContentFormat'];\n\n// ============================================================================\n// AUTHENTICATION & TOKENS\n// ============================================================================\n\nexport type Email = string & { readonly __brand: 'Email' };\nexport type AuthCode = string & { readonly __brand: 'AuthCode' };\nexport type GoogleCredential = string & { readonly __brand: 'GoogleCredential' };\nexport type AccessToken = string & { readonly __brand: 'AccessToken' };\nexport type RefreshToken = string & { readonly __brand: 'RefreshToken' };\nexport type MCPToken = string & { readonly __brand: 'MCPToken' };\nexport type CloneToken = string & { readonly __brand: 'CloneToken' };\n\n// ============================================================================\n// SYSTEM IDENTIFIERS\n// ============================================================================\n\nexport type JobId = string & { readonly __brand: 'JobId' };\nexport type UserDID = string & { readonly __brand: 'UserDID' };\nexport type EntityType = string & { readonly __brand: 'EntityType' };\nexport type SearchQuery = string & { readonly __brand: 'SearchQuery' };\nexport type BaseUrl = string & { readonly __brand: 'BaseUrl' };\n\n// ============================================================================\n// HELPER FUNCTIONS (minimal validation, just branding)\n// ============================================================================\n\nexport function email(value: string): Email { return value as Email; }\nexport function authCode(value: string): AuthCode { return value as AuthCode; }\nexport function googleCredential(value: string): GoogleCredential { return value as GoogleCredential; }\nexport function accessToken(value: string): AccessToken { return value as AccessToken; }\nexport function refreshToken(value: string): RefreshToken { return value as RefreshToken; }\nexport function mcpToken(value: string): MCPToken { return value as MCPToken; }\nexport function cloneToken(value: string): CloneToken { return value as CloneToken; }\nexport function jobId(value: string): JobId { return value as JobId; }\nexport function userDID(value: string): UserDID { return value as UserDID; }\nexport function entityType(value: string): EntityType { return value as EntityType; }\nexport function searchQuery(value: string): SearchQuery { return value as SearchQuery; }\nexport function baseUrl(value: string): BaseUrl { return value as BaseUrl; }\n\n// Motivation is an OpenAPI enum — use its values directly, no helper needed.\n// ContentFormat is a free-form MIME string whose base type must be a\n// SupportedMediaType; validation lives in media-types.ts, not in a brand.\n\n// ============================================================================\n// HTTP URI TYPES\n// ============================================================================\n\n// Branded type definitions for HTTP URIs returned by the API\nexport type ResourceUri = string & { readonly __brand: 'ResourceUri' };\n\n// W3C flat format for content negotiation: http://localhost:4000/annotations/{id}\nexport type AnnotationUri = string & { readonly __brand: 'AnnotationUri' };\n\n// Nested format for CRUD operations: http://localhost:4000/resources/{resourceId}/annotations/{annotationId}\nexport type ResourceAnnotationUri = string & { readonly __brand: 'ResourceAnnotationUri' };\n\n// Factory functions with runtime validation\nexport function resourceUri(uri: string): ResourceUri {\n if (!uri.startsWith('http://') && !uri.startsWith('https://')) {\n throw new TypeError(`Expected ResourceUri, got: ${uri}`);\n }\n return uri as ResourceUri;\n}\n\nexport function annotationUri(uri: string): AnnotationUri {\n if (!uri.startsWith('http://') && !uri.startsWith('https://')) {\n throw new TypeError(`Expected AnnotationUri, got: ${uri}`);\n }\n return uri as AnnotationUri;\n}\n\nexport function resourceAnnotationUri(uri: string): ResourceAnnotationUri {\n if (!uri.startsWith('http://') && !uri.startsWith('https://')) {\n throw new TypeError(`Expected ResourceAnnotationUri, got: ${uri}`);\n }\n // Additional validation: must contain /resources/ and /annotations/\n if (!uri.includes('/resources/') || !uri.includes('/annotations/')) {\n throw new TypeError(`Expected nested ResourceAnnotationUri format, got: ${uri}`);\n }\n return uri as ResourceAnnotationUri;\n}\n","// ⚠ GENERATED FILE — do not edit.\n//\n// Authority: specs/src/bus/registry.json (channels, payloads, operations)\n// Regenerate: node scripts/bus/generate-ts.mjs\n// Go counterpart: node scripts/bus/generate-go.mjs → packages/sdk-go/bus\n//\n// Payload schemas themselves live in the OpenAPI components; the registry\n// names which one each channel carries. Add or change a channel THERE.\n\nimport type { EventName, EmittableChannel } from './bus-protocol';\n\n/**\n * BUS_OPERATIONS — the request/reply operations registry (Tier 1).\n *\n * Each entry declares ONE operation as the triple that was previously three\n * loose, independently-maintained facts spread across call sites:\n * - the request channel (the key — an `EmittableChannel`),\n * - the `result` channel (success reply),\n * - the `failure` channel,\n * - and, for a streaming op, an optional `progress` channel.\n *\n * `BridgedChannel` / `BRIDGED_CHANNELS` are DERIVED from this map\n * (bridged-channels.ts): every reply lands in the bridged fan-in set by\n * construction, so \"a reply channel forgotten from BRIDGED_CHANNELS\" — the\n * recurring bug class (gather:resource-complete, frame:*-add-failed) — is no\n * longer representable. See .plans/BUS-OPERATIONS-REGISTRY.md.\n *\n * `Partial<Record<EmittableChannel, …>>` enforces that every key is a real\n * emittable request. `result`/`failure`/`progress` stay `EventName` rather than\n * `BridgedChannel` to avoid a circular reference (BridgedChannel derives from\n * this map); the derivation closes the loop instead.\n */\nexport interface BusOperationSpec {\n result: EventName;\n failure: EventName;\n /** Streaming ops only: an intermediate channel that also bridges. */\n progress?: EventName;\n}\n\nexport const BUS_OPERATIONS = {\n // ── BIND ────────────────────────────────────────────────────────\n 'bind:update-body': { result: 'bind:body-updated', failure: 'bind:body-update-failed' },\n\n // ── BROWSE (reads) ──────────────────────────────────────────────\n 'browse:resource-requested': { result: 'browse:resource-result', failure: 'browse:resource-failed' },\n 'browse:anchored-text-requested': { result: 'browse:anchored-text-result', failure: 'browse:anchored-text-failed' },\n 'browse:resources-requested': { result: 'browse:resources-result', failure: 'browse:resources-failed' },\n 'browse:annotation-requested': { result: 'browse:annotation-result', failure: 'browse:annotation-failed' },\n 'browse:annotations-requested': { result: 'browse:annotations-result', failure: 'browse:annotations-failed' },\n 'browse:annotation-history-requested': { result: 'browse:annotation-history-result', failure: 'browse:annotation-history-failed' },\n 'browse:events-requested': { result: 'browse:events-result', failure: 'browse:events-failed' },\n 'browse:referenced-by-requested': { result: 'browse:referenced-by-result', failure: 'browse:referenced-by-failed' },\n 'browse:entity-types-requested': { result: 'browse:entity-types-result', failure: 'browse:entity-types-failed' },\n 'browse:tag-schemas-requested': { result: 'browse:tag-schemas-result', failure: 'browse:tag-schemas-failed' },\n 'browse:agents-requested': { result: 'browse:agents-result', failure: 'browse:agents-failed' },\n 'browse:directory-requested': { result: 'browse:directory-result', failure: 'browse:directory-failed' },\n // dormant — gateway handler complete, no client caller yet (annotation-detail capability)\n 'browse:annotation-context-requested': { result: 'browse:annotation-context-result', failure: 'browse:annotation-context-failed' },\n\n // ── FRAME (KB schema writes) ────────────────────────────────────\n 'frame:add-entity-type': { result: 'frame:entity-type-add-ok', failure: 'frame:entity-type-add-failed' },\n 'frame:add-tag-schema': { result: 'frame:tag-schema-add-ok', failure: 'frame:tag-schema-add-failed' },\n\n // ── GATHER ──────────────────────────────────────────────────────\n // streaming: take-1 result + failure plus an intermediate progress channel\n 'gather:requested': { result: 'gather:complete', failure: 'gather:failed', progress: 'gather:annotation-progress' },\n 'gather:resource-requested': { result: 'gather:resource-complete', failure: 'gather:resource-failed' },\n // dormant — gateway handler complete, no client caller yet (annotation summary)\n 'gather:summary-requested': { result: 'gather:summary-result', failure: 'gather:summary-failed' },\n\n // ── JOB ─────────────────────────────────────────────────────────\n 'job:create': { result: 'job:created', failure: 'job:create-failed' },\n 'job:status-requested': { result: 'job:status-result', failure: 'job:status-failed' },\n 'job:cancel-requested': { result: 'job:cancel-ok', failure: 'job:cancel-failed' },\n // worker-side: the worker claims a queued job (not an SDK call)\n 'job:claim': { result: 'job:claimed', failure: 'job:claim-failed' },\n\n // ── MARK ────────────────────────────────────────────────────────\n 'mark:create-request': { result: 'mark:create-ok', failure: 'mark:create-failed' },\n 'mark:commit': { result: 'mark:commit-ok', failure: 'mark:commit-failed' },\n 'mark:delete': { result: 'mark:delete-ok', failure: 'mark:delete-failed' },\n 'mark:archive': { result: 'mark:archive-ok', failure: 'mark:archive-failed' },\n 'mark:unarchive': { result: 'mark:unarchive-ok', failure: 'mark:unarchive-failed' },\n 'mark:update-entity-types': { result: 'mark:update-entity-types-ok', failure: 'mark:update-entity-types-failed' },\n\n // ── MATCH ───────────────────────────────────────────────────────\n // take-1 dressed as an Observable in the SDK; no progress channel\n 'match:search-requested': { result: 'match:search-results', failure: 'match:search-failed' },\n\n // ── WEAVE ───────────────────────────────────────────────────────\n // Graph-projection rebuild, served by the Weaver (WEAVER-ISOLATION D3)\n 'weave:rebuild': { result: 'weave:rebuild-ok', failure: 'weave:rebuild-failed' },\n\n // ── SMELT ────────────────────────────────────────────\n // Anchored-text rebuild, served by the Smelter (PERSIST-ANCHORS P0)\n 'smelt:rebuild-anchors': { result: 'smelt:rebuild-anchors-ok', failure: 'smelt:rebuild-anchors-failed' },\n\n // ── YIELD ───────────────────────────────────────────────────────\n // live in-process (resource-operations.ts emits + awaits via race()); the\n // client also .on()-subscribes -ok for cache invalidation\n 'yield:create': { result: 'yield:create-ok', failure: 'yield:create-failed' },\n 'yield:clone-persist': { result: 'yield:clone-persist-ok', failure: 'yield:clone-persist-failed' },\n // dormant — handler in stower exists, no request emitter; client pre-subscribes -ok\n 'yield:update': { result: 'yield:update-ok', failure: 'yield:update-failed' },\n 'yield:clone-create': { result: 'yield:clone-created', failure: 'yield:clone-create-failed' },\n 'yield:clone-resource-requested': { result: 'yield:clone-resource-result', failure: 'yield:clone-resource-failed' },\n 'yield:clone-token-requested': { result: 'yield:clone-token-generated', failure: 'yield:clone-token-failed' },\n} as const satisfies Partial<Record<EmittableChannel, BusOperationSpec>>;\n\n/** The request-channel key of a registered operation — what `busRequest` takes. */\nexport type BusOperationKey = keyof typeof BUS_OPERATIONS;\n","// ⚠ GENERATED FILE — do not edit.\n//\n// Authority: specs/src/bus/registry.json (channels, payloads, operations)\n// Regenerate: node scripts/bus/generate-ts.mjs\n// Go counterpart: node scripts/bus/generate-go.mjs → packages/sdk-go/bus\n//\n// Payload schemas themselves live in the OpenAPI components; the registry\n// names which one each channel carries. Add or change a channel THERE.\n\nimport type { EventName } from './bus-protocol';\nimport { BUS_OPERATIONS } from './bus-operations';\n\n/**\n * BRIDGED_CHANNELS\n *\n * The set of bus channels that any concrete transport bridges into the\n * caller-supplied bus via `bridgeInto`. Transport-neutral: every concrete\n * `ITransport` shares the same set; HTTP delivers them via SSE, in-process\n * transports forward them directly from the local actor bus.\n *\n * This is the *fan-in* set — channels for events the transport receives and\n * pushes onto the client's bus. It is not the same as the channels the client\n * emits (which is open-ended).\n *\n * It is DERIVED, not hand-listed: the request/reply replies come from\n * `BUS_OPERATIONS` (bus-operations.ts), so no operation's reply can be\n * forgotten here — that was the recurring unbridged-reply bug class. The only\n * hand-maintained part is `BRIDGED_BROADCASTS`: the genuine non-request/reply\n * minority (lifecycle events and UI/infra signals that no single requester\n * owns). See .plans/BUS-OPERATIONS-REGISTRY.md.\n *\n * Resource-scoped channels (joined/left via `subscribeToResource`) are tracked\n * separately by transports that care about scope (HTTP).\n */\n\n/**\n * Bridged channels with no owning operation: job-lifecycle events (multi-viewer,\n * no single requester owns the reply), KB-global frame domain events, UI signals,\n * and SSE infrastructure. A reply channel must NOT go here — declare its\n * operation in `BUS_OPERATIONS` instead.\n */\nexport const BRIDGED_BROADCASTS = [\n 'job:report-progress',\n 'job:complete',\n 'job:fail',\n 'frame:entity-type-added',\n 'frame:tag-schema-added',\n 'yield:created',\n 'yield:updated',\n 'yield:cloned',\n 'yield:moved',\n 'beckon:focus',\n 'beckon:sparkle',\n 'bus:resume-gap',\n 'browse:resource-open',\n 'browse:resource-viewed',\n 'session:joined',\n 'session:left',\n 'browse:click',\n] as const satisfies readonly EventName[];\n\n// ── Derivation ──────────────────────────────────────────────────────────────\n// Every operation's result + failure (+ progress) channel bridges, by\n// construction. Type and runtime are derived from the same `BUS_OPERATIONS`.\n\ntype OpSpecs = (typeof BUS_OPERATIONS)[keyof typeof BUS_OPERATIONS];\n\n// Generic wrapper so the conditional distributes over each union member (a bare\n// `OpSpecs extends …` would test the whole union at once and collapse to never\n// because only the streaming ops carry `progress`).\ntype ProgressChannel<O> = O extends { progress: infer P extends EventName } ? P : never;\n\n/** The union of every reply channel declared in the registry. */\ntype RegistryReply = OpSpecs['result'] | OpSpecs['failure'] | ProgressChannel<OpSpecs>;\n\n// Iterate by typed key so each op's literal reply types survive — the element\n// type stays `RegistryReply` (no widening to `EventName`), so the composed\n// array is `BridgedChannel[]` with no narrowing assertion. The runtime proof\n// that this derived set is exactly the intended one is the equality test in\n// __tests__/bus-invariants.test.ts.\nconst REGISTRY_REPLIES = (Object.keys(BUS_OPERATIONS) as (keyof typeof BUS_OPERATIONS)[]).flatMap(\n (key) => {\n const op = BUS_OPERATIONS[key];\n return 'progress' in op ? [op.result, op.failure, op.progress] : [op.result, op.failure];\n },\n);\n\nexport const BRIDGED_CHANNELS: readonly BridgedChannel[] = [\n ...REGISTRY_REPLIES,\n ...BRIDGED_BROADCASTS,\n];\n\n/**\n * The SUBSCRIBE-side subset of `EventName` — the channels a client can receive\n * over a concrete transport. See the family note on `EventName` in\n * bus-protocol.ts (emit on an `EmittableChannel`, subscribe on a `BridgedChannel`).\n */\nexport type BridgedChannel = RegistryReply | (typeof BRIDGED_BROADCASTS)[number];\n","/**\n * Bus logging — runtime-toggleable cross-wire visibility.\n *\n * One line per event that crosses a process boundary, in a grep-able\n * format that's symmetric across frontend and gateway:\n *\n * [bus EMIT] <channel> [scope=X] [cid=<first8>] <payload>\n * [bus RECV] <channel> [scope=X] [cid=<first8>] <payload>\n * [bus SSE] <channel> [scope=X] [cid=<first8>] <payload>\n *\n * Tier 1 of `.plans/OBSERVABILITY.md`. Forward-compatible with Tier 2:\n * the `cid` printed here is exactly the prefix of the W3C trace-id we\n * adopt later.\n *\n * Cost when disabled: one property read per call, zero allocations.\n *\n * Enable:\n * - Browser: `window.__SEMIONT_BUS_LOG__ = true` (DevTools or e2e init)\n * - Node: `SEMIONT_BUS_LOG=1` in the process env (read at module load)\n */\n\nimport { BRIDGED_CHANNELS } from './bridged-channels';\n\nconst NODE_BUS_LOG =\n typeof process !== 'undefined' && !!process.env?.SEMIONT_BUS_LOG;\n\nconst IS_NODE =\n typeof process !== 'undefined' && !!process.versions?.node;\n\nexport type BusOp = 'EMIT' | 'RECV' | 'SSE' | 'PUT' | 'GET';\n\nexport function busLogEnabled(): boolean {\n const g = globalThis as { __SEMIONT_BUS_LOG__?: boolean };\n if (g.__SEMIONT_BUS_LOG__) return true;\n return NODE_BUS_LOG;\n}\n\n/**\n * Optional active-span trace-id provider. When a Tier 2 OTel SDK is\n * initialized, `@semiont/observability` registers a provider here that\n * returns the active span's W3C `trace_id`. busLog appends it to each\n * emitted line so the grep-timeline correlates with the span tree in\n * an APM UI.\n *\n * Decoupling: `@semiont/core` does not depend on `@opentelemetry/api`.\n * If no provider is registered (Tier 1-only deployments, or before\n * `initObservabilityNode` runs), the field is omitted from the line —\n * same shape as before this hook existed.\n */\nlet traceIdProvider: (() => string | undefined) | undefined;\n\nexport function setBusLogTraceIdProvider(fn: (() => string | undefined) | undefined): void {\n traceIdProvider = fn;\n}\n\nexport function busLog(\n op: BusOp,\n channel: string,\n payload: unknown,\n scope?: string,\n): void {\n if (!busLogEnabled()) return;\n const cidRaw = (payload as { correlationId?: unknown } | null | undefined)?.correlationId;\n const cid = typeof cidRaw === 'string' ? cidRaw.slice(0, 8) : undefined;\n let traceId: string | undefined;\n if (traceIdProvider) {\n try { traceId = traceIdProvider(); } catch { /* noop */ }\n }\n const tag =\n `[bus ${op}] ${channel}` +\n (scope ? ` scope=${scope}` : '') +\n (cid ? ` cid=${cid}` : '') +\n (traceId ? ` trace=${traceId.slice(0, 8)}` : '');\n // eslint-disable-next-line no-console\n console.debug(tag, payload);\n}\n\n/**\n * Whether to run the unobserved-reply check on every local emit.\n *\n * On in Node (gateway + worker + smelter), where a dropped reply is a real\n * delivery bug; off in the browser, where a 0-observer bridged reply just\n * means the awaiting `busRequest` already resolved/timed out (benign).\n *\n * Always-on (no env flag) by design: the failure it catches is rare and\n * high-signal, and the whole point is that it fires with zero setup — the\n * incident that motivated it (.plans/bugs/gather-resource-complete-not-bridged.md)\n * ran with bus-logging off, so a flag-gated check would have stayed silent.\n */\nexport function warnUnobservedRepliesEnabled(): boolean {\n return IS_NODE;\n}\n\n/** One line per channel per process — a missing fan-in wiring is a config\n * bug, so the first dropped reply is enough; we don't spam on retries. */\nconst unobservedReplyWarned = new Set<string>();\n\n/**\n * The silent-dropped-reply detector.\n *\n * A correlation-bearing payload is a request/reply *reply* (`*-result`,\n * `*-complete`, `*-failed`, …). If one is emitted on the gateway bus with\n * **zero local observers**, nothing forwards it — no SSE subscription, no\n * in-process consumer — so the awaiting client never receives it and times\n * out 30 s later with no error logged anywhere. That is exactly how\n * `gather:resource-complete` failed when it was missing from\n * `BRIDGED_CHANNELS` (.plans/bugs/gather-resource-complete-not-bridged.md).\n *\n * Emits one WARN per channel naming the likely fix. Ignored (no warning):\n * non-reply emits (no `correlationId`), emits with observers, and — crucially —\n * channels already in `BRIDGED_CHANNELS`: a 0-observer emit there is a redundant\n * copy, not a gap (see .plans/bugs/BRIDGE-GAPS.md). So the detector fires only\n * for a genuine missing forwarder, and its remediation text is always correct.\n */\nexport function warnIfUnobservedReply(\n channel: string,\n payload: unknown,\n observerCount: number,\n): void {\n if (observerCount > 0) return;\n const cidRaw = (payload as { correlationId?: unknown } | null | undefined)?.correlationId;\n if (typeof cidRaw !== 'string' || cidRaw.length === 0) return;\n // A 0-observer emit on a *bridged* channel is a redundant copy (a global +\n // resource-scoped dual-emit, or an SSE reconnect replay), not a missing\n // forwarder — the first copy already reached the awaiting `take(1)`\n // subscriber. Only a NOT-bridged channel is a genuine drop. (`busRequest` now\n // types its reply channels `BridgedChannel`, so an unbridged reply is a\n // compile error; this runtime check covers non-`busRequest` correlation\n // emits.) See .plans/bugs/BRIDGE-GAPS.md.\n if ((BRIDGED_CHANNELS as readonly string[]).includes(channel)) return;\n if (unobservedReplyWarned.has(channel)) return;\n unobservedReplyWarned.add(channel);\n // eslint-disable-next-line no-console\n console.warn(\n `[bus DROP] ${channel} cid=${cidRaw.slice(0, 8)} emitted with 0 subscribers and not in ` +\n `BRIDGED_CHANNELS — a correlation reply with no forwarder is dropped, so the awaiting ` +\n `client times out (no error). Bridge it by declaring its operation in BUS_OPERATIONS ` +\n `(packages/core/src/bus-operations.ts) — or, if it is a non-reply broadcast, add it to ` +\n `BRIDGED_BROADCASTS (packages/core/src/bridged-channels.ts) — so transports subscribe to it.`,\n );\n}\n","/**\n * RxJS-based Event Bus\n *\n * Framework-agnostic event bus providing direct access to typed RxJS Subjects.\n *\n * Can be used in Node.js, browser, workers, CLI - anywhere RxJS runs.\n */\n\nimport { Subject } from 'rxjs';\nimport { busLog, busLogEnabled, warnIfUnobservedReply, warnUnobservedRepliesEnabled } from './bus-log';\nimport type { EventMap } from './bus-protocol';\nimport type { StoredEvent } from './event-base';\nimport type { PersistedEventType } from './persisted-events';\n\n/**\n * RxJS-based event bus\n *\n * Provides direct access to RxJS Subjects for each event type.\n * Use standard RxJS patterns for emitting and subscribing.\n *\n * @example\n * ```typescript\n * const eventBus = new EventBus();\n *\n * // Emit events\n * eventBus.get('beckon:hover').next({ annotationId: 'ann-1' });\n *\n * // Subscribe to events\n * const subscription = eventBus.get('beckon:hover').subscribe(({ annotationId }) => {\n * console.log('Hover:', annotationId);\n * });\n *\n * // Use RxJS operators\n * import { debounceTime } from 'rxjs/operators';\n * eventBus.get('beckon:hover')\n * .pipe(debounceTime(100))\n * .subscribe(handleHover);\n *\n * // Cleanup\n * subscription.unsubscribe();\n * eventBus.destroy();\n * ```\n */\nexport class EventBus {\n private subjects: Map<keyof EventMap, Subject<any>>;\n private isDestroyed: boolean;\n\n constructor() {\n this.subjects = new Map();\n this.isDestroyed = false;\n }\n\n /**\n * Get the RxJS Subject for an event\n *\n * Returns a typed Subject that can be used with all RxJS operators.\n * Subjects are created lazily on first access.\n *\n * @param eventName - The event name\n * @returns The RxJS Subject for this event\n *\n * @example\n * ```typescript\n * // Emit\n * eventBus.get('beckon:hover').next({ annotationId: 'ann-1' });\n *\n * // Subscribe\n * const sub = eventBus.get('beckon:hover').subscribe(handleHover);\n *\n * // With operators\n * eventBus.get('beckon:hover')\n * .pipe(debounceTime(100), distinctUntilChanged())\n * .subscribe(handleHover);\n * ```\n */\n get<K extends keyof EventMap>(eventName: K): Subject<EventMap[K]> {\n if (this.isDestroyed) {\n throw new Error(`Cannot access event '${String(eventName)}' on destroyed bus`);\n }\n\n if (!this.subjects.has(eventName)) {\n const subject = new Subject<EventMap[K]>();\n // When bus-log is enabled (`SEMIONT_BUS_LOG=1` or\n // `window.__SEMIONT_BUS_LOG__ = true`), wrap `.next()` so every\n // local emit on this channel produces a `[bus EMIT] <channel> ...`\n // line on `console.debug` — same shape as cross-wire emits from\n // HttpTransport. This is what makes local-only fan-out signals\n // (`beckon.hover`, `beckon.sparkle`, `mark.request`, etc.)\n // visible to the e2e bus capture and to a developer's DevTools.\n // The `busLogEnabled()` check is at first-`get` time per channel;\n // setting the flag after channels are constructed won't\n // retroactively wrap them. The bus capture fixture uses\n // `addInitScript` so the flag is set before any namespace\n // construction, which is when `get()` is first called.\n //\n // Independently, on Node we wrap `.next()` to catch *dropped replies*:\n // a correlation-bearing payload emitted with zero observers (see\n // `warnIfUnobservedReply`). This needs no flag — it's how the\n // `gather:resource-complete` bridge gap stayed invisible until a 30 s\n // timeout. The two wraps share one closure when both are active.\n const wantBusLog = busLogEnabled();\n const wantDropCheck = warnUnobservedRepliesEnabled();\n if (wantBusLog || wantDropCheck) {\n const wrapped = subject;\n const originalNext = subject.next.bind(subject);\n subject.next = (value: EventMap[K]): void => {\n if (wantBusLog) busLog('EMIT', String(eventName), value as object);\n if (wantDropCheck) warnIfUnobservedReply(String(eventName), value, wrapped.observers.length);\n originalNext(value);\n };\n }\n this.subjects.set(eventName, subject);\n }\n return this.subjects.get(eventName)!;\n }\n\n /**\n * Get the RxJS Subject for a domain event type (PersistedEventType).\n *\n * Domain event channels carry `StoredEvent`. This method avoids the need\n * for `as keyof EventMap` casts when subscribing to domain event channels\n * using runtime `PersistedEventType` strings.\n */\n getDomainEvent(eventType: PersistedEventType): Subject<StoredEvent> {\n return this.get(eventType as keyof EventMap) as unknown as Subject<StoredEvent>;\n }\n\n /**\n * Channel names with at least one live observer right now. Introspection\n * for composition-parity gates: `get()` creates subjects lazily, so mere\n * access does not count — only real subscriptions do. Scoped channels\n * appear under their namespaced key (`<scope>:<channel>`).\n */\n observedChannels(): string[] {\n const out: string[] = [];\n for (const [name, subject] of this.subjects) {\n if (subject.observed) out.push(String(name));\n }\n return out;\n }\n\n /**\n * Destroy the event bus and complete all subjects\n *\n * After calling destroy(), no new events can be emitted or subscribed to.\n * All active subscriptions will be completed.\n */\n destroy(): void {\n if (this.isDestroyed) {\n return;\n }\n\n for (const subject of this.subjects.values()) {\n subject.complete();\n }\n\n this.subjects.clear();\n this.isDestroyed = true;\n }\n\n /**\n * Check if the event bus has been destroyed\n */\n get destroyed(): boolean {\n return this.isDestroyed;\n }\n\n /**\n * Create a resource-scoped event bus\n *\n * Events emitted or subscribed through the scoped bus are isolated to that resource.\n * Internally, events are namespaced but the API remains identical to the parent bus.\n *\n * @param resourceId - Resource identifier to scope events to\n * @returns A scoped event bus for this resource\n *\n * @example\n * ```typescript\n * const eventBus = new EventBus();\n * const resource1 = eventBus.scope('resource-1');\n * const resource2 = eventBus.scope('resource-2');\n *\n * // These are isolated - only resource1 subscribers will fire\n * resource1.get('detection:progress').next({ status: 'started' });\n * ```\n */\n scope(resourceId: string): ScopedEventBus {\n return new ScopedEventBus(this, resourceId);\n }\n}\n\n/**\n * Resource-scoped event bus\n *\n * Provides isolated event streams per resource while maintaining the same API\n * as the parent EventBus. Events are internally namespaced by resourceId.\n */\nexport class ScopedEventBus {\n constructor(\n private parent: EventBus,\n private scopePrefix: string\n ) {}\n\n /**\n * Get the RxJS Subject for a scoped event\n *\n * Returns the same type as the parent bus, but events are isolated to this scope.\n * Internally uses namespaced keys but preserves type safety.\n *\n * @param event - The event name\n * @returns The RxJS Subject for this scoped event\n */\n get<E extends keyof EventMap>(event: E): Subject<EventMap[E]> {\n // Internally namespace the event key, but preserve return type\n const scopedKey = `${this.scopePrefix}:${event as string}`;\n\n // Access parent's subjects map directly (needs cast for private access)\n const parentSubjects = (this.parent as any).subjects as Map<string, Subject<any>>;\n\n if (!parentSubjects.has(scopedKey)) {\n parentSubjects.set(scopedKey, new Subject<EventMap[E]>());\n }\n return parentSubjects.get(scopedKey)!;\n }\n\n /** Get the RxJS Subject for a domain event type on this scoped bus. */\n getDomainEvent(eventType: PersistedEventType): Subject<StoredEvent> {\n return this.get(eventType as keyof EventMap) as unknown as Subject<StoredEvent>;\n }\n\n /**\n * Create a nested scope\n *\n * Allows hierarchical scoping like `resource-1:subsystem-a`\n *\n * @param subScope - Additional scope level\n * @returns A nested scoped event bus\n */\n scope(subScope: string): ScopedEventBus {\n return new ScopedEventBus(this.parent, `${this.scopePrefix}:${subScope}`);\n }\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1538,7 +1538,12 @@ interface components {
|
|
|
1538
1538
|
body?: components["schemas"]["AnnotationBody"] | components["schemas"]["AnnotationBody"][];
|
|
1539
1539
|
/** @description Web Annotation creator — the entity that initiated the annotation. For human-driven work this is a Person; for autonomous-agent work this is a Software peer. */
|
|
1540
1540
|
creator?: components["schemas"]["Agent"];
|
|
1541
|
-
|
|
1541
|
+
/**
|
|
1542
|
+
* Format: date-time
|
|
1543
|
+
* @description When the annotation was MADE — the authoring moment, carried from the event that created it. Not when a projection happened to write it: a store that rebuilds from the log must preserve this value, never restamp it.
|
|
1544
|
+
*/
|
|
1545
|
+
created: string;
|
|
1546
|
+
/** Format: date-time */
|
|
1542
1547
|
modified?: string;
|
|
1543
1548
|
/** @description Web Annotation generator — the SoftwareAgent that produced the annotation, when software was involved. Absent for purely manual annotations. Single object is the common case; array supports pipelines that combine multiple software peers. */
|
|
1544
1549
|
generator?: components["schemas"]["Agent"] | components["schemas"]["Agent"][];
|
|
@@ -1846,15 +1851,36 @@ interface components {
|
|
|
1846
1851
|
correlationId: string;
|
|
1847
1852
|
resourceId: string;
|
|
1848
1853
|
};
|
|
1849
|
-
/** @description A resource's
|
|
1854
|
+
/** @description A resource's coordinate map, a stored decline, or a named reason there is none (SMELTER-OWNS-OCR P1). Never null: absence used to be a bare null covering four different facts — barrier expired, settled-skipped, no content identity, fold disposed — two of which a caller should retry and two of which it should not. */
|
|
1850
1855
|
BrowseAnchoredTextResult: {
|
|
1851
1856
|
correlationId: string;
|
|
1852
|
-
response:
|
|
1857
|
+
response: components["schemas"]["AnchoredTextAnswer"];
|
|
1853
1858
|
};
|
|
1854
|
-
/**
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1859
|
+
/**
|
|
1860
|
+
* @description What a reader gets when it asks for a resource's coordinate map: the map, a stored decline, or a named absence.
|
|
1861
|
+
*
|
|
1862
|
+
* Distinct from `ExtractionOutcome` on purpose. That type is what the STORE holds and what an extractor RETURNS — neither of which can ever be 'not yet'. This is the read answer, which can, so widening ExtractionOutcome itself would have put an impossible state into the store's own type.
|
|
1863
|
+
*
|
|
1864
|
+
* Flat, one discriminant: every member carries `kind`, rather than nesting an outcome inside a status envelope and giving the wire two `kind` fields at different depths.
|
|
1865
|
+
*/
|
|
1866
|
+
AnchoredTextAnswer: components["schemas"]["ExtractedText"] | components["schemas"]["ExtractionDeclined"] | components["schemas"]["AnchoredTextAbsent"];
|
|
1867
|
+
/**
|
|
1868
|
+
* @description There is no coordinate map to serve, and WHY — the distinction a bare null could not carry (SMELTER-OWNS-OCR P1).
|
|
1869
|
+
*
|
|
1870
|
+
* One member covers all three absences because none carries a payload; `kind` alone is the fact. Retryability is legible from the name, deliberately: a caller must not need a lookup table to decide whether to come back.
|
|
1871
|
+
*/
|
|
1872
|
+
AnchoredTextAbsent: {
|
|
1873
|
+
/**
|
|
1874
|
+
* @description Discriminant, sharing the `kind` field with the ExtractedText/ExtractionDeclined members so the whole answer is one flat union (D6).
|
|
1875
|
+
*
|
|
1876
|
+
* `not-yet` — the Smelter has not settled this content generation: the settle barrier expired, the progress fold was disposed, or it settled indexed and the artifact is missing (the reconcile planner's third drift class, which heals). RETRY.
|
|
1877
|
+
*
|
|
1878
|
+
* `no-map` — the Smelter settled this resource as skipped: its media type derives no geometry, so a map will never exist. TERMINAL.
|
|
1879
|
+
*
|
|
1880
|
+
* `unknown` — no content identity to look up: the resource is not in the view store, or its primary representation carries no checksum. TERMINAL. (enum property replaced by openapi-typescript)
|
|
1881
|
+
* @enum {string}
|
|
1882
|
+
*/
|
|
1883
|
+
kind: "not-yet" | "no-map" | "unknown";
|
|
1858
1884
|
};
|
|
1859
1885
|
/** @description Request to browse a single resource */
|
|
1860
1886
|
BrowseResourceRequest: {
|
|
@@ -3812,6 +3838,7 @@ interface CreateAnnotationInternal {
|
|
|
3812
3838
|
target: Annotation['target'];
|
|
3813
3839
|
body?: Annotation['body'];
|
|
3814
3840
|
creator: components['schemas']['Agent'];
|
|
3841
|
+
created: Annotation['created'];
|
|
3815
3842
|
}
|
|
3816
3843
|
|
|
3817
3844
|
/**
|
|
@@ -4217,21 +4244,10 @@ type EventMap = {
|
|
|
4217
4244
|
correlationId: string;
|
|
4218
4245
|
} & components['schemas']['CommandError'];
|
|
4219
4246
|
'browse:anchored-text-requested': components['schemas']['BrowseAnchoredTextRequest'];
|
|
4220
|
-
'browse:anchored-text-result':
|
|
4221
|
-
correlationId: string;
|
|
4222
|
-
response: components['schemas']['ExtractionOutcome'] | null;
|
|
4223
|
-
};
|
|
4247
|
+
'browse:anchored-text-result': components['schemas']['BrowseAnchoredTextResult'];
|
|
4224
4248
|
'browse:anchored-text-failed': {
|
|
4225
4249
|
correlationId: string;
|
|
4226
4250
|
} & components['schemas']['CommandError'];
|
|
4227
|
-
'browse:anchored-text-by-checksum-requested': components['schemas']['BrowseAnchoredTextByChecksumRequest'];
|
|
4228
|
-
'browse:anchored-text-by-checksum-result': {
|
|
4229
|
-
correlationId: string;
|
|
4230
|
-
response: components['schemas']['ExtractionOutcome'] | null;
|
|
4231
|
-
};
|
|
4232
|
-
'browse:anchored-text-by-checksum-failed': {
|
|
4233
|
-
correlationId: string;
|
|
4234
|
-
} & components['schemas']['CommandError'];
|
|
4235
4251
|
'browse:resources-requested': components['schemas']['BrowseResourcesRequest'];
|
|
4236
4252
|
'browse:resources-result': {
|
|
4237
4253
|
correlationId: string;
|
|
@@ -4592,9 +4608,6 @@ declare const CHANNEL_SCHEMAS: {
|
|
|
4592
4608
|
readonly 'browse:anchored-text-requested': "BrowseAnchoredTextRequest";
|
|
4593
4609
|
readonly 'browse:anchored-text-result': "BrowseAnchoredTextResult";
|
|
4594
4610
|
readonly 'browse:anchored-text-failed': null;
|
|
4595
|
-
readonly 'browse:anchored-text-by-checksum-requested': "BrowseAnchoredTextByChecksumRequest";
|
|
4596
|
-
readonly 'browse:anchored-text-by-checksum-result': "BrowseAnchoredTextResult";
|
|
4597
|
-
readonly 'browse:anchored-text-by-checksum-failed': null;
|
|
4598
4611
|
readonly 'browse:resources-requested': "BrowseResourcesRequest";
|
|
4599
4612
|
readonly 'browse:resources-result': "BrowseResourcesResult";
|
|
4600
4613
|
readonly 'browse:resources-failed': null;
|
|
@@ -5445,6 +5458,15 @@ interface AnchoredText {
|
|
|
5445
5458
|
* the generated spec type so the wire shape has exactly one authority.
|
|
5446
5459
|
*/
|
|
5447
5460
|
type ExtractionOutcome = components['schemas']['ExtractionOutcome'];
|
|
5461
|
+
/**
|
|
5462
|
+
* What a READER gets when it asks for a resource's map: the map, a stored
|
|
5463
|
+
* decline, or a named absence (SMELTER-OWNS-OCR P1).
|
|
5464
|
+
*
|
|
5465
|
+
* Deliberately wider than `ExtractionOutcome`, which is what the store HOLDS and
|
|
5466
|
+
* what an extractor RETURNS — neither of which can ever be "not yet". Widening
|
|
5467
|
+
* that type instead would have put an impossible state into the store's own.
|
|
5468
|
+
*/
|
|
5469
|
+
type AnchoredTextAnswer = components['schemas']['AnchoredTextAnswer'];
|
|
5448
5470
|
/**
|
|
5449
5471
|
* One text run as pdf.js reports it, narrowed to the fields anchoring reads.
|
|
5450
5472
|
* Structural on purpose: core takes no dependency on pdfjs-dist, so each
|
|
@@ -6016,10 +6038,6 @@ declare const BUS_OPERATIONS: {
|
|
|
6016
6038
|
readonly result: "browse:anchored-text-result";
|
|
6017
6039
|
readonly failure: "browse:anchored-text-failed";
|
|
6018
6040
|
};
|
|
6019
|
-
readonly 'browse:anchored-text-by-checksum-requested': {
|
|
6020
|
-
readonly result: "browse:anchored-text-by-checksum-result";
|
|
6021
|
-
readonly failure: "browse:anchored-text-by-checksum-failed";
|
|
6022
|
-
};
|
|
6023
6041
|
readonly 'browse:resources-requested': {
|
|
6024
6042
|
readonly result: "browse:resources-result";
|
|
6025
6043
|
readonly failure: "browse:resources-failed";
|
|
@@ -6706,8 +6724,11 @@ declare function isValidEmail(email: string): boolean;
|
|
|
6706
6724
|
* - `render` — which viewer the UI mounts ('none' → metadata + download)
|
|
6707
6725
|
* - `anchoring` — which annotation model applies: character-offset text
|
|
6708
6726
|
* selectors vs spatial geometry (PDFs are spatial)
|
|
6709
|
-
* - `
|
|
6710
|
-
* embedding, never
|
|
6727
|
+
* - `textSource` — WHERE a type's text comes from: decoded from its own bytes,
|
|
6728
|
+
* or derived by reading them ('none' → skip embedding, never
|
|
6729
|
+
* mojibake). Named `extractText` until READ-VS-EXTRACT P3,
|
|
6730
|
+
* which called decoding an extraction — the conflation that
|
|
6731
|
+
* let a worker OCR PDFs for four months (#739)
|
|
6711
6732
|
* - `authorable` — offered in the compose editor's format dropdown
|
|
6712
6733
|
* - `uploadable` — big tent: true for every registry member
|
|
6713
6734
|
* - `generatable` — the generation worker can produce it as a yield artifact
|
|
@@ -6730,7 +6751,7 @@ declare function isValidEmail(email: string): boolean;
|
|
|
6730
6751
|
type SupportedMediaType = components['schemas']['SupportedMediaType'];
|
|
6731
6752
|
type RenderMode = 'text' | 'image' | 'pdf' | 'none';
|
|
6732
6753
|
type AnchoringModel = 'text-selector' | 'spatial' | 'none';
|
|
6733
|
-
type
|
|
6754
|
+
type TextSource = 'decode' | 'pdf-text-layer' | 'none';
|
|
6734
6755
|
interface MediaTypeCapabilities {
|
|
6735
6756
|
/** Canonical file extension, with leading dot. */
|
|
6736
6757
|
extension: `.${string}`;
|
|
@@ -6738,7 +6759,7 @@ interface MediaTypeCapabilities {
|
|
|
6738
6759
|
label: string;
|
|
6739
6760
|
render: RenderMode;
|
|
6740
6761
|
anchoring: AnchoringModel;
|
|
6741
|
-
|
|
6762
|
+
textSource: TextSource;
|
|
6742
6763
|
authorable: boolean;
|
|
6743
6764
|
uploadable: boolean;
|
|
6744
6765
|
/** Whether the generation worker can produce this type as a yield artifact.
|
|
@@ -6761,7 +6782,7 @@ declare const MEDIA_TYPES: {
|
|
|
6761
6782
|
label: string;
|
|
6762
6783
|
render: "text";
|
|
6763
6784
|
anchoring: "text-selector";
|
|
6764
|
-
|
|
6785
|
+
textSource: "decode";
|
|
6765
6786
|
authorable: true;
|
|
6766
6787
|
uploadable: true;
|
|
6767
6788
|
generatable: true;
|
|
@@ -6771,7 +6792,7 @@ declare const MEDIA_TYPES: {
|
|
|
6771
6792
|
label: string;
|
|
6772
6793
|
render: "text";
|
|
6773
6794
|
anchoring: "text-selector";
|
|
6774
|
-
|
|
6795
|
+
textSource: "decode";
|
|
6775
6796
|
authorable: true;
|
|
6776
6797
|
uploadable: true;
|
|
6777
6798
|
generatable: true;
|
|
@@ -6781,7 +6802,7 @@ declare const MEDIA_TYPES: {
|
|
|
6781
6802
|
label: string;
|
|
6782
6803
|
render: "text";
|
|
6783
6804
|
anchoring: "text-selector";
|
|
6784
|
-
|
|
6805
|
+
textSource: "decode";
|
|
6785
6806
|
authorable: true;
|
|
6786
6807
|
uploadable: true;
|
|
6787
6808
|
generatable: false;
|
|
@@ -6791,7 +6812,7 @@ declare const MEDIA_TYPES: {
|
|
|
6791
6812
|
label: string;
|
|
6792
6813
|
render: "text";
|
|
6793
6814
|
anchoring: "text-selector";
|
|
6794
|
-
|
|
6815
|
+
textSource: "decode";
|
|
6795
6816
|
authorable: false;
|
|
6796
6817
|
uploadable: true;
|
|
6797
6818
|
generatable: false;
|
|
@@ -6801,7 +6822,7 @@ declare const MEDIA_TYPES: {
|
|
|
6801
6822
|
label: string;
|
|
6802
6823
|
render: "image";
|
|
6803
6824
|
anchoring: "spatial";
|
|
6804
|
-
|
|
6825
|
+
textSource: "none";
|
|
6805
6826
|
authorable: false;
|
|
6806
6827
|
uploadable: true;
|
|
6807
6828
|
generatable: false;
|
|
@@ -6811,7 +6832,7 @@ declare const MEDIA_TYPES: {
|
|
|
6811
6832
|
label: string;
|
|
6812
6833
|
render: "image";
|
|
6813
6834
|
anchoring: "spatial";
|
|
6814
|
-
|
|
6835
|
+
textSource: "none";
|
|
6815
6836
|
authorable: false;
|
|
6816
6837
|
uploadable: true;
|
|
6817
6838
|
generatable: false;
|
|
@@ -6821,7 +6842,7 @@ declare const MEDIA_TYPES: {
|
|
|
6821
6842
|
label: string;
|
|
6822
6843
|
render: "pdf";
|
|
6823
6844
|
anchoring: "spatial";
|
|
6824
|
-
|
|
6845
|
+
textSource: "pdf-text-layer";
|
|
6825
6846
|
authorable: false;
|
|
6826
6847
|
uploadable: true;
|
|
6827
6848
|
generatable: true;
|
|
@@ -6919,29 +6940,56 @@ declare function extensionForMediaType(format: string): string;
|
|
|
6919
6940
|
*/
|
|
6920
6941
|
declare function mediaTypeForExtension(ext: string): SupportedMediaType | undefined;
|
|
6921
6942
|
/**
|
|
6922
|
-
*
|
|
6923
|
-
*
|
|
6924
|
-
*
|
|
6925
|
-
*
|
|
6943
|
+
* WHERE a format's text comes from. Registry rows answer directly; on a registry
|
|
6944
|
+
* miss, base types under text/* decode (RFC 2046 guarantees the text top-level
|
|
6945
|
+
* type is textual — imported unregistered text subtypes embed too), everything
|
|
6946
|
+
* else is 'none'.
|
|
6947
|
+
*
|
|
6948
|
+
* The three answers are different operations, not degrees of one: `decode` is a
|
|
6949
|
+
* pure charset-aware `Buffer → string` anyone holding bytes may run;
|
|
6950
|
+
* `pdf-text-layer` parses and, failing that, OCRs — expensive, not deterministic
|
|
6951
|
+
* across engine versions, and runnable only by the process that persists its
|
|
6952
|
+
* output. Calling both "extraction" is what this accessor was named for until
|
|
6953
|
+
* READ-VS-EXTRACT P3.
|
|
6954
|
+
*/
|
|
6955
|
+
declare function textSourceOf(format: string): TextSource;
|
|
6956
|
+
/**
|
|
6957
|
+
* WHETHER a type's extracted text carries geometry — page-positioned runs
|
|
6958
|
+
* rather than a bare string. Answers "should an anchored-text artifact exist
|
|
6959
|
+
* for this resource?" (PERSIST-ANCHORS P0, the third drift class) and "does
|
|
6960
|
+
* this type anchor spatially or by character offset?".
|
|
6961
|
+
*
|
|
6962
|
+
* Derived from `textSource`, not stored: until READ-VS-EXTRACT P1 this was a
|
|
6963
|
+
* `yieldsGeometry` boolean declared on each `TextExtractor` in
|
|
6964
|
+
* `@semiont/content` — a property of the STRATEGY, declared per-implementation,
|
|
6965
|
+
* in a different package from the strategy vocabulary. Two facts that must
|
|
6966
|
+
* agree, gated by nothing, and consumers asking about a media type had to
|
|
6967
|
+
* resolve an implementation to get an answer.
|
|
6968
|
+
*
|
|
6969
|
+
* Lenient like `textSourceOf`, not strict like `isAnnotatable`. An
|
|
6970
|
+
* unregistered `text/*` type decodes, and decoding yields no geometry — so
|
|
6971
|
+
* `false` here is a real answer rather than a refusal. Nothing downstream is a
|
|
6972
|
+
* durable write against a coordinate model, which is what makes `isAnnotatable`
|
|
6973
|
+
* strict.
|
|
6926
6974
|
*/
|
|
6927
|
-
declare function
|
|
6975
|
+
declare function yieldsGeometryOf(format: string): boolean;
|
|
6928
6976
|
/**
|
|
6929
6977
|
* WHETHER a type can carry annotations — `anchoring` remains the authority on
|
|
6930
6978
|
* HOW. Derived rather than stored: a parallel `annotatable` row field would be
|
|
6931
6979
|
* two facts that can disagree, with nothing to adjudicate
|
|
6932
6980
|
* `{ annotatable: true, anchoring: 'none' }`.
|
|
6933
6981
|
*
|
|
6934
|
-
* Strict on a registry miss, where `
|
|
6935
|
-
* asymmetry is deliberate.
|
|
6936
|
-
*
|
|
6982
|
+
* Strict on a registry miss, where `textSourceOf` above is lenient. The
|
|
6983
|
+
* asymmetry is deliberate. Reading the wrong bytes costs one bad vector, and
|
|
6984
|
+
* refusing to read costs a resource nobody can find, so the text source
|
|
6937
6985
|
* guesses; an annotation is a durable write against a coordinate model the
|
|
6938
6986
|
* system does not have for an unknown type, so it refuses.
|
|
6939
6987
|
*/
|
|
6940
6988
|
declare function isAnnotatable(format: string): boolean;
|
|
6941
6989
|
/** Types offered in the compose editor's format dropdown. */
|
|
6942
6990
|
declare const AUTHORABLE_MEDIA_TYPES: readonly SupportedMediaType[];
|
|
6943
|
-
/** Registry rows whose text the Smelter can
|
|
6944
|
-
* text/* fallback in `
|
|
6991
|
+
/** Registry rows whose text the Smelter can get at, by either route. Rows only —
|
|
6992
|
+
* the text/* fallback in `textSourceOf` isn't enumerable. */
|
|
6945
6993
|
declare const EMBEDDABLE_MEDIA_TYPES: readonly SupportedMediaType[];
|
|
6946
6994
|
/** Types the generation worker can produce as a yield artifact — the
|
|
6947
6995
|
* `outputMediaType` gate reads this, not a local table. */
|
|
@@ -6950,6 +6998,12 @@ declare const GENERATABLE_MEDIA_TYPES: readonly SupportedMediaType[];
|
|
|
6950
6998
|
/**
|
|
6951
6999
|
* Resource input/output types
|
|
6952
7000
|
*/
|
|
7001
|
+
|
|
7002
|
+
/**
|
|
7003
|
+
* What the byte door reports about bytes it just stored. A projection of the
|
|
7004
|
+
* specced Representation — drop a field there and this stops compiling.
|
|
7005
|
+
*/
|
|
7006
|
+
type StoredResource = Required<Pick<components['schemas']['Representation'], 'storageUri' | 'checksum' | 'byteSize' | 'created'>>;
|
|
6953
7007
|
interface UpdateResourceInput {
|
|
6954
7008
|
name?: string;
|
|
6955
7009
|
entityTypes?: string[];
|
|
@@ -8009,7 +8063,7 @@ declare function deriveViews(graph: KnowledgeGraph, mainResourceId: string, foca
|
|
|
8009
8063
|
interface RetryPolicy {
|
|
8010
8064
|
/** Total attempts, including the first one. */
|
|
8011
8065
|
attempts: number;
|
|
8012
|
-
/**
|
|
8066
|
+
/** Ceiling on the delay before the second attempt; doubles each retry. */
|
|
8013
8067
|
initialDelayMs: number;
|
|
8014
8068
|
/** Ceiling for the doubled delay. */
|
|
8015
8069
|
maxDelayMs: number;
|
|
@@ -8024,8 +8078,10 @@ interface RetryAttemptInfo {
|
|
|
8024
8078
|
error: unknown;
|
|
8025
8079
|
}
|
|
8026
8080
|
/**
|
|
8027
|
-
* Default policy for startup connections to the gateway: 8 attempts with
|
|
8028
|
-
*
|
|
8081
|
+
* Default policy for startup connections to the gateway: 8 attempts with delay
|
|
8082
|
+
* ceilings 1s, 2s, 4s, then capped at 8s — up to ~39s of patience before giving
|
|
8083
|
+
* up. "Up to", because the backoff is equal-jittered: each wait lands in
|
|
8084
|
+
* [cap/2, cap), so the worst case is that sum and the expected case is ~75% of it.
|
|
8029
8085
|
*/
|
|
8030
8086
|
declare const STARTUP_FETCH_RETRY: RetryPolicy;
|
|
8031
8087
|
/**
|
|
@@ -8037,10 +8093,43 @@ declare const STARTUP_FETCH_RETRY: RetryPolicy;
|
|
|
8037
8093
|
*/
|
|
8038
8094
|
declare function isTransientFetchError(error: unknown): boolean;
|
|
8039
8095
|
/**
|
|
8040
|
-
*
|
|
8041
|
-
*
|
|
8042
|
-
*
|
|
8043
|
-
*
|
|
8096
|
+
* An error that knows the HTTP status the server answered with.
|
|
8097
|
+
*
|
|
8098
|
+
* Structural rather than a class, because the class already exists:
|
|
8099
|
+
* http-transport's `APIError` carries `status` and cannot be named from here
|
|
8100
|
+
* without inverting the package dependency. This interface is the contract
|
|
8101
|
+
* between the thrower and `isRetryableRequestError`, stated once — a predicate
|
|
8102
|
+
* that recovered the status by parsing it back out of an error MESSAGE would be
|
|
8103
|
+
* a second statement of the same fact, in the fragile direction.
|
|
8104
|
+
*/
|
|
8105
|
+
interface HttpStatusError extends Error {
|
|
8106
|
+
readonly status: number;
|
|
8107
|
+
}
|
|
8108
|
+
/**
|
|
8109
|
+
* True for failures worth another attempt: the connection never landed
|
|
8110
|
+
* (`isTransientFetchError`), the server answered "not now"
|
|
8111
|
+
* (`RETRYABLE_STATUSES`), or our own deadline expired.
|
|
8112
|
+
*
|
|
8113
|
+
* The timeout case is the one that is easy to get wrong. `AbortSignal.timeout()`
|
|
8114
|
+
* rejects with a **DOMException named `TimeoutError`**, not a `TypeError` —
|
|
8115
|
+
* measured, not assumed — so `isTransientFetchError` cannot see it, and a
|
|
8116
|
+
* request that bounded itself was unretryable precisely when the bound fired.
|
|
8117
|
+
* Matched by `name` rather than `instanceof DOMException` because the constructor
|
|
8118
|
+
* is not guaranteed present in every runtime this package builds for, while the
|
|
8119
|
+
* name is part of the DOM spec.
|
|
8120
|
+
*
|
|
8121
|
+
* Auth and validation failures stay excluded, preserving `isTransientFetchError`'s
|
|
8122
|
+
* reasoning verbatim: a 401 means the gateway is UP and rejected us, and retrying
|
|
8123
|
+
* will not change its mind. A 429 differs — the gateway is up and *asking* us to
|
|
8124
|
+
* wait, so the same "it answered" fact points the other way.
|
|
8125
|
+
*/
|
|
8126
|
+
declare function isRetryableRequestError(error: unknown): boolean;
|
|
8127
|
+
/**
|
|
8128
|
+
* Run `fn`, retrying on errors `isRetryable` accepts, with equal-jitter
|
|
8129
|
+
* exponential backoff per `policy`. `onRetry` fires before each wait — the
|
|
8130
|
+
* caller's hook for logging the attempt, and it reports the actual jittered
|
|
8131
|
+
* delay. The final error (retryable budget exhausted, or the first
|
|
8132
|
+
* non-retryable one) is rethrown verbatim.
|
|
8044
8133
|
*/
|
|
8045
8134
|
declare function retryWithBackoff<T>(fn: () => Promise<T>, isRetryable: (error: unknown) => boolean, policy: RetryPolicy, onRetry?: (info: RetryAttemptInfo) => void): Promise<T>;
|
|
8046
8135
|
|
|
@@ -8110,5 +8199,5 @@ declare function getShardPath(key: string, numBuckets?: number): [string, string
|
|
|
8110
8199
|
*/
|
|
8111
8200
|
declare const DISCOVERY_URL_PATH = "/discovery/kbs.json";
|
|
8112
8201
|
|
|
8113
|
-
export { AUTHORABLE_MEDIA_TYPES, BRIDGED_CHANNELS, BUS_OPERATIONS, BusRequestError, CHANNEL_SCHEMAS, CONTEXT_FULL_WEIGHT, CONTEXT_PARTIAL_WEIGHT, ConfigurationError, ConflictError, DEFAULT_CHUNKING_CONFIG, DISCOVERY_URL_PATH, EMBEDDABLE_MEDIA_TYPES, EventBus, GENERATABLE_MEDIA_TYPES, JWTTokenSchema, LOCALES, MEDIA_TYPES, NotFoundError, PERSISTED_EVENT_TYPES, POSITION_WEIGHT_MAX, POSITION_WINDOW, RESOURCE_BROADCAST_TYPES, STARTUP_FETCH_RETRY, ScopedEventBus, ScriptError, SemiontError, UnauthorizedError, ValidationError, accessToken, agentToDid, anchorAnnotation, anchorRuns, annotationId, annotationUri, applyBodyOperations, assembleAnnotation, authCode, baseMediaType, baseUrl, buildContentCache, burstBuffer, busLog, busLogEnabled, busRequest, capabilitiesOf, chunkText, cloneFormat, cloneToken, createCircleSvg, createFragmentSelector, createPolygonSvg, createRectangleSvg, createTomlConfigLoader, decodeRepresentation, decodeWithCharset, deriveStorageUri, deriveViews, didToAgent, email, entityType, errField, estimateTokens, extensionForMediaType, extractBoundingBox, extractCharset, extractContext, findBestTextMatch, findBodyItem, findClaimSpan, folderOf, formatLocaleDisplay, generateUuid, getAllLocaleCodes, getAllPlatformTypes, getAnnotationExactText, getAnnotationUriFromEvent, getBodySource, getBodyType, getChecksum, getCommentText, getCreator, getDerivedFrom, getExactText, getFragmentSelector, getLanguage, getLocaleEnglishName, getLocaleInfo, getLocaleNativeName, getNodeEncoding, getPageFromFragment, getPrimaryMediaType, getPrimaryRepresentation, getPrimarySelector, getResourceEntityTypes, getResourceId, getShardPath, getStorageUri, getSvgSelector, getTargetSelector, getTargetSource, getTextPositionSelector, getTextQuoteSelector, googleCredential, hasTargetSelector, isAnnotatable, isAnnotationId, isArchived, isArray, isAssessment, isBodyResolved, isBoolean, isComment, isDefined, isDraft, isEventRelatedToAnnotation, isFunction, isGatheredContext, isGenerationJobParams, isHighlight, isNull, isNullish, isNumber, isObject, isReference, isResolvedReference, isResourceId, isStoredEvent, isString, isStubReference, isSupportedMediaType, isTag, isTextRun, isTransientFetchError, isUndefined, isValidEmail, isValidPlatformType, jobId, jumpConsistentHash, kbDid, loadTomlConfig, locate, mcpToken, mediaTypeForExtension, normalizeCoordinates, normalizeText, parseEnvironment, parseFragmentSelector, parseSvgSelector, proposeStoragePath, reconcileSelector, refreshToken, replyChannelsFor, resourceAnnotationUri, resourceId, resourceUri, retryWithBackoff, scaleSvgToNative, searchQuery, serializePerKey, setBusLogTraceIdProvider, softwareToAgent, storageFileName,
|
|
8114
|
-
export type { AccessToken, AnchorConfidence, AnchorMethod, AnchorRect, AnchorSelectors, AnchorStrategy, AnchoredText, AnchoringModel, Annotation, AnnotationCategory, AnnotationId, AnnotationUri, AnthropicProviderConfig, AppConfig, ArchivistServiceConfig, AssembledAnnotation, AuthCode, BaseUrl, BodyItem, BodyItemIdentity, BodyOperation, BoundingBox, Brand, BridgedChannel, BurstBufferOptions, BusOp, BusOperationKey, BusOperationSpec, BusRequestErrorCode, BusRequestPrimitive, ChunkingConfig, CloneToken, CollaboratorEntry, ConnectionState, ContentCache, ContentFormat, CreateAnnotationInternal, DatabaseServiceConfig, DiscoveredKB, DiscoveryDocument, Email, EmbeddingServiceConfig, EmittableChannel, EntityType, EntityTypeStats, Environment, EnvironmentConfig, EventBase, EventInput, EventMap, EventMetadata, EventName, EventOfType, EventQuery, EventSignature, ExtractionOutcome, FragmentSelector, GatewayServiceConfig, GatheredContext, GenerationJobParams, GoogleAuthRequest, GoogleCredential, GraphConnection, GraphDatabaseType, GraphPath, GraphServiceConfig, GraphViews, HealthCheckResponse, IContentTransport, IGatewayOperations, ITransport, InferenceProvidersConfig, JobId, JobType, ListUsersResponse, LlmSelectorInput, LocaleInfo, Logger, MCPToken, MatchQuality, McpServiceConfig, MediaTypeCapabilities, Motivation, OllamaProviderConfig, PdfCoordinate, PdfTextItem, PdfTextRun, PersistedEvent, PersistedEventType, PlatformType, Point, PutBinaryOptions, PutBinaryProgress, PutBinaryRequest, ReconciledSelector, RefreshToken, RenderMode, RenderedAnchor, ResourceAnnotationUri, ResourceAnnotations, ResourceBroadcastType, ResourceDescriptor, ResourceFilter, ResourceId, ResourceUri, RetryAttemptInfo, RetryPolicy, SearchQuery, SelectionData, Selector, SemiontConfig, ServicePlatformConfig, ServicesConfig, SiteConfig, StateUnit, StatusResponse, StoredEvent, StoredEventLike, SupportedMediaType, SvgSelector, TagCategory, TagSchema,
|
|
8202
|
+
export { AUTHORABLE_MEDIA_TYPES, BRIDGED_CHANNELS, BUS_OPERATIONS, BusRequestError, CHANNEL_SCHEMAS, CONTEXT_FULL_WEIGHT, CONTEXT_PARTIAL_WEIGHT, ConfigurationError, ConflictError, DEFAULT_CHUNKING_CONFIG, DISCOVERY_URL_PATH, EMBEDDABLE_MEDIA_TYPES, EventBus, GENERATABLE_MEDIA_TYPES, JWTTokenSchema, LOCALES, MEDIA_TYPES, NotFoundError, PERSISTED_EVENT_TYPES, POSITION_WEIGHT_MAX, POSITION_WINDOW, RESOURCE_BROADCAST_TYPES, STARTUP_FETCH_RETRY, ScopedEventBus, ScriptError, SemiontError, UnauthorizedError, ValidationError, accessToken, agentToDid, anchorAnnotation, anchorRuns, annotationId, annotationUri, applyBodyOperations, assembleAnnotation, authCode, baseMediaType, baseUrl, buildContentCache, burstBuffer, busLog, busLogEnabled, busRequest, capabilitiesOf, chunkText, cloneFormat, cloneToken, createCircleSvg, createFragmentSelector, createPolygonSvg, createRectangleSvg, createTomlConfigLoader, decodeRepresentation, decodeWithCharset, deriveStorageUri, deriveViews, didToAgent, email, entityType, errField, estimateTokens, extensionForMediaType, extractBoundingBox, extractCharset, extractContext, findBestTextMatch, findBodyItem, findClaimSpan, folderOf, formatLocaleDisplay, generateUuid, getAllLocaleCodes, getAllPlatformTypes, getAnnotationExactText, getAnnotationUriFromEvent, getBodySource, getBodyType, getChecksum, getCommentText, getCreator, getDerivedFrom, getExactText, getFragmentSelector, getLanguage, getLocaleEnglishName, getLocaleInfo, getLocaleNativeName, getNodeEncoding, getPageFromFragment, getPrimaryMediaType, getPrimaryRepresentation, getPrimarySelector, getResourceEntityTypes, getResourceId, getShardPath, getStorageUri, getSvgSelector, getTargetSelector, getTargetSource, getTextPositionSelector, getTextQuoteSelector, googleCredential, hasTargetSelector, isAnnotatable, isAnnotationId, isArchived, isArray, isAssessment, isBodyResolved, isBoolean, isComment, isDefined, isDraft, isEventRelatedToAnnotation, isFunction, isGatheredContext, isGenerationJobParams, isHighlight, isNull, isNullish, isNumber, isObject, isReference, isResolvedReference, isResourceId, isRetryableRequestError, isStoredEvent, isString, isStubReference, isSupportedMediaType, isTag, isTextRun, isTransientFetchError, isUndefined, isValidEmail, isValidPlatformType, jobId, jumpConsistentHash, kbDid, loadTomlConfig, locate, mcpToken, mediaTypeForExtension, normalizeCoordinates, normalizeText, parseEnvironment, parseFragmentSelector, parseSvgSelector, proposeStoragePath, reconcileSelector, refreshToken, replyChannelsFor, resourceAnnotationUri, resourceId, resourceUri, retryWithBackoff, scaleSvgToNative, searchQuery, serializePerKey, setBusLogTraceIdProvider, softwareToAgent, storageFileName, textSourceOf, textUnder, userDID, userId, userToAgent, userToDid, uuidV4, validateData, validateEnvironment, validateSvgMarkup, verifyPosition, yieldsGeometryOf };
|
|
8203
|
+
export type { AccessToken, AnchorConfidence, AnchorMethod, AnchorRect, AnchorSelectors, AnchorStrategy, AnchoredText, AnchoredTextAnswer, AnchoringModel, Annotation, AnnotationCategory, AnnotationId, AnnotationUri, AnthropicProviderConfig, AppConfig, ArchivistServiceConfig, AssembledAnnotation, AuthCode, BaseUrl, BodyItem, BodyItemIdentity, BodyOperation, BoundingBox, Brand, BridgedChannel, BurstBufferOptions, BusOp, BusOperationKey, BusOperationSpec, BusRequestErrorCode, BusRequestPrimitive, ChunkingConfig, CloneToken, CollaboratorEntry, ConnectionState, ContentCache, ContentFormat, CreateAnnotationInternal, DatabaseServiceConfig, DiscoveredKB, DiscoveryDocument, Email, EmbeddingServiceConfig, EmittableChannel, EntityType, EntityTypeStats, Environment, EnvironmentConfig, EventBase, EventInput, EventMap, EventMetadata, EventName, EventOfType, EventQuery, EventSignature, ExtractionOutcome, FragmentSelector, GatewayServiceConfig, GatheredContext, GenerationJobParams, GoogleAuthRequest, GoogleCredential, GraphConnection, GraphDatabaseType, GraphPath, GraphServiceConfig, GraphViews, HealthCheckResponse, HttpStatusError, IContentTransport, IGatewayOperations, ITransport, InferenceProvidersConfig, JobId, JobType, ListUsersResponse, LlmSelectorInput, LocaleInfo, Logger, MCPToken, MatchQuality, McpServiceConfig, MediaTypeCapabilities, Motivation, OllamaProviderConfig, PdfCoordinate, PdfTextItem, PdfTextRun, PersistedEvent, PersistedEventType, PlatformType, Point, PutBinaryOptions, PutBinaryProgress, PutBinaryRequest, ReconciledSelector, RefreshToken, RenderMode, RenderedAnchor, ResourceAnnotationUri, ResourceAnnotations, ResourceBroadcastType, ResourceDescriptor, ResourceFilter, ResourceId, ResourceUri, RetryAttemptInfo, RetryPolicy, SearchQuery, SelectionData, Selector, SemiontConfig, ServicePlatformConfig, ServicesConfig, SiteConfig, StateUnit, StatusResponse, StoredEvent, StoredEventLike, StoredResource, SupportedMediaType, SvgSelector, TagCategory, TagSchema, TextPosition, TextPositionSelector, TextQuoteSelector, TextSource, ActorInferenceConfig as TomlActorInferenceConfig, TomlFileReader, InferenceConfig as TomlInferenceConfig, WorkerInferenceConfig as TomlWorkerInferenceConfig, TransportErrorCode, UpdateResourceInput, UpdateUserRequest, UpdateUserResponse, UserDID, UserId, UserResponse, ValidationFailure, ValidationResult, ValidationSuccess, VectorsServiceConfig, components, operations, paths };
|