@sixb/core 0.1.9 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/dist/actions/index.js +8 -8
  2. package/dist/agents/index.js +16 -15
  3. package/dist/agents/index.js.map +1 -1
  4. package/dist/bootstrap/index.js +20 -19
  5. package/dist/bootstrap/index.js.map +1 -1
  6. package/dist/broker/in-memory.d.ts +8 -2
  7. package/dist/broker/in-memory.d.ts.map +1 -1
  8. package/dist/broker/index.d.ts +4 -2
  9. package/dist/broker/index.d.ts.map +1 -1
  10. package/dist/broker/index.js +7 -3
  11. package/dist/broker/index.js.map +1 -1
  12. package/dist/broker/retention.d.ts +4 -0
  13. package/dist/broker/retention.d.ts.map +1 -0
  14. package/dist/broker/subscriber.d.ts +10 -0
  15. package/dist/broker/subscriber.d.ts.map +1 -0
  16. package/dist/broker/types.d.ts +14 -1
  17. package/dist/broker/types.d.ts.map +1 -1
  18. package/dist/{chunk-k3cqkkn2.js → chunk-1824gssz.js} +30 -65
  19. package/dist/chunk-1824gssz.js.map +12 -0
  20. package/dist/{chunk-h1gfhhbh.js → chunk-28ja2cjs.js} +1 -1
  21. package/dist/chunk-2c4j899j.js.map +1 -1
  22. package/dist/{chunk-ppytyr6w.js → chunk-358caqf5.js} +4 -4
  23. package/dist/chunk-358caqf5.js.map +12 -0
  24. package/dist/{chunk-kxwa347f.js → chunk-3qms4nax.js} +2 -2
  25. package/dist/{chunk-kxwa347f.js.map → chunk-3qms4nax.js.map} +3 -3
  26. package/dist/{chunk-emyyk7dx.js → chunk-5c7ga8zz.js} +22 -145
  27. package/dist/chunk-5c7ga8zz.js.map +12 -0
  28. package/dist/{chunk-hpr1r6av.js → chunk-5p1v802y.js} +46 -39
  29. package/dist/{chunk-hpr1r6av.js.map → chunk-5p1v802y.js.map} +4 -4
  30. package/dist/{chunk-zcnq6105.js → chunk-85cd7e8c.js} +2 -1
  31. package/dist/chunk-85cd7e8c.js.map +10 -0
  32. package/dist/{chunk-1enhpacz.js → chunk-976rxdpx.js} +5 -5
  33. package/dist/{chunk-3f7veca0.js → chunk-9x8dybsb.js} +3 -3
  34. package/dist/chunk-9x8dybsb.js.map +10 -0
  35. package/dist/{chunk-r29fxdhn.js → chunk-aa6z4a19.js} +160 -44
  36. package/dist/chunk-aa6z4a19.js.map +12 -0
  37. package/dist/{chunk-r4tfx1sf.js → chunk-agbbygvh.js} +4 -4
  38. package/dist/{chunk-jjy0fhrn.js → chunk-b0ec55a1.js} +20 -3
  39. package/dist/chunk-b0ec55a1.js.map +12 -0
  40. package/dist/{chunk-xfbydgzy.js → chunk-bn138h9w.js} +7 -8
  41. package/dist/{chunk-xfbydgzy.js.map → chunk-bn138h9w.js.map} +3 -3
  42. package/dist/{chunk-an5tt9y0.js → chunk-ftv470j8.js} +42 -4
  43. package/dist/{chunk-an5tt9y0.js.map → chunk-ftv470j8.js.map} +7 -7
  44. package/dist/{chunk-0w35wavj.js → chunk-g7knyczr.js} +1 -1
  45. package/dist/{chunk-x57ycxq0.js → chunk-gqh45d2n.js} +42 -3
  46. package/dist/{chunk-x57ycxq0.js.map → chunk-gqh45d2n.js.map} +3 -3
  47. package/dist/{chunk-0rdrecsb.js → chunk-kfee1h52.js} +116 -32
  48. package/dist/chunk-kfee1h52.js.map +13 -0
  49. package/dist/{chunk-ypbtykv6.js → chunk-nmbxcaqx.js} +1 -1
  50. package/dist/{chunk-3tgwrcyh.js → chunk-nt99sxd6.js} +2 -2
  51. package/dist/{chunk-3tgwrcyh.js.map → chunk-nt99sxd6.js.map} +3 -3
  52. package/dist/{chunk-vf691g1r.js → chunk-p5vcsw9c.js} +2 -2
  53. package/dist/{chunk-mjbk2djy.js → chunk-p6a4npdx.js} +211 -106
  54. package/dist/{chunk-mjbk2djy.js.map → chunk-p6a4npdx.js.map} +9 -8
  55. package/dist/{chunk-3frsnm7x.js → chunk-qma80ych.js} +4 -6
  56. package/dist/chunk-qma80ych.js.map +11 -0
  57. package/dist/{chunk-qhcpj9wc.js → chunk-qyeptdyv.js} +96 -2
  58. package/dist/chunk-qyeptdyv.js.map +15 -0
  59. package/dist/{chunk-52hbv0ak.js → chunk-r7fj830t.js} +101 -48
  60. package/dist/chunk-r7fj830t.js.map +36 -0
  61. package/dist/{chunk-xyr8kppc.js → chunk-rtk71jzp.js} +1 -1
  62. package/dist/{chunk-m3z3x9v0.js → chunk-t1f4f1ve.js} +1 -1
  63. package/dist/chunk-v2vcg0w6.js +151 -0
  64. package/dist/chunk-v2vcg0w6.js.map +11 -0
  65. package/dist/connectors/connections/authorizations.d.ts.map +1 -1
  66. package/dist/connectors/connections/contracts.d.ts +3 -0
  67. package/dist/connectors/connections/contracts.d.ts.map +1 -1
  68. package/dist/connectors/connections/internal.js +1 -1
  69. package/dist/connectors/connections/request.d.ts +3 -1
  70. package/dist/connectors/connections/request.d.ts.map +1 -1
  71. package/dist/connectors/connections/runs.d.ts.map +1 -1
  72. package/dist/connectors/connections/tokens.d.ts.map +1 -1
  73. package/dist/connectors/connections/validation.d.ts +5 -1
  74. package/dist/connectors/connections/validation.d.ts.map +1 -1
  75. package/dist/connectors/types.d.ts +19 -4
  76. package/dist/connectors/types.d.ts.map +1 -1
  77. package/dist/events/execution.d.ts +1 -1
  78. package/dist/events/execution.d.ts.map +1 -1
  79. package/dist/events/index.js +1 -1
  80. package/dist/events/service.d.ts +2 -2
  81. package/dist/events/service.d.ts.map +1 -1
  82. package/dist/execution/agent.js +16 -15
  83. package/dist/execution/agent.js.map +1 -1
  84. package/dist/execution/primitive.js +16 -15
  85. package/dist/execution/primitive.js.map +2 -2
  86. package/dist/execution/request.js +16 -15
  87. package/dist/execution/request.js.map +2 -2
  88. package/dist/index.d.ts +3 -3
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +30 -28
  91. package/dist/index.js.map +1 -1
  92. package/dist/lake-storage/changes.d.ts +5 -0
  93. package/dist/lake-storage/changes.d.ts.map +1 -0
  94. package/dist/lake-storage/in-memory.d.ts +2 -1
  95. package/dist/lake-storage/in-memory.d.ts.map +1 -1
  96. package/dist/lake-storage/index.d.ts +2 -1
  97. package/dist/lake-storage/index.d.ts.map +1 -1
  98. package/dist/lake-storage/index.js +4 -2
  99. package/dist/lake-storage/index.js.map +1 -1
  100. package/dist/lake-storage/types.d.ts +36 -0
  101. package/dist/lake-storage/types.d.ts.map +1 -1
  102. package/dist/logging/internal.js +1 -1
  103. package/dist/materialization/index.d.ts +1 -1
  104. package/dist/materialization/index.d.ts.map +1 -1
  105. package/dist/materialization/model.d.ts +12 -1
  106. package/dist/materialization/model.d.ts.map +1 -1
  107. package/dist/materializer/index.d.ts +1 -1
  108. package/dist/materializer/index.d.ts.map +1 -1
  109. package/dist/materializer/index.js +5 -5
  110. package/dist/materializer/materializer.d.ts +5 -1
  111. package/dist/materializer/materializer.d.ts.map +1 -1
  112. package/dist/materializer/projections/entry-validator.d.ts +2 -1
  113. package/dist/materializer/projections/entry-validator.d.ts.map +1 -1
  114. package/dist/materializer/projections/replace.d.ts.map +1 -1
  115. package/dist/materializer/projections/source-materialization.d.ts +4 -3
  116. package/dist/materializer/projections/source-materialization.d.ts.map +1 -1
  117. package/dist/materializer/shared/normalize.d.ts +2 -1
  118. package/dist/materializer/shared/normalize.d.ts.map +1 -1
  119. package/dist/models/execution/index.js +5 -5
  120. package/dist/objects/index.js +9 -9
  121. package/dist/objects/query/index.js +5 -5
  122. package/dist/pipelines/index.js +6 -6
  123. package/dist/pipelines/run-dispatch.d.ts.map +1 -1
  124. package/dist/projections/internal.js +6 -8
  125. package/dist/projections/internal.js.map +1 -1
  126. package/dist/projections/run-dispatch.d.ts.map +1 -1
  127. package/dist/queues/in-memory.d.ts +7 -3
  128. package/dist/queues/in-memory.d.ts.map +1 -1
  129. package/dist/queues/index.js +1 -1
  130. package/dist/queues/indexed-heap.d.ts +15 -0
  131. package/dist/queues/indexed-heap.d.ts.map +1 -0
  132. package/dist/runtime/host.d.ts.map +1 -1
  133. package/dist/runtime/internal.js +1 -1
  134. package/dist/runtime/ontology-mutations.d.ts +3 -1
  135. package/dist/runtime/ontology-mutations.d.ts.map +1 -1
  136. package/dist/shares/internal.js +4 -4
  137. package/dist/storage/connector-connections/in-memory.d.ts.map +1 -1
  138. package/dist/storage/connector-connections/provider/runs.d.ts.map +1 -1
  139. package/dist/storage/connector-connections/provider.js +2 -2
  140. package/dist/storage/connector-connections/provider.js.map +3 -3
  141. package/dist/storage/connector-connections/types.d.ts +3 -2
  142. package/dist/storage/connector-connections/types.d.ts.map +1 -1
  143. package/dist/storage/index.d.ts +1 -1
  144. package/dist/storage/index.d.ts.map +1 -1
  145. package/dist/storage/index.js +4 -4
  146. package/dist/storage/internal.js +1 -1
  147. package/dist/storage/ontology/in-memory/materializations-state.d.ts.map +1 -1
  148. package/dist/storage/ontology/in-memory/materializations.d.ts +1 -1
  149. package/dist/storage/ontology/in-memory/materializations.d.ts.map +1 -1
  150. package/dist/storage/ontology/in-memory/shared-state.d.ts +15 -2
  151. package/dist/storage/ontology/in-memory/shared-state.d.ts.map +1 -1
  152. package/dist/storage/ontology/in-memory/source-roots.d.ts +6 -0
  153. package/dist/storage/ontology/in-memory/source-roots.d.ts.map +1 -0
  154. package/dist/storage/ontology/in-memory/sources.d.ts.map +1 -1
  155. package/dist/storage/ontology/index.d.ts +1 -1
  156. package/dist/storage/ontology/index.d.ts.map +1 -1
  157. package/dist/storage/ontology/provider.d.ts +16 -0
  158. package/dist/storage/ontology/provider.d.ts.map +1 -1
  159. package/dist/storage/ontology/provider.js +4 -2
  160. package/dist/storage/ontology/provider.js.map +1 -1
  161. package/dist/storage/ontology/sources.d.ts +13 -4
  162. package/dist/storage/ontology/sources.d.ts.map +1 -1
  163. package/dist/storage/projection-runs/lifecycle.d.ts.map +1 -1
  164. package/dist/storage/projection-runs/provider.js +2 -2
  165. package/dist/storage/projection-runs/types.d.ts +2 -0
  166. package/dist/storage/projection-runs/types.d.ts.map +1 -1
  167. package/dist/syncs/index.js +8 -7
  168. package/dist/syncs/index.js.map +1 -1
  169. package/dist/syncs/run-dispatch.d.ts.map +1 -1
  170. package/dist/testing/broker-contract.d.ts.map +1 -1
  171. package/dist/testing/connector-connection-storage-contract.d.ts.map +1 -1
  172. package/dist/testing/index.d.ts +1 -0
  173. package/dist/testing/index.d.ts.map +1 -1
  174. package/dist/testing/index.js +1459 -951
  175. package/dist/testing/index.js.map +9 -8
  176. package/dist/testing/lake-changes-contract.d.ts +6 -0
  177. package/dist/testing/lake-changes-contract.d.ts.map +1 -0
  178. package/dist/testing/materializer-storage-contract.d.ts.map +1 -1
  179. package/dist/testing/ontology-storage-contract.d.ts.map +1 -1
  180. package/dist/testing/projection-run-storage-contract.d.ts.map +1 -1
  181. package/dist/webhooks/connections.d.ts +6 -0
  182. package/dist/webhooks/connections.d.ts.map +1 -0
  183. package/dist/webhooks/index.d.ts +1 -1
  184. package/dist/webhooks/index.d.ts.map +1 -1
  185. package/dist/webhooks/internal.d.ts +2 -0
  186. package/dist/webhooks/internal.d.ts.map +1 -1
  187. package/dist/webhooks/internal.js +54 -9
  188. package/dist/webhooks/internal.js.map +4 -3
  189. package/dist/webhooks/registry.d.ts +1 -1
  190. package/dist/webhooks/registry.d.ts.map +1 -1
  191. package/dist/webhooks/types.d.ts +15 -4
  192. package/dist/webhooks/types.d.ts.map +1 -1
  193. package/dist/workflows/index.js +17 -16
  194. package/dist/workflows/index.js.map +1 -1
  195. package/dist/workflows/run-dispatch.d.ts +3 -1
  196. package/dist/workflows/run-dispatch.d.ts.map +1 -1
  197. package/package.json +1 -1
  198. package/src/broker/in-memory.ts +104 -39
  199. package/src/broker/index.ts +4 -1
  200. package/src/broker/retention.ts +28 -0
  201. package/src/broker/subscriber.ts +21 -0
  202. package/src/broker/types.ts +15 -1
  203. package/src/connectors/builders.ts +0 -6
  204. package/src/connectors/connections/authorizations.ts +11 -5
  205. package/src/connectors/connections/contracts.ts +3 -0
  206. package/src/connectors/connections/request.ts +56 -22
  207. package/src/connectors/connections/runs.ts +1 -0
  208. package/src/connectors/connections/tokens.ts +4 -0
  209. package/src/connectors/connections/validation.ts +91 -5
  210. package/src/connectors/types.ts +19 -4
  211. package/src/events/execution.ts +2 -2
  212. package/src/events/service.ts +3 -3
  213. package/src/index.ts +10 -2
  214. package/src/lake-storage/changes.ts +43 -0
  215. package/src/lake-storage/in-memory.ts +73 -0
  216. package/src/lake-storage/index.ts +4 -0
  217. package/src/lake-storage/types.ts +40 -0
  218. package/src/logging/service.ts +1 -1
  219. package/src/materialization/index.ts +2 -0
  220. package/src/materialization/model.ts +14 -1
  221. package/src/materializer/index.ts +2 -0
  222. package/src/materializer/materializer.ts +10 -0
  223. package/src/materializer/projections/entry-validator.ts +19 -1
  224. package/src/materializer/projections/replace.ts +36 -1
  225. package/src/materializer/projections/source-materialization.ts +26 -6
  226. package/src/materializer/shared/normalize.ts +1 -1
  227. package/src/pipelines/run-dispatch.ts +21 -1
  228. package/src/projections/run-dispatch.ts +30 -68
  229. package/src/queues/in-memory.ts +105 -62
  230. package/src/queues/indexed-heap.ts +74 -0
  231. package/src/runtime/host.ts +0 -14
  232. package/src/runtime/ontology-mutations.ts +4 -0
  233. package/src/storage/connector-connections/in-memory.ts +3 -1
  234. package/src/storage/connector-connections/provider/runs.ts +3 -1
  235. package/src/storage/connector-connections/types.ts +3 -2
  236. package/src/storage/index.ts +1 -0
  237. package/src/storage/ontology/in-memory/materializations-state.ts +5 -18
  238. package/src/storage/ontology/in-memory/materializations.ts +73 -92
  239. package/src/storage/ontology/in-memory/shared-state.ts +26 -1
  240. package/src/storage/ontology/in-memory/source-roots.ts +123 -0
  241. package/src/storage/ontology/in-memory/sources.ts +78 -23
  242. package/src/storage/ontology/index.ts +1 -0
  243. package/src/storage/ontology/provider.ts +70 -0
  244. package/src/storage/ontology/sources.ts +14 -3
  245. package/src/storage/projection-runs/lifecycle.ts +5 -2
  246. package/src/storage/projection-runs/types.ts +4 -3
  247. package/src/syncs/run-dispatch.ts +19 -1
  248. package/src/testing/broker-contract.ts +95 -0
  249. package/src/testing/connector-connection-storage-contract.ts +18 -1
  250. package/src/testing/index.ts +1 -0
  251. package/src/testing/lake-changes-contract.ts +240 -0
  252. package/src/testing/materializer-storage-contract.ts +172 -1
  253. package/src/testing/ontology-storage-contract.ts +7 -0
  254. package/src/testing/projection-run-storage-contract.ts +34 -0
  255. package/src/webhooks/connections.ts +56 -0
  256. package/src/webhooks/index.ts +2 -0
  257. package/src/webhooks/internal.ts +2 -0
  258. package/src/webhooks/registry.ts +3 -4
  259. package/src/webhooks/types.ts +17 -4
  260. package/src/workflows/run-dispatch.ts +42 -29
  261. package/dist/chunk-0rdrecsb.js.map +0 -11
  262. package/dist/chunk-3f7veca0.js.map +0 -10
  263. package/dist/chunk-3frsnm7x.js.map +0 -11
  264. package/dist/chunk-52hbv0ak.js.map +0 -36
  265. package/dist/chunk-emyyk7dx.js.map +0 -14
  266. package/dist/chunk-jjy0fhrn.js.map +0 -12
  267. package/dist/chunk-k3cqkkn2.js.map +0 -12
  268. package/dist/chunk-ppytyr6w.js.map +0 -12
  269. package/dist/chunk-qhcpj9wc.js.map +0 -14
  270. package/dist/chunk-r29fxdhn.js.map +0 -11
  271. package/dist/chunk-zcnq6105.js.map +0 -10
  272. /package/dist/{chunk-h1gfhhbh.js.map → chunk-28ja2cjs.js.map} +0 -0
  273. /package/dist/{chunk-1enhpacz.js.map → chunk-976rxdpx.js.map} +0 -0
  274. /package/dist/{chunk-r4tfx1sf.js.map → chunk-agbbygvh.js.map} +0 -0
  275. /package/dist/{chunk-0w35wavj.js.map → chunk-g7knyczr.js.map} +0 -0
  276. /package/dist/{chunk-ypbtykv6.js.map → chunk-nmbxcaqx.js.map} +0 -0
  277. /package/dist/{chunk-vf691g1r.js.map → chunk-p5vcsw9c.js.map} +0 -0
  278. /package/dist/{chunk-xyr8kppc.js.map → chunk-rtk71jzp.js.map} +0 -0
  279. /package/dist/{chunk-m3z3x9v0.js.map → chunk-t1f4f1ve.js.map} +0 -0
@@ -6,16 +6,18 @@ import {
6
6
  import {
7
7
  ConnectorError2,
8
8
  createConnectorCodedError,
9
- getConnectorExecutionSourceResolver,
10
- SyncValidationError2
11
- } from "./chunk-emyyk7dx.js";
9
+ getConnectorExecutionSourceResolver
10
+ } from "./chunk-v2vcg0w6.js";
12
11
  import {
13
12
  isDatasetDefinition2
14
13
  } from "./chunk-860dwwy0.js";
14
+ import {
15
+ SyncValidationError2
16
+ } from "./chunk-5c7ga8zz.js";
15
17
  import {
16
18
  isOAuthConnectorAdapter,
17
19
  isConnectorDefinition
18
- } from "./chunk-3f7veca0.js";
20
+ } from "./chunk-9x8dybsb.js";
19
21
 
20
22
  // src/syncs/builders.ts
21
23
  function assertNonEmpty(value, field) {
@@ -103,9 +105,6 @@ function defineConnector2(id, adapter) {
103
105
  if (!isOAuthConnectorAdapter(adapter) || typeof adapter.authentication.authorizationUrl !== "function" || typeof adapter.authentication.exchangeCode !== "function" || typeof adapter.authentication.refresh !== "function" || typeof adapter.discoverAccounts !== "function") {
104
106
  throw createConnectorCodedError("connector.configuration_invalid", "OAuth connector adapters must define oauth2 authentication and implement authorizationUrl, exchangeCode, refresh, and discoverAccounts.");
105
107
  }
106
- if (adapter.webhooks !== undefined) {
107
- throw createConnectorCodedError("connector.configuration_invalid", "OAuth connector adapters cannot register webhooks until connection routing is defined.");
108
- }
109
108
  }
110
109
  return {
111
110
  kind: "connector",
@@ -125,4 +124,4 @@ function isRecord(value) {
125
124
  }
126
125
  export { defineConnector2, defineSync2, resolveSyncConnectorSources2, isSyncDefinition2 };
127
126
 
128
- //# debugId=FBA7A5471B50E1A564756E2164756E21
127
+ //# debugId=99DD47F6247AC4A364756E2164756E21
@@ -4,10 +4,10 @@
4
4
  "sourcesContent": [
5
5
  "import type { AnyConnectorAdapter, ConnectorDefinition } from \"../connectors\"\nimport type { DatasetDefinition } from \"../datasets\"\nimport type { ScheduleDefinition, ScheduleReference } from \"../schedules\"\nimport { isScheduleDefinition } from \"../schedules\"\nimport { SyncValidationError } from \"./errors\"\nimport type {\n BatchSyncConfig,\n BatchSyncDefinitionConfig,\n SyncBuilder,\n SyncDefinition,\n SyncMode,\n SyncReadBuilder,\n SyncTargetBuilder,\n} from \"./types\"\n\nfunction assertNonEmpty(value: string, field: string): void {\n if (!value.trim()) {\n throw new SyncValidationError(`Sync ${field} must not be empty.`)\n }\n}\n\nfunction assertDataset(dataset: DatasetDefinition, mode: SyncMode): void {\n assertNonEmpty(dataset.id, \"dataset id\")\n if (mode === \"merge\" && dataset.primaryKey === undefined) {\n throw new SyncValidationError(`Merge sync dataset '${dataset.id}' must define a primaryKey.`)\n }\n}\n\nfunction normalizeBatchSyncConfig(options: BatchSyncConfig | undefined): BatchSyncDefinitionConfig {\n const mode = options?.mode ?? \"snapshot\"\n\n if (mode !== \"snapshot\" && mode !== \"append\" && mode !== \"merge\") {\n throw new SyncValidationError(\n `Invalid sync mode '${String(mode)}'. Expected 'snapshot', 'append', or 'merge'.`\n )\n }\n\n return {\n kind: \"batch\",\n mode,\n }\n}\n\ntype DefaultBatchSyncConfig = Omit<BatchSyncConfig, \"mode\"> & { readonly mode?: undefined }\n\n/**\n * Define a batch sync that reads from one connector and writes into one dataset.\n *\n * The returned definition is inert and safe to export from `syncs/` modules.\n * Supports `snapshot`, `append`, and keyed `merge` modes with optional triggers and checkpoints.\n */\nexport function defineSync<TId extends string>(\n id: TId,\n options?: DefaultBatchSyncConfig\n): SyncBuilder<TId, never, \"snapshot\">\nexport function defineSync<TId extends string, const TMode extends SyncMode>(\n id: TId,\n options: BatchSyncConfig<TMode> & { readonly mode: TMode }\n): SyncBuilder<TId, never, TMode>\nexport function defineSync<TId extends string>(\n id: TId,\n options: BatchSyncConfig\n): SyncBuilder<TId, never, SyncMode>\nexport function defineSync<TId extends string>(\n id: TId,\n options?: BatchSyncConfig\n): SyncBuilder<TId, never, SyncMode> {\n assertNonEmpty(id, \"id\")\n\n const config = normalizeBatchSyncConfig(options)\n const triggers: ScheduleReference[] = []\n\n function createBuilder<TCheckpoint>(): SyncBuilder<TId, TCheckpoint, SyncMode> {\n const builder: SyncBuilder<TId, TCheckpoint, SyncMode> = {\n when(schedule: ScheduleDefinition): SyncBuilder<TId, TCheckpoint, SyncMode> {\n if (!isScheduleDefinition(schedule)) {\n throw new SyncValidationError(\"Sync .when(...) only accepts schedules.\")\n }\n triggers.push({ type: \"schedule\", scheduleId: schedule.id })\n return builder\n },\n checkpoint<TNextCheckpoint>(): SyncBuilder<TId, TNextCheckpoint, SyncMode> {\n return createBuilder<TNextCheckpoint>()\n },\n from<TConnector extends ConnectorDefinition<string, AnyConnectorAdapter>>(\n connector: TConnector\n ): SyncReadBuilder<TId, TConnector, TCheckpoint, SyncMode> {\n return {\n read(handler): SyncTargetBuilder<TId, TConnector, TCheckpoint, SyncMode> {\n return {\n intoDataset(\n dataset: DatasetDefinition\n ): SyncDefinition<TId, TConnector, TCheckpoint, SyncMode> {\n assertDataset(dataset, config.mode)\n\n return {\n kind: \"sync\",\n id,\n config,\n triggers,\n connector,\n read: handler,\n target: {\n kind: \"dataset\",\n dataset,\n },\n }\n },\n }\n },\n }\n },\n }\n\n return builder\n }\n\n return createBuilder<never>()\n}\n",
6
6
  "import type { AnyConnectorAdapter, ConnectorDefinition, ConnectorRuntime } from \"../connectors\"\nimport {\n type ConnectorExecutionSource,\n type ConnectorExecutionSourceResolver,\n getConnectorExecutionSourceResolver,\n} from \"../connectors/execution\"\n\n/** One connector client invocation contributing values to a Sync run. */\nexport type SyncConnectorSource<TAdapter extends AnyConnectorAdapter = AnyConnectorAdapter> =\n ConnectorExecutionSource<TAdapter>\n\nexport type SyncConnectorSourceResolver = ConnectorExecutionSourceResolver\n\n/** Resolve the source invocations owned by one connector definition for a Sync execution. */\nexport function resolveSyncConnectorSources<TAdapter extends AnyConnectorAdapter>(\n connector: ConnectorRuntime,\n definition: ConnectorDefinition<string, TAdapter>\n): Promise<readonly SyncConnectorSource<TAdapter>[]> {\n return getConnectorExecutionSourceResolver(connector).list(definition)\n}\n",
7
- "import { ConnectorError, createConnectorCodedError } from \"./errors\"\nimport type {\n AnyConnectorAdapter,\n ConnectorAdapter,\n ConnectorDefinition,\n OAuthConnectorAdapter,\n} from \"./types\"\nimport { isOAuthConnectorAdapter } from \"./types\"\n\nfunction assertNonEmpty(value: string, field: string): void {\n if (!value.trim()) {\n throw new ConnectorError(`Connector ${field} must not be empty.`)\n }\n}\n\n/**\n * Define a connector instance for an external system.\n *\n * The returned definition is inert and can be exported from a project-level\n * `connectors/` module. Use `await sixb.connector(definition)` at runtime to\n * resolve it to a connected client.\n */\nexport function defineConnector<TId extends string, TAdapter extends OAuthConnectorAdapter>(\n id: TId,\n adapter: TAdapter\n): ConnectorDefinition<TId, TAdapter>\nexport function defineConnector<TId extends string, TAdapter extends ConnectorAdapter>(\n id: TId,\n adapter: TAdapter\n): ConnectorDefinition<TId, TAdapter>\nexport function defineConnector<TId extends string, TAdapter extends AnyConnectorAdapter>(\n id: TId,\n adapter: TAdapter\n): ConnectorDefinition<TId, TAdapter> {\n assertNonEmpty(id, \"id\")\n assertNonEmpty(adapter.type, \"type\")\n\n if (typeof adapter.connect !== \"function\") {\n throw new ConnectorError(\"Connector adapter connect must be a function.\")\n }\n\n if (adapter.authentication !== undefined) {\n if (\n !isOAuthConnectorAdapter(adapter) ||\n typeof adapter.authentication.authorizationUrl !== \"function\" ||\n typeof adapter.authentication.exchangeCode !== \"function\" ||\n typeof adapter.authentication.refresh !== \"function\" ||\n typeof adapter.discoverAccounts !== \"function\"\n ) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n \"OAuth connector adapters must define oauth2 authentication and implement authorizationUrl, exchangeCode, refresh, and discoverAccounts.\"\n )\n }\n if (adapter.webhooks !== undefined) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n \"OAuth connector adapters cannot register webhooks until connection routing is defined.\"\n )\n }\n }\n\n return {\n kind: \"connector\",\n id,\n adapter,\n }\n}\n",
7
+ "import { ConnectorError, createConnectorCodedError } from \"./errors\"\nimport type {\n AnyConnectorAdapter,\n ConnectorAdapter,\n ConnectorDefinition,\n OAuthConnectorAdapter,\n} from \"./types\"\nimport { isOAuthConnectorAdapter } from \"./types\"\n\nfunction assertNonEmpty(value: string, field: string): void {\n if (!value.trim()) {\n throw new ConnectorError(`Connector ${field} must not be empty.`)\n }\n}\n\n/**\n * Define a connector instance for an external system.\n *\n * The returned definition is inert and can be exported from a project-level\n * `connectors/` module. Use `await sixb.connector(definition)` at runtime to\n * resolve it to a connected client.\n */\nexport function defineConnector<TId extends string, TAdapter extends OAuthConnectorAdapter>(\n id: TId,\n adapter: TAdapter\n): ConnectorDefinition<TId, TAdapter>\nexport function defineConnector<TId extends string, TAdapter extends ConnectorAdapter>(\n id: TId,\n adapter: TAdapter\n): ConnectorDefinition<TId, TAdapter>\nexport function defineConnector<TId extends string, TAdapter extends AnyConnectorAdapter>(\n id: TId,\n adapter: TAdapter\n): ConnectorDefinition<TId, TAdapter> {\n assertNonEmpty(id, \"id\")\n assertNonEmpty(adapter.type, \"type\")\n\n if (typeof adapter.connect !== \"function\") {\n throw new ConnectorError(\"Connector adapter connect must be a function.\")\n }\n\n if (adapter.authentication !== undefined) {\n if (\n !isOAuthConnectorAdapter(adapter) ||\n typeof adapter.authentication.authorizationUrl !== \"function\" ||\n typeof adapter.authentication.exchangeCode !== \"function\" ||\n typeof adapter.authentication.refresh !== \"function\" ||\n typeof adapter.discoverAccounts !== \"function\"\n ) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n \"OAuth connector adapters must define oauth2 authentication and implement authorizationUrl, exchangeCode, refresh, and discoverAccounts.\"\n )\n }\n }\n\n return {\n kind: \"connector\",\n id,\n adapter,\n }\n}\n",
8
8
  "import type { BlobStorage } from \"../blob-storage\"\nimport {\n type AnyConnectorAdapter,\n type ConnectorAdapter,\n type ConnectorClient,\n type ConnectorConnectionMetadata,\n type ConnectorDefinition,\n isConnectorDefinition,\n type OAuthConnectorAdapter,\n} from \"../connectors\"\nimport type { DatasetDefinition, DatasetPrimaryKey, MergeChange } from \"../datasets\"\nimport { isDatasetDefinition } from \"../datasets\"\nimport type { Logger } from \"../logging\"\nimport type { ScheduleDefinition, ScheduleReference } from \"../schedules\"\nimport { isScheduleReference } from \"../schedules\"\n\n/** Blob operations available to sync read handlers. */\nexport type SyncBlobContext = Pick<BlobStorage, \"put\" | \"open\" | \"stat\">\n\n/** Non-secret connector connection metadata available to OAuth-backed Sync handlers. */\nexport type SyncConnectorConnection = ConnectorConnectionMetadata\n\ntype SyncConnectionContext<TAdapter extends AnyConnectorAdapter> =\n TAdapter extends OAuthConnectorAdapter\n ? { readonly connection: SyncConnectorConnection }\n : { readonly connection?: undefined }\n\n/** Context passed to a sync read handler. */\nexport type SyncReadContext<\n TCheckpoint = never,\n TAdapter extends AnyConnectorAdapter = ConnectorAdapter,\n> = {\n readonly projectId: string\n readonly syncId: string\n readonly signal: AbortSignal\n readonly blobs: SyncBlobContext\n readonly logger: Logger\n} & ([TCheckpoint] extends [never]\n ? { readonly checkpoint?: undefined }\n : {\n readonly checkpoint?: TCheckpoint\n setCheckpoint(next: TCheckpoint): void\n }) &\n SyncConnectionContext<TAdapter>\n\nexport type SyncMode = \"snapshot\" | \"append\" | \"merge\"\n\ntype MergeSyncChange = MergeChange<\n Readonly<Record<string, unknown>>,\n Readonly<Record<string, unknown>>\n>\n\n/** A sync read handler may return one item, a sync iterable, or an async iterable. */\nexport type SyncReadResult<TMode extends SyncMode = SyncMode> = TMode extends \"merge\"\n ? MergeSyncChange | Iterable<MergeSyncChange> | AsyncIterable<MergeSyncChange>\n : unknown | Iterable<unknown> | AsyncIterable<unknown>\n\n/** User-facing batch sync options accepted by `defineSync(...)`. */\nexport interface BatchSyncConfig<TMode extends SyncMode = SyncMode> {\n readonly mode?: TMode\n}\n\n/** Normalized batch sync config stored on the final sync definition. */\nexport interface BatchSyncDefinitionConfig<TMode extends SyncMode = SyncMode> {\n readonly kind: \"batch\"\n readonly mode: TMode\n}\n\n/** V1 syncs always target a named raw dataset. */\nexport interface DatasetSyncTarget {\n readonly kind: \"dataset\"\n readonly dataset: DatasetDefinition\n}\n\n/**\n * Connector-scoped read handler used by batch sync definitions.\n *\n * This intentionally uses TypeScript's method-parameter bivariance behavior so syncs with\n * different checkpoint types can still be stored as general `SyncDefinition[]` values. The\n * builder still gives users precise `context.checkpoint` and `setCheckpoint(...)` types when\n * they author a sync.\n */\nexport type SyncReadHandler<\n TAdapter extends AnyConnectorAdapter,\n TCheckpoint = never,\n TMode extends SyncMode = SyncMode,\n> = {\n bivarianceHack(\n client: ConnectorClient<TAdapter>,\n context: SyncReadContext<TCheckpoint, TAdapter>\n ): SyncReadResult<TMode> | Promise<SyncReadResult<TMode>>\n}[\"bivarianceHack\"]\n\n/**\n * Inert sync definition registered with Sixb.\n *\n * V1 supports batch syncs only. Definitions are declarative metadata and do not\n * start any background work on their own.\n */\nexport interface SyncDefinition<\n TId extends string = string,\n TConnector extends ConnectorDefinition<string, AnyConnectorAdapter> = ConnectorDefinition<\n string,\n AnyConnectorAdapter\n >,\n TCheckpoint = unknown,\n TMode extends SyncMode = SyncMode,\n> {\n readonly kind: \"sync\"\n readonly id: TId\n readonly config: BatchSyncDefinitionConfig<TMode>\n readonly triggers: readonly ScheduleReference[]\n readonly connector: TConnector\n readonly read: SyncReadHandler<TConnector[\"adapter\"], TCheckpoint, TMode>\n readonly target: DatasetSyncTarget\n}\n\nexport interface SyncTargetBuilder<\n TId extends string = string,\n TConnector extends ConnectorDefinition<string, AnyConnectorAdapter> = ConnectorDefinition<\n string,\n AnyConnectorAdapter\n >,\n TCheckpoint = never,\n TMode extends SyncMode = SyncMode,\n> {\n intoDataset<TDataset extends DatasetDefinition>(\n dataset: TMode extends \"merge\"\n ? TDataset & { readonly primaryKey: DatasetPrimaryKey }\n : TDataset\n ): SyncDefinition<TId, TConnector, TCheckpoint, TMode>\n}\n\nexport interface SyncReadBuilder<\n TId extends string = string,\n TConnector extends ConnectorDefinition<string, AnyConnectorAdapter> = ConnectorDefinition<\n string,\n AnyConnectorAdapter\n >,\n TCheckpoint = never,\n TMode extends SyncMode = SyncMode,\n> {\n read(\n handler: SyncReadHandler<TConnector[\"adapter\"], TCheckpoint, TMode>\n ): SyncTargetBuilder<TId, TConnector, TCheckpoint, TMode>\n}\n\nexport interface SyncBuilder<\n TId extends string = string,\n TCheckpoint = never,\n TMode extends SyncMode = SyncMode,\n> {\n when(schedule: ScheduleDefinition): SyncBuilder<TId, TCheckpoint, TMode>\n checkpoint<TNextCheckpoint>(): SyncBuilder<TId, TNextCheckpoint, TMode>\n from<TConnector extends ConnectorDefinition<string, AnyConnectorAdapter>>(\n connector: TConnector\n ): SyncReadBuilder<TId, TConnector, TCheckpoint, TMode>\n}\n\n/** Runtime type guard for values discovered from `syncs/` modules. */\nexport function isSyncDefinition(value: unknown): value is SyncDefinition {\n if (!isRecord(value)) {\n return false\n }\n\n return (\n value.kind === \"sync\" &&\n typeof value.id === \"string\" &&\n isRecord(value.config) &&\n value.config.kind === \"batch\" &&\n (value.config.mode === \"snapshot\" ||\n value.config.mode === \"append\" ||\n value.config.mode === \"merge\") &&\n Array.isArray(value.triggers) &&\n (value.triggers as unknown[]).every((reference) => isScheduleReference(reference)) &&\n isConnectorDefinition(value.connector) &&\n typeof value.read === \"function\" &&\n isRecord(value.target) &&\n value.target.kind === \"dataset\" &&\n isDatasetDefinition(value.target.dataset)\n )\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n"
9
9
  ],
10
- "mappings": "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",
11
- "debugId": "FBA7A5471B50E1A564756E2164756E21",
10
+ "mappings": "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",
11
+ "debugId": "99DD47F6247AC4A364756E2164756E21",
12
12
  "names": []
13
13
  }
@@ -34,7 +34,7 @@ import {
34
34
  createCommitId2,
35
35
  createEventId2,
36
36
  materializationApplyPhase
37
- } from "./chunk-x57ycxq0.js";
37
+ } from "./chunk-gqh45d2n.js";
38
38
  import {
39
39
  ProjectionValidationError2,
40
40
  validateProjectionsAtStartup,
@@ -3122,6 +3122,12 @@ function createProjectionEntryValidator(ontology, resolved) {
3122
3122
  const policy = createValidationPolicy(resolved);
3123
3123
  return (entry) => validateProjectionEntry(ontology, resolved, policy, entry);
3124
3124
  }
3125
+ function validateProjectionRootRef(resolved, root) {
3126
+ const definition = resolved.definition;
3127
+ const owned = definition._tag === "ObjectProjectionDefinition" ? root.kind === "object" && root.ref.objectTypeId === definition.objectTypeId : root.kind === "link" && root.ref.source.objectTypeId === definition.sourceObjectTypeId && root.ref.target.objectTypeId === definition.targetObjectTypeId && root.ref.linkId === definition.linkId;
3128
+ if (!owned)
3129
+ throw new MaterializationValidationError2("Projection root is outside its owned type or link scope.");
3130
+ }
3125
3131
  function createValidationPolicy(resolved) {
3126
3132
  const ownedProperties = new Map(resolved.ownership.objects.map((object) => [object.objectTypeId, new Set(object.propertyIds)]));
3127
3133
  const ownedLinks = new Set(resolved.ownership.links.map((link) => linkOwnershipKey(link.sourceObjectTypeId, link.linkId)));
@@ -3478,13 +3484,23 @@ async function stageProjectionMaterialization(context, input) {
3478
3484
  projectionRevision: input.projectionRevision,
3479
3485
  ownershipHash: input.ownershipHash,
3480
3486
  ontologyRevision: context.projectionRegistry.ontologyRevision,
3481
- createdAt: input.createdAt
3487
+ createdAt: input.createdAt,
3488
+ ...input.base ? { base: input.base } : {}
3482
3489
  });
3483
3490
  let rootCount = 0;
3484
3491
  let assertionCount = 0;
3485
3492
  async function* assertions() {
3486
3493
  for await (const rawEntry of input.entries) {
3487
3494
  throwIfAborted(input.signal);
3495
+ if ("deleted" in rawEntry) {
3496
+ if (!input.base || rawEntry.deleted !== true) {
3497
+ throw new MaterializationValidationError2("Explicit root deletions require a pinned source base.");
3498
+ }
3499
+ const root = normalizeProjectionEntity(rawEntry.root);
3500
+ validateProjectionRootRef(context.projectionRegistry.resolveSource(input.source.projectionId), root);
3501
+ yield { root, stagingOrdinal: rootCount++ };
3502
+ continue;
3503
+ }
3488
3504
  const entry = input.validateEntry(normalizeProjectionSourceEntry2(rawEntry));
3489
3505
  const stagingOrdinal = rootCount;
3490
3506
  for (const assertion of entry.assertions) {
@@ -3505,7 +3521,8 @@ async function stageProjectionMaterialization(context, input) {
3505
3521
  source: input.source,
3506
3522
  materializationId: input.materializationId,
3507
3523
  execution: input.execution,
3508
- rows
3524
+ rows: rows.filter((row) => ("assertion" in row)),
3525
+ deletions: rows.filter((row) => !("assertion" in row))
3509
3526
  });
3510
3527
  }
3511
3528
  await context.storage.ontology.sources.markReady({
@@ -3557,6 +3574,7 @@ function prepareProjectionReplacement(context, raw) {
3557
3574
  datasetVersion,
3558
3575
  execution,
3559
3576
  entries: raw.input.entries,
3577
+ ...raw.input.base ? { base: Object.freeze({ ...raw.input.base }) } : {},
3560
3578
  resolved,
3561
3579
  projectionKind,
3562
3580
  runIdentity,
@@ -3622,6 +3640,7 @@ async function prepareProjectionCandidate(context, command) {
3622
3640
  source: command.source
3623
3641
  });
3624
3642
  validateProjectionWatermark(active, command.datasetVersion);
3643
+ assertDeltaBase(active, command);
3625
3644
  return {
3626
3645
  materializationId: context.materializationId(),
3627
3646
  createdAt: context.clock().toISOString(),
@@ -3643,6 +3662,7 @@ async function stageProjectionCandidate(context, command, candidate) {
3643
3662
  ownershipHash: command.resolved.ownershipHash,
3644
3663
  createdAt: candidate.createdAt,
3645
3664
  entries: command.entries,
3665
+ ...command.base ? { base: command.base } : {},
3646
3666
  validateEntry: createProjectionEntryValidator(context.ontology, command.resolved)
3647
3667
  };
3648
3668
  const staged = await stageCandidateEntries(context, input, command.signal);
@@ -3666,6 +3686,14 @@ async function executeProjectionTransaction(context, storage, command, ready) {
3666
3686
  const replay = await replayCommitRecord(context, command.identity, command.scopeExecution.executionId, storage);
3667
3687
  if (replay)
3668
3688
  return projectionReplayResult(replay, command);
3689
+ if (command.base) {
3690
+ const active = await storage.ontology.sources.getActive({
3691
+ projectId: context.projectId,
3692
+ source: command.source
3693
+ });
3694
+ validateProjectionWatermark(active, command.datasetVersion);
3695
+ assertDeltaBase(active, command);
3696
+ }
3669
3697
  const origin = projectionOrigin(command);
3670
3698
  throwIfAborted(command.signal);
3671
3699
  const session = await storage.ontology.materializations.begin({
@@ -3783,6 +3811,11 @@ function validateProjectionWatermark(active, next) {
3783
3811
  return;
3784
3812
  assertPinnedDatasetWatermark2(active.datasetVersion, next, "Projection replacement");
3785
3813
  }
3814
+ function assertDeltaBase(active, command) {
3815
+ if (command.base && (!active || active.materializationId !== command.base.materializationId || active.lastCommitId !== command.base.lastCommitId || active.projectionRevision !== command.runIdentity.projectionRevision || active.ontologyRevision !== command.runIdentity.ontologyRevision || active.ownershipHash !== command.runIdentity.ownershipHash)) {
3816
+ throw new MaterializationConflictError2("source-materialization", "Projection delta no longer matches the active source or its definition.");
3817
+ }
3818
+ }
3786
3819
 
3787
3820
  // src/materializer/telemetry/plan.ts
3788
3821
  async function planTelemetryAppend(context, storage, session, input, identity, origin, event) {
@@ -4292,6 +4325,10 @@ class OntologyMaterializer2 {
4292
4325
  commit: (command) => commitEdits(this.context, command)
4293
4326
  };
4294
4327
  projections = {
4328
+ getActive: (source) => this.context.storage.ontology.sources.getActive({
4329
+ projectId: this.context.projectId,
4330
+ source
4331
+ }),
4295
4332
  replace: (command) => replaceProjection(this.context, command),
4296
4333
  finishRun: (command) => finishProjectionRun(this.context, command)
4297
4334
  };
@@ -4304,6 +4341,7 @@ class OntologyMaterializer2 {
4304
4341
  commit: (input) => this.edits.commit({ scope, input })
4305
4342
  }),
4306
4343
  projections: Object.freeze({
4344
+ getActive: (source) => this.projections.getActive(source),
4307
4345
  replace: (input) => this.projections.replace({ scope, input }),
4308
4346
  finishRun: (input) => this.projections.finishRun({ scope, input })
4309
4347
  }),
@@ -4328,4 +4366,4 @@ function createOntologyMaterializer2(input) {
4328
4366
  }
4329
4367
  export { computeOntologyRevision2, computeProjectionRevision2, computeProjectionOwnershipHash2, ProjectionRegistry2, createActionIdempotencyKey2, createRuntimeIdempotencyKey2, createProjectionIdempotencyKey2, createRuntimeTelemetryIdempotencyKey2, createProjectionTelemetryIdempotencyKey2, createCommitIdentity2, timestampCommitIdentity2, createTimedCommitIdentity2, createProjectionMaterializationId2, createLinkScopeFingerprint2, normalizeJsonProperties2, normalizeOntologyEditCommit2, normalizeProjectionExecution2, normalizeProjectionSourceEntry2, normalizeTelemetryAppend2, OntologyMaterializer2, createOntologyMaterializer2 };
4330
4368
 
4331
- //# debugId=D5AC53F589D39D7164756E2164756E21
4369
+ //# debugId=45B690D58E462D3C64756E2164756E21