@sixb/core 0.1.3 → 0.1.4

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 (252) hide show
  1. package/dist/actions/index.js +17 -18
  2. package/dist/actions/index.js.map +1 -1
  3. package/dist/actions/worker.js +4 -4
  4. package/dist/actions/worker.js.map +1 -1
  5. package/dist/agents/context-compaction.d.ts +40 -0
  6. package/dist/agents/context-compaction.d.ts.map +1 -0
  7. package/dist/agents/ids.d.ts +2 -0
  8. package/dist/agents/ids.d.ts.map +1 -1
  9. package/dist/agents/index.d.ts +6 -5
  10. package/dist/agents/index.d.ts.map +1 -1
  11. package/dist/agents/index.js +42 -37
  12. package/dist/agents/index.js.map +1 -1
  13. package/dist/agents/streams.d.ts +17 -1
  14. package/dist/agents/streams.d.ts.map +1 -1
  15. package/dist/agents/streams.js +4 -2
  16. package/dist/agents/streams.js.map +1 -1
  17. package/dist/agents/types.d.ts +9 -0
  18. package/dist/agents/types.d.ts.map +1 -1
  19. package/dist/agents/validation.d.ts +1 -1
  20. package/dist/agents/validation.d.ts.map +1 -1
  21. package/dist/auth/index.js +7 -3
  22. package/dist/auth/index.js.map +1 -1
  23. package/dist/authorization/index.js +6 -2
  24. package/dist/authorization/index.js.map +1 -1
  25. package/dist/bootstrap/index.js +30 -31
  26. package/dist/bootstrap/index.js.map +1 -1
  27. package/dist/{chunk-xmggaxg4.js → chunk-1wk20wn3.js} +188 -21
  28. package/dist/{chunk-xmggaxg4.js.map → chunk-1wk20wn3.js.map} +7 -5
  29. package/dist/{chunk-1ywq4hzk.js → chunk-1yz3x65y.js} +7 -7
  30. package/dist/{chunk-gqdd7508.js → chunk-4rh2m6zg.js} +1 -1
  31. package/dist/{chunk-fmx1sz2h.js → chunk-72q2y8hn.js} +3 -3
  32. package/dist/{chunk-fmx1sz2h.js.map → chunk-72q2y8hn.js.map} +3 -3
  33. package/dist/{chunk-f1cyvnrk.js → chunk-7gw7mepb.js} +259 -9
  34. package/dist/chunk-7gw7mepb.js.map +14 -0
  35. package/dist/{chunk-wb4051cx.js → chunk-819wnjz8.js} +11 -5
  36. package/dist/chunk-819wnjz8.js.map +12 -0
  37. package/dist/{chunk-pxtrxm3p.js → chunk-a09jx26t.js} +1 -1
  38. package/dist/{chunk-ettb0cy4.js → chunk-afjpa2hs.js} +59 -29
  39. package/dist/{chunk-ettb0cy4.js.map → chunk-afjpa2hs.js.map} +5 -5
  40. package/dist/{chunk-177ed2mp.js → chunk-c43qr6s0.js} +229 -97
  41. package/dist/{chunk-177ed2mp.js.map → chunk-c43qr6s0.js.map} +9 -9
  42. package/dist/{chunk-261ag4t4.js → chunk-cbkm2vam.js} +3 -3
  43. package/dist/{chunk-zpw39qhj.js → chunk-dm72y8wt.js} +25 -2
  44. package/dist/chunk-dm72y8wt.js.map +10 -0
  45. package/dist/{chunk-kqxgf6kv.js → chunk-drjqm1aa.js} +16 -1
  46. package/dist/{chunk-kqxgf6kv.js.map → chunk-drjqm1aa.js.map} +3 -3
  47. package/dist/chunk-dysw7nsm.js.map +1 -1
  48. package/dist/{chunk-4aw0jwk0.js → chunk-f6erf2vv.js} +1 -1
  49. package/dist/{chunk-4z3n1dzt.js → chunk-f83ka50g.js} +131 -25
  50. package/dist/chunk-f83ka50g.js.map +23 -0
  51. package/dist/{chunk-km4rkj4t.js → chunk-g13869yf.js} +3 -3
  52. package/dist/{chunk-c8bw2b6c.js → chunk-hbeh8j9w.js} +2 -2
  53. package/dist/{chunk-n5x5y80a.js → chunk-nzw7sm3b.js} +2 -2
  54. package/dist/{chunk-3rsf30p4.js → chunk-pn8n8sba.js} +16 -15
  55. package/dist/{chunk-3rsf30p4.js.map → chunk-pn8n8sba.js.map} +3 -3
  56. package/dist/{chunk-63te770v.js → chunk-qewtks41.js} +8 -8
  57. package/dist/{chunk-63te770v.js.map → chunk-qewtks41.js.map} +2 -2
  58. package/dist/{chunk-4p9rh7jj.js → chunk-rs1wbvy6.js} +1 -1
  59. package/dist/{chunk-88ppkr54.js → chunk-rte5sm3z.js} +26 -2
  60. package/dist/chunk-rte5sm3z.js.map +12 -0
  61. package/dist/{chunk-bv41fmjn.js → chunk-s31d0qmq.js} +57 -20
  62. package/dist/{chunk-bv41fmjn.js.map → chunk-s31d0qmq.js.map} +8 -7
  63. package/dist/{chunk-c6cfqydk.js → chunk-sxwk41qa.js} +1 -1
  64. package/dist/chunk-t0jjkep3.js.map +1 -1
  65. package/dist/{chunk-d6y2wsfg.js → chunk-tek1qwgm.js} +6 -6
  66. package/dist/{chunk-d6y2wsfg.js.map → chunk-tek1qwgm.js.map} +1 -1
  67. package/dist/{chunk-d2adj15j.js → chunk-tkdscva6.js} +1 -1
  68. package/dist/{chunk-ttba8x6z.js → chunk-tycbzedm.js} +2 -2
  69. package/dist/{chunk-z8j83gzd.js → chunk-x2yw73hy.js} +1 -1
  70. package/dist/{chunk-qer6am8w.js → chunk-xdf9yswn.js} +1 -1
  71. package/dist/execution/agent.js +26 -27
  72. package/dist/execution/agent.js.map +1 -1
  73. package/dist/execution/primitive.js +26 -27
  74. package/dist/execution/primitive.js.map +2 -2
  75. package/dist/execution/request.js +27 -28
  76. package/dist/execution/request.js.map +2 -2
  77. package/dist/http/index.js +1 -1
  78. package/dist/index.d.ts +5 -4
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +52 -53
  81. package/dist/index.js.map +1 -1
  82. package/dist/lake-storage/types.d.ts +2 -1
  83. package/dist/lake-storage/types.d.ts.map +1 -1
  84. package/dist/materializer/index.js +15 -16
  85. package/dist/materializer/index.js.map +1 -1
  86. package/dist/models/index.d.ts +40 -0
  87. package/dist/models/index.d.ts.map +1 -0
  88. package/dist/objects/execution.d.ts +6 -1
  89. package/dist/objects/execution.d.ts.map +1 -1
  90. package/dist/objects/index.js +19 -20
  91. package/dist/objects/index.js.map +1 -1
  92. package/dist/objects/link/endpoints.d.ts.map +1 -1
  93. package/dist/objects/query/executor.d.ts +1 -0
  94. package/dist/objects/query/executor.d.ts.map +1 -1
  95. package/dist/objects/query/explain.d.ts +1 -0
  96. package/dist/objects/query/explain.d.ts.map +1 -1
  97. package/dist/objects/query/index.d.ts +3 -1
  98. package/dist/objects/query/index.d.ts.map +1 -1
  99. package/dist/objects/query/index.js +30 -5
  100. package/dist/objects/query/index.js.map +1 -1
  101. package/dist/objects/query/ir.d.ts +14 -1
  102. package/dist/objects/query/ir.d.ts.map +1 -1
  103. package/dist/objects/query/links.d.ts +25 -0
  104. package/dist/objects/query/links.d.ts.map +1 -0
  105. package/dist/objects/query/normalize.d.ts.map +1 -1
  106. package/dist/objects/query/planner.d.ts.map +1 -1
  107. package/dist/objects/query/validate.d.ts +1 -0
  108. package/dist/objects/query/validate.d.ts.map +1 -1
  109. package/dist/pipelines/index.js +15 -16
  110. package/dist/pipelines/index.js.map +1 -1
  111. package/dist/projections/builders.d.ts +33 -4
  112. package/dist/projections/builders.d.ts.map +1 -1
  113. package/dist/projections/index.d.ts +1 -1
  114. package/dist/projections/index.d.ts.map +1 -1
  115. package/dist/projections/internal.js +15 -16
  116. package/dist/projections/internal.js.map +1 -1
  117. package/dist/projections/run-dispatch.d.ts +1 -0
  118. package/dist/projections/run-dispatch.d.ts.map +1 -1
  119. package/dist/projections/types.d.ts +12 -9
  120. package/dist/projections/types.d.ts.map +1 -1
  121. package/dist/projections/validation.d.ts +6 -5
  122. package/dist/projections/validation.d.ts.map +1 -1
  123. package/dist/query.d.ts +2 -1
  124. package/dist/query.d.ts.map +1 -1
  125. package/dist/query.js +2 -2
  126. package/dist/runtime/create.d.ts +3 -0
  127. package/dist/runtime/create.d.ts.map +1 -1
  128. package/dist/runtime/definitions.d.ts +3 -0
  129. package/dist/runtime/definitions.d.ts.map +1 -1
  130. package/dist/runtime/host.d.ts +2 -0
  131. package/dist/runtime/host.d.ts.map +1 -1
  132. package/dist/runtime/resolve-definitions.d.ts +2 -0
  133. package/dist/runtime/resolve-definitions.d.ts.map +1 -1
  134. package/dist/storage/agents/in-memory.d.ts +4 -0
  135. package/dist/storage/agents/in-memory.d.ts.map +1 -1
  136. package/dist/storage/agents/provider.js +9 -5
  137. package/dist/storage/agents/provider.js.map +1 -1
  138. package/dist/storage/agents/types.d.ts +5 -0
  139. package/dist/storage/agents/types.d.ts.map +1 -1
  140. package/dist/storage/ai-cost/provider.js +1 -1
  141. package/dist/storage/ai-usage/in-memory.d.ts +2 -1
  142. package/dist/storage/ai-usage/in-memory.d.ts.map +1 -1
  143. package/dist/storage/ai-usage/index.d.ts +1 -1
  144. package/dist/storage/ai-usage/index.d.ts.map +1 -1
  145. package/dist/storage/ai-usage/types.d.ts +6 -0
  146. package/dist/storage/ai-usage/types.d.ts.map +1 -1
  147. package/dist/storage/index.d.ts +3 -2
  148. package/dist/storage/index.d.ts.map +1 -1
  149. package/dist/storage/index.js +19 -14
  150. package/dist/storage/index.js.map +1 -1
  151. package/dist/storage/objects/in-memory.d.ts +6 -3
  152. package/dist/storage/objects/in-memory.d.ts.map +1 -1
  153. package/dist/storage/objects/index.d.ts +3 -1
  154. package/dist/storage/objects/index.d.ts.map +1 -1
  155. package/dist/storage/objects/keys.d.ts +16 -0
  156. package/dist/storage/objects/keys.d.ts.map +1 -0
  157. package/dist/storage/objects/types.d.ts +33 -6
  158. package/dist/storage/objects/types.d.ts.map +1 -1
  159. package/dist/storage/ontology/provider.js +1 -1
  160. package/dist/storage/workflow-runs/provider.js +9 -5
  161. package/dist/storage/workflow-runs/provider.js.map +1 -1
  162. package/dist/syncs/index.js +15 -16
  163. package/dist/syncs/index.js.map +1 -1
  164. package/dist/testing/agent-storage-contract.d.ts.map +1 -1
  165. package/dist/testing/ai-usage-storage-contract.d.ts.map +1 -1
  166. package/dist/testing/effective-storage-contract.d.ts +1 -1
  167. package/dist/testing/effective-storage-contract.d.ts.map +1 -1
  168. package/dist/testing/index.js +455 -40
  169. package/dist/testing/index.js.map +7 -7
  170. package/dist/testing/lake-storage-contract.d.ts.map +1 -1
  171. package/dist/testing/object-query-contract.d.ts +1 -1
  172. package/dist/testing/object-query-contract.d.ts.map +1 -1
  173. package/dist/webhooks/internal.js +13 -14
  174. package/dist/webhooks/internal.js.map +2 -2
  175. package/dist/workflows/index.js +27 -28
  176. package/dist/workflows/index.js.map +1 -1
  177. package/package.json +1 -1
  178. package/src/agents/builders.ts +3 -3
  179. package/src/agents/context-compaction.ts +261 -0
  180. package/src/agents/ids.ts +5 -0
  181. package/src/agents/index.ts +18 -9
  182. package/src/agents/streams.ts +56 -0
  183. package/src/agents/types.ts +10 -0
  184. package/src/agents/validation.ts +35 -5
  185. package/src/http/api-routes.ts +7 -7
  186. package/src/index.ts +14 -0
  187. package/src/lake-storage/types.ts +2 -1
  188. package/src/materializer/telemetry/append.ts +33 -16
  189. package/src/models/index.ts +71 -0
  190. package/src/objects/execution.ts +20 -0
  191. package/src/objects/link/endpoints.ts +2 -1
  192. package/src/objects/query/executor.ts +42 -11
  193. package/src/objects/query/explain.ts +11 -0
  194. package/src/objects/query/index.ts +6 -0
  195. package/src/objects/query/ir.ts +16 -0
  196. package/src/objects/query/links.ts +308 -0
  197. package/src/objects/query/normalize.ts +40 -1
  198. package/src/objects/query/planner.ts +5 -0
  199. package/src/objects/query/validate.ts +58 -2
  200. package/src/projections/builders.ts +220 -15
  201. package/src/projections/index.ts +1 -0
  202. package/src/projections/ownership.ts +5 -5
  203. package/src/projections/registry.ts +9 -3
  204. package/src/projections/revision.ts +31 -5
  205. package/src/projections/run-dispatch.ts +10 -1
  206. package/src/projections/types.ts +13 -9
  207. package/src/projections/validation.ts +61 -19
  208. package/src/query.ts +2 -0
  209. package/src/runtime/create.ts +4 -0
  210. package/src/runtime/definitions.ts +3 -0
  211. package/src/runtime/host.ts +2 -0
  212. package/src/runtime/resolve-definitions.ts +28 -0
  213. package/src/storage/agents/in-memory.ts +15 -0
  214. package/src/storage/agents/types.ts +5 -0
  215. package/src/storage/ai-usage/in-memory.ts +23 -0
  216. package/src/storage/ai-usage/index.ts +1 -0
  217. package/src/storage/ai-usage/types.ts +10 -0
  218. package/src/storage/index.ts +11 -0
  219. package/src/storage/objects/in-memory.ts +103 -16
  220. package/src/storage/objects/index.ts +9 -0
  221. package/src/storage/objects/keys.ts +36 -0
  222. package/src/storage/objects/types.ts +34 -6
  223. package/src/storage/ontology/provider-header-validation.ts +2 -2
  224. package/src/testing/agent-storage-contract.ts +12 -0
  225. package/src/testing/ai-usage-storage-contract.ts +35 -0
  226. package/src/testing/effective-storage-contract.ts +194 -4
  227. package/src/testing/lake-storage-contract.ts +56 -0
  228. package/src/testing/object-query-contract.ts +208 -1
  229. package/dist/agents/prompt.d.ts +0 -21
  230. package/dist/agents/prompt.d.ts.map +0 -1
  231. package/dist/chunk-4z3n1dzt.js.map +0 -23
  232. package/dist/chunk-6wetht33.js +0 -89
  233. package/dist/chunk-6wetht33.js.map +0 -10
  234. package/dist/chunk-88ppkr54.js.map +0 -12
  235. package/dist/chunk-f1cyvnrk.js.map +0 -13
  236. package/dist/chunk-wb4051cx.js.map +0 -12
  237. package/dist/chunk-zpw39qhj.js.map +0 -10
  238. package/src/agents/prompt.ts +0 -85
  239. /package/dist/{chunk-1ywq4hzk.js.map → chunk-1yz3x65y.js.map} +0 -0
  240. /package/dist/{chunk-gqdd7508.js.map → chunk-4rh2m6zg.js.map} +0 -0
  241. /package/dist/{chunk-pxtrxm3p.js.map → chunk-a09jx26t.js.map} +0 -0
  242. /package/dist/{chunk-261ag4t4.js.map → chunk-cbkm2vam.js.map} +0 -0
  243. /package/dist/{chunk-4aw0jwk0.js.map → chunk-f6erf2vv.js.map} +0 -0
  244. /package/dist/{chunk-km4rkj4t.js.map → chunk-g13869yf.js.map} +0 -0
  245. /package/dist/{chunk-c8bw2b6c.js.map → chunk-hbeh8j9w.js.map} +0 -0
  246. /package/dist/{chunk-n5x5y80a.js.map → chunk-nzw7sm3b.js.map} +0 -0
  247. /package/dist/{chunk-4p9rh7jj.js.map → chunk-rs1wbvy6.js.map} +0 -0
  248. /package/dist/{chunk-c6cfqydk.js.map → chunk-sxwk41qa.js.map} +0 -0
  249. /package/dist/{chunk-d2adj15j.js.map → chunk-tkdscva6.js.map} +0 -0
  250. /package/dist/{chunk-ttba8x6z.js.map → chunk-tycbzedm.js.map} +0 -0
  251. /package/dist/{chunk-z8j83gzd.js.map → chunk-x2yw73hy.js.map} +0 -0
  252. /package/dist/{chunk-qer6am8w.js.map → chunk-xdf9yswn.js.map} +0 -0
@@ -5,10 +5,10 @@ import {
5
5
  import {
6
6
  ensureExecutionRecord,
7
7
  executionRecordInputFromRuntime
8
- } from "./chunk-4aw0jwk0.js";
8
+ } from "./chunk-f6erf2vv.js";
9
9
  import {
10
10
  isStorageSerializationFailure
11
- } from "./chunk-xmggaxg4.js";
11
+ } from "./chunk-1wk20wn3.js";
12
12
  import {
13
13
  createCommitId,
14
14
  createEventId,
@@ -16,7 +16,7 @@ import {
16
16
  materializationApplyPhase,
17
17
  materializationEventKindOrdinal,
18
18
  sha256Canonical
19
- } from "./chunk-fmx1sz2h.js";
19
+ } from "./chunk-72q2y8hn.js";
20
20
  import {
21
21
  assertPinnedDatasetWatermark
22
22
  } from "./chunk-9dzba0f2.js";
@@ -44,6 +44,12 @@ import {
44
44
  MaterializationObjectNotFoundError,
45
45
  MaterializationValidationError
46
46
  } from "./chunk-ry24jbr1.js";
47
+ import {
48
+ ProjectionValidationError,
49
+ isProjectionDefinition,
50
+ resolveExecutionScopeAuthorization,
51
+ validateProjectionsAtStartup
52
+ } from "./chunk-f83ka50g.js";
47
53
  import {
48
54
  assertKnownProperties,
49
55
  normalizeLinkProperties,
@@ -54,12 +60,6 @@ import {
54
60
  validatePropertyValue,
55
61
  validateTelemetryUnit
56
62
  } from "./chunk-rnshztfq.js";
57
- import {
58
- ProjectionValidationError,
59
- isProjectionDefinition,
60
- resolveExecutionScopeAuthorization,
61
- validateProjectionsAtStartup
62
- } from "./chunk-4z3n1dzt.js";
63
63
  import {
64
64
  assertJsonValue,
65
65
  cloneJsonValue,
@@ -186,14 +186,31 @@ function normalizeProjectionDefinition(projection) {
186
186
  targetField: projection.targetField
187
187
  };
188
188
  }
189
+ const properties = Object.entries(projection.properties).sort(([left], [right]) => compareStrings(left, right));
190
+ if (properties.length === 1) {
191
+ const [propertyId, mapping] = properties[0];
192
+ return {
193
+ kind: "telemetry",
194
+ objectTypeId: projection.objectTypeId,
195
+ propertyId,
196
+ objectIdField: projection.objectIdField,
197
+ atField: projection.atField,
198
+ valueField: mapping.valueField,
199
+ unitField: mapping.unitField ?? null
200
+ };
201
+ }
189
202
  return {
190
203
  kind: "telemetry",
191
204
  objectTypeId: projection.objectTypeId,
192
- propertyId: projection.propertyId,
193
205
  objectIdField: projection.objectIdField,
194
206
  atField: projection.atField,
195
- valueField: projection.valueField,
196
- unitField: projection.unitField ?? null
207
+ properties: Object.fromEntries(properties.map(([propertyId, mapping]) => [
208
+ propertyId,
209
+ {
210
+ valueField: mapping.valueField,
211
+ unitField: mapping.unitField ?? null
212
+ }
213
+ ]))
197
214
  };
198
215
  }
199
216
  function projectionColumns(projection) {
@@ -210,8 +227,10 @@ function projectionColumns(projection) {
210
227
  return new Set([
211
228
  projection.objectIdField,
212
229
  projection.atField,
213
- projection.valueField,
214
- ...projection.unitField === undefined ? [] : [projection.unitField]
230
+ ...Object.values(projection.properties).flatMap((mapping) => [
231
+ mapping.valueField,
232
+ ...mapping.unitField === undefined ? [] : [mapping.unitField]
233
+ ])
215
234
  ]);
216
235
  }
217
236
  function normalizeProperty(property) {
@@ -453,12 +472,16 @@ function cloneTelemetryProjectionDefinition(projection) {
453
472
  _tag: "TelemetryProjectionDefinition",
454
473
  id: projection.id,
455
474
  objectTypeId: projection.objectTypeId,
456
- propertyId: projection.propertyId,
457
475
  datasetId: projection.datasetId,
458
476
  objectIdField: projection.objectIdField,
459
477
  atField: projection.atField,
460
- valueField: projection.valueField,
461
- ...projection.unitField !== undefined ? { unitField: projection.unitField } : {}
478
+ properties: Object.fromEntries(Object.entries(projection.properties).map(([propertyId, mapping]) => [
479
+ propertyId,
480
+ {
481
+ valueField: mapping.valueField,
482
+ ...mapping.unitField !== undefined ? { unitField: mapping.unitField } : {}
483
+ }
484
+ ]))
462
485
  };
463
486
  }
464
487
  function deepFreeze(value) {
@@ -3972,7 +3995,6 @@ function prepareTelemetryAppend(context, raw) {
3972
3995
  points: raw.input.points.map((point) => validateTelemetryPoint(context.ontology, point))
3973
3996
  });
3974
3997
  const inputPointCount = telemetryInputPointCount(input, rawInputPointCount);
3975
- validateTelemetryBatch(input, inputPointCount);
3976
3998
  const ontologyRevision = context.projectionRegistry.ontologyRevision;
3977
3999
  const execution = prepareMaterializerExecution(context.projectId, raw.scope);
3978
4000
  if (input.source.kind === "runtime") {
@@ -3991,16 +4013,6 @@ function telemetryInputPointCount(input, rawInputPointCount) {
3991
4013
  return rawInputPointCount;
3992
4014
  return input.points.length;
3993
4015
  }
3994
- function validateTelemetryBatch(input, inputPointCount) {
3995
- if (input.source.kind === "projection") {
3996
- if (input.source.sourceRowCount === 0) {
3997
- throw new MaterializationValidationError("Projection telemetry batches must consume at least one source row; an empty dataset produces no batch commit.");
3998
- }
3999
- if (input.source.sourceRowCount !== inputPointCount + input.source.sourceRowsSkipped) {
4000
- throw new MaterializationValidationError("Projection telemetry sourceRowCount must equal input points plus skipped rows.");
4001
- }
4002
- }
4003
- }
4004
4016
  function prepareRuntimeTelemetry(context, input, source, inputPointCount, ontologyRevision) {
4005
4017
  const identity = createTimedCommitIdentity({
4006
4018
  projectId: context.projectId,
@@ -4014,6 +4026,7 @@ function prepareProjectionTelemetry(context, input, source, inputPointCount, ont
4014
4026
  const resolvedProjection = context.projectionRegistry.resolveTelemetry(source.projection.projectionId);
4015
4027
  validateTelemetryProjectionDataset(resolvedProjection, source);
4016
4028
  validateTelemetryOwnership(resolvedProjection, input);
4029
+ validateTelemetryBatchCardinality(resolvedProjection, source, inputPointCount);
4017
4030
  const runIdentity = createProjectionRunMaterializationIdentity({
4018
4031
  resolved: resolvedProjection,
4019
4032
  datasetVersion: source.datasetVersion,
@@ -4036,6 +4049,23 @@ function prepareProjectionTelemetry(context, input, source, inputPointCount, ont
4036
4049
  runIdentity
4037
4050
  };
4038
4051
  }
4052
+ function validateTelemetryBatchCardinality(resolved, source, inputPointCount) {
4053
+ if (source.sourceRowCount === 0) {
4054
+ throw new MaterializationValidationError("Projection telemetry batches must consume at least one source row; an empty dataset produces no batch commit.");
4055
+ }
4056
+ const mappedPropertyCount = resolved.ownership.telemetry.length;
4057
+ if (mappedPropertyCount === 0) {
4058
+ throw new MaterializationValidationError(`Telemetry projection '${resolved.projectionId}' must own at least one telemetry property.`);
4059
+ }
4060
+ const sourceRowsEmitted = source.sourceRowCount - source.sourceRowsSkipped;
4061
+ const maximumPointCount = sourceRowsEmitted * mappedPropertyCount;
4062
+ if (!Number.isSafeInteger(maximumPointCount)) {
4063
+ throw new MaterializationValidationError(`Telemetry projection '${resolved.projectionId}' batch point capacity exceeds the safe integer range.`);
4064
+ }
4065
+ if (inputPointCount < sourceRowsEmitted || inputPointCount > maximumPointCount) {
4066
+ throw new MaterializationValidationError(`Telemetry projection '${resolved.projectionId}' must emit between ${sourceRowsEmitted} and ${maximumPointCount} points for ${source.sourceRowCount} source rows with ${source.sourceRowsSkipped} skipped.`);
4067
+ }
4068
+ }
4039
4069
  function validateTelemetryProjectionDataset(resolved, source) {
4040
4070
  if (resolved.datasetId === source.datasetVersion.datasetId)
4041
4071
  return;
@@ -4298,4 +4328,4 @@ function createOntologyMaterializer(input) {
4298
4328
  }
4299
4329
  export { computeOntologyRevision, computeProjectionRevision, computeProjectionOwnershipHash, ProjectionRegistry, createActionIdempotencyKey, createRuntimeIdempotencyKey, createProjectionIdempotencyKey, createRuntimeTelemetryIdempotencyKey, createProjectionTelemetryIdempotencyKey, createCommitIdentity, timestampCommitIdentity, createTimedCommitIdentity, createProjectionMaterializationId, createLinkScopeFingerprint, normalizeJsonProperties, normalizeOntologyEditCommit, normalizeProjectionExecution, normalizeProjectionSourceEntry, normalizeTelemetryAppend, OntologyMaterializer, createOntologyMaterializer };
4300
4330
 
4301
- //# debugId=E68F145E5D3DE1BE64756E2164756E21
4331
+ //# debugId=D96E192C1BE0917864756E2164756E21