dotdo 0.0.2 → 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 (313) hide show
  1. package/cli/README.md +238 -0
  2. package/cli/agent.ts +72 -0
  3. package/cli/bin.js +44 -0
  4. package/cli/bin.ts +38 -0
  5. package/cli/build.ts +157 -0
  6. package/cli/commands/auth/login.ts +14 -0
  7. package/cli/commands/auth/logout.ts +6 -0
  8. package/cli/commands/auth/whoami.ts +16 -0
  9. package/cli/commands/deploy-multi.ts +245 -0
  10. package/cli/commands/dev/deploy.ts +100 -0
  11. package/cli/commands/dev/dev.ts +95 -0
  12. package/cli/commands/dev/logs.ts +91 -0
  13. package/cli/commands/dev-local.ts +88 -0
  14. package/cli/commands/do-ops.ts +314 -0
  15. package/cli/commands/index.ts +100 -0
  16. package/cli/commands/init.ts +247 -0
  17. package/cli/commands/introspect/emitter.ts +315 -0
  18. package/cli/commands/introspect/index.ts +193 -0
  19. package/cli/commands/link.ts +598 -0
  20. package/cli/commands/snippets.ts +415 -0
  21. package/cli/commands/tunnel.ts +239 -0
  22. package/cli/device-auth.ts +289 -0
  23. package/cli/fallback.ts +12 -0
  24. package/cli/index.ts +121 -0
  25. package/cli/main.ts +246 -0
  26. package/cli/mcp-stdio.ts +790 -0
  27. package/cli/package.json +62 -0
  28. package/cli/runtime/do-registry.ts +193 -0
  29. package/cli/runtime/embedded-db.ts +344 -0
  30. package/cli/runtime/index.ts +9 -0
  31. package/cli/runtime/miniflare-adapter.ts +162 -0
  32. package/cli/sandbox.ts +82 -0
  33. package/cli/src/args.ts +174 -0
  34. package/cli/src/auth.ts +55 -0
  35. package/cli/src/commands/call.ts +84 -0
  36. package/cli/src/commands/charge.ts +96 -0
  37. package/cli/src/commands/config.ts +115 -0
  38. package/cli/src/commands/email.ts +112 -0
  39. package/cli/src/commands/llm.ts +115 -0
  40. package/cli/src/commands/queue.ts +134 -0
  41. package/cli/src/commands/text.ts +86 -0
  42. package/cli/src/config.ts +185 -0
  43. package/cli/src/output.ts +246 -0
  44. package/cli/src/rpc.ts +192 -0
  45. package/cli/utils/config.ts +282 -0
  46. package/cli/utils/detect.ts +73 -0
  47. package/cli/utils/index.ts +15 -0
  48. package/cli/utils/logger.ts +232 -0
  49. package/dist/ai/template-literals.js +2 -2
  50. package/dist/ai/template-literals.js.map +1 -1
  51. package/dist/api/middleware/auth.js +3 -2
  52. package/dist/api/middleware/auth.js.map +1 -1
  53. package/dist/db/iceberg/inverted-index.js +1 -1
  54. package/dist/db/iceberg/inverted-index.js.map +1 -1
  55. package/dist/db/iceberg/puffin.js.map +1 -1
  56. package/dist/db/json-indexes.js.map +1 -1
  57. package/dist/db/objects.js.map +1 -1
  58. package/dist/db/primitives/dag-scheduler/index.js +1 -1
  59. package/dist/db/primitives/dag-scheduler/index.js.map +1 -1
  60. package/dist/db/primitives/observability.js.map +1 -1
  61. package/dist/db/primitives/schema-evolution.js.map +1 -1
  62. package/dist/db/primitives/temporal-store.js.map +1 -1
  63. package/dist/db/primitives/typed-column-store.js.map +1 -1
  64. package/dist/db/primitives/utils/duration.js.map +1 -1
  65. package/dist/db/primitives/utils/murmur3.js +12 -14
  66. package/dist/db/primitives/utils/murmur3.js.map +1 -1
  67. package/dist/db/primitives/window-manager.js.map +1 -1
  68. package/dist/db/stores.js.map +1 -1
  69. package/dist/db/things.js.map +1 -1
  70. package/dist/lib/DODispatcher.js +2 -2
  71. package/dist/lib/DODispatcher.js.map +1 -1
  72. package/dist/lib/auto-wiring.js.map +1 -1
  73. package/dist/lib/channels/email.js +1 -1
  74. package/dist/lib/channels/email.js.map +1 -1
  75. package/dist/lib/channels/slack-blockkit.js.map +1 -1
  76. package/dist/lib/cloudflare/ai.js +1 -1
  77. package/dist/lib/cloudflare/ai.js.map +1 -1
  78. package/dist/lib/cloudflare/kv.js +1 -1
  79. package/dist/lib/cloudflare/kv.js.map +1 -1
  80. package/dist/lib/cloudflare/r2.js +3 -3
  81. package/dist/lib/cloudflare/r2.js.map +1 -1
  82. package/dist/lib/cloudflare/vectorize.js.map +1 -1
  83. package/dist/lib/cloudflare/workflows.js.map +1 -1
  84. package/dist/lib/executors/AgenticFunctionExecutor.js.map +1 -1
  85. package/dist/lib/executors/CodeFunctionExecutor.js.map +1 -1
  86. package/dist/lib/executors/GenerativeFunctionExecutor.js.map +1 -1
  87. package/dist/lib/executors/HumanFunctionExecutor.js +1 -1
  88. package/dist/lib/executors/HumanFunctionExecutor.js.map +1 -1
  89. package/dist/lib/executors/ParallelStepExecutor.js.map +1 -1
  90. package/dist/lib/experiments.js.map +1 -1
  91. package/dist/lib/flags/store.js.map +1 -1
  92. package/dist/lib/functions/FunctionComposition.js.map +1 -1
  93. package/dist/lib/functions/FunctionMiddleware.js.map +1 -1
  94. package/dist/lib/functions/FunctionRegistry.js.map +1 -1
  95. package/dist/lib/humans/templates.js.map +1 -1
  96. package/dist/lib/identity.js +2 -2
  97. package/dist/lib/identity.js.map +1 -1
  98. package/dist/lib/logging/index.js.map +1 -1
  99. package/dist/lib/mixins/bash.js +1 -73
  100. package/dist/lib/mixins/bash.js.map +1 -1
  101. package/dist/lib/mixins/git.js +0 -5
  102. package/dist/lib/mixins/git.js.map +1 -1
  103. package/dist/lib/mixins/npm.js.map +1 -1
  104. package/dist/lib/noun-id.js.map +1 -1
  105. package/dist/lib/rate-limit/sliding-window.js.map +1 -1
  106. package/dist/lib/rpc/bindings.js.map +1 -1
  107. package/dist/lib/safe-stringify.js.map +1 -1
  108. package/dist/lib/sandbox/miniflare-sandbox.js.map +1 -1
  109. package/dist/lib/sqids.js.map +1 -1
  110. package/dist/lib/sql/adapters/node-sql-parser.js.map +1 -1
  111. package/dist/lib/sql/adapters/pgsql-parser.js +19 -18
  112. package/dist/lib/sql/adapters/pgsql-parser.js.map +1 -1
  113. package/dist/metrics/hunch.js.map +1 -1
  114. package/dist/objects/API.js +1 -1
  115. package/dist/objects/API.js.map +1 -1
  116. package/dist/objects/Agent.js.map +1 -1
  117. package/dist/objects/Browser.js.map +1 -1
  118. package/dist/objects/CLI.js.map +1 -1
  119. package/dist/objects/DOBase.js.map +1 -1
  120. package/dist/objects/DOCache.js +153 -0
  121. package/dist/objects/DOCache.js.map +1 -0
  122. package/dist/objects/DOFull.js.map +1 -1
  123. package/dist/objects/Entity.js.map +1 -1
  124. package/dist/objects/Human.js.map +1 -1
  125. package/dist/objects/IcebergMetadataDO.js.map +1 -1
  126. package/dist/objects/IntegrationsDO.js.map +1 -1
  127. package/dist/objects/ObservabilityBroadcaster.js.map +1 -1
  128. package/dist/objects/Package.js.map +1 -1
  129. package/dist/objects/Product.js +1 -1
  130. package/dist/objects/Product.js.map +1 -1
  131. package/dist/objects/SaaS.js.map +1 -1
  132. package/dist/objects/SandboxDO.js.map +1 -1
  133. package/dist/objects/Service.js.map +1 -1
  134. package/dist/objects/VectorShardDO.js +9 -7
  135. package/dist/objects/VectorShardDO.js.map +1 -1
  136. package/dist/objects/Workflow.js.map +1 -1
  137. package/dist/objects/WorkflowFactory.js.map +1 -1
  138. package/dist/objects/WorkflowRuntime.js.map +1 -1
  139. package/dist/objects/lifecycle/Branch.js.map +1 -1
  140. package/dist/objects/lifecycle/Clone.js +1 -1
  141. package/dist/objects/lifecycle/Clone.js.map +1 -1
  142. package/dist/objects/lifecycle/Compact.js.map +1 -1
  143. package/dist/objects/lifecycle/Shard.js.map +1 -1
  144. package/dist/objects/persistence/checkpoint-manager.js.map +1 -1
  145. package/dist/objects/persistence/migration-runner.js.map +1 -1
  146. package/dist/objects/persistence/replication-manager.js +2 -2
  147. package/dist/objects/persistence/replication-manager.js.map +1 -1
  148. package/dist/objects/persistence/tiered-storage-manager.js.map +1 -1
  149. package/dist/objects/persistence/wal-manager.js.map +1 -1
  150. package/dist/objects/transport/auth-layer.js.map +1 -1
  151. package/dist/objects/transport/chain.js.map +1 -1
  152. package/dist/objects/transport/mcp-server.js +7 -6
  153. package/dist/objects/transport/mcp-server.js.map +1 -1
  154. package/dist/objects/transport/rest-autowire.js +3 -2
  155. package/dist/objects/transport/rest-autowire.js.map +1 -1
  156. package/dist/objects/transport/rest-router.js.map +1 -1
  157. package/dist/objects/transport/rpc-server.js +18 -15
  158. package/dist/objects/transport/rpc-server.js.map +1 -1
  159. package/dist/objects/transport/shared.js +2 -1
  160. package/dist/objects/transport/shared.js.map +1 -1
  161. package/dist/snippets/artifacts-ingest.js.map +1 -1
  162. package/dist/snippets/artifacts-serve.js.map +1 -1
  163. package/dist/snippets/search.js.map +1 -1
  164. package/dist/workflows/ScheduleManager.js.map +1 -1
  165. package/dist/workflows/StepResultStorage.js.map +1 -1
  166. package/dist/workflows/WaitForEventManager.js.map +1 -1
  167. package/dist/workflows/compat/backends/cloudflare-workflows.js.map +1 -1
  168. package/dist/workflows/compat/inngest/index.js.map +1 -1
  169. package/dist/workflows/compat/qstash/index.js.map +1 -1
  170. package/dist/workflows/compat/temporal/client.js.map +1 -1
  171. package/dist/workflows/compat/temporal/index.js.map +1 -1
  172. package/dist/workflows/compat/trigger/index.js.map +1 -1
  173. package/dist/workflows/compat/utils/index.js.map +1 -1
  174. package/dist/workflows/context/correlation.js +2 -2
  175. package/dist/workflows/context/correlation.js.map +1 -1
  176. package/dist/workflows/context/experiment.js +1 -1
  177. package/dist/workflows/context/experiment.js.map +1 -1
  178. package/dist/workflows/context/flag.js +1 -1
  179. package/dist/workflows/context/flag.js.map +1 -1
  180. package/dist/workflows/context/measure.js +1 -1
  181. package/dist/workflows/context/measure.js.map +1 -1
  182. package/dist/workflows/context/rate-limit.js.map +1 -1
  183. package/dist/workflows/data/entity-events/entity-events.js.map +1 -1
  184. package/dist/workflows/data/experiment/index.js.map +1 -1
  185. package/dist/workflows/data/goal/context.js +1 -1
  186. package/dist/workflows/data/goal/context.js.map +1 -1
  187. package/dist/workflows/data/measure/index.js +1 -1
  188. package/dist/workflows/data/measure/index.js.map +1 -1
  189. package/dist/workflows/data/stream/index.js +10 -76
  190. package/dist/workflows/data/stream/index.js.map +1 -1
  191. package/dist/workflows/data/track/context.js.map +1 -1
  192. package/dist/workflows/data/view/context.js.map +1 -1
  193. package/dist/workflows/domain.js.map +1 -1
  194. package/dist/workflows/flags.js +1 -1
  195. package/dist/workflows/flags.js.map +1 -1
  196. package/dist/workflows/hash.js.map +1 -1
  197. package/dist/workflows/on.js +1 -1
  198. package/dist/workflows/on.js.map +1 -1
  199. package/dist/workflows/schedule-builder.js.map +1 -1
  200. package/dist/workflows/visibility/index.js +0 -2
  201. package/dist/workflows/visibility/index.js.map +1 -1
  202. package/dist/workflows/visibility/query-parser.js.map +1 -1
  203. package/package.json +18 -3
  204. package/dist/api/analytics/router.js +0 -601
  205. package/dist/api/analytics/router.js.map +0 -1
  206. package/dist/api/index.js +0 -158
  207. package/dist/api/index.js.map +0 -1
  208. package/dist/api/middleware/error-handling.js +0 -176
  209. package/dist/api/middleware/error-handling.js.map +0 -1
  210. package/dist/api/middleware/request-id.js +0 -21
  211. package/dist/api/middleware/request-id.js.map +0 -1
  212. package/dist/api/pages.js +0 -1180
  213. package/dist/api/pages.js.map +0 -1
  214. package/dist/api/routes/api.js +0 -612
  215. package/dist/api/routes/api.js.map +0 -1
  216. package/dist/api/routes/browsers.js +0 -471
  217. package/dist/api/routes/browsers.js.map +0 -1
  218. package/dist/api/routes/do.js +0 -188
  219. package/dist/api/routes/do.js.map +0 -1
  220. package/dist/api/routes/mcp.js +0 -459
  221. package/dist/api/routes/mcp.js.map +0 -1
  222. package/dist/api/routes/obs.js +0 -445
  223. package/dist/api/routes/obs.js.map +0 -1
  224. package/dist/api/routes/openapi.js +0 -794
  225. package/dist/api/routes/openapi.js.map +0 -1
  226. package/dist/api/routes/rpc.js +0 -1103
  227. package/dist/api/routes/rpc.js.map +0 -1
  228. package/dist/api/routes/sandboxes.js +0 -389
  229. package/dist/api/routes/sandboxes.js.map +0 -1
  230. package/dist/api/test-do.js +0 -38
  231. package/dist/api/test-do.js.map +0 -1
  232. package/dist/api/types.js +0 -11
  233. package/dist/api/types.js.map +0 -1
  234. package/dist/cli/bin.js +0 -2
  235. package/dist/cli/main.js +0 -52342
  236. package/dist/do/bash.js +0 -35
  237. package/dist/do/bash.js.map +0 -1
  238. package/dist/do/fs.js +0 -25
  239. package/dist/do/fs.js.map +0 -1
  240. package/dist/do/full.js +0 -61
  241. package/dist/do/full.js.map +0 -1
  242. package/dist/do/git.js +0 -28
  243. package/dist/do/git.js.map +0 -1
  244. package/dist/do/index.js +0 -52
  245. package/dist/do/index.js.map +0 -1
  246. package/dist/lib/agent/tools/bash.js +0 -336
  247. package/dist/lib/agent/tools/bash.js.map +0 -1
  248. package/dist/lib/agent/tools/edit.js +0 -157
  249. package/dist/lib/agent/tools/edit.js.map +0 -1
  250. package/dist/lib/agent/tools/glob.js +0 -137
  251. package/dist/lib/agent/tools/glob.js.map +0 -1
  252. package/dist/lib/agent/tools/grep.js +0 -315
  253. package/dist/lib/agent/tools/grep.js.map +0 -1
  254. package/dist/lib/agent/tools/index.js +0 -71
  255. package/dist/lib/agent/tools/index.js.map +0 -1
  256. package/dist/lib/agent/tools/read.js +0 -212
  257. package/dist/lib/agent/tools/read.js.map +0 -1
  258. package/dist/lib/agent/tools/types.js +0 -197
  259. package/dist/lib/agent/tools/types.js.map +0 -1
  260. package/dist/lib/agent/tools/write.js +0 -159
  261. package/dist/lib/agent/tools/write.js.map +0 -1
  262. package/dist/lib/mixins/index.js +0 -29
  263. package/dist/lib/mixins/index.js.map +0 -1
  264. package/dist/primitives/bashx/src/ast/analyze.js +0 -1472
  265. package/dist/primitives/bashx/src/ast/analyze.js.map +0 -1
  266. package/dist/primitives/bashx/src/ast/parser.js +0 -1488
  267. package/dist/primitives/bashx/src/ast/parser.js.map +0 -1
  268. package/dist/primitives/bashx/src/do/commands/crypto.js +0 -1954
  269. package/dist/primitives/bashx/src/do/commands/crypto.js.map +0 -1
  270. package/dist/primitives/bashx/src/do/commands/data-processing.js +0 -1812
  271. package/dist/primitives/bashx/src/do/commands/data-processing.js.map +0 -1
  272. package/dist/primitives/bashx/src/do/commands/extended-utils.js +0 -804
  273. package/dist/primitives/bashx/src/do/commands/extended-utils.js.map +0 -1
  274. package/dist/primitives/bashx/src/do/commands/math-control.js +0 -1122
  275. package/dist/primitives/bashx/src/do/commands/math-control.js.map +0 -1
  276. package/dist/primitives/bashx/src/do/commands/posix-utils.js +0 -1015
  277. package/dist/primitives/bashx/src/do/commands/posix-utils.js.map +0 -1
  278. package/dist/primitives/bashx/src/do/commands/system-utils.js +0 -687
  279. package/dist/primitives/bashx/src/do/commands/system-utils.js.map +0 -1
  280. package/dist/primitives/bashx/src/do/commands/test-command.js +0 -523
  281. package/dist/primitives/bashx/src/do/commands/test-command.js.map +0 -1
  282. package/dist/primitives/bashx/src/do/commands/text-processing.js +0 -1550
  283. package/dist/primitives/bashx/src/do/commands/text-processing.js.map +0 -1
  284. package/dist/primitives/bashx/src/do/container-executor.js +0 -429
  285. package/dist/primitives/bashx/src/do/container-executor.js.map +0 -1
  286. package/dist/primitives/bashx/src/do/index.js +0 -668
  287. package/dist/primitives/bashx/src/do/index.js.map +0 -1
  288. package/dist/primitives/bashx/src/do/tiered-executor.js +0 -2647
  289. package/dist/primitives/bashx/src/do/tiered-executor.js.map +0 -1
  290. package/dist/primitives/bashx/src/do/worker.js +0 -352
  291. package/dist/primitives/bashx/src/do/worker.js.map +0 -1
  292. package/dist/primitives/bashx/src/types.js +0 -10
  293. package/dist/primitives/bashx/src/types.js.map +0 -1
  294. package/dist/primitives/fsx/core/backend.js +0 -480
  295. package/dist/primitives/fsx/core/backend.js.map +0 -1
  296. package/dist/primitives/fsx/core/constants.js +0 -140
  297. package/dist/primitives/fsx/core/constants.js.map +0 -1
  298. package/dist/primitives/fsx/core/fsx.js +0 -1184
  299. package/dist/primitives/fsx/core/fsx.js.map +0 -1
  300. package/dist/primitives/fsx/core/glob/glob.js +0 -438
  301. package/dist/primitives/fsx/core/glob/glob.js.map +0 -1
  302. package/dist/primitives/fsx/core/glob/index.js +0 -8
  303. package/dist/primitives/fsx/core/glob/index.js.map +0 -1
  304. package/dist/primitives/fsx/core/glob/match.js +0 -392
  305. package/dist/primitives/fsx/core/glob/match.js.map +0 -1
  306. package/dist/primitives/fsx/core/types.js +0 -307
  307. package/dist/primitives/fsx/core/types.js.map +0 -1
  308. package/dist/sdk/capnweb-compat.js +0 -42
  309. package/dist/sdk/capnweb-compat.js.map +0 -1
  310. package/dist/sdk/client.js +0 -20
  311. package/dist/sdk/client.js.map +0 -1
  312. package/dist/sdk/index.js +0 -17
  313. package/dist/sdk/index.js.map +0 -1
package/cli/README.md ADDED
@@ -0,0 +1,238 @@
1
+ # dotdo CLI
2
+
3
+ Self-contained CLI for Durable Objects development. Single binary that includes the full DO runtime for local development.
4
+
5
+ ## Installation
6
+
7
+ ### Quick Install (Recommended)
8
+
9
+ Download the pre-built binary for your platform:
10
+
11
+ ```bash
12
+ # macOS (Apple Silicon)
13
+ curl -fsSL https://dotdo.dev/cli/dotdo-darwin-arm64 -o /usr/local/bin/dotdo
14
+ chmod +x /usr/local/bin/dotdo
15
+
16
+ # macOS (Intel)
17
+ curl -fsSL https://dotdo.dev/cli/dotdo-darwin-x64 -o /usr/local/bin/dotdo
18
+ chmod +x /usr/local/bin/dotdo
19
+
20
+ # Linux (x64)
21
+ curl -fsSL https://dotdo.dev/cli/dotdo-linux-x64 -o /usr/local/bin/dotdo
22
+ chmod +x /usr/local/bin/dotdo
23
+
24
+ # Linux (ARM)
25
+ curl -fsSL https://dotdo.dev/cli/dotdo-linux-arm64 -o /usr/local/bin/dotdo
26
+ chmod +x /usr/local/bin/dotdo
27
+ ```
28
+
29
+ ### Build from Source
30
+
31
+ Requires [Bun](https://bun.sh) >= 1.1.0:
32
+
33
+ ```bash
34
+ cd cli
35
+ bun install
36
+ bun run build:local
37
+ ./dotdo --help
38
+ ```
39
+
40
+ Build for all platforms:
41
+
42
+ ```bash
43
+ bun run build:all
44
+ # Outputs to cli/dist/
45
+ ```
46
+
47
+ ## Usage
48
+
49
+ ### Development
50
+
51
+ ```bash
52
+ # Start local development server
53
+ dotdo dev
54
+
55
+ # Custom port
56
+ dotdo dev --port 3000
57
+
58
+ # With Cloudflare Tunnel (public URL)
59
+ dotdo dev --tunnel
60
+
61
+ # Without state persistence
62
+ dotdo dev --no-persist
63
+ ```
64
+
65
+ ### Durable Object Operations
66
+
67
+ ```bash
68
+ # List all DO instances
69
+ dotdo do list
70
+
71
+ # Show DO state
72
+ dotdo do show <id>
73
+
74
+ # Show with storage data
75
+ dotdo do show <id> --storage
76
+
77
+ # Create snapshot
78
+ dotdo do save <id>
79
+ dotdo do save <id> --label "before-migration"
80
+
81
+ # List snapshots
82
+ dotdo do snapshots <id>
83
+
84
+ # Restore from snapshot
85
+ dotdo do restore <id> <snapshot-id> --force
86
+
87
+ # Clone DO
88
+ dotdo do clone <source-id> <target-id>
89
+
90
+ # Delete DO
91
+ dotdo do delete <id> --force
92
+ ```
93
+
94
+ ### Deployment
95
+
96
+ ```bash
97
+ # Deploy to Cloudflare Workers (default)
98
+ dotdo deploy
99
+
100
+ # Deploy to Vercel
101
+ dotdo deploy --target vercel
102
+
103
+ # Deploy to Fly.io
104
+ dotdo deploy --target fly
105
+
106
+ # Deploy to all configured targets
107
+ dotdo deploy --all
108
+
109
+ # Dry run
110
+ dotdo deploy --dry-run
111
+ ```
112
+
113
+ ### Tunnel
114
+
115
+ ```bash
116
+ # Start tunnel only (without dev server)
117
+ dotdo tunnel
118
+
119
+ # Custom port
120
+ dotdo tunnel --port 3000
121
+
122
+ # Named tunnel (requires CF auth)
123
+ dotdo tunnel --name myapp
124
+ ```
125
+
126
+ ### Other Commands
127
+
128
+ ```bash
129
+ # Initialize new project
130
+ dotdo init
131
+
132
+ # Build project
133
+ dotdo build
134
+
135
+ # Stream production logs
136
+ dotdo logs
137
+ ```
138
+
139
+ ## Configuration
140
+
141
+ The CLI reads configuration from multiple sources (in order of priority):
142
+
143
+ 1. Environment variables
144
+ 2. `dotdo.config.ts`
145
+ 3. `package.json` `dotdo` field
146
+ 4. `wrangler.toml` / `wrangler.jsonc`
147
+
148
+ ### dotdo.config.ts
149
+
150
+ ```typescript
151
+ import type { DotdoConfig } from 'dotdo/cli'
152
+
153
+ export default {
154
+ // Project settings
155
+ name: 'my-app',
156
+ entryPoint: 'index.ts',
157
+ port: 8787,
158
+
159
+ // Cloudflare settings
160
+ compatibilityDate: '2024-01-01',
161
+ compatibilityFlags: ['nodejs_compat'],
162
+
163
+ // Persistence
164
+ persist: true, // or path: '.dotdo/data'
165
+
166
+ // Deploy targets
167
+ deploy: {
168
+ cloudflare: true,
169
+ vercel: false,
170
+ fly: false,
171
+ },
172
+ } satisfies DotdoConfig
173
+ ```
174
+
175
+ ### Environment Variables
176
+
177
+ ```bash
178
+ DOTDO_PORT=8787
179
+ DOTDO_HOST=localhost
180
+ CLOUDFLARE_ACCOUNT_ID=...
181
+ ```
182
+
183
+ ## Directory Structure
184
+
185
+ ```
186
+ cli/
187
+ ├── main.ts # Entry point
188
+ ├── build.ts # Build script
189
+ ├── package.json # Dependencies
190
+ ├── commands/
191
+ │ ├── dev-local.ts # dotdo dev
192
+ │ ├── do-ops.ts # dotdo do:*
193
+ │ ├── tunnel.ts # dotdo tunnel
194
+ │ └── deploy-multi.ts # dotdo deploy
195
+ ├── runtime/
196
+ │ ├── miniflare-adapter.ts
197
+ │ ├── do-registry.ts
198
+ │ └── embedded-db.ts
199
+ └── utils/
200
+ ├── config.ts
201
+ └── logger.ts
202
+ ```
203
+
204
+ ## Requirements
205
+
206
+ - Bun >= 1.1.0 (for development/building)
207
+ - The compiled binary runs standalone (no Bun required)
208
+
209
+ ### Binary Size
210
+
211
+ The self-contained binary is approximately 55-60 MB depending on the platform. This includes the embedded Bun runtime which enables standalone execution without requiring Bun to be installed on the target system.
212
+
213
+ ## Platform Support
214
+
215
+ | Platform | Architecture | Status |
216
+ | -------------- | ------------ | ------ |
217
+ | macOS | ARM64 (M1+) | ✅ |
218
+ | macOS | x64 | ✅ |
219
+ | Linux | x64 | ✅ |
220
+ | Linux | ARM64 | ✅ |
221
+ | Windows | x64 | ✅ |
222
+
223
+ ## Development
224
+
225
+ ```bash
226
+ # Run CLI in development
227
+ bun run main.ts dev
228
+
229
+ # Run tests
230
+ bun test
231
+
232
+ # Type check
233
+ bun run typecheck
234
+ ```
235
+
236
+ ## License
237
+
238
+ MIT
package/cli/agent.ts ADDED
@@ -0,0 +1,72 @@
1
+ /**
2
+ * AI Agent with MCP Integration
3
+ *
4
+ * Provides AI SDK 6 ToolLoopAgent integration for CLI natural language processing.
5
+ * Connects to Durable Object's MCP endpoint via HTTP transport.
6
+ *
7
+ * @see https://ai-sdk.dev/docs/agents/tool-loop-agent
8
+ * @see https://modelcontextprotocol.io/docs/concepts/transports
9
+ *
10
+ * TODO: Implement in GREEN phase (see dotdo-i2fn)
11
+ */
12
+
13
+ /**
14
+ * Configuration options for the AI agent
15
+ */
16
+ export interface AgentConfig {
17
+ /** Maximum number of tool execution steps (default: 10) */
18
+ maxSteps?: number
19
+ /** Model identifier for Cloudflare Workers AI (default: 'llama-3.3-70b-instruct-fp8-fast') */
20
+ model?: string
21
+ /** Custom system instructions for the agent */
22
+ instructions?: string
23
+ }
24
+
25
+ /**
26
+ * Run the AI agent with MCP tools from a Durable Object
27
+ *
28
+ * @param input - Natural language input from user
29
+ * @param doUrl - URL of the Durable Object with MCP endpoint
30
+ * @param config - Optional agent configuration
31
+ * @returns Agent response text
32
+ *
33
+ * @example
34
+ * ```typescript
35
+ * const result = await runAgent('create a user named John', 'https://my-app.do.dev')
36
+ * // result: 'Created user John with ID 123'
37
+ * ```
38
+ */
39
+ export async function runAgent(
40
+ _input: string,
41
+ _doUrl: string,
42
+ _config?: AgentConfig
43
+ ): Promise<string> {
44
+ // TODO: Implement in GREEN phase
45
+ throw new Error('Not implemented: runAgent')
46
+ }
47
+
48
+ /**
49
+ * Create a reusable agent instance with MCP connection
50
+ *
51
+ * @param doUrl - URL of the Durable Object with MCP endpoint
52
+ * @param config - Optional agent configuration
53
+ * @returns Agent instance with generate and close methods
54
+ *
55
+ * @example
56
+ * ```typescript
57
+ * const agent = await createAgentWithMCP('https://my-app.do.dev')
58
+ * const result1 = await agent.generate({ prompt: 'list users' })
59
+ * const result2 = await agent.generate({ prompt: 'create user' })
60
+ * await agent.close()
61
+ * ```
62
+ */
63
+ export async function createAgentWithMCP(
64
+ _doUrl: string,
65
+ _config?: AgentConfig
66
+ ): Promise<{
67
+ generate: (options: { prompt: string }) => Promise<{ text: string }>
68
+ close: () => Promise<void>
69
+ }> {
70
+ // TODO: Implement in GREEN phase
71
+ throw new Error('Not implemented: createAgentWithMCP')
72
+ }
package/cli/bin.js ADDED
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI Entry Point (Node.js wrapper)
4
+ *
5
+ * Spawns bun to run the TypeScript CLI.
6
+ * Bun is installed as a dependency, so it's available in node_modules/.bin/bun
7
+ */
8
+
9
+ import { spawn } from 'node:child_process'
10
+ import { dirname, join } from 'node:path'
11
+ import { fileURLToPath } from 'node:url'
12
+
13
+ const __dirname = dirname(fileURLToPath(import.meta.url))
14
+ const bunPath = join(__dirname, '..', 'node_modules', '.bin', 'bun')
15
+ const mainTs = join(__dirname, 'main.ts')
16
+
17
+ // Spawn bun with the TypeScript entry point
18
+ const child = spawn(bunPath, [mainTs, ...process.argv.slice(2)], {
19
+ stdio: 'inherit',
20
+ env: process.env,
21
+ })
22
+
23
+ child.on('close', (code) => {
24
+ process.exit(code ?? 0)
25
+ })
26
+
27
+ child.on('error', (err) => {
28
+ // Fallback: try global bun if local not found
29
+ if (err.code === 'ENOENT') {
30
+ const fallback = spawn('bun', [mainTs, ...process.argv.slice(2)], {
31
+ stdio: 'inherit',
32
+ env: process.env,
33
+ })
34
+
35
+ fallback.on('close', (code) => process.exit(code ?? 0))
36
+ fallback.on('error', () => {
37
+ console.error('Error: Could not find bun. Please run: npm install')
38
+ process.exit(1)
39
+ })
40
+ } else {
41
+ console.error('Error:', err.message)
42
+ process.exit(1)
43
+ }
44
+ })
package/cli/bin.ts ADDED
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * CLI Entry Point (Direct Bun execution)
4
+ *
5
+ * This file is for direct bun execution (bunx dotdo).
6
+ * For npm/npx, use bin.js which spawns bun.
7
+ */
8
+
9
+ import { route, parseArgv, helpText, version } from './index'
10
+ import { commands } from './commands/index'
11
+ import { fallback } from './fallback'
12
+
13
+ /**
14
+ * Main CLI function
15
+ */
16
+ export async function main(argv: string[]): Promise<void> {
17
+ const result = route(argv)
18
+
19
+ switch (result.type) {
20
+ case 'help':
21
+ console.log(helpText)
22
+ break
23
+ case 'version':
24
+ console.log(version)
25
+ break
26
+ case 'command':
27
+ await commands[result.name].run(result.args)
28
+ break
29
+ case 'fallback':
30
+ await fallback(result.input)
31
+ break
32
+ }
33
+ }
34
+
35
+ // Run if executed directly
36
+ if (import.meta.main) {
37
+ main(parseArgv(Bun.argv))
38
+ }
package/cli/build.ts ADDED
@@ -0,0 +1,157 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Build Script
4
+ *
5
+ * Compiles the CLI into a self-contained binary using Bun.
6
+ * The binary includes all dependencies and works without Bun installed.
7
+ */
8
+
9
+ import * as fs from 'fs'
10
+ import * as path from 'path'
11
+
12
+ interface BuildOptions {
13
+ target?: 'bun-darwin-arm64' | 'bun-darwin-x64' | 'bun-linux-arm64' | 'bun-linux-x64' | 'bun-windows-x64'
14
+ outfile?: string
15
+ minify?: boolean
16
+ sourcemap?: boolean
17
+ }
18
+
19
+ const defaultTargets: BuildOptions['target'][] = [
20
+ 'bun-darwin-arm64',
21
+ 'bun-darwin-x64',
22
+ 'bun-linux-arm64',
23
+ 'bun-linux-x64',
24
+ ]
25
+
26
+ async function build(options: BuildOptions = {}): Promise<void> {
27
+ const cliDir = path.dirname(new URL(import.meta.url).pathname)
28
+ const entryPoint = path.join(cliDir, 'main.ts')
29
+ const outDir = path.join(cliDir, 'dist')
30
+
31
+ // Ensure output directory exists
32
+ if (!fs.existsSync(outDir)) {
33
+ fs.mkdirSync(outDir, { recursive: true })
34
+ }
35
+
36
+ // Determine targets
37
+ const targets = options.target ? [options.target] : defaultTargets
38
+
39
+ console.log('Building dotdo CLI...')
40
+ console.log()
41
+
42
+ for (const target of targets) {
43
+ const [, platform, arch] = target.split('-')
44
+ const ext = platform === 'windows' ? '.exe' : ''
45
+ const outfile = options.outfile ?? path.join(outDir, `dotdo-${platform}-${arch}${ext}`)
46
+
47
+ console.log(` Target: ${target}`)
48
+ console.log(` Output: ${outfile}`)
49
+
50
+ try {
51
+ const startTime = Date.now()
52
+
53
+ const result = await Bun.build({
54
+ entrypoints: [entryPoint],
55
+ outdir: outDir,
56
+ target,
57
+ minify: options.minify ?? true,
58
+ sourcemap: options.sourcemap ? 'external' : 'none',
59
+ external: [
60
+ // These need to be external for native modules
61
+ 'better-sqlite3',
62
+ ],
63
+ define: {
64
+ 'process.env.NODE_ENV': '"production"',
65
+ },
66
+ })
67
+
68
+ if (!result.success) {
69
+ console.error('Build failed:')
70
+ for (const log of result.logs) {
71
+ console.error(log)
72
+ }
73
+ process.exit(1)
74
+ }
75
+
76
+ // Compile to binary
77
+ const proc = Bun.spawn(['bun', 'build', entryPoint, '--compile', '--target', target, '--outfile', outfile], {
78
+ cwd: cliDir,
79
+ stdout: 'pipe',
80
+ stderr: 'pipe',
81
+ })
82
+
83
+ const exitCode = await proc.exited
84
+
85
+ if (exitCode !== 0) {
86
+ const stderr = await new Response(proc.stderr).text()
87
+ console.error(` Error: ${stderr}`)
88
+ continue
89
+ }
90
+
91
+ const duration = Date.now() - startTime
92
+ const stats = fs.statSync(outfile)
93
+ const sizeMB = (stats.size / 1024 / 1024).toFixed(2)
94
+
95
+ console.log(` Size: ${sizeMB} MB`)
96
+ console.log(` Time: ${duration}ms`)
97
+ console.log()
98
+ } catch (error) {
99
+ console.error(` Error: ${error instanceof Error ? error.message : String(error)}`)
100
+ console.log()
101
+ }
102
+ }
103
+
104
+ console.log('Build complete!')
105
+ }
106
+
107
+ // CLI interface
108
+ async function main(): Promise<void> {
109
+ const args = process.argv.slice(2)
110
+ const options: BuildOptions = {}
111
+
112
+ for (let i = 0; i < args.length; i++) {
113
+ const arg = args[i]
114
+
115
+ if (arg === '--target' && args[i + 1]) {
116
+ options.target = args[++i] as BuildOptions['target']
117
+ } else if (arg === '--outfile' && args[i + 1]) {
118
+ options.outfile = args[++i]
119
+ } else if (arg === '--no-minify') {
120
+ options.minify = false
121
+ } else if (arg === '--sourcemap') {
122
+ options.sourcemap = true
123
+ } else if (arg === '--help' || arg === '-h') {
124
+ console.log(`
125
+ dotdo CLI Build Script
126
+
127
+ Usage: bun run build.ts [options]
128
+
129
+ Options:
130
+ --target <target> Build for specific target
131
+ (bun-darwin-arm64, bun-darwin-x64, bun-linux-arm64, bun-linux-x64, bun-windows-x64)
132
+ --outfile <path> Output file path
133
+ --no-minify Disable minification
134
+ --sourcemap Include source maps
135
+ -h, --help Show this help
136
+
137
+ Examples:
138
+ bun run build.ts # Build for all targets
139
+ bun run build.ts --target bun-darwin-arm64 # macOS ARM only
140
+ bun run build.ts --outfile ./dotdo # Custom output path
141
+ `)
142
+ process.exit(0)
143
+ }
144
+ }
145
+
146
+ await build(options)
147
+ }
148
+
149
+ // Run if executed directly
150
+ if (import.meta.main) {
151
+ main().catch((error) => {
152
+ console.error('Build failed:', error)
153
+ process.exit(1)
154
+ })
155
+ }
156
+
157
+ export { build, type BuildOptions }
@@ -0,0 +1,14 @@
1
+ import { ensureLoggedIn } from 'oauth.do/node'
2
+
3
+ export async function run() {
4
+ const { token, isNewLogin } = await ensureLoggedIn({
5
+ openBrowser: true,
6
+ print: console.log,
7
+ })
8
+
9
+ if (isNewLogin) {
10
+ console.log('Logged in successfully')
11
+ } else {
12
+ console.log('Already logged in')
13
+ }
14
+ }
@@ -0,0 +1,6 @@
1
+ import { ensureLoggedOut } from 'oauth.do/node'
2
+
3
+ export async function run() {
4
+ await ensureLoggedOut({ print: console.log })
5
+ console.log('Logged out')
6
+ }
@@ -0,0 +1,16 @@
1
+ import { getToken, getUser } from 'oauth.do/node'
2
+
3
+ export async function run() {
4
+ const token = await getToken()
5
+ if (!token) {
6
+ console.log('Not logged in. Run: do login')
7
+ return
8
+ }
9
+
10
+ const { user } = await getUser(token)
11
+ if (user) {
12
+ console.log(`Logged in as: ${user.email}`)
13
+ } else {
14
+ console.log('Session expired. Run: do login')
15
+ }
16
+ }