@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
@@ -1,138 +0,0 @@
1
- import { compiledTableEntries, getCompiledTable, isSnapshotSingleRow } from './compile-schema.js';
2
- import { emptyFieldValue, makeFieldValue } from './field.js';
3
- import { parseFieldPath } from './path.js';
4
- import { emptySlotRow, getRowField, isReservedTableName, isRowIdField, slotFieldNames } from './row.js';
5
- import { validateBareValue } from './value.js';
6
- function seedToFieldValue(seed, now) {
7
- if (seed && typeof seed === 'object' && !Array.isArray(seed) && 'state' in seed) {
8
- const s = seed;
9
- return makeFieldValue({
10
- value: (s.value ?? null),
11
- state: s.state,
12
- reason: s.reason ?? null,
13
- updatedBy: s.updatedBy ?? 'import',
14
- updatedAt: s.updatedAt ?? now,
15
- history: s.history ?? [],
16
- });
17
- }
18
- if (seed === undefined) {
19
- return emptyFieldValue(now);
20
- }
21
- return makeFieldValue({
22
- value: seed,
23
- state: 'filled',
24
- reason: null,
25
- updatedBy: 'import',
26
- updatedAt: now,
27
- });
28
- }
29
- /**
30
- * Build a runtime snapshot for local tests.
31
- *
32
- * - `table.field` keys seed single-row (or current-party) fields
33
- * - bare multi-table name keys seed row arrays:
34
- * `children: [{ id?: string, name: 'Lily', age: 8 }]`
35
- */
36
- export function snapshotFrom(schema, seed = {}, options = {}) {
37
- const now = options.now ?? 0;
38
- const snapshot = {};
39
- for (const [tableName, table] of compiledTableEntries(schema)) {
40
- if (isSnapshotSingleRow(table)) {
41
- snapshot[tableName] = emptySlotRow(table.fields, { now });
42
- }
43
- else {
44
- snapshot[tableName] = [];
45
- }
46
- }
47
- for (const [key, value] of Object.entries(seed)) {
48
- const parsed = parseFieldPath(key);
49
- if (parsed) {
50
- const table = getCompiledTable(schema, parsed.table);
51
- if (!table) {
52
- throw new Error(`Unknown table in seed: ${parsed.table}`);
53
- }
54
- if (!isSnapshotSingleRow(table)) {
55
- throw new Error(`Field path seed ${key} is only for single-row tables; seed multi rows by table name`);
56
- }
57
- if (isRowIdField(parsed.field)) {
58
- snapshot[parsed.table].id = value == null ? '' : String(value);
59
- continue;
60
- }
61
- const field = table.fields[parsed.field];
62
- if (!field) {
63
- throw new Error(`Unknown field in seed: ${key}`);
64
- }
65
- const fv = seedToFieldValue(value, now);
66
- if (fv.state === 'filled' || fv.state === 'asked_unknown') {
67
- const issues = validateBareValue(field, fv.value, key, {
68
- allowNull: field.derived || (field.derived === false && field.nullable),
69
- });
70
- if (issues.length > 0) {
71
- throw new Error(issues.map((i) => i.message).join('; '));
72
- }
73
- }
74
- snapshot[parsed.table][parsed.field] = fv;
75
- continue;
76
- }
77
- const table = getCompiledTable(schema, key);
78
- if (!table) {
79
- throw new Error(`Unknown seed key: ${key}`);
80
- }
81
- if (isSnapshotSingleRow(table)) {
82
- throw new Error(`Seed key ${key} is not a multi-row table`);
83
- }
84
- if (!Array.isArray(value)) {
85
- throw new Error(`Multi-row seed ${key} must be an array`);
86
- }
87
- const rows = [];
88
- let i = 0;
89
- for (const rowSeed of value) {
90
- if (!rowSeed || typeof rowSeed !== 'object') {
91
- throw new Error(`Invalid row seed in ${key}`);
92
- }
93
- const rowObj = rowSeed;
94
- const seededId = rowObj.id ?? rowObj.rowId;
95
- const id = typeof seededId === 'string' && seededId.length > 0 ? seededId : `r${++i}`;
96
- const row = { id };
97
- for (const fieldName of slotFieldNames(table.fields)) {
98
- if (fieldName in rowObj) {
99
- row[fieldName] = seedToFieldValue(rowObj[fieldName], now);
100
- }
101
- else {
102
- row[fieldName] = emptyFieldValue(now);
103
- }
104
- }
105
- rows.push(row);
106
- }
107
- snapshot[key] = rows;
108
- }
109
- return snapshot;
110
- }
111
- /** Deep-clone a snapshot (structuredClone when available). */
112
- export function cloneSnapshot(snapshot) {
113
- return typeof structuredClone === 'function'
114
- ? structuredClone(snapshot)
115
- : JSON.parse(JSON.stringify(snapshot));
116
- }
117
- export function getSnapshotTable(snapshot, tableName) {
118
- if (isReservedTableName(tableName))
119
- return undefined;
120
- const value = snapshot[tableName];
121
- if (value == null)
122
- return undefined;
123
- if (Array.isArray(value))
124
- return value;
125
- if (typeof value === 'object' && 'id' in value)
126
- return value;
127
- return undefined;
128
- }
129
- export function getSingleField(snapshot, path) {
130
- const parsed = parseFieldPath(path);
131
- if (!parsed)
132
- return undefined;
133
- const table = getSnapshotTable(snapshot, parsed.table);
134
- if (!table || Array.isArray(table))
135
- return undefined;
136
- return getRowField(table, parsed.field);
137
- }
138
- //# sourceMappingURL=snapshot.js.map
@@ -1,48 +0,0 @@
1
- import type { FieldState, FieldWrites, RowWrite, StructuredWrites, Writes } from '../context/types.js';
2
- import type { FieldPath } from './path.js';
3
- import type { ApplyWritesOptions, ApplyWritesResult, CompiledSlotSchema, RuntimeSlotsSnapshot, SlotFillingOutput, UpdatedBy } from './types.js';
4
- export declare function isRowWrite(value: unknown): value is RowWrite;
5
- export declare function isStructuredWrites(value: unknown): value is StructuredWrites;
6
- export declare function normalizeWrites(writes: Writes | null | undefined): {
7
- fields: FieldWrites;
8
- rows: RowWrite[];
9
- } | null;
10
- /**
11
- * Apply bare Writes (function / human / import / platform) onto a snapshot.
12
- * Validates type/enum and write permissions. Detects C5 changes and appends history.
13
- * Multi-row tables: pass `{ table, rowId, values }` (or `rows` on StructuredWrites).
14
- */
15
- export declare function applyWrites(schema: CompiledSlotSchema, snapshot: RuntimeSlotsSnapshot, writes: Writes | null | undefined, options: ApplyWritesOptions): ApplyWritesResult;
16
- export type FieldPatchInput = {
17
- path: FieldPath;
18
- rowId?: string;
19
- value: string | number | boolean | null;
20
- state: FieldState;
21
- reason?: string | null;
22
- };
23
- /**
24
- * Apply one human/admin field edit, including explicit slot state.
25
- * Unlike bare writes, this supports a selected row in a multi-row entity table.
26
- */
27
- export declare function applyFieldPatch(schema: CompiledSlotSchema, snapshot: RuntimeSlotsSnapshot, patch: FieldPatchInput, options: {
28
- source: UpdatedBy;
29
- now?: number;
30
- }): ApplyWritesResult;
31
- export type ApplySlotFillingOptions = {
32
- now?: number;
33
- /** Map SF placeholder row keys (`new-1`) → allocated row ids (mutated in place). */
34
- rowKeyMap?: Map<string, string>;
35
- };
36
- /**
37
- * C4: apply accepted Slot Filling projection (full replace for present fields/rows).
38
- * Multi-row: projection is the full set of rows; omitted existing rows are deleted.
39
- */
40
- export declare function applySlotFilling(schema: CompiledSlotSchema, snapshot: RuntimeSlotsSnapshot, output: SlotFillingOutput, options?: ApplySlotFillingOptions): ApplyWritesResult;
41
- /**
42
- * Mark remaining conversation fields as asked_unknown (Topic move-on).
43
- */
44
- export declare function markAskedUnknown(schema: CompiledSlotSchema, snapshot: RuntimeSlotsSnapshot, fields: Iterable<FieldPath>, options?: {
45
- now?: number;
46
- reason?: string;
47
- }): ApplyWritesResult;
48
- //# sourceMappingURL=write.d.ts.map
@@ -1,426 +0,0 @@
1
- import { getCompiledTable, isSnapshotSingleRow } from './compile-schema.js';
2
- import { commitFieldWrite, makeFieldValue } from './field.js';
3
- import { formatFieldPath, parseFieldPath, requireFieldPath } from './path.js';
4
- import { getRowField, isReservedTableName, isRowIdField, mintRowId, slotFieldNames } from './row.js';
5
- import { cloneSnapshot, getSnapshotTable } from './snapshot.js';
6
- import { validateBareValue, validateExtractedField } from './value.js';
7
- export function isRowWrite(value) {
8
- if (!value || typeof value !== 'object' || Array.isArray(value))
9
- return false;
10
- const o = value;
11
- return (typeof o.table === 'string' &&
12
- typeof o.rowId === 'string' &&
13
- o.values !== null &&
14
- typeof o.values === 'object' &&
15
- !Array.isArray(o.values));
16
- }
17
- export function isStructuredWrites(value) {
18
- if (!value || typeof value !== 'object' || Array.isArray(value) || isRowWrite(value))
19
- return false;
20
- const keys = Object.keys(value);
21
- return keys.length > 0 && keys.every((key) => key === 'fields' || key === 'rows');
22
- }
23
- export function normalizeWrites(writes) {
24
- if (writes == null)
25
- return null;
26
- if (isRowWrite(writes)) {
27
- return { fields: {}, rows: [writes] };
28
- }
29
- if (isStructuredWrites(writes)) {
30
- const fields = writes.fields && typeof writes.fields === 'object' && !Array.isArray(writes.fields) ? writes.fields : {};
31
- const rows = Array.isArray(writes.rows) ? writes.rows.filter(isRowWrite) : [];
32
- if (Object.keys(fields).length === 0 && rows.length === 0)
33
- return null;
34
- return { fields, rows };
35
- }
36
- if (Object.keys(writes).length === 0)
37
- return null;
38
- return { fields: writes, rows: [] };
39
- }
40
- function boundRowId(tableName, current) {
41
- if (!current)
42
- return undefined;
43
- if (tableName === 'contact')
44
- return current.contactId;
45
- if (tableName === 'case_contact')
46
- return current.caseContactId;
47
- if (tableName === 'case_file')
48
- return current.caseFileId;
49
- return undefined;
50
- }
51
- function writeTargetRow(schema, snapshot, tableName, rowId) {
52
- const table = getCompiledTable(schema, tableName);
53
- if (!table)
54
- return null;
55
- const data = getSnapshotTable(snapshot, tableName);
56
- if (!data)
57
- return null;
58
- if (isSnapshotSingleRow(table) && !Array.isArray(data)) {
59
- if (rowId && data.id && data.id !== rowId)
60
- return null;
61
- return data;
62
- }
63
- if (Array.isArray(data)) {
64
- const id = rowId ?? boundRowId(tableName, snapshot.current);
65
- if (!id)
66
- return null;
67
- return data.find((row) => row.id === id) ?? null;
68
- }
69
- return null;
70
- }
71
- function extractedToFieldValue(extracted, updatedBy, now) {
72
- return makeFieldValue({
73
- reason: extracted.reason,
74
- value: extracted.value,
75
- state: extracted.state,
76
- updatedBy,
77
- updatedAt: now,
78
- });
79
- }
80
- function assertWritableNormal(schema, snapshot, path, options, rowId) {
81
- const { table, field: fieldName } = requireFieldPath(path);
82
- const tableDef = getCompiledTable(schema, table);
83
- const field = tableDef?.fields[fieldName];
84
- if (!tableDef || !field) {
85
- return [{ code: 'unknown-field', message: `Unknown field: ${path}`, path }];
86
- }
87
- if (isRowIdField(fieldName)) {
88
- return [
89
- {
90
- code: 'id-readonly',
91
- message: `Cannot write row id: ${path}`,
92
- path,
93
- },
94
- ];
95
- }
96
- if (field.derived) {
97
- return [
98
- {
99
- code: 'derived-readonly',
100
- message: `Cannot write derived field: ${path}`,
101
- path,
102
- },
103
- ];
104
- }
105
- const systemOnly = options.systemOnly ??
106
- (options.source === 'function' || options.source === 'platform' || options.source === 'import');
107
- if (systemOnly && field.source !== 'system') {
108
- return [
109
- {
110
- code: 'write-forbidden',
111
- message: `Source ${options.source} cannot write conversation field ${path}`,
112
- path,
113
- },
114
- ];
115
- }
116
- if (!isSnapshotSingleRow(tableDef) && !writeTargetRow(schema, snapshot, table, rowId)) {
117
- return [
118
- {
119
- code: rowId ? 'row-not-found' : 'multi-path-write',
120
- message: rowId
121
- ? `Row ${rowId} not found in ${table}`
122
- : `Use Slot Filling or { table, rowId, values } to write multi-row field ${path}`,
123
- path,
124
- },
125
- ];
126
- }
127
- return [];
128
- }
129
- function applyBareFieldWrite(schema, original, next, path, value, rowId, options, now, errors, changed, history) {
130
- const writeIssues = assertWritableNormal(schema, original, path, options, rowId);
131
- if (writeIssues.length > 0) {
132
- errors.push(...writeIssues);
133
- return;
134
- }
135
- const parsed = parseFieldPath(path);
136
- if (!parsed) {
137
- errors.push({ code: 'unknown-field', message: `Invalid field path: ${path}`, path });
138
- return;
139
- }
140
- const field = getCompiledTable(schema, parsed.table)?.fields[parsed.field];
141
- if (!field) {
142
- errors.push({ code: 'unknown-field', message: `Unknown field: ${path}`, path });
143
- return;
144
- }
145
- const valueIssues = validateBareValue(field, value, path, {
146
- allowNull: !field.derived && field.nullable,
147
- });
148
- if (valueIssues.length > 0) {
149
- errors.push(...valueIssues);
150
- return;
151
- }
152
- const tableData = writeTargetRow(schema, next, parsed.table, rowId);
153
- if (!tableData)
154
- return;
155
- const prev = getRowField(tableData, parsed.field);
156
- if (!prev)
157
- return;
158
- const committed = commitFieldWrite(prev, makeFieldValue({
159
- value: (value ?? null),
160
- state: 'filled',
161
- reason: null,
162
- updatedBy: options.source,
163
- updatedAt: now,
164
- }));
165
- tableData[parsed.field] = committed.field;
166
- if (committed.changed) {
167
- changed.push(parsed.path);
168
- if (committed.historyEntry) {
169
- history.push({
170
- path: parsed.path,
171
- entry: committed.historyEntry,
172
- rowId: typeof tableData.id === 'string' && tableData.id ? tableData.id : undefined,
173
- });
174
- }
175
- }
176
- }
177
- /**
178
- * Apply bare Writes (function / human / import / platform) onto a snapshot.
179
- * Validates type/enum and write permissions. Detects C5 changes and appends history.
180
- * Multi-row tables: pass `{ table, rowId, values }` (or `rows` on StructuredWrites).
181
- */
182
- export function applyWrites(schema, snapshot, writes, options) {
183
- const normalized = normalizeWrites(writes);
184
- if (!normalized) {
185
- return { snapshot, changed: [], history: [] };
186
- }
187
- const now = options.now ?? Date.now();
188
- const next = cloneSnapshot(snapshot);
189
- const changed = [];
190
- const history = [];
191
- const errors = [];
192
- for (const [path, value] of Object.entries(normalized.fields)) {
193
- applyBareFieldWrite(schema, snapshot, next, path, value, undefined, options, now, errors, changed, history);
194
- }
195
- for (const row of normalized.rows) {
196
- if (!row.table || !row.rowId) {
197
- errors.push({
198
- code: 'row-not-found',
199
- message: 'Row write requires table and rowId',
200
- path: row.table || undefined,
201
- });
202
- continue;
203
- }
204
- for (const [fieldName, value] of Object.entries(row.values)) {
205
- const path = formatFieldPath(row.table, fieldName);
206
- applyBareFieldWrite(schema, snapshot, next, path, value, row.rowId, options, now, errors, changed, history);
207
- }
208
- }
209
- if (errors.length > 0) {
210
- throw new Error(`applyWrites failed:\n${errors.map((e) => `- ${e.path ?? ''}: ${e.message}`).join('\n')}`);
211
- }
212
- return { snapshot: next, changed, history };
213
- }
214
- /**
215
- * Apply one human/admin field edit, including explicit slot state.
216
- * Unlike bare writes, this supports a selected row in a multi-row entity table.
217
- */
218
- export function applyFieldPatch(schema, snapshot, patch, options) {
219
- const parsed = requireFieldPath(patch.path);
220
- const table = getCompiledTable(schema, parsed.table);
221
- const field = table?.fields[parsed.field];
222
- if (!table || !field)
223
- throw new Error(`Unknown field: ${patch.path}`);
224
- if (isRowIdField(parsed.field))
225
- throw new Error(`Cannot write row id: ${patch.path}`);
226
- if (field.derived)
227
- throw new Error(`Cannot write derived field: ${patch.path}`);
228
- const value = patch.state === 'filled' ? patch.value : null;
229
- if (patch.state !== 'empty') {
230
- const issues = validateExtractedField(field, {
231
- value,
232
- state: patch.state,
233
- reason: patch.reason ?? 'Human edit',
234
- }, patch.path);
235
- if (issues.length > 0) {
236
- throw new Error(`applyFieldPatch failed:\n${issues.map((issue) => `- ${issue.path ?? ''}: ${issue.message}`).join('\n')}`);
237
- }
238
- }
239
- const now = options.now ?? Date.now();
240
- const next = cloneSnapshot(snapshot);
241
- const data = getSnapshotTable(next, parsed.table);
242
- const row = isSnapshotSingleRow(table)
243
- ? data
244
- : data?.find((candidate) => candidate.id === patch.rowId);
245
- if (!row)
246
- throw new Error(`Slot row not found: ${parsed.table}:${patch.rowId ?? 'single'}`);
247
- const previous = getRowField(row, parsed.field);
248
- if (!previous)
249
- throw new Error(`Slot field not initialized: ${patch.path}`);
250
- const committed = commitFieldWrite(previous, makeFieldValue({
251
- value,
252
- state: patch.state,
253
- reason: patch.reason ?? 'Human edit',
254
- updatedBy: options.source,
255
- updatedAt: now,
256
- }));
257
- row[parsed.field] = committed.field;
258
- if (!committed.changed)
259
- return { snapshot: next, changed: [], history: [] };
260
- return {
261
- snapshot: next,
262
- changed: [parsed.path],
263
- history: committed.historyEntry ? [{ path: parsed.path, entry: committed.historyEntry }] : [],
264
- };
265
- }
266
- /**
267
- * C4: apply accepted Slot Filling projection (full replace for present fields/rows).
268
- * Multi-row: projection is the full set of rows; omitted existing rows are deleted.
269
- */
270
- export function applySlotFilling(schema, snapshot, output, options = {}) {
271
- const now = options.now ?? Date.now();
272
- const next = cloneSnapshot(snapshot);
273
- const changed = new Set();
274
- const history = [];
275
- const rowKeyMap = options.rowKeyMap ?? new Map();
276
- for (const [tableName, projection] of Object.entries(output)) {
277
- if (isReservedTableName(tableName))
278
- continue;
279
- const table = getCompiledTable(schema, tableName);
280
- if (!table)
281
- continue;
282
- if (isSnapshotSingleRow(table)) {
283
- const tableData = getSnapshotTable(next, tableName);
284
- for (const [fieldName, extracted] of Object.entries(projection)) {
285
- const field = table.fields[fieldName];
286
- if (!field || field.derived || field.source !== 'conversation')
287
- continue;
288
- const path = formatFieldPath(tableName, fieldName);
289
- const issues = validateExtractedField(field, extracted, path);
290
- if (issues.length > 0) {
291
- throw new Error(issues.map((i) => i.message).join('; '));
292
- }
293
- if (isRowIdField(fieldName))
294
- continue;
295
- const prev = getRowField(tableData, fieldName);
296
- if (!prev)
297
- continue;
298
- const committed = commitFieldWrite(prev, extractedToFieldValue(extracted, 'slot-filling', now));
299
- tableData[fieldName] = committed.field;
300
- if (committed.changed) {
301
- changed.add(path);
302
- if (committed.historyEntry) {
303
- history.push({
304
- path,
305
- entry: committed.historyEntry,
306
- rowId: typeof tableData.id === 'string' && tableData.id ? tableData.id : undefined,
307
- });
308
- }
309
- }
310
- }
311
- }
312
- else {
313
- const prevRows = getSnapshotTable(snapshot, tableName) ?? [];
314
- const prevById = new Map(prevRows.map((r) => [r.id, r]));
315
- const projectionRows = projection;
316
- const nextRows = [];
317
- let structuralChange = false;
318
- for (const row of projectionRows) {
319
- let id = row.rowKey;
320
- if (row.rowKey.startsWith('new-')) {
321
- id = rowKeyMap.get(row.rowKey) ?? mintRowId();
322
- rowKeyMap.set(row.rowKey, id);
323
- structuralChange = true;
324
- }
325
- else if (!prevById.has(row.rowKey)) {
326
- structuralChange = true;
327
- }
328
- const prevRow = prevById.get(id);
329
- const nextRow = { id };
330
- for (const fieldName of slotFieldNames(table.fields)) {
331
- const field = table.fields[fieldName];
332
- if (field.derived)
333
- continue;
334
- const extracted = row.fields[fieldName];
335
- const prevFv = prevRow ? getRowField(prevRow, fieldName) : undefined;
336
- if (extracted) {
337
- const path = formatFieldPath(tableName, fieldName);
338
- const issues = validateExtractedField(field, extracted, path);
339
- if (issues.length > 0) {
340
- throw new Error(issues.map((i) => i.message).join('; '));
341
- }
342
- const committed = commitFieldWrite(prevFv, extractedToFieldValue(extracted, 'slot-filling', now));
343
- nextRow[fieldName] = committed.field;
344
- if (committed.changed) {
345
- changed.add(path);
346
- if (committed.historyEntry) {
347
- history.push({ path, entry: committed.historyEntry, rowId: id });
348
- }
349
- }
350
- }
351
- else if (prevFv) {
352
- nextRow[fieldName] = prevFv;
353
- }
354
- else {
355
- nextRow[fieldName] = makeFieldValue({
356
- value: null,
357
- state: 'empty',
358
- updatedBy: 'slot-filling',
359
- updatedAt: now,
360
- });
361
- }
362
- }
363
- nextRows.push(nextRow);
364
- }
365
- const prevIds = new Set(prevRows.map((r) => r.id));
366
- const nextIds = new Set(nextRows.map((r) => r.id));
367
- for (const id of prevIds) {
368
- if (!nextIds.has(id))
369
- structuralChange = true;
370
- }
371
- if (prevRows.length !== nextRows.length)
372
- structuralChange = true;
373
- next[tableName] = nextRows;
374
- if (structuralChange) {
375
- for (const fieldName of slotFieldNames(table.fields)) {
376
- changed.add(formatFieldPath(tableName, fieldName));
377
- }
378
- }
379
- }
380
- }
381
- return { snapshot: next, changed: [...changed], history };
382
- }
383
- /**
384
- * Mark remaining conversation fields as asked_unknown (Topic move-on).
385
- */
386
- export function markAskedUnknown(schema, snapshot, fields, options = {}) {
387
- const now = options.now ?? Date.now();
388
- const next = cloneSnapshot(snapshot);
389
- const changed = [];
390
- const history = [];
391
- for (const path of fields) {
392
- const parsed = requireFieldPath(path);
393
- const table = getCompiledTable(schema, parsed.table);
394
- const field = table?.fields[parsed.field];
395
- if (!table || !field || field.derived)
396
- continue;
397
- if (field.source !== 'conversation')
398
- continue;
399
- if (!isSnapshotSingleRow(table))
400
- continue;
401
- const tableData = getSnapshotTable(next, parsed.table);
402
- const prev = getRowField(tableData, parsed.field);
403
- if (!prev || prev.state !== 'empty')
404
- continue;
405
- const committed = commitFieldWrite(prev, makeFieldValue({
406
- value: null,
407
- state: 'asked_unknown',
408
- reason: options.reason ?? 'move-on',
409
- updatedBy: 'platform',
410
- updatedAt: now,
411
- }));
412
- tableData[parsed.field] = committed.field;
413
- if (committed.changed) {
414
- changed.push(parsed.path);
415
- if (committed.historyEntry) {
416
- history.push({
417
- path: parsed.path,
418
- entry: committed.historyEntry,
419
- rowId: typeof tableData.id === 'string' && tableData.id ? tableData.id : undefined,
420
- });
421
- }
422
- }
423
- }
424
- return { snapshot: next, changed, history };
425
- }
426
- //# sourceMappingURL=write.js.map
@@ -1,54 +0,0 @@
1
- import type { FuncRef } from '../functions/func-ref.js';
2
- import type { FieldPath } from '../slot/path.js';
3
- import type { ActionNode, AgendaHeader, AgendaTree, AuthoringNode, AuthoringWhen, BranchNode, FinishWhen, IvrDigit, IvrFallbackAction, IvrNode, OnNoProgress, SectionNode, SwitchOnNode, TopicNode, TransferNode } from './types.js';
4
- import type { TransferDial, TransferMode, TransferSay } from './transfer-spec.js';
5
- export declare function topic(id: string, config: {
6
- label: string;
7
- applyWhen: AuthoringWhen;
8
- instructions: string;
9
- fields: FieldPath[] | null;
10
- finishWhen: FinishWhen;
11
- onNoProgress: OnNoProgress | null;
12
- }): TopicNode;
13
- export declare function action(id: string, config: {
14
- label: string;
15
- applyWhen: AuthoringWhen;
16
- finishWhen: FinishWhen;
17
- run: FuncRef;
18
- say: string | null;
19
- }): ActionNode;
20
- export declare function transfer(id: string, config: {
21
- label: string;
22
- applyWhen: AuthoringWhen;
23
- numbers: string[];
24
- mode: TransferMode;
25
- say: TransferSay;
26
- unsuccessfulSay: TransferSay | null;
27
- } & Omit<TransferDial, 'numbers' | 'mode' | 'say' | 'unsuccessfulSay'>): TransferNode;
28
- export declare function ivr(id: string, config: {
29
- label: string;
30
- applyWhen: AuthoringWhen;
31
- onDtmfResult: FuncRef;
32
- finishWhen: FinishWhen;
33
- fallbackAction: IvrFallbackAction;
34
- confirmTimeoutMs: number;
35
- pauseAfterSayMs: number;
36
- loopSay: string;
37
- enterSay: string | null;
38
- succeedSay: string | null;
39
- unsuccessSay: string | null;
40
- finishOnKey?: IvrDigit | null;
41
- minDigits?: number | null;
42
- maxDigits?: number | null;
43
- validateDigits?: IvrDigit[] | null;
44
- }): IvrNode;
45
- export declare function section(id: string, config: {
46
- label: string;
47
- applyWhen: AuthoringWhen;
48
- }, children: AuthoringNode[]): SectionNode;
49
- export declare function branch(children: AuthoringNode[]): BranchNode;
50
- export declare function switchOn(field: FieldPath, cases: Record<string, AuthoringNode[]> & {
51
- otherwise?: AuthoringNode[];
52
- }): SwitchOnNode;
53
- export declare function agenda(id: string, header: AgendaHeader | null, tree: AuthoringNode[]): AgendaTree;
54
- //# sourceMappingURL=builders.d.ts.map