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,739 @@
1
+ /**
2
+ * Activities Module
3
+ *
4
+ * Activity proxying and local activity support.
5
+ */
6
+ import { DurableWorkflowRuntime } from '../../runtime';
7
+ import { parseDuration } from '../utils';
8
+ import { WorkerActivityRouter, ActivityTimeoutError, TaskQueueNotRegisteredError, } from '../activity-router';
9
+ import { getCurrentWorkflow, getCurrentStorage, getWorkflowStep, formatDurationForCF, } from './context';
10
+ import { ensureError } from '../utils';
11
+ // Re-export error classes for backward compatibility
12
+ export { ActivityTimeoutError, TaskQueueNotRegisteredError };
13
+ // ============================================================================
14
+ // TASK QUEUE REGISTRY
15
+ // ============================================================================
16
+ /**
17
+ * Shared ActivityRouter instance used for routing activities to workers.
18
+ * This provides the unified routing abstraction used across all compat layers.
19
+ */
20
+ const activityRouter = new WorkerActivityRouter();
21
+ /**
22
+ * Register a worker for a task queue.
23
+ *
24
+ * In real Temporal, workers poll task queues for work. This compat layer
25
+ * validates that a worker is registered before allowing workflow/activity
26
+ * execution on that queue.
27
+ *
28
+ * @param taskQueue - The task queue name to register
29
+ * @param handler - Optional handler configuration for the worker
30
+ * @returns A function to unregister the worker
31
+ *
32
+ * @example
33
+ * ```typescript
34
+ * import { registerWorker } from '@dotdo/temporal'
35
+ *
36
+ * // Simple registration - just validates the queue exists
37
+ * const unregister = registerWorker('my-task-queue')
38
+ *
39
+ * // With workflow types
40
+ * const unregister = registerWorker('my-task-queue', {
41
+ * workflowTypes: new Set(['orderWorkflow', 'paymentWorkflow']),
42
+ * })
43
+ *
44
+ * // Cleanup when done
45
+ * unregister()
46
+ * ```
47
+ */
48
+ export function registerWorker(taskQueue, handler = {}) {
49
+ // Delegate to the shared ActivityRouter instance
50
+ // Cast to router's WorkerHandler type (compatible interface, context param optionality differs)
51
+ return activityRouter.registerWorker(taskQueue, handler);
52
+ }
53
+ /**
54
+ * Check if a task queue has a registered worker
55
+ */
56
+ export function hasWorker(taskQueue) {
57
+ return activityRouter.hasWorker(taskQueue);
58
+ }
59
+ /**
60
+ * Get the worker handler for a task queue
61
+ */
62
+ export function getWorker(taskQueue) {
63
+ return activityRouter.getWorker(taskQueue);
64
+ }
65
+ /**
66
+ * List all registered task queues
67
+ */
68
+ export function listTaskQueues() {
69
+ return activityRouter.listTaskQueues();
70
+ }
71
+ /**
72
+ * Check if task queue routing is enabled.
73
+ *
74
+ * Task queue validation is enabled when at least one worker has been registered.
75
+ * This maintains backward compatibility - existing code that doesnt use
76
+ * registerWorker() will continue to work without changes.
77
+ */
78
+ function isTaskQueueRoutingEnabled() {
79
+ return activityRouter.isRoutingEnabled();
80
+ }
81
+ /**
82
+ * Get the activity router (for testing)
83
+ */
84
+ export function getActivityRouter() {
85
+ return activityRouter;
86
+ }
87
+ /**
88
+ * Clear the activity router (for testing)
89
+ */
90
+ export function clearActivityRouter() {
91
+ activityRouter.clear();
92
+ }
93
+ // ============================================================================
94
+ // TASK QUEUE VALIDATION
95
+ // ============================================================================
96
+ /**
97
+ * Validate that a task queue is registered for workflow execution.
98
+ * Throws TaskQueueNotRegisteredError if not registered.
99
+ *
100
+ * NOTE: Validation is only performed when task queue routing is enabled
101
+ * (i.e., when at least one worker has been registered via registerWorker()).
102
+ * This maintains backward compatibility with existing code.
103
+ *
104
+ * @param taskQueue - The task queue to validate
105
+ * @param workflowType - Optional workflow type for more specific validation
106
+ * @throws TaskQueueNotRegisteredError if no worker is registered
107
+ */
108
+ export function validateTaskQueueForWorkflow(taskQueue, workflowType) {
109
+ // Skip validation if no workers are registered (backward compatibility)
110
+ if (!isTaskQueueRoutingEnabled()) {
111
+ return;
112
+ }
113
+ const worker = activityRouter.getWorker(taskQueue);
114
+ if (!worker) {
115
+ throw new TaskQueueNotRegisteredError(taskQueue, 'workflow');
116
+ }
117
+ // If worker specifies workflow types, validate this type is registered
118
+ if (workflowType && worker.workflowTypes && worker.workflowTypes.size > 0) {
119
+ if (!worker.workflowTypes.has(workflowType)) {
120
+ throw new Error(`Workflow type "${workflowType}" is not registered on task queue "${taskQueue}". ` +
121
+ `Registered types: ${Array.from(worker.workflowTypes).join(', ')}`);
122
+ }
123
+ }
124
+ }
125
+ /**
126
+ * Validate that a task queue is registered for activity execution.
127
+ * Throws TaskQueueNotRegisteredError if not registered.
128
+ *
129
+ * NOTE: Validation is only performed when task queue routing is enabled
130
+ * (i.e., when at least one worker has been registered via registerWorker()).
131
+ * This maintains backward compatibility with existing code.
132
+ *
133
+ * @param taskQueue - The task queue to validate
134
+ * @param activityName - Optional activity name for more specific validation
135
+ * @throws TaskQueueNotRegisteredError if no worker is registered
136
+ */
137
+ function validateTaskQueueForActivity(taskQueue, activityName) {
138
+ // Skip validation if no workers are registered (backward compatibility)
139
+ if (!isTaskQueueRoutingEnabled()) {
140
+ return;
141
+ }
142
+ const worker = activityRouter.getWorker(taskQueue);
143
+ if (!worker) {
144
+ throw new TaskQueueNotRegisteredError(taskQueue, 'activity');
145
+ }
146
+ // If worker specifies activity types, validate this activity is registered
147
+ if (activityName && worker.activityTypes && worker.activityTypes.size > 0) {
148
+ if (!worker.activityTypes.has(activityName)) {
149
+ throw new Error(`Activity "${activityName}" is not registered on task queue "${taskQueue}". ` +
150
+ `Registered activities: ${Array.from(worker.activityTypes).join(', ')}`);
151
+ }
152
+ }
153
+ }
154
+ // ============================================================================
155
+ // PROXY ACTIVITIES
156
+ // ============================================================================
157
+ /**
158
+ * Create activity proxies
159
+ *
160
+ * Activities integrate with multiple execution backends:
161
+ *
162
+ * 1. If a remote activity worker binding is registered for the task queue,
163
+ * route via RPC to the dedicated activity worker
164
+ * - Enables independent scaling for CPU-intensive activities
165
+ * - Supports heartbeats for long-running activities
166
+ * - Worker-level timeout enforcement
167
+ *
168
+ * 2. If a local worker with executeActivity handler is registered, route to that handler
169
+ * - Enables testing workflows with mock activity implementations
170
+ * - Handles timeouts, retries, and error classification
171
+ *
172
+ * 3. If WorkflowStep context is available (CF Workflows), use step.do()
173
+ * - DURABLE: automatically retries and survives restarts
174
+ * - REPLAY: completed steps return cached results
175
+ *
176
+ * 4. Otherwise, fall back to DurableWorkflowRuntime
177
+ *
178
+ * Activities can specify a `taskQueue` option to route execution to a specific
179
+ * worker. If a task queue is specified, it must have a registered worker.
180
+ * If no task queue is specified, activities use the workflow's task queue.
181
+ */
182
+ export function proxyActivities(options) {
183
+ // Activity task queue (can be different from workflow's task queue)
184
+ const activityTaskQueue = options.taskQueue;
185
+ // Parse timeouts once
186
+ const startToCloseTimeoutMs = options.startToCloseTimeout
187
+ ? parseDuration(options.startToCloseTimeout)
188
+ : undefined;
189
+ const heartbeatTimeoutMs = options.heartbeatTimeout
190
+ ? parseDuration(options.heartbeatTimeout)
191
+ : undefined;
192
+ // Build CF Workflows step.do() options from Temporal activity options
193
+ const buildStepDoOptions = () => {
194
+ const stepOptions = {};
195
+ // Map retry policy
196
+ if (options.retry?.maximumAttempts) {
197
+ stepOptions.retries = {
198
+ limit: options.retry.maximumAttempts,
199
+ backoff: options.retry.backoffCoefficient && options.retry.backoffCoefficient > 1 ? 'exponential' : 'constant',
200
+ delay: options.retry.initialInterval ? String(options.retry.initialInterval) : undefined,
201
+ };
202
+ }
203
+ // Map timeout
204
+ if (options.startToCloseTimeout) {
205
+ stepOptions.timeout = typeof options.startToCloseTimeout === 'string'
206
+ ? options.startToCloseTimeout
207
+ : formatDurationForCF(parseDuration(options.startToCloseTimeout));
208
+ }
209
+ // Only return options if we have something to configure
210
+ if (stepOptions.retries || stepOptions.timeout) {
211
+ return stepOptions;
212
+ }
213
+ return undefined;
214
+ };
215
+ return new Proxy({}, {
216
+ get(_, name) {
217
+ return async (...args) => {
218
+ const workflow = getCurrentWorkflow();
219
+ if (!workflow) {
220
+ throw new Error('Activities can only be called within a workflow');
221
+ }
222
+ // Determine which task queue to use for this activity
223
+ const targetTaskQueue = activityTaskQueue ?? workflow.taskQueue;
224
+ // Validate the task queue has a registered worker
225
+ validateTaskQueueForActivity(targetTaskQueue, name);
226
+ // Include task queue in step ID to ensure isolation between queues
227
+ const stepId = `activity:${targetTaskQueue}:${name}:${JSON.stringify(args)}`;
228
+ // Check for replay in workflow stepResults (handles both success and error)
229
+ if (workflow.stepResults.has(stepId)) {
230
+ const cached = workflow.stepResults.get(stepId);
231
+ // If cached value is an error, re-throw it
232
+ if (cached instanceof Error) {
233
+ throw cached;
234
+ }
235
+ return cached;
236
+ }
237
+ // Check for CF Workflows step context - use step.do() for durability
238
+ const step = getWorkflowStep();
239
+ if (step) {
240
+ // Use CF Workflows native step.do() - DURABLE
241
+ // Use per-workflow counter for deterministic IDs across concurrent workflows
242
+ workflow.activityStepCounter++;
243
+ const stepName = `activity:${name}:${workflow.activityStepCounter}`;
244
+ const stepDoOptions = buildStepDoOptions();
245
+ // The callback is what CF Workflows will execute.
246
+ // Priority: Remote worker > Local worker > Stub
247
+ const callback = async () => {
248
+ // 1. Check for remote activity worker binding (independent scaling)
249
+ const remoteBinding = remoteActivityBindings.get(targetTaskQueue);
250
+ if (remoteBinding) {
251
+ const executionId = `${workflow.workflowId}:${workflow.runId}:${name}:${workflow.activityStepCounter}`;
252
+ const response = await remoteBinding.execute({
253
+ executionId,
254
+ activityName: name,
255
+ args,
256
+ startToCloseTimeoutMs,
257
+ heartbeatTimeoutMs,
258
+ workflowId: workflow.workflowId,
259
+ runId: workflow.runId,
260
+ });
261
+ if (!response.success) {
262
+ const error = new Error(response.error?.message ?? 'Activity execution failed');
263
+ error.name = response.error?.name ?? 'ActivityError';
264
+ throw error;
265
+ }
266
+ return response.result;
267
+ }
268
+ // 2. Check if local worker has a handler for this activity
269
+ const worker = activityRouter.getWorker(targetTaskQueue);
270
+ if (worker?.executeActivity) {
271
+ // Create activity context with cancellation signal
272
+ const activityContext = {
273
+ signal: workflow.abortController?.signal,
274
+ };
275
+ return worker.executeActivity(name, args, activityContext);
276
+ }
277
+ // 3. Fallback for CF Workflows runtime (no local handler)
278
+ return { _activity: name, _args: args, _stub: true };
279
+ };
280
+ // Call step.do() with or without options
281
+ const result = stepDoOptions
282
+ ? await step.do(stepName, stepDoOptions, callback)
283
+ : await step.do(stepName, callback);
284
+ workflow.stepResults.set(stepId, result);
285
+ workflow.historyLength++;
286
+ return result;
287
+ }
288
+ // Fallback when no WorkflowStep is available:
289
+ // Priority: Remote worker > Local worker > DurableWorkflowRuntime
290
+ // 1. Check for remote activity worker binding (independent scaling)
291
+ const remoteBinding = remoteActivityBindings.get(targetTaskQueue);
292
+ if (remoteBinding) {
293
+ const executionId = `${workflow.workflowId}:${workflow.runId}:${name}:${Date.now()}`;
294
+ try {
295
+ const response = await remoteBinding.execute({
296
+ executionId,
297
+ activityName: name,
298
+ args,
299
+ startToCloseTimeoutMs,
300
+ heartbeatTimeoutMs,
301
+ workflowId: workflow.workflowId,
302
+ runId: workflow.runId,
303
+ });
304
+ if (!response.success) {
305
+ const error = new Error(response.error?.message ?? 'Activity execution failed');
306
+ error.name = response.error?.name ?? 'ActivityError';
307
+ // Cache error for replay
308
+ workflow.stepResults.set(stepId, error);
309
+ workflow.historyLength++;
310
+ throw error;
311
+ }
312
+ // Cache successful result
313
+ workflow.stepResults.set(stepId, response.result);
314
+ workflow.historyLength++;
315
+ return response.result;
316
+ }
317
+ catch (error) {
318
+ const err = ensureError(error);
319
+ workflow.stepResults.set(stepId, err);
320
+ workflow.historyLength++;
321
+ throw err;
322
+ }
323
+ }
324
+ // 2. Get the local worker for this task queue via activityRouter
325
+ const worker = activityRouter.getWorker(targetTaskQueue);
326
+ // If local worker has executeActivity handler, route via activityRouter (no step.do() durability)
327
+ if (worker?.executeActivity) {
328
+ // Create activity context with cancellation signal
329
+ const activityContext = {
330
+ signal: workflow.abortController?.signal,
331
+ };
332
+ // Build ActivityRouterOptions from Temporal ActivityOptions
333
+ // Use heartbeat timeout if specified and shorter than start-to-close timeout
334
+ // Heartbeat timeout in Temporal means the activity must heartbeat within this interval
335
+ // In our emulation, we use it as an effective timeout for activities that don't heartbeat
336
+ let effectiveTimeout = startToCloseTimeoutMs;
337
+ if (heartbeatTimeoutMs) {
338
+ if (!effectiveTimeout || heartbeatTimeoutMs < effectiveTimeout) {
339
+ effectiveTimeout = heartbeatTimeoutMs;
340
+ }
341
+ }
342
+ const routerOptions = {
343
+ taskQueue: targetTaskQueue,
344
+ timeout: effectiveTimeout,
345
+ retries: options.retry ? {
346
+ maximumAttempts: options.retry.maximumAttempts,
347
+ initialInterval: options.retry.initialInterval,
348
+ backoffCoefficient: options.retry.backoffCoefficient,
349
+ maximumInterval: options.retry.maximumInterval,
350
+ nonRetryableErrors: options.retry.nonRetryableErrorTypes ? [...options.retry.nonRetryableErrorTypes] : undefined,
351
+ } : undefined,
352
+ };
353
+ try {
354
+ // Route activity via the shared ActivityRouter - handles timeouts and retries
355
+ const result = await activityRouter.route(name, args, routerOptions, activityContext);
356
+ // Cache successful result
357
+ workflow.stepResults.set(stepId, result);
358
+ workflow.historyLength++;
359
+ return result;
360
+ }
361
+ catch (error) {
362
+ // Cache error for replay (determinism)
363
+ const err = ensureError(error);
364
+ workflow.stepResults.set(stepId, err);
365
+ workflow.historyLength++;
366
+ throw err;
367
+ }
368
+ }
369
+ // Fallback: Execute through DurableWorkflowRuntime
370
+ // Uses getCurrentStorage() for consistent storage access
371
+ const runtime = new DurableWorkflowRuntime({
372
+ storage: getCurrentStorage(),
373
+ retryPolicy: options.retry
374
+ ? {
375
+ maxAttempts: options.retry.maximumAttempts ?? 3,
376
+ initialDelayMs: options.retry.initialInterval ? parseDuration(options.retry.initialInterval) : 1000,
377
+ maxDelayMs: options.retry.maximumInterval ? parseDuration(options.retry.maximumInterval) : 30000,
378
+ backoffMultiplier: options.retry.backoffCoefficient ?? 2,
379
+ jitter: true,
380
+ }
381
+ : undefined,
382
+ });
383
+ const result = await runtime.executeStep(stepId, {
384
+ path: ['Activity', name],
385
+ context: { args, taskQueue: targetTaskQueue },
386
+ contextHash: stepId,
387
+ runtime,
388
+ }, args, 'do');
389
+ workflow.stepResults.set(stepId, result);
390
+ workflow.historyLength++;
391
+ return result;
392
+ };
393
+ },
394
+ });
395
+ }
396
+ // ============================================================================
397
+ // LOCAL ACTIVITIES
398
+ // ============================================================================
399
+ /**
400
+ * Create local activity proxies
401
+ */
402
+ export function proxyLocalActivities(options) {
403
+ // Local activities run in the same process with shorter timeouts
404
+ return proxyActivities(options);
405
+ }
406
+ /**
407
+ * Activity Worker - Executes activities on a dedicated CF Worker.
408
+ *
409
+ * This class implements the WorkerEntrypoint pattern for RPC access
410
+ * via Service Bindings, enabling activities to run on separate workers
411
+ * that can be independently scaled.
412
+ *
413
+ * ## Architecture
414
+ *
415
+ * ```
416
+ * [Workflow DO] --RPC--> [Activity Worker] --execute--> [Activity Function]
417
+ * ^ |
418
+ * | v
419
+ * +------- heartbeat ------+
420
+ * ```
421
+ *
422
+ * ## Deployment
423
+ *
424
+ * ```toml
425
+ * # wrangler.toml for activity worker
426
+ * name = "activity-worker-image-processing"
427
+ *
428
+ * [[services]]
429
+ * binding = "IMAGE_WORKER"
430
+ * service = "activity-worker-image-processing"
431
+ * entrypoint = "ActivityWorker"
432
+ * ```
433
+ *
434
+ * @example
435
+ * ```typescript
436
+ * // activity-worker.ts
437
+ * import { createActivityWorker } from '@dotdo/temporal'
438
+ *
439
+ * const processImage = async (imageUrl: string, options: ImageOptions) => {
440
+ * // CPU-intensive image processing
441
+ * return { url: processedUrl }
442
+ * }
443
+ *
444
+ * export const ActivityWorker = createActivityWorker({
445
+ * taskQueue: 'image-processing',
446
+ * activities: {
447
+ * processImage,
448
+ * },
449
+ * })
450
+ *
451
+ * // In workflow:
452
+ * const activities = proxyActivities<typeof ActivityWorker.activities>({
453
+ * taskQueue: 'image-processing',
454
+ * startToCloseTimeout: '5m',
455
+ * })
456
+ *
457
+ * const result = await activities.processImage(imageUrl, options)
458
+ * ```
459
+ */
460
+ export class ActivityWorker {
461
+ taskQueue;
462
+ activities;
463
+ defaultStartToCloseTimeoutMs;
464
+ defaultHeartbeatTimeoutMs;
465
+ maxConcurrentActivities;
466
+ namespace;
467
+ activeActivities = new Map();
468
+ constructor(config) {
469
+ this.taskQueue = config.taskQueue;
470
+ this.activities = config.activities;
471
+ this.defaultStartToCloseTimeoutMs = config.defaultStartToCloseTimeout
472
+ ? parseDuration(config.defaultStartToCloseTimeout)
473
+ : 5 * 60 * 1000; // 5 minutes
474
+ this.defaultHeartbeatTimeoutMs = config.defaultHeartbeatTimeout
475
+ ? parseDuration(config.defaultHeartbeatTimeout)
476
+ : 30 * 1000; // 30 seconds
477
+ this.maxConcurrentActivities = config.maxConcurrentActivities ?? 10;
478
+ this.namespace = config.namespace ?? config.taskQueue;
479
+ }
480
+ /**
481
+ * Execute an activity.
482
+ * This is the main RPC method called from workflows.
483
+ */
484
+ async execute(request) {
485
+ const startTime = Date.now();
486
+ const { executionId, activityName, args } = request;
487
+ // Check if activity exists
488
+ const activityFn = this.activities[activityName];
489
+ if (!activityFn) {
490
+ return {
491
+ executionId,
492
+ success: false,
493
+ error: {
494
+ name: 'ActivityNotFoundError',
495
+ message: `Activity "${activityName}" not found on task queue "${this.taskQueue}"`,
496
+ isRetryable: false,
497
+ },
498
+ durationMs: Date.now() - startTime,
499
+ };
500
+ }
501
+ // Check concurrency limit
502
+ if (this.activeActivities.size >= this.maxConcurrentActivities) {
503
+ return {
504
+ executionId,
505
+ success: false,
506
+ error: {
507
+ name: 'ActivityConcurrencyLimitError',
508
+ message: `Activity worker at capacity (${this.maxConcurrentActivities} concurrent activities)`,
509
+ isRetryable: true,
510
+ },
511
+ durationMs: Date.now() - startTime,
512
+ };
513
+ }
514
+ // Setup activity tracking
515
+ const abortController = new AbortController();
516
+ const activeActivity = {
517
+ id: executionId,
518
+ name: activityName,
519
+ startTime,
520
+ lastHeartbeat: startTime,
521
+ abortController,
522
+ };
523
+ this.activeActivities.set(executionId, activeActivity);
524
+ // Setup timeouts
525
+ const startToCloseTimeoutMs = request.startToCloseTimeoutMs ?? this.defaultStartToCloseTimeoutMs;
526
+ const heartbeatTimeoutMs = request.heartbeatTimeoutMs ?? this.defaultHeartbeatTimeoutMs;
527
+ let lastHeartbeatDetails;
528
+ // Heartbeat context for the activity
529
+ const heartbeatCtx = {
530
+ heartbeat: (details) => {
531
+ activeActivity.lastHeartbeat = Date.now();
532
+ activeActivity.heartbeatDetails = details;
533
+ lastHeartbeatDetails = details;
534
+ // Reset heartbeat timeout
535
+ if (activeActivity.heartbeatTimeoutId) {
536
+ clearTimeout(activeActivity.heartbeatTimeoutId);
537
+ }
538
+ activeActivity.heartbeatTimeoutId = setTimeout(() => {
539
+ abortController.abort(new Error('Activity heartbeat timeout'));
540
+ }, heartbeatTimeoutMs);
541
+ },
542
+ get isCancelled() {
543
+ return abortController.signal.aborted;
544
+ },
545
+ signal: abortController.signal,
546
+ };
547
+ try {
548
+ // Setup start-to-close timeout
549
+ activeActivity.timeoutId = setTimeout(() => {
550
+ abortController.abort(new Error('Activity start-to-close timeout'));
551
+ }, startToCloseTimeoutMs);
552
+ // Setup initial heartbeat timeout
553
+ activeActivity.heartbeatTimeoutId = setTimeout(() => {
554
+ abortController.abort(new Error('Activity heartbeat timeout'));
555
+ }, heartbeatTimeoutMs);
556
+ // Execute the activity
557
+ // Check if activity expects heartbeat context (first param is HeartbeatContext)
558
+ const result = await activityFn(...args);
559
+ return {
560
+ executionId,
561
+ success: true,
562
+ result,
563
+ durationMs: Date.now() - startTime,
564
+ lastHeartbeatDetails,
565
+ };
566
+ }
567
+ catch (error) {
568
+ const err = ensureError(error);
569
+ const isTimeout = err.message.includes('timeout');
570
+ const isCancelled = err.message.includes('cancelled') || abortController.signal.aborted;
571
+ return {
572
+ executionId,
573
+ success: false,
574
+ error: {
575
+ name: err.name,
576
+ message: err.message,
577
+ stack: err.stack,
578
+ // Timeouts and cancellations are not retryable
579
+ isRetryable: !isTimeout && !isCancelled,
580
+ },
581
+ durationMs: Date.now() - startTime,
582
+ lastHeartbeatDetails,
583
+ };
584
+ }
585
+ finally {
586
+ // Cleanup
587
+ if (activeActivity.timeoutId) {
588
+ clearTimeout(activeActivity.timeoutId);
589
+ }
590
+ if (activeActivity.heartbeatTimeoutId) {
591
+ clearTimeout(activeActivity.heartbeatTimeoutId);
592
+ }
593
+ this.activeActivities.delete(executionId);
594
+ }
595
+ }
596
+ /**
597
+ * Cancel an in-progress activity.
598
+ */
599
+ async cancel(executionId) {
600
+ const activity = this.activeActivities.get(executionId);
601
+ if (!activity) {
602
+ return false;
603
+ }
604
+ activity.abortController.abort(new Error('Activity cancelled'));
605
+ return true;
606
+ }
607
+ /**
608
+ * Get heartbeat status for an activity.
609
+ */
610
+ async heartbeatStatus(executionId) {
611
+ const activity = this.activeActivities.get(executionId);
612
+ if (!activity) {
613
+ return { found: false };
614
+ }
615
+ return {
616
+ found: true,
617
+ lastHeartbeat: activity.lastHeartbeat,
618
+ details: activity.heartbeatDetails,
619
+ };
620
+ }
621
+ /**
622
+ * Get worker status (for health checks).
623
+ */
624
+ async status() {
625
+ return {
626
+ taskQueue: this.taskQueue,
627
+ activeCount: this.activeActivities.size,
628
+ maxConcurrent: this.maxConcurrentActivities,
629
+ activities: Object.keys(this.activities),
630
+ };
631
+ }
632
+ }
633
+ /**
634
+ * Create an activity worker for a task queue.
635
+ *
636
+ * This is the main factory function for creating activity workers that
637
+ * run on dedicated Cloudflare Workers for independent scaling.
638
+ *
639
+ * ## Usage
640
+ *
641
+ * 1. Define your activities as async functions
642
+ * 2. Create the worker with createActivityWorker()
643
+ * 3. Export the worker class from your worker entry point
644
+ * 4. Configure service binding in wrangler.toml
645
+ * 5. Use proxyActivities() in workflows with matching taskQueue
646
+ *
647
+ * @example
648
+ * ```typescript
649
+ * // activities/image-worker.ts
650
+ * import { createActivityWorker } from '@dotdo/temporal'
651
+ *
652
+ * // Define activities
653
+ * async function processImage(url: string, options: ImageOptions) {
654
+ * // CPU-intensive processing
655
+ * return { processedUrl: '...' }
656
+ * }
657
+ *
658
+ * async function generateThumbnail(url: string, size: number) {
659
+ * // Generate thumbnail
660
+ * return { thumbnailUrl: '...' }
661
+ * }
662
+ *
663
+ * // Create the worker
664
+ * export const activityWorker = createActivityWorker({
665
+ * taskQueue: 'image-processing',
666
+ * activities: {
667
+ * processImage,
668
+ * generateThumbnail,
669
+ * },
670
+ * defaultStartToCloseTimeout: '10m',
671
+ * defaultHeartbeatTimeout: '1m',
672
+ * maxConcurrentActivities: 5,
673
+ * })
674
+ *
675
+ * // Export for Cloudflare Workers
676
+ * export { activityWorker as ActivityWorker }
677
+ *
678
+ * // In wrangler.toml:
679
+ * // [[services]]
680
+ * // binding = "IMAGE_ACTIVITIES"
681
+ * // service = "image-processing-worker"
682
+ * // entrypoint = "ActivityWorker"
683
+ * ```
684
+ *
685
+ * @param config - Activity worker configuration
686
+ * @returns ActivityWorker instance that can be exported as a WorkerEntrypoint
687
+ */
688
+ export function createActivityWorker(config) {
689
+ return new ActivityWorker(config);
690
+ }
691
+ /**
692
+ * Registry of remote activity worker bindings.
693
+ * Used by proxyActivities to route to remote workers.
694
+ */
695
+ const remoteActivityBindings = new Map();
696
+ /**
697
+ * Register a remote activity worker binding for a task queue.
698
+ *
699
+ * Call this during worker initialization to register service bindings
700
+ * for remote activity workers.
701
+ *
702
+ * @example
703
+ * ```typescript
704
+ * export default {
705
+ * async fetch(request: Request, env: Env) {
706
+ * // Register remote activity workers
707
+ * registerRemoteActivityWorker('image-processing', env.IMAGE_ACTIVITIES)
708
+ * registerRemoteActivityWorker('email-sending', env.EMAIL_ACTIVITIES)
709
+ *
710
+ * // ... rest of handler
711
+ * }
712
+ * }
713
+ * ```
714
+ *
715
+ * @param taskQueue - Task queue name
716
+ * @param binding - Service binding to the activity worker
717
+ */
718
+ export function registerRemoteActivityWorker(taskQueue, binding) {
719
+ remoteActivityBindings.set(taskQueue, binding);
720
+ }
721
+ /**
722
+ * Get a registered remote activity worker binding.
723
+ */
724
+ export function getRemoteActivityWorker(taskQueue) {
725
+ return remoteActivityBindings.get(taskQueue);
726
+ }
727
+ /**
728
+ * Clear remote activity worker bindings (for testing).
729
+ */
730
+ export function clearRemoteActivityWorkers() {
731
+ remoteActivityBindings.clear();
732
+ }
733
+ /**
734
+ * Check if a task queue has a remote activity worker binding.
735
+ */
736
+ export function hasRemoteActivityWorker(taskQueue) {
737
+ return remoteActivityBindings.has(taskQueue);
738
+ }
739
+ //# sourceMappingURL=activities.js.map