@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
@@ -1,10 +0,0 @@
1
- export { collectJsonRulesFacts, evaluateJsonRules, extractTemplateFields, isOtherwise, jsonRules, looksLikeJsonRules, normalizeJsonRules, otherwise, parseJsonRules, } from './condition.js';
2
- export { andCompiledWhen, compileAuthoringWhen, compileFinishWhen, compileWhen, evaluateFinishWhen, evaluateWhen, finishWhenFields, notAnyWhen, whenFields, } from './finish-when.js';
3
- export { action, agenda, branch, section, switchOn, topic, transfer } from './builders.js';
4
- export { extractBlocksFromTree, flattenAgendaConfig, flattenAgendaPlacements, flattenAgendaTree, isAgendaTree, isSequenceAgendas, normalizeSequenceAgendas, treeToPlacements, } from './flatten.js';
5
- export { LAST_TRANSFER_RESULT_FIELD, collectTransferBlocks, registerTransferSessionFields, transferFieldKey, transferResultField, } from './transfer-fields.js';
6
- export { fatalAgendaIssues, validateCompiledAgenda } from './validate.js';
7
- export { unresolvedFinishWhenFields, walkAgenda, } from './walk.js';
8
- export { simulateAgenda } from './simulate.js';
9
- export { DEFAULT_MAX_ACTIONS_PER_TURN, advanceAgenda, driveAgenda, transferWrites, watchdogHint, } from './drive.js';
10
- //# sourceMappingURL=index.js.map
@@ -1,24 +0,0 @@
1
- import type { ComputeHost } from '../../compute-host/compute-host.js';
2
- import type { RuntimeSlotsSnapshot } from '../slot/types.js';
3
- import { type WalkResult } from './walk.js';
4
- import type { FlatAgendaItem } from './types.js';
5
- export type SimulatedItemStatus = 'folded' | 'done' | 'selected' | 'open';
6
- export type SimulatedItem = {
7
- placementId: string;
8
- blockId: string;
9
- kind: FlatAgendaItem['kind'];
10
- groupPath: string[];
11
- status: SimulatedItemStatus;
12
- applyWhen: boolean;
13
- finishWhen: boolean | null;
14
- };
15
- export type SimulateResult = {
16
- selected: FlatAgendaItem | null;
17
- walk: WalkResult;
18
- items: SimulatedItem[];
19
- };
20
- export declare function simulateAgenda(items: FlatAgendaItem[], snapshot: RuntimeSlotsSnapshot, options?: {
21
- currentPlacementId?: string | null;
22
- compute?: ComputeHost;
23
- }): Promise<SimulateResult>;
24
- //# sourceMappingURL=simulate.d.ts.map
@@ -1,33 +0,0 @@
1
- import { evaluateWhen } from './finish-when.js';
2
- import { walkAgenda } from './walk.js';
3
- export async function simulateAgenda(items, snapshot, options = {}) {
4
- const walk = await walkAgenda(items, snapshot, {
5
- currentPlacementId: options.currentPlacementId,
6
- compute: options.compute,
7
- });
8
- const simulated = [];
9
- for (const item of items) {
10
- const applies = (await evaluateWhen(item.applyWhen, snapshot, options.compute)).pass;
11
- const finished = applies ? (await evaluateWhen(item.finishWhen, snapshot, options.compute)).done : null;
12
- let status;
13
- if (!applies)
14
- status = 'folded';
15
- else if (finished)
16
- status = 'done';
17
- else if (walk.hit?.placementId === item.placementId)
18
- status = 'selected';
19
- else
20
- status = 'open';
21
- simulated.push({
22
- placementId: item.placementId,
23
- blockId: item.id,
24
- kind: item.kind,
25
- groupPath: item.groupPath,
26
- status,
27
- applyWhen: applies,
28
- finishWhen: finished,
29
- });
30
- }
31
- return { selected: walk.hit, walk, items: simulated };
32
- }
33
- //# sourceMappingURL=simulate.js.map
@@ -1,14 +0,0 @@
1
- import type { FieldPath } from '../slot/path.js';
2
- import type { CompiledSlotSchema } from '../slot/types.js';
3
- import type { AgendaBlock, AuthoringNode, TransferBlock } from './types.js';
4
- /** Sanitize a transfer node id into a session field fragment. */
5
- export declare function transferFieldKey(nodeId: string): string;
6
- export declare function transferResultField(nodeId: string): FieldPath;
7
- export declare const LAST_TRANSFER_RESULT_FIELD: `${string}.${string}`;
8
- export declare function collectTransferBlocks(blocks: Record<string, AgendaBlock>, nodes?: AuthoringNode[]): TransferBlock[];
9
- /**
10
- * Register per-node `session.transfer_<id>_result` and `session.last_transfer_result`.
11
- * Existing session fields with the same name are left untouched.
12
- */
13
- export declare function registerTransferSessionFields(schema: CompiledSlotSchema, transferIds: Iterable<string>): CompiledSlotSchema;
14
- //# sourceMappingURL=transfer-fields.d.ts.map
@@ -1,88 +0,0 @@
1
- import { idField } from '../slot/schema.js';
2
- import { getCompiledTable } from '../slot/compile-schema.js';
3
- import { formatFieldPath } from '../slot/path.js';
4
- const RESULT_ENUM = ['connected', 'failed'];
5
- function transferFieldCore(label) {
6
- return {
7
- derived: false,
8
- label,
9
- dataType: 'string',
10
- source: 'system',
11
- extraction: 'Platform transfer result',
12
- enum: [...RESULT_ENUM],
13
- nullable: true,
14
- identifier: null,
15
- ref: null,
16
- };
17
- }
18
- /** Sanitize a transfer node id into a session field fragment. */
19
- export function transferFieldKey(nodeId) {
20
- const cleaned = nodeId.replace(/[^A-Za-z0-9_]/g, '_');
21
- return cleaned.length > 0 ? cleaned : 'node';
22
- }
23
- export function transferResultField(nodeId) {
24
- return formatFieldPath('session', `transfer_${transferFieldKey(nodeId)}_result`);
25
- }
26
- export const LAST_TRANSFER_RESULT_FIELD = formatFieldPath('session', 'last_transfer_result');
27
- export function collectTransferBlocks(blocks, nodes = []) {
28
- const out = [];
29
- const seen = new Set();
30
- for (const block of Object.values(blocks)) {
31
- if (block.kind === 'transfer' && !seen.has(block.id)) {
32
- seen.add(block.id);
33
- out.push(block);
34
- }
35
- }
36
- visit(nodes);
37
- return out;
38
- function visit(list) {
39
- for (const node of list) {
40
- if (node.kind === 'transfer' && !seen.has(node.id)) {
41
- seen.add(node.id);
42
- out.push(node);
43
- }
44
- else if (node.kind === 'section' || node.kind === 'branch') {
45
- visit(node.children);
46
- }
47
- else if (node.kind === 'switchOn') {
48
- for (const children of Object.values(node.cases))
49
- visit(children);
50
- if (node.otherwise)
51
- visit(node.otherwise);
52
- }
53
- }
54
- }
55
- }
56
- /**
57
- * Register per-node `session.transfer_<id>_result` and `session.last_transfer_result`.
58
- * Existing session fields with the same name are left untouched.
59
- */
60
- export function registerTransferSessionFields(schema, transferIds) {
61
- const ids = [...new Set(transferIds)];
62
- if (ids.length === 0)
63
- return schema;
64
- const session = getCompiledTable(schema, 'session');
65
- if (!session)
66
- return schema;
67
- const fields = { ...session.fields };
68
- if (!fields.id)
69
- fields.id = { ...idField, ref: null };
70
- for (const id of ids) {
71
- const name = `transfer_${transferFieldKey(id)}_result`;
72
- if (!fields[name]) {
73
- fields[name] = transferFieldCore(`Transfer ${id} result`);
74
- }
75
- }
76
- if (!fields.last_transfer_result) {
77
- fields.last_transfer_result = transferFieldCore('Last transfer result');
78
- }
79
- const nextSession = {
80
- ...session,
81
- fields,
82
- };
83
- return {
84
- ...schema,
85
- session: nextSession,
86
- };
87
- }
88
- //# sourceMappingURL=transfer-fields.js.map
@@ -1,177 +0,0 @@
1
- import type { TopLevelCondition } from 'json-rules-engine';
2
- import type { FuncRef } from '../functions/func-ref.js';
3
- import type { FieldPath } from '../slot/path.js';
4
- export type Channel = 'call' | 'sms' | 'email' | 'webchat';
5
- /** Nested condition from the engine (`all` members): leaf or `TopLevelCondition`. */
6
- export type Condition = Extract<TopLevelCondition, {
7
- all: unknown;
8
- }>['all'][number];
9
- export type JsonRulesCondition = Condition;
10
- /**
11
- * Shared by applyWhen and finishWhen:
12
- * json-rules object, JSON string, boolFunction, or null (always).
13
- */
14
- export type When = FuncRef | Condition | Condition[] | null;
15
- export type ApplyWhen = When;
16
- export type FinishWhen = When;
17
- /** Compile-time sentinel for branch()/switchOn(); expanded before flatten. */
18
- export type OtherwiseSentinel = {
19
- op: 'otherwise';
20
- notAny?: When[];
21
- };
22
- export type AuthoringWhen = When | OtherwiseSentinel;
23
- export type CompiledWhen = {
24
- kind: 'always';
25
- } | {
26
- kind: 'fn';
27
- fn: string;
28
- } | {
29
- kind: 'rules';
30
- condition: JsonRulesCondition;
31
- };
32
- export type OnNoProgress = {
33
- maxTurns: number;
34
- action: 'move-on' | 'handoff' | 'schedule-callback';
35
- };
36
- export type FirstMessage = {
37
- kind: 'template';
38
- text: string;
39
- } | {
40
- kind: 'fn';
41
- fn: string;
42
- };
43
- export type Interrupt = {
44
- id: string;
45
- label: string;
46
- tool: {
47
- name: string;
48
- description: string;
49
- };
50
- action: {
51
- type: 'transfer';
52
- numbers: string[];
53
- mode: 'cold' | 'warm';
54
- } | {
55
- type: 'switch-language';
56
- languages: string[];
57
- };
58
- priority: number;
59
- };
60
- export type AgendaHeader = {
61
- channel: Channel;
62
- systemPrompt: string | null;
63
- firstMessage: FirstMessage | null;
64
- firstMessageMode: 'assistant-speaks-first' | 'user-speaks-first' | null;
65
- voicemailPrompt: string | null;
66
- interrupts: Interrupt[];
67
- };
68
- export type TopicBlock = {
69
- kind: 'topic';
70
- id: string;
71
- label: string;
72
- instructions: string;
73
- fields: FieldPath[] | null;
74
- finishWhen: FinishWhen;
75
- onNoProgress: OnNoProgress | null;
76
- };
77
- export type ActionBlock = {
78
- kind: 'action';
79
- id: string;
80
- label: string;
81
- run: FuncRef;
82
- finishWhen: FinishWhen;
83
- say: string | null;
84
- };
85
- export type TransferBlock = {
86
- kind: 'transfer';
87
- id: string;
88
- label: string;
89
- numbers: string[];
90
- mode: 'cold' | 'warm';
91
- say: string;
92
- unsuccessfulSay: string | null;
93
- };
94
- export type AgendaBlock = TopicBlock | ActionBlock | TransferBlock;
95
- export type CompiledTopicBlock = Omit<TopicBlock, 'fields' | 'finishWhen'> & {
96
- fields: FieldPath[];
97
- finishWhen: CompiledWhen;
98
- };
99
- export type CompiledActionBlock = Omit<ActionBlock, 'run' | 'finishWhen'> & {
100
- run: string;
101
- finishWhen: CompiledWhen;
102
- };
103
- export type CompiledTransferBlock = TransferBlock & {
104
- finishWhen: CompiledWhen;
105
- resultField: FieldPath;
106
- };
107
- export type CompiledAgendaBlock = CompiledTopicBlock | CompiledActionBlock | CompiledTransferBlock;
108
- export type SectionPlacement = {
109
- kind: 'section';
110
- placementId: string;
111
- label: string;
112
- applyWhen: AuthoringWhen;
113
- children: Placement[];
114
- };
115
- export type NodePlacement = {
116
- kind: 'node';
117
- placementId: string;
118
- blockId: string;
119
- applyWhen: AuthoringWhen;
120
- };
121
- export type Placement = SectionPlacement | NodePlacement;
122
- export type AgendaConfig = {
123
- id: string;
124
- header: AgendaHeader | null;
125
- placements: Placement[];
126
- };
127
- export type SequenceAgendas = {
128
- blocks: Record<string, AgendaBlock>;
129
- agendas: Record<string, AgendaConfig>;
130
- };
131
- export type FlatNodePlacement = {
132
- placementId: string;
133
- applyWhen: CompiledWhen;
134
- groupPath: string[];
135
- };
136
- export type FlatTopicItem = CompiledTopicBlock & FlatNodePlacement;
137
- export type FlatActionItem = CompiledActionBlock & FlatNodePlacement;
138
- export type FlatTransferItem = CompiledTransferBlock & FlatNodePlacement;
139
- export type FlatAgendaItem = FlatTopicItem | FlatActionItem | FlatTransferItem;
140
- export type CompiledAgenda = {
141
- header: AgendaHeader | null;
142
- flat: FlatAgendaItem[];
143
- };
144
- export type TopicNode = TopicBlock & {
145
- applyWhen: AuthoringWhen;
146
- };
147
- export type ActionNode = ActionBlock & {
148
- applyWhen: AuthoringWhen;
149
- };
150
- export type TransferNode = TransferBlock & {
151
- applyWhen: AuthoringWhen;
152
- };
153
- export type SectionNode = {
154
- kind: 'section';
155
- id: string;
156
- label: string;
157
- applyWhen: AuthoringWhen;
158
- children: AuthoringNode[];
159
- };
160
- export type BranchNode = {
161
- kind: 'branch';
162
- children: AuthoringNode[];
163
- };
164
- export type SwitchOnNode = {
165
- kind: 'switchOn';
166
- field: FieldPath;
167
- cases: Record<string, AuthoringNode[]>;
168
- otherwise?: AuthoringNode[];
169
- };
170
- export type AuthoringNode = TopicNode | ActionNode | TransferNode | SectionNode | BranchNode | SwitchOnNode;
171
- export type AgendaTree = {
172
- kind: 'agenda';
173
- id: string;
174
- header: AgendaHeader | null;
175
- tree: AuthoringNode[];
176
- };
177
- //# sourceMappingURL=types.d.ts.map
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1,11 +0,0 @@
1
- import type { FuncMap } from '../functions/types.js';
2
- import type { CompiledSlotSchema, ValidationIssue, ValidationResult } from '../slot/types.js';
3
- import type { CompiledAgenda } from './types.js';
4
- export type ValidateAgendaOptions = {
5
- schema: CompiledSlotSchema;
6
- functions?: FuncMap;
7
- agendaId?: string;
8
- };
9
- export declare function validateCompiledAgenda(compiled: CompiledAgenda, options: ValidateAgendaOptions): ValidationResult;
10
- export declare function fatalAgendaIssues(issues: ValidationIssue[]): ValidationIssue[];
11
- //# sourceMappingURL=validate.d.ts.map
@@ -1,226 +0,0 @@
1
- import { getCompiledTable } from '../slot/compile-schema.js';
2
- import { parseFieldPath } from '../slot/path.js';
3
- import { extractTemplateFields } from './condition.js';
4
- import { whenFields } from './finish-when.js';
5
- import { LAST_TRANSFER_RESULT_FIELD } from './transfer-fields.js';
6
- function fieldExists(schema, path) {
7
- const parsed = parseFieldPath(path);
8
- if (!parsed)
9
- return false;
10
- return getCompiledTable(schema, parsed.table)?.fields[parsed.field] != null;
11
- }
12
- function requireFields(schema, fields, issues, path, code = 'unknown-field') {
13
- for (const field of fields) {
14
- if (!parseFieldPath(field)) {
15
- issues.push({ code: 'invalid-field-path', message: `Invalid field path: ${field}`, path: `${path}:${field}` });
16
- continue;
17
- }
18
- if (!fieldExists(schema, field)) {
19
- issues.push({ code, message: `Unknown field: ${field}`, path: `${path}:${field}` });
20
- }
21
- }
22
- }
23
- function earlierCollected(items, index) {
24
- const collected = new Set();
25
- for (let i = 0; i < index; i++) {
26
- const item = items[i];
27
- if (item.kind === 'topic') {
28
- for (const field of item.fields)
29
- collected.add(field);
30
- }
31
- }
32
- return collected;
33
- }
34
- function transferIndexByResultField(items) {
35
- const map = new Map();
36
- items.forEach((item, index) => {
37
- if (item.kind === 'transfer') {
38
- map.set(item.resultField, index);
39
- }
40
- });
41
- return map;
42
- }
43
- function listedCustomFunctions(functions) {
44
- const names = Object.entries(functions)
45
- .filter(([, def]) => def.kind === 'custom')
46
- .map(([name]) => name)
47
- .sort((a, b) => a.localeCompare(b));
48
- return names.length > 0 ? names.join(', ') : 'none';
49
- }
50
- function requireBoolWhen(when, functions, issues, path, label) {
51
- if (when.kind === 'fn') {
52
- const def = functions?.[when.fn];
53
- if (functions && !def) {
54
- issues.push({ code: 'unknown-function', message: `${label} fn not found: ${when.fn}`, path });
55
- }
56
- else if (def && def.kind !== 'boolCompute') {
57
- issues.push({
58
- code: label === 'applyWhen' ? 'apply-when-not-bool' : 'finish-when-not-bool',
59
- message: `${label} fn '${when.fn}' must be defineBoolComputeFunc`,
60
- path,
61
- });
62
- }
63
- return;
64
- }
65
- }
66
- function firstTransferIndex(items) {
67
- return items.findIndex((item) => item.kind === 'transfer');
68
- }
69
- export function validateCompiledAgenda(compiled, options) {
70
- const issues = [];
71
- const { schema, functions } = options;
72
- const prefix = options.agendaId ?? 'agenda';
73
- const items = compiled.flat;
74
- const seenPlacement = new Set();
75
- const transferByResult = transferIndexByResultField(items);
76
- const firstTransfer = firstTransferIndex(items);
77
- if (compiled.header?.channel && compiled.header.channel !== 'call') {
78
- for (const item of items) {
79
- if (item.kind === 'transfer') {
80
- issues.push({
81
- code: 'transfer-channel',
82
- message: `Transfer ${item.id} is only valid on call agendas`,
83
- path: `${prefix}/${item.placementId}`,
84
- });
85
- }
86
- }
87
- }
88
- if (compiled.header?.firstMessage?.kind === 'template') {
89
- requireFields(schema, extractTemplateFields(compiled.header.firstMessage.text), issues, `${prefix}/header/firstMessage`);
90
- }
91
- if (compiled.header?.firstMessage?.kind === 'fn') {
92
- const name = compiled.header.firstMessage.fn;
93
- const def = functions?.[name];
94
- if (functions && !def) {
95
- issues.push({
96
- code: 'unknown-function',
97
- message: `firstMessage fn not found: ${name}`,
98
- path: `${prefix}/header/firstMessage`,
99
- });
100
- }
101
- else if (def && def.kind !== 'system') {
102
- issues.push({
103
- code: 'invalid-function-kind',
104
- message: `firstMessage fn must be a system function: ${name}`,
105
- path: `${prefix}/header/firstMessage`,
106
- });
107
- }
108
- }
109
- for (let index = 0; index < items.length; index++) {
110
- const item = items[index];
111
- const path = `${prefix}/${item.placementId}`;
112
- if (seenPlacement.has(item.placementId)) {
113
- issues.push({ code: 'duplicate-placement', message: `Duplicate placementId: ${item.placementId}`, path });
114
- }
115
- seenPlacement.add(item.placementId);
116
- requireFields(schema, whenFields(item.applyWhen), issues, `${path}/applyWhen`);
117
- const collected = earlierCollected(items, index);
118
- for (const field of whenFields(item.applyWhen)) {
119
- if (field.startsWith('session.transfer_') && field.endsWith('_result')) {
120
- const writer = transferByResult.get(field);
121
- if (writer == null || writer >= index) {
122
- issues.push({
123
- code: 'transfer-result-before-node',
124
- message: `applyWhen reads ${field} before the transfer node`,
125
- path: `${path}/applyWhen`,
126
- });
127
- }
128
- continue;
129
- }
130
- if (field === LAST_TRANSFER_RESULT_FIELD) {
131
- if (firstTransfer < 0 || firstTransfer >= index) {
132
- issues.push({
133
- code: 'transfer-result-before-node',
134
- message: `applyWhen reads ${LAST_TRANSFER_RESULT_FIELD} before any transfer`,
135
- path: `${path}/applyWhen`,
136
- });
137
- }
138
- continue;
139
- }
140
- const parsed = parseFieldPath(field);
141
- const def = parsed ? getCompiledTable(schema, parsed.table)?.fields[parsed.field] : undefined;
142
- if (def?.derived)
143
- continue;
144
- if (def && !def.derived && def.source === 'system')
145
- continue;
146
- if (!collected.has(field)) {
147
- issues.push({
148
- code: 'fork-field-not-collected',
149
- message: `applyWhen field ${field} is not collected by an earlier topic`,
150
- path: `${path}/applyWhen`,
151
- });
152
- }
153
- }
154
- requireBoolWhen(item.applyWhen, functions, issues, `${path}/applyWhen`, 'applyWhen');
155
- if (item.kind === 'topic') {
156
- requireFields(schema, item.fields, issues, `${path}/fields`);
157
- const referenced = whenFields(item.finishWhen);
158
- requireFields(schema, referenced, issues, `${path}/finishWhen`);
159
- requireBoolWhen(item.finishWhen, functions, issues, `${path}/finishWhen`, 'finishWhen');
160
- if (item.finishWhen.kind !== 'fn') {
161
- for (const field of referenced) {
162
- if (!item.fields.includes(field)) {
163
- issues.push({
164
- code: 'finish-when-not-in-fields',
165
- message: `finishWhen field ${field} is not in topic fields`,
166
- path: `${path}/finishWhen`,
167
- });
168
- }
169
- }
170
- }
171
- }
172
- if (item.kind === 'action') {
173
- requireBoolWhen(item.finishWhen, functions, issues, `${path}/finishWhen`, 'finishWhen');
174
- if (item.finishWhen.kind === 'rules') {
175
- requireFields(schema, whenFields(item.finishWhen), issues, `${path}/finishWhen`);
176
- }
177
- const run = functions?.[item.run];
178
- if (functions && !run) {
179
- issues.push({
180
- code: 'unknown-function',
181
- message: `Action '${item.id}' runs unknown function '${item.run}'. Custom functions: ${listedCustomFunctions(functions)}`,
182
- path: `${path}/run`,
183
- });
184
- }
185
- else if (run && run.kind !== 'custom') {
186
- issues.push({
187
- code: 'action-run-not-custom',
188
- message: `Action '${item.id}' runs '${item.run}', which is ${run.kind}. Actions must use defineCustomFunc.`,
189
- path: `${path}/run`,
190
- });
191
- }
192
- }
193
- if (item.kind === 'transfer') {
194
- for (const number of item.numbers) {
195
- requireFields(schema, extractTemplateFields(number), issues, `${path}/numbers`);
196
- }
197
- requireFields(schema, [item.resultField, LAST_TRANSFER_RESULT_FIELD], issues, `${path}/result`);
198
- }
199
- }
200
- return issues.length === 0 ? { ok: true } : { ok: false, issues };
201
- }
202
- const FATAL_AGENDA_CODES = new Set([
203
- 'unknown-block',
204
- 'unknown-field',
205
- 'invalid-field-path',
206
- 'invalid-finish-when',
207
- 'unknown-function',
208
- 'finish-when-not-bool',
209
- 'apply-when-not-bool',
210
- 'invalid-apply-when',
211
- 'finish-when-not-in-fields',
212
- 'fork-field-not-collected',
213
- 'otherwise-not-unique',
214
- 'otherwise-not-last',
215
- 'branch-no-explicit',
216
- 'otherwise-unexpanded',
217
- 'transfer-channel',
218
- 'transfer-result-before-node',
219
- 'action-run-not-custom',
220
- 'duplicate-placement',
221
- 'block-kind-mismatch',
222
- ]);
223
- export function fatalAgendaIssues(issues) {
224
- return issues.filter((issue) => FATAL_AGENDA_CODES.has(issue.code));
225
- }
226
- //# sourceMappingURL=validate.js.map
@@ -1,34 +0,0 @@
1
- import type { ComputeHost } from '../../compute-host/compute-host.js';
2
- import type { FieldPath } from '../slot/path.js';
3
- import type { RuntimeSlotsSnapshot } from '../slot/types.js';
4
- import type { FlatAgendaItem } from './types.js';
5
- export type WalkSkipReason = 'folded' | 'done' | 'skipped';
6
- export type WalkSkip = {
7
- placementId: string;
8
- blockId: string;
9
- reason: WalkSkipReason;
10
- };
11
- export type WalkHitReason = 'sticky' | 'scan';
12
- export type WalkResult = {
13
- hit: FlatAgendaItem | null;
14
- reason: WalkHitReason | 'complete';
15
- skipped: WalkSkip[];
16
- decisions: WalkDecision[];
17
- };
18
- export type WalkDecision = {
19
- placementId: string;
20
- blockId: string;
21
- status: 'folded' | 'done' | 'hit' | 'skipped';
22
- via: WalkHitReason;
23
- applyWhen: boolean | null;
24
- finishWhen: boolean | null;
25
- };
26
- export type WalkOptions = {
27
- currentPlacementId?: string | null;
28
- /** This-tick skips (action returned null). */
29
- skipPlacementIds?: ReadonlySet<string>;
30
- compute?: ComputeHost;
31
- };
32
- export declare function walkAgenda(items: FlatAgendaItem[], snapshot: RuntimeSlotsSnapshot, options?: WalkOptions): Promise<WalkResult>;
33
- export declare function unresolvedFinishWhenFields(item: FlatAgendaItem, snapshot: RuntimeSlotsSnapshot, compute?: ComputeHost): Promise<FieldPath[]>;
34
- //# sourceMappingURL=walk.d.ts.map