@sixb/core 0.1.10 → 0.1.11
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/actions/index.js +5 -5
- package/dist/agents/index.js +10 -10
- package/dist/blob-storage/types.d.ts +4 -1
- package/dist/blob-storage/types.d.ts.map +1 -1
- package/dist/bootstrap/index.js +14 -14
- package/dist/{chunk-nmbxcaqx.js → chunk-01kj2pbh.js} +1 -1
- package/dist/{chunk-rtk71jzp.js → chunk-1yefycb1.js} +1 -1
- package/dist/chunk-2c4j899j.js.map +1 -1
- package/dist/{chunk-t1f4f1ve.js → chunk-3ckk0xfj.js} +2 -2
- package/dist/{chunk-r7fj830t.js → chunk-4zhmdsx6.js} +48 -15
- package/dist/{chunk-r7fj830t.js.map → chunk-4zhmdsx6.js.map} +6 -6
- package/dist/{chunk-g7knyczr.js → chunk-a0e6x5hd.js} +1 -1
- package/dist/{chunk-5c7ga8zz.js → chunk-cfvakeax.js} +1 -1
- package/dist/chunk-d62kjtbg.js.map +1 -1
- package/dist/{chunk-28ja2cjs.js → chunk-d63nnr5b.js} +2 -2
- package/dist/{chunk-agbbygvh.js → chunk-fh8kgex1.js} +4 -4
- package/dist/{chunk-b0ec55a1.js → chunk-g91qxjj0.js} +1 -1
- package/dist/{chunk-5p1v802y.js → chunk-gq8vhakp.js} +12 -8
- package/dist/{chunk-5p1v802y.js.map → chunk-gq8vhakp.js.map} +4 -4
- package/dist/{chunk-p6a4npdx.js → chunk-gqm76kse.js} +21 -20
- package/dist/{chunk-p6a4npdx.js.map → chunk-gqm76kse.js.map} +4 -4
- package/dist/{chunk-e0d1rzef.js → chunk-jsy70480.js} +16 -3
- package/dist/chunk-jsy70480.js.map +15 -0
- package/dist/{chunk-p5vcsw9c.js → chunk-sepyxgpc.js} +2 -2
- package/dist/{chunk-nt99sxd6.js → chunk-wf88w4kp.js} +16 -22
- package/dist/chunk-wf88w4kp.js.map +14 -0
- package/dist/{chunk-bn138h9w.js → chunk-x9m9x2eq.js} +1 -1
- package/dist/{chunk-qyeptdyv.js → chunk-z0271qkp.js} +3 -1
- package/dist/{chunk-qyeptdyv.js.map → chunk-z0271qkp.js.map} +3 -3
- package/dist/{chunk-976rxdpx.js → chunk-z0s4axeh.js} +4 -4
- package/dist/connectors/connections/command-context.d.ts +2 -0
- package/dist/connectors/connections/command-context.d.ts.map +1 -1
- package/dist/connectors/connections/contracts.d.ts +1 -1
- package/dist/connectors/connections/contracts.d.ts.map +1 -1
- package/dist/connectors/connections/execution.d.ts +1 -0
- package/dist/connectors/connections/execution.d.ts.map +1 -1
- package/dist/connectors/connections/runs.d.ts +1 -0
- package/dist/connectors/connections/runs.d.ts.map +1 -1
- package/dist/connectors/connections/service.d.ts +2 -0
- package/dist/connectors/connections/service.d.ts.map +1 -1
- package/dist/events/index.js +1 -1
- package/dist/events/outbox-dispatcher.d.ts +2 -2
- package/dist/events/outbox-dispatcher.d.ts.map +1 -1
- package/dist/execution/agent.js +10 -10
- package/dist/execution/primitive.js +10 -10
- package/dist/execution/request.js +10 -10
- package/dist/index.js +17 -17
- package/dist/lake-storage/in-memory.d.ts.map +1 -1
- package/dist/lake-storage/index.js +1 -1
- package/dist/lake-storage/types.d.ts +2 -0
- package/dist/lake-storage/types.d.ts.map +1 -1
- package/dist/maintenance/ontology-maintenance.d.ts.map +1 -1
- package/dist/maintenance/types.d.ts +1 -1
- package/dist/maintenance/types.d.ts.map +1 -1
- package/dist/materializer/index.js +2 -2
- package/dist/models/definitions.d.ts +7 -0
- package/dist/models/definitions.d.ts.map +1 -1
- package/dist/models/execution/index.js +3 -3
- package/dist/models/index.js +1 -1
- package/dist/objects/index.js +5 -5
- package/dist/objects/query/index.js +3 -3
- package/dist/pipelines/index.js +4 -4
- package/dist/projections/internal.js +2 -2
- package/dist/shares/internal.js +2 -2
- package/dist/storage/agents/provider.js +1 -1
- package/dist/storage/connector-connections/in-memory.d.ts +1 -0
- package/dist/storage/connector-connections/in-memory.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider/connections.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider/runs.d.ts +1 -0
- package/dist/storage/connector-connections/provider/runs.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider/shared.d.ts +1 -0
- package/dist/storage/connector-connections/provider/shared.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider.d.ts +1 -0
- package/dist/storage/connector-connections/provider.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider.js +10 -16
- package/dist/storage/connector-connections/provider.js.map +6 -6
- package/dist/storage/connector-connections/types.d.ts +3 -1
- package/dist/storage/connector-connections/types.d.ts.map +1 -1
- package/dist/storage/index.js +2 -2
- package/dist/storage/ontology/in-memory/shared-state.d.ts.map +1 -1
- package/dist/storage/ontology/outbox.d.ts +1 -0
- package/dist/storage/ontology/outbox.d.ts.map +1 -1
- package/dist/syncs/index.js +4 -4
- package/dist/testing/index.js +58 -30
- package/dist/testing/index.js.map +5 -5
- package/dist/testing/lake-storage-contract.d.ts.map +1 -1
- package/dist/testing/ontology-storage-contract.d.ts.map +1 -1
- package/dist/webhooks/internal.js +2 -2
- package/dist/workflows/index.js +11 -11
- package/package.json +1 -1
- package/src/agents/model-loop.ts +7 -0
- package/src/blob-storage/types.ts +4 -1
- package/src/connectors/connections/command-context.ts +21 -4
- package/src/connectors/connections/contracts.ts +4 -1
- package/src/connectors/connections/execution.ts +3 -0
- package/src/connectors/connections/runs.ts +38 -1
- package/src/connectors/connections/service.ts +6 -0
- package/src/events/outbox-dispatcher.ts +20 -26
- package/src/lake-storage/in-memory.ts +2 -0
- package/src/lake-storage/types.ts +2 -0
- package/src/maintenance/ontology-maintenance.ts +6 -2
- package/src/maintenance/types.ts +1 -1
- package/src/materializer/README.md +1 -1
- package/src/models/definitions.ts +19 -0
- package/src/models/pricing.ts +6 -2
- package/src/storage/connector-connections/in-memory.ts +16 -18
- package/src/storage/connector-connections/provider/connections.ts +1 -15
- package/src/storage/connector-connections/provider/runs.ts +6 -0
- package/src/storage/connector-connections/provider/shared.ts +2 -3
- package/src/storage/connector-connections/provider.ts +6 -0
- package/src/storage/connector-connections/types.ts +5 -1
- package/src/storage/ontology/in-memory/shared-state.ts +10 -3
- package/src/storage/ontology/outbox.ts +1 -0
- package/src/testing/connector-connection-storage-contract.ts +11 -11
- package/src/testing/lake-storage-contract.ts +29 -0
- package/src/testing/ontology-storage-contract.ts +8 -3
- package/dist/chunk-e0d1rzef.js.map +0 -15
- package/dist/chunk-nt99sxd6.js.map +0 -14
- /package/dist/{chunk-nmbxcaqx.js.map → chunk-01kj2pbh.js.map} +0 -0
- /package/dist/{chunk-rtk71jzp.js.map → chunk-1yefycb1.js.map} +0 -0
- /package/dist/{chunk-t1f4f1ve.js.map → chunk-3ckk0xfj.js.map} +0 -0
- /package/dist/{chunk-g7knyczr.js.map → chunk-a0e6x5hd.js.map} +0 -0
- /package/dist/{chunk-5c7ga8zz.js.map → chunk-cfvakeax.js.map} +0 -0
- /package/dist/{chunk-28ja2cjs.js.map → chunk-d63nnr5b.js.map} +0 -0
- /package/dist/{chunk-agbbygvh.js.map → chunk-fh8kgex1.js.map} +0 -0
- /package/dist/{chunk-b0ec55a1.js.map → chunk-g91qxjj0.js.map} +0 -0
- /package/dist/{chunk-p5vcsw9c.js.map → chunk-sepyxgpc.js.map} +0 -0
- /package/dist/{chunk-bn138h9w.js.map → chunk-x9m9x2eq.js.map} +0 -0
- /package/dist/{chunk-976rxdpx.js.map → chunk-z0s4axeh.js.map} +0 -0
|
@@ -31,6 +31,7 @@ export interface ConnectorConnectionPersistence {
|
|
|
31
31
|
deleteAuthorizationAttempt(id: string): Promise<boolean>
|
|
32
32
|
|
|
33
33
|
insertConnectionRun(record: ConnectorConnectionRunRecord): Promise<boolean>
|
|
34
|
+
listPendingConnectionRuns(): Promise<readonly ConnectorConnectionRunRecord[]>
|
|
34
35
|
getConnectionRun(id: string): Promise<ConnectorConnectionRunRecord | null>
|
|
35
36
|
updateConnectionRun(record: ConnectorConnectionRunRecord): Promise<void>
|
|
36
37
|
|
|
@@ -88,6 +89,7 @@ export async function currentConnectionRun(
|
|
|
88
89
|
const run = await persistence.getConnectionRun(runId)
|
|
89
90
|
if (!run || (run.status !== "waiting" && run.status !== "running")) return run
|
|
90
91
|
|
|
92
|
+
if (run.status === "waiting" && run.waitingFor === "account_selection") return run
|
|
91
93
|
const now = await persistence.now()
|
|
92
94
|
if (run.expiresAt.getTime() > now.getTime()) return run
|
|
93
95
|
|
|
@@ -96,9 +98,6 @@ export async function currentConnectionRun(
|
|
|
96
98
|
if (attempt) await persistence.deleteAuthorizationAttempt(attempt.id)
|
|
97
99
|
}
|
|
98
100
|
if (run.status === "waiting") {
|
|
99
|
-
if (run.kind === "connect" && run.waitingFor === "account_selection") {
|
|
100
|
-
await markPendingAuthorizationForCleanup(persistence, run.authorizationId, now)
|
|
101
|
-
}
|
|
102
101
|
const expired = expireConnectionRun(run, now)
|
|
103
102
|
await persistence.updateConnectionRun(expired)
|
|
104
103
|
return expired
|
|
@@ -77,6 +77,12 @@ export class DurableConnectorConnectionStorage implements ConnectorConnectionSto
|
|
|
77
77
|
return this.runs.finishConnectionRun(...args)
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
+
listPendingConnectionRuns(
|
|
81
|
+
...args: Parameters<ConnectorConnectionStorage["listPendingConnectionRuns"]>
|
|
82
|
+
) {
|
|
83
|
+
return this.runs.listPendingConnectionRuns(...args)
|
|
84
|
+
}
|
|
85
|
+
|
|
80
86
|
async getConnectionRun(
|
|
81
87
|
...args: Parameters<ConnectorConnectionStorage["getConnectionRun"]>
|
|
82
88
|
): Promise<Awaited<ReturnType<ConnectorConnectionStorage["getConnectionRun"]>>> {
|
|
@@ -58,6 +58,7 @@ export interface ConnectorConnectionRunAwaitingSelectionRecord extends Connector
|
|
|
58
58
|
readonly status: "waiting"
|
|
59
59
|
readonly waitingFor: "account_selection"
|
|
60
60
|
readonly authorizationId: string
|
|
61
|
+
/** Legacy persistence field; account selection no longer expires. */
|
|
61
62
|
readonly expiresAt: Date
|
|
62
63
|
}
|
|
63
64
|
|
|
@@ -279,7 +280,7 @@ export interface ConnectorAuthorizationRecord {
|
|
|
279
280
|
readonly scopes: readonly string[]
|
|
280
281
|
readonly accounts: readonly ConnectorAccountCandidate[]
|
|
281
282
|
readonly status: ConnectorAuthorizationStatus
|
|
282
|
-
/**
|
|
283
|
+
/** Legacy persistence field; no longer enforced as a selection deadline. */
|
|
283
284
|
readonly selectionExpiresAt?: Date
|
|
284
285
|
readonly revision: number
|
|
285
286
|
readonly credentialMutation?: ConnectorCredentialMutation
|
|
@@ -478,6 +479,9 @@ export interface ConnectorConnectionStorage {
|
|
|
478
479
|
finishConnectionRun(
|
|
479
480
|
input: FinishConnectorConnectionRunInput
|
|
480
481
|
): Promise<ConnectorConnectionRunRecord | null>
|
|
482
|
+
listPendingConnectionRuns(
|
|
483
|
+
input: ListConnectorConnectionsInput
|
|
484
|
+
): Promise<readonly ConnectorConnectionRunRecord[]>
|
|
481
485
|
getConnectionRun(
|
|
482
486
|
input: GetConnectorConnectionRunInput
|
|
483
487
|
): Promise<ConnectorConnectionRunRecord | null>
|
|
@@ -176,9 +176,16 @@ export function insertBounded<T>(
|
|
|
176
176
|
limit: number,
|
|
177
177
|
compare: (left: T, right: T) => number
|
|
178
178
|
): void {
|
|
179
|
-
|
|
180
|
-
if (
|
|
181
|
-
|
|
179
|
+
if (limit <= 0) return
|
|
180
|
+
if (values.length >= limit && compare(value, values[values.length - 1]!) >= 0) return
|
|
181
|
+
let low = 0
|
|
182
|
+
let high = values.length
|
|
183
|
+
while (low < high) {
|
|
184
|
+
const middle = (low + high) >>> 1
|
|
185
|
+
if (compare(value, values[middle]!) < 0) high = middle
|
|
186
|
+
else low = middle + 1
|
|
187
|
+
}
|
|
188
|
+
values.splice(low, 0, value)
|
|
182
189
|
if (values.length > limit) values.pop()
|
|
183
190
|
}
|
|
184
191
|
|
|
@@ -80,6 +80,7 @@ export interface OntologyOutboxSummary {
|
|
|
80
80
|
readonly maxAttempts: number
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
+
/** Each method is atomic on its own, including validation of the entire lease batch. */
|
|
83
84
|
export interface OntologyOutboxStorage {
|
|
84
85
|
/** Selects each claimed batch deterministically; concurrent publishers may complete out of order. */
|
|
85
86
|
claim(input: ClaimOntologyOutboxInput): Promise<readonly ClaimedOntologyOutboxRow[]>
|
|
@@ -486,25 +486,25 @@ export function runConnectorConnectionStorageContractSuite<
|
|
|
486
486
|
})
|
|
487
487
|
})
|
|
488
488
|
|
|
489
|
-
test("
|
|
489
|
+
test("allows account selection after its legacy deadline", async () => {
|
|
490
490
|
await withStorage(async (storage, root) => {
|
|
491
491
|
const authorization = await createAuthorization(storage, "authorization-a", "account-a")
|
|
492
|
-
await options.advanceTime(root, 60_000)
|
|
492
|
+
await options.advanceTime(root, 365 * 24 * 60 * 60_000)
|
|
493
493
|
|
|
494
|
-
await expect(
|
|
495
|
-
|
|
496
|
-
)
|
|
494
|
+
await expect(
|
|
495
|
+
connect(storage, authorization, "connection-a", "account-a")
|
|
496
|
+
).resolves.toMatchObject({ connection: { status: "connected" } })
|
|
497
497
|
await expect(
|
|
498
498
|
storage.getAuthorization(authorizationKey(authorization.id))
|
|
499
|
-
).resolves.toMatchObject({ status: "
|
|
499
|
+
).resolves.toMatchObject({ status: "active" })
|
|
500
500
|
})
|
|
501
501
|
})
|
|
502
502
|
|
|
503
|
-
test("
|
|
503
|
+
test("keeps account-selection runs selectable after their legacy deadline", async () => {
|
|
504
504
|
await withStorage(async (storage, root) => {
|
|
505
505
|
const authorization = await createAuthorization(storage, "authorization-a", "account-a")
|
|
506
506
|
await createSelectionRun(storage, authorization)
|
|
507
|
-
await options.advanceTime(root, 60_000)
|
|
507
|
+
await options.advanceTime(root, 365 * 24 * 60 * 60_000)
|
|
508
508
|
|
|
509
509
|
await expect(
|
|
510
510
|
storage.putConnectionFromRun({
|
|
@@ -515,13 +515,13 @@ export function runConnectorConnectionStorageContractSuite<
|
|
|
515
515
|
account: { id: "account-a", label: "Account A" },
|
|
516
516
|
replace: false,
|
|
517
517
|
})
|
|
518
|
-
).
|
|
518
|
+
).resolves.toMatchObject({ run: { status: "succeeded" } })
|
|
519
519
|
await expect(
|
|
520
520
|
storage.getConnectionRun({ projectId, connectorId, runId: "run-a" })
|
|
521
|
-
).resolves.toMatchObject({ status: "
|
|
521
|
+
).resolves.toMatchObject({ status: "succeeded" })
|
|
522
522
|
await expect(
|
|
523
523
|
storage.getAuthorization(authorizationKey(authorization.id))
|
|
524
|
-
).resolves.toMatchObject({ status: "
|
|
524
|
+
).resolves.toMatchObject({ status: "active" })
|
|
525
525
|
})
|
|
526
526
|
})
|
|
527
527
|
|
|
@@ -285,6 +285,35 @@ export function runLakeStorageContractSuite<TStorage extends LakeStorage>(
|
|
|
285
285
|
})
|
|
286
286
|
|
|
287
287
|
describe("writes and reads", () => {
|
|
288
|
+
test("cancels reads before starting and between rows", async () => {
|
|
289
|
+
// Red check: remove readRows' signal checks in the provider under test.
|
|
290
|
+
await withStorage(async (storage) => {
|
|
291
|
+
await storage.createDataset(writeDataset)
|
|
292
|
+
const write = await storage.beginWrite({ dataset: writeDataset, mode: "snapshot" })
|
|
293
|
+
await write.writeRows([
|
|
294
|
+
{ orderId: "1", customerName: "first" },
|
|
295
|
+
{ orderId: "2", customerName: "second" },
|
|
296
|
+
])
|
|
297
|
+
await write.commit()
|
|
298
|
+
const controller = new AbortController()
|
|
299
|
+
const rows = storage
|
|
300
|
+
.readRows({ datasetId: writeDataset.id, signal: controller.signal })
|
|
301
|
+
[Symbol.asyncIterator]()
|
|
302
|
+
try {
|
|
303
|
+
expect((await rows.next()).done).toBe(false)
|
|
304
|
+
controller.abort(new Error("cancel dataset read"))
|
|
305
|
+
await expect(rows.next()).rejects.toThrow("cancel dataset read")
|
|
306
|
+
await expect(
|
|
307
|
+
collectRows(
|
|
308
|
+
storage.readRows({ datasetId: writeDataset.id, signal: controller.signal })
|
|
309
|
+
)
|
|
310
|
+
).rejects.toThrow("cancel dataset read")
|
|
311
|
+
} finally {
|
|
312
|
+
await rows.return?.()
|
|
313
|
+
}
|
|
314
|
+
})
|
|
315
|
+
})
|
|
316
|
+
|
|
288
317
|
test("keeps immutable-version row order and offsets stable", async () => {
|
|
289
318
|
await withStorage(async (storage) => {
|
|
290
319
|
await storage.createDataset(writeDataset)
|
|
@@ -677,7 +677,10 @@ export function runOntologyStorageContractSuite<TStorage extends OntologyStorage
|
|
|
677
677
|
})
|
|
678
678
|
})
|
|
679
679
|
|
|
680
|
-
test(
|
|
680
|
+
test.each([
|
|
681
|
+
"root",
|
|
682
|
+
"transaction",
|
|
683
|
+
] as const)("keeps %s batch outbox settlement atomic when callers catch a stale lease", async (boundary) => {
|
|
681
684
|
await withStorage(async (storage) => {
|
|
682
685
|
await commitExactObject(storage, "lease-atomic-a")
|
|
683
686
|
await commitExactObject(storage, "lease-atomic-b")
|
|
@@ -699,7 +702,7 @@ export function runOntologyStorageContractSuite<TStorage extends OntologyStorage
|
|
|
699
702
|
const untouched = claimed.find((row) => row.envelope.id !== reclaimed!.envelope.id)!
|
|
700
703
|
|
|
701
704
|
let conflict: unknown
|
|
702
|
-
|
|
705
|
+
const settle = async (tx: OntologyContractStorage) => {
|
|
703
706
|
try {
|
|
704
707
|
await tx.ontology.outbox.markPublished({
|
|
705
708
|
projectId: "contract-project",
|
|
@@ -710,7 +713,9 @@ export function runOntologyStorageContractSuite<TStorage extends OntologyStorage
|
|
|
710
713
|
} catch (error) {
|
|
711
714
|
conflict = error
|
|
712
715
|
}
|
|
713
|
-
}
|
|
716
|
+
}
|
|
717
|
+
if (boundary === "transaction") await storage.transaction(settle)
|
|
718
|
+
else await settle(storage)
|
|
714
719
|
expect(conflict).toMatchObject({ kind: "outbox-lease" })
|
|
715
720
|
|
|
716
721
|
await storage.ontology.outbox.markPublished({
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/runtime/errors.ts", "../src/models/definitions.ts", "../src/models/catalog.ts", "../src/models/errors.ts", "../src/models/pricing.ts", "../src/models/rate-card.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/**\n * Thrown for runtime setup, lifecycle, and internal invariant failures\n * that are not validation errors (e.g., duplicate registrations, missing\n * bootstrap resources, failed event appends, module load failures).\n */\nexport class RuntimeError extends Error {\n readonly name = \"RuntimeError\"\n}\n",
|
|
6
|
-
"import {\n MODEL_REASONING_EFFORTS,\n type ModelCapabilities,\n type ModelReasoningBudgetCapabilities,\n type ModelReasoningCapabilities,\n} from \"./language-model\"\n\nexport type ModelKind = \"language\" | \"image\" | \"video\" | \"embedding\"\n\n/** Common catalog identity shared by every present and future model runtime. */\nexport interface ModelDefinition {\n readonly kind: ModelKind\n readonly providerId: string\n readonly modelId: string\n readonly name?: string\n readonly description?: string\n readonly family?: string\n readonly tags?: readonly string[]\n readonly releaseDate?: string\n}\n\n/** Serializable facts about one concrete model offering from one provider. */\nexport interface LanguageModelDefinition extends ModelDefinition {\n readonly kind: \"language\"\n readonly knowledgeCutoff?: string\n readonly contextWindow?: number\n /** Maximum input tokens, distinct from a shared input/output context window. */\n readonly maxInputTokens?: number\n readonly maxOutputTokens?: number\n readonly capabilities: ModelCapabilities\n}\n\nexport function defineLanguageModel(definition: LanguageModelDefinition): LanguageModelDefinition {\n if (definition.kind !== \"language\") {\n throw new TypeError(\"[Sixb] Language model definitions must use kind 'language'.\")\n }\n assertModelId(definition.providerId, \"providerId\")\n assertModelId(definition.modelId, \"modelId\")\n assertOptionalString(definition.name, \"name\")\n assertOptionalString(definition.description, \"description\")\n assertOptionalString(definition.family, \"family\")\n assertOptionalString(definition.releaseDate, \"releaseDate\")\n assertOptionalString(definition.knowledgeCutoff, \"knowledgeCutoff\")\n const tags = freezeStrings(definition.tags, \"tags\")\n const capabilities = defineModelCapabilities(definition.capabilities)\n assertOptionalPositiveInteger(definition.contextWindow, \"contextWindow\")\n assertOptionalPositiveInteger(definition.maxInputTokens, \"maxInputTokens\")\n assertOptionalPositiveInteger(definition.maxOutputTokens, \"maxOutputTokens\")\n return Object.freeze({\n kind: \"language\",\n providerId: definition.providerId,\n modelId: definition.modelId,\n ...(definition.name === undefined ? {} : { name: definition.name }),\n ...(definition.description === undefined ? {} : { description: definition.description }),\n ...(definition.family === undefined ? {} : { family: definition.family }),\n ...(tags === undefined ? {} : { tags }),\n ...(definition.releaseDate === undefined ? {} : { releaseDate: definition.releaseDate }),\n ...(definition.knowledgeCutoff === undefined\n ? {}\n : { knowledgeCutoff: definition.knowledgeCutoff }),\n ...(definition.contextWindow === undefined ? {} : { contextWindow: definition.contextWindow }),\n ...(definition.maxInputTokens === undefined\n ? {}\n : { maxInputTokens: definition.maxInputTokens }),\n ...(definition.maxOutputTokens === undefined\n ? {}\n : { maxOutputTokens: definition.maxOutputTokens }),\n capabilities,\n })\n}\n\nfunction defineModelCapabilities(capabilities: unknown): ModelCapabilities {\n assertRecord(capabilities, \"capabilities\")\n const inputMediaTypes =\n capabilities.inputMediaTypes === \"any\"\n ? \"any\"\n : freezeStrings(capabilities.inputMediaTypes, \"capabilities.inputMediaTypes\")\n for (const [field, value] of Object.entries(capabilities)) {\n if (field === \"inputMediaTypes\" || field === \"reasoning\") continue\n if (value !== undefined && typeof value !== \"boolean\") {\n throw new TypeError(`[Sixb] Model capability '${field}' must be boolean.`)\n }\n }\n const reasoning = freezeReasoningCapabilities(capabilities.reasoning)\n const flags: {\n localTools?: boolean\n parallelToolCalls?: boolean\n nativeStructuredOutput?: boolean\n providerExecutedTools?: boolean\n } = {}\n for (const key of [\n \"localTools\",\n \"parallelToolCalls\",\n \"nativeStructuredOutput\",\n \"providerExecutedTools\",\n ] as const) {\n const value = capabilities[key]\n if (typeof value === \"boolean\") flags[key] = value\n }\n return Object.freeze({\n ...(inputMediaTypes === undefined ? {} : { inputMediaTypes }),\n ...(reasoning === undefined ? {} : { reasoning }),\n ...flags,\n })\n}\n\nfunction freezeReasoningCapabilities(reasoning: unknown): ModelCapabilities[\"reasoning\"] {\n if (reasoning === undefined || reasoning === false) return reasoning\n assertRecord(reasoning, \"reasoning\")\n if (reasoning.canDisable !== undefined && typeof reasoning.canDisable !== \"boolean\") {\n throw new TypeError(\"[Sixb] Model reasoning capability 'canDisable' must be boolean.\")\n }\n const efforts = freezeReasoningEfforts(reasoning.efforts)\n const budgetTokens = freezeReasoningBudgetCapabilities(reasoning.budgetTokens)\n return Object.freeze({\n ...(reasoning.canDisable === undefined ? {} : { canDisable: reasoning.canDisable }),\n ...(efforts === undefined ? {} : { efforts }),\n ...(budgetTokens === undefined ? {} : { budgetTokens }),\n } satisfies ModelReasoningCapabilities)\n}\n\nfunction freezeReasoningEfforts(\n efforts: unknown\n): readonly (typeof MODEL_REASONING_EFFORTS)[number][] | undefined {\n if (efforts === undefined) return undefined\n if (!Array.isArray(efforts)) {\n throw new TypeError(\"[Sixb] Model reasoning capability 'efforts' must be an array.\")\n }\n const seen = new Set<string>()\n return Object.freeze(\n efforts.map((value: unknown) => {\n const effort = MODEL_REASONING_EFFORTS.find((allowed) => allowed === value)\n if (effort === undefined) {\n throw new TypeError(`[Sixb] Model reasoning effort '${String(value)}' is invalid.`)\n }\n if (seen.has(effort)) {\n throw new TypeError(`[Sixb] Model reasoning effort '${effort}' is duplicated.`)\n }\n seen.add(effort)\n return effort\n })\n )\n}\n\nfunction freezeReasoningBudgetCapabilities(\n budget: unknown\n): ModelReasoningBudgetCapabilities | undefined {\n if (budget === undefined) return undefined\n assertRecord(budget, \"reasoning budgetTokens\")\n assertOptionalNonnegativeInteger(budget.min, \"capabilities.reasoning.budgetTokens.min\")\n assertOptionalNonnegativeInteger(budget.max, \"capabilities.reasoning.budgetTokens.max\")\n if (budget.min !== undefined && budget.max !== undefined && budget.max < budget.min) {\n throw new TypeError(\n \"[Sixb] Model reasoning token budget maximum must not be below its minimum.\"\n )\n }\n return Object.freeze({\n ...(budget.min === undefined ? {} : { min: budget.min }),\n ...(budget.max === undefined ? {} : { max: budget.max }),\n })\n}\n\nfunction assertModelId(value: string, field: string): void {\n if (!value.trim()) throw new TypeError(`[Sixb] Model ${field} must not be empty.`)\n}\n\nfunction assertOptionalPositiveInteger(value: number | undefined, field: string): void {\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {\n throw new TypeError(`[Sixb] Model ${field} must be a positive safe integer.`)\n }\n}\n\nfunction assertOptionalNonnegativeInteger(\n value: unknown,\n field: string\n): asserts value is number | undefined {\n if (\n value !== undefined &&\n (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 0)\n ) {\n throw new TypeError(`[Sixb] Model ${field} must be a nonnegative safe integer.`)\n }\n}\n\nfunction assertOptionalString(value: string | undefined, field: string): void {\n if (value !== undefined && typeof value !== \"string\") {\n throw new TypeError(`[Sixb] Model ${field} must be a string.`)\n }\n}\n\nfunction freezeStrings(value: unknown, field: string): readonly string[] | undefined {\n if (value === undefined) return undefined\n if (!Array.isArray(value) || value.some((entry) => typeof entry !== \"string\" || !entry.trim())) {\n throw new TypeError(`[Sixb] Model ${field} must contain nonempty strings.`)\n }\n return Object.freeze([...value])\n}\n\nfunction assertRecord(value: unknown, field: string): asserts value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value))\n throw new TypeError(`[Sixb] Model ${field} must be an object.`)\n}\n",
|
|
7
|
-
"import { RuntimeError } from \"../runtime/errors\"\nimport {\n defineLanguageModel,\n type LanguageModelDefinition,\n type ModelDefinition,\n} from \"./definitions\"\nimport type { LanguageModel } from \"./language-model\"\n\n/** Stable identity of one configured language-model binding. */\nexport interface LanguageModelRef {\n readonly provider: string\n readonly modelId: string\n}\n\n/** The configured language models, with the project default. */\nexport interface LanguageModelCatalog {\n readonly default: LanguageModelEntry\n list(): readonly LanguageModelEntry[]\n getByRef(ref: LanguageModelRef): LanguageModelEntry | null\n}\n\n/**\n * One configured language model.\n *\n * The identity describes the configured binding, not only a vendor model. For example,\n * A gateway binding and a direct provider binding for the same vendor model are distinct because their\n * `provider` values differ.\n */\nexport interface LanguageModelEntry extends LanguageModelRef {\n readonly model: LanguageModel\n}\n\n/** Models a project allows Sixb to use, organized by technical model kind. */\nexport interface ModelCatalog {\n readonly language: LanguageModelCatalog\n}\n\nexport interface ModelCatalogInput {\n /** Ordered; the first entry is the project default. */\n readonly language: readonly LanguageModel[]\n}\n\n/** Build the immutable project model catalog. Rejects invalid, duplicate, and empty catalogs. */\nexport function createModelCatalog(input: ModelCatalogInput): ModelCatalog {\n if (!Array.isArray(input?.language)) {\n throw new RuntimeError(\"[Sixb] 'models.language' must be an array of Sixb language models.\")\n }\n\n const entries: LanguageModelEntry[] = []\n const byProvider = new Map<string, Map<string, LanguageModelEntry>>()\n\n for (const [index, model] of input.language.entries()) {\n assertLanguageModel(model, index)\n\n let byModelId = byProvider.get(model.providerId)\n if (byModelId === undefined) {\n byModelId = new Map()\n byProvider.set(model.providerId, byModelId)\n }\n if (byModelId.has(model.modelId)) {\n throw new RuntimeError(\n `[Sixb] Duplicate language model '${model.providerId}/${model.modelId}' in 'models'. Each provider and model id pair may be configured once.`\n )\n }\n\n const entry = Object.freeze({\n provider: model.providerId,\n modelId: model.modelId,\n model,\n })\n byModelId.set(model.modelId, entry)\n entries.push(entry)\n }\n\n const [defaultEntry] = entries\n if (defaultEntry === undefined) {\n throw new RuntimeError(\n \"[Sixb] 'models.language' needs at least one model. Configure one or omit 'models' from createSixb().\"\n )\n }\n\n const listed = Object.freeze(entries.slice())\n const language: LanguageModelCatalog = Object.freeze({\n default: defaultEntry,\n list: () => listed,\n getByRef: (ref: LanguageModelRef) => byProvider.get(ref.provider)?.get(ref.modelId) ?? null,\n })\n\n return Object.freeze({ language })\n}\n\nfunction assertLanguageModel(model: unknown, index: number): asserts model is LanguageModel {\n if ((typeof model !== \"object\" && typeof model !== \"function\") || model === null) {\n throw invalidLanguageModel(index, \"expected a Sixb LanguageModel instance\")\n }\n\n const candidate = model as Record<string, unknown>\n assertModelIdentifier(candidate.providerId, \"provider\", index)\n assertModelIdentifier(candidate.modelId, \"modelId\", index)\n if (typeof candidate.stream !== \"function\") {\n throw invalidLanguageModel(index, \"expected 'stream' to be a function\")\n }\n try {\n const definition = defineLanguageModel(candidate.definition as LanguageModelDefinition)\n if (\n definition.providerId !== candidate.providerId ||\n definition.modelId !== candidate.modelId\n ) {\n throw new Error(\"definition identity does not match the binding\")\n }\n } catch (error) {\n throw invalidLanguageModel(index, error instanceof Error ? error.message : \"invalid definition\")\n }\n}\n\nfunction assertModelIdentifier(value: unknown, field: \"provider\" | \"modelId\", index: number): void {\n if (typeof value !== \"string\" || value.length === 0) {\n throw invalidLanguageModel(index, `expected '${field}' to be a non-empty string`)\n }\n if (value.trim() !== value) {\n throw invalidLanguageModel(index, `expected '${field}' not to have surrounding whitespace`)\n }\n}\n\nfunction invalidLanguageModel(index: number, detail: string): RuntimeError {\n return new RuntimeError(\n `[Sixb] Invalid language model at 'models.language[${index}]': ${detail}.`\n )\n}\n\n/** Provider-owned metadata lookup, independent from the project's configured bindings. */\nexport interface ModelDefinitionCatalog<TDefinition extends ModelDefinition = ModelDefinition> {\n get(modelId: string): Promise<TDefinition | undefined>\n list(): Promise<readonly TDefinition[]>\n}\n\nexport type LanguageModelDefinitionCatalog = ModelDefinitionCatalog<LanguageModelDefinition>\n",
|
|
8
|
-
"import type { ModelFinishReason, ModelUsage } from \"./events\"\nimport type { ModelCallCost } from \"./pricing\"\n\n/** Catalog transport/access failed; callers may use local metadata without masking invalid definitions. */\nexport class ModelCatalogUnavailableError extends Error {\n readonly name = \"ModelCatalogUnavailableError\"\n}\n\n/** A provider or provider protocol rejected a model request. */\nexport class ModelProviderError extends Error {\n readonly name = \"ModelProviderError\"\n\n constructor(\n message: string,\n readonly providerId: string,\n readonly modelId: string,\n options?: ErrorOptions & {\n readonly status?: number\n readonly code?: string\n readonly requestId?: string\n readonly retryAfterMs?: number\n readonly retryable?: boolean\n }\n ) {\n super(message, options)\n this.status = options?.status\n this.code = options?.code\n this.requestId = options?.requestId\n this.retryAfterMs = options?.retryAfterMs\n this.retryable = options?.retryable ?? false\n }\n\n readonly status?: number\n readonly code?: string\n readonly requestId?: string\n readonly retryAfterMs?: number\n readonly retryable: boolean\n}\n\nexport class ModelStreamError extends Error {\n readonly name = \"ModelStreamError\"\n}\n\nexport class UnsupportedModelFeatureError extends Error {\n readonly name = \"UnsupportedModelFeatureError\"\n\n constructor(\n message?: string,\n options?: ErrorOptions & {\n readonly reason?: \"unsupported-model\" | \"unsupported-schema\"\n }\n ) {\n super(message, options)\n this.reason = options?.reason\n }\n\n readonly reason?: \"unsupported-model\" | \"unsupported-schema\"\n}\n\nexport class StructuredOutputError extends Error {\n readonly name = \"StructuredOutputError\"\n\n constructor(\n message: string,\n options?: ErrorOptions & {\n readonly text?: string\n readonly providerId?: string\n readonly modelId?: string\n readonly responseId?: string\n readonly responseModelId?: string\n readonly finishReason?: ModelFinishReason\n readonly usage?: ModelUsage\n readonly cost?: ModelCallCost\n }\n ) {\n super(message, options)\n this.text = options?.text\n this.providerId = options?.providerId\n this.modelId = options?.modelId\n this.responseId = options?.responseId\n this.responseModelId = options?.responseModelId\n this.finishReason = options?.finishReason\n this.usage = options?.usage\n this.cost = options?.cost\n }\n\n readonly text?: string\n readonly providerId?: string\n readonly modelId?: string\n readonly responseId?: string\n readonly responseModelId?: string\n readonly finishReason?: ModelFinishReason\n readonly usage?: ModelUsage\n readonly cost?: ModelCallCost\n}\n",
|
|
9
|
-
"import type { ModelRoute, ModelUsage } from \"./events\"\nimport type { LanguageModel } from \"./language-model\"\nimport type { LanguageModelRateCard, ModelTokenPrice } from \"./rate-card\"\n\n/** Optional local financial enrichment cannot discard a completed, billable call. */\nexport function estimateModelCall(\n model: LanguageModel,\n input: Parameters<ModelCostEstimator[\"estimate\"]>[0]\n): ModelCostEstimate {\n try {\n return model.costEstimator?.estimate(input) ?? rateModelCall({ usage: input.usage })\n } catch {\n console.warn(\n \"[Sixb] Model cost estimation failed; preserving usage and available provider cost.\"\n )\n return { status: \"unpriceable\", reason: \"missing-rate-card\" }\n }\n}\n\nexport interface ModelMoney {\n readonly currency: \"USD\"\n /** Billionths of one currency unit, serialized as an integer string. */\n readonly amountNanos: string\n}\n\nexport interface ModelReportedCost {\n readonly money: ModelMoney\n readonly providerId?: string\n}\n\n/** A local estimate is never a provider-reported charge. No financial API is required to run. */\nexport type ModelCostEstimate = Exclude<ModelCallCost, { status: \"reported\" }>\n\nexport interface ModelCostEstimator {\n /** Conservative token-cost reservation, including cache writes and pricing tiers.\n * Return undefined when routing or non-token charges prevent a safe local estimate. */\n estimateReservation?(input: {\n readonly inputTokens: number\n readonly outputTokens: number\n }): ModelMoney | undefined\n\n estimate(input: {\n readonly usage: ModelUsage\n readonly route?: ModelRoute\n readonly responseModelId?: string\n }): ModelCostEstimate\n}\n\nexport type ModelCostMeter =\n | \"tokens.input.total\"\n | \"tokens.input.uncached\"\n | \"tokens.input.cacheRead\"\n | \"tokens.input.cacheWrite\"\n | \"tokens.input.cacheWrite5m\"\n | \"tokens.input.cacheWrite1h\"\n | \"tokens.output.total\"\n\nexport interface ModelCostComponent {\n readonly meter: ModelCostMeter\n readonly quantity: string\n readonly rateAmountNanosPerMillion: string\n readonly chargeAmountNanos: string\n}\n\nexport type ModelCallCost =\n | { readonly status: \"reported\"; readonly money: ModelMoney; readonly providerId?: string }\n | {\n readonly status: \"rated\"\n readonly money: ModelMoney\n readonly components: readonly ModelCostComponent[]\n }\n | {\n readonly status: \"unpriceable\"\n readonly reason: \"missing-rate-card\" | \"missing-usage\" | \"inconsistent-usage\"\n readonly missingMeters?: readonly ModelCostMeter[]\n }\n\n/** Reserve at the highest configured token rates, before cache usage and the final tier are known. */\nexport function estimateModelReservation(input: {\n readonly inputTokens: number\n readonly outputTokens: number\n readonly rateCard?: LanguageModelRateCard\n}): ModelMoney | undefined {\n if (!input.rateCard) return undefined\n if (![input.inputTokens, input.outputTokens].every((n) => Number.isSafeInteger(n) && n >= 0)) {\n throw new TypeError(\n \"[Sixb] Model reservation token estimates must be nonnegative safe integers.\"\n )\n }\n const maxRate = (prices: readonly (ModelTokenPrice | undefined)[]) => {\n const rates = prices.flatMap((price) =>\n price === undefined\n ? []\n : typeof price === \"string\"\n ? [price]\n : [price.default, ...price.tiers.map((tier) => tier.price)]\n )\n return rates.reduce((max, price) => {\n const rate = decimalDollarsToNanos(price)\n return rate > max ? rate : max\n }, 0n)\n }\n const card = input.rateCard\n const inputRate = maxRate([\n card.input,\n card.cacheReadInput,\n card.cacheWriteInput,\n card.cacheWriteInput5m,\n card.cacheWriteInput1h,\n ])\n const outputRate = maxRate([card.output])\n const charge = (tokens: number, rate: bigint) => (BigInt(tokens) * rate + 999_999n) / 1_000_000n\n return {\n currency: \"USD\",\n amountNanos: (\n charge(input.inputTokens, inputRate) + charge(input.outputTokens, outputRate)\n ).toString(),\n }\n}\n\n/** Prefer the provider's bill over rate-card estimates, then rate complete token meters locally. */\nexport function rateModelCall(input: {\n readonly usage: ModelUsage\n readonly rateCard?: LanguageModelRateCard\n readonly reported?: undefined\n}): ModelCostEstimate\nexport function rateModelCall(input: {\n readonly usage: ModelUsage\n readonly rateCard?: LanguageModelRateCard\n readonly reported?: ModelReportedCost\n}): ModelCallCost\nexport function rateModelCall(input: {\n readonly usage: ModelUsage\n readonly rateCard?: LanguageModelRateCard\n readonly reported?: ModelReportedCost\n}): ModelCallCost {\n if (input.reported) {\n assertAmountNanos(input.reported.money.amountNanos)\n return {\n status: \"reported\",\n money: input.reported.money,\n ...(input.reported.providerId === undefined ? {} : { providerId: input.reported.providerId }),\n }\n }\n if (!input.rateCard) return { status: \"unpriceable\", reason: \"missing-rate-card\" }\n const { usage, rateCard } = input\n if (!validUsageCounters(usage)) {\n return { status: \"unpriceable\", reason: \"inconsistent-usage\" }\n }\n if (usage.inputTokens === undefined || usage.outputTokens === undefined) {\n return {\n status: \"unpriceable\",\n reason: \"missing-usage\",\n missingMeters: [\n ...(usage.inputTokens === undefined ? ([\"tokens.input.total\"] as const) : []),\n ...(usage.outputTokens === undefined ? ([\"tokens.output.total\"] as const) : []),\n ],\n }\n }\n\n const partitioned = partitionInputUsage(usage, rateCard)\n if (partitioned.status !== \"rated\") return partitioned\n\n const components: ModelCostComponent[] = []\n if (!partitioned.partitioned) {\n components.push(\n component(\"tokens.input.total\", usage.inputTokens, rateCard.input, usage.inputTokens)\n )\n } else {\n components.push(\n component(\"tokens.input.uncached\", partitioned.uncached, rateCard.input, usage.inputTokens)\n )\n if (partitioned.cacheRead !== undefined) {\n components.push(\n component(\n \"tokens.input.cacheRead\",\n partitioned.cacheRead,\n rateCard.cacheReadInput!,\n usage.inputTokens\n )\n )\n }\n if (partitioned.cacheWrite !== undefined) {\n components.push(\n component(\n \"tokens.input.cacheWrite\",\n partitioned.cacheWrite,\n rateCard.cacheWriteInput!,\n usage.inputTokens\n )\n )\n }\n if (partitioned.cacheWrite5m !== undefined) {\n components.push(\n component(\n \"tokens.input.cacheWrite5m\",\n partitioned.cacheWrite5m,\n rateCard.cacheWriteInput5m ?? rateCard.cacheWriteInput!,\n usage.inputTokens\n )\n )\n }\n if (partitioned.cacheWrite1h !== undefined) {\n components.push(\n component(\n \"tokens.input.cacheWrite1h\",\n partitioned.cacheWrite1h,\n rateCard.cacheWriteInput1h ?? rateCard.cacheWriteInput!,\n usage.inputTokens\n )\n )\n }\n }\n components.push(\n component(\"tokens.output.total\", usage.outputTokens, rateCard.output, usage.inputTokens)\n )\n const total = components.reduce((sum, entry) => sum + BigInt(entry.chargeAmountNanos), 0n)\n return {\n status: \"rated\",\n money: { currency: rateCard.currency, amountNanos: total.toString() },\n components,\n }\n}\n\ntype PartitionResult =\n | { readonly status: \"rated\"; readonly partitioned: false }\n | {\n readonly status: \"rated\"\n readonly partitioned: true\n readonly uncached: number\n readonly cacheRead?: number\n readonly cacheWrite?: number\n readonly cacheWrite5m?: number\n readonly cacheWrite1h?: number\n }\n | Extract<ModelCallCost, { status: \"unpriceable\" }>\n\nfunction partitionInputUsage(usage: ModelUsage, rateCard: LanguageModelRateCard): PartitionResult {\n const hasSpecificWrites =\n usage.cacheWrite5mInputTokens !== undefined || usage.cacheWrite1hInputTokens !== undefined\n const cacheWriteSpecific =\n (usage.cacheWrite5mInputTokens ?? 0) + (usage.cacheWrite1hInputTokens ?? 0)\n if (\n hasSpecificWrites &&\n usage.cacheWriteInputTokens !== undefined &&\n usage.cacheWriteInputTokens !== cacheWriteSpecific\n ) {\n return { status: \"unpriceable\", reason: \"inconsistent-usage\" }\n }\n\n const partitioned =\n usage.uncachedInputTokens !== undefined ||\n usage.cacheReadInputTokens !== undefined ||\n usage.cacheWriteInputTokens !== undefined ||\n hasSpecificWrites ||\n rateCard.cacheReadInput !== undefined ||\n rateCard.cacheWriteInput !== undefined ||\n rateCard.cacheWriteInput5m !== undefined ||\n rateCard.cacheWriteInput1h !== undefined\n if (!partitioned) return { status: \"rated\", partitioned: false }\n\n const cacheRead = usage.cacheReadInputTokens ?? 0\n const totalWrite = usage.cacheWriteInputTokens ?? cacheWriteSpecific\n if (usage.inputTokens !== undefined && cacheRead + totalWrite > usage.inputTokens) {\n return { status: \"unpriceable\", reason: \"inconsistent-usage\" }\n }\n\n const missing: ModelCostMeter[] = []\n if (usage.uncachedInputTokens === undefined) missing.push(\"tokens.input.uncached\")\n if (rateCard.cacheReadInput !== undefined && usage.cacheReadInputTokens === undefined) {\n missing.push(\"tokens.input.cacheRead\")\n }\n if (\n rateCard.cacheWriteInput !== undefined &&\n rateCard.cacheWriteInput5m === undefined &&\n rateCard.cacheWriteInput1h === undefined &&\n usage.cacheWriteInputTokens === undefined\n ) {\n missing.push(\"tokens.input.cacheWrite\")\n }\n if (rateCard.cacheWriteInput5m !== undefined && usage.cacheWrite5mInputTokens === undefined) {\n missing.push(\"tokens.input.cacheWrite5m\")\n }\n if (rateCard.cacheWriteInput1h !== undefined && usage.cacheWrite1hInputTokens === undefined) {\n missing.push(\"tokens.input.cacheWrite1h\")\n }\n if (missing.length > 0) {\n return { status: \"unpriceable\", reason: \"missing-usage\", missingMeters: missing }\n }\n if (cacheRead > 0 && rateCard.cacheReadInput === undefined) {\n return {\n status: \"unpriceable\",\n reason: \"missing-rate-card\",\n missingMeters: [\"tokens.input.cacheRead\"],\n }\n }\n if (!hasSpecificWrites && totalWrite > 0 && rateCard.cacheWriteInput === undefined) {\n return {\n status: \"unpriceable\",\n reason: \"missing-rate-card\",\n missingMeters: [\"tokens.input.cacheWrite\"],\n }\n }\n if (\n (usage.cacheWrite5mInputTokens ?? 0) > 0 &&\n rateCard.cacheWriteInput5m === undefined &&\n rateCard.cacheWriteInput === undefined\n ) {\n return {\n status: \"unpriceable\",\n reason: \"missing-rate-card\",\n missingMeters: [\"tokens.input.cacheWrite5m\"],\n }\n }\n if (\n (usage.cacheWrite1hInputTokens ?? 0) > 0 &&\n rateCard.cacheWriteInput1h === undefined &&\n rateCard.cacheWriteInput === undefined\n ) {\n return {\n status: \"unpriceable\",\n reason: \"missing-rate-card\",\n missingMeters: [\"tokens.input.cacheWrite1h\"],\n }\n }\n\n const uncached = usage.uncachedInputTokens!\n if (uncached + cacheRead + totalWrite !== usage.inputTokens) {\n return { status: \"unpriceable\", reason: \"inconsistent-usage\" }\n }\n return {\n status: \"rated\",\n partitioned: true,\n uncached,\n ...(rateCard.cacheReadInput === undefined ? {} : { cacheRead }),\n ...(hasSpecificWrites\n ? {\n cacheWrite5m: usage.cacheWrite5mInputTokens ?? 0,\n cacheWrite1h: usage.cacheWrite1hInputTokens ?? 0,\n }\n : rateCard.cacheWriteInput === undefined\n ? {}\n : { cacheWrite: totalWrite }),\n }\n}\n\nfunction validUsageCounters(usage: ModelUsage): boolean {\n return Object.entries(usage)\n .filter(([key]) => key !== \"raw\")\n .every(([, value]) => value === undefined || (Number.isSafeInteger(value) && value >= 0))\n}\n\nfunction component(\n meter: ModelCostMeter,\n quantity: number,\n price: ModelTokenPrice,\n tierTokens: number\n): ModelCostComponent {\n const rate = decimalDollarsToNanos(resolvePrice(price, tierTokens))\n const charge = (BigInt(quantity) * rate + 500_000n) / 1_000_000n\n return {\n meter,\n quantity: quantity.toString(),\n rateAmountNanosPerMillion: rate.toString(),\n chargeAmountNanos: charge.toString(),\n }\n}\n\nfunction resolvePrice(price: ModelTokenPrice, tokens: number): string {\n if (typeof price === \"string\") return price\n return (\n price.tiers.find(\n (tier) =>\n tokens >= tier.minTokens && (tier.maxTokens === undefined || tokens < tier.maxTokens)\n )?.price ?? price.default\n )\n}\n\nfunction decimalDollarsToNanos(value: string): bigint {\n const [whole = \"0\", fraction = \"\"] = value.split(\".\")\n const nanos = fraction.slice(0, 9).padEnd(9, \"0\")\n const roundUp = Number(fraction[9] ?? \"0\") >= 5\n return BigInt(whole) * 1_000_000_000n + BigInt(nanos) + (roundUp ? 1n : 0n)\n}\n\nfunction assertAmountNanos(value: string): void {\n if (!/^(?:0|[1-9]\\d*)$/.test(value)) {\n throw new TypeError(\"[Sixb] Provider-reported model cost must use nonnegative amountNanos.\")\n }\n}\n",
|
|
10
|
-
"/** Decimal USD per million tokens. Strings keep provider prices exact. */\nexport type ModelUnitPrice = string\n\nexport interface ModelPricingTier {\n readonly minTokens: number\n readonly maxTokens?: number\n readonly price: ModelUnitPrice\n}\n\nexport type ModelTokenPrice =\n | ModelUnitPrice\n | { readonly default: ModelUnitPrice; readonly tiers: readonly ModelPricingTier[] }\n\nexport interface LanguageModelRateCard {\n readonly currency: \"USD\"\n readonly unit: \"million-tokens\"\n readonly input: ModelTokenPrice\n readonly output: ModelTokenPrice\n readonly cacheReadInput?: ModelTokenPrice\n readonly cacheWriteInput?: ModelTokenPrice\n readonly cacheWriteInput5m?: ModelTokenPrice\n readonly cacheWriteInput1h?: ModelTokenPrice\n}\n\n/** Validate and snapshot provider-owned pricing independently of operational metadata. */\nexport function defineModelRateCard(rateCard: LanguageModelRateCard): LanguageModelRateCard {\n assertRecord(rateCard, \"rate card\")\n if (rateCard.currency !== \"USD\" || rateCard.unit !== \"million-tokens\") {\n throw new TypeError(\"[Sixb] Model rate cards must use USD per million tokens.\")\n }\n return Object.freeze({\n currency: \"USD\",\n unit: \"million-tokens\",\n input: tokenPrice(rateCard.input),\n output: tokenPrice(rateCard.output),\n ...(rateCard.cacheReadInput === undefined\n ? {}\n : { cacheReadInput: tokenPrice(rateCard.cacheReadInput) }),\n ...(rateCard.cacheWriteInput === undefined\n ? {}\n : { cacheWriteInput: tokenPrice(rateCard.cacheWriteInput) }),\n ...(rateCard.cacheWriteInput5m === undefined\n ? {}\n : { cacheWriteInput5m: tokenPrice(rateCard.cacheWriteInput5m) }),\n ...(rateCard.cacheWriteInput1h === undefined\n ? {}\n : { cacheWriteInput1h: tokenPrice(rateCard.cacheWriteInput1h) }),\n })\n}\n\nfunction tokenPrice(value: ModelTokenPrice): ModelTokenPrice {\n if (typeof value === \"string\") return price(value)\n assertRecord(value, \"token price\")\n if (!Array.isArray(value.tiers)) throw new TypeError(\"[Sixb] Model price tiers must be an array.\")\n let previousMax = 0\n return Object.freeze({\n default: price(value.default),\n tiers: Object.freeze(\n value.tiers.map((tier, index) => {\n assertRecord(tier, \"price tier\")\n if (\n typeof tier.minTokens !== \"number\" ||\n !Number.isSafeInteger(tier.minTokens) ||\n tier.minTokens < 0\n ) {\n throw new TypeError(\"[Sixb] Model price tier has an invalid minimum.\")\n }\n if (index > 0 && tier.minTokens < previousMax) {\n throw new TypeError(\"[Sixb] Model price tiers must be ordered and nonoverlapping.\")\n }\n if (\n tier.maxTokens !== undefined &&\n (typeof tier.maxTokens !== \"number\" ||\n !Number.isSafeInteger(tier.maxTokens) ||\n tier.maxTokens <= tier.minTokens)\n ) {\n throw new TypeError(\"[Sixb] Model price tier has an invalid maximum.\")\n }\n previousMax = tier.maxTokens ?? Number.POSITIVE_INFINITY\n return Object.freeze({\n minTokens: tier.minTokens,\n ...(tier.maxTokens === undefined ? {} : { maxTokens: tier.maxTokens }),\n price: price(tier.price),\n })\n })\n ),\n })\n}\n\nfunction price(value: unknown): string {\n if (typeof value !== \"string\" || !/^(?:0|[1-9]\\d*)(?:\\.\\d+)?$/.test(value)) {\n throw new TypeError(\"[Sixb] Model price must be a nonnegative decimal string.\")\n }\n return value\n}\n\nfunction assertRecord(value: unknown, field: string): asserts value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n throw new TypeError(`[Sixb] Model ${field} must be an object.`)\n }\n}\n"
|
|
11
|
-
],
|
|
12
|
-
"mappings": "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",
|
|
13
|
-
"debugId": "810247FDAE074F0764756E2164756E21",
|
|
14
|
-
"names": []
|
|
15
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/events/errors.ts", "../src/events/definitions.ts", "../src/events/outbox-dispatcher.ts", "../src/events/service.ts", "../src/events/toStoredEvent.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/**\n * Error for event runtime invariants and failures (e.g., unknown event\n * types encountered when converting new events to their stored form).\n */\nexport class EventsError extends Error {\n readonly name = \"EventsError\"\n}\n",
|
|
6
|
-
"import { EventsError } from \"./errors\"\nimport type { ActionEvent } from \"./types/actions\"\nimport type { DatasetEvent } from \"./types/datasets\"\nimport type { DomainEvent, DomainEventDraft } from \"./types/index\"\nimport type { LinkEvent } from \"./types/links\"\nimport type { ObjectEvent } from \"./types/objects\"\nimport type { PipelineEvent } from \"./types/pipelines\"\nimport type { RuleEvent } from \"./types/rules\"\nimport type { ScheduleEvent } from \"./types/schedules\"\nimport type { SyncEvent } from \"./types/syncs\"\nimport type { TelemetryEvent } from \"./types/telemetry\"\nimport type { WorkflowEvent } from \"./types/workflows\"\n\nexport type EventDefinition<Event extends DomainEvent = DomainEvent> = {\n readonly topic: Event[\"topic\"]\n readonly partitionKey: (payload: Event[\"payload\"]) => string\n}\n\nexport type EventDefinitionGroup<Event extends DomainEvent> = {\n readonly [Type in Event[\"type\"]]: EventDefinition<Extract<Event, { type: Type }>>\n}\n\nexport type EventDefinitionMap = {\n readonly [Type in DomainEvent[\"type\"]]: EventDefinition<Extract<DomainEvent, { type: Type }>>\n}\n\nfunction defineEventGroup<Event extends DomainEvent>(\n definitions: EventDefinitionGroup<Event>\n): EventDefinitionGroup<Event> {\n return definitions\n}\n\nexport const OBJECT_EVENT_DEFINITIONS = defineEventGroup<ObjectEvent>({\n \"object.created\": {\n topic: \"objects\",\n partitionKey: (payload) => `${payload.objectTypeId}:${payload.primaryId}`,\n },\n \"object.updated\": {\n topic: \"objects\",\n partitionKey: (payload) => `${payload.objectTypeId}:${payload.primaryId}`,\n },\n \"object.deleted\": {\n topic: \"objects\",\n partitionKey: (payload) => `${payload.objectTypeId}:${payload.primaryId}`,\n },\n})\n\nexport const TELEMETRY_EVENT_DEFINITIONS = defineEventGroup<TelemetryEvent>({\n \"telemetry.appended\": {\n topic: \"telemetry\",\n partitionKey: (payload) => `${payload.objectTypeId}:${payload.objectId}:${payload.propertyId}`,\n },\n})\n\nexport const LINK_EVENT_DEFINITIONS = defineEventGroup<LinkEvent>({\n \"link.created\": {\n topic: \"links\",\n partitionKey: (payload) => `${payload.sourceTypeId}:${payload.sourceId}:${payload.linkId}`,\n },\n \"link.updated\": {\n topic: \"links\",\n partitionKey: (payload) => `${payload.sourceTypeId}:${payload.sourceId}:${payload.linkId}`,\n },\n \"link.deleted\": {\n topic: \"links\",\n partitionKey: (payload) => `${payload.sourceTypeId}:${payload.sourceId}:${payload.linkId}`,\n },\n})\n\nexport const ACTION_EVENT_DEFINITIONS = defineEventGroup<ActionEvent>({\n \"action.requested\": {\n topic: \"actions\",\n partitionKey: (payload) => payload.actionId,\n },\n \"action.completed\": {\n topic: \"actions\",\n partitionKey: (payload) => payload.actionId,\n },\n \"action.failed\": {\n topic: \"actions\",\n partitionKey: (payload) => payload.actionId,\n },\n})\n\nexport const SCHEDULE_EVENT_DEFINITIONS = defineEventGroup<ScheduleEvent>({\n \"schedule.triggered\": {\n topic: \"schedules\",\n partitionKey: (payload) => payload.scheduleId,\n },\n})\n\nexport const RULE_EVENT_DEFINITIONS = defineEventGroup<RuleEvent>({\n \"rule.triggered\": {\n topic: \"rules\",\n partitionKey: (payload) =>\n `${payload.ruleId}:${payload.subject.objectTypeId}:${payload.subject.primaryId}`,\n },\n \"rule.resolved\": {\n topic: \"rules\",\n partitionKey: (payload) =>\n `${payload.ruleId}:${payload.subject.objectTypeId}:${payload.subject.primaryId}`,\n },\n})\n\nexport const SYNC_EVENT_DEFINITIONS = defineEventGroup<SyncEvent>({\n \"sync.run.started\": {\n topic: \"syncs\",\n partitionKey: (payload) => `${payload.syncId}:${payload.runId}`,\n },\n \"sync.run.finished\": {\n topic: \"syncs\",\n partitionKey: (payload) => `${payload.syncId}:${payload.runId}`,\n },\n})\n\nexport const PIPELINE_EVENT_DEFINITIONS = defineEventGroup<PipelineEvent>({\n \"pipeline.run.started\": {\n topic: \"pipelines\",\n partitionKey: (payload) => `${payload.pipelineId}:${payload.runId}`,\n },\n \"pipeline.run.step.started\": {\n topic: \"pipelines\",\n partitionKey: (payload) => `${payload.pipelineId}:${payload.runId}`,\n },\n \"pipeline.run.step.finished\": {\n topic: \"pipelines\",\n partitionKey: (payload) => `${payload.pipelineId}:${payload.runId}`,\n },\n \"pipeline.run.finished\": {\n topic: \"pipelines\",\n partitionKey: (payload) => `${payload.pipelineId}:${payload.runId}`,\n },\n})\n\nexport const WORKFLOW_EVENT_DEFINITIONS = defineEventGroup<WorkflowEvent>({\n \"workflow.run.queued\": {\n topic: \"workflows\",\n partitionKey: (payload) => `${payload.workflowId}:${payload.runId}`,\n },\n \"workflow.run.started\": {\n topic: \"workflows\",\n partitionKey: (payload) => `${payload.workflowId}:${payload.runId}`,\n },\n \"workflow.run.node.started\": {\n topic: \"workflows\",\n partitionKey: (payload) => `${payload.workflowId}:${payload.runId}`,\n },\n \"workflow.run.waiting\": {\n topic: \"workflows\",\n partitionKey: (payload) => `${payload.workflowId}:${payload.runId}`,\n },\n \"workflow.run.node.waiting\": {\n topic: \"workflows\",\n partitionKey: (payload) => `${payload.workflowId}:${payload.runId}`,\n },\n \"workflow.run.node.finished\": {\n topic: \"workflows\",\n partitionKey: (payload) => `${payload.workflowId}:${payload.runId}`,\n },\n \"workflow.run.finished\": {\n topic: \"workflows\",\n partitionKey: (payload) => `${payload.workflowId}:${payload.runId}`,\n },\n \"workflow.intervention.requested\": {\n topic: \"workflows\",\n partitionKey: (payload) => `${payload.workflowId}:${payload.runId}`,\n },\n \"workflow.intervention.submitted\": {\n topic: \"workflows\",\n partitionKey: (payload) => `${payload.workflowId}:${payload.runId}`,\n },\n \"workflow.intervention.cancelled\": {\n topic: \"workflows\",\n partitionKey: (payload) => `${payload.workflowId}:${payload.runId}`,\n },\n \"workflow.intervention.expired\": {\n topic: \"workflows\",\n partitionKey: (payload) => `${payload.workflowId}:${payload.runId}`,\n },\n})\n\nexport const DATASET_EVENT_DEFINITIONS = defineEventGroup<DatasetEvent>({\n \"dataset.version.committed\": {\n topic: \"datasets\",\n partitionKey: (payload) => payload.datasetId,\n },\n})\n\nexport const EVENT_DEFINITIONS = {\n ...OBJECT_EVENT_DEFINITIONS,\n ...TELEMETRY_EVENT_DEFINITIONS,\n ...LINK_EVENT_DEFINITIONS,\n ...ACTION_EVENT_DEFINITIONS,\n ...SCHEDULE_EVENT_DEFINITIONS,\n ...SYNC_EVENT_DEFINITIONS,\n ...PIPELINE_EVENT_DEFINITIONS,\n ...WORKFLOW_EVENT_DEFINITIONS,\n ...DATASET_EVENT_DEFINITIONS,\n ...RULE_EVENT_DEFINITIONS,\n} as const satisfies EventDefinitionMap\n\nexport const EVENT_TYPES = Object.keys(EVENT_DEFINITIONS) as readonly DomainEvent[\"type\"][]\nexport const EVENT_TOPICS = [\n ...new Set(\n Object.values(EVENT_DEFINITIONS).map((definition): DomainEvent[\"topic\"] => definition.topic)\n ),\n] as readonly DomainEvent[\"topic\"][]\n\nexport function isDomainEventType(value: string): value is DomainEvent[\"type\"] {\n return Object.hasOwn(EVENT_DEFINITIONS, value)\n}\n\nexport function isOntologyFactType(\n value: string\n): value is ObjectEvent[\"type\"] | LinkEvent[\"type\"] | TelemetryEvent[\"type\"] {\n return (\n Object.hasOwn(OBJECT_EVENT_DEFINITIONS, value) ||\n Object.hasOwn(LINK_EVENT_DEFINITIONS, value) ||\n Object.hasOwn(TELEMETRY_EVENT_DEFINITIONS, value)\n )\n}\n\nexport function resolveEventStorage(event: DomainEventDraft): {\n readonly topic: DomainEvent[\"topic\"]\n readonly partitionKey: string\n} {\n const eventType = event.type as string\n if (!isDomainEventType(eventType)) {\n throw new EventsError(`Unknown event type: ${eventType}`)\n }\n\n const definition = EVENT_DEFINITIONS[eventType] as EventDefinition\n return {\n topic: definition.topic,\n partitionKey: definition.partitionKey(event.payload),\n }\n}\n",
|
|
7
|
-
"import { randomUUID } from \"node:crypto\"\nimport { createSixbError, serializeSixbFailure, toSixbFailure } from \"../errors/internal\"\nimport type {\n ClaimedOntologyOutboxRow,\n OntologyOutboxFailure,\n OntologyOutboxStorage,\n Storage,\n} from \"../storage\"\nimport { ONTOLOGY_OUTBOX_FAILURE_CODES } from \"../storage/ontology/outbox\"\nimport type { StableEventPublisher } from \"./service\"\n\nconst DEFAULT_BATCH_SIZE = 1_000\nconst DEFAULT_LEASE_DURATION_MS = 30_000\nconst DEFAULT_INITIAL_RETRY_DELAY_MS = 1_000\nconst DEFAULT_MAX_RETRY_DELAY_MS = 5 * 60_000\nconst DEFAULT_RETRY_JITTER_RATIO = 0.2\n// Isolating one poison row from a 1,000-row batch needs up to 21 broker calls: one failed call\n// and, at each split depth, one healthy sibling plus the failing half. Keep bounded headroom for\n// uneven splits while rescheduling unresolved groups once this pass reaches the cap.\nconst DEFAULT_MAX_ISOLATION_ATTEMPTS = 32\nconst DEFAULT_MAX_CLAIMS_PER_DRAIN = 10\nconst DEFAULT_SHUTDOWN_TIMEOUT_MS = 30_000\n\nexport interface OntologyOutboxDeliveryFailure {\n readonly occurredAt: string\n /** Exact failure persisted on every envelope represented by this report. */\n readonly failure: OntologyOutboxFailure\n readonly attempts: number\n readonly eventIds: readonly string[]\n /** Types of the undelivered envelopes. The one field both delivery paths can always report. */\n readonly eventTypes: readonly string[]\n}\n\nexport interface OntologyOutboxDispatcherOptions {\n readonly projectId: string\n readonly storage: Storage\n /** Internal publisher port. It cannot author or mutate persisted ontology facts. */\n readonly events: StableEventPublisher\n readonly batchSize?: number\n readonly leaseDurationMs?: number\n readonly initialRetryDelayMs?: number\n readonly maxRetryDelayMs?: number\n /** Symmetric jitter ratio in the inclusive range 0..1. */\n readonly retryJitterRatio?: number\n /** Maximum broker calls used to isolate poison envelopes in one claimed batch. */\n readonly maxIsolationAttempts?: number\n /** Maximum claimed batches handled by one drain pass. */\n readonly maxClaimsPerDrain?: number\n readonly shutdownTimeoutMs?: number\n readonly now?: () => Date\n readonly random?: () => number\n readonly createLeaseId?: () => string\n readonly onDeliveryFailure?: (error: unknown, failure: OntologyOutboxDeliveryFailure) => void\n readonly onError?: (error: unknown) => void\n}\n\n/**\n * One claimed batch whose unsettled rows remain recoverable during shutdown.\n *\n * Rows leave the set immediately before their lease is settled in storage. If storage settlement\n * itself fails, lease expiry remains the durable recovery path.\n */\nclass ClaimedBatch {\n private readonly unsettled = new Map<string, ClaimedOntologyOutboxRow>()\n private closed = false\n\n constructor(rows: readonly ClaimedOntologyOutboxRow[]) {\n for (const row of rows) this.unsettled.set(row.envelope.id, row)\n }\n\n take(rows: readonly ClaimedOntologyOutboxRow[]): readonly ClaimedOntologyOutboxRow[] {\n if (this.closed || rows.some((row) => !this.unsettled.has(row.envelope.id))) return []\n for (const row of rows) this.unsettled.delete(row.envelope.id)\n return rows\n }\n\n close(): readonly ClaimedOntologyOutboxRow[] {\n this.closed = true\n const rows = [...this.unsettled.values()]\n this.unsettled.clear()\n return rows\n }\n}\n\n/** Lease-based, at-least-once publisher for the authoritative ontology outbox. */\nexport class OntologyOutboxDispatcher {\n private readonly projectId: string\n private readonly storage: Storage\n private readonly events: StableEventPublisher\n private readonly batchSize: number\n private readonly leaseDurationMs: number\n private readonly initialRetryDelayMs: number\n private readonly maxRetryDelayMs: number\n private readonly retryJitterRatio: number\n private readonly maxIsolationAttempts: number\n private readonly maxClaimsPerDrain: number\n private readonly shutdownTimeoutMs: number\n private readonly now: () => Date\n private readonly random: () => number\n private readonly createLeaseId: () => string\n private readonly onDeliveryFailure?: OntologyOutboxDispatcherOptions[\"onDeliveryFailure\"]\n private readonly onError: (error: unknown) => void\n private readonly inFlight = new Set<ClaimedBatch>()\n private draining: Promise<void> | null = null\n private pendingDrain: Promise<void> | null = null\n private stopping: Promise<void> | null = null\n private stopRequested = false\n private readonly forcedStop = new AbortController()\n\n constructor(options: OntologyOutboxDispatcherOptions) {\n assertNonblank(options.projectId, \"projectId\")\n this.projectId = options.projectId\n this.storage = options.storage\n this.events = options.events\n this.batchSize = positiveInteger(options.batchSize ?? DEFAULT_BATCH_SIZE, \"batchSize\")\n this.leaseDurationMs = positiveInteger(\n options.leaseDurationMs ?? DEFAULT_LEASE_DURATION_MS,\n \"leaseDurationMs\"\n )\n this.initialRetryDelayMs = positiveInteger(\n options.initialRetryDelayMs ?? DEFAULT_INITIAL_RETRY_DELAY_MS,\n \"initialRetryDelayMs\"\n )\n this.maxRetryDelayMs = positiveInteger(\n options.maxRetryDelayMs ?? DEFAULT_MAX_RETRY_DELAY_MS,\n \"maxRetryDelayMs\"\n )\n if (this.maxRetryDelayMs < this.initialRetryDelayMs) {\n throw new Error(\n \"[Sixb] Ontology outbox dispatcher maxRetryDelayMs must be at least initialRetryDelayMs.\"\n )\n }\n this.retryJitterRatio = options.retryJitterRatio ?? DEFAULT_RETRY_JITTER_RATIO\n if (\n !Number.isFinite(this.retryJitterRatio) ||\n this.retryJitterRatio < 0 ||\n this.retryJitterRatio > 1\n ) {\n throw new Error(\"[Sixb] Ontology outbox dispatcher retryJitterRatio must be between 0 and 1.\")\n }\n this.maxIsolationAttempts = positiveInteger(\n options.maxIsolationAttempts ?? DEFAULT_MAX_ISOLATION_ATTEMPTS,\n \"maxIsolationAttempts\"\n )\n this.maxClaimsPerDrain = positiveInteger(\n options.maxClaimsPerDrain ?? DEFAULT_MAX_CLAIMS_PER_DRAIN,\n \"maxClaimsPerDrain\"\n )\n this.shutdownTimeoutMs = nonnegativeInteger(\n options.shutdownTimeoutMs ?? DEFAULT_SHUTDOWN_TIMEOUT_MS,\n \"shutdownTimeoutMs\"\n )\n this.now = options.now ?? (() => new Date())\n this.random = options.random ?? Math.random\n this.createLeaseId = options.createLeaseId ?? randomUUID\n this.onDeliveryFailure = options.onDeliveryFailure\n this.onError =\n options.onError ?? ((error) => console.error(\"[Sixb] Outbox dispatcher error:\", error))\n }\n\n /**\n * Publishes one bounded pass of currently due rows without starting an idle polling loop.\n *\n * Concurrent callers share one pass and at most one coalesced follow-up pass. This gives every\n * post-commit notification a chance to observe its own rows without serializing one pass per\n * mutation.\n */\n drain(): Promise<void> {\n if (this.stopRequested) return Promise.resolve()\n if (!this.draining) return this.startDrainPass()\n\n this.pendingDrain ??= settled(this.draining).then(() => {\n this.pendingDrain = null\n if (!this.stopRequested) return this.startDrainPass()\n })\n return this.pendingDrain\n }\n\n /** Starts a tracked, best-effort drain without extending mutation latency. */\n notify(): void {\n if (this.stopRequested) return\n void this.drain().catch((error) => this.reportError(error))\n }\n\n stop(): Promise<void> {\n this.stopping ??= this.stopOnce()\n return this.stopping\n }\n\n private async stopOnce(): Promise<void> {\n if (this.stopRequested) return\n\n // Include one final bounded pass so commits whose notifications were coalesced immediately\n // before shutdown are not left pending merely because the process is stopping.\n const gracefulDrain = this.drain().catch((error) => this.reportError(error))\n if (await settlesWithin(gracefulDrain, this.shutdownTimeoutMs)) {\n this.stopRequested = true\n return\n }\n\n this.stopRequested = true\n this.forcedStop.abort()\n await settlesWithin(\n this.rescheduleUnsettledForShutdown(),\n Math.min(this.shutdownTimeoutMs, 1_000)\n )\n this.draining = null\n this.pendingDrain = null\n }\n\n private startDrainPass(): Promise<void> {\n const pass = this.drainAvailable()\n this.draining = pass\n void settled(pass).then(() => {\n if (this.draining === pass) this.draining = null\n })\n return pass\n }\n\n private async drainAvailable(): Promise<void> {\n for (let claimCount = 0; claimCount < this.maxClaimsPerDrain; claimCount += 1) {\n if (this.stopRequested) return\n const rows = await this.claimBatch()\n if (rows.length === 0) return\n const publishedCount = await this.publishClaim(rows)\n if (this.stopRequested || publishedCount === 0 || rows.length < this.batchSize) return\n }\n\n // A healthy full slice means more due rows may remain. Reuse the existing coalescing path so\n // catch-up continues without recursion, an idle polling loop, or an unbounded individual pass.\n if (!this.stopRequested) this.notify()\n }\n\n private claimBatch(): Promise<readonly ClaimedOntologyOutboxRow[]> {\n const now = this.now().getTime()\n return this.withOutbox((outbox) =>\n outbox.claim({\n projectId: this.projectId,\n now: new Date(now).toISOString(),\n limit: this.batchSize,\n leaseId: this.createLeaseId(),\n leaseExpiresAt: new Date(now + this.leaseDurationMs).toISOString(),\n })\n )\n }\n\n private async publishClaim(rows: readonly ClaimedOntologyOutboxRow[]): Promise<number> {\n const claim = new ClaimedBatch(rows)\n const failures = new DeliveryFailureAccumulator()\n this.inFlight.add(claim)\n const pending: PublicationGroup[] = [{ rows }]\n let publishAttempts = 0\n let publishedCount = 0\n\n try {\n while (pending.length > 0 && !this.stopRequested) {\n const group = pending.shift()\n if (!group || group.rows.length === 0) continue\n if (publishAttempts >= this.maxIsolationAttempts && group.failure) {\n await this.rescheduleFailed(claim, group.rows, group.failure.error, failures)\n continue\n }\n publishAttempts += 1\n\n try {\n const publication = await publishUntilStopped(\n this.events.publishEnvelopes(group.rows.map((row) => row.envelope)),\n this.forcedStop.signal\n )\n if (publication === \"stopped\") break\n } catch (error) {\n if (group.rows.length > 1 && publishAttempts < this.maxIsolationAttempts) {\n const middle = Math.ceil(group.rows.length / 2)\n pending.unshift(\n { rows: group.rows.slice(middle), failure: { error } },\n { rows: group.rows.slice(0, middle), failure: { error } }\n )\n continue\n }\n await this.rescheduleFailed(claim, group.rows, error, failures)\n continue\n }\n\n await this.markPublished(claim, group.rows)\n publishedCount += group.rows.length\n }\n } finally {\n if (this.stopRequested) {\n await this.rescheduleClaimedForShutdown(claim.close())\n }\n this.inFlight.delete(claim)\n for (const failure of failures.list()) {\n this.reportDeliveryFailure(failure.error, failure.context)\n }\n }\n return publishedCount\n }\n\n private async markPublished(\n claim: ClaimedBatch,\n rows: readonly ClaimedOntologyOutboxRow[]\n ): Promise<void> {\n const settling = claim.take(rows)\n if (settling.length === 0) return\n try {\n await this.withOutbox((outbox) =>\n outbox.markPublished({\n projectId: this.projectId,\n ids: eventIds(settling),\n leaseId: sharedLeaseId(settling),\n publishedAt: this.now().toISOString(),\n })\n )\n } catch (error) {\n this.reportError(error)\n throw error\n }\n }\n\n private async rescheduleFailed(\n claim: ClaimedBatch,\n rows: readonly ClaimedOntologyOutboxRow[],\n error: unknown,\n failures: DeliveryFailureAccumulator\n ): Promise<void> {\n const settling = claim.take(rows)\n if (settling.length === 0) return\n const failedAt = this.now()\n\n for (const [attempts, attemptRows] of rowsByAttempts(settling)) {\n const deliveryError = createEventDeliveryError(error, attempts)\n const failure = toSixbFailure(deliveryError, {\n allowedCodes: ONTOLOGY_OUTBOX_FAILURE_CODES,\n at: failedAt,\n })\n failures.add(deliveryError, failure, failedAt.toISOString(), attempts, attemptRows)\n try {\n await this.withOutbox((outbox) =>\n outbox.reschedule({\n projectId: this.projectId,\n ids: eventIds(attemptRows),\n leaseId: sharedLeaseId(attemptRows),\n availableAt: new Date(failedAt.getTime() + this.retryDelayMs(attempts)).toISOString(),\n failure,\n })\n )\n } catch (rescheduleError) {\n this.reportError(rescheduleError)\n throw rescheduleError\n }\n }\n }\n\n private retryDelayMs(attempts: number): number {\n const exponent = Math.max(0, Math.min(52, attempts - 1))\n const exponential = Math.min(this.maxRetryDelayMs, this.initialRetryDelayMs * 2 ** exponent)\n const random = this.random()\n const unitRandom = Number.isFinite(random) ? Math.max(0, Math.min(1, random)) : 0.5\n const jitterFactor = 1 - this.retryJitterRatio + 2 * this.retryJitterRatio * unitRandom\n return Math.min(this.maxRetryDelayMs, Math.max(0, Math.round(exponential * jitterFactor)))\n }\n\n private async rescheduleClaimedForShutdown(\n rows: readonly ClaimedOntologyOutboxRow[]\n ): Promise<void> {\n if (rows.length === 0) return\n try {\n await this.withOutbox((outbox) =>\n outbox.reschedule({\n projectId: this.projectId,\n ids: eventIds(rows),\n leaseId: sharedLeaseId(rows),\n availableAt: this.now().toISOString(),\n })\n )\n } catch (error) {\n this.reportError(error)\n }\n }\n\n private async rescheduleUnsettledForShutdown(): Promise<void> {\n for (const claim of [...this.inFlight]) {\n await this.rescheduleClaimedForShutdown(claim.close())\n this.inFlight.delete(claim)\n }\n }\n\n private withOutbox<T>(run: (outbox: OntologyOutboxStorage) => Promise<T> | T): Promise<T> {\n return this.storage.transaction((tx) => run(tx.ontology.outbox))\n }\n\n private reportDeliveryFailure(error: unknown, failure: OntologyOutboxDeliveryFailure): void {\n try {\n this.onDeliveryFailure?.(error, failure)\n } catch {\n // Failure observers cannot stop delivery or create an unhandled rejection.\n }\n }\n\n private reportError(error: unknown): void {\n try {\n this.onError(error)\n } catch {\n // Error observers cannot stop delivery or create an unhandled rejection.\n }\n }\n}\n\ninterface PublicationGroup {\n readonly rows: readonly ClaimedOntologyOutboxRow[]\n readonly failure?: { readonly error: unknown }\n}\n\ninterface AccumulatedDeliveryFailure {\n readonly error: unknown\n readonly context: OntologyOutboxDeliveryFailure\n}\n\n/** Coalesces bisection failures so one claimed row is reported once per delivery attempt. */\nclass DeliveryFailureAccumulator {\n private readonly groups = new Map<\n string,\n {\n error: unknown\n failure: OntologyOutboxFailure\n occurredAt: string\n attempts: number\n eventIds: Set<string>\n eventTypes: Set<string>\n }\n >()\n\n add(\n error: unknown,\n failure: OntologyOutboxFailure,\n occurredAt: string,\n attempts: number,\n rows: readonly ClaimedOntologyOutboxRow[]\n ): void {\n const key = serializeSixbFailure(failure, ONTOLOGY_OUTBOX_FAILURE_CODES)\n const group = this.groups.get(key) ?? {\n error,\n failure,\n occurredAt,\n attempts,\n eventIds: new Set<string>(),\n eventTypes: new Set<string>(),\n }\n for (const row of rows) {\n group.eventIds.add(row.envelope.id)\n group.eventTypes.add(row.envelope.type)\n }\n this.groups.set(key, group)\n }\n\n list(): readonly AccumulatedDeliveryFailure[] {\n return [...this.groups.values()].map((group) => ({\n error: group.error,\n context: {\n occurredAt: group.occurredAt,\n failure: group.failure,\n attempts: group.attempts,\n eventIds: [...group.eventIds].sort(),\n eventTypes: [...group.eventTypes].sort(),\n },\n }))\n }\n}\n\nfunction positiveInteger(value: number, name: string): number {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new Error(`[Sixb] Ontology outbox dispatcher ${name} must be a positive integer.`)\n }\n return value\n}\n\nfunction nonnegativeInteger(value: number, name: string): number {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`[Sixb] Ontology outbox dispatcher ${name} must be a nonnegative integer.`)\n }\n return value\n}\n\nfunction assertNonblank(value: string, name: string): void {\n if (value.trim().length === 0) {\n throw new Error(`[Sixb] Ontology outbox dispatcher ${name} must not be blank.`)\n }\n}\n\nfunction rowsByAttempts(\n rows: readonly ClaimedOntologyOutboxRow[]\n): ReadonlyMap<number, readonly ClaimedOntologyOutboxRow[]> {\n const groups = new Map<number, ClaimedOntologyOutboxRow[]>()\n for (const row of rows) {\n const group = groups.get(row.attempts) ?? []\n group.push(row)\n groups.set(row.attempts, group)\n }\n return groups\n}\n\nfunction eventIds(rows: readonly ClaimedOntologyOutboxRow[]): string[] {\n return rows.map((row) => row.envelope.id)\n}\n\nfunction sharedLeaseId(rows: readonly ClaimedOntologyOutboxRow[]): string {\n const leaseId = rows[0]?.leaseId\n if (!leaseId || rows.some((row) => row.leaseId !== leaseId)) {\n throw new Error(\"[Sixb] Claimed ontology outbox batch does not share one lease.\")\n }\n return leaseId\n}\n\nfunction createEventDeliveryError(cause: unknown, attempts: number) {\n return createSixbError(\n \"event.delivery_failed\",\n \"[Sixb] Could not deliver persisted ontology events.\",\n {\n cause,\n details: {\n attempts,\n },\n }\n )\n}\n\nasync function publishUntilStopped(\n publication: Promise<unknown>,\n signal: AbortSignal\n): Promise<\"published\" | \"stopped\"> {\n if (signal.aborted) return \"stopped\"\n\n return new Promise((resolve, reject) => {\n const stop = () => finish(() => resolve(\"stopped\"))\n const finish = (settle: () => void) => {\n signal.removeEventListener(\"abort\", stop)\n settle()\n }\n signal.addEventListener(\"abort\", stop, { once: true })\n void publication.then(\n () => finish(() => resolve(\"published\")),\n (error) => finish(() => reject(error))\n )\n })\n}\n\n/** Awaits a pass without adopting its failure, so one failed drain cannot reject the next. */\nfunction settled(promise: Promise<void>): Promise<void> {\n return promise.then(\n () => undefined,\n () => undefined\n )\n}\n\nasync function settlesWithin(promise: Promise<void>, timeoutMs: number): Promise<boolean> {\n let timer: ReturnType<typeof setTimeout> | undefined\n const timedOut = new Promise<false>((resolve) => {\n timer = setTimeout(() => resolve(false), timeoutMs)\n })\n const result = await Promise.race([\n promise.then(\n () => true as const,\n () => true as const\n ),\n timedOut,\n ])\n if (timer !== undefined) clearTimeout(timer)\n return result\n}\n",
|
|
8
|
-
"import { randomUUID } from \"node:crypto\"\nimport type { Broker, BrokerCursor, BrokerRecord, BrokerStreamDefinition } from \"../broker\"\nimport { type ErrorReporter, SixbErrorReporter } from \"../error-reporting/reporter\"\nimport { reportEventDeliveryFailure } from \"../error-reporting/reports\"\nimport { getInvalidJsonValueReason, type JsonValue } from \"../json\"\nimport type { OntologyMaterializationEvent } from \"../materialization/events\"\nimport {\n EVENT_DEFINITIONS,\n EVENT_TYPES,\n isDomainEventType,\n isOntologyFactType,\n resolveEventStorage,\n} from \"./definitions\"\nimport { EventsError } from \"./errors\"\nimport type {\n DomainEvent,\n EventActor,\n EventDraft,\n StoredAuthorableEvent,\n StoredDomainEvent,\n} from \"./types\"\n\n// Keep domain events as a short recent log. This is 2 days in milliseconds.\nexport const DEFAULT_EVENTS_RETENTION_MS = 2 * 24 * 60 * 60 * 1000\n\nexport const EVENTS_STREAM: BrokerStreamDefinition = {\n id: \"__events\",\n retention: { maxAgeMs: DEFAULT_EVENTS_RETENTION_MS },\n}\n\nexport interface DomainEventServiceOptions {\n readonly projectId: string\n readonly broker: Broker\n readonly stream?: BrokerStreamDefinition\n /** Internal failure reporter. Defaults to the console when this runtime is used standalone. */\n readonly errorReporter?: ErrorReporter\n}\n\nexport interface EventsAppendInput {\n readonly actor?: EventActor\n readonly correlationId?: string\n readonly causationId?: string\n readonly events: readonly EventDraft[]\n}\n\nexport interface EventsEmitOptions {\n /** Framework component that initiated the emission, such as `SixbPipelineWorker`. */\n readonly source: string\n}\n\nexport interface EventsReadInput {\n readonly afterCursor?: string\n readonly limit?: number\n readonly topics?: readonly DomainEvent[\"topic\"][]\n readonly types?: readonly DomainEvent[\"type\"][]\n}\n\nexport interface EventsSubscribeInput {\n /** Defaults to live-only delivery. `afterCursor` takes precedence when provided. */\n readonly from?: \"latest\" | \"earliest\"\n readonly afterCursor?: BrokerCursor\n readonly types?: readonly DomainEvent[\"type\"][]\n}\n\n/** Exact, already-identified materialization event persisted before broker publication. @internal */\nexport type StableEventEnvelope = OntologyMaterializationEvent\n\n/** Public domain-event log. Stable ontology envelopes are intentionally absent. */\nexport interface DomainEventLog {\n append(input: EventsAppendInput): Promise<readonly StoredDomainEvent[]>\n /**\n * Append events after the work that produced them has already succeeded.\n *\n * Contract: this never rejects. The caller's unit of work is done, so a delivery failure must not\n * turn a successful run into a failed one — the implementation escalates the loss instead.\n */\n emit(input: EventsAppendInput, options: EventsEmitOptions): Promise<void>\n read(input?: EventsReadInput): Promise<readonly StoredDomainEvent[]>\n latestCursor(): Promise<string | undefined>\n subscribe(\n input: EventsSubscribeInput,\n handler: (events: readonly StoredDomainEvent[]) => unknown\n ): Promise<() => void>\n}\n\n/** Narrow internal port used to publish envelopes already persisted in the ontology outbox. */\nexport interface StableEventPublisher {\n publishEnvelopes(envelopes: readonly StableEventEnvelope[]): Promise<readonly StoredDomainEvent[]>\n}\n\n/** Project-scoped domain event service backed by the shared broker provider. */\nexport class DomainEventService implements DomainEventLog, StableEventPublisher {\n private readonly projectId: string\n private readonly broker: Broker\n private readonly stream: BrokerStreamDefinition\n private readonly errorReporter: ErrorReporter\n private readonly ensureStreamPromises = new Map<string, Promise<void>>()\n\n constructor(options: DomainEventServiceOptions) {\n this.projectId = options.projectId\n this.broker = options.broker\n this.stream = options.stream ?? EVENTS_STREAM\n this.errorReporter = options.errorReporter ?? new SixbErrorReporter()\n }\n\n /**\n * Append events after the work that produced them has already succeeded.\n *\n * Unlike `append`, this never rejects: the caller's unit of work is done, so a broker outage must not\n * turn a successful run into a failed one. It is not a swallow either — every event Sixb publishes is\n * a potential trigger edge (a rule's `.when()`, an event schedule, a workflow's wait node), so a lost\n * batch is a handler that silently never runs. The loss is escalated to `onError` as\n * `event.delivery.failed`, or to the default console reporter when no handler was configured.\n *\n * Framework emit sites want this. Application code wants `append`, which reports failure to the\n * caller and returns the stored envelopes.\n */\n async emit(input: EventsAppendInput, _options: EventsEmitOptions): Promise<void> {\n try {\n await this.append(input)\n } catch (error) {\n try {\n const eventTypes = input.events.map((event) => event.type)\n reportEventDeliveryFailure(this.errorReporter, error, {\n projectId: this.projectId,\n eventTypes,\n })\n } catch {\n // The contract above is absolute, so escalation cannot be the thing that breaks it.\n }\n }\n }\n\n async append(input: EventsAppendInput): Promise<readonly StoredDomainEvent[]> {\n if (input.events.length === 0) {\n return []\n }\n for (const event of input.events) {\n if (isOntologyFactType(event.type)) {\n throw new EventsError(\n `Event type '${event.type}' is an authoritative ontology fact and cannot be appended directly.`\n )\n }\n }\n\n const payloads = input.events.map((event) =>\n toStoredEventPayload({\n projectId: this.projectId,\n actor: input.actor,\n correlationId: input.correlationId,\n causationId: input.causationId,\n event,\n })\n )\n\n await this.ensureStream()\n const records = await this.broker.append({\n projectId: this.projectId,\n streamId: this.stream.id,\n records: payloads.map((payload) => ({\n name: payload.type,\n key: payload.partitionKey,\n payload: toBrokerRecordPayload(payload),\n idempotencyKey: payload.idempotencyKey,\n })),\n })\n\n if (records.length !== payloads.length) {\n throw new EventsError(\n `Broker returned ${records.length} record(s) for ${payloads.length} appended event(s).`\n )\n }\n\n return records.map(hydrateEventRecord)\n }\n\n /** Publishes persisted envelopes without changing their stable event identity. @internal */\n async publishEnvelopes(\n envelopes: readonly StableEventEnvelope[]\n ): Promise<readonly StoredDomainEvent[]> {\n if (envelopes.length === 0) {\n return []\n }\n\n for (const envelope of envelopes) {\n if (envelope.projectId !== this.projectId) {\n throw new EventsError(\n `Event '${envelope.id}' belongs to project '${envelope.projectId}', not '${this.projectId}'.`\n )\n }\n if (!isDomainEventType(envelope.type)) {\n throw new EventsError(`Event '${envelope.id}' has unknown event type.`)\n }\n if (EVENT_DEFINITIONS[envelope.type].topic !== envelope.topic) {\n throw new EventsError(\n `Event '${envelope.id}' topic '${envelope.topic}' does not match type '${envelope.type}'.`\n )\n }\n }\n\n await this.ensureStream()\n const records = await this.broker.append({\n projectId: this.projectId,\n streamId: this.stream.id,\n records: envelopes.map((envelope) => ({\n name: envelope.type,\n key: envelope.partitionKey,\n payload: toBrokerRecordPayload(envelope),\n idempotencyKey: envelope.id,\n })),\n })\n\n if (records.length !== envelopes.length) {\n throw new EventsError(\n `Broker returned ${records.length} record(s) for ${envelopes.length} published event(s).`\n )\n }\n\n return records.map(hydrateEventRecord)\n }\n\n async read(input: EventsReadInput = {}): Promise<readonly StoredDomainEvent[]> {\n if (input.limit !== undefined && input.limit <= 0) {\n return []\n }\n\n const names = resolveTypeFilter(input)\n if (names && names.length === 0) {\n return []\n }\n\n await this.ensureStream()\n const page = await this.broker.read({\n projectId: this.projectId,\n streamId: this.stream.id,\n afterCursor: input.afterCursor,\n limit: input.limit,\n names,\n })\n\n return page.records.map(hydrateEventRecord)\n }\n\n async latestCursor(): Promise<string | undefined> {\n await this.ensureStream()\n return this.broker.latestCursor({\n projectId: this.projectId,\n streamId: this.stream.id,\n })\n }\n\n async subscribe(\n input: EventsSubscribeInput,\n handler: (events: readonly StoredDomainEvent[]) => unknown\n ): Promise<() => void> {\n await this.ensureStream()\n return this.broker.subscribe(\n {\n projectId: this.projectId,\n streamId: this.stream.id,\n from: input.from,\n afterCursor: input.afterCursor,\n names: input.types && input.types.length > 0 ? input.types : EVENT_TYPES,\n },\n (records) => {\n const events = records.map(hydrateEventRecord)\n if (events.length === 0) {\n return\n }\n\n try {\n return handler(events)\n } catch {\n // Preserve fire-and-forget subscriber semantics.\n }\n }\n )\n }\n\n private ensureStream(): Promise<void> {\n const key = `${this.projectId}\\0${this.stream.id}`\n let promise = this.ensureStreamPromises.get(key)\n if (!promise) {\n promise = this.broker\n .ensureStream({\n projectId: this.projectId,\n stream: this.stream,\n })\n .catch((error) => {\n if (this.ensureStreamPromises.get(key) === promise) {\n this.ensureStreamPromises.delete(key)\n }\n throw error\n })\n this.ensureStreamPromises.set(key, promise)\n }\n return promise\n }\n}\n\nexport function createDomainEventService(options: DomainEventServiceOptions): DomainEventService {\n return new DomainEventService(options)\n}\n\ntype StoredEventPayload = Omit<StoredAuthorableEvent, \"cursor\">\n\nfunction toStoredEventPayload(params: {\n projectId: string\n actor?: EventActor\n correlationId?: string\n causationId?: string\n event: EventDraft\n}): StoredEventPayload {\n const storage = resolveEventStorage(params.event)\n const payload: Record<string, unknown> = {\n id: randomUUID(),\n schemaVersion: 1,\n projectId: params.projectId,\n occurredAt: params.event.occurredAt ?? new Date().toISOString(),\n type: params.event.type,\n topic: storage.topic,\n partitionKey: storage.partitionKey,\n payload: params.event.payload,\n }\n\n setIfDefined(payload, \"correlationId\", params.correlationId)\n setIfDefined(payload, \"causationId\", params.causationId)\n setIfDefined(payload, \"idempotencyKey\", params.event.idempotencyKey)\n setIfDefined(payload, \"actor\", params.actor)\n setIfDefined(payload, \"origin\", params.event.origin)\n setIfDefined(payload, \"metadata\", params.event.metadata)\n\n return payload as StoredEventPayload\n}\n\nfunction toBrokerRecordPayload(payload: StoredEventPayload | StableEventEnvelope): JsonValue {\n const reason = getInvalidJsonValueReason(payload, `event '${payload.type}' payload`)\n if (reason) {\n throw new EventsError(`Event '${payload.type}' cannot be stored in broker; ${reason}`)\n }\n\n return payload as unknown as JsonValue\n}\n\nfunction hydrateEventRecord(record: BrokerRecord): StoredDomainEvent {\n const payload = record.payload\n if (!isObjectRecord(payload)) {\n throw new EventsError(`Broker record at cursor '${record.cursor}' is not an event object.`)\n }\n\n const eventType = payload.type\n if (typeof eventType !== \"string\" || !isDomainEventType(eventType)) {\n throw new EventsError(`Broker record at cursor '${record.cursor}' has unknown event type.`)\n }\n\n if (record.name !== undefined && record.name !== eventType) {\n throw new EventsError(\n `Broker record name '${record.name}' does not match event type '${eventType}'.`\n )\n }\n\n return {\n ...payload,\n cursor: record.cursor,\n } as StoredDomainEvent\n}\n\nfunction resolveTypeFilter(input: {\n topics?: readonly DomainEvent[\"topic\"][]\n types?: readonly DomainEvent[\"type\"][]\n}): readonly DomainEvent[\"type\"][] {\n const topicTypes =\n input.topics && input.topics.length > 0\n ? EVENT_TYPES.filter((type) => input.topics?.includes(EVENT_DEFINITIONS[type].topic))\n : undefined\n\n if (!topicTypes) {\n return input.types && input.types.length > 0 ? input.types : EVENT_TYPES\n }\n\n if (!input.types || input.types.length === 0) {\n return topicTypes\n }\n\n const requestedTypes = new Set(input.types)\n return topicTypes.filter((type) => requestedTypes.has(type))\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null\n}\n\nfunction setIfDefined(target: Record<string, unknown>, key: string, value: unknown): void {\n if (value !== undefined) {\n target[key] = value\n }\n}\n",
|
|
9
|
-
"import { randomUUID } from \"node:crypto\"\nimport { resolveEventStorage } from \"./definitions\"\nimport type { EventActor, EventDraft, StoredAuthorableEvent } from \"./types/index\"\n\nexport function toStoredEvent(params: {\n projectId: string\n actor?: EventActor\n correlationId?: string\n causationId?: string\n event: EventDraft\n cursor: string\n}): StoredAuthorableEvent {\n const base = {\n id: randomUUID(),\n schemaVersion: 1 as const,\n projectId: params.projectId,\n occurredAt: params.event.occurredAt ?? new Date().toISOString(),\n correlationId: params.correlationId,\n causationId: params.causationId,\n idempotencyKey: params.event.idempotencyKey,\n actor: params.actor,\n origin: params.event.origin,\n metadata: params.event.metadata,\n cursor: params.cursor,\n }\n\n const storage = resolveEventStorage(params.event)\n return {\n ...base,\n type: params.event.type,\n topic: storage.topic,\n partitionKey: storage.partitionKey,\n payload: params.event.payload,\n } as StoredAuthorableEvent\n}\n"
|
|
10
|
-
],
|
|
11
|
-
"mappings": "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",
|
|
12
|
-
"debugId": "6DB9F008F37DD64564756E2164756E21",
|
|
13
|
-
"names": []
|
|
14
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|