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,415 @@
1
+ /**
2
+ * Cloudflare Snippets CLI
3
+ *
4
+ * Deploy, list, and manage Cloudflare Snippets for a zone.
5
+ *
6
+ * Usage:
7
+ * do snippets list # List all snippets
8
+ * do snippets deploy <name> <file> # Deploy a snippet
9
+ * do snippets delete <name> # Delete a snippet
10
+ * do snippets rules <name> # Show rules for a snippet
11
+ * do snippets enable <name> <pattern> # Enable snippet on URL pattern
12
+ *
13
+ * Environment:
14
+ * CF_API_TOKEN - Cloudflare API token (required)
15
+ * CF_ZONE_ID - Default zone ID (or use --zone)
16
+ */
17
+
18
+ export const name = 'snippets'
19
+ export const description = 'Manage Cloudflare Snippets'
20
+
21
+ // ============================================================================
22
+ // Types
23
+ // ============================================================================
24
+
25
+ interface SnippetMetadata {
26
+ main_module: string
27
+ }
28
+
29
+ interface Snippet {
30
+ snippet_name: string
31
+ created_on: string
32
+ modified_on: string
33
+ }
34
+
35
+ interface SnippetRule {
36
+ snippet_name: string
37
+ enabled: boolean
38
+ expression: string
39
+ description?: string
40
+ }
41
+
42
+ interface CloudflareResponse<T> {
43
+ success: boolean
44
+ errors: Array<{ code: number; message: string }>
45
+ messages: Array<{ code: number; message: string }>
46
+ result: T
47
+ }
48
+
49
+ interface RunOptions {
50
+ fetch?: typeof fetch
51
+ env?: Record<string, string | undefined>
52
+ }
53
+
54
+ // ============================================================================
55
+ // API Client
56
+ // ============================================================================
57
+
58
+ class SnippetsAPI {
59
+ private baseUrl: string
60
+ private token: string
61
+ private fetchFn: typeof fetch
62
+
63
+ constructor(zoneId: string, token: string, fetchFn: typeof fetch = fetch) {
64
+ this.baseUrl = `https://api.cloudflare.com/client/v4/zones/${zoneId}/snippets`
65
+ this.token = token
66
+ this.fetchFn = fetchFn
67
+ }
68
+
69
+ private async request<T>(
70
+ path: string,
71
+ options: RequestInit = {}
72
+ ): Promise<CloudflareResponse<T>> {
73
+ const url = path ? `${this.baseUrl}/${path}` : this.baseUrl
74
+ const response = await this.fetchFn(url, {
75
+ ...options,
76
+ headers: {
77
+ Authorization: `Bearer ${this.token}`,
78
+ ...options.headers,
79
+ },
80
+ })
81
+
82
+ const data = await response.json()
83
+
84
+ if (!response.ok) {
85
+ const errors = (data as CloudflareResponse<T>).errors
86
+ ?.map((e) => e.message)
87
+ .join(', ')
88
+ throw new Error(`API error (${response.status}): ${errors || response.statusText}`)
89
+ }
90
+
91
+ return data as CloudflareResponse<T>
92
+ }
93
+
94
+ async list(): Promise<Snippet[]> {
95
+ const response = await this.request<Snippet[]>('')
96
+ return response.result
97
+ }
98
+
99
+ async get(name: string): Promise<Snippet> {
100
+ const response = await this.request<Snippet>(name)
101
+ return response.result
102
+ }
103
+
104
+ async deploy(name: string, code: string, mainModule = 'snippet.js'): Promise<Snippet> {
105
+ const metadata: SnippetMetadata = { main_module: mainModule }
106
+
107
+ const form = new FormData()
108
+ form.append('metadata', JSON.stringify(metadata))
109
+ form.append(mainModule, new Blob([code], { type: 'application/javascript' }), mainModule)
110
+
111
+ const response = await this.request<Snippet>(name, {
112
+ method: 'PUT',
113
+ body: form,
114
+ })
115
+
116
+ return response.result
117
+ }
118
+
119
+ async delete(name: string): Promise<void> {
120
+ await this.request(name, { method: 'DELETE' })
121
+ }
122
+
123
+ async getRules(name: string): Promise<SnippetRule[]> {
124
+ const response = await this.request<SnippetRule[]>(`${name}/rules`)
125
+ return response.result
126
+ }
127
+
128
+ async setRules(name: string, rules: Omit<SnippetRule, 'snippet_name'>[]): Promise<SnippetRule[]> {
129
+ const response = await this.request<SnippetRule[]>(`${name}/rules`, {
130
+ method: 'PUT',
131
+ headers: { 'Content-Type': 'application/json' },
132
+ body: JSON.stringify(rules.map((r) => ({ ...r, snippet_name: name }))),
133
+ })
134
+ return response.result
135
+ }
136
+
137
+ // Zone-level rules endpoint
138
+ async getAllRules(): Promise<SnippetRule[]> {
139
+ const url = this.baseUrl.replace('/snippets', '/snippet_rules')
140
+ const response = await this.fetchFn(url, {
141
+ headers: { Authorization: `Bearer ${this.token}` },
142
+ })
143
+ const data = (await response.json()) as CloudflareResponse<SnippetRule[]>
144
+ return data.result
145
+ }
146
+ }
147
+
148
+ // ============================================================================
149
+ // Commands
150
+ // ============================================================================
151
+
152
+ async function listSnippets(api: SnippetsAPI): Promise<void> {
153
+ const snippets = await api.list()
154
+
155
+ if (snippets.length === 0) {
156
+ console.log('No snippets found')
157
+ return
158
+ }
159
+
160
+ console.log('Snippets:')
161
+ for (const snippet of snippets) {
162
+ const modified = new Date(snippet.modified_on).toLocaleDateString()
163
+ console.log(` ${snippet.snippet_name} (modified: ${modified})`)
164
+ }
165
+ }
166
+
167
+ async function deploySnippet(
168
+ api: SnippetsAPI,
169
+ name: string,
170
+ filePath: string,
171
+ readFile: (path: string) => Promise<string>
172
+ ): Promise<void> {
173
+ console.log(`Deploying snippet "${name}" from ${filePath}...`)
174
+
175
+ const code = await readFile(filePath)
176
+ const result = await api.deploy(name, code)
177
+
178
+ console.log(`Deployed successfully`)
179
+ console.log(` Name: ${result.snippet_name}`)
180
+ console.log(` Modified: ${result.modified_on}`)
181
+ }
182
+
183
+ async function deleteSnippet(api: SnippetsAPI, name: string): Promise<void> {
184
+ console.log(`Deleting snippet "${name}"...`)
185
+ await api.delete(name)
186
+ console.log('Deleted successfully')
187
+ }
188
+
189
+ async function showRules(api: SnippetsAPI, name: string): Promise<void> {
190
+ const rules = await api.getRules(name)
191
+
192
+ if (rules.length === 0) {
193
+ console.log(`No rules configured for "${name}"`)
194
+ return
195
+ }
196
+
197
+ console.log(`Rules for "${name}":`)
198
+ for (const rule of rules) {
199
+ const status = rule.enabled ? '✓' : '✗'
200
+ console.log(` ${status} ${rule.expression}`)
201
+ if (rule.description) {
202
+ console.log(` ${rule.description}`)
203
+ }
204
+ }
205
+ }
206
+
207
+ async function enableSnippet(
208
+ api: SnippetsAPI,
209
+ name: string,
210
+ pattern: string,
211
+ description?: string
212
+ ): Promise<void> {
213
+ // Convert pattern to Cloudflare expression
214
+ // Supports:
215
+ // http.request.* -> raw Cloudflare expression (pass through)
216
+ // /path?param= -> path + query string match
217
+ // ?param= -> query string only
218
+ // /path/* -> path glob pattern
219
+ // $.search?q= -> exact path with query param
220
+ let expression: string
221
+
222
+ if (pattern.startsWith('http.')) {
223
+ // Already a Cloudflare expression
224
+ expression = pattern
225
+ } else if (pattern.includes('?')) {
226
+ // Query string pattern: /path?param= or ?param=
227
+ const [pathPart, queryPart] = pattern.split('?')
228
+ const conditions: string[] = []
229
+
230
+ if (pathPart) {
231
+ // Escape special chars for exact or glob match
232
+ if (pathPart.includes('*')) {
233
+ const regex = pathPart.replace(/\./g, '\\.').replace(/\$/g, '\\$').replace(/\*/g, '.*')
234
+ conditions.push(`http.request.uri.path matches "^${regex}$"`)
235
+ } else {
236
+ conditions.push(`http.request.uri.path eq "${pathPart}"`)
237
+ }
238
+ }
239
+
240
+ if (queryPart) {
241
+ // Query param check: "q=" -> query contains "q="
242
+ conditions.push(`http.request.uri.query contains "${queryPart}"`)
243
+ }
244
+
245
+ expression = conditions.join(' and ')
246
+ } else {
247
+ // Path-only glob pattern
248
+ const regex = pattern
249
+ .replace(/\./g, '\\.')
250
+ .replace(/\$/g, '\\$')
251
+ .replace(/\*/g, '.*')
252
+
253
+ expression = `http.request.uri.path matches "^${regex}$"`
254
+ }
255
+
256
+ console.log(`Enabling snippet "${name}" for pattern: ${pattern}`)
257
+ console.log(` Expression: ${expression}`)
258
+
259
+ const rules = await api.setRules(name, [
260
+ {
261
+ enabled: true,
262
+ expression,
263
+ description: description || `Enable ${name} for ${pattern}`,
264
+ },
265
+ ])
266
+
267
+ console.log('Rule configured successfully')
268
+ console.log(` Enabled: ${rules[0].enabled}`)
269
+ }
270
+
271
+ // ============================================================================
272
+ // Main Entry Point
273
+ // ============================================================================
274
+
275
+ export async function run(args: string[], options: RunOptions = {}): Promise<{ success: boolean }> {
276
+ const env = options.env ?? process.env
277
+ const fetchFn = options.fetch ?? fetch
278
+
279
+ // Parse arguments
280
+ const [subcommand, ...rest] = args
281
+
282
+ // Parse flags
283
+ let zoneId = env.CF_ZONE_ID
284
+ const flagArgs: string[] = []
285
+
286
+ for (let i = 0; i < rest.length; i++) {
287
+ if (rest[i] === '--zone' && rest[i + 1]) {
288
+ zoneId = rest[i + 1]
289
+ i++ // Skip next arg
290
+ } else if (!rest[i].startsWith('--')) {
291
+ flagArgs.push(rest[i])
292
+ }
293
+ }
294
+
295
+ // Validate environment
296
+ const token = env.CF_API_TOKEN
297
+ if (!token) {
298
+ console.error('Error: CF_API_TOKEN environment variable is required')
299
+ console.error('Get a token from: https://dash.cloudflare.com/profile/api-tokens')
300
+ return { success: false }
301
+ }
302
+
303
+ if (!zoneId) {
304
+ console.error('Error: CF_ZONE_ID environment variable or --zone flag is required')
305
+ console.error('Find your zone ID in the Cloudflare dashboard Overview page')
306
+ return { success: false }
307
+ }
308
+
309
+ const api = new SnippetsAPI(zoneId, token, fetchFn)
310
+
311
+ // File reader (can be overridden in tests)
312
+ const readFile = async (path: string): Promise<string> => {
313
+ const fs = await import('fs/promises')
314
+ return fs.readFile(path, 'utf-8')
315
+ }
316
+
317
+ try {
318
+ switch (subcommand) {
319
+ case 'list':
320
+ case 'ls':
321
+ await listSnippets(api)
322
+ break
323
+
324
+ case 'deploy':
325
+ case 'push': {
326
+ const [name, filePath] = flagArgs
327
+ if (!name || !filePath) {
328
+ console.error('Usage: do snippets deploy <name> <file>')
329
+ return { success: false }
330
+ }
331
+ await deploySnippet(api, name, filePath, readFile)
332
+ break
333
+ }
334
+
335
+ case 'delete':
336
+ case 'rm': {
337
+ const [name] = flagArgs
338
+ if (!name) {
339
+ console.error('Usage: do snippets delete <name>')
340
+ return { success: false }
341
+ }
342
+ await deleteSnippet(api, name)
343
+ break
344
+ }
345
+
346
+ case 'rules': {
347
+ const [name] = flagArgs
348
+ if (!name) {
349
+ console.error('Usage: do snippets rules <name>')
350
+ return { success: false }
351
+ }
352
+ await showRules(api, name)
353
+ break
354
+ }
355
+
356
+ case 'enable': {
357
+ const [name, pattern, description] = flagArgs
358
+ if (!name || !pattern) {
359
+ console.error('Usage: do snippets enable <name> <pattern> [description]')
360
+ console.error('Examples:')
361
+ console.error(' do snippets enable proxy "/*"')
362
+ console.error(' do snippets enable api "/api/*"')
363
+ return { success: false }
364
+ }
365
+ await enableSnippet(api, name, pattern, description)
366
+ break
367
+ }
368
+
369
+ case undefined:
370
+ case 'help':
371
+ console.log(`
372
+ Cloudflare Snippets CLI
373
+
374
+ Usage:
375
+ do snippets list List all snippets
376
+ do snippets deploy <name> <file> Deploy a snippet
377
+ do snippets delete <name> Delete a snippet
378
+ do snippets rules <name> Show rules for a snippet
379
+ do snippets enable <name> <pattern> Enable snippet on URL pattern
380
+
381
+ Pattern Syntax:
382
+ /* All paths (glob)
383
+ /api/* Path prefix (glob)
384
+ /$.search?q= Exact path + query param
385
+ ?q= Any path with query param
386
+ http.host eq X Raw Cloudflare expression
387
+
388
+ Options:
389
+ --zone <id> Override CF_ZONE_ID
390
+
391
+ Environment:
392
+ CF_API_TOKEN Cloudflare API token (required)
393
+ CF_ZONE_ID Default zone ID
394
+
395
+ Examples:
396
+ do snippets deploy query ./snippets/query.js
397
+ do snippets enable query "/$.search?q="
398
+ do snippets enable query "?q=" "Search queries only"
399
+ do snippets enable proxy "/api/*"
400
+ `)
401
+ break
402
+
403
+ default:
404
+ console.error(`Unknown subcommand: ${subcommand}`)
405
+ console.error('Run "do snippets help" for usage')
406
+ return { success: false }
407
+ }
408
+
409
+ return { success: true }
410
+ } catch (error) {
411
+ const message = error instanceof Error ? error.message : String(error)
412
+ console.error('Error:', message)
413
+ return { success: false }
414
+ }
415
+ }
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Tunnel Command
3
+ *
4
+ * Exposes local development server via Cloudflare Tunnel.
5
+ * Supports both quick tunnels (temporary) and named tunnels (persistent).
6
+ */
7
+
8
+ import { Command } from 'commander'
9
+ import { createLogger, type Logger } from '../utils/logger'
10
+ import { spawn, type ChildProcess } from 'child_process'
11
+ import * as fs from 'fs'
12
+ import * as path from 'path'
13
+ import * as os from 'os'
14
+
15
+ const logger = createLogger('tunnel')
16
+
17
+ export interface TunnelOptions {
18
+ port: number
19
+ name?: string
20
+ configPath?: string
21
+ logger?: Logger
22
+ }
23
+
24
+ export interface TunnelResult {
25
+ url: string
26
+ stop: () => void
27
+ }
28
+
29
+ /**
30
+ * Find cloudflared binary
31
+ */
32
+ async function findCloudflared(): Promise<string | null> {
33
+ // Check common locations
34
+ const locations = [
35
+ // Global install
36
+ '/usr/local/bin/cloudflared',
37
+ '/opt/homebrew/bin/cloudflared',
38
+ // Windows
39
+ 'C:\\Program Files\\cloudflared\\cloudflared.exe',
40
+ // Local .dotdo directory
41
+ path.join(process.cwd(), '.dotdo', 'bin', 'cloudflared'),
42
+ path.join(os.homedir(), '.dotdo', 'bin', 'cloudflared'),
43
+ ]
44
+
45
+ for (const loc of locations) {
46
+ if (fs.existsSync(loc)) {
47
+ return loc
48
+ }
49
+ }
50
+
51
+ // Try to find in PATH
52
+ try {
53
+ const { execSync } = await import('child_process')
54
+ const result = execSync('which cloudflared', { encoding: 'utf-8' }).trim()
55
+ if (result) return result
56
+ } catch {
57
+ // Not in PATH
58
+ }
59
+
60
+ return null
61
+ }
62
+
63
+ /**
64
+ * Download cloudflared if not installed
65
+ */
66
+ async function downloadCloudflared(): Promise<string> {
67
+ const platform = process.platform
68
+ const arch = process.arch
69
+
70
+ let downloadUrl: string
71
+ let binaryName = 'cloudflared'
72
+
73
+ if (platform === 'darwin') {
74
+ downloadUrl = arch === 'arm64'
75
+ ? 'https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-darwin-arm64.tgz'
76
+ : 'https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-darwin-amd64.tgz'
77
+ } else if (platform === 'linux') {
78
+ downloadUrl = arch === 'arm64'
79
+ ? 'https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64'
80
+ : 'https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64'
81
+ } else if (platform === 'win32') {
82
+ downloadUrl = 'https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-windows-amd64.exe'
83
+ binaryName = 'cloudflared.exe'
84
+ } else {
85
+ throw new Error(`Unsupported platform: ${platform}`)
86
+ }
87
+
88
+ const binDir = path.join(os.homedir(), '.dotdo', 'bin')
89
+ const binaryPath = path.join(binDir, binaryName)
90
+
91
+ if (!fs.existsSync(binDir)) {
92
+ fs.mkdirSync(binDir, { recursive: true })
93
+ }
94
+
95
+ logger.info('Downloading cloudflared...')
96
+
97
+ // Download using fetch
98
+ const response = await fetch(downloadUrl)
99
+ if (!response.ok) {
100
+ throw new Error(`Failed to download cloudflared: ${response.status}`)
101
+ }
102
+
103
+ const buffer = await response.arrayBuffer()
104
+
105
+ // Handle tarball on macOS
106
+ if (downloadUrl.endsWith('.tgz')) {
107
+ // For simplicity, we'll use tar command
108
+ const tempPath = path.join(binDir, 'cloudflared.tgz')
109
+ fs.writeFileSync(tempPath, Buffer.from(buffer))
110
+
111
+ const { execSync } = await import('child_process')
112
+ execSync(`tar -xzf "${tempPath}" -C "${binDir}"`, { stdio: 'ignore' })
113
+ fs.unlinkSync(tempPath)
114
+ } else {
115
+ fs.writeFileSync(binaryPath, Buffer.from(buffer))
116
+ fs.chmodSync(binaryPath, 0o755)
117
+ }
118
+
119
+ logger.success('cloudflared installed')
120
+ return binaryPath
121
+ }
122
+
123
+ /**
124
+ * Start a Cloudflare Tunnel
125
+ */
126
+ export async function startTunnel(options: TunnelOptions): Promise<string> {
127
+ const log = options.logger ?? logger
128
+
129
+ // Find or download cloudflared
130
+ let cloudflared = await findCloudflared()
131
+ if (!cloudflared) {
132
+ cloudflared = await downloadCloudflared()
133
+ }
134
+
135
+ return new Promise((resolve, reject) => {
136
+ const args: string[] = ['tunnel']
137
+
138
+ if (options.name) {
139
+ // Named tunnel (requires auth)
140
+ args.push('--name', options.name)
141
+ args.push('run')
142
+ } else {
143
+ // Quick tunnel (no auth required)
144
+ args.push('--url', `http://localhost:${options.port}`)
145
+ }
146
+
147
+ if (options.configPath) {
148
+ args.push('--config', options.configPath)
149
+ }
150
+
151
+ log.debug('Starting tunnel:', { cloudflared, args })
152
+
153
+ const proc = spawn(cloudflared, args, {
154
+ stdio: ['ignore', 'pipe', 'pipe'],
155
+ })
156
+
157
+ let tunnelUrl: string | null = null
158
+
159
+ proc.stdout?.on('data', (data: Buffer) => {
160
+ const output = data.toString()
161
+ log.debug('cloudflared stdout:', output)
162
+
163
+ // Parse tunnel URL from output
164
+ const urlMatch = output.match(/https:\/\/[^\s]+\.trycloudflare\.com/)
165
+ if (urlMatch && !tunnelUrl) {
166
+ tunnelUrl = urlMatch[0]
167
+ resolve(tunnelUrl)
168
+ }
169
+ })
170
+
171
+ proc.stderr?.on('data', (data: Buffer) => {
172
+ const output = data.toString()
173
+ log.debug('cloudflared stderr:', output)
174
+
175
+ // Also check stderr for URL (cloudflared logs there)
176
+ const urlMatch = output.match(/https:\/\/[^\s]+\.trycloudflare\.com/)
177
+ if (urlMatch && !tunnelUrl) {
178
+ tunnelUrl = urlMatch[0]
179
+ resolve(tunnelUrl)
180
+ }
181
+ })
182
+
183
+ proc.on('error', (error) => {
184
+ log.error('Tunnel error:', { error: error.message })
185
+ reject(error)
186
+ })
187
+
188
+ proc.on('exit', (code) => {
189
+ if (!tunnelUrl) {
190
+ reject(new Error(`cloudflared exited with code ${code}`))
191
+ }
192
+ })
193
+
194
+ // Timeout after 30 seconds
195
+ setTimeout(() => {
196
+ if (!tunnelUrl) {
197
+ proc.kill()
198
+ reject(new Error('Timeout waiting for tunnel URL'))
199
+ }
200
+ }, 30000)
201
+ })
202
+ }
203
+
204
+ export const tunnelCommand = new Command('tunnel')
205
+ .description('Expose local server via Cloudflare Tunnel')
206
+ .option('-p, --port <port>', 'Local port to expose', '8787')
207
+ .option('-n, --name <name>', 'Tunnel name (requires auth)')
208
+ .option('-c, --config <path>', 'Path to tunnel config file')
209
+ .action(async (options) => {
210
+ const port = parseInt(options.port, 10)
211
+
212
+ logger.info(`Starting tunnel for localhost:${port}...`)
213
+
214
+ try {
215
+ const url = await startTunnel({
216
+ port,
217
+ name: options.name,
218
+ configPath: options.config,
219
+ })
220
+
221
+ console.log()
222
+ console.log('Tunnel is running!')
223
+ console.log()
224
+ console.log(` Local: http://localhost:${port}`)
225
+ console.log(` Public: ${url}`)
226
+ console.log()
227
+ console.log('Press Ctrl+C to stop')
228
+
229
+ // Keep process alive
230
+ await new Promise(() => {})
231
+ } catch (error) {
232
+ logger.error('Failed to start tunnel', {
233
+ error: error instanceof Error ? error.message : String(error),
234
+ })
235
+ process.exit(1)
236
+ }
237
+ })
238
+
239
+ export default tunnelCommand