@superpanel-sdk/runtime 0.2.3 → 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 (282) 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 +365 -116
  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 -4
  54. package/dist/compute-host/index.js +1 -2
  55. package/dist/compute-host/source-compute-host.d.ts +11 -9
  56. package/dist/compute-host/source-compute-host.js +46 -32
  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 -48
  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 -94
  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 +88 -7
  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 -5
  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 -64
  214. package/dist/builder/merge.d.ts +0 -4
  215. package/dist/builder/merge.js +0 -19
  216. package/dist/compute-host/read-only-cache.d.ts +0 -20
  217. package/dist/compute-host/read-only-cache.js +0 -61
  218. package/dist/core/context/db.d.ts +0 -69
  219. package/dist/core/context/db.js +0 -44
  220. package/dist/core/context/docusign.d.ts +0 -134
  221. package/dist/core/context/docusign.js +0 -108
  222. package/dist/core/context/filevine.d.ts +0 -323
  223. package/dist/core/context/filevine.js +0 -254
  224. package/dist/core/context/http.d.ts +0 -9
  225. package/dist/core/context/http.js +0 -4
  226. package/dist/core/context/hubspot.d.ts +0 -250
  227. package/dist/core/context/hubspot.js +0 -191
  228. package/dist/core/context/twilio.d.ts +0 -50
  229. package/dist/core/context/twilio.js +0 -42
  230. package/dist/core/functions/define/case-context.d.ts +0 -14
  231. package/dist/core/functions/define/case-context.js +0 -15
  232. package/dist/core/functions/define/compute.d.ts +0 -7
  233. package/dist/core/functions/define/compute.js +0 -17
  234. package/dist/core/functions/define/custom.d.ts +0 -4
  235. package/dist/core/functions/define/custom.js +0 -8
  236. package/dist/core/functions/define/system.d.ts +0 -7
  237. package/dist/core/functions/define/system.js +0 -12
  238. package/dist/core/slot/deps.d.ts +0 -15
  239. package/dist/core/slot/deps.js +0 -88
  240. package/dist/core/slot/derived.d.ts +0 -32
  241. package/dist/core/slot/derived.js +0 -115
  242. package/dist/core/slot/platform-session-fields.d.ts +0 -38
  243. package/dist/core/slot/platform-session-fields.js +0 -48
  244. package/dist/core/slot/sf-schema.d.ts +0 -23
  245. package/dist/core/slot/sf-schema.js +0 -125
  246. package/dist/core/slot/sf-validate.d.ts +0 -14
  247. package/dist/core/slot/sf-validate.js +0 -132
  248. package/dist/core/slot/snapshot.d.ts +0 -18
  249. package/dist/core/slot/snapshot.js +0 -138
  250. package/dist/core/slot/write.d.ts +0 -48
  251. package/dist/core/slot/write.js +0 -426
  252. package/dist/core/stage/builders.d.ts +0 -54
  253. package/dist/core/stage/builders.js +0 -31
  254. package/dist/core/stage/condition.d.ts +0 -17
  255. package/dist/core/stage/condition.js +0 -198
  256. package/dist/core/stage/drive.d.ts +0 -43
  257. package/dist/core/stage/drive.js +0 -78
  258. package/dist/core/stage/finish-when.d.ts +0 -20
  259. package/dist/core/stage/finish-when.js +0 -82
  260. package/dist/core/stage/flatten.d.ts +0 -27
  261. package/dist/core/stage/flatten.js +0 -466
  262. package/dist/core/stage/index.d.ts +0 -15
  263. package/dist/core/stage/index.js +0 -13
  264. package/dist/core/stage/interrupts.d.ts +0 -28
  265. package/dist/core/stage/interrupts.js +0 -120
  266. package/dist/core/stage/ivr-fields.d.ts +0 -9
  267. package/dist/core/stage/ivr-fields.js +0 -75
  268. package/dist/core/stage/simulate.d.ts +0 -24
  269. package/dist/core/stage/simulate.js +0 -33
  270. package/dist/core/stage/transfer-fields.d.ts +0 -19
  271. package/dist/core/stage/transfer-fields.js +0 -129
  272. package/dist/core/stage/transfer-spec.d.ts +0 -48
  273. package/dist/core/stage/transfer-spec.js +0 -113
  274. package/dist/core/stage/types.d.ts +0 -208
  275. package/dist/core/stage/types.js +0 -2
  276. package/dist/core/stage/validate.d.ts +0 -11
  277. package/dist/core/stage/validate.js +0 -330
  278. package/dist/core/stage/walk.d.ts +0 -39
  279. package/dist/core/stage/walk.js +0 -119
  280. package/dist/fn-context/rpc/integration/list-bindings.d.ts +0 -21
  281. package/dist/fn-context/system-args.d.ts +0 -6
  282. 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