dotdo 0.0.1 → 0.1.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 (667) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +446 -315
  3. package/cli/README.md +238 -0
  4. package/cli/agent.ts +72 -0
  5. package/cli/bin.js +44 -0
  6. package/cli/bin.ts +38 -0
  7. package/cli/build.ts +157 -0
  8. package/cli/commands/auth/login.ts +14 -0
  9. package/cli/commands/auth/logout.ts +6 -0
  10. package/cli/commands/auth/whoami.ts +16 -0
  11. package/cli/commands/deploy-multi.ts +245 -0
  12. package/cli/commands/dev/deploy.ts +100 -0
  13. package/cli/commands/dev/dev.ts +95 -0
  14. package/cli/commands/dev/logs.ts +91 -0
  15. package/cli/commands/dev-local.ts +88 -0
  16. package/cli/commands/do-ops.ts +314 -0
  17. package/cli/commands/index.ts +100 -0
  18. package/cli/commands/init.ts +247 -0
  19. package/cli/commands/introspect/emitter.ts +315 -0
  20. package/cli/commands/introspect/index.ts +193 -0
  21. package/cli/commands/link.ts +598 -0
  22. package/cli/commands/snippets.ts +415 -0
  23. package/cli/commands/tunnel.ts +239 -0
  24. package/cli/device-auth.ts +289 -0
  25. package/cli/fallback.ts +12 -0
  26. package/cli/index.ts +121 -0
  27. package/cli/main.ts +246 -0
  28. package/cli/mcp-stdio.ts +790 -0
  29. package/cli/package.json +62 -0
  30. package/cli/runtime/do-registry.ts +193 -0
  31. package/cli/runtime/embedded-db.ts +344 -0
  32. package/cli/runtime/index.ts +9 -0
  33. package/cli/runtime/miniflare-adapter.ts +162 -0
  34. package/cli/sandbox.ts +82 -0
  35. package/cli/src/args.ts +174 -0
  36. package/cli/src/auth.ts +55 -0
  37. package/cli/src/commands/call.ts +84 -0
  38. package/cli/src/commands/charge.ts +96 -0
  39. package/cli/src/commands/config.ts +115 -0
  40. package/cli/src/commands/email.ts +112 -0
  41. package/cli/src/commands/llm.ts +115 -0
  42. package/cli/src/commands/queue.ts +134 -0
  43. package/cli/src/commands/text.ts +86 -0
  44. package/cli/src/config.ts +185 -0
  45. package/cli/src/output.ts +246 -0
  46. package/cli/src/rpc.ts +192 -0
  47. package/cli/utils/config.ts +282 -0
  48. package/cli/utils/detect.ts +73 -0
  49. package/cli/utils/index.ts +15 -0
  50. package/cli/utils/logger.ts +232 -0
  51. package/dist/ai/index.js +19 -0
  52. package/dist/ai/index.js.map +1 -0
  53. package/dist/ai/template-literals.js +852 -0
  54. package/dist/ai/template-literals.js.map +1 -0
  55. package/dist/api/middleware/auth-federation.js +573 -0
  56. package/dist/api/middleware/auth-federation.js.map +1 -0
  57. package/dist/api/middleware/auth.js +545 -0
  58. package/dist/api/middleware/auth.js.map +1 -0
  59. package/dist/db/actions.js +212 -0
  60. package/dist/db/actions.js.map +1 -0
  61. package/dist/db/auth.js +506 -0
  62. package/dist/db/auth.js.map +1 -0
  63. package/dist/db/branches.js +65 -0
  64. package/dist/db/branches.js.map +1 -0
  65. package/dist/db/clickhouse.js +1074 -0
  66. package/dist/db/clickhouse.js.map +1 -0
  67. package/dist/db/dlq.js +39 -0
  68. package/dist/db/dlq.js.map +1 -0
  69. package/dist/db/events.js +28 -0
  70. package/dist/db/events.js.map +1 -0
  71. package/dist/db/exec.js +64 -0
  72. package/dist/db/exec.js.map +1 -0
  73. package/dist/db/files.js +85 -0
  74. package/dist/db/files.js.map +1 -0
  75. package/dist/db/flags.js +24 -0
  76. package/dist/db/flags.js.map +1 -0
  77. package/dist/db/git.js +116 -0
  78. package/dist/db/git.js.map +1 -0
  79. package/dist/db/iceberg/inverted-index.js +862 -0
  80. package/dist/db/iceberg/inverted-index.js.map +1 -0
  81. package/dist/db/iceberg/puffin.js +878 -0
  82. package/dist/db/iceberg/puffin.js.map +1 -0
  83. package/dist/db/iceberg/search-manifest.js +422 -0
  84. package/dist/db/iceberg/search-manifest.js.map +1 -0
  85. package/dist/db/iceberg/types.js +8 -0
  86. package/dist/db/iceberg/types.js.map +1 -0
  87. package/dist/db/index.js +121 -0
  88. package/dist/db/index.js.map +1 -0
  89. package/dist/db/integrations.js +368 -0
  90. package/dist/db/integrations.js.map +1 -0
  91. package/dist/db/json-indexes.js +332 -0
  92. package/dist/db/json-indexes.js.map +1 -0
  93. package/dist/db/linked-accounts.js +287 -0
  94. package/dist/db/linked-accounts.js.map +1 -0
  95. package/dist/db/nouns.js +183 -0
  96. package/dist/db/nouns.js.map +1 -0
  97. package/dist/db/objects.js +170 -0
  98. package/dist/db/objects.js.map +1 -0
  99. package/dist/db/primitives/dag-scheduler/index.js +869 -0
  100. package/dist/db/primitives/dag-scheduler/index.js.map +1 -0
  101. package/dist/db/primitives/exactly-once-context.js +237 -0
  102. package/dist/db/primitives/exactly-once-context.js.map +1 -0
  103. package/dist/db/primitives/index.js +62 -0
  104. package/dist/db/primitives/index.js.map +1 -0
  105. package/dist/db/primitives/keyed-router.js +145 -0
  106. package/dist/db/primitives/keyed-router.js.map +1 -0
  107. package/dist/db/primitives/observability.js +162 -0
  108. package/dist/db/primitives/observability.js.map +1 -0
  109. package/dist/db/primitives/schema-evolution.js +643 -0
  110. package/dist/db/primitives/schema-evolution.js.map +1 -0
  111. package/dist/db/primitives/stateful-operator/index.js +770 -0
  112. package/dist/db/primitives/stateful-operator/index.js.map +1 -0
  113. package/dist/db/primitives/temporal-store.js +306 -0
  114. package/dist/db/primitives/temporal-store.js.map +1 -0
  115. package/dist/db/primitives/typed-column-store.js +1229 -0
  116. package/dist/db/primitives/typed-column-store.js.map +1 -0
  117. package/dist/db/primitives/utils/duration.js +162 -0
  118. package/dist/db/primitives/utils/duration.js.map +1 -0
  119. package/dist/db/primitives/utils/murmur3.js +116 -0
  120. package/dist/db/primitives/utils/murmur3.js.map +1 -0
  121. package/dist/db/primitives/watermark-service.js +136 -0
  122. package/dist/db/primitives/watermark-service.js.map +1 -0
  123. package/dist/db/primitives/window-manager.js +764 -0
  124. package/dist/db/primitives/window-manager.js.map +1 -0
  125. package/dist/db/relationships.js +66 -0
  126. package/dist/db/relationships.js.map +1 -0
  127. package/dist/db/schema-minimal.js +61 -0
  128. package/dist/db/schema-minimal.js.map +1 -0
  129. package/dist/db/search.js +28 -0
  130. package/dist/db/search.js.map +1 -0
  131. package/dist/db/stores.js +1665 -0
  132. package/dist/db/stores.js.map +1 -0
  133. package/dist/db/things.js +297 -0
  134. package/dist/db/things.js.map +1 -0
  135. package/dist/db/vault.js +171 -0
  136. package/dist/db/vault.js.map +1 -0
  137. package/dist/db/verbs.js +102 -0
  138. package/dist/db/verbs.js.map +1 -0
  139. package/dist/do/base.js +48 -0
  140. package/dist/do/base.js.map +1 -0
  141. package/dist/do/tiny.js +31 -0
  142. package/dist/do/tiny.js.map +1 -0
  143. package/dist/lib/DOAuth.js +261 -0
  144. package/dist/lib/DOAuth.js.map +1 -0
  145. package/dist/lib/DODispatcher.js +72 -0
  146. package/dist/lib/DODispatcher.js.map +1 -0
  147. package/dist/lib/Modifier.js +189 -0
  148. package/dist/lib/Modifier.js.map +1 -0
  149. package/dist/lib/StateStorage.js +403 -0
  150. package/dist/lib/StateStorage.js.map +1 -0
  151. package/dist/lib/TypeRegistry.js +122 -0
  152. package/dist/lib/TypeRegistry.js.map +1 -0
  153. package/dist/lib/ai/gateway.js +247 -0
  154. package/dist/lib/ai/gateway.js.map +1 -0
  155. package/dist/lib/ai/tool-loop-agent.js +591 -0
  156. package/dist/lib/ai/tool-loop-agent.js.map +1 -0
  157. package/dist/lib/auto-wiring.js +439 -0
  158. package/dist/lib/auto-wiring.js.map +1 -0
  159. package/dist/lib/browse/browserbase.js +163 -0
  160. package/dist/lib/browse/browserbase.js.map +1 -0
  161. package/dist/lib/browse/cloudflare.js +144 -0
  162. package/dist/lib/browse/cloudflare.js.map +1 -0
  163. package/dist/lib/browse/index.js +62 -0
  164. package/dist/lib/browse/index.js.map +1 -0
  165. package/dist/lib/browse/types.js +13 -0
  166. package/dist/lib/browse/types.js.map +1 -0
  167. package/dist/lib/cache/index.js +37 -0
  168. package/dist/lib/cache/index.js.map +1 -0
  169. package/dist/lib/cache/visibility.js +638 -0
  170. package/dist/lib/cache/visibility.js.map +1 -0
  171. package/dist/lib/capabilities.js +268 -0
  172. package/dist/lib/capabilities.js.map +1 -0
  173. package/dist/lib/channels/base.js +106 -0
  174. package/dist/lib/channels/base.js.map +1 -0
  175. package/dist/lib/channels/discord.js +94 -0
  176. package/dist/lib/channels/discord.js.map +1 -0
  177. package/dist/lib/channels/email.js +204 -0
  178. package/dist/lib/channels/email.js.map +1 -0
  179. package/dist/lib/channels/index.js +90 -0
  180. package/dist/lib/channels/index.js.map +1 -0
  181. package/dist/lib/channels/mdxui-chat.js +95 -0
  182. package/dist/lib/channels/mdxui-chat.js.map +1 -0
  183. package/dist/lib/channels/slack-blockkit.js +121 -0
  184. package/dist/lib/channels/slack-blockkit.js.map +1 -0
  185. package/dist/lib/channels/types.js +7 -0
  186. package/dist/lib/channels/types.js.map +1 -0
  187. package/dist/lib/cloudflare/ai.js +654 -0
  188. package/dist/lib/cloudflare/ai.js.map +1 -0
  189. package/dist/lib/cloudflare/index.js +88 -0
  190. package/dist/lib/cloudflare/index.js.map +1 -0
  191. package/dist/lib/cloudflare/kv.js +342 -0
  192. package/dist/lib/cloudflare/kv.js.map +1 -0
  193. package/dist/lib/cloudflare/queues.js +434 -0
  194. package/dist/lib/cloudflare/queues.js.map +1 -0
  195. package/dist/lib/cloudflare/r2.js +604 -0
  196. package/dist/lib/cloudflare/r2.js.map +1 -0
  197. package/dist/lib/cloudflare/vectorize.js +494 -0
  198. package/dist/lib/cloudflare/vectorize.js.map +1 -0
  199. package/dist/lib/cloudflare/workflows.js +569 -0
  200. package/dist/lib/cloudflare/workflows.js.map +1 -0
  201. package/dist/lib/colo/caching.js +196 -0
  202. package/dist/lib/colo/caching.js.map +1 -0
  203. package/dist/lib/colo/detection.js +194 -0
  204. package/dist/lib/colo/detection.js.map +1 -0
  205. package/dist/lib/colo/external-data.js +219 -0
  206. package/dist/lib/colo/external-data.js.map +1 -0
  207. package/dist/lib/colo/globe-data.js +179 -0
  208. package/dist/lib/colo/globe-data.js.map +1 -0
  209. package/dist/lib/colo/index.js +16 -0
  210. package/dist/lib/colo/index.js.map +1 -0
  211. package/dist/lib/decorators.js +37 -0
  212. package/dist/lib/decorators.js.map +1 -0
  213. package/dist/lib/discovery.js +81 -0
  214. package/dist/lib/discovery.js.map +1 -0
  215. package/dist/lib/executors/AgenticFunctionExecutor.js +619 -0
  216. package/dist/lib/executors/AgenticFunctionExecutor.js.map +1 -0
  217. package/dist/lib/executors/BaseFunctionExecutor.js +328 -0
  218. package/dist/lib/executors/BaseFunctionExecutor.js.map +1 -0
  219. package/dist/lib/executors/CascadeExecutor.js +418 -0
  220. package/dist/lib/executors/CascadeExecutor.js.map +1 -0
  221. package/dist/lib/executors/CodeFunctionExecutor.js +904 -0
  222. package/dist/lib/executors/CodeFunctionExecutor.js.map +1 -0
  223. package/dist/lib/executors/GenerativeFunctionExecutor.js +904 -0
  224. package/dist/lib/executors/GenerativeFunctionExecutor.js.map +1 -0
  225. package/dist/lib/executors/HumanFunctionExecutor.js +884 -0
  226. package/dist/lib/executors/HumanFunctionExecutor.js.map +1 -0
  227. package/dist/lib/executors/ParallelStepExecutor.js +308 -0
  228. package/dist/lib/executors/ParallelStepExecutor.js.map +1 -0
  229. package/dist/lib/executors/types.js +12 -0
  230. package/dist/lib/executors/types.js.map +1 -0
  231. package/dist/lib/experiments.js +89 -0
  232. package/dist/lib/experiments.js.map +1 -0
  233. package/dist/lib/flags/store.js +262 -0
  234. package/dist/lib/flags/store.js.map +1 -0
  235. package/dist/lib/functions/FunctionComposition.js +467 -0
  236. package/dist/lib/functions/FunctionComposition.js.map +1 -0
  237. package/dist/lib/functions/FunctionMiddleware.js +457 -0
  238. package/dist/lib/functions/FunctionMiddleware.js.map +1 -0
  239. package/dist/lib/functions/FunctionRegistry.js +426 -0
  240. package/dist/lib/functions/FunctionRegistry.js.map +1 -0
  241. package/dist/lib/functions/createFunction.js +1048 -0
  242. package/dist/lib/functions/createFunction.js.map +1 -0
  243. package/dist/lib/humans/index.js +68 -0
  244. package/dist/lib/humans/index.js.map +1 -0
  245. package/dist/lib/humans/templates.js +117 -0
  246. package/dist/lib/humans/templates.js.map +1 -0
  247. package/dist/lib/identity.js +98 -0
  248. package/dist/lib/identity.js.map +1 -0
  249. package/dist/lib/index.js +9 -0
  250. package/dist/lib/index.js.map +1 -0
  251. package/dist/lib/logging/error-logger.js +163 -0
  252. package/dist/lib/logging/error-logger.js.map +1 -0
  253. package/dist/lib/logging/index.js +160 -0
  254. package/dist/lib/logging/index.js.map +1 -0
  255. package/dist/lib/mixins/bash.js +753 -0
  256. package/dist/lib/mixins/bash.js.map +1 -0
  257. package/dist/lib/mixins/fs.js +648 -0
  258. package/dist/lib/mixins/fs.js.map +1 -0
  259. package/dist/lib/mixins/git.js +1006 -0
  260. package/dist/lib/mixins/git.js.map +1 -0
  261. package/dist/lib/mixins/npm.js +662 -0
  262. package/dist/lib/mixins/npm.js.map +1 -0
  263. package/dist/lib/noun-id.js +278 -0
  264. package/dist/lib/noun-id.js.map +1 -0
  265. package/dist/lib/rate-limit/sliding-window.js +148 -0
  266. package/dist/lib/rate-limit/sliding-window.js.map +1 -0
  267. package/dist/lib/rate-limit.js +110 -0
  268. package/dist/lib/rate-limit.js.map +1 -0
  269. package/dist/lib/rpc/bindings.js +548 -0
  270. package/dist/lib/rpc/bindings.js.map +1 -0
  271. package/dist/lib/rpc/index.js +64 -0
  272. package/dist/lib/rpc/index.js.map +1 -0
  273. package/dist/lib/safe-stringify.js +223 -0
  274. package/dist/lib/safe-stringify.js.map +1 -0
  275. package/dist/lib/sandbox/miniflare-sandbox.js +1007 -0
  276. package/dist/lib/sandbox/miniflare-sandbox.js.map +1 -0
  277. package/dist/lib/sqids.js +110 -0
  278. package/dist/lib/sqids.js.map +1 -0
  279. package/dist/lib/sql/adapters/index.js +10 -0
  280. package/dist/lib/sql/adapters/index.js.map +1 -0
  281. package/dist/lib/sql/adapters/node-sql-parser.js +552 -0
  282. package/dist/lib/sql/adapters/node-sql-parser.js.map +1 -0
  283. package/dist/lib/sql/adapters/pgsql-parser.js +1190 -0
  284. package/dist/lib/sql/adapters/pgsql-parser.js.map +1 -0
  285. package/dist/lib/sql/index.js +277 -0
  286. package/dist/lib/sql/index.js.map +1 -0
  287. package/dist/lib/sql/types.js +56 -0
  288. package/dist/lib/sql/types.js.map +1 -0
  289. package/dist/lib/type-classifier.js +126 -0
  290. package/dist/lib/type-classifier.js.map +1 -0
  291. package/dist/lib/utils/html.js +47 -0
  292. package/dist/lib/utils/html.js.map +1 -0
  293. package/dist/lib/validation.js +48 -0
  294. package/dist/lib/validation.js.map +1 -0
  295. package/dist/lib/vault/store.js +411 -0
  296. package/dist/lib/vault/store.js.map +1 -0
  297. package/dist/metrics/hunch.js +739 -0
  298. package/dist/metrics/hunch.js.map +1 -0
  299. package/dist/objects/API.js +302 -0
  300. package/dist/objects/API.js.map +1 -0
  301. package/dist/objects/Agent.js +179 -0
  302. package/dist/objects/Agent.js.map +1 -0
  303. package/dist/objects/AgenticFunctionExecutor.js +8 -0
  304. package/dist/objects/AgenticFunctionExecutor.js.map +1 -0
  305. package/dist/objects/App.js +83 -0
  306. package/dist/objects/App.js.map +1 -0
  307. package/dist/objects/Browser.js +884 -0
  308. package/dist/objects/Browser.js.map +1 -0
  309. package/dist/objects/Business.js +107 -0
  310. package/dist/objects/Business.js.map +1 -0
  311. package/dist/objects/CLI.js +221 -0
  312. package/dist/objects/CLI.js.map +1 -0
  313. package/dist/objects/CodeFunctionExecutor.js +8 -0
  314. package/dist/objects/CodeFunctionExecutor.js.map +1 -0
  315. package/dist/objects/Collection.js +161 -0
  316. package/dist/objects/Collection.js.map +1 -0
  317. package/dist/objects/DO.js +41 -0
  318. package/dist/objects/DO.js.map +1 -0
  319. package/dist/objects/DOBase.js +2309 -0
  320. package/dist/objects/DOBase.js.map +1 -0
  321. package/dist/objects/DOCache.js +153 -0
  322. package/dist/objects/DOCache.js.map +1 -0
  323. package/dist/objects/DOFull.js +1676 -0
  324. package/dist/objects/DOFull.js.map +1 -0
  325. package/dist/objects/DOTiny.js +207 -0
  326. package/dist/objects/DOTiny.js.map +1 -0
  327. package/dist/objects/Directory.js +199 -0
  328. package/dist/objects/Directory.js.map +1 -0
  329. package/dist/objects/Entity.js +413 -0
  330. package/dist/objects/Entity.js.map +1 -0
  331. package/dist/objects/Function.js +116 -0
  332. package/dist/objects/Function.js.map +1 -0
  333. package/dist/objects/Human.js +231 -0
  334. package/dist/objects/Human.js.map +1 -0
  335. package/dist/objects/HumanFunctionExecutor.js +8 -0
  336. package/dist/objects/HumanFunctionExecutor.js.map +1 -0
  337. package/dist/objects/IcebergMetadataDO.js +938 -0
  338. package/dist/objects/IcebergMetadataDO.js.map +1 -0
  339. package/dist/objects/IntegrationsDO.js +1174 -0
  340. package/dist/objects/IntegrationsDO.js.map +1 -0
  341. package/dist/objects/ObservabilityBroadcaster.js +149 -0
  342. package/dist/objects/ObservabilityBroadcaster.js.map +1 -0
  343. package/dist/objects/Package.js +154 -0
  344. package/dist/objects/Package.js.map +1 -0
  345. package/dist/objects/Product.js +193 -0
  346. package/dist/objects/Product.js.map +1 -0
  347. package/dist/objects/SDK.js +152 -0
  348. package/dist/objects/SDK.js.map +1 -0
  349. package/dist/objects/SaaS.js +235 -0
  350. package/dist/objects/SaaS.js.map +1 -0
  351. package/dist/objects/SandboxDO.js +759 -0
  352. package/dist/objects/SandboxDO.js.map +1 -0
  353. package/dist/objects/Service.js +337 -0
  354. package/dist/objects/Service.js.map +1 -0
  355. package/dist/objects/Site.js +80 -0
  356. package/dist/objects/Site.js.map +1 -0
  357. package/dist/objects/Startup.js +479 -0
  358. package/dist/objects/Startup.js.map +1 -0
  359. package/dist/objects/ThingsDO.js +170 -0
  360. package/dist/objects/ThingsDO.js.map +1 -0
  361. package/dist/objects/VectorShardDO.js +650 -0
  362. package/dist/objects/VectorShardDO.js.map +1 -0
  363. package/dist/objects/Worker.js +144 -0
  364. package/dist/objects/Worker.js.map +1 -0
  365. package/dist/objects/Workflow.js +196 -0
  366. package/dist/objects/Workflow.js.map +1 -0
  367. package/dist/objects/WorkflowFactory.js +313 -0
  368. package/dist/objects/WorkflowFactory.js.map +1 -0
  369. package/dist/objects/WorkflowRuntime.js +863 -0
  370. package/dist/objects/WorkflowRuntime.js.map +1 -0
  371. package/dist/objects/circuit-breaker-bulkhead.js +178 -0
  372. package/dist/objects/circuit-breaker-bulkhead.js.map +1 -0
  373. package/dist/objects/createFunction.js +934 -0
  374. package/dist/objects/createFunction.js.map +1 -0
  375. package/dist/objects/index.js +80 -0
  376. package/dist/objects/index.js.map +1 -0
  377. package/dist/objects/lifecycle/Branch.js +275 -0
  378. package/dist/objects/lifecycle/Branch.js.map +1 -0
  379. package/dist/objects/lifecycle/Clone.js +1499 -0
  380. package/dist/objects/lifecycle/Clone.js.map +1 -0
  381. package/dist/objects/lifecycle/Compact.js +237 -0
  382. package/dist/objects/lifecycle/Compact.js.map +1 -0
  383. package/dist/objects/lifecycle/Promote.js +476 -0
  384. package/dist/objects/lifecycle/Promote.js.map +1 -0
  385. package/dist/objects/lifecycle/Shard.js +560 -0
  386. package/dist/objects/lifecycle/Shard.js.map +1 -0
  387. package/dist/objects/lifecycle/index.js +15 -0
  388. package/dist/objects/lifecycle/index.js.map +1 -0
  389. package/dist/objects/lifecycle/types.js +33 -0
  390. package/dist/objects/lifecycle/types.js.map +1 -0
  391. package/dist/objects/mixins/infrastructure.js +171 -0
  392. package/dist/objects/mixins/infrastructure.js.map +1 -0
  393. package/dist/objects/modules/StoresModule.js +153 -0
  394. package/dist/objects/modules/StoresModule.js.map +1 -0
  395. package/dist/objects/persistence/checkpoint-manager.js +606 -0
  396. package/dist/objects/persistence/checkpoint-manager.js.map +1 -0
  397. package/dist/objects/persistence/index.js +72 -0
  398. package/dist/objects/persistence/index.js.map +1 -0
  399. package/dist/objects/persistence/migration-runner.js +562 -0
  400. package/dist/objects/persistence/migration-runner.js.map +1 -0
  401. package/dist/objects/persistence/replication-manager.js +501 -0
  402. package/dist/objects/persistence/replication-manager.js.map +1 -0
  403. package/dist/objects/persistence/tiered-storage-manager.js +595 -0
  404. package/dist/objects/persistence/tiered-storage-manager.js.map +1 -0
  405. package/dist/objects/persistence/types.js +14 -0
  406. package/dist/objects/persistence/types.js.map +1 -0
  407. package/dist/objects/persistence/wal-manager.js +653 -0
  408. package/dist/objects/persistence/wal-manager.js.map +1 -0
  409. package/dist/objects/presets/index.js +20 -0
  410. package/dist/objects/presets/index.js.map +1 -0
  411. package/dist/objects/presets/primitives.js +188 -0
  412. package/dist/objects/presets/primitives.js.map +1 -0
  413. package/dist/objects/primitives/alarm-adapter.js +141 -0
  414. package/dist/objects/primitives/alarm-adapter.js.map +1 -0
  415. package/dist/objects/primitives/index.js +337 -0
  416. package/dist/objects/primitives/index.js.map +1 -0
  417. package/dist/objects/primitives/storage-adapter.js +182 -0
  418. package/dist/objects/primitives/storage-adapter.js.map +1 -0
  419. package/dist/objects/primitives/with-primitives.js +102 -0
  420. package/dist/objects/primitives/with-primitives.js.map +1 -0
  421. package/dist/objects/services/StoreManager.js +227 -0
  422. package/dist/objects/services/StoreManager.js.map +1 -0
  423. package/dist/objects/services/index.js +13 -0
  424. package/dist/objects/services/index.js.map +1 -0
  425. package/dist/objects/transport/auth-layer.js +1451 -0
  426. package/dist/objects/transport/auth-layer.js.map +1 -0
  427. package/dist/objects/transport/capnweb-target.js +355 -0
  428. package/dist/objects/transport/capnweb-target.js.map +1 -0
  429. package/dist/objects/transport/chain.js +441 -0
  430. package/dist/objects/transport/chain.js.map +1 -0
  431. package/dist/objects/transport/handler.js +58 -0
  432. package/dist/objects/transport/handler.js.map +1 -0
  433. package/dist/objects/transport/index.js +53 -0
  434. package/dist/objects/transport/index.js.map +1 -0
  435. package/dist/objects/transport/mcp-server.js +691 -0
  436. package/dist/objects/transport/mcp-server.js.map +1 -0
  437. package/dist/objects/transport/rest-autowire.js +1508 -0
  438. package/dist/objects/transport/rest-autowire.js.map +1 -0
  439. package/dist/objects/transport/rest-router.js +440 -0
  440. package/dist/objects/transport/rest-router.js.map +1 -0
  441. package/dist/objects/transport/rpc-server.js +1539 -0
  442. package/dist/objects/transport/rpc-server.js.map +1 -0
  443. package/dist/objects/transport/shared.js +576 -0
  444. package/dist/objects/transport/shared.js.map +1 -0
  445. package/dist/objects/transport/sync-engine.js +291 -0
  446. package/dist/objects/transport/sync-engine.js.map +1 -0
  447. package/dist/objects/transport/types.js +8 -0
  448. package/dist/objects/transport/types.js.map +1 -0
  449. package/dist/sandbox/index.js +258 -0
  450. package/dist/sandbox/index.js.map +1 -0
  451. package/dist/snippets/artifacts-config.js +241 -0
  452. package/dist/snippets/artifacts-config.js.map +1 -0
  453. package/dist/snippets/artifacts-ingest.js +832 -0
  454. package/dist/snippets/artifacts-ingest.js.map +1 -0
  455. package/dist/snippets/artifacts-serve.js +1035 -0
  456. package/dist/snippets/artifacts-serve.js.map +1 -0
  457. package/dist/snippets/artifacts-types.js +161 -0
  458. package/dist/snippets/artifacts-types.js.map +1 -0
  459. package/dist/snippets/cache-probe.js +376 -0
  460. package/dist/snippets/cache-probe.js.map +1 -0
  461. package/dist/snippets/cache.js +10 -0
  462. package/dist/snippets/cache.js.map +1 -0
  463. package/dist/snippets/events.js +469 -0
  464. package/dist/snippets/events.js.map +1 -0
  465. package/dist/snippets/index.js +7 -0
  466. package/dist/snippets/index.js.map +1 -0
  467. package/dist/snippets/proxy.js +495 -0
  468. package/dist/snippets/proxy.js.map +1 -0
  469. package/dist/snippets/search.js +1759 -0
  470. package/dist/snippets/search.js.map +1 -0
  471. package/dist/streams/index.js +30 -0
  472. package/dist/streams/index.js.map +1 -0
  473. package/dist/streams/observability.js +68 -0
  474. package/dist/streams/observability.js.map +1 -0
  475. package/dist/types/AI.js +92 -0
  476. package/dist/types/AI.js.map +1 -0
  477. package/dist/types/AIFunction.js +171 -0
  478. package/dist/types/AIFunction.js.map +1 -0
  479. package/dist/types/BrowseVerb.js +89 -0
  480. package/dist/types/BrowseVerb.js.map +1 -0
  481. package/dist/types/Browser.js +31 -0
  482. package/dist/types/Browser.js.map +1 -0
  483. package/dist/types/Chaos.js +15 -0
  484. package/dist/types/Chaos.js.map +1 -0
  485. package/dist/types/CloudflareBindings.js +109 -0
  486. package/dist/types/CloudflareBindings.js.map +1 -0
  487. package/dist/types/Collection.js +50 -0
  488. package/dist/types/Collection.js.map +1 -0
  489. package/dist/types/DO.js +2 -0
  490. package/dist/types/DO.js.map +1 -0
  491. package/dist/types/DOLocation.js +63 -0
  492. package/dist/types/DOLocation.js.map +1 -0
  493. package/dist/types/EventHandler.js +57 -0
  494. package/dist/types/EventHandler.js.map +1 -0
  495. package/dist/types/Experiment.js +33 -0
  496. package/dist/types/Experiment.js.map +1 -0
  497. package/dist/types/Flag.js +57 -0
  498. package/dist/types/Flag.js.map +1 -0
  499. package/dist/types/Lifecycle.js +13 -0
  500. package/dist/types/Lifecycle.js.map +1 -0
  501. package/dist/types/Location.js +169 -0
  502. package/dist/types/Location.js.map +1 -0
  503. package/dist/types/Noun.js +66 -0
  504. package/dist/types/Noun.js.map +1 -0
  505. package/dist/types/SessionEvent.js +194 -0
  506. package/dist/types/SessionEvent.js.map +1 -0
  507. package/dist/types/Thing.js +55 -0
  508. package/dist/types/Thing.js.map +1 -0
  509. package/dist/types/ThingDO.js +153 -0
  510. package/dist/types/ThingDO.js.map +1 -0
  511. package/dist/types/Things.js +2 -0
  512. package/dist/types/Things.js.map +1 -0
  513. package/dist/types/Verb.js +119 -0
  514. package/dist/types/Verb.js.map +1 -0
  515. package/dist/types/WorkflowContext.js +70 -0
  516. package/dist/types/WorkflowContext.js.map +1 -0
  517. package/dist/types/analytics-api.js +13 -0
  518. package/dist/types/analytics-api.js.map +1 -0
  519. package/dist/types/capabilities.js +135 -0
  520. package/dist/types/capabilities.js.map +1 -0
  521. package/dist/types/drizzle.js +12 -0
  522. package/dist/types/drizzle.js.map +1 -0
  523. package/dist/types/event.js +201 -0
  524. package/dist/types/event.js.map +1 -0
  525. package/dist/types/fn.js +12 -0
  526. package/dist/types/fn.js.map +1 -0
  527. package/dist/types/iceberg.js +48 -0
  528. package/dist/types/iceberg.js.map +1 -0
  529. package/dist/types/ids.js +170 -0
  530. package/dist/types/ids.js.map +1 -0
  531. package/dist/types/index.js +41 -0
  532. package/dist/types/index.js.map +1 -0
  533. package/dist/types/introspect.js +54 -0
  534. package/dist/types/introspect.js.map +1 -0
  535. package/dist/types/observability.js +124 -0
  536. package/dist/types/observability.js.map +1 -0
  537. package/dist/types/sync-protocol.js +175 -0
  538. package/dist/types/sync-protocol.js.map +1 -0
  539. package/dist/types/vector.js +13 -0
  540. package/dist/types/vector.js.map +1 -0
  541. package/dist/workflows/ScheduleManager.js +473 -0
  542. package/dist/workflows/ScheduleManager.js.map +1 -0
  543. package/dist/workflows/StepDOBridge.js +149 -0
  544. package/dist/workflows/StepDOBridge.js.map +1 -0
  545. package/dist/workflows/StepResultStorage.js +232 -0
  546. package/dist/workflows/StepResultStorage.js.map +1 -0
  547. package/dist/workflows/WaitForEventManager.js +461 -0
  548. package/dist/workflows/WaitForEventManager.js.map +1 -0
  549. package/dist/workflows/analyzer.js +332 -0
  550. package/dist/workflows/analyzer.js.map +1 -0
  551. package/dist/workflows/compat/activity-router.js +484 -0
  552. package/dist/workflows/compat/activity-router.js.map +1 -0
  553. package/dist/workflows/compat/backends/cloudflare-workflows.js +431 -0
  554. package/dist/workflows/compat/backends/cloudflare-workflows.js.map +1 -0
  555. package/dist/workflows/compat/backends/index.js +14 -0
  556. package/dist/workflows/compat/backends/index.js.map +1 -0
  557. package/dist/workflows/compat/errors/index.js +375 -0
  558. package/dist/workflows/compat/errors/index.js.map +1 -0
  559. package/dist/workflows/compat/index.js +79 -0
  560. package/dist/workflows/compat/index.js.map +1 -0
  561. package/dist/workflows/compat/inngest/index.js +989 -0
  562. package/dist/workflows/compat/inngest/index.js.map +1 -0
  563. package/dist/workflows/compat/qstash/index.js +1263 -0
  564. package/dist/workflows/compat/qstash/index.js.map +1 -0
  565. package/dist/workflows/compat/temporal/activities.js +739 -0
  566. package/dist/workflows/compat/temporal/activities.js.map +1 -0
  567. package/dist/workflows/compat/temporal/child-workflows.js +154 -0
  568. package/dist/workflows/compat/temporal/child-workflows.js.map +1 -0
  569. package/dist/workflows/compat/temporal/client.js +381 -0
  570. package/dist/workflows/compat/temporal/client.js.map +1 -0
  571. package/dist/workflows/compat/temporal/context.js +309 -0
  572. package/dist/workflows/compat/temporal/context.js.map +1 -0
  573. package/dist/workflows/compat/temporal/determinism.js +216 -0
  574. package/dist/workflows/compat/temporal/determinism.js.map +1 -0
  575. package/dist/workflows/compat/temporal/errors.js +128 -0
  576. package/dist/workflows/compat/temporal/errors.js.map +1 -0
  577. package/dist/workflows/compat/temporal/index.js +2464 -0
  578. package/dist/workflows/compat/temporal/index.js.map +1 -0
  579. package/dist/workflows/compat/temporal/saga.js +504 -0
  580. package/dist/workflows/compat/temporal/saga.js.map +1 -0
  581. package/dist/workflows/compat/temporal/signals.js +364 -0
  582. package/dist/workflows/compat/temporal/signals.js.map +1 -0
  583. package/dist/workflows/compat/temporal/storage.js +271 -0
  584. package/dist/workflows/compat/temporal/storage.js.map +1 -0
  585. package/dist/workflows/compat/temporal/timers.js +347 -0
  586. package/dist/workflows/compat/temporal/timers.js.map +1 -0
  587. package/dist/workflows/compat/temporal/types.js +7 -0
  588. package/dist/workflows/compat/temporal/types.js.map +1 -0
  589. package/dist/workflows/compat/temporal/unified-primitives.js +339 -0
  590. package/dist/workflows/compat/temporal/unified-primitives.js.map +1 -0
  591. package/dist/workflows/compat/trigger/index.js +468 -0
  592. package/dist/workflows/compat/trigger/index.js.map +1 -0
  593. package/dist/workflows/compat/utils/index.js +69 -0
  594. package/dist/workflows/compat/utils/index.js.map +1 -0
  595. package/dist/workflows/context/correlation-capability.js +266 -0
  596. package/dist/workflows/context/correlation-capability.js.map +1 -0
  597. package/dist/workflows/context/correlation.js +484 -0
  598. package/dist/workflows/context/correlation.js.map +1 -0
  599. package/dist/workflows/context/experiment.js +289 -0
  600. package/dist/workflows/context/experiment.js.map +1 -0
  601. package/dist/workflows/context/flag.js +244 -0
  602. package/dist/workflows/context/flag.js.map +1 -0
  603. package/dist/workflows/context/foundation.js +648 -0
  604. package/dist/workflows/context/foundation.js.map +1 -0
  605. package/dist/workflows/context/human-base.js +106 -0
  606. package/dist/workflows/context/human-base.js.map +1 -0
  607. package/dist/workflows/context/human.js +368 -0
  608. package/dist/workflows/context/human.js.map +1 -0
  609. package/dist/workflows/context/measure.js +354 -0
  610. package/dist/workflows/context/measure.js.map +1 -0
  611. package/dist/workflows/context/rate-limit.js +358 -0
  612. package/dist/workflows/context/rate-limit.js.map +1 -0
  613. package/dist/workflows/context/user.js +117 -0
  614. package/dist/workflows/context/user.js.map +1 -0
  615. package/dist/workflows/context/vault.js +360 -0
  616. package/dist/workflows/context/vault.js.map +1 -0
  617. package/dist/workflows/data/entity-events/entity-events.js +489 -0
  618. package/dist/workflows/data/entity-events/entity-events.js.map +1 -0
  619. package/dist/workflows/data/experiment/index.js +599 -0
  620. package/dist/workflows/data/experiment/index.js.map +1 -0
  621. package/dist/workflows/data/goal/context.js +558 -0
  622. package/dist/workflows/data/goal/context.js.map +1 -0
  623. package/dist/workflows/data/goal/index.js +32 -0
  624. package/dist/workflows/data/goal/index.js.map +1 -0
  625. package/dist/workflows/data/measure/index.js +840 -0
  626. package/dist/workflows/data/measure/index.js.map +1 -0
  627. package/dist/workflows/data/stream/index.js +1149 -0
  628. package/dist/workflows/data/stream/index.js.map +1 -0
  629. package/dist/workflows/data/track/context.js +883 -0
  630. package/dist/workflows/data/track/context.js.map +1 -0
  631. package/dist/workflows/data/track/index.js +15 -0
  632. package/dist/workflows/data/track/index.js.map +1 -0
  633. package/dist/workflows/data/view/context.js +864 -0
  634. package/dist/workflows/data/view/context.js.map +1 -0
  635. package/dist/workflows/domain.js +93 -0
  636. package/dist/workflows/domain.js.map +1 -0
  637. package/dist/workflows/flag.js +176 -0
  638. package/dist/workflows/flag.js.map +1 -0
  639. package/dist/workflows/flags.js +217 -0
  640. package/dist/workflows/flags.js.map +1 -0
  641. package/dist/workflows/hash.js +209 -0
  642. package/dist/workflows/hash.js.map +1 -0
  643. package/dist/workflows/index.js +50 -0
  644. package/dist/workflows/index.js.map +1 -0
  645. package/dist/workflows/on.js +378 -0
  646. package/dist/workflows/on.js.map +1 -0
  647. package/dist/workflows/pipeline-promise.js +481 -0
  648. package/dist/workflows/pipeline-promise.js.map +1 -0
  649. package/dist/workflows/pipeline-types.js +20 -0
  650. package/dist/workflows/pipeline-types.js.map +1 -0
  651. package/dist/workflows/proxy.js +76 -0
  652. package/dist/workflows/proxy.js.map +1 -0
  653. package/dist/workflows/runtime.js +310 -0
  654. package/dist/workflows/runtime.js.map +1 -0
  655. package/dist/workflows/schedule-builder.js +327 -0
  656. package/dist/workflows/schedule-builder.js.map +1 -0
  657. package/dist/workflows/visibility/index.js +146 -0
  658. package/dist/workflows/visibility/index.js.map +1 -0
  659. package/dist/workflows/visibility/query-parser.js +150 -0
  660. package/dist/workflows/visibility/query-parser.js.map +1 -0
  661. package/dist/workflows/visibility/store.js +223 -0
  662. package/dist/workflows/visibility/store.js.map +1 -0
  663. package/dist/workflows/visibility/types.js +30 -0
  664. package/dist/workflows/visibility/types.js.map +1 -0
  665. package/dist/workflows/workflow.js +53 -0
  666. package/dist/workflows/workflow.js.map +1 -0
  667. package/package.json +294 -46
@@ -0,0 +1,884 @@
1
+ /**
2
+ * HumanFunctionExecutor
3
+ *
4
+ * Execution engine for HumanFunction - a function type that queues tasks for human input.
5
+ * Supports multiple channels (slack, email, in-app), structured forms,
6
+ * timeout handling, escalation, and approval workflows.
7
+ */
8
+ // ============================================================================
9
+ // ERROR CLASSES
10
+ // ============================================================================
11
+ export class HumanTimeoutError extends Error {
12
+ constructor(message) {
13
+ super(message);
14
+ this.name = 'HumanTimeoutError';
15
+ }
16
+ }
17
+ export class HumanChannelError extends Error {
18
+ constructor(message) {
19
+ super(message);
20
+ this.name = 'HumanChannelError';
21
+ }
22
+ }
23
+ export class HumanValidationError extends Error {
24
+ fields;
25
+ constructor(message, fields) {
26
+ super(message);
27
+ this.name = 'HumanValidationError';
28
+ this.fields = fields;
29
+ }
30
+ }
31
+ export class HumanEscalationError extends Error {
32
+ constructor(message) {
33
+ super(message);
34
+ this.name = 'HumanEscalationError';
35
+ }
36
+ }
37
+ export class HumanApprovalRejectedError extends Error {
38
+ constructor(message) {
39
+ super(message);
40
+ this.name = 'HumanApprovalRejectedError';
41
+ }
42
+ }
43
+ export class HumanCancelledError extends Error {
44
+ constructor(message) {
45
+ super(message);
46
+ this.name = 'HumanCancelledError';
47
+ }
48
+ }
49
+ export class HumanNotificationFailedError extends Error {
50
+ constructor(message) {
51
+ super(message);
52
+ this.name = 'HumanNotificationFailedError';
53
+ }
54
+ }
55
+ // ============================================================================
56
+ // UTILITY FUNCTIONS
57
+ // ============================================================================
58
+ function generateTaskId() {
59
+ return `task-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
60
+ }
61
+ function interpolatePrompt(prompt, input) {
62
+ return prompt.replace(/\{\{(\w+)\}\}/g, (_, key) => {
63
+ const value = input[key];
64
+ return value !== undefined ? String(value) : `{{${key}}}`;
65
+ });
66
+ }
67
+ function sleep(ms) {
68
+ return new Promise((resolve) => setTimeout(resolve, ms));
69
+ }
70
+ // ============================================================================
71
+ // HUMAN FUNCTION EXECUTOR
72
+ // ============================================================================
73
+ export class HumanFunctionExecutor {
74
+ state;
75
+ env;
76
+ channels;
77
+ notificationService;
78
+ onEvent;
79
+ constructor(options) {
80
+ this.state = options.state;
81
+ this.env = options.env;
82
+ this.channels = options.channels;
83
+ this.notificationService = options.notificationService;
84
+ this.onEvent = options.onEvent;
85
+ }
86
+ async execute(task) {
87
+ const startTime = Date.now();
88
+ const taskId = generateTaskId();
89
+ const metrics = {
90
+ notificationsSent: 0,
91
+ retries: 0,
92
+ waitTime: 0,
93
+ };
94
+ // Check if already cancelled
95
+ if (task.signal?.aborted) {
96
+ return {
97
+ success: false,
98
+ error: new HumanCancelledError('Task cancelled before execution'),
99
+ taskId,
100
+ duration: 0,
101
+ channel: Array.isArray(task.channel) ? task.channel[0] : task.channel,
102
+ metrics,
103
+ };
104
+ }
105
+ // Validate channel exists before proceeding
106
+ const channelNames = Array.isArray(task.channel) ? task.channel : [task.channel];
107
+ for (const channelName of channelNames) {
108
+ if (!this.channels[channelName]) {
109
+ throw new HumanChannelError(`Unknown channel: ${channelName}`);
110
+ }
111
+ }
112
+ // Build context
113
+ const context = this.buildContext(taskId, task);
114
+ // Emit started event
115
+ await this.emit('human.started', { taskId, channel: task.channel });
116
+ try {
117
+ // Handle approval workflows
118
+ if (task.approval) {
119
+ return await this.executeApprovalWorkflow(task, taskId, startTime, metrics, context);
120
+ }
121
+ // Handle multi-channel
122
+ if (Array.isArray(task.channel)) {
123
+ return await this.executeMultiChannel(task, taskId, startTime, metrics, context);
124
+ }
125
+ // Single channel execution
126
+ return await this.executeSingleChannel(task, taskId, startTime, metrics, context);
127
+ }
128
+ catch (error) {
129
+ const duration = Date.now() - startTime;
130
+ const err = error instanceof Error ? error : new Error(String(error));
131
+ await this.emit('human.error', { taskId, error: err.message });
132
+ // Persist error state
133
+ await this.state.storage.put(`task:${taskId}`, {
134
+ status: 'failed',
135
+ error: err.message,
136
+ });
137
+ return {
138
+ success: false,
139
+ error: err instanceof HumanChannelError || err instanceof HumanTimeoutError ||
140
+ err instanceof HumanValidationError || err instanceof HumanCancelledError ||
141
+ err instanceof HumanNotificationFailedError
142
+ ? err
143
+ : new HumanChannelError(err.message),
144
+ taskId,
145
+ duration,
146
+ channel: Array.isArray(task.channel) ? task.channel[0] : task.channel,
147
+ metrics,
148
+ };
149
+ }
150
+ }
151
+ async executeSingleChannel(task, taskId, startTime, metrics, context, escalationLevel = 0, useFallback = false) {
152
+ let channelName = useFallback && task.fallbackChannel ? task.fallbackChannel : task.channel;
153
+ const channel = this.channels[channelName];
154
+ if (!channel) {
155
+ throw new HumanChannelError(`Unknown channel: ${channelName}`);
156
+ }
157
+ // Resolve prompt
158
+ const message = typeof task.prompt === 'function'
159
+ ? task.prompt(task.input)
160
+ : interpolatePrompt(task.prompt, task.input || {});
161
+ // Build notification payload
162
+ let payload = this.buildNotificationPayload(task, message, channelName);
163
+ // Call onSend callback if provided
164
+ if (task.onSend) {
165
+ const modified = task.onSend(payload);
166
+ if (modified) {
167
+ payload = modified;
168
+ }
169
+ }
170
+ // Send notification with retries
171
+ let messageId;
172
+ let retries = 0;
173
+ const maxRetries = task.delivery?.maxRetries ?? 1;
174
+ const retryDelay = task.delivery?.retryDelay ?? 1000;
175
+ const backoff = task.delivery?.backoff ?? 'fixed';
176
+ while (true) {
177
+ try {
178
+ const sendResult = await channel.send(payload);
179
+ messageId = sendResult.messageId;
180
+ metrics.notificationsSent = (metrics.notificationsSent || 0) + 1;
181
+ // Store notification info
182
+ await this.state.storage.put(`notification:${taskId}`, {
183
+ messageId,
184
+ channel: channelName,
185
+ });
186
+ await this.emit('human.notification.sent', { channel: channelName, messageId });
187
+ // Confirm delivery if required
188
+ if (task.confirmDelivery && !sendResult.delivered) {
189
+ const status = await this.notificationService.getDeliveryStatus(messageId);
190
+ if (status.status === 'failed') {
191
+ throw new HumanNotificationFailedError(`Delivery failed: ${status.error}`);
192
+ }
193
+ }
194
+ break;
195
+ }
196
+ catch (error) {
197
+ retries++;
198
+ metrics.retries = retries;
199
+ if (retries >= maxRetries) {
200
+ // Try fallback channel if available
201
+ if (!useFallback && task.fallbackChannel && this.channels[task.fallbackChannel]) {
202
+ metrics.primaryChannelFailed = true;
203
+ return this.executeSingleChannel(task, taskId, startTime, metrics, context, escalationLevel, true);
204
+ }
205
+ // HumanNotificationFailedError if delivery config specified (retry logic), otherwise HumanChannelError
206
+ if (task.delivery) {
207
+ throw new HumanNotificationFailedError(`Failed to send notification after ${retries} attempts`);
208
+ }
209
+ else {
210
+ throw new HumanChannelError(`Failed to send: Channel unavailable`);
211
+ }
212
+ }
213
+ const delay = backoff === 'exponential' ? retryDelay * Math.pow(2, retries - 1) : retryDelay;
214
+ await sleep(delay);
215
+ }
216
+ }
217
+ // Set up reminder if configured
218
+ let reminderTimeout;
219
+ if (task.reminder) {
220
+ const reminderTime = task.timeout - task.reminder.before;
221
+ if (reminderTime > 0) {
222
+ reminderTimeout = setTimeout(async () => {
223
+ const reminderPayload = { ...payload, message: task.reminder.message };
224
+ await channel.send(reminderPayload);
225
+ }, reminderTime);
226
+ }
227
+ }
228
+ // Set up cancellation listener
229
+ let cancelled = false;
230
+ const abortHandler = () => {
231
+ cancelled = true;
232
+ };
233
+ task.signal?.addEventListener('abort', abortHandler);
234
+ // Wait for response with timeout
235
+ const waitStart = Date.now();
236
+ try {
237
+ const response = await Promise.race([
238
+ channel.waitForResponse({ timeout: task.timeout }),
239
+ new Promise((_, reject) => {
240
+ setTimeout(() => reject(new HumanTimeoutError(`Timeout after ${task.timeout}ms`)), task.timeout);
241
+ }),
242
+ new Promise((_, reject) => {
243
+ if (task.signal) {
244
+ task.signal.addEventListener('abort', () => {
245
+ this.notificationService.cancelPending();
246
+ reject(new HumanCancelledError('Task cancelled'));
247
+ });
248
+ }
249
+ }),
250
+ ]);
251
+ if (cancelled) {
252
+ await this.notificationService.cancelPending();
253
+ throw new HumanCancelledError('Task cancelled');
254
+ }
255
+ if (reminderTimeout)
256
+ clearTimeout(reminderTimeout);
257
+ task.signal?.removeEventListener('abort', abortHandler);
258
+ const waitTime = Date.now() - waitStart;
259
+ metrics.waitTime = waitTime;
260
+ await this.emit('human.response.received', { action: response.action, userId: response.userId });
261
+ // Apply onResponse callback
262
+ let processedResponse = response;
263
+ if (task.onResponse) {
264
+ const modified = task.onResponse(response);
265
+ if (modified) {
266
+ processedResponse = modified;
267
+ }
268
+ }
269
+ // Apply transformResponse
270
+ if (task.transformResponse) {
271
+ processedResponse = task.transformResponse(processedResponse);
272
+ }
273
+ // Validate action
274
+ if (task.actions && task.actions.length > 0) {
275
+ const validActions = task.actions.map(a => typeof a === 'string' ? a : a.value);
276
+ if (!validActions.includes(processedResponse.action)) {
277
+ const validationError = new HumanValidationError(`Invalid action: ${processedResponse.action}. Expected one of: ${validActions.join(', ')}`);
278
+ return {
279
+ success: false,
280
+ error: validationError,
281
+ taskId,
282
+ duration: Date.now() - startTime,
283
+ channel: useFallback && task.fallbackChannel ? task.fallbackChannel : channelName,
284
+ metrics,
285
+ };
286
+ }
287
+ }
288
+ // Validate form
289
+ if (task.form) {
290
+ const validationResult = await this.validateForm(task.form, processedResponse.data, task.applyDefaults);
291
+ if (!validationResult.valid) {
292
+ return {
293
+ success: false,
294
+ error: validationResult.error,
295
+ taskId,
296
+ duration: Date.now() - startTime,
297
+ channel: useFallback && task.fallbackChannel ? task.fallbackChannel : channelName,
298
+ metrics,
299
+ };
300
+ }
301
+ if (validationResult.data) {
302
+ processedResponse.data = validationResult.data;
303
+ }
304
+ }
305
+ // Validate with schema
306
+ if (task.responseSchema) {
307
+ const schemaResult = this.validateSchema(task.responseSchema, processedResponse.data);
308
+ if (!schemaResult.valid) {
309
+ return {
310
+ success: false,
311
+ error: new HumanValidationError(schemaResult.error),
312
+ taskId,
313
+ duration: Date.now() - startTime,
314
+ channel: useFallback && task.fallbackChannel ? task.fallbackChannel : channelName,
315
+ metrics,
316
+ };
317
+ }
318
+ }
319
+ // Custom validation
320
+ if (task.validateResponse) {
321
+ // Only pass context if the validator function explicitly accepts 2 args
322
+ const validResult = task.validateResponse.length > 1
323
+ ? await task.validateResponse(processedResponse, context)
324
+ : await task.validateResponse(processedResponse);
325
+ if (validResult !== true) {
326
+ const errorMessage = typeof validResult === 'string' ? validResult : 'Validation failed';
327
+ return {
328
+ success: false,
329
+ error: new HumanValidationError(errorMessage),
330
+ taskId,
331
+ duration: Date.now() - startTime,
332
+ channel: useFallback && task.fallbackChannel ? task.fallbackChannel : channelName,
333
+ metrics,
334
+ };
335
+ }
336
+ }
337
+ // Update message if configured
338
+ if (task.updateOnResponse && channel.updateMessage) {
339
+ await channel.updateMessage(messageId, {
340
+ message: `Request ${processedResponse.action}d by ${processedResponse.userId}`,
341
+ });
342
+ }
343
+ // Store audit log
344
+ await this.state.storage.put(`audit:${taskId}`, {
345
+ taskId,
346
+ action: processedResponse.action,
347
+ userId: processedResponse.userId,
348
+ comment: processedResponse.data?.comment || processedResponse.data?.reason,
349
+ timestamp: processedResponse.timestamp,
350
+ });
351
+ await this.emit('human.decision', { action: processedResponse.action, userId: processedResponse.userId });
352
+ const duration = Date.now() - startTime;
353
+ await this.emit('human.completed', { success: true, duration });
354
+ return {
355
+ success: true,
356
+ response: processedResponse,
357
+ taskId,
358
+ duration,
359
+ respondedBy: processedResponse.userId,
360
+ respondedAt: processedResponse.timestamp,
361
+ channel: useFallback && task.fallbackChannel ? task.fallbackChannel : channelName,
362
+ escalated: escalationLevel > 0,
363
+ escalationLevel: escalationLevel > 0 ? escalationLevel : undefined,
364
+ metrics,
365
+ };
366
+ }
367
+ catch (error) {
368
+ if (reminderTimeout)
369
+ clearTimeout(reminderTimeout);
370
+ task.signal?.removeEventListener('abort', abortHandler);
371
+ if (error instanceof HumanCancelledError) {
372
+ return {
373
+ success: false,
374
+ error,
375
+ taskId,
376
+ duration: Date.now() - startTime,
377
+ channel: channelName,
378
+ metrics,
379
+ };
380
+ }
381
+ if (error instanceof HumanTimeoutError) {
382
+ metrics.waitTime = Date.now() - waitStart;
383
+ // Persist timeout state
384
+ await this.state.storage.put(`task:${taskId}`, {
385
+ status: 'timeout',
386
+ notificationSent: true,
387
+ messageId: messageId,
388
+ });
389
+ await this.emit('human.timeout', { taskId, timeout: task.timeout });
390
+ // Handle default on timeout
391
+ if (task.defaultOnTimeout) {
392
+ const defaultResponse = {
393
+ action: task.defaultOnTimeout.action,
394
+ userId: 'system',
395
+ timestamp: new Date(),
396
+ data: { reason: task.defaultOnTimeout.reason },
397
+ isDefault: true,
398
+ };
399
+ return {
400
+ success: true,
401
+ response: defaultResponse,
402
+ taskId,
403
+ duration: Date.now() - startTime,
404
+ channel: channelName,
405
+ metrics,
406
+ };
407
+ }
408
+ // Handle escalation
409
+ if (task.escalation) {
410
+ await this.emit('human.escalated', {
411
+ fromChannel: channelName,
412
+ toChannel: task.escalation.to,
413
+ level: escalationLevel + 1,
414
+ });
415
+ const escalatedTask = {
416
+ ...task,
417
+ channel: task.escalation.to,
418
+ timeout: task.escalation.next?.timeout || task.escalation.timeout,
419
+ channelOptions: {
420
+ ...task.channelOptions,
421
+ [task.escalation.to]: task.escalation.channelOptions,
422
+ },
423
+ escalation: task.escalation.next,
424
+ };
425
+ return this.executeSingleChannel(escalatedTask, taskId, startTime, metrics, context, escalationLevel + 1);
426
+ }
427
+ return {
428
+ success: false,
429
+ error,
430
+ taskId,
431
+ duration: Date.now() - startTime,
432
+ channel: channelName,
433
+ escalated: escalationLevel > 0,
434
+ metrics,
435
+ };
436
+ }
437
+ throw error;
438
+ }
439
+ }
440
+ async executeMultiChannel(task, taskId, startTime, metrics, context) {
441
+ const channels = task.channel;
442
+ // Resolve prompt once
443
+ const message = typeof task.prompt === 'function'
444
+ ? task.prompt(task.input)
445
+ : interpolatePrompt(task.prompt, task.input || {});
446
+ // Send to all channels
447
+ const sendPromises = channels.map(async (channelName) => {
448
+ const channel = this.channels[channelName];
449
+ if (!channel) {
450
+ throw new HumanChannelError(`Unknown channel: ${channelName}`);
451
+ }
452
+ const channelOptions = task.channelOptions?.[channelName] || {};
453
+ const payload = this.buildNotificationPayload({ ...task, channelOptions: channelOptions }, message, channelName);
454
+ await channel.send(payload);
455
+ metrics.notificationsSent = (metrics.notificationsSent || 0) + 1;
456
+ });
457
+ await Promise.all(sendPromises);
458
+ // Race for first response
459
+ const responsePromises = channels.map(async (channelName) => {
460
+ const channel = this.channels[channelName];
461
+ const response = await channel.waitForResponse({ timeout: task.timeout });
462
+ return { channelName, response };
463
+ });
464
+ const { channelName: respondingChannel, response } = await Promise.race(responsePromises);
465
+ // Cancel pending notifications
466
+ await this.notificationService.cancelPending();
467
+ const waitTime = Date.now() - startTime;
468
+ metrics.waitTime = waitTime;
469
+ return {
470
+ success: true,
471
+ response,
472
+ taskId,
473
+ duration: Date.now() - startTime,
474
+ respondedBy: response.userId,
475
+ respondedAt: response.timestamp,
476
+ channel: respondingChannel,
477
+ metrics,
478
+ };
479
+ }
480
+ async executeApprovalWorkflow(task, taskId, startTime, metrics, context) {
481
+ const approval = task.approval;
482
+ const channelName = task.channel;
483
+ const channel = this.channels[channelName];
484
+ if (!channel) {
485
+ throw new HumanChannelError(`Unknown channel: ${channelName}`);
486
+ }
487
+ const message = typeof task.prompt === 'function'
488
+ ? task.prompt(task.input)
489
+ : interpolatePrompt(task.prompt, task.input || {});
490
+ if (approval.type === 'sequential') {
491
+ return this.executeSequentialApproval(task, taskId, startTime, metrics, channel, message);
492
+ }
493
+ else if (approval.type === 'parallel') {
494
+ return this.executeParallelApproval(task, taskId, startTime, metrics, channel, message);
495
+ }
496
+ else if (approval.type === 'conditional') {
497
+ return this.executeConditionalApproval(task, taskId, startTime, metrics, channel, message);
498
+ }
499
+ throw new Error(`Unknown approval type: ${approval.type}`);
500
+ }
501
+ async executeSequentialApproval(task, taskId, startTime, metrics, channel, message) {
502
+ const approval = task.approval;
503
+ const levels = approval.levels || [];
504
+ const approvals = [];
505
+ for (const level of levels) {
506
+ const payload = this.buildNotificationPayload(task, message, channel.name);
507
+ payload.mentions = level.users;
508
+ await channel.send(payload);
509
+ metrics.notificationsSent = (metrics.notificationsSent || 0) + 1;
510
+ const response = await channel.waitForResponse({ timeout: task.timeout });
511
+ approvals.push({
512
+ userId: response.userId,
513
+ action: response.action,
514
+ timestamp: response.timestamp,
515
+ });
516
+ if (response.action === 'reject') {
517
+ return {
518
+ success: true,
519
+ response: {
520
+ ...response,
521
+ action: 'reject',
522
+ approvals,
523
+ rejectedBy: response.userId,
524
+ rejectionLevel: level.name,
525
+ },
526
+ taskId,
527
+ duration: Date.now() - startTime,
528
+ channel: channel.name,
529
+ metrics,
530
+ };
531
+ }
532
+ }
533
+ return {
534
+ success: true,
535
+ response: {
536
+ action: 'approve',
537
+ userId: approvals[approvals.length - 1]?.userId || '',
538
+ timestamp: new Date(),
539
+ data: {},
540
+ approvals,
541
+ },
542
+ taskId,
543
+ duration: Date.now() - startTime,
544
+ channel: channel.name,
545
+ metrics,
546
+ };
547
+ }
548
+ async executeParallelApproval(task, taskId, startTime, metrics, channel, message) {
549
+ const approval = task.approval;
550
+ const users = approval.users || [];
551
+ const requiredApprovals = approval.requiredApprovals || users.length;
552
+ const failFast = approval.failFast || false;
553
+ const approvals = [];
554
+ let approvalCount = 0;
555
+ let rejectionCount = 0;
556
+ // Send to all users
557
+ for (const _user of users) {
558
+ const payload = this.buildNotificationPayload(task, message, channel.name);
559
+ await channel.send(payload);
560
+ metrics.notificationsSent = (metrics.notificationsSent || 0) + 1;
561
+ }
562
+ // Collect responses
563
+ for (let i = 0; i < users.length; i++) {
564
+ // Check if we can fast-fail
565
+ if (failFast) {
566
+ const remainingUsers = users.length - i;
567
+ const maxPossibleApprovals = approvalCount + remainingUsers;
568
+ if (maxPossibleApprovals < requiredApprovals) {
569
+ break;
570
+ }
571
+ }
572
+ // Check if we already have enough approvals
573
+ if (approvalCount >= requiredApprovals) {
574
+ break;
575
+ }
576
+ const response = await channel.waitForResponse({ timeout: task.timeout });
577
+ approvals.push({
578
+ userId: response.userId,
579
+ action: response.action,
580
+ timestamp: response.timestamp,
581
+ });
582
+ if (response.action === 'approve') {
583
+ approvalCount++;
584
+ }
585
+ else {
586
+ rejectionCount++;
587
+ }
588
+ }
589
+ const success = approvalCount >= requiredApprovals;
590
+ return {
591
+ success: true,
592
+ response: {
593
+ action: success ? 'approve' : 'reject',
594
+ userId: approvals[approvals.length - 1]?.userId || '',
595
+ timestamp: new Date(),
596
+ data: {},
597
+ approvals,
598
+ approvalCount,
599
+ rejectionCount,
600
+ },
601
+ taskId,
602
+ duration: Date.now() - startTime,
603
+ channel: channel.name,
604
+ metrics,
605
+ };
606
+ }
607
+ async executeConditionalApproval(task, taskId, startTime, metrics, channel, message) {
608
+ const approval = task.approval;
609
+ const conditions = approval.conditions || [];
610
+ const input = task.input;
611
+ // Find matching condition
612
+ const matchingCondition = conditions.find(c => c.when(input));
613
+ if (!matchingCondition) {
614
+ throw new Error('No matching approval condition found');
615
+ }
616
+ const users = matchingCondition.users;
617
+ const approvals = [];
618
+ if (matchingCondition.sequential) {
619
+ // Sequential approval for matching users
620
+ for (const user of users) {
621
+ const payload = this.buildNotificationPayload(task, message, channel.name);
622
+ payload.mentions = [user];
623
+ await channel.send(payload);
624
+ metrics.notificationsSent = (metrics.notificationsSent || 0) + 1;
625
+ const response = await channel.waitForResponse({ timeout: task.timeout });
626
+ approvals.push({
627
+ userId: response.userId,
628
+ action: response.action,
629
+ timestamp: response.timestamp,
630
+ });
631
+ if (response.action === 'reject') {
632
+ return {
633
+ success: true,
634
+ response: {
635
+ ...response,
636
+ action: 'reject',
637
+ approvals,
638
+ },
639
+ taskId,
640
+ duration: Date.now() - startTime,
641
+ channel: channel.name,
642
+ metrics,
643
+ };
644
+ }
645
+ }
646
+ }
647
+ else {
648
+ // Single approval from any matching user
649
+ const payload = this.buildNotificationPayload(task, message, channel.name);
650
+ payload.mentions = users;
651
+ await channel.send(payload);
652
+ metrics.notificationsSent = (metrics.notificationsSent || 0) + 1;
653
+ const response = await channel.waitForResponse({ timeout: task.timeout });
654
+ approvals.push({
655
+ userId: response.userId,
656
+ action: response.action,
657
+ timestamp: response.timestamp,
658
+ });
659
+ return {
660
+ success: true,
661
+ response: {
662
+ ...response,
663
+ approvals,
664
+ },
665
+ taskId,
666
+ duration: Date.now() - startTime,
667
+ channel: channel.name,
668
+ metrics,
669
+ };
670
+ }
671
+ return {
672
+ success: true,
673
+ response: {
674
+ action: 'approve',
675
+ userId: approvals[approvals.length - 1]?.userId || '',
676
+ timestamp: new Date(),
677
+ data: {},
678
+ approvals,
679
+ },
680
+ taskId,
681
+ duration: Date.now() - startTime,
682
+ channel: channel.name,
683
+ metrics,
684
+ };
685
+ }
686
+ buildNotificationPayload(task, message, channelName) {
687
+ const channelOptions = task.channelOptions || {};
688
+ const specificOptions = channelOptions[channelName] || channelOptions;
689
+ const payload = {
690
+ message,
691
+ channel: channelName,
692
+ };
693
+ // Add actions
694
+ if (task.actions) {
695
+ payload.actions = task.actions.map(action => {
696
+ if (typeof action === 'string') {
697
+ return { text: action, value: action };
698
+ }
699
+ return { text: action.label, value: action.value, style: action.style };
700
+ });
701
+ }
702
+ // Add form
703
+ if (task.form) {
704
+ payload.form = task.form;
705
+ }
706
+ // Add channel-specific options
707
+ if (channelName === 'slack' || specificOptions.slackChannel) {
708
+ if (specificOptions.slackChannel) {
709
+ payload.channel = specificOptions.slackChannel;
710
+ }
711
+ if (specificOptions.mentionUsers) {
712
+ payload.mentions = specificOptions.mentionUsers;
713
+ }
714
+ if (specificOptions.channel) {
715
+ payload.channel = specificOptions.channel;
716
+ }
717
+ }
718
+ if (channelName === 'email') {
719
+ if (specificOptions.to) {
720
+ payload.to = specificOptions.to;
721
+ }
722
+ if (specificOptions.subject) {
723
+ payload.subject = specificOptions.subject;
724
+ }
725
+ if (specificOptions.contentType) {
726
+ payload.contentType = specificOptions.contentType;
727
+ }
728
+ if (specificOptions.actionLinkBaseUrl && task.actions) {
729
+ payload.actions = payload.actions?.map(action => ({
730
+ ...action,
731
+ url: `${specificOptions.actionLinkBaseUrl}/${action.value}`,
732
+ }));
733
+ }
734
+ }
735
+ if (channelName === 'in-app') {
736
+ if (specificOptions.userId) {
737
+ payload.userId = specificOptions.userId;
738
+ }
739
+ if (specificOptions.priority) {
740
+ payload.priority = specificOptions.priority;
741
+ }
742
+ if (specificOptions.pushNotification !== undefined) {
743
+ payload.pushNotification = specificOptions.pushNotification;
744
+ }
745
+ }
746
+ return payload;
747
+ }
748
+ async validateForm(form, data, applyDefaults) {
749
+ const errors = [];
750
+ const errorFields = [];
751
+ const processedData = { ...data };
752
+ for (const field of form.fields) {
753
+ let value = data[field.name];
754
+ // Apply defaults if configured
755
+ if (applyDefaults && value === undefined && field.default !== undefined) {
756
+ processedData[field.name] = field.default;
757
+ value = field.default;
758
+ }
759
+ // Required field validation
760
+ if (field.required) {
761
+ if (value === undefined || value === null || value === '') {
762
+ errors.push(`required field ${field.name} is missing or empty`);
763
+ errorFields.push(field.name);
764
+ continue;
765
+ }
766
+ }
767
+ // Skip type validation if no value
768
+ if (value === undefined || value === null) {
769
+ continue;
770
+ }
771
+ // Type validation
772
+ switch (field.type) {
773
+ case 'number':
774
+ if (typeof value !== 'number' || isNaN(value)) {
775
+ errors.push(`Field '${field.name}' must be a number but got type ${typeof value}`);
776
+ errorFields.push(field.name);
777
+ }
778
+ break;
779
+ case 'boolean':
780
+ if (typeof value !== 'boolean') {
781
+ errors.push(`Field '${field.name}' must be a boolean but got type ${typeof value}`);
782
+ errorFields.push(field.name);
783
+ }
784
+ break;
785
+ case 'select':
786
+ if (field.options && !field.options.includes(value)) {
787
+ errors.push(`Field '${field.name}' has invalid option '${value}'. Must be one of: ${field.options.join(', ')}`);
788
+ errorFields.push(field.name);
789
+ }
790
+ break;
791
+ case 'multiselect':
792
+ if (!Array.isArray(value)) {
793
+ errors.push(`Field '${field.name}' must be an array`);
794
+ errorFields.push(field.name);
795
+ }
796
+ else if (field.options) {
797
+ const invalidOptions = value.filter(v => !field.options.includes(v));
798
+ if (invalidOptions.length > 0) {
799
+ errors.push(`Field '${field.name}' has invalid options: ${invalidOptions.join(', ')}`);
800
+ errorFields.push(field.name);
801
+ }
802
+ }
803
+ break;
804
+ }
805
+ // Custom validation
806
+ if (field.validation && !errorFields.includes(field.name)) {
807
+ const result = await field.validation(value);
808
+ if (result !== true) {
809
+ const message = typeof result === 'string' ? result : `Field '${field.name}' failed validation`;
810
+ errors.push(message);
811
+ errorFields.push(field.name);
812
+ }
813
+ }
814
+ }
815
+ if (errors.length > 0) {
816
+ return {
817
+ valid: false,
818
+ error: new HumanValidationError(errors.join('; '), errorFields),
819
+ };
820
+ }
821
+ return { valid: true, data: processedData };
822
+ }
823
+ validateSchema(schema, data) {
824
+ const properties = schema.properties;
825
+ const required = schema.required;
826
+ if (!properties) {
827
+ return { valid: true };
828
+ }
829
+ // Check required fields
830
+ if (required) {
831
+ for (const field of required) {
832
+ if (data[field] === undefined) {
833
+ return { valid: false, error: `Required field '${field}' is missing` };
834
+ }
835
+ }
836
+ }
837
+ // Validate types
838
+ for (const [field, fieldSchema] of Object.entries(properties)) {
839
+ const value = data[field];
840
+ if (value === undefined)
841
+ continue;
842
+ const expectedType = fieldSchema.type;
843
+ const actualType = typeof value;
844
+ if (expectedType && actualType !== expectedType) {
845
+ return { valid: false, error: `Field '${field}' should be ${expectedType} but got ${actualType}` };
846
+ }
847
+ }
848
+ return { valid: true };
849
+ }
850
+ buildContext(taskId, task) {
851
+ const channelName = Array.isArray(task.channel) ? task.channel[0] : task.channel;
852
+ const channel = this.channels[channelName];
853
+ return {
854
+ taskId,
855
+ invocationId: `inv-${Date.now()}`,
856
+ task,
857
+ channel: channel,
858
+ state: {
859
+ get: async (key) => (await this.state.storage.get(key)),
860
+ set: async (key, value) => {
861
+ await this.state.storage.put(key, value);
862
+ },
863
+ delete: async (key) => this.state.storage.delete(key),
864
+ },
865
+ log: {
866
+ debug: (message, _data) => console.debug(`[${taskId}] ${message}`),
867
+ info: (message, _data) => console.info(`[${taskId}] ${message}`),
868
+ warn: (message, _data) => console.warn(`[${taskId}] ${message}`),
869
+ error: (message, _data) => console.error(`[${taskId}] ${message}`),
870
+ },
871
+ emit: async (event, data) => {
872
+ await this.emit(event, data);
873
+ },
874
+ signal: task.signal || new AbortController().signal,
875
+ };
876
+ }
877
+ async emit(event, data) {
878
+ if (this.onEvent) {
879
+ await this.onEvent(event, data);
880
+ }
881
+ }
882
+ }
883
+ export default HumanFunctionExecutor;
884
+ //# sourceMappingURL=HumanFunctionExecutor.js.map