@superpanel-sdk/runtime 0.2.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. package/README.md +28 -8
  2. package/dist/builder/codegen/emit.d.ts +29 -11
  3. package/dist/builder/codegen/emit.js +328 -61
  4. package/dist/builder/codegen/generate.d.ts +21 -0
  5. package/dist/builder/codegen/generate.js +152 -20
  6. package/dist/builder/company-import-graph.d.ts +2 -0
  7. package/dist/builder/company-import-graph.js +40 -8
  8. package/dist/builder/company-imports.d.ts +24 -0
  9. package/dist/builder/company-imports.js +114 -0
  10. package/dist/builder/compile/compile-sequence.d.ts +59 -8
  11. package/dist/builder/compile/compile-sequence.js +279 -77
  12. package/dist/builder/compile/function-code.d.ts +12 -2
  13. package/dist/builder/compile/function-code.js +87 -39
  14. package/dist/builder/compile/registry.d.ts +7 -3
  15. package/dist/builder/compile/registry.js +24 -23
  16. package/dist/builder/load.d.ts +70 -10
  17. package/dist/builder/load.js +250 -61
  18. package/dist/builder/paths.d.ts +3 -0
  19. package/dist/builder/paths.js +16 -0
  20. package/dist/builder/schedules.d.ts +23 -0
  21. package/dist/builder/schedules.js +102 -0
  22. package/dist/builder/slot-schema-validation.d.ts +4 -0
  23. package/dist/builder/slot-schema-validation.js +10 -0
  24. package/dist/builder/typecheck.d.ts +8 -0
  25. package/dist/builder/typecheck.js +105 -0
  26. package/dist/builder/types.d.ts +91 -19
  27. package/dist/builder/types.js +2 -1
  28. package/dist/cli/auth/auth.d.ts +37 -0
  29. package/dist/cli/auth/auth.js +211 -0
  30. package/dist/cli/auth/backend-url.d.ts +5 -0
  31. package/dist/cli/auth/backend-url.js +25 -0
  32. package/dist/cli/auth/clipboard.d.ts +9 -0
  33. package/dist/cli/auth/clipboard.js +38 -0
  34. package/dist/cli/auth/http.d.ts +20 -0
  35. package/dist/cli/auth/http.js +27 -0
  36. package/dist/cli/auth/index.d.ts +10 -0
  37. package/dist/cli/auth/index.js +27 -0
  38. package/dist/cli/auth/progress.d.ts +12 -0
  39. package/dist/cli/auth/progress.js +15 -0
  40. package/dist/cli/auth/serve-login.d.ts +8 -0
  41. package/dist/cli/auth/serve-login.js +24 -0
  42. package/dist/cli/compile/index.js +3 -0
  43. package/dist/cli/config.d.ts +10 -0
  44. package/dist/cli/config.js +52 -0
  45. package/dist/cli/index.js +28 -8
  46. package/dist/cli/serve/index.d.ts +73 -3
  47. package/dist/cli/serve/index.js +410 -113
  48. package/dist/cli/type-gen/index.js +9 -8
  49. package/dist/compiler.d.ts +7 -0
  50. package/dist/compiler.js +7 -0
  51. package/dist/compute-host/compute-host.d.ts +15 -23
  52. package/dist/compute-host/compute-host.js +25 -28
  53. package/dist/compute-host/index.d.ts +2 -2
  54. package/dist/compute-host/index.js +1 -1
  55. package/dist/compute-host/source-compute-host.d.ts +11 -9
  56. package/dist/compute-host/source-compute-host.js +50 -31
  57. package/dist/core/case-orchestrator/contact-hours.d.ts +50 -0
  58. package/dist/core/case-orchestrator/contact-hours.js +108 -0
  59. package/dist/core/case-orchestrator/follow-ups.d.ts +31 -0
  60. package/dist/core/case-orchestrator/follow-ups.js +103 -0
  61. package/dist/core/case-orchestrator/index.d.ts +6 -0
  62. package/dist/core/case-orchestrator/index.js +6 -0
  63. package/dist/core/case-orchestrator/render.d.ts +75 -0
  64. package/dist/core/case-orchestrator/render.js +239 -0
  65. package/dist/core/case-orchestrator/time.d.ts +11 -0
  66. package/dist/core/case-orchestrator/time.js +29 -0
  67. package/dist/core/case-orchestrator/tools.d.ts +29 -0
  68. package/dist/core/case-orchestrator/tools.js +31 -0
  69. package/dist/core/case-orchestrator/types.d.ts +753 -0
  70. package/dist/core/case-orchestrator/types.js +46 -0
  71. package/dist/core/case-orchestrator/validate.d.ts +11 -0
  72. package/dist/core/case-orchestrator/validate.js +63 -0
  73. package/dist/core/context/call.d.ts +291 -0
  74. package/dist/core/context/call.js +94 -0
  75. package/dist/core/context/channels.d.ts +60 -0
  76. package/dist/core/context/channels.js +35 -0
  77. package/dist/core/context/contact.d.ts +96 -6
  78. package/dist/core/context/contact.js +48 -2
  79. package/dist/core/context/email-message.d.ts +159 -0
  80. package/dist/core/context/email-message.js +59 -0
  81. package/dist/core/context/email.d.ts +97 -0
  82. package/dist/core/context/email.js +91 -0
  83. package/dist/core/context/exchanges.d.ts +142 -0
  84. package/dist/core/context/exchanges.js +63 -0
  85. package/dist/core/context/instances.d.ts +278 -0
  86. package/dist/core/context/instances.js +123 -0
  87. package/dist/core/context/kv.d.ts +113 -0
  88. package/dist/core/context/kv.js +60 -0
  89. package/dist/core/context/platform-registry.d.ts +509 -4
  90. package/dist/core/context/platform-registry.js +14 -2
  91. package/dist/core/context/platform.d.ts +2 -1
  92. package/dist/core/context/sms.d.ts +147 -0
  93. package/dist/core/context/sms.js +57 -0
  94. package/dist/core/context/types.d.ts +51 -30
  95. package/dist/core/context/types.js +1 -7
  96. package/dist/core/conversation/index.d.ts +31 -0
  97. package/dist/core/conversation/index.js +14 -0
  98. package/dist/core/functions/define/bind.d.ts +25 -0
  99. package/dist/core/functions/define/bind.js +14 -0
  100. package/dist/core/functions/define/case.d.ts +9 -0
  101. package/dist/core/functions/define/case.js +13 -0
  102. package/dist/core/functions/define/events.d.ts +20 -0
  103. package/dist/core/functions/define/events.js +21 -0
  104. package/dist/core/functions/define/no-case.d.ts +4 -0
  105. package/dist/core/functions/define/no-case.js +9 -0
  106. package/dist/core/functions/events.d.ts +247 -0
  107. package/dist/core/functions/events.js +32 -0
  108. package/dist/core/functions/func-ref.d.ts +11 -2
  109. package/dist/core/functions/schedules.d.ts +51 -0
  110. package/dist/core/functions/schedules.js +20 -0
  111. package/dist/core/functions/types.d.ts +62 -51
  112. package/dist/core/functions/types.js +6 -1
  113. package/dist/core/office-hours/index.d.ts +39 -0
  114. package/dist/core/office-hours/index.js +187 -0
  115. package/dist/core/page/define.d.ts +834 -0
  116. package/dist/core/page/define.js +477 -0
  117. package/dist/core/page/ops.d.ts +58 -0
  118. package/dist/core/page/ops.js +220 -0
  119. package/dist/core/page/render.d.ts +253 -0
  120. package/dist/core/page/render.js +840 -0
  121. package/dist/core/page/time-format.d.ts +19 -0
  122. package/dist/core/page/time-format.js +41 -0
  123. package/dist/core/page/timeline.d.ts +40 -0
  124. package/dist/core/page/timeline.js +2 -0
  125. package/dist/core/page/typed.d.ts +642 -0
  126. package/dist/core/page/typed.js +2 -0
  127. package/dist/core/page/workspace.d.ts +33 -0
  128. package/dist/core/page/workspace.js +231 -0
  129. package/dist/core/party/index.d.ts +3 -0
  130. package/dist/core/party/index.js +3 -0
  131. package/dist/core/party/schema.d.ts +137 -0
  132. package/dist/core/party/schema.js +80 -0
  133. package/dist/core/party/types.d.ts +40 -0
  134. package/dist/core/party/types.js +15 -0
  135. package/dist/core/sequence/define.d.ts +57 -0
  136. package/dist/core/sequence/define.js +10 -0
  137. package/dist/core/sequence/index.d.ts +63 -0
  138. package/dist/core/sequence/index.js +231 -0
  139. package/dist/core/slot/binding.d.ts +40 -0
  140. package/dist/core/slot/binding.js +2 -0
  141. package/dist/core/slot/company-metadata.d.ts +113 -0
  142. package/dist/core/slot/company-metadata.js +563 -0
  143. package/dist/core/slot/compile-schema.d.ts +19 -13
  144. package/dist/core/slot/compile-schema.js +51 -248
  145. package/dist/core/slot/contact-timezone.d.ts +110 -0
  146. package/dist/core/slot/contact-timezone.js +186 -0
  147. package/dist/core/slot/field.d.ts +2 -24
  148. package/dist/core/slot/field.js +0 -69
  149. package/dist/core/slot/id-ref.d.ts +17 -2
  150. package/dist/core/slot/id-ref.js +16 -8
  151. package/dist/core/slot/index.d.ts +12 -13
  152. package/dist/core/slot/index.js +11 -12
  153. package/dist/core/slot/naming.d.ts +15 -0
  154. package/dist/core/slot/naming.js +96 -0
  155. package/dist/core/slot/platform-fields.d.ts +119 -0
  156. package/dist/core/slot/platform-fields.js +121 -0
  157. package/dist/core/slot/ref.d.ts +16 -0
  158. package/dist/core/slot/ref.js +14 -0
  159. package/dist/core/slot/row.d.ts +2 -9
  160. package/dist/core/slot/row.js +13 -23
  161. package/dist/core/slot/schema-compat.d.ts +16 -0
  162. package/dist/core/slot/schema-compat.js +112 -0
  163. package/dist/core/slot/schema.d.ts +409 -76
  164. package/dist/core/slot/schema.js +178 -10
  165. package/dist/core/slot/types.d.ts +27 -92
  166. package/dist/core/slot/value.d.ts +26 -3
  167. package/dist/core/slot/value.js +89 -57
  168. package/dist/dev-overlay/protocol.d.ts +41 -8
  169. package/dist/fn-context/build-context.d.ts +3 -1
  170. package/dist/fn-context/build-context.js +20 -10
  171. package/dist/fn-context/fake/empty-api.js +9 -28
  172. package/dist/fn-context/fake/index.d.ts +11 -4
  173. package/dist/fn-context/fake/index.js +27 -2
  174. package/dist/fn-context/fn-params.d.ts +6 -0
  175. package/dist/fn-context/fn-params.js +13 -0
  176. package/dist/fn-context/index.d.ts +5 -5
  177. package/dist/fn-context/index.js +4 -4
  178. package/dist/fn-context/log.js +2 -2
  179. package/dist/fn-context/make-ctx.d.ts +11 -0
  180. package/dist/fn-context/make-ctx.js +18 -8
  181. package/dist/fn-context/rpc/case-orchestrator-tools.d.ts +24 -0
  182. package/dist/fn-context/rpc/case-orchestrator-tools.js +13 -0
  183. package/dist/fn-context/rpc/index.d.ts +3 -1
  184. package/dist/fn-context/rpc/index.js +3 -1
  185. package/dist/fn-context/rpc/integration/index.d.ts +4 -4
  186. package/dist/fn-context/rpc/integration/index.js +1 -1
  187. package/dist/fn-context/rpc/integration/list-surfaces.d.ts +21 -0
  188. package/dist/fn-context/rpc/integration/{list-bindings.js → list-surfaces.js} +4 -4
  189. package/dist/fn-context/rpc/platform.d.ts +2 -2
  190. package/dist/fn-context/rpc/platform.js +1 -1
  191. package/dist/fn-context/rpc/records.d.ts +78 -0
  192. package/dist/fn-context/rpc/records.js +26 -0
  193. package/dist/fn-context/rpc/trpc-client.d.ts +2 -2
  194. package/dist/fn-context/rpc/trpc-client.js +89 -5
  195. package/dist/fn-context/rpc/trpc-init.d.ts +2 -2
  196. package/dist/fn-context/rpc/trpc-router-factory.d.ts +49 -3
  197. package/dist/fn-context/rpc/trpc-router-factory.js +2 -0
  198. package/dist/fn-context/run-scope.d.ts +4 -0
  199. package/dist/fn-context/run-scope.js +9 -0
  200. package/dist/fn-context/types.d.ts +36 -3
  201. package/dist/index.d.ts +37 -46
  202. package/dist/index.js +33 -33
  203. package/dist/logger.d.ts +7 -0
  204. package/dist/logger.js +41 -0
  205. package/dist/platform.d.ts +76 -0
  206. package/dist/platform.js +56 -0
  207. package/dist/voice-service/actions.d.ts +71 -4
  208. package/dist/voice-service/types.d.ts +42 -2
  209. package/dist/worker.d.ts +10 -0
  210. package/dist/worker.js +10 -0
  211. package/package.json +38 -19
  212. package/dist/builder/compile/compile-agenda.d.ts +0 -15
  213. package/dist/builder/compile/compile-agenda.js +0 -59
  214. package/dist/builder/merge.d.ts +0 -4
  215. package/dist/builder/merge.js +0 -19
  216. package/dist/core/context/db.d.ts +0 -69
  217. package/dist/core/context/db.js +0 -44
  218. package/dist/core/context/docusign.d.ts +0 -134
  219. package/dist/core/context/docusign.js +0 -108
  220. package/dist/core/context/filevine.d.ts +0 -323
  221. package/dist/core/context/filevine.js +0 -254
  222. package/dist/core/context/http.d.ts +0 -9
  223. package/dist/core/context/http.js +0 -4
  224. package/dist/core/context/hubspot.d.ts +0 -250
  225. package/dist/core/context/hubspot.js +0 -191
  226. package/dist/core/context/twilio.d.ts +0 -50
  227. package/dist/core/context/twilio.js +0 -42
  228. package/dist/core/functions/define/case-context.d.ts +0 -14
  229. package/dist/core/functions/define/case-context.js +0 -15
  230. package/dist/core/functions/define/compute.d.ts +0 -7
  231. package/dist/core/functions/define/compute.js +0 -17
  232. package/dist/core/functions/define/custom.d.ts +0 -4
  233. package/dist/core/functions/define/custom.js +0 -8
  234. package/dist/core/functions/define/system.d.ts +0 -7
  235. package/dist/core/functions/define/system.js +0 -12
  236. package/dist/core/slot/deps.d.ts +0 -15
  237. package/dist/core/slot/deps.js +0 -88
  238. package/dist/core/slot/derived.d.ts +0 -32
  239. package/dist/core/slot/derived.js +0 -115
  240. package/dist/core/slot/platform-session-fields.d.ts +0 -38
  241. package/dist/core/slot/platform-session-fields.js +0 -48
  242. package/dist/core/slot/sf-schema.d.ts +0 -23
  243. package/dist/core/slot/sf-schema.js +0 -125
  244. package/dist/core/slot/sf-validate.d.ts +0 -14
  245. package/dist/core/slot/sf-validate.js +0 -132
  246. package/dist/core/slot/snapshot.d.ts +0 -18
  247. package/dist/core/slot/snapshot.js +0 -138
  248. package/dist/core/slot/write.d.ts +0 -41
  249. package/dist/core/slot/write.js +0 -319
  250. package/dist/core/stage/builders.d.ts +0 -36
  251. package/dist/core/stage/builders.js +0 -28
  252. package/dist/core/stage/condition.d.ts +0 -17
  253. package/dist/core/stage/condition.js +0 -198
  254. package/dist/core/stage/drive.d.ts +0 -43
  255. package/dist/core/stage/drive.js +0 -77
  256. package/dist/core/stage/finish-when.d.ts +0 -20
  257. package/dist/core/stage/finish-when.js +0 -82
  258. package/dist/core/stage/flatten.d.ts +0 -27
  259. package/dist/core/stage/flatten.js +0 -464
  260. package/dist/core/stage/index.d.ts +0 -11
  261. package/dist/core/stage/index.js +0 -10
  262. package/dist/core/stage/simulate.d.ts +0 -24
  263. package/dist/core/stage/simulate.js +0 -33
  264. package/dist/core/stage/transfer-fields.d.ts +0 -14
  265. package/dist/core/stage/transfer-fields.js +0 -88
  266. package/dist/core/stage/types.d.ts +0 -177
  267. package/dist/core/stage/types.js +0 -2
  268. package/dist/core/stage/validate.d.ts +0 -11
  269. package/dist/core/stage/validate.js +0 -226
  270. package/dist/core/stage/walk.d.ts +0 -34
  271. package/dist/core/stage/walk.js +0 -96
  272. package/dist/fn-context/rpc/integration/list-bindings.d.ts +0 -21
  273. package/dist/fn-context/system-args.d.ts +0 -6
  274. package/dist/fn-context/system-args.js +0 -14
@@ -2,11 +2,23 @@ import { emptyFieldValue } from './field.js';
2
2
  import { ROW_ID_FIELD } from './schema.js';
3
3
  /** Reserved snapshot key; cannot be a company / sequence table name. */
4
4
  export const SNAPSHOT_CURRENT_KEY = 'current';
5
+ /**
6
+ * `derivedOrder` / `reverseDeps`: keys a compiled schema carried before derived fields were removed
7
+ * (13-data-model-v1 §21); older builds still have them, so they stay reserved and are skipped.
8
+ */
5
9
  const RESERVED_TABLE_NAMES = new Set([SNAPSHOT_CURRENT_KEY, 'derivedOrder', 'reverseDeps']);
6
10
  export function isReservedTableName(tableName) {
7
11
  return RESERVED_TABLE_NAMES.has(tableName);
8
12
  }
9
- /** App-minted row id for jsonb-hosted tables. */
13
+ /**
14
+ * Multi-row tables with a bound row (the conversation's contact): a write without `rowId`
15
+ * goes to it. Contacts are created through `ctx.api.contact`, never inserted by a write.
16
+ */
17
+ const BOUND_ROW_TABLES = new Set(['contact']);
18
+ export function hasBoundRow(tableName) {
19
+ return BOUND_ROW_TABLES.has(tableName);
20
+ }
21
+ /** App-minted row id for multi-row tables (the Record's id). */
10
22
  export function mintRowId() {
11
23
  return crypto.randomUUID();
12
24
  }
@@ -16,12 +28,6 @@ export function isRowIdField(name) {
16
28
  export function isFieldValue(value) {
17
29
  return typeof value === 'object' && value !== null && 'state' in value && 'value' in value;
18
30
  }
19
- export function getRowField(row, fieldName) {
20
- if (isRowIdField(fieldName))
21
- return undefined;
22
- const value = row[fieldName];
23
- return isFieldValue(value) ? value : undefined;
24
- }
25
31
  /** Schema fields that store envelopes — excludes row `id`. */
26
32
  export function slotFieldEntries(fields) {
27
33
  return Object.entries(fields).filter(([name]) => !isRowIdField(name));
@@ -29,22 +35,6 @@ export function slotFieldEntries(fields) {
29
35
  export function slotFieldNames(fields) {
30
36
  return slotFieldEntries(fields).map(([name]) => name);
31
37
  }
32
- /** Envelope cells on a runtime row — excludes `id`. */
33
- export function rowValueEntries(row) {
34
- const out = [];
35
- for (const [name, value] of Object.entries(row)) {
36
- if (isRowIdField(name) || !isFieldValue(value))
37
- continue;
38
- out.push([name, value]);
39
- }
40
- return out;
41
- }
42
- export function emptySlotRow(fields, options = {}) {
43
- return fillRowFields({ id: options.id ?? '' }, fields, options.now ?? 0);
44
- }
45
- export function emptyMultiRow(fields, id, now = 0) {
46
- return fillRowFields({ id }, fields, now);
47
- }
48
38
  function fillRowFields(row, fields, now) {
49
39
  for (const name of slotFieldNames(fields)) {
50
40
  row[name] = emptyFieldValue(now);
@@ -0,0 +1,16 @@
1
+ import type { CompiledCompanyMetadata } from './schema.js';
2
+ /**
3
+ * Why `after`'s company schema cannot replace `before`'s without breaking slot data stored under
4
+ * it; empty for an additive (01-slot-db §2.3) evolution. One pass covers the whole repo: sequence
5
+ * overlays only change usage. The session fields (`schema/session.ts`) follow the same rules, since
6
+ * `Session.data` keeps their values (11-remove-sequence-schema §3.1).
7
+ *
8
+ * Compatible: new tables (with their parent), fields (lookups included), more options, a widened
9
+ * type (`string` → `text`, `select` / `time` → `string`), and presentation changes (label,
10
+ * description, extraction, deprecated); a new field may be `unique`. Incompatible: removing a table or
11
+ * field (mark it `deprecated` instead); any other change of a field's dataType, `unique` added to or
12
+ * dropped from a field (18-record-search-index §4.5), any ref change (added, removed, retargeted, parent ↔ lookup), a parent added to a
13
+ * table `before` has (its stored rows have no parent edge, 13-data-model-v1 §22.5), a removed option.
14
+ */
15
+ export declare function companyMetadataCompatibilityIssues(before: CompiledCompanyMetadata, after: CompiledCompanyMetadata): string[];
16
+ //# sourceMappingURL=schema-compat.d.ts.map
@@ -0,0 +1,112 @@
1
+ function formatValues(values) {
2
+ return values.join(', ');
3
+ }
4
+ /**
5
+ * Type changes that only widen: every stored value of `before` is a valid value of `after`
6
+ * (18-record-search-index §5, 27 §2.3): a short value as a long one; an option or a time of day as
7
+ * a short value.
8
+ */
9
+ const WIDENINGS = new Set(['string>text', 'select>string', 'select>text', 'time>string', 'time>text']);
10
+ function normalFieldIssues(path, before, after) {
11
+ const issues = [];
12
+ if (before.dataType !== after.dataType && !WIDENINGS.has(`${before.dataType}>${after.dataType}`)) {
13
+ issues.push(`field '${path}' dataType: ${before.dataType} → ${after.dataType}`);
14
+ }
15
+ // More options only widen; a dropped one may be stored.
16
+ if (before.dataType === after.dataType && before.options && after.options) {
17
+ const kept = new Set(after.options);
18
+ const removed = before.options.filter((value) => !kept.has(value));
19
+ if (removed.length > 0)
20
+ issues.push(`field '${path}' removed options: ${formatValues(removed)}`);
21
+ }
22
+ issues.push(...refIssues(path, before, after));
23
+ // `unique` is the field's from its first release (18-record-search-index §4.5): adding it would need
24
+ // stored values checked and the index marked, dropping it the marks cleared, both racing writes.
25
+ if (Boolean(before.unique) !== Boolean(after.unique)) {
26
+ issues.push(`field '${path}' unique: ${before.unique ? 'yes' : 'no'} → ${after.unique ? 'yes' : 'no'} (unique is set when a field is added; add a new field instead)`);
27
+ }
28
+ return issues;
29
+ }
30
+ /**
31
+ * What to do instead of changing a parent (13-data-model-v1 §22.5): which row a row belongs to is
32
+ * data, set once when the row is created, so no schema change can move or add it for stored rows.
33
+ */
34
+ const PARENT_FIXED = 'a parent is fixed once released: create a new table and move the data instead';
35
+ /**
36
+ * A ref only ever stays as it is (13-data-model-v1 §11.9). Adding or retargeting one invalidates
37
+ * stored ids. Dropping one leaves its `RecordRef` projections behind (nothing deletes them once the
38
+ * field is no longer a ref), blocking the target's delete. A parent and a lookup are stored apart
39
+ * (a lookup in the row's data, a parent only in `RecordRef`). To change a lookup, mark the field
40
+ * deprecated and add a new one; a parent cannot change at all (§22.5).
41
+ */
42
+ function refIssues(path, before, after) {
43
+ if (!before.ref && !after.ref)
44
+ return [];
45
+ const parentInvolved = before.ref?.kind === 'parent' || after.ref?.kind === 'parent';
46
+ const instead = parentInvolved ? PARENT_FIXED : 'mark it deprecated instead';
47
+ if (!after.ref)
48
+ return [`field '${path}' ref to ${before.ref.table} was removed (${instead})`];
49
+ if (after.ref.table !== before.ref?.table) {
50
+ return [`field '${path}' ref: ${before.ref?.table ?? 'none'} → ${after.ref.table}${parentInvolved ? ` (${PARENT_FIXED})` : ''}`];
51
+ }
52
+ if (after.ref.kind !== before.ref.kind) {
53
+ return [`field '${path}' ref kind: ${before.ref.kind} → ${after.ref.kind}${parentInvolved ? ` (${PARENT_FIXED})` : ''}`];
54
+ }
55
+ return [];
56
+ }
57
+ function fieldIssues(path, before, after) {
58
+ return normalFieldIssues(path, before, after);
59
+ }
60
+ /** A session field has no ref: the rest of a company field's rules. */
61
+ function sessionFieldIssues(path, before, after) {
62
+ return normalFieldIssues(path, before, after);
63
+ }
64
+ /**
65
+ * Why `after`'s company schema cannot replace `before`'s without breaking slot data stored under
66
+ * it; empty for an additive (01-slot-db §2.3) evolution. One pass covers the whole repo: sequence
67
+ * overlays only change usage. The session fields (`schema/session.ts`) follow the same rules, since
68
+ * `Session.data` keeps their values (11-remove-sequence-schema §3.1).
69
+ *
70
+ * Compatible: new tables (with their parent), fields (lookups included), more options, a widened
71
+ * type (`string` → `text`, `select` / `time` → `string`), and presentation changes (label,
72
+ * description, extraction, deprecated); a new field may be `unique`. Incompatible: removing a table or
73
+ * field (mark it `deprecated` instead); any other change of a field's dataType, `unique` added to or
74
+ * dropped from a field (18-record-search-index §4.5), any ref change (added, removed, retargeted, parent ↔ lookup), a parent added to a
75
+ * table `before` has (its stored rows have no parent edge, 13-data-model-v1 §22.5), a removed option.
76
+ */
77
+ export function companyMetadataCompatibilityIssues(before, after) {
78
+ const issues = [];
79
+ for (const [tableName, beforeTable] of Object.entries(before.tables)) {
80
+ const afterTable = after.tables[tableName];
81
+ if (!afterTable) {
82
+ issues.push(`table '${tableName}' was removed`);
83
+ continue;
84
+ }
85
+ for (const [fieldName, beforeField] of Object.entries(beforeTable.fields)) {
86
+ const path = `${tableName}.${fieldName}`;
87
+ const afterField = afterTable.fields[fieldName];
88
+ if (!afterField) {
89
+ const instead = beforeField.ref?.kind === 'parent' ? PARENT_FIXED : 'mark it deprecated instead';
90
+ issues.push(`field '${path}' was removed (${instead})`);
91
+ continue;
92
+ }
93
+ issues.push(...fieldIssues(path, beforeField, afterField));
94
+ }
95
+ for (const [fieldName, afterField] of Object.entries(afterTable.fields)) {
96
+ if (fieldName in beforeTable.fields || afterField.ref?.kind !== 'parent')
97
+ continue;
98
+ issues.push(`table '${tableName}' gained a parent '${fieldName}': its stored rows have none (${PARENT_FIXED})`);
99
+ }
100
+ }
101
+ for (const [fieldName, beforeField] of Object.entries(before.session.fields)) {
102
+ const path = `session.${fieldName}`;
103
+ const afterField = after.session.fields[fieldName];
104
+ if (!afterField) {
105
+ issues.push(`field '${path}' was removed (mark it deprecated instead)`);
106
+ continue;
107
+ }
108
+ issues.push(...sessionFieldIssues(path, beforeField, afterField));
109
+ }
110
+ return issues;
111
+ }
112
+ //# sourceMappingURL=schema-compat.js.map