@k2b/cloud 0.6.0-rc.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 (540) hide show
  1. package/README.md +98 -0
  2. package/package.json +128 -0
  3. package/public/logo.svg +1 -0
  4. package/scripts/app-favicon.test.ts +49 -0
  5. package/scripts/app-favicon.ts +51 -0
  6. package/scripts/build.ts +205 -0
  7. package/scripts/preload.ts +164 -0
  8. package/scripts/sync-recovery-smoke.ts +200 -0
  9. package/src/_internal/app-favicon.ts +2 -0
  10. package/src/_internal/app-presentation.ts +61 -0
  11. package/src/_internal/app-workspace-state.ts +24 -0
  12. package/src/_internal/bounded-json.ts +47 -0
  13. package/src/_internal/build-metadata.ts +9 -0
  14. package/src/_internal/capabilities.ts +1118 -0
  15. package/src/_internal/define-app.ts +801 -0
  16. package/src/_internal/heartbeat.ts +167 -0
  17. package/src/_internal/help-catalog.ts +241 -0
  18. package/src/_internal/help.ts +95 -0
  19. package/src/_internal/nats-connection.ts +34 -0
  20. package/src/_internal/page-responses.ts +40 -0
  21. package/src/_internal/process-sync.ts +117 -0
  22. package/src/_internal/readiness.ts +3 -0
  23. package/src/_internal/registry-validation.ts +136 -0
  24. package/src/_internal/registry-watch.ts +52 -0
  25. package/src/_internal/registry.ts +338 -0
  26. package/src/_internal/runtime-compatibility.ts +64 -0
  27. package/src/_internal/runtime-context.ts +84 -0
  28. package/src/_internal/runtime-watcher.ts +78 -0
  29. package/src/_internal/static-assets.ts +86 -0
  30. package/src/_internal/status-preserving-ssr.ts +49 -0
  31. package/src/access/PermissionEditor.tsx +486 -0
  32. package/src/access/ResourceApiKeys.tsx +271 -0
  33. package/src/access/messages.ts +121 -0
  34. package/src/access/ui.ts +16 -0
  35. package/src/account/Avatar.tsx +28 -0
  36. package/src/account/EntitySearch.tsx +363 -0
  37. package/src/account/avatar-upload-dialog.tsx +197 -0
  38. package/src/account/avatar-upload.ts +149 -0
  39. package/src/account/ui.ts +3 -0
  40. package/src/ai/admin.ts +47 -0
  41. package/src/ai/approval-routes.ts +130 -0
  42. package/src/ai/approvals.ts +139 -0
  43. package/src/ai/assistant-models.ts +61 -0
  44. package/src/ai/attachments.ts +40 -0
  45. package/src/ai/browser.ts +92 -0
  46. package/src/ai/capabilities.ts +714 -0
  47. package/src/ai/capability-execution.ts +151 -0
  48. package/src/ai/chat/blocks.render.test.tsx +1108 -0
  49. package/src/ai/chat/blocks.tsx +730 -0
  50. package/src/ai/chat/builtin-tools.tsx +428 -0
  51. package/src/ai/chat/capability-table.tsx +87 -0
  52. package/src/ai/chat/composer-adapter.ts +169 -0
  53. package/src/ai/chat/file-tools.tsx +81 -0
  54. package/src/ai/chat/message-actions.tsx +370 -0
  55. package/src/ai/chat/message-utils.ts +479 -0
  56. package/src/ai/chat/messages.ts +43 -0
  57. package/src/ai/chat/presentation.tsx +395 -0
  58. package/src/ai/chat/primitives.tsx +3 -0
  59. package/src/ai/chat/tool-disclosure.tsx +41 -0
  60. package/src/ai/chat/turn-navigator-utils.ts +28 -0
  61. package/src/ai/chat/turn-navigator.tsx +164 -0
  62. package/src/ai/chat/user-message.tsx +149 -0
  63. package/src/ai/chat/visual-tools.tsx +435 -0
  64. package/src/ai/chat/web-tools.tsx +202 -0
  65. package/src/ai/chat-task-contracts.ts +113 -0
  66. package/src/ai/chat-tasks.ts +952 -0
  67. package/src/ai/client/controller.ts +1211 -0
  68. package/src/ai/client/file-source.ts +95 -0
  69. package/src/ai/client/live-connection.ts +140 -0
  70. package/src/ai/client/projection.ts +178 -0
  71. package/src/ai/client/transport.ts +111 -0
  72. package/src/ai/compaction.ts +182 -0
  73. package/src/ai/credentials.ts +124 -0
  74. package/src/ai/default-tool-contracts.ts +108 -0
  75. package/src/ai/default-tools.ts +127 -0
  76. package/src/ai/enrich.ts +280 -0
  77. package/src/ai/executor.ts +1624 -0
  78. package/src/ai/fetch-file-tool.ts +313 -0
  79. package/src/ai/file-context.ts +92 -0
  80. package/src/ai/file-media-type.ts +28 -0
  81. package/src/ai/file-mount.ts +16 -0
  82. package/src/ai/file-tools.ts +566 -0
  83. package/src/ai/files-store.ts +390 -0
  84. package/src/ai/firecrawl-tools.ts +305 -0
  85. package/src/ai/grids-skill.ts +126 -0
  86. package/src/ai/http.ts +265 -0
  87. package/src/ai/index.ts +337 -0
  88. package/src/ai/kit-skill.ts +22 -0
  89. package/src/ai/limits.ts +5 -0
  90. package/src/ai/live-events.ts +289 -0
  91. package/src/ai/live-messages.ts +45 -0
  92. package/src/ai/live-outbox.ts +102 -0
  93. package/src/ai/live-routes.ts +412 -0
  94. package/src/ai/live.ts +2 -0
  95. package/src/ai/maintenance.ts +302 -0
  96. package/src/ai/markdown-pdf-tool.ts +95 -0
  97. package/src/ai/memories.ts +605 -0
  98. package/src/ai/memory-learning-runs.ts +222 -0
  99. package/src/ai/memory-learning.ts +619 -0
  100. package/src/ai/memory-tool.ts +120 -0
  101. package/src/ai/memory-workflow-evidence.ts +158 -0
  102. package/src/ai/migrate.ts +2082 -0
  103. package/src/ai/model-access-migrate.ts +30 -0
  104. package/src/ai/model-access.ts +191 -0
  105. package/src/ai/personal-agent.ts +6 -0
  106. package/src/ai/prefs.ts +72 -0
  107. package/src/ai/project-tool.ts +94 -0
  108. package/src/ai/projects-routes.ts +277 -0
  109. package/src/ai/projects.ts +902 -0
  110. package/src/ai/protocol.ts +279 -0
  111. package/src/ai/provider.ts +73 -0
  112. package/src/ai/public-projection.ts +25 -0
  113. package/src/ai/resource-markers.ts +31 -0
  114. package/src/ai/resource-refs.ts +70 -0
  115. package/src/ai/routes.ts +1131 -0
  116. package/src/ai/runtime-tools.ts +39 -0
  117. package/src/ai/runtime.ts +544 -0
  118. package/src/ai/settings.ts +529 -0
  119. package/src/ai/short-id.ts +45 -0
  120. package/src/ai/skill-catalog.ts +73 -0
  121. package/src/ai/skill-format.ts +145 -0
  122. package/src/ai/skill-seeds.ts +430 -0
  123. package/src/ai/skill-tool.ts +81 -0
  124. package/src/ai/skills-routes.ts +143 -0
  125. package/src/ai/skills.ts +934 -0
  126. package/src/ai/solid.ts +27 -0
  127. package/src/ai/store.ts +3113 -0
  128. package/src/ai/stream.ts +308 -0
  129. package/src/ai/structured-runs.ts +66 -0
  130. package/src/ai/structured.ts +186 -0
  131. package/src/ai/system-prompt.ts +170 -0
  132. package/src/ai/task-prompt.ts +22 -0
  133. package/src/ai/timeline.ts +148 -0
  134. package/src/ai/tool-audit.ts +177 -0
  135. package/src/ai/tool-result-budget.ts +16 -0
  136. package/src/ai/tools.ts +155 -0
  137. package/src/ai/types.ts +967 -0
  138. package/src/ai/ui.tsx +39 -0
  139. package/src/ai/usage-migrate.ts +81 -0
  140. package/src/ai/usage.ts +315 -0
  141. package/src/ai/validate.ts +54 -0
  142. package/src/ai/vision-tool.ts +79 -0
  143. package/src/api/accounts-entities.ts +174 -0
  144. package/src/api/admin-ai-projects.ts +74 -0
  145. package/src/api/admin-ai-skills.ts +76 -0
  146. package/src/api/admin-ai-usage.ts +42 -0
  147. package/src/api/admin-core-settings.ts +508 -0
  148. package/src/api/admin-identity.ts +148 -0
  149. package/src/api/admin-lifecycle.ts +206 -0
  150. package/src/api/admin-linux-identities.ts +66 -0
  151. package/src/api/announcements.ts +131 -0
  152. package/src/api/app-approval.ts +129 -0
  153. package/src/api/apps.ts +51 -0
  154. package/src/api/auth/schemas.ts +54 -0
  155. package/src/api/auth.ts +370 -0
  156. package/src/api/capabilities.ts +658 -0
  157. package/src/api/help-messages.ts +19 -0
  158. package/src/api/help.ts +78 -0
  159. package/src/api/index.ts +108 -0
  160. package/src/api/mcp.ts +744 -0
  161. package/src/api/me-rail.ts +45 -0
  162. package/src/api/me.ts +753 -0
  163. package/src/api/search/schemas.ts +79 -0
  164. package/src/api/search.bench.ts +185 -0
  165. package/src/api/search.ts +407 -0
  166. package/src/api/sync-ops.ts +79 -0
  167. package/src/api/widgets.ts +143 -0
  168. package/src/browser/CloudResourceSearch.behavior.test.tsx +74 -0
  169. package/src/browser/CloudResourceSearch.tsx +791 -0
  170. package/src/browser/app-approval-vault.ts +305 -0
  171. package/src/browser/app-approval.ts +234 -0
  172. package/src/browser/live-websocket.ts +268 -0
  173. package/src/browser/locale-preference.ts +25 -0
  174. package/src/browser/notification-target.ts +27 -0
  175. package/src/browser/notification-timeout.ts +14 -0
  176. package/src/browser/notifications.ts +181 -0
  177. package/src/browser/resource-clipboard.ts +70 -0
  178. package/src/browser/resource-picker.tsx +39 -0
  179. package/src/browser/resource-search-messages.ts +55 -0
  180. package/src/browser/resource-search.ts +27 -0
  181. package/src/capabilities/client.ts +149 -0
  182. package/src/capabilities/response.ts +39 -0
  183. package/src/capabilities/server.ts +215 -0
  184. package/src/capabilities/signals.ts +4 -0
  185. package/src/capabilities/testing.ts +12 -0
  186. package/src/capabilities/types.ts +32 -0
  187. package/src/cli/access.ts +499 -0
  188. package/src/cli/account.ts +382 -0
  189. package/src/cli/admin/account-administration.ts +45 -0
  190. package/src/cli/admin/account-categories.ts +49 -0
  191. package/src/cli/admin/ai-usage.ts +118 -0
  192. package/src/cli/admin/app-sign-in.ts +49 -0
  193. package/src/cli/admin/data.ts +343 -0
  194. package/src/cli/admin/documentation.ts +34 -0
  195. package/src/cli/admin/gateway.ts +155 -0
  196. package/src/cli/admin/index.ts +61 -0
  197. package/src/cli/admin/instance.ts +250 -0
  198. package/src/cli/admin/jobs.ts +223 -0
  199. package/src/cli/admin/legal.ts +122 -0
  200. package/src/cli/admin/linux.ts +53 -0
  201. package/src/cli/admin/logs.ts +324 -0
  202. package/src/cli/admin/metrics.ts +142 -0
  203. package/src/cli/admin/nats.ts +167 -0
  204. package/src/cli/admin/notifications.ts +516 -0
  205. package/src/cli/admin/shared.ts +113 -0
  206. package/src/cli/admin/sync.ts +188 -0
  207. package/src/cli/admin/telemetry.ts +314 -0
  208. package/src/cli/admin/webhooks.ts +222 -0
  209. package/src/cli/admin/workflows.ts +367 -0
  210. package/src/cli/apps.ts +40 -0
  211. package/src/cli/capabilities.ts +239 -0
  212. package/src/cli/commands.ts +604 -0
  213. package/src/cli/index.ts +61 -0
  214. package/src/cli/locale.ts +31 -0
  215. package/src/cli/output.ts +58 -0
  216. package/src/clients/core.ts +20 -0
  217. package/src/config/env.ts +54 -0
  218. package/src/config/index.ts +6 -0
  219. package/src/contracts/account-categories.ts +62 -0
  220. package/src/contracts/announcements.ts +121 -0
  221. package/src/contracts/app-approval.ts +197 -0
  222. package/src/contracts/app.ts +162 -0
  223. package/src/contracts/capabilities.ts +484 -0
  224. package/src/contracts/index.ts +14 -0
  225. package/src/contracts/notification-live.ts +66 -0
  226. package/src/contracts/notification-types.ts +235 -0
  227. package/src/contracts/posix.ts +69 -0
  228. package/src/contracts/profile.ts +85 -0
  229. package/src/contracts/rail-preferences.ts +53 -0
  230. package/src/contracts/registry.ts +110 -0
  231. package/src/contracts/resource-clipboard.ts +33 -0
  232. package/src/contracts/settings-types.ts +98 -0
  233. package/src/contracts/shared.ts +408 -0
  234. package/src/contracts/user-notifications.ts +101 -0
  235. package/src/contracts/widgets.ts +183 -0
  236. package/src/desktop/index.ts +704 -0
  237. package/src/desktop/solid.tsx +938 -0
  238. package/src/index.ts +58 -0
  239. package/src/server/actor.ts +41 -0
  240. package/src/server/api/index.ts +2 -0
  241. package/src/server/api/respond.ts +96 -0
  242. package/src/server/api-client.ts +54 -0
  243. package/src/server/app-context.ts +39 -0
  244. package/src/server/help.ts +187 -0
  245. package/src/server/index.ts +89 -0
  246. package/src/server/locale.ts +55 -0
  247. package/src/server/middleware/auth.ts +386 -0
  248. package/src/server/middleware/index.ts +28 -0
  249. package/src/server/middleware/invocation.ts +55 -0
  250. package/src/server/middleware/middleware.ts +65 -0
  251. package/src/server/middleware/openapi.ts +126 -0
  252. package/src/server/middleware/rate-limit.ts +125 -0
  253. package/src/server/middleware/request-logger.ts +41 -0
  254. package/src/server/middleware/route-template.ts +46 -0
  255. package/src/server/middleware/runtime.ts +22 -0
  256. package/src/server/middleware/settings.ts +55 -0
  257. package/src/server/middleware/validator.ts +49 -0
  258. package/src/server/middleware/workload.ts +22 -0
  259. package/src/server/ratelimit.ts +151 -0
  260. package/src/server/request-cookies.ts +18 -0
  261. package/src/server/services/access.ts +644 -0
  262. package/src/server/services/freeipa/client.ts +137 -0
  263. package/src/server/services/freeipa/index.ts +9 -0
  264. package/src/server/services/freeipa/session.ts +123 -0
  265. package/src/server/services/freeipa/test-certificates.ts +44 -0
  266. package/src/server/services/freeipa/tls.ts +44 -0
  267. package/src/server/services/freeipa/transport.ts +116 -0
  268. package/src/server/services/freeipa/util.ts +59 -0
  269. package/src/server/services/geo.ts +198 -0
  270. package/src/server/services/index.ts +48 -0
  271. package/src/server/services/pagination.ts +22 -0
  272. package/src/server/services/services.ts +13 -0
  273. package/src/server/time.ts +33 -0
  274. package/src/services/account-category-policy.ts +51 -0
  275. package/src/services/account-lifecycle/audit.ts +41 -0
  276. package/src/services/account-lifecycle/index.ts +940 -0
  277. package/src/services/account-lifecycle/ipa-backfill.ts +152 -0
  278. package/src/services/account-lifecycle/notification-sender.ts +13 -0
  279. package/src/services/account-lifecycle/scheduler.ts +506 -0
  280. package/src/services/account-model.ts +22 -0
  281. package/src/services/accounts/app.ts +1671 -0
  282. package/src/services/accounts/authz.ts +44 -0
  283. package/src/services/accounts/avatar.ts +120 -0
  284. package/src/services/accounts/base-group.ts +11 -0
  285. package/src/services/accounts/base-user.ts +46 -0
  286. package/src/services/accounts/duplicate-emails.ts +82 -0
  287. package/src/services/accounts/entities.ts +622 -0
  288. package/src/services/accounts/group-sql.ts +106 -0
  289. package/src/services/accounts/groups.ts +272 -0
  290. package/src/services/accounts/index.ts +14 -0
  291. package/src/services/accounts/ipa-data.ts +66 -0
  292. package/src/services/accounts/lifecycle.ts +2 -0
  293. package/src/services/accounts/local-groups.ts +499 -0
  294. package/src/services/accounts/model.ts +129 -0
  295. package/src/services/accounts/notification-sender.ts +31 -0
  296. package/src/services/accounts/posix.ts +386 -0
  297. package/src/services/accounts/request-policy.ts +11 -0
  298. package/src/services/accounts/switching.ts +126 -0
  299. package/src/services/accounts/users.ts +745 -0
  300. package/src/services/announcements/index.ts +224 -0
  301. package/src/services/app-approval.ts +498 -0
  302. package/src/services/audit/index.ts +438 -0
  303. package/src/services/auth-flows/index.ts +15 -0
  304. package/src/services/auth-flows/ipa.ts +197 -0
  305. package/src/services/auth-flows/magic-link.ts +185 -0
  306. package/src/services/auth-flows/notification-sender.ts +10 -0
  307. package/src/services/auth-flows/password-reset.ts +268 -0
  308. package/src/services/auth-flows/proxy-return.ts +49 -0
  309. package/src/services/document-extraction.ts +148 -0
  310. package/src/services/freeipa-config.ts +179 -0
  311. package/src/services/gateway.ts +186 -0
  312. package/src/services/identity/constants.ts +18 -0
  313. package/src/services/identity/index.ts +52 -0
  314. package/src/services/identity/invocation-actor.ts +120 -0
  315. package/src/services/identity/invocation-authority.ts +53 -0
  316. package/src/services/identity/invocation-operations.ts +15 -0
  317. package/src/services/identity/invocation-token.ts +276 -0
  318. package/src/services/identity/key-config.ts +41 -0
  319. package/src/services/identity/key-ring.ts +530 -0
  320. package/src/services/identity/metrics.ts +29 -0
  321. package/src/services/identity/routes.ts +18 -0
  322. package/src/services/identity/runtime-config.ts +88 -0
  323. package/src/services/identity/session-token.ts +152 -0
  324. package/src/services/identity/signer-refresh.ts +44 -0
  325. package/src/services/identity/workload-auth.ts +64 -0
  326. package/src/services/index.ts +187 -0
  327. package/src/services/ipa/auth.ts +216 -0
  328. package/src/services/ipa/connection.ts +57 -0
  329. package/src/services/ipa/effective-groups.ts +70 -0
  330. package/src/services/ipa/groups.ts +722 -0
  331. package/src/services/ipa/guard.ts +17 -0
  332. package/src/services/ipa/index.ts +17 -0
  333. package/src/services/ipa/posix.ts +19 -0
  334. package/src/services/ipa/profile.ts +132 -0
  335. package/src/services/ipa/runtime.ts +28 -0
  336. package/src/services/ipa/search.ts +154 -0
  337. package/src/services/ipa/service-account.ts +15 -0
  338. package/src/services/ipa/sync-planning.ts +100 -0
  339. package/src/services/ipa/sync.ts +862 -0
  340. package/src/services/ipa/users.ts +806 -0
  341. package/src/services/legal-consent.ts +76 -0
  342. package/src/services/logging/index.ts +477 -0
  343. package/src/services/logging/redaction.ts +20 -0
  344. package/src/services/logging/trace.ts +1231 -0
  345. package/src/services/mandates/index.ts +855 -0
  346. package/src/services/mandates/policy.ts +85 -0
  347. package/src/services/network-security.ts +31 -0
  348. package/src/services/notifications/batches.ts +722 -0
  349. package/src/services/notifications/browser.ts +252 -0
  350. package/src/services/notifications/catalog.ts +113 -0
  351. package/src/services/notifications/channels.ts +104 -0
  352. package/src/services/notifications/dispatcher.ts +139 -0
  353. package/src/services/notifications/email.ts +118 -0
  354. package/src/services/notifications/index.ts +633 -0
  355. package/src/services/notifications/live.ts +50 -0
  356. package/src/services/notifications/observability.ts +407 -0
  357. package/src/services/notifications/platform.ts +421 -0
  358. package/src/services/notifications/runtime.ts +120 -0
  359. package/src/services/notifications/user.ts +248 -0
  360. package/src/services/notifications/web-push-transport.ts +135 -0
  361. package/src/services/oauth-tokens.ts +209 -0
  362. package/src/services/outbox.ts +187 -0
  363. package/src/services/pdf/gotenberg.ts +290 -0
  364. package/src/services/pdf/index.ts +43 -0
  365. package/src/services/pdf/markdown.ts +209 -0
  366. package/src/services/pdf/template-preview.ts +122 -0
  367. package/src/services/postgres.ts +76 -0
  368. package/src/services/providers/index.ts +27 -0
  369. package/src/services/providers/local/auth.ts +51 -0
  370. package/src/services/providers/local/index.ts +4 -0
  371. package/src/services/providers/local/users.ts +263 -0
  372. package/src/services/rail-preferences.ts +27 -0
  373. package/src/services/runtime-lifecycle.ts +191 -0
  374. package/src/services/secrets.ts +10 -0
  375. package/src/services/service-account-credentials.ts +891 -0
  376. package/src/services/service-accounts.ts +184 -0
  377. package/src/services/session/index.ts +236 -0
  378. package/src/services/session/test-fixture.ts +18 -0
  379. package/src/services/session/user.ts +144 -0
  380. package/src/services/settings/api.ts +61 -0
  381. package/src/services/settings/app.ts +86 -0
  382. package/src/services/settings/core-settings.ts +796 -0
  383. package/src/services/settings/crypto.ts +69 -0
  384. package/src/services/settings/defaults.ts +374 -0
  385. package/src/services/settings/index.ts +215 -0
  386. package/src/services/settings/namespace.ts +9 -0
  387. package/src/services/settings/snapshot.ts +49 -0
  388. package/src/services/settings/store.ts +241 -0
  389. package/src/services/settings/templates.ts +4 -0
  390. package/src/services/sync-ops.ts +403 -0
  391. package/src/services/topic-cursor.ts +22 -0
  392. package/src/services/weather/forecast.ts +323 -0
  393. package/src/services/weather/geo.ts +119 -0
  394. package/src/services/weather/index.ts +67 -0
  395. package/src/services/weather/location.ts +24 -0
  396. package/src/services/weather/locations.ts +133 -0
  397. package/src/services/weather/migrate.ts +45 -0
  398. package/src/services/weather/settings.ts +66 -0
  399. package/src/services/weather/short-id.ts +57 -0
  400. package/src/services/weather/types.ts +61 -0
  401. package/src/services/weather/ui.ts +50 -0
  402. package/src/services/webauthn.ts +385 -0
  403. package/src/shared/account-action-notice.ts +70 -0
  404. package/src/shared/account-display.ts +15 -0
  405. package/src/shared/account-session.ts +15 -0
  406. package/src/shared/ai-platform-prompt.ts +134 -0
  407. package/src/shared/ai-usage.ts +49 -0
  408. package/src/shared/app-presentation.ts +48 -0
  409. package/src/shared/app-url.ts +12 -0
  410. package/src/shared/branding.ts +14 -0
  411. package/src/shared/capability-messages.ts +70 -0
  412. package/src/shared/email-html.ts +54 -0
  413. package/src/shared/format.ts +91 -0
  414. package/src/shared/help.ts +68 -0
  415. package/src/shared/icons.ts +400 -0
  416. package/src/shared/index.ts +54 -0
  417. package/src/shared/locale.ts +48 -0
  418. package/src/shared/login-method.ts +44 -0
  419. package/src/shared/markdown/client.ts +130 -0
  420. package/src/shared/markdown/extensions/code.ts +105 -0
  421. package/src/shared/markdown/extensions/guided-help.ts +100 -0
  422. package/src/shared/markdown/extensions/images.ts +79 -0
  423. package/src/shared/markdown/extensions/info-blocks.ts +97 -0
  424. package/src/shared/markdown/extensions/katex.ts +120 -0
  425. package/src/shared/markdown/extensions/links.ts +43 -0
  426. package/src/shared/markdown/extensions/mark.ts +48 -0
  427. package/src/shared/markdown/extensions/sub-sup.ts +60 -0
  428. package/src/shared/markdown/extensions/tables.ts +109 -0
  429. package/src/shared/markdown/extensions/task-list.ts +53 -0
  430. package/src/shared/markdown/formula.ts +1187 -0
  431. package/src/shared/markdown/index.ts +193 -0
  432. package/src/shared/markdown/shared.ts +36 -0
  433. package/src/shared/mock-cover.ts +130 -0
  434. package/src/shared/network-address.ts +106 -0
  435. package/src/shared/redirect.ts +56 -0
  436. package/src/shared/template-rendering.ts +140 -0
  437. package/src/shared/theme.ts +68 -0
  438. package/src/shared/time.ts +13 -0
  439. package/src/ssr/AdminLayout.tsx +53 -0
  440. package/src/ssr/AdminSidebar.tsx +50 -0
  441. package/src/ssr/AppLaunchpad.island.tsx +236 -0
  442. package/src/ssr/AppWorkspaceController.island.tsx +21 -0
  443. package/src/ssr/BrowserNotifications.island.tsx +135 -0
  444. package/src/ssr/GlobalAnnouncements.island.tsx +142 -0
  445. package/src/ssr/GlobalSearchDialog.behavior.test.tsx +96 -0
  446. package/src/ssr/GlobalSearchDialog.tsx +35 -0
  447. package/src/ssr/GlobalSearchHelpDialog.tsx +104 -0
  448. package/src/ssr/GlobalSearchTrigger.island.tsx +55 -0
  449. package/src/ssr/HotkeysHelpRail.island.tsx +55 -0
  450. package/src/ssr/Layout.render.test.tsx +148 -0
  451. package/src/ssr/Layout.tsx +292 -0
  452. package/src/ssr/LayoutBreadcrumbs.island.tsx +44 -0
  453. package/src/ssr/LayoutFooter.tsx +22 -0
  454. package/src/ssr/LayoutHeader.tsx +81 -0
  455. package/src/ssr/LayoutHelp.tsx +869 -0
  456. package/src/ssr/LayoutPreferences.island.tsx +36 -0
  457. package/src/ssr/LayoutRail.tsx +58 -0
  458. package/src/ssr/MinimalLayout.tsx +46 -0
  459. package/src/ssr/PageError.tsx +29 -0
  460. package/src/ssr/ProfilePreferences.island.tsx +92 -0
  461. package/src/ssr/RailApps.island.tsx +61 -0
  462. package/src/ssr/RailEditor.tsx +293 -0
  463. package/src/ssr/RegisteredHelpDocuments.island.tsx +3 -0
  464. package/src/ssr/TimezoneCookie.island.tsx +23 -0
  465. package/src/ssr/admin-active-link.ts +47 -0
  466. package/src/ssr/admin-navigation.ts +78 -0
  467. package/src/ssr/app-appearance.ts +23 -0
  468. package/src/ssr/app-navigation.ts +41 -0
  469. package/src/ssr/help-messages.ts +104 -0
  470. package/src/ssr/index.ts +14 -0
  471. package/src/ssr/islands/SearchBar.island.tsx +80 -0
  472. package/src/ssr/islands/index.ts +16 -0
  473. package/src/ssr/layout-context.ts +17 -0
  474. package/src/ssr/layout-help-markdown.ts +9 -0
  475. package/src/ssr/layout-help-navigation.ts +24 -0
  476. package/src/ssr/layout-help-url.ts +5 -0
  477. package/src/ssr/layout-runtime.ts +22 -0
  478. package/src/ssr/page-error-messages.ts +25 -0
  479. package/src/ssr/platform-messages.ts +135 -0
  480. package/src/ssr/preference-controller.ts +44 -0
  481. package/src/ssr/profile-preferences-messages.ts +29 -0
  482. package/src/ssr/rail-context.ts +21 -0
  483. package/src/ssr/rail-messages.ts +66 -0
  484. package/src/ssr/rail-navigation.ts +60 -0
  485. package/src/ssr/runtime.ts +31 -0
  486. package/src/ssr/url-filter.ts +127 -0
  487. package/src/styles/base-popover.css +36 -0
  488. package/src/styles/effects.css +851 -0
  489. package/src/styles/global.css +268 -0
  490. package/src/styles/input.css +58 -0
  491. package/src/styles/tokens.css +230 -0
  492. package/src/styles/utilities-buttons.css +405 -0
  493. package/src/styles/utilities-data.css +33 -0
  494. package/src/styles/utilities-feedback.css +232 -0
  495. package/src/styles/utilities-layout.css +603 -0
  496. package/src/styles/utilities-markdown-editor.css +525 -0
  497. package/src/styles/utilities-markdown-table.css +234 -0
  498. package/src/styles/utilities-navigation.css +1054 -0
  499. package/src/types/ambient.d.ts +24 -0
  500. package/src/workflows/ai/index.ts +17 -0
  501. package/src/workflows/ai/runtime.ts +286 -0
  502. package/src/workflows/ai/store.ts +314 -0
  503. package/src/workflows/ai/types.ts +111 -0
  504. package/src/workflows/ai-actions.ts +269 -0
  505. package/src/workflows/authoring.ts +88 -0
  506. package/src/workflows/builtins.ts +193 -0
  507. package/src/workflows/contracts.ts +280 -0
  508. package/src/workflows/definition.ts +334 -0
  509. package/src/workflows/editor.ts +113 -0
  510. package/src/workflows/index.ts +71 -0
  511. package/src/workflows/language/binder.ts +45 -0
  512. package/src/workflows/language/canonical.ts +29 -0
  513. package/src/workflows/language/compiler.ts +396 -0
  514. package/src/workflows/language/expressions.ts +34 -0
  515. package/src/workflows/language/index.ts +20 -0
  516. package/src/workflows/language/references.ts +55 -0
  517. package/src/workflows/language/schema.ts +134 -0
  518. package/src/workflows/language/strict-yaml.ts +131 -0
  519. package/src/workflows/manifest.ts +24 -0
  520. package/src/workflows/module.ts +12 -0
  521. package/src/workflows/runtime/coordinator.ts +115 -0
  522. package/src/workflows/runtime/executor.ts +1003 -0
  523. package/src/workflows/runtime/index.ts +60 -0
  524. package/src/workflows/runtime/instant.ts +8 -0
  525. package/src/workflows/runtime/ports.ts +213 -0
  526. package/src/workflows/runtime/schedule.ts +203 -0
  527. package/src/workflows/runtime/trigger.ts +37 -0
  528. package/src/workflows/runtime/wake.ts +13 -0
  529. package/src/workflows/store/actions.ts +438 -0
  530. package/src/workflows/store/budget.ts +145 -0
  531. package/src/workflows/store/definitions.ts +345 -0
  532. package/src/workflows/store/events.ts +383 -0
  533. package/src/workflows/store/index.ts +107 -0
  534. package/src/workflows/store/observability.ts +594 -0
  535. package/src/workflows/store/runs.ts +975 -0
  536. package/src/workflows/store/transaction.ts +23 -0
  537. package/src/workflows/store/worker.ts +439 -0
  538. package/src/workflows/testing/conformance.ts +72 -0
  539. package/src/workflows/testing/index.ts +11 -0
  540. package/src/workflows/testing/process-fixtures.ts +275 -0
@@ -0,0 +1,280 @@
1
+ export type WorkflowJsonPrimitive = string | number | boolean | null;
2
+ export type WorkflowJsonValue = WorkflowJsonPrimitive | WorkflowJsonValue[] | { [key: string]: WorkflowJsonValue };
3
+ export type WorkflowRevision = string;
4
+
5
+ export type WorkflowSourceLocation = {
6
+ offset: number;
7
+ line: number;
8
+ column: number;
9
+ };
10
+
11
+ export type WorkflowDiagnostic = {
12
+ code: string;
13
+ message: string;
14
+ severity: "error" | "warning";
15
+ path: Array<string | number>;
16
+ location?: WorkflowSourceLocation;
17
+ };
18
+
19
+ type WorkflowSchemaBase = {
20
+ optional?: boolean;
21
+ description?: string;
22
+ };
23
+
24
+ export type WorkflowFieldSchema =
25
+ | (WorkflowSchemaBase & {
26
+ kind: "string";
27
+ enum?: string[];
28
+ minLength?: number;
29
+ maxLength?: number;
30
+ format?: "identifier" | "uri";
31
+ })
32
+ | (WorkflowSchemaBase & {
33
+ kind: "number";
34
+ integer?: boolean;
35
+ minimum?: number;
36
+ maximum?: number;
37
+ })
38
+ | (WorkflowSchemaBase & { kind: "boolean" })
39
+ | (WorkflowSchemaBase & { kind: "value" })
40
+ | (WorkflowSchemaBase & { kind: "array"; items: WorkflowFieldSchema; minItems?: number; maxItems?: number })
41
+ | (WorkflowSchemaBase & {
42
+ kind: "record";
43
+ values: WorkflowFieldSchema;
44
+ minProperties?: number;
45
+ maxProperties?: number;
46
+ })
47
+ | (WorkflowSchemaBase & { kind: "object"; properties: Record<string, WorkflowFieldSchema> })
48
+ | (WorkflowSchemaBase & { kind: "union"; variants: WorkflowFieldSchema[] });
49
+
50
+ export type WorkflowDescriptorDocs = {
51
+ label: string;
52
+ description: string;
53
+ snippet?: string;
54
+ };
55
+
56
+ export type WorkflowInputDescriptor = WorkflowDescriptorDocs & {
57
+ kind: string;
58
+ config: WorkflowFieldSchema & { kind: "object" };
59
+ valueType: string;
60
+ };
61
+
62
+ export type WorkflowTriggerDescriptor = WorkflowDescriptorDocs & {
63
+ kind: string;
64
+ config: WorkflowFieldSchema & { kind: "object" };
65
+ eventValues: Record<string, string>;
66
+ };
67
+
68
+ export type WorkflowActionEffect = "pure" | "transactional" | "durable-intent" | "ambiguous-external";
69
+
70
+ export type WorkflowActionDescriptor = WorkflowDescriptorDocs & {
71
+ kind: string;
72
+ config: WorkflowFieldSchema & { kind: "object" };
73
+ effect: WorkflowActionEffect;
74
+ outputType?: string;
75
+ dryRun: "full" | "validate" | "unsupported";
76
+ };
77
+
78
+ export type WorkflowActionPolicy = Pick<WorkflowActionDescriptor, "effect" | "dryRun">;
79
+
80
+ export type WorkflowLanguageManifest = {
81
+ id: string;
82
+ version: number;
83
+ inputs: WorkflowInputDescriptor[];
84
+ triggers: WorkflowTriggerDescriptor[];
85
+ actions: WorkflowActionDescriptor[];
86
+ limits?: {
87
+ maxInputs?: number;
88
+ maxSteps?: number;
89
+ maxDepth?: number;
90
+ maxConditions?: number;
91
+ maxConditionDepth?: number;
92
+ maxLoopItems?: number;
93
+ };
94
+ };
95
+
96
+ export type WorkflowIrInput = {
97
+ name: string;
98
+ type: string;
99
+ config: Record<string, WorkflowJsonValue>;
100
+ };
101
+
102
+ export type WorkflowIrTrigger = {
103
+ kind: string;
104
+ config: Record<string, WorkflowJsonValue>;
105
+ with: Record<string, WorkflowJsonValue>;
106
+ };
107
+
108
+ export type WorkflowCondition =
109
+ | { operator: "equals" | "notEquals"; operands: [WorkflowJsonValue, WorkflowJsonValue] }
110
+ | { operator: "includes"; operands: [WorkflowJsonValue, WorkflowJsonValue] }
111
+ | { operator: "textEquals" | "contains" | "startsWith" | "endsWith"; operands: [WorkflowJsonValue, WorkflowJsonValue] }
112
+ | { operator: "exists"; reference: string }
113
+ | { operator: "all"; conditions: WorkflowCondition[] }
114
+ | { operator: "any"; conditions: WorkflowCondition[] }
115
+ | { operator: "not"; condition: WorkflowCondition };
116
+
117
+ export type WorkflowIrStep =
118
+ | { kind: "action"; action: string; config: Record<string, WorkflowJsonValue>; sourcePath: Array<string | number> }
119
+ | {
120
+ kind: "if";
121
+ condition: WorkflowCondition;
122
+ then: WorkflowIrStep[];
123
+ else: WorkflowIrStep[];
124
+ sourcePath: Array<string | number>;
125
+ }
126
+ | {
127
+ kind: "switch";
128
+ value: WorkflowJsonValue;
129
+ cases: Array<{ when: WorkflowJsonValue; steps: WorkflowIrStep[] }>;
130
+ default: WorkflowIrStep[];
131
+ sourcePath: Array<string | number>;
132
+ }
133
+ | {
134
+ kind: "forEach";
135
+ reference: string;
136
+ alias: string;
137
+ steps: WorkflowIrStep[];
138
+ sourcePath: Array<string | number>;
139
+ };
140
+
141
+ export type WorkflowIr = {
142
+ schemaVersion: 1;
143
+ languageId: string;
144
+ languageVersion: number;
145
+ sourceHash: string;
146
+ manifestHash: string;
147
+ inputs: WorkflowIrInput[];
148
+ triggers: WorkflowIrTrigger[];
149
+ steps: WorkflowIrStep[];
150
+ sourceLocations: Record<string, WorkflowSourceLocation>;
151
+ };
152
+
153
+ export type WorkflowBoundPlan = {
154
+ schemaVersion: 2;
155
+ languageId: string;
156
+ languageVersion: number;
157
+ sourceHash: string;
158
+ manifestHash: string;
159
+ catalogHash: string;
160
+ maxLoopItems?: number;
161
+ actionPolicies: Record<string, WorkflowActionPolicy>;
162
+ inputs: WorkflowIrInput[];
163
+ triggers: WorkflowIrTrigger[];
164
+ steps: WorkflowIrStep[];
165
+ bindings: Record<string, WorkflowJsonValue>;
166
+ };
167
+
168
+ export type WorkflowActor = {
169
+ userId?: string | null;
170
+ serviceAccountId?: string | null;
171
+ groupIds?: string[];
172
+ };
173
+
174
+ export type WorkflowInvocationMode = "execute" | "dryRun";
175
+
176
+ export type WorkflowInvocation<Channel extends string = string> = {
177
+ workflowId: string;
178
+ expectedRevision?: WorkflowRevision;
179
+ mode: WorkflowInvocationMode;
180
+ channel: Channel;
181
+ actor: WorkflowActor;
182
+ inputs: Record<string, WorkflowJsonValue>;
183
+ idempotencyKey: string;
184
+ occurredAt: string;
185
+ context?: Record<string, WorkflowJsonValue>;
186
+ };
187
+
188
+ export type WorkflowLauncher<Config extends WorkflowJsonValue = WorkflowJsonValue> = {
189
+ id: string;
190
+ workflowId: string;
191
+ kind: string;
192
+ name: string;
193
+ enabled: boolean;
194
+ config: Config;
195
+ validatedRevision?: WorkflowRevision;
196
+ diagnostics: WorkflowDiagnostic[];
197
+ };
198
+
199
+ export type WorkflowInvocationReceipt = {
200
+ runId: string;
201
+ workflowId: string;
202
+ revision: WorkflowRevision;
203
+ mode: WorkflowInvocationMode;
204
+ channel: string;
205
+ created: boolean;
206
+ status: WorkflowRunState;
207
+ };
208
+
209
+ export type WorkflowStepState =
210
+ | "running"
211
+ | "completed"
212
+ | "waiting"
213
+ | "failed"
214
+ | "needs_attention"
215
+ | "terminal"
216
+ | "planned"
217
+ | "unsupported"
218
+ | "indeterminate"
219
+ | "canceled";
220
+ export type WorkflowRunState = "queued" | "running" | "waiting" | "succeeded" | "failed" | "canceled" | "needs_attention";
221
+
222
+ export type WorkflowExecutionError = {
223
+ code: string;
224
+ message: string;
225
+ retryable: boolean;
226
+ details?: Record<string, WorkflowJsonValue>;
227
+ };
228
+
229
+ export type WorkflowDependency = {
230
+ kind: string;
231
+ key: string;
232
+ deadline?: string;
233
+ data?: Record<string, WorkflowJsonValue>;
234
+ };
235
+
236
+ export type WorkflowControlTraversal =
237
+ | { kind: "if"; branches: Array<"then" | "else"> }
238
+ | { kind: "switch"; branches: Array<number | "default"> }
239
+ | { kind: "forEach"; items: WorkflowJsonValue[] };
240
+
241
+ export type WorkflowStepOutcome =
242
+ | { state: "completed"; output?: WorkflowJsonValue; control?: WorkflowControlTraversal }
243
+ | { state: "waiting"; dependency: WorkflowDependency }
244
+ | { state: "failed"; error: WorkflowExecutionError }
245
+ | { state: "needs_attention"; error: WorkflowExecutionError }
246
+ | { state: "terminal"; status: "succeeded" | "canceled"; message?: string };
247
+
248
+ export type WorkflowPlanningIssue = {
249
+ state: "unsupported" | "indeterminate";
250
+ reason: string;
251
+ step: {
252
+ key: string;
253
+ sourcePath: Array<string | number>;
254
+ iterationPath: number[];
255
+ path: Array<string | number>;
256
+ kind: WorkflowIrStep["kind"];
257
+ action?: string;
258
+ };
259
+ };
260
+
261
+ export type WorkflowPlanningOutcome =
262
+ | {
263
+ state: "planned";
264
+ output?: WorkflowJsonValue;
265
+ control?: WorkflowControlTraversal;
266
+ effects: WorkflowJsonValue[];
267
+ issues?: WorkflowPlanningIssue[];
268
+ }
269
+ | {
270
+ state: "terminal";
271
+ status: "succeeded" | "failed";
272
+ message?: string;
273
+ effects: WorkflowJsonValue[];
274
+ issues?: WorkflowPlanningIssue[];
275
+ }
276
+ | { state: "unsupported"; reason: string }
277
+ | { state: "indeterminate"; reason: string }
278
+ | { state: "canceled"; message?: string };
279
+
280
+ export const workflowPathKey = (path: Array<string | number>): string => path.map(String).join(".");
@@ -0,0 +1,334 @@
1
+ /**
2
+ * The surface an app declares in `src/workflows.ts`.
3
+ *
4
+ * Today an action exists in three places: a descriptor in the app's
5
+ * `manifest.ts` (what the workflow language accepts), a binder that resolves
6
+ * the written config into domain objects, and an implementation with its own
7
+ * hand-written parameter type. Nothing connects them, so a descriptor and its
8
+ * implementation can disagree and only fail at runtime.
9
+ *
10
+ * Here an action is one declaration. The config schema drives both the
11
+ * language and the implementation's parameter type, so a change to either side
12
+ * is a compile error rather than a production surprise.
13
+ *
14
+ * Mirrors the notifications declaration style deliberately — one file at the
15
+ * app root, with types inferred rather than restated. Workflow worker wiring is
16
+ * explicit; `defineApp` does not consume these declarations.
17
+ */
18
+ import type { SQL } from "bun";
19
+ import type { WorkflowActionEffect, WorkflowDependency, WorkflowFieldSchema, WorkflowInvocation, WorkflowJsonValue } from "./contracts";
20
+
21
+ // ─── Config type inference ───────────────────────────────────────────────────
22
+
23
+ type ObjectSchema = WorkflowFieldSchema & { kind: "object" };
24
+
25
+ /** Keys whose schema is marked optional, so they become optional properties. */
26
+ type OptionalKeys<P extends Record<string, WorkflowFieldSchema>> = {
27
+ [K in keyof P]: P[K] extends { optional: true } ? K : never;
28
+ }[keyof P];
29
+
30
+ /**
31
+ * The TypeScript value a field schema describes.
32
+ *
33
+ * The workflow language needs a runtime schema so the editor can render a form
34
+ * and the compiler can validate what a user wrote; the implementation needs a
35
+ * static type. Deriving the second from the first is what keeps them from
36
+ * drifting.
37
+ */
38
+ export type FromFieldSchema<S extends WorkflowFieldSchema> = S extends { kind: "string"; enum: readonly (infer E extends string)[] }
39
+ ? E
40
+ : S extends { kind: "string" }
41
+ ? string
42
+ : S extends { kind: "number" }
43
+ ? number
44
+ : S extends { kind: "boolean" }
45
+ ? boolean
46
+ : S extends { kind: "value" }
47
+ ? WorkflowJsonValue
48
+ : S extends { kind: "array"; items: infer I extends WorkflowFieldSchema }
49
+ ? FromFieldSchema<I>[]
50
+ : S extends { kind: "record"; values: infer V extends WorkflowFieldSchema }
51
+ ? Record<string, FromFieldSchema<V>>
52
+ : S extends { kind: "union"; variants: readonly (infer V extends WorkflowFieldSchema)[] }
53
+ ? FromFieldSchema<V>
54
+ : S extends { kind: "object"; properties: infer P extends Record<string, WorkflowFieldSchema> }
55
+ ? FromObjectSchema<P>
56
+ : never;
57
+
58
+ /**
59
+ * Flattens an intersection into a single object type.
60
+ *
61
+ * Required and optional properties have to be built separately and combined,
62
+ * but the raw `A & B` shows up verbatim in editor tooltips and in every error
63
+ * message. Collapsing it is what makes the inferred config readable at the
64
+ * call site.
65
+ */
66
+ type Simplify<T> = { [K in keyof T]: T[K] } & {};
67
+
68
+ type FromObjectSchema<P extends Record<string, WorkflowFieldSchema>> = Simplify<
69
+ {
70
+ [K in Exclude<keyof P, OptionalKeys<P>>]: FromFieldSchema<P[K]>;
71
+ } & {
72
+ [K in OptionalKeys<P>]?: FromFieldSchema<P[K]>;
73
+ }
74
+ >;
75
+
76
+ // ─── Effect ladder ───────────────────────────────────────────────────────────
77
+
78
+ /**
79
+ * How an action behaves when a run is replayed after a crash.
80
+ *
81
+ * Named for the property an action author can answer about their own code,
82
+ * not for the mechanism the kernel uses. The one question underneath: if the
83
+ * process dies between performing the effect and recording that it happened,
84
+ * can we tell afterwards?
85
+ *
86
+ * - `pure` deterministic given inputs and prior outcomes. Note that a
87
+ * step which *reads* mutable state is not pure: a replay
88
+ * sees something else. This is the classic mistake.
89
+ * - `transactional` commits inside the journal's own transaction, so a crash
90
+ * means it did not happen.
91
+ * - `idempotent` external, but safe to repeat under a key.
92
+ * - `ambiguous` external and not verifiable in advance. Needs a way to ask
93
+ * afterwards, or it escalates to a human.
94
+ */
95
+ export type WorkflowEffectClass = "pure" | "transactional" | "idempotent" | "ambiguous";
96
+
97
+ /** Maps the ladder onto the language-level effect the compiler already knows. */
98
+ export const LANGUAGE_EFFECT: Record<WorkflowEffectClass, WorkflowActionEffect> = {
99
+ pure: "pure",
100
+ transactional: "transactional",
101
+ idempotent: "durable-intent",
102
+ ambiguous: "ambiguous-external",
103
+ };
104
+
105
+ /** Whether a class may be re-executed when a replay finds no recorded outcome. */
106
+ export const isReplayable = (effect: WorkflowEffectClass): boolean => effect !== "ambiguous";
107
+
108
+ // ─── Action outcomes ─────────────────────────────────────────────────────────
109
+
110
+ /**
111
+ * How a failure is described to the run.
112
+ *
113
+ * `code` is what an operator reads in the run view to tell "the template was
114
+ * deleted" from "you may not do this"; a message alone reads the same in both
115
+ * cases. `retryable` says the attempt failed, not the work — the runtime then
116
+ * retries the step instead of ending the run, and a mail provider being briefly
117
+ * unreachable stops costing a run.
118
+ */
119
+ type WorkflowActionFailure = { message: string; code?: string; retryable?: boolean };
120
+
121
+ /**
122
+ * What an action reports back.
123
+ *
124
+ * `ambiguous` is a first-class result rather than a thrown error: "the send may
125
+ * have gone through" is not a failure, and treating it as one either loses
126
+ * messages or sends them twice. `waiting` means no effect happened; an action
127
+ * that may already have acted must report `ambiguous` instead.
128
+ */
129
+ export type WorkflowActionResult<Output> =
130
+ | { state: "succeeded"; output: Output }
131
+ | { state: "waiting"; dependency: WorkflowDependency }
132
+ | ({ state: "failed" } & WorkflowActionFailure)
133
+ | ({ state: "ambiguous"; evidence?: WorkflowJsonValue } & WorkflowActionFailure);
134
+
135
+ /** What a dry run reports: what *would* happen, without doing it. */
136
+ export type WorkflowPlannedEffect = {
137
+ /** Human-readable summary shown in the dry-run view. */
138
+ summary: string;
139
+ /** Counts consumed from the effect budget, keyed by budget dimension. */
140
+ consumes?: Record<string, number>;
141
+ /**
142
+ * What the step would produce.
143
+ *
144
+ * Later steps plan against it, so a dry run of a whole plan stays useful past
145
+ * its first impure step. Mark synthetic values as such — a downstream step
146
+ * that cannot tell a planned record from a real one will act on a fiction.
147
+ */
148
+ output?: WorkflowJsonValue;
149
+ /** Why the plan is not fully determined — surfaced in the dry-run view. */
150
+ issues?: string[];
151
+ };
152
+
153
+ /** Result of asking an external system whether an ambiguous effect landed. */
154
+ export type WorkflowReconcileResult<Output> =
155
+ | { state: "succeeded"; output: Output }
156
+ | ({ state: "failed" } & WorkflowActionFailure)
157
+ | ({ state: "unknown" } & WorkflowActionFailure);
158
+
159
+ // ─── Action context ──────────────────────────────────────────────────────────
160
+
161
+ export type WorkflowActionContext = {
162
+ /** Identifies the run this step belongs to, for logging and correlation. */
163
+ runId: string;
164
+ /** Identifies the step within the run. Stable across replays. */
165
+ stepKey: string;
166
+ /**
167
+ * What started this run: who it acts as, what it was given, and the app's own
168
+ * context from the event.
169
+ *
170
+ * An action that touches anything permissioned needs the actor, and one that
171
+ * works inside a scope — a base, a mailbox — reads it from the context the
172
+ * emitter attached. Without this every implementation would have to re-read
173
+ * the run to find out who it is.
174
+ */
175
+ invocation: WorkflowInvocation;
176
+ /**
177
+ * The identity the compiler pinned for a config path, relative to this step.
178
+ *
179
+ * A source names a table or a template by the name a person typed; publishing
180
+ * resolves that to an id and freezes it in the plan. Reading the name again at
181
+ * run time would follow a rename to a different object, which is the whole
182
+ * reason binding happens once, at publish.
183
+ */
184
+ binding(...path: Array<string | number>): WorkflowJsonValue | undefined;
185
+ /**
186
+ * Resolves a value reference the config names — `record: order` — to the value
187
+ * it stands for.
188
+ *
189
+ * Distinct from the resolved config: a reference is not an expression, so it
190
+ * survives config resolution verbatim and the action decides what it must be.
191
+ */
192
+ resolveReference(reference: string, ...path: Array<string | number>): Promise<WorkflowJsonValue | undefined>;
193
+ /** Current named workflow values, including outputs saved by earlier steps. */
194
+ variableSnapshot(): Record<string, WorkflowJsonValue>;
195
+ /**
196
+ * The transaction a transactional action runs in.
197
+ *
198
+ * Present only for that class, and it is the whole meaning of the class: the
199
+ * work and the record that it happened commit together, so a crash leaves
200
+ * neither. Do the work on this handle, not on the ambient connection.
201
+ */
202
+ tx?: SQL;
203
+ /** Stable across replays of the same step — the key an idempotent effect uses. */
204
+ effectKey: string;
205
+ /** Keeps a long-running action's lease alive. */
206
+ heartbeat(): Promise<void>;
207
+ };
208
+
209
+ // ─── Action definition ───────────────────────────────────────────────────────
210
+
211
+ type RunHook<Config, Output> = (ctx: WorkflowActionContext, config: Config) => Promise<WorkflowActionResult<Output>>;
212
+ /**
213
+ * Re-checks permission at the moment of the effect.
214
+ *
215
+ * Access can be revoked between the run being queued and the step running, and
216
+ * for a transactional action the check has to happen on the same handle as the
217
+ * work or it is checking a world the write will not see.
218
+ */
219
+ type AuthorizeHook<Config> = (ctx: WorkflowActionContext, config: Config) => Promise<boolean>;
220
+ type PlanHook<Config> = (ctx: WorkflowActionContext, config: Config) => Promise<WorkflowPlannedEffect>;
221
+
222
+ /**
223
+ * `NoInfer` because `run` alone defines what an action produces. Reconcile
224
+ * only answers whether that output already landed, so letting it propose its
225
+ * own candidate is wrong on the contract — and, in practice, inferring one
226
+ * type variable from two hooks at once exceeded the checker's recursion depth.
227
+ */
228
+ type ReconcileHook<Output> = (ctx: WorkflowActionContext, effectKey: string) => Promise<WorkflowReconcileResult<NoInfer<Output>>>;
229
+
230
+ export type WorkflowActionDefinition<Effect extends WorkflowEffectClass, Schema extends ObjectSchema, Output> = {
231
+ label: string;
232
+ description: string;
233
+ effect: Effect;
234
+ /** Drives the language, the editor form, and the implementation's parameter type. */
235
+ config: Schema;
236
+ /** Named output type for the language, when other steps reference this result. */
237
+ outputType?: string;
238
+ run: RunHook<FromFieldSchema<Schema>, Output>;
239
+ /** What a dry run reports. Required for everything that leaves the process. */
240
+ plan?: PlanHook<FromFieldSchema<Schema>>;
241
+ /** Asks afterwards whether an ambiguous effect landed. */
242
+ reconcile?: ReconcileHook<Output>;
243
+ /** Re-checks permission at the moment of the effect, on the effect's own handle. */
244
+ authorize?: AuthorizeHook<FromFieldSchema<Schema>>;
245
+ };
246
+
247
+ /** The fields every action declares, whatever its effect class. */
248
+ type ActionBase<Schema extends ObjectSchema> = {
249
+ label: string;
250
+ description: string;
251
+ config: Schema;
252
+ outputType?: string;
253
+ };
254
+
255
+ /**
256
+ * Declares one action, picking the factory that matches its effect class.
257
+ *
258
+ * The class decides which hooks are mandatory: a pure action cannot reconcile
259
+ * because there is nothing to reconcile, an ambiguous one must or an
260
+ * interrupted run has no way back, and anything that leaves the process must
261
+ * plan or a dry run silently under-reports. Naming the class at the call site
262
+ * makes each of those a concrete parameter type rather than a conditional one,
263
+ * so a missing hook is reported as a missing property — and the config type
264
+ * still flows into `run` without being restated.
265
+ *
266
+ * (The conditional-type version of this was also, in the literal sense,
267
+ * uncheckable: resolving a single call exceeded the compiler's recursion
268
+ * depth, because `WorkflowFieldSchema` is recursive.)
269
+ */
270
+ export const workflowAction = {
271
+ /** Deterministic given inputs and prior outcomes. Reading mutable state is not pure. */
272
+ pure: <const Schema extends ObjectSchema, Output = void>(
273
+ definition: ActionBase<Schema> & {
274
+ run: RunHook<FromFieldSchema<Schema>, Output>;
275
+ },
276
+ ): WorkflowActionDefinition<"pure", Schema, Output> => ({ ...definition, effect: "pure" }),
277
+
278
+ /** Commits inside the journal's transaction, so a crash means it did not happen. */
279
+ transactional: <const Schema extends ObjectSchema, Output = void>(
280
+ definition: ActionBase<Schema> & {
281
+ run: RunHook<FromFieldSchema<Schema>, Output>;
282
+ plan: PlanHook<FromFieldSchema<Schema>>;
283
+ authorize?: AuthorizeHook<FromFieldSchema<Schema>>;
284
+ },
285
+ ): WorkflowActionDefinition<"transactional", Schema, Output> => ({ ...definition, effect: "transactional" }),
286
+
287
+ /** External, but safe to repeat under `ctx.effectKey`. */
288
+ idempotent: <const Schema extends ObjectSchema, Output = void>(
289
+ definition: ActionBase<Schema> & {
290
+ run: RunHook<FromFieldSchema<Schema>, Output>;
291
+ plan: PlanHook<FromFieldSchema<Schema>>;
292
+ authorize?: AuthorizeHook<FromFieldSchema<Schema>>;
293
+ },
294
+ ): WorkflowActionDefinition<"idempotent", Schema, Output> => ({ ...definition, effect: "idempotent" }),
295
+
296
+ /** External and not verifiable in advance, so it must be answerable afterwards. */
297
+ ambiguous: <const Schema extends ObjectSchema, Output = void>(
298
+ definition: ActionBase<Schema> & {
299
+ run: RunHook<FromFieldSchema<Schema>, Output>;
300
+ plan: PlanHook<FromFieldSchema<Schema>>;
301
+ reconcile: ReconcileHook<Output>;
302
+ authorize?: AuthorizeHook<FromFieldSchema<Schema>>;
303
+ },
304
+ ): WorkflowActionDefinition<"ambiguous", Schema, Output> => ({ ...definition, effect: "ambiguous" }),
305
+ };
306
+
307
+ // ─── App module ──────────────────────────────────────────────
308
+
309
+ /**
310
+ * An action with its config type erased — the view the kernel works against.
311
+ *
312
+ * `FromFieldSchema` may only be instantiated with a *literal* schema. Applied
313
+ * to the `WorkflowFieldSchema` union itself it never terminates, because the
314
+ * union is recursive: an object's properties are again the full union. So the
315
+ * erased form is spelled out rather than derived, and it is the honest shape
316
+ * anyway — at runtime the kernel holds a schema it validates against and a
317
+ * config it cannot know statically.
318
+ *
319
+ * Declaration sites keep their precise types: `workflowAction` infers them, and
320
+ * a map of such calls stays inferred as its concrete literal type.
321
+ */
322
+ export type ErasedWorkflowAction = {
323
+ label: string;
324
+ description: string;
325
+ effect: WorkflowEffectClass;
326
+ config: ObjectSchema;
327
+ outputType?: string;
328
+ run: RunHook<never, unknown>;
329
+ plan?: PlanHook<never>;
330
+ reconcile?: ReconcileHook<unknown>;
331
+ authorize?: AuthorizeHook<never>;
332
+ };
333
+
334
+ export type WorkflowActionMap = Record<string, ErasedWorkflowAction>;