@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
@@ -0,0 +1,6 @@
1
+ export { ACTIVITY_RECENT_LIMIT, ORCHESTRATOR_ENTRY, ORCHESTRATOR_CONTACTS_FUNCTION, ORCHESTRATOR_FUNCTION, CASE_ORCHESTRATOR_TOOL_NAMES, EMPTY_CASE_ACTIVITY, RECENT_AGREED_ACTIONS_DAYS, type ActivityStats, type AgentRequest, type AgreementFields, type CaseActivity, type CaseOrchestrator, type CaseOrchestratorApi, type CaseOrchestratorContacts, type CaseOrchestratorContactsContext, type CaseOrchestratorContext, type CaseInput, type CaseOrchestratorInput, type CaseOrchestratorManifest, type CaseOrchestratorParams, type CaseOrchestratorResult, type CaseOrchestratorToolName, type CaseOrchestratorTools, type ChannelAvailability, type ChannelUnavailableReason, type ExchangeEntry, type ExchangeEvent, type ExchangeSearchHit, type ContactActionInput, type ContactActionView, type ContactChannel, type PartyContactHours, type FinalOrchestrationResult, type FinishedAgreedActionView, type PartyActivity, type ReadExchangeResult, type ResolvedAgentRequest, type RescheduledResult, type RunTrigger, type RunTriggerType, type ScheduleUpdateSlotsInput, type SlotFieldWriteInput, type SlotInsertInput, type SlotWriteInput, type ScheduleTiming, type ScheduledActionInput, type ScheduledActionInputs, type ScheduledActionKind, type ScheduledActionTiming, type ScheduledActionView, type SearchExchangesResult, type ToolCallArgs, type ToolCallOptions, type ToolCallResult, type ToolResult, type ToolRef, type UpdateSlotsActionInput, type UpdateSlotsActionView, type ScheduleWakeInput, type WakeActionInput, type WakeActionView, type WakeResult, } from './types.js';
2
+ export { localDateTime, localDay, render, zonedIso, type ConversationOptions, type TimelineOptions } from './render.js';
3
+ export { tools } from './tools.js';
4
+ export { followUps } from './follow-ups.js';
5
+ export { validateCaseOrchestratorResult, type CaseOrchestratorResultCheck } from './validate.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,6 @@
1
+ export { ACTIVITY_RECENT_LIMIT, ORCHESTRATOR_ENTRY, ORCHESTRATOR_CONTACTS_FUNCTION, ORCHESTRATOR_FUNCTION, CASE_ORCHESTRATOR_TOOL_NAMES, EMPTY_CASE_ACTIVITY, RECENT_AGREED_ACTIONS_DAYS, } from './types.js';
2
+ export { localDateTime, localDay, render, zonedIso } from './render.js';
3
+ export { tools } from './tools.js';
4
+ export { followUps } from './follow-ups.js';
5
+ export { validateCaseOrchestratorResult } from './validate.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,75 @@
1
+ import type { CaseActivity, ChannelAvailability, FinishedAgreedActionView, PartyActivity, ReadExchangeResult, RunTrigger, ScheduledActionView } from './types.js';
2
+ /** `YYYY-MM-DD` of an instant in `timezone`. */
3
+ export declare function localDay(at: string | Date, timezone: string): string;
4
+ /** `YYYY-MM-DD HH:mm:ss` of an instant in `timezone`. */
5
+ export declare function localDateTime(at: string | Date, timezone: string): string;
6
+ /** ISO 8601 in `timezone` with its UTC offset, e.g. `2026-10-09T06:25:00-04:00`: a time that names its own zone. */
7
+ export declare function zonedIso(at: string | Date, timezone: string): string;
8
+ /** `Current local time: 2026-10-08 10:05:00, Thursday, and October has 31 days`. */
9
+ declare function renderLocalClock(now: Date, timezone: string): string;
10
+ /** One party: `Today is [day 3]` and today's counts. */
11
+ declare function partyActivitySummary(party: PartyActivity): string;
12
+ /** The whole case: the Case day and today's counts. */
13
+ declare function caseActivitySummary(activity: CaseActivity): string;
14
+ /**
15
+ * The party's own contact hours (their `contact_schedule`), in their timezone: a line per weekday
16
+ * (`every day` when all are the same), then one per date that differs. None on file: one line saying
17
+ * so. The company's rules for when to reach them are its own (25 §3), not shown here.
18
+ */
19
+ declare function partyContactHours(party: Pick<PartyActivity, 'contactHours'>): string;
20
+ /** `sms: true` per channel; an unavailable one says why. */
21
+ declare function partyChannelAvailability(availability: ChannelAvailability): string;
22
+ export type TimelineOptions = {
23
+ /** Only the last `sinceDays` days (today counts as one). */
24
+ sinceDays?: number;
25
+ /** At most this many of the newest events. */
26
+ limit?: number;
27
+ };
28
+ /** Events grouped by day: `[day N] [YYYY-MM-DD]:`, then `[YYYY-MM-DD HH:mm:ss] <event> exchangeId …`. */
29
+ declare function partyTimeline(party: PartyActivity, options?: TimelineOptions): string;
30
+ /**
31
+ * `- <id>: <kind> at <local time> [agreed in …] (<note or reason>) {"timing":…}`; an agreed
32
+ * follow-up is marked, scheduled slot writes say why and carry their `writes`, a hand-over names its
33
+ * sequence, a wake-up its name. `(none)` when empty.
34
+ */
35
+ declare function pendingActions(actions: readonly ScheduledActionView[], timezone: string): string;
36
+ /**
37
+ * Why the Run woke up when nothing happened in a conversation (25 §6): each `timer` (a wake-up the
38
+ * Orchestrator booked) and `external` trigger (company code's `instances.notify`), as
39
+ * `- timer <name> at <local time> (<note>)` / `- external <reason> at <local time>`.
40
+ * `(none)` when there are none.
41
+ */
42
+ declare function wakeUps(triggers: readonly RunTrigger[], timezone: string): string;
43
+ /**
44
+ * Finished agreed follow-ups: `- <id>: <kind> at <local time> [agreed in …], <status> at <local time> (<note>)`,
45
+ * the second time being when it finished. `(none)` when empty.
46
+ */
47
+ declare function recentAgreedActions(actions: readonly FinishedAgreedActionView[], timezone: string): string;
48
+ export type ConversationOptions = {
49
+ /** Only the newest `limit` entries. */
50
+ limit?: number;
51
+ };
52
+ /**
53
+ * One exchange's words (a `readExchange` result): a head line naming it, then
54
+ * `[YYYY-MM-DD HH:mm:ss] customer|rep: <text>` per entry, in `timezone`.
55
+ */
56
+ declare function conversation(result: ReadExchangeResult, timezone: string, options?: ConversationOptions): string;
57
+ /**
58
+ * Text for company prompts (docs/design/08-case-orchestrator.md §5.3), in the mars next-step
59
+ * format. Party functions take one contact's activity (`activity.byContact[contactId]`) and
60
+ * write its local wall-clock times.
61
+ */
62
+ export declare const render: {
63
+ localClock: typeof renderLocalClock;
64
+ activitySummary: typeof partyActivitySummary;
65
+ caseActivitySummary: typeof caseActivitySummary;
66
+ contactHours: typeof partyContactHours;
67
+ channelAvailability: typeof partyChannelAvailability;
68
+ timeline: typeof partyTimeline;
69
+ pendingActions: typeof pendingActions;
70
+ recentAgreedActions: typeof recentAgreedActions;
71
+ wakeUps: typeof wakeUps;
72
+ conversation: typeof conversation;
73
+ };
74
+ export {};
75
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1,239 @@
1
+ /** The wall-clock parts of an instant in `timezone`, from one formatter (plus its UTC offset when asked). */
2
+ function localParts(at, timezone, withOffset = false) {
3
+ const parts = Object.fromEntries(new Intl.DateTimeFormat('en-US', {
4
+ timeZone: timezone,
5
+ hourCycle: 'h23',
6
+ year: 'numeric',
7
+ month: '2-digit',
8
+ day: '2-digit',
9
+ hour: '2-digit',
10
+ minute: '2-digit',
11
+ second: '2-digit',
12
+ ...(withOffset ? { timeZoneName: 'longOffset' } : {}),
13
+ })
14
+ .formatToParts(at)
15
+ .map((part) => [part.type, part.value]));
16
+ return parts;
17
+ }
18
+ /** `YYYY-MM-DD` of an instant in `timezone`. */
19
+ export function localDay(at, timezone) {
20
+ const parts = localParts(new Date(at), timezone);
21
+ return `${parts.year}-${parts.month}-${parts.day}`;
22
+ }
23
+ /** `YYYY-MM-DD HH:mm:ss` of an instant in `timezone`. */
24
+ export function localDateTime(at, timezone) {
25
+ const parts = localParts(new Date(at), timezone);
26
+ return `${parts.year}-${parts.month}-${parts.day} ${parts.hour}:${parts.minute}:${parts.second}`;
27
+ }
28
+ /** ISO 8601 in `timezone` with its UTC offset, e.g. `2026-10-09T06:25:00-04:00`: a time that names its own zone. */
29
+ export function zonedIso(at, timezone) {
30
+ const parts = localParts(new Date(at), timezone, true);
31
+ const name = parts.timeZoneName ?? 'GMT';
32
+ const offset = name === 'GMT' ? '+00:00' : name.replace('GMT', '');
33
+ return `${parts.year}-${parts.month}-${parts.day}T${parts.hour}:${parts.minute}:${parts.second}${offset}`;
34
+ }
35
+ /** `Current local time: 2026-10-08 10:05:00, Thursday, and October has 31 days`. */
36
+ function renderLocalClock(now, timezone) {
37
+ const parts = localParts(now, timezone);
38
+ const weekday = new Intl.DateTimeFormat('en-US', { timeZone: timezone, weekday: 'long' }).format(now);
39
+ const month = new Intl.DateTimeFormat('en-US', { timeZone: timezone, month: 'long' }).format(now);
40
+ const daysInMonth = new Date(Date.UTC(Number(parts.year), Number(parts.month), 0)).getUTCDate();
41
+ return `Current local time: ${localDateTime(now, timezone)}, ${weekday}, and ${month} has ${daysInMonth} days`;
42
+ }
43
+ function todayCounts(today) {
44
+ return `calls ${today.calls} (answered ${today.answeredCalls}), sms out ${today.smsOut}, sms in ${today.smsIn}, emails out ${today.emailsOut}, emails in ${today.emailsIn}`;
45
+ }
46
+ /** One party: `Today is [day 3]` and today's counts. */
47
+ function partyActivitySummary(party) {
48
+ return `Today is [day ${party.dayNumber}]\nToday so far: ${todayCounts(party.today)}`;
49
+ }
50
+ /** The whole case: the Case day and today's counts. */
51
+ function caseActivitySummary(activity) {
52
+ const { all, timezone } = activity;
53
+ const since = all.firstAt ? `day 1 = ${localDay(all.firstAt, timezone)}, ${timezone}` : 'no interactions yet';
54
+ return `Case day: [day ${all.dayNumber}] (${since})\nCase today so far: ${todayCounts(all.today)}`;
55
+ }
56
+ const WEEKDAYS = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'];
57
+ const WEEKDAY_NAMES = { mon: 'Mon', tue: 'Tue', wed: 'Wed', thu: 'Thu', fri: 'Fri', sat: 'Sat', sun: 'Sun' };
58
+ /** `09:00-12:00, 14:00-17:00`, or `none`. */
59
+ function hoursText(windows) {
60
+ return windows.length > 0 ? windows.map((window) => `${window.start}-${window.end}`).join(', ') : 'none';
61
+ }
62
+ /**
63
+ * The party's own contact hours (their `contact_schedule`), in their timezone: a line per weekday
64
+ * (`every day` when all are the same), then one per date that differs. None on file: one line saying
65
+ * so. The company's rules for when to reach them are its own (25 §3), not shown here.
66
+ */
67
+ function partyContactHours(party) {
68
+ const { source, weekly, dateOverrides } = party.contactHours;
69
+ if (source === 'none')
70
+ return "Customer's own contact hours: none on file.";
71
+ const days = WEEKDAYS.map((day) => hoursText(weekly[day]));
72
+ const sameEveryDay = days.every((text) => text === days[0]);
73
+ return [
74
+ "Customer's own contact hours (from their contact schedule; reach them only inside these):",
75
+ ...(sameEveryDay ? [`- every day: ${days[0]}`] : WEEKDAYS.map((day, i) => `- ${WEEKDAY_NAMES[day]}: ${days[i]}`)),
76
+ ...dateOverrides.map((override) => `- ${override.date} only: ${hoursText(override.windows)}`),
77
+ ].join('\n');
78
+ }
79
+ const CHANNEL_ORDER = ['sms', 'email', 'call'];
80
+ function unavailableReason(channel, availability) {
81
+ const reason = availability.unavailableChannels[channel];
82
+ if (reason === 'opted_out')
83
+ return ' (opted out)';
84
+ if (reason === 'unreachable')
85
+ return ' (the number cannot take texts)';
86
+ if (reason === 'no_address')
87
+ return channel === 'email' ? ' (no email address on file)' : ' (no phone number on file)';
88
+ return '';
89
+ }
90
+ /** `sms: true` per channel; an unavailable one says why. */
91
+ function partyChannelAvailability(availability) {
92
+ return CHANNEL_ORDER.map((channel) => availability.channels[channel]
93
+ ? `${channel}: true`
94
+ : `${channel}: false${unavailableReason(channel, availability)}`).join('\n');
95
+ }
96
+ /** ` [13s]` for a call whose length is known. */
97
+ function duration(event) {
98
+ return event.durationSec === null ? '' : ` [${event.durationSec}s]`;
99
+ }
100
+ function describeEvent(event) {
101
+ if (event.channel === 'call') {
102
+ const result = event.result === 'answered' ? 'answered' : event.result === 'failed' ? 'failed' : 'no answer';
103
+ return `call [${event.direction}] [${result}]${duration(event)}`;
104
+ }
105
+ if (event.direction === 'inbound')
106
+ return `${event.channel} [customer] [reply]`;
107
+ return `${event.channel} [agent] [${event.result === 'failed' ? 'failed' : 'follow-up'}]`;
108
+ }
109
+ /** Events grouped by day: `[day N] [YYYY-MM-DD]:`, then `[YYYY-MM-DD HH:mm:ss] <event> exchangeId …`. */
110
+ function partyTimeline(party, options = {}) {
111
+ let events = party.recent;
112
+ if (options.sinceDays !== undefined) {
113
+ const firstDay = party.dayNumber - options.sinceDays + 1;
114
+ events = events.filter((event) => event.dayNumber >= firstDay);
115
+ }
116
+ if (options.limit !== undefined)
117
+ events = events.slice(-options.limit);
118
+ const hidden = party.total > events.length;
119
+ if (events.length === 0) {
120
+ return party.total === 0
121
+ ? 'No interactions found.'
122
+ : 'No interactions in this range. Earlier exchanges are not shown; use searchExchanges for them.';
123
+ }
124
+ const days = [];
125
+ let current = null;
126
+ let lines = [];
127
+ const flush = () => {
128
+ if (lines.length > 0)
129
+ days.push(lines.join('\n'));
130
+ lines = [];
131
+ };
132
+ for (const event of events) {
133
+ if (event.dayNumber !== current) {
134
+ flush();
135
+ current = event.dayNumber;
136
+ lines.push(`[day ${event.dayNumber}] [${localDay(event.occurredAt, party.timezone)}]:`);
137
+ }
138
+ const scheduled = event.scheduledActionId ? ` scheduledActionId ${event.scheduledActionId}` : '';
139
+ lines.push(`[${localDateTime(event.occurredAt, party.timezone)}] ${describeEvent(event)} exchangeId ${event.exchangeId}${scheduled}`);
140
+ }
141
+ flush();
142
+ const text = days.join('\n\n');
143
+ return hidden ? `${text}\n\nEarlier exchanges are not shown; use searchExchanges for them.` : text;
144
+ }
145
+ /** ` [agreed in <exchangeId> at <local time of the party's message>]` on an agreed follow-up. */
146
+ function agreedMark(action, timezone) {
147
+ const agreement = action.input.agreement;
148
+ return agreement ? ` [agreed in ${agreement.exchangeId} at ${localDateTime(agreement.agreedAt, timezone)}]` : '';
149
+ }
150
+ /**
151
+ * `- <id>: <kind> at <local time> [agreed in …] (<note or reason>) {"timing":…}`; an agreed
152
+ * follow-up is marked, scheduled slot writes say why and carry their `writes`, a hand-over names its
153
+ * sequence, a wake-up its name. `(none)` when empty.
154
+ */
155
+ function pendingActions(actions, timezone) {
156
+ if (actions.length === 0)
157
+ return '(none)';
158
+ return actions
159
+ .map((action) => {
160
+ const head = `- ${action.id}: ${action.kind} at ${localDateTime(action.scheduledFor, timezone)}`;
161
+ if (action.kind === 'update_slots') {
162
+ const { timing, writes, reason } = action.input;
163
+ return `${head} (${reason}) ${JSON.stringify({ timing, writes })}`;
164
+ }
165
+ if (action.kind === 'next_sequence') {
166
+ const { timing, sequence, subjectRecordId, reason } = action.input;
167
+ return `${head} (${reason}) ${JSON.stringify({ timing, sequence, ...(subjectRecordId ? { subjectRecordId } : {}) })}`;
168
+ }
169
+ if (action.kind === 'wake') {
170
+ const { timing, name, note } = action.input;
171
+ return `${head} ${name}${note ? ` (${note})` : ''} ${JSON.stringify({ timing })}`;
172
+ }
173
+ const { timing, note } = action.input;
174
+ return `${head}${agreedMark(action, timezone)}${note ? ` (${note})` : ''} ${JSON.stringify({ timing })}`;
175
+ })
176
+ .join('\n');
177
+ }
178
+ /**
179
+ * Why the Run woke up when nothing happened in a conversation (25 §6): each `timer` (a wake-up the
180
+ * Orchestrator booked) and `external` trigger (company code's `instances.notify`), as
181
+ * `- timer <name> at <local time> (<note>)` / `- external <reason> at <local time>`.
182
+ * `(none)` when there are none.
183
+ */
184
+ function wakeUps(triggers, timezone) {
185
+ const lines = triggers.flatMap((trigger) => {
186
+ const at = localDateTime(trigger.occurredAt, timezone);
187
+ if (trigger.type === 'timer')
188
+ return [`- timer ${trigger.name} at ${at}${trigger.note ? ` (${trigger.note})` : ''}`];
189
+ if (trigger.type === 'external')
190
+ return [`- external ${trigger.reason} at ${at}`];
191
+ if (trigger.type === 'inbound.paused')
192
+ return [`- inbound ${trigger.channel} ${trigger.exchangeId} at ${at}, not answered: the case was paused`];
193
+ return [];
194
+ });
195
+ return lines.length > 0 ? lines.join('\n') : '(none)';
196
+ }
197
+ /**
198
+ * Finished agreed follow-ups: `- <id>: <kind> at <local time> [agreed in …], <status> at <local time> (<note>)`,
199
+ * the second time being when it finished. `(none)` when empty.
200
+ */
201
+ function recentAgreedActions(actions, timezone) {
202
+ if (actions.length === 0)
203
+ return '(none)';
204
+ return actions
205
+ .map((action) => `- ${action.id}: ${action.kind} at ${localDateTime(action.scheduledFor, timezone)}${agreedMark(action, timezone)}, ${action.status} at ${localDateTime(action.finishedAt, timezone)}${action.input.note ? ` (${action.input.note})` : ''}`)
206
+ .join('\n');
207
+ }
208
+ /**
209
+ * One exchange's words (a `readExchange` result): a head line naming it, then
210
+ * `[YYYY-MM-DD HH:mm:ss] customer|rep: <text>` per entry, in `timezone`.
211
+ */
212
+ function conversation(result, timezone, options = {}) {
213
+ const entries = options.limit !== undefined ? result.entries.slice(-options.limit) : result.entries;
214
+ const party = result.contactId ? ` with customer ${result.contactId}` : '';
215
+ const head = `${result.channel} [${result.direction}] exchangeId ${result.exchangeId}${party}:`;
216
+ if (entries.length === 0)
217
+ return `${head}\n(nothing was said)`;
218
+ const earlier = result.range.from > 0 || entries.length < result.entries.length ? 'Earlier entries are not shown.\n' : '';
219
+ const lines = entries.map((entry) => `[${localDateTime(entry.at, timezone)}] ${entry.speaker === 'party' ? 'customer' : 'rep'}: ${entry.text}`);
220
+ return `${head}\n${earlier}${lines.join('\n')}`;
221
+ }
222
+ /**
223
+ * Text for company prompts (docs/design/08-case-orchestrator.md §5.3), in the mars next-step
224
+ * format. Party functions take one contact's activity (`activity.byContact[contactId]`) and
225
+ * write its local wall-clock times.
226
+ */
227
+ export const render = {
228
+ localClock: renderLocalClock,
229
+ activitySummary: partyActivitySummary,
230
+ caseActivitySummary,
231
+ contactHours: partyContactHours,
232
+ channelAvailability: partyChannelAvailability,
233
+ timeline: partyTimeline,
234
+ pendingActions,
235
+ recentAgreedActions,
236
+ wakeUps,
237
+ conversation,
238
+ };
239
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Picking a time for a contact in company code (25 §4): the platform runs an action at its `at`,
3
+ * exactly, so spreading contacts is the code's own choice. Part of the company API (`src/index.ts`),
4
+ * bundled into company code as is: no imports.
5
+ */
6
+ /**
7
+ * A time in [`from`, `to`) (each a Date, ISO string or epoch ms), as an ISO string for `at`. With `seed` the same seed always gives the same
8
+ * time (a Run that is retried books the same moment); without one it is random.
9
+ */
10
+ export declare function randomTimeBetween(from: Date | string | number, to: Date | string | number, seed?: string): string;
11
+ //# sourceMappingURL=time.d.ts.map
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Picking a time for a contact in company code (25 §4): the platform runs an action at its `at`,
3
+ * exactly, so spreading contacts is the code's own choice. Part of the company API (`src/index.ts`),
4
+ * bundled into company code as is: no imports.
5
+ */
6
+ /** A 32-bit FNV-1a hash of `text`, as a fraction in [0, 1). */
7
+ function fraction(text) {
8
+ let hash = 0x811c9dc5;
9
+ for (let i = 0; i < text.length; i += 1) {
10
+ hash ^= text.charCodeAt(i);
11
+ hash = Math.imul(hash, 0x01000193) >>> 0;
12
+ }
13
+ return hash / 2 ** 32;
14
+ }
15
+ /**
16
+ * A time in [`from`, `to`) (each a Date, ISO string or epoch ms), as an ISO string for `at`. With `seed` the same seed always gives the same
17
+ * time (a Run that is retried books the same moment); without one it is random.
18
+ */
19
+ export function randomTimeBetween(from, to, seed) {
20
+ const start = new Date(from).getTime();
21
+ const end = new Date(to).getTime();
22
+ if (!Number.isFinite(start) || !Number.isFinite(end))
23
+ throw new Error('randomTimeBetween: from and to must be times');
24
+ if (end <= start)
25
+ throw new Error('randomTimeBetween: to must be later than from');
26
+ const share = seed === undefined ? Math.random() : fraction(seed);
27
+ return new Date(start + Math.floor(share * (end - start))).toISOString();
28
+ }
29
+ //# sourceMappingURL=time.js.map
@@ -0,0 +1,29 @@
1
+ import type { ToolRef } from './types.js';
2
+ /**
3
+ * References to the platform tools an AgentRequest may open. The platform
4
+ * owns each tool's description, parameters and executor; a reference only names it.
5
+ */
6
+ export declare const tools: {
7
+ /** Read what was said in one call (plus its result and duration), SMS conversation or email thread. */
8
+ readonly readExchange: () => ToolRef<"readExchange">;
9
+ /** Find exchanges by time, contact, channel, direction, result or scheduled action; calls carry their duration. */
10
+ readonly searchExchanges: () => ToolRef<"searchExchanges">;
11
+ /** Write slot fields; multi-row tables (contact included) need a `rowId`. */
12
+ readonly updateSlots: () => ToolRef<"updateSlots">;
13
+ readonly scheduleCall: () => ToolRef<"scheduleCall">;
14
+ readonly scheduleSms: () => ToolRef<"scheduleSms">;
15
+ readonly scheduleEmail: () => ToolRef<"scheduleEmail">;
16
+ /** Write slot fields at a set time, as given then (cancel or reschedule it when it no longer fits). */
17
+ readonly scheduleUpdateSlots: () => ToolRef<"scheduleUpdateSlots">;
18
+ /** Move a pending action to a new time; same contact and channel. */
19
+ readonly rescheduleAction: () => ToolRef<"rescheduleAction">;
20
+ readonly cancelScheduledAction: () => ToolRef<"cancelScheduledAction">;
21
+ /** Hand the instance over to another sequence, on the same row or a named one, now or at a set time. */
22
+ readonly scheduleNextSequence: () => ToolRef<"scheduleNextSequence">;
23
+ /** End the instance: its pending actions are cancelled and no Run follows. */
24
+ readonly closeInstance: () => ToolRef<"closeInstance">;
25
+ /** Wake this Orchestrator up at a set time (a `timer` trigger); one pending per name, booking it again moves it. */
26
+ readonly scheduleWake: () => ToolRef<"scheduleWake">;
27
+ readonly cancelWake: () => ToolRef<"cancelWake">;
28
+ };
29
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1,31 @@
1
+ function ref(name) {
2
+ return () => ({ kind: 'tool', name });
3
+ }
4
+ /**
5
+ * References to the platform tools an AgentRequest may open. The platform
6
+ * owns each tool's description, parameters and executor; a reference only names it.
7
+ */
8
+ export const tools = {
9
+ /** Read what was said in one call (plus its result and duration), SMS conversation or email thread. */
10
+ readExchange: ref('readExchange'),
11
+ /** Find exchanges by time, contact, channel, direction, result or scheduled action; calls carry their duration. */
12
+ searchExchanges: ref('searchExchanges'),
13
+ /** Write slot fields; multi-row tables (contact included) need a `rowId`. */
14
+ updateSlots: ref('updateSlots'),
15
+ scheduleCall: ref('scheduleCall'),
16
+ scheduleSms: ref('scheduleSms'),
17
+ scheduleEmail: ref('scheduleEmail'),
18
+ /** Write slot fields at a set time, as given then (cancel or reschedule it when it no longer fits). */
19
+ scheduleUpdateSlots: ref('scheduleUpdateSlots'),
20
+ /** Move a pending action to a new time; same contact and channel. */
21
+ rescheduleAction: ref('rescheduleAction'),
22
+ cancelScheduledAction: ref('cancelScheduledAction'),
23
+ /** Hand the instance over to another sequence, on the same row or a named one, now or at a set time. */
24
+ scheduleNextSequence: ref('scheduleNextSequence'),
25
+ /** End the instance: its pending actions are cancelled and no Run follows. */
26
+ closeInstance: ref('closeInstance'),
27
+ /** Wake this Orchestrator up at a set time (a `timer` trigger); one pending per name, booking it again moves it. */
28
+ scheduleWake: ref('scheduleWake'),
29
+ cancelWake: ref('cancelWake'),
30
+ };
31
+ //# sourceMappingURL=tools.js.map