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,691 @@
1
+ /**
2
+ * MCP Server Integration for Durable Objects
3
+ *
4
+ * Provides MCP (Model Context Protocol) support for DO classes.
5
+ * Allows DO methods to be exposed as MCP tools and DO data as MCP resources.
6
+ *
7
+ * Features:
8
+ * - Static $mcp configuration for tool/resource definitions
9
+ * - JSON-RPC 2.0 protocol compliance
10
+ * - Session management with Mcp-Session-Id header
11
+ * - Auto-generated JSON schemas from tool configurations
12
+ * - SSE stream support for server notifications
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * class MyDO extends DO {
17
+ * static $mcp = {
18
+ * tools: {
19
+ * search: {
20
+ * description: 'Search items',
21
+ * inputSchema: {
22
+ * query: { type: 'string', description: 'Search query' },
23
+ * },
24
+ * required: ['query'],
25
+ * },
26
+ * },
27
+ * resources: ['items', 'users'],
28
+ * }
29
+ *
30
+ * search(query: string) {
31
+ * // Implementation
32
+ * }
33
+ * }
34
+ * ```
35
+ */
36
+ // ============================================================================
37
+ // JSON-RPC ERROR CODES
38
+ // ============================================================================
39
+ export const JSON_RPC_ERRORS = {
40
+ PARSE_ERROR: -32700,
41
+ INVALID_REQUEST: -32600,
42
+ METHOD_NOT_FOUND: -32601,
43
+ INVALID_PARAMS: -32602,
44
+ INTERNAL_ERROR: -32603,
45
+ };
46
+ // ============================================================================
47
+ // MCP PROTOCOL CONSTANTS
48
+ // ============================================================================
49
+ const MCP_PROTOCOL_VERSION = '2024-11-05';
50
+ const MCP_SERVER_NAME = 'dotdo-do-mcp-server';
51
+ const MCP_SERVER_VERSION = '0.1.0';
52
+ // ============================================================================
53
+ // HELPER FUNCTIONS
54
+ // ============================================================================
55
+ /**
56
+ * Create a JSON-RPC error response
57
+ */
58
+ function jsonRpcError(id, code, message, data) {
59
+ return {
60
+ jsonrpc: '2.0',
61
+ id,
62
+ error: { code, message, data },
63
+ };
64
+ }
65
+ /**
66
+ * Create a JSON-RPC success response
67
+ */
68
+ function jsonRpcSuccess(id, result) {
69
+ return {
70
+ jsonrpc: '2.0',
71
+ id,
72
+ result,
73
+ };
74
+ }
75
+ // ============================================================================
76
+ // SCHEMA GENERATION
77
+ // ============================================================================
78
+ /**
79
+ * Generate a JSON Schema from a tool configuration
80
+ */
81
+ export function generateToolSchema(toolConfig) {
82
+ const properties = {};
83
+ for (const [name, config] of Object.entries(toolConfig.inputSchema)) {
84
+ properties[name] = {
85
+ type: config.type,
86
+ ...(config.description && { description: config.description }),
87
+ };
88
+ }
89
+ return {
90
+ type: 'object',
91
+ properties,
92
+ ...(toolConfig.required && toolConfig.required.length > 0 && { required: toolConfig.required }),
93
+ };
94
+ }
95
+ // ============================================================================
96
+ // TOOL AND RESOURCE DISCOVERY
97
+ // ============================================================================
98
+ /**
99
+ * Get MCP tools from a DO class's $mcp configuration
100
+ */
101
+ export function getMcpTools(DOClass) {
102
+ const config = DOClass.$mcp;
103
+ if (!config?.tools) {
104
+ return [];
105
+ }
106
+ const tools = [];
107
+ for (const [name, toolConfig] of Object.entries(config.tools)) {
108
+ tools.push({
109
+ name,
110
+ description: toolConfig.description,
111
+ inputSchema: generateToolSchema(toolConfig),
112
+ });
113
+ }
114
+ return tools;
115
+ }
116
+ /**
117
+ * Get MCP resources from a DO class's $mcp configuration
118
+ */
119
+ export function getMcpResources(DOClass, ns) {
120
+ const config = DOClass.$mcp;
121
+ if (!config?.resources) {
122
+ return [];
123
+ }
124
+ // Parse the namespace URL to extract host
125
+ let host = 'do';
126
+ try {
127
+ const url = new URL(ns);
128
+ host = url.host;
129
+ }
130
+ catch {
131
+ // Use default host
132
+ }
133
+ return config.resources.map((resourceName) => ({
134
+ uri: `do://${host}/${resourceName}`,
135
+ name: resourceName,
136
+ mimeType: 'application/json',
137
+ }));
138
+ }
139
+ // ============================================================================
140
+ // MCP HANDLER FACTORY
141
+ // ============================================================================
142
+ /**
143
+ * Create an MCP request handler for a DO class
144
+ *
145
+ * @param DOClass - The DO class with $mcp configuration
146
+ * @returns A function that handles MCP requests
147
+ */
148
+ export function createMcpHandler(DOClass) {
149
+ const tools = getMcpTools(DOClass);
150
+ const toolsByName = new Map(tools.map((t) => [t.name, t]));
151
+ const toolConfigByName = new Map(Object.entries(DOClass.$mcp?.tools ?? {}).map(([name, config]) => [name, config]));
152
+ return async function handleMcp(instance, request, sessions) {
153
+ const method = request.method;
154
+ // GET: SSE stream for notifications
155
+ if (method === 'GET') {
156
+ const sessionId = request.headers.get('mcp-session-id') || request.headers.get('Mcp-Session-Id');
157
+ if (!sessionId) {
158
+ return new Response(JSON.stringify(jsonRpcError(null, JSON_RPC_ERRORS.INVALID_REQUEST, 'Missing Mcp-Session-Id header')), {
159
+ status: 400,
160
+ headers: { 'Content-Type': 'application/json' },
161
+ });
162
+ }
163
+ const session = sessions.get(sessionId);
164
+ if (!session) {
165
+ return new Response(JSON.stringify(jsonRpcError(null, JSON_RPC_ERRORS.INVALID_REQUEST, 'Session not found')), {
166
+ status: 404,
167
+ headers: { 'Content-Type': 'application/json' },
168
+ });
169
+ }
170
+ // Return SSE stream
171
+ const stream = new ReadableStream({
172
+ start(controller) {
173
+ controller.enqueue(new TextEncoder().encode(': keep-alive\n\n'));
174
+ },
175
+ });
176
+ return new Response(stream, {
177
+ status: 200,
178
+ headers: {
179
+ 'Content-Type': 'text/event-stream',
180
+ 'Cache-Control': 'no-cache',
181
+ 'Connection': 'keep-alive',
182
+ 'Mcp-Session-Id': sessionId,
183
+ },
184
+ });
185
+ }
186
+ // DELETE: Terminate session
187
+ if (method === 'DELETE') {
188
+ const sessionId = request.headers.get('mcp-session-id') || request.headers.get('Mcp-Session-Id');
189
+ if (!sessionId) {
190
+ return new Response(JSON.stringify(jsonRpcError(null, JSON_RPC_ERRORS.INVALID_REQUEST, 'Missing Mcp-Session-Id header')), {
191
+ status: 400,
192
+ headers: { 'Content-Type': 'application/json' },
193
+ });
194
+ }
195
+ const deleted = sessions.delete(sessionId);
196
+ if (!deleted) {
197
+ return new Response(JSON.stringify(jsonRpcError(null, JSON_RPC_ERRORS.INVALID_REQUEST, 'Session not found')), {
198
+ status: 404,
199
+ headers: { 'Content-Type': 'application/json' },
200
+ });
201
+ }
202
+ return new Response(null, { status: 204 });
203
+ }
204
+ // Only POST allowed for JSON-RPC
205
+ if (method !== 'POST') {
206
+ return new Response(JSON.stringify(jsonRpcError(null, JSON_RPC_ERRORS.INVALID_REQUEST, 'Method not allowed')), {
207
+ status: 405,
208
+ headers: {
209
+ 'Content-Type': 'application/json',
210
+ 'Allow': 'GET, POST, DELETE',
211
+ },
212
+ });
213
+ }
214
+ // Parse request body
215
+ let body;
216
+ try {
217
+ body = (await request.json());
218
+ }
219
+ catch {
220
+ return new Response(JSON.stringify(jsonRpcError(null, JSON_RPC_ERRORS.PARSE_ERROR, 'Parse error')), {
221
+ status: 200,
222
+ headers: { 'Content-Type': 'application/json' },
223
+ });
224
+ }
225
+ // Get or validate session
226
+ let sessionId = request.headers.get('mcp-session-id') || request.headers.get('Mcp-Session-Id');
227
+ let currentSession = sessionId ? sessions.get(sessionId) : undefined;
228
+ // Check if we need to validate session before processing
229
+ // If session ID was provided but session not found, and request is not initialize/ping, return 404
230
+ const requests = Array.isArray(body) ? body : [body];
231
+ const firstRequest = requests[0];
232
+ const firstMethod = firstRequest?.method;
233
+ // Define known MCP methods
234
+ const knownMethods = new Set([
235
+ 'initialize',
236
+ 'ping',
237
+ 'tools/list',
238
+ 'tools/call',
239
+ 'resources/list',
240
+ 'resources/read',
241
+ 'prompts/list',
242
+ ]);
243
+ // For non-notification requests (has id), check if the request is valid JSON-RPC
244
+ // and if the method is known
245
+ if (firstRequest?.id !== undefined) {
246
+ // Check JSON-RPC version first
247
+ if (firstRequest?.jsonrpc !== '2.0') {
248
+ return new Response(JSON.stringify(jsonRpcError(firstRequest?.id ?? null, JSON_RPC_ERRORS.INVALID_REQUEST, 'Invalid JSON-RPC version')), {
249
+ status: 200,
250
+ headers: { 'Content-Type': 'application/json' },
251
+ });
252
+ }
253
+ // Check for unknown method (before session check)
254
+ if (firstMethod && !knownMethods.has(firstMethod)) {
255
+ return new Response(JSON.stringify(jsonRpcError(firstRequest?.id ?? null, JSON_RPC_ERRORS.METHOD_NOT_FOUND, `Method not found: ${firstMethod}`)), {
256
+ status: 200,
257
+ headers: { 'Content-Type': 'application/json' },
258
+ });
259
+ }
260
+ }
261
+ const requiresSession = firstMethod && firstMethod !== 'initialize' && firstMethod !== 'ping';
262
+ // Only validate session for non-notification requests
263
+ if (sessionId && !currentSession && requiresSession && firstRequest?.id !== undefined) {
264
+ return new Response(JSON.stringify(jsonRpcError(firstRequest?.id ?? null, JSON_RPC_ERRORS.INVALID_REQUEST, 'Session not found')), {
265
+ status: 404,
266
+ headers: { 'Content-Type': 'application/json' },
267
+ });
268
+ }
269
+ // Handle batch requests
270
+ const responses = [];
271
+ const responseHeaders = {
272
+ 'Content-Type': 'application/json',
273
+ };
274
+ // Track if all requests are notifications
275
+ let allNotifications = true;
276
+ for (const req of requests) {
277
+ // Validate JSON-RPC format
278
+ if (req.jsonrpc !== '2.0') {
279
+ responses.push(jsonRpcError(req.id ?? null, JSON_RPC_ERRORS.INVALID_REQUEST, 'Invalid JSON-RPC version'));
280
+ allNotifications = false;
281
+ continue;
282
+ }
283
+ // Notifications have no id - no response expected
284
+ if (req.id === undefined) {
285
+ // Process notification but don't add to responses
286
+ continue;
287
+ }
288
+ allNotifications = false;
289
+ // Handle MCP methods
290
+ const response = await handleMcpMethod(req, instance, DOClass, sessions, sessionId, currentSession, tools, toolsByName, toolConfigByName);
291
+ // Update session reference if created
292
+ if (response.session) {
293
+ currentSession = response.session;
294
+ sessionId = response.session.id;
295
+ }
296
+ responses.push(response.response);
297
+ }
298
+ // If all requests were notifications, return 204
299
+ if (allNotifications && responses.length === 0) {
300
+ return new Response(null, { status: 204 });
301
+ }
302
+ // If session was created/used, include it in response headers
303
+ if (currentSession) {
304
+ responseHeaders['Mcp-Session-Id'] = currentSession.id;
305
+ }
306
+ // Return single response or batch
307
+ const responseBody = Array.isArray(body) ? responses : responses[0];
308
+ return new Response(JSON.stringify(responseBody), {
309
+ status: 200,
310
+ headers: responseHeaders,
311
+ });
312
+ };
313
+ }
314
+ /**
315
+ * Handle a single MCP method call
316
+ */
317
+ async function handleMcpMethod(req, instance, DOClass, sessions, sessionId, currentSession, tools, toolsByName, toolConfigByName) {
318
+ // Methods that don't require session
319
+ if (req.method === 'ping') {
320
+ return { response: jsonRpcSuccess(req.id, {}) };
321
+ }
322
+ if (req.method === 'initialize') {
323
+ // Create new session if not exists
324
+ if (!currentSession) {
325
+ const newSession = {
326
+ id: crypto.randomUUID(),
327
+ createdAt: new Date(),
328
+ lastAccessedAt: new Date(),
329
+ protocolVersion: MCP_PROTOCOL_VERSION,
330
+ };
331
+ const params = req.params;
332
+ if (params?.clientInfo) {
333
+ newSession.clientInfo = params.clientInfo;
334
+ }
335
+ sessions.set(newSession.id, newSession);
336
+ currentSession = newSession;
337
+ }
338
+ return {
339
+ response: jsonRpcSuccess(req.id, {
340
+ protocolVersion: MCP_PROTOCOL_VERSION,
341
+ capabilities: {
342
+ tools: { listChanged: true },
343
+ resources: { subscribe: true, listChanged: true },
344
+ prompts: { listChanged: true },
345
+ },
346
+ serverInfo: {
347
+ name: MCP_SERVER_NAME,
348
+ version: MCP_SERVER_VERSION,
349
+ },
350
+ }),
351
+ session: currentSession,
352
+ };
353
+ }
354
+ // Methods that require session
355
+ if (req.method !== 'initialize' && req.method !== 'ping') {
356
+ // Check if session ID was provided but session not found
357
+ if (sessionId && !currentSession) {
358
+ return {
359
+ response: jsonRpcError(req.id, JSON_RPC_ERRORS.INVALID_REQUEST, 'Session not found'),
360
+ };
361
+ }
362
+ // Check if session is required but not provided
363
+ if (!currentSession) {
364
+ return {
365
+ response: jsonRpcError(req.id, JSON_RPC_ERRORS.INVALID_REQUEST, 'Session not initialized'),
366
+ };
367
+ }
368
+ }
369
+ switch (req.method) {
370
+ case 'tools/list': {
371
+ return {
372
+ response: jsonRpcSuccess(req.id, { tools }),
373
+ session: currentSession,
374
+ };
375
+ }
376
+ case 'tools/call': {
377
+ const params = req.params;
378
+ if (!params?.name) {
379
+ return {
380
+ response: jsonRpcError(req.id, JSON_RPC_ERRORS.INVALID_PARAMS, 'Missing tool name'),
381
+ session: currentSession,
382
+ };
383
+ }
384
+ const tool = toolsByName.get(params.name);
385
+ if (!tool) {
386
+ return {
387
+ response: jsonRpcError(req.id, JSON_RPC_ERRORS.METHOD_NOT_FOUND, `Tool not found: ${params.name}`),
388
+ session: currentSession,
389
+ };
390
+ }
391
+ // Validate required arguments
392
+ const toolConfig = toolConfigByName.get(params.name);
393
+ const toolArgs = params.arguments || {};
394
+ const requiredFields = toolConfig?.required || [];
395
+ for (const field of requiredFields) {
396
+ if (!(field in toolArgs)) {
397
+ return {
398
+ response: jsonRpcError(req.id, JSON_RPC_ERRORS.INVALID_PARAMS, `Missing required argument: ${field}`),
399
+ session: currentSession,
400
+ };
401
+ }
402
+ }
403
+ // Invoke the method on the DO instance
404
+ try {
405
+ const methodFn = instance[params.name];
406
+ if (typeof methodFn !== 'function') {
407
+ return {
408
+ response: jsonRpcError(req.id, JSON_RPC_ERRORS.METHOD_NOT_FOUND, `Method not found: ${params.name}`),
409
+ session: currentSession,
410
+ };
411
+ }
412
+ // Build arguments array from schema order
413
+ const argNames = Object.keys(toolConfig?.inputSchema || {});
414
+ const args = argNames.map((name) => toolArgs[name]);
415
+ const result = await methodFn.apply(instance, args);
416
+ const resultText = typeof result === 'string' ? result : JSON.stringify(result);
417
+ return {
418
+ response: jsonRpcSuccess(req.id, {
419
+ content: [{ type: 'text', text: resultText }],
420
+ }),
421
+ session: currentSession,
422
+ };
423
+ }
424
+ catch (error) {
425
+ const errorMessage = error instanceof Error ? error.message : String(error);
426
+ return {
427
+ response: jsonRpcSuccess(req.id, {
428
+ content: [{ type: 'text', text: errorMessage }],
429
+ isError: true,
430
+ }),
431
+ session: currentSession,
432
+ };
433
+ }
434
+ }
435
+ case 'resources/list': {
436
+ const resources = getMcpResources(DOClass, instance.ns);
437
+ return {
438
+ response: jsonRpcSuccess(req.id, { resources }),
439
+ session: currentSession,
440
+ };
441
+ }
442
+ case 'resources/read': {
443
+ const params = req.params;
444
+ if (!params?.uri) {
445
+ return {
446
+ response: jsonRpcError(req.id, JSON_RPC_ERRORS.INVALID_PARAMS, 'Missing resource URI'),
447
+ session: currentSession,
448
+ };
449
+ }
450
+ // Parse URI: do://host/resourceName or do://host/resourceName/id
451
+ const uriMatch = params.uri.match(/^do:\/\/([^/]+)\/([^/]+)(?:\/(.+))?$/);
452
+ if (!uriMatch) {
453
+ return {
454
+ response: jsonRpcError(req.id, JSON_RPC_ERRORS.INVALID_PARAMS, `Invalid resource URI: ${params.uri}`),
455
+ session: currentSession,
456
+ };
457
+ }
458
+ const [, , resourceName, resourceId] = uriMatch;
459
+ const safeResourceName = resourceName;
460
+ // Check if resource is defined in $mcp.resources
461
+ const configResources = DOClass.$mcp?.resources || [];
462
+ if (!configResources.includes(safeResourceName)) {
463
+ return {
464
+ response: jsonRpcError(req.id, JSON_RPC_ERRORS.INVALID_PARAMS, `Resource not found: ${safeResourceName}`),
465
+ session: currentSession,
466
+ };
467
+ }
468
+ // Try to get the resource data from the DO instance
469
+ // First, check for a getter method like getItems(), getUsers(), etc.
470
+ const getterName = `get${safeResourceName.charAt(0).toUpperCase()}${safeResourceName.slice(1)}`;
471
+ const getter = instance[getterName];
472
+ let data;
473
+ if (typeof getter === 'function') {
474
+ const allData = await getter.call(instance);
475
+ if (resourceId) {
476
+ // Filter to specific item
477
+ if (Array.isArray(allData)) {
478
+ data = allData.find((item) => item.id === resourceId);
479
+ if (!data) {
480
+ return {
481
+ response: jsonRpcError(req.id, JSON_RPC_ERRORS.INVALID_PARAMS, `Resource item not found: ${safeResourceName}/${resourceId}`),
482
+ session: currentSession,
483
+ };
484
+ }
485
+ }
486
+ else {
487
+ data = allData;
488
+ }
489
+ }
490
+ else {
491
+ data = allData;
492
+ }
493
+ }
494
+ else {
495
+ // Try direct property access
496
+ const prop = instance[safeResourceName];
497
+ if (prop !== undefined) {
498
+ data = prop;
499
+ }
500
+ else {
501
+ return {
502
+ response: jsonRpcError(req.id, JSON_RPC_ERRORS.INVALID_PARAMS, `Resource accessor not found: ${safeResourceName}`),
503
+ session: currentSession,
504
+ };
505
+ }
506
+ }
507
+ return {
508
+ response: jsonRpcSuccess(req.id, {
509
+ contents: [
510
+ {
511
+ uri: params.uri,
512
+ mimeType: 'application/json',
513
+ text: JSON.stringify(data),
514
+ },
515
+ ],
516
+ }),
517
+ session: currentSession,
518
+ };
519
+ }
520
+ case 'prompts/list': {
521
+ return {
522
+ response: jsonRpcSuccess(req.id, { prompts: [] }),
523
+ session: currentSession,
524
+ };
525
+ }
526
+ default:
527
+ return {
528
+ response: jsonRpcError(req.id, JSON_RPC_ERRORS.METHOD_NOT_FOUND, `Method not found: ${req.method}`),
529
+ session: currentSession,
530
+ };
531
+ }
532
+ }
533
+ // ============================================================================
534
+ // MCP MIXIN FOR DO CLASSES
535
+ // ============================================================================
536
+ /**
537
+ * MCP session storage per DO instance
538
+ */
539
+ const mcpSessions = new WeakMap();
540
+ /**
541
+ * Get or create session storage for a DO instance
542
+ */
543
+ function getSessionStorage(instance) {
544
+ let sessions = mcpSessions.get(instance);
545
+ if (!sessions) {
546
+ sessions = new Map();
547
+ mcpSessions.set(instance, sessions);
548
+ }
549
+ return sessions;
550
+ }
551
+ /**
552
+ * Add handleMcp method to a DO instance
553
+ * This is called internally to attach MCP support to DO classes
554
+ */
555
+ export function attachMcpHandler(instance, DOClass) {
556
+ const handler = createMcpHandler(DOClass);
557
+ const sessions = getSessionStorage(instance);
558
+ instance.handleMcp =
559
+ async function (request) {
560
+ return handler(instance, request, sessions);
561
+ };
562
+ }
563
+ /**
564
+ * Type guard to check if a DO class has $mcp configuration
565
+ */
566
+ export function hasMcpConfig(DOClass) {
567
+ return DOClass.$mcp !== undefined && ((DOClass.$mcp.tools !== undefined && Object.keys(DOClass.$mcp.tools).length > 0) ||
568
+ (DOClass.$mcp.resources !== undefined && DOClass.$mcp.resources.length > 0));
569
+ }
570
+ import { buildErrorResponse, } from './shared';
571
+ /**
572
+ * Cache for MCP tools per DO class
573
+ */
574
+ const mcpToolsCache = new Map();
575
+ /**
576
+ * MCP (Model Context Protocol) Handler implementing TransportHandler interface
577
+ *
578
+ * Provides JSON-RPC 2.0 based MCP support:
579
+ * - Tool discovery and invocation
580
+ * - Resource listing and reading
581
+ * - Session management
582
+ * - SSE streaming for notifications
583
+ *
584
+ * @example
585
+ * ```typescript
586
+ * const mcpHandler = new McpHandler({
587
+ * path: '/mcp',
588
+ * debug: true,
589
+ * })
590
+ *
591
+ * // Use in handler chain (higher priority than REST)
592
+ * chain.use(mcpHandler, 50)
593
+ * ```
594
+ */
595
+ export class McpHandler {
596
+ name = 'mcp';
597
+ options;
598
+ sessions = new Map();
599
+ handler = null;
600
+ DOClass = null;
601
+ constructor(options = {}) {
602
+ this.options = {
603
+ path: '/mcp',
604
+ ...options,
605
+ };
606
+ }
607
+ /**
608
+ * Check if this handler can process the request
609
+ * MCP handler processes requests to the /mcp endpoint
610
+ */
611
+ canHandle(request) {
612
+ const url = new URL(request.url);
613
+ const mcpPath = this.options.path || '/mcp';
614
+ // Check if request is to MCP endpoint
615
+ if (url.pathname === mcpPath || url.pathname.startsWith(`${mcpPath}/`)) {
616
+ // MCP handler has higher priority than REST
617
+ return {
618
+ canHandle: true,
619
+ priority: 50,
620
+ };
621
+ }
622
+ return { canHandle: false, reason: 'Path does not match MCP endpoint' };
623
+ }
624
+ /**
625
+ * Handle the MCP request
626
+ */
627
+ async handle(request, context) {
628
+ // Initialize handler if needed
629
+ if (!this.handler || this.needsHandlerRefresh(context)) {
630
+ this.initializeHandler(context);
631
+ }
632
+ if (!this.handler) {
633
+ return buildErrorResponse({ message: 'MCP handler not initialized', code: 'HANDLER_NOT_INITIALIZED' }, 500);
634
+ }
635
+ const instance = context.instance;
636
+ return this.handler(instance, request, this.sessions);
637
+ }
638
+ /**
639
+ * Check if handler needs refresh
640
+ */
641
+ needsHandlerRefresh(context) {
642
+ if (!this.DOClass)
643
+ return true;
644
+ return this.DOClass !== context.instance.constructor;
645
+ }
646
+ /**
647
+ * Initialize the MCP handler from context
648
+ */
649
+ initializeHandler(context) {
650
+ this.DOClass = context.instance.constructor;
651
+ this.handler = createMcpHandler(this.DOClass);
652
+ }
653
+ /**
654
+ * Get cached tools for a DO class
655
+ */
656
+ static getCachedTools(DOClass) {
657
+ if (mcpToolsCache.has(DOClass)) {
658
+ return mcpToolsCache.get(DOClass);
659
+ }
660
+ const tools = getMcpTools(DOClass);
661
+ mcpToolsCache.set(DOClass, tools);
662
+ return tools;
663
+ }
664
+ /**
665
+ * Clear tools cache
666
+ */
667
+ static clearCache() {
668
+ mcpToolsCache.clear();
669
+ }
670
+ /**
671
+ * Get active sessions
672
+ */
673
+ getSessions() {
674
+ return this.sessions;
675
+ }
676
+ /**
677
+ * Clear all sessions
678
+ */
679
+ clearSessions() {
680
+ this.sessions.clear();
681
+ }
682
+ /**
683
+ * Dispose handler resources
684
+ */
685
+ dispose() {
686
+ this.sessions.clear();
687
+ this.handler = null;
688
+ this.DOClass = null;
689
+ }
690
+ }
691
+ //# sourceMappingURL=mcp-server.js.map