dodo-mcp 1.0.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 (447) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +425 -0
  3. package/dist/auth/adapter.js +43 -0
  4. package/dist/auth/adapter.js.map +1 -0
  5. package/dist/auth/clientDeletion.js +45 -0
  6. package/dist/auth/clientDeletion.js.map +1 -0
  7. package/dist/auth/clients.js +55 -0
  8. package/dist/auth/clients.js.map +1 -0
  9. package/dist/auth/constants.js +10 -0
  10. package/dist/auth/constants.js.map +1 -0
  11. package/dist/auth/interactions.js +184 -0
  12. package/dist/auth/interactions.js.map +1 -0
  13. package/dist/auth/keys.js +56 -0
  14. package/dist/auth/keys.js.map +1 -0
  15. package/dist/auth/provider.js +131 -0
  16. package/dist/auth/provider.js.map +1 -0
  17. package/dist/auth/verifier.js +74 -0
  18. package/dist/auth/verifier.js.map +1 -0
  19. package/dist/cli/kill.js +124 -0
  20. package/dist/cli/kill.js.map +1 -0
  21. package/dist/cli/main.js +1393 -0
  22. package/dist/cli/main.js.map +1 -0
  23. package/dist/cli/menu.js +127 -0
  24. package/dist/cli/menu.js.map +1 -0
  25. package/dist/cli/terminal.js +30 -0
  26. package/dist/cli/terminal.js.map +1 -0
  27. package/dist/config/globalConfig.js +144 -0
  28. package/dist/config/globalConfig.js.map +1 -0
  29. package/dist/config/limits.js +42 -0
  30. package/dist/config/limits.js.map +1 -0
  31. package/dist/config/paths.js +94 -0
  32. package/dist/config/paths.js.map +1 -0
  33. package/dist/config/projectConfig.js +63 -0
  34. package/dist/config/projectConfig.js.map +1 -0
  35. package/dist/config/stateImport.js +306 -0
  36. package/dist/config/stateImport.js.map +1 -0
  37. package/dist/config/tunnelConfig.js +23 -0
  38. package/dist/config/tunnelConfig.js.map +1 -0
  39. package/dist/errors.js +82 -0
  40. package/dist/errors.js.map +1 -0
  41. package/dist/evaluation/contracts.js +86 -0
  42. package/dist/evaluation/contracts.js.map +1 -0
  43. package/dist/evaluation/dodoBench.js +69 -0
  44. package/dist/evaluation/dodoBench.js.map +1 -0
  45. package/dist/index.js +26 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/ipc/authentication.js +117 -0
  48. package/dist/ipc/authentication.js.map +1 -0
  49. package/dist/ipc/client.js +86 -0
  50. package/dist/ipc/client.js.map +1 -0
  51. package/dist/ipc/installationClient.js +83 -0
  52. package/dist/ipc/installationClient.js.map +1 -0
  53. package/dist/ipc/ownerControl.js +46 -0
  54. package/dist/ipc/ownerControl.js.map +1 -0
  55. package/dist/ipc/protocol.js +2 -0
  56. package/dist/ipc/protocol.js.map +1 -0
  57. package/dist/ipc/server.js +108 -0
  58. package/dist/ipc/server.js.map +1 -0
  59. package/dist/platform/execResolve.js +64 -0
  60. package/dist/platform/execResolve.js.map +1 -0
  61. package/dist/platform/fileIdentity.js +26 -0
  62. package/dist/platform/fileIdentity.js.map +1 -0
  63. package/dist/platform/fsRetry.js +22 -0
  64. package/dist/platform/fsRetry.js.map +1 -0
  65. package/dist/platform/pathPolicy.js +29 -0
  66. package/dist/platform/pathPolicy.js.map +1 -0
  67. package/dist/platform/privateFs.js +116 -0
  68. package/dist/platform/privateFs.js.map +1 -0
  69. package/dist/platform/processTree.js +31 -0
  70. package/dist/platform/processTree.js.map +1 -0
  71. package/dist/platform/shell.js +74 -0
  72. package/dist/platform/shell.js.map +1 -0
  73. package/dist/platform/speech.js +94 -0
  74. package/dist/platform/speech.js.map +1 -0
  75. package/dist/platform/system.js +28 -0
  76. package/dist/platform/system.js.map +1 -0
  77. package/dist/platform/windowsSandbox.js +129 -0
  78. package/dist/platform/windowsSandbox.js.map +1 -0
  79. package/dist/projects/federation.js +312 -0
  80. package/dist/projects/federation.js.map +1 -0
  81. package/dist/projects/registry.js +291 -0
  82. package/dist/projects/registry.js.map +1 -0
  83. package/dist/security/accessMode.js +19 -0
  84. package/dist/security/accessMode.js.map +1 -0
  85. package/dist/security/approvals.js +56 -0
  86. package/dist/security/approvals.js.map +1 -0
  87. package/dist/security/env.js +57 -0
  88. package/dist/security/env.js.map +1 -0
  89. package/dist/security/mutationQueue.js +78 -0
  90. package/dist/security/mutationQueue.js.map +1 -0
  91. package/dist/security/policy.js +22 -0
  92. package/dist/security/policy.js.map +1 -0
  93. package/dist/security/projectAuthority.js +22 -0
  94. package/dist/security/projectAuthority.js.map +1 -0
  95. package/dist/security/redact.js +30 -0
  96. package/dist/security/redact.js.map +1 -0
  97. package/dist/server/aiAdmin.js +201 -0
  98. package/dist/server/aiAdmin.js.map +1 -0
  99. package/dist/server/appServer.js +461 -0
  100. package/dist/server/appServer.js.map +1 -0
  101. package/dist/server/bootstrap.js +185 -0
  102. package/dist/server/bootstrap.js.map +1 -0
  103. package/dist/server/configUi/app.css +347 -0
  104. package/dist/server/configUi/app.js +958 -0
  105. package/dist/server/configUi/index.html +379 -0
  106. package/dist/server/configUi/ui/alerts.js +92 -0
  107. package/dist/server/configUi/ui/dom.js +19 -0
  108. package/dist/server/configUi/ui/tooltips.js +115 -0
  109. package/dist/server/configUi/vendor/VERSION.txt +1 -0
  110. package/dist/server/configUi/vendor/sweetalert2.min.css +1 -0
  111. package/dist/server/configUi/vendor/sweetalert2.min.js +5 -0
  112. package/dist/server/configUi/workbench.css +62 -0
  113. package/dist/server/configUi/workbench.js +394 -0
  114. package/dist/server/installationRuntime.js +155 -0
  115. package/dist/server/installationRuntime.js.map +1 -0
  116. package/dist/server/instructions.js +17 -0
  117. package/dist/server/instructions.js.map +1 -0
  118. package/dist/server/ipcDispatch.js +225 -0
  119. package/dist/server/ipcDispatch.js.map +1 -0
  120. package/dist/server/localConfig.js +561 -0
  121. package/dist/server/localConfig.js.map +1 -0
  122. package/dist/server/optionalServices.js +30 -0
  123. package/dist/server/optionalServices.js.map +1 -0
  124. package/dist/server/projectLease.js +46 -0
  125. package/dist/server/projectLease.js.map +1 -0
  126. package/dist/server/stdioServer.js +75 -0
  127. package/dist/server/stdioServer.js.map +1 -0
  128. package/dist/server/version.js +13 -0
  129. package/dist/server/version.js.map +1 -0
  130. package/dist/server/workspaceHost.js +194 -0
  131. package/dist/server/workspaceHost.js.map +1 -0
  132. package/dist/services/agent/agentService.js +598 -0
  133. package/dist/services/agent/agentService.js.map +1 -0
  134. package/dist/services/agent/contracts.js +102 -0
  135. package/dist/services/agent/contracts.js.map +1 -0
  136. package/dist/services/ai/adapters.js +287 -0
  137. package/dist/services/ai/adapters.js.map +1 -0
  138. package/dist/services/ai/contracts.js +39 -0
  139. package/dist/services/ai/contracts.js.map +1 -0
  140. package/dist/services/ai/credentials.js +77 -0
  141. package/dist/services/ai/credentials.js.map +1 -0
  142. package/dist/services/ai/network.js +113 -0
  143. package/dist/services/ai/network.js.map +1 -0
  144. package/dist/services/ai/settings.js +178 -0
  145. package/dist/services/ai/settings.js.map +1 -0
  146. package/dist/services/ai/subagents.js +468 -0
  147. package/dist/services/ai/subagents.js.map +1 -0
  148. package/dist/services/assistance/analysis.js +352 -0
  149. package/dist/services/assistance/analysis.js.map +1 -0
  150. package/dist/services/assistance/contracts.js +54 -0
  151. package/dist/services/assistance/contracts.js.map +1 -0
  152. package/dist/services/assistance/verification.js +274 -0
  153. package/dist/services/assistance/verification.js.map +1 -0
  154. package/dist/services/brain/brainParser.js +97 -0
  155. package/dist/services/brain/brainParser.js.map +1 -0
  156. package/dist/services/brain/brainService.js +733 -0
  157. package/dist/services/brain/brainService.js.map +1 -0
  158. package/dist/services/brain/brainWorker.js +212 -0
  159. package/dist/services/brain/brainWorker.js.map +1 -0
  160. package/dist/services/brain/contracts.js +154 -0
  161. package/dist/services/brain/contracts.js.map +1 -0
  162. package/dist/services/brain/protocol.js +2 -0
  163. package/dist/services/brain/protocol.js.map +1 -0
  164. package/dist/services/changes/applier.js +544 -0
  165. package/dist/services/changes/applier.js.map +1 -0
  166. package/dist/services/changes/contentBudget.js +11 -0
  167. package/dist/services/changes/contentBudget.js.map +1 -0
  168. package/dist/services/changes/planner.js +284 -0
  169. package/dist/services/changes/planner.js.map +1 -0
  170. package/dist/services/changes/types.js +3 -0
  171. package/dist/services/changes/types.js.map +1 -0
  172. package/dist/services/context/contextEngine.js +746 -0
  173. package/dist/services/context/contextEngine.js.map +1 -0
  174. package/dist/services/context/contracts.js +88 -0
  175. package/dist/services/context/contracts.js.map +1 -0
  176. package/dist/services/desktop/desktopPolicy.js +76 -0
  177. package/dist/services/desktop/desktopPolicy.js.map +1 -0
  178. package/dist/services/desktop/desktopService.js +130 -0
  179. package/dist/services/desktop/desktopService.js.map +1 -0
  180. package/dist/services/desktop/nativeBackend.js +174 -0
  181. package/dist/services/desktop/nativeBackend.js.map +1 -0
  182. package/dist/services/desktop/protocol.js +32 -0
  183. package/dist/services/desktop/protocol.js.map +1 -0
  184. package/dist/services/files/readService.js +136 -0
  185. package/dist/services/files/readService.js.map +1 -0
  186. package/dist/services/git/gitService.js +369 -0
  187. package/dist/services/git/gitService.js.map +1 -0
  188. package/dist/services/intelligence/intelService.js +136 -0
  189. package/dist/services/intelligence/intelService.js.map +1 -0
  190. package/dist/services/intelligence/protocol.js +2 -0
  191. package/dist/services/intelligence/protocol.js.map +1 -0
  192. package/dist/services/intelligence/tsWorker.js +419 -0
  193. package/dist/services/intelligence/tsWorker.js.map +1 -0
  194. package/dist/services/jobs/commandInput.js +34 -0
  195. package/dist/services/jobs/commandInput.js.map +1 -0
  196. package/dist/services/jobs/jobManager.js +398 -0
  197. package/dist/services/jobs/jobManager.js.map +1 -0
  198. package/dist/services/jobs/sandbox.js +156 -0
  199. package/dist/services/jobs/sandbox.js.map +1 -0
  200. package/dist/services/jobs/sandboxWiring.js +37 -0
  201. package/dist/services/jobs/sandboxWiring.js.map +1 -0
  202. package/dist/services/jobs/spool.js +112 -0
  203. package/dist/services/jobs/spool.js.map +1 -0
  204. package/dist/services/jobs/windowsSandboxChild.js +24 -0
  205. package/dist/services/jobs/windowsSandboxChild.js.map +1 -0
  206. package/dist/services/jobs/windowsSandboxWorker.js +155 -0
  207. package/dist/services/jobs/windowsSandboxWorker.js.map +1 -0
  208. package/dist/services/lsp/documentUri.js +16 -0
  209. package/dist/services/lsp/documentUri.js.map +1 -0
  210. package/dist/services/lsp/jsonrpc.js +382 -0
  211. package/dist/services/lsp/jsonrpc.js.map +1 -0
  212. package/dist/services/lsp/lspService.js +1051 -0
  213. package/dist/services/lsp/lspService.js.map +1 -0
  214. package/dist/services/memory/contracts.js +94 -0
  215. package/dist/services/memory/contracts.js.map +1 -0
  216. package/dist/services/memory/memoryService.js +683 -0
  217. package/dist/services/memory/memoryService.js.map +1 -0
  218. package/dist/services/multimodal/browserService.js +407 -0
  219. package/dist/services/multimodal/browserService.js.map +1 -0
  220. package/dist/services/multimodal/byteRange.js +31 -0
  221. package/dist/services/multimodal/byteRange.js.map +1 -0
  222. package/dist/services/multimodal/contracts.js +59 -0
  223. package/dist/services/multimodal/contracts.js.map +1 -0
  224. package/dist/services/multimodal/gameService.js +95 -0
  225. package/dist/services/multimodal/gameService.js.map +1 -0
  226. package/dist/services/multimodal/images.js +107 -0
  227. package/dist/services/multimodal/images.js.map +1 -0
  228. package/dist/services/multimodal/mediaService.js +279 -0
  229. package/dist/services/multimodal/mediaService.js.map +1 -0
  230. package/dist/services/multimodal/mediaWorker.js +143 -0
  231. package/dist/services/multimodal/mediaWorker.js.map +1 -0
  232. package/dist/services/multimodal/multimodalService.js +51 -0
  233. package/dist/services/multimodal/multimodalService.js.map +1 -0
  234. package/dist/services/multimodal/network.js +69 -0
  235. package/dist/services/multimodal/network.js.map +1 -0
  236. package/dist/services/multimodal/operations.js +40 -0
  237. package/dist/services/multimodal/operations.js.map +1 -0
  238. package/dist/services/multimodal/storage.js +160 -0
  239. package/dist/services/multimodal/storage.js.map +1 -0
  240. package/dist/services/multimodal/workflowService.js +179 -0
  241. package/dist/services/multimodal/workflowService.js.map +1 -0
  242. package/dist/services/overview.js +284 -0
  243. package/dist/services/overview.js.map +1 -0
  244. package/dist/services/resources/casStore.js +304 -0
  245. package/dist/services/resources/casStore.js.map +1 -0
  246. package/dist/services/resources/contracts.js +75 -0
  247. package/dist/services/resources/contracts.js.map +1 -0
  248. package/dist/services/resources/mime.js +77 -0
  249. package/dist/services/resources/mime.js.map +1 -0
  250. package/dist/services/resources/providerRegistry.js +22 -0
  251. package/dist/services/resources/providerRegistry.js.map +1 -0
  252. package/dist/services/resources/providers.js +120 -0
  253. package/dist/services/resources/providers.js.map +1 -0
  254. package/dist/services/resources/resourceService.js +282 -0
  255. package/dist/services/resources/resourceService.js.map +1 -0
  256. package/dist/services/runtime/contracts.js +65 -0
  257. package/dist/services/runtime/contracts.js.map +1 -0
  258. package/dist/services/runtime/runtimeService.js +364 -0
  259. package/dist/services/runtime/runtimeService.js.map +1 -0
  260. package/dist/services/schedules/scheduleService.js +198 -0
  261. package/dist/services/schedules/scheduleService.js.map +1 -0
  262. package/dist/services/search/searchService.js +434 -0
  263. package/dist/services/search/searchService.js.map +1 -0
  264. package/dist/services/search/searchWorker.js +58 -0
  265. package/dist/services/search/searchWorker.js.map +1 -0
  266. package/dist/setup/componentProbes.js +259 -0
  267. package/dist/setup/componentProbes.js.map +1 -0
  268. package/dist/setup/download.js +139 -0
  269. package/dist/setup/download.js.map +1 -0
  270. package/dist/setup/managedTools.js +118 -0
  271. package/dist/setup/managedTools.js.map +1 -0
  272. package/dist/setup/sandboxProbe.js +172 -0
  273. package/dist/setup/sandboxProbe.js.map +1 -0
  274. package/dist/setup/setup.js +522 -0
  275. package/dist/setup/setup.js.map +1 -0
  276. package/dist/setup/windowsChromiumAcl.js +56 -0
  277. package/dist/setup/windowsChromiumAcl.js.map +1 -0
  278. package/dist/setup/windowsSandboxInstall.js +94 -0
  279. package/dist/setup/windowsSandboxInstall.js.map +1 -0
  280. package/dist/setup/windowsSpeechInstall.js +86 -0
  281. package/dist/setup/windowsSpeechInstall.js.map +1 -0
  282. package/dist/store/db.js +711 -0
  283. package/dist/store/db.js.map +1 -0
  284. package/dist/store/scopeEncoding.js +15 -0
  285. package/dist/store/scopeEncoding.js.map +1 -0
  286. package/dist/store/store.js +467 -0
  287. package/dist/store/store.js.map +1 -0
  288. package/dist/tools/agentRuntimeTools.js +216 -0
  289. package/dist/tools/agentRuntimeTools.js.map +1 -0
  290. package/dist/tools/agentTools.js +317 -0
  291. package/dist/tools/agentTools.js.map +1 -0
  292. package/dist/tools/assistanceTools.js +126 -0
  293. package/dist/tools/assistanceTools.js.map +1 -0
  294. package/dist/tools/brainTools.js +130 -0
  295. package/dist/tools/brainTools.js.map +1 -0
  296. package/dist/tools/catalog.js +30 -0
  297. package/dist/tools/catalog.js.map +1 -0
  298. package/dist/tools/changeTools.js +188 -0
  299. package/dist/tools/changeTools.js.map +1 -0
  300. package/dist/tools/context.js +243 -0
  301. package/dist/tools/context.js.map +1 -0
  302. package/dist/tools/contextTools.js +57 -0
  303. package/dist/tools/contextTools.js.map +1 -0
  304. package/dist/tools/coreCatalog.js +82 -0
  305. package/dist/tools/coreCatalog.js.map +1 -0
  306. package/dist/tools/desktopTools.js +41 -0
  307. package/dist/tools/desktopTools.js.map +1 -0
  308. package/dist/tools/directTools.js +273 -0
  309. package/dist/tools/directTools.js.map +1 -0
  310. package/dist/tools/envelope.js +71 -0
  311. package/dist/tools/envelope.js.map +1 -0
  312. package/dist/tools/extraTools.js +298 -0
  313. package/dist/tools/extraTools.js.map +1 -0
  314. package/dist/tools/gitTools.js +93 -0
  315. package/dist/tools/gitTools.js.map +1 -0
  316. package/dist/tools/jobTools.js +454 -0
  317. package/dist/tools/jobTools.js.map +1 -0
  318. package/dist/tools/memoryTools.js +102 -0
  319. package/dist/tools/memoryTools.js.map +1 -0
  320. package/dist/tools/metaTools.js +153 -0
  321. package/dist/tools/metaTools.js.map +1 -0
  322. package/dist/tools/multimodalTools.js +262 -0
  323. package/dist/tools/multimodalTools.js.map +1 -0
  324. package/dist/tools/projectTools.js +261 -0
  325. package/dist/tools/projectTools.js.map +1 -0
  326. package/dist/tools/resourceTools.js +81 -0
  327. package/dist/tools/resourceTools.js.map +1 -0
  328. package/dist/tools/runtimeTools.js +137 -0
  329. package/dist/tools/runtimeTools.js.map +1 -0
  330. package/dist/tools/scheduleTools.js +10 -0
  331. package/dist/tools/scheduleTools.js.map +1 -0
  332. package/dist/tools/semanticTools.js +141 -0
  333. package/dist/tools/semanticTools.js.map +1 -0
  334. package/dist/tools/subagentTools.js +32 -0
  335. package/dist/tools/subagentTools.js.map +1 -0
  336. package/dist/tools/surface.js +644 -0
  337. package/dist/tools/surface.js.map +1 -0
  338. package/dist/tunnel/control.js +113 -0
  339. package/dist/tunnel/control.js.map +1 -0
  340. package/dist/tunnel/credentials.js +392 -0
  341. package/dist/tunnel/credentials.js.map +1 -0
  342. package/dist/tunnel/log.js +84 -0
  343. package/dist/tunnel/log.js.map +1 -0
  344. package/dist/tunnel/runtime.js +55 -0
  345. package/dist/tunnel/runtime.js.map +1 -0
  346. package/dist/tunnel/supervisor.js +280 -0
  347. package/dist/tunnel/supervisor.js.map +1 -0
  348. package/dist/util/bytes.js +53 -0
  349. package/dist/util/bytes.js.map +1 -0
  350. package/dist/util/hash.js +53 -0
  351. package/dist/util/hash.js.map +1 -0
  352. package/dist/workspace/fs.js +305 -0
  353. package/dist/workspace/fs.js.map +1 -0
  354. package/dist/workspace/identity.js +17 -0
  355. package/dist/workspace/identity.js.map +1 -0
  356. package/dist/workspace/ignores.js +173 -0
  357. package/dist/workspace/ignores.js.map +1 -0
  358. package/dist/workspace/root.js +59 -0
  359. package/dist/workspace/root.js.map +1 -0
  360. package/docs/AGENT_RUNTIME.md +154 -0
  361. package/docs/AI_PROVIDERS.md +110 -0
  362. package/docs/ARCHITECTURE.md +331 -0
  363. package/docs/ASSISTANCE.md +31 -0
  364. package/docs/AUTH.md +59 -0
  365. package/docs/BRAIN.md +92 -0
  366. package/docs/COMPATIBILITY.md +92 -0
  367. package/docs/CONFIRMATION.md +13 -0
  368. package/docs/CONTEXT.md +87 -0
  369. package/docs/DESKTOP.md +35 -0
  370. package/docs/EVALUATION.md +86 -0
  371. package/docs/LARGE_INPUTS.md +21 -0
  372. package/docs/LSP.md +21 -0
  373. package/docs/MANUAL_ACCEPTANCE.md +283 -0
  374. package/docs/MEMORY.md +128 -0
  375. package/docs/MULTIMODAL.md +32 -0
  376. package/docs/PROJECTS.md +146 -0
  377. package/docs/RELEASE_1.0.0.md +111 -0
  378. package/docs/RELEASE_NOTES.md +92 -0
  379. package/docs/RESOURCES.md +83 -0
  380. package/docs/RUNTIME.md +125 -0
  381. package/docs/SCHEDULES.md +23 -0
  382. package/docs/SECURITY.md +250 -0
  383. package/docs/TEST_REPORT.md +312 -0
  384. package/docs/TUNNEL.md +86 -0
  385. package/docs/WEB_CLIENTS.md +43 -0
  386. package/docs/WINDOWS.md +79 -0
  387. package/docs/adr/001-one-process-one-workspace.md +22 -0
  388. package/docs/adr/002-external-tunnel.md +19 -0
  389. package/docs/adr/003-sdk-v2-legacy-stateless.md +20 -0
  390. package/docs/adr/004-embedded-oauth-provider.md +19 -0
  391. package/docs/adr/005-static-client-baseline.md +19 -0
  392. package/docs/adr/006-guarded-fs-explicit-exec.md +16 -0
  393. package/docs/adr/007-preview-hash-journal.md +18 -0
  394. package/docs/adr/008-ts-js-semantics-first.md +17 -0
  395. package/docs/adr/009-jobs-polling.md +18 -0
  396. package/docs/adr/010-sqlite-better-sqlite3.md +18 -0
  397. package/docs/adr/011-env-example-secure-default.md +19 -0
  398. package/docs/adr/012-workspace-scope-grant.md +24 -0
  399. package/docs/adr/013-loopback-proxy-trust.md +18 -0
  400. package/docs/adr/014-direct-coding-tier.md +48 -0
  401. package/docs/adr/015-coding-agent-parity.md +56 -0
  402. package/docs/adr/016-oidc-openid-consent.md +15 -0
  403. package/docs/adr/017-installation-identity-local-config.md +44 -0
  404. package/docs/adr/018-access-scope-encoding.md +11 -0
  405. package/docs/adr/019-runtime-workspace-switch.md +59 -0
  406. package/docs/adr/020-desktop-access.md +50 -0
  407. package/docs/adr/021-persistent-desktop-consent.md +39 -0
  408. package/docs/adr/022-owner-kill-preserves-login.md +30 -0
  409. package/docs/adr/023-large-coding-inputs.md +49 -0
  410. package/docs/adr/024-usage-rounds-and-schedules.md +72 -0
  411. package/docs/adr/025-owner-chat-whitelist.md +53 -0
  412. package/docs/adr/026-remove-conversation-confirmation.md +35 -0
  413. package/docs/adr/027-workspace-client-list.md +20 -0
  414. package/docs/adr/028-owner-client-deletion.md +25 -0
  415. package/docs/adr/029-compact-tool-surface.md +121 -0
  416. package/docs/adr/030-windows-native-candidate.md +71 -0
  417. package/docs/adr/031-owner-selected-tunnel-supervision.md +13 -0
  418. package/docs/adr/032-owner-project-registry.md +43 -0
  419. package/docs/adr/033-read-only-project-federation.md +61 -0
  420. package/docs/adr/034-universal-resource-cas.md +60 -0
  421. package/docs/adr/035-project-brain-incremental-index.md +51 -0
  422. package/docs/adr/036-context-engine-evidence.md +53 -0
  423. package/docs/adr/037-owner-reviewed-memory.md +46 -0
  424. package/docs/adr/038-runtime-intelligence.md +46 -0
  425. package/docs/adr/039-advanced-agent-runtime.md +57 -0
  426. package/docs/adr/040-dodobench-release-gate.md +43 -0
  427. package/docs/adr/041-local-macos-docker-linux-gates.md +32 -0
  428. package/docs/adr/042-project-directory-generation-identity.md +36 -0
  429. package/docs/adr/043-trusted-self-hosted-platform-gates.md +38 -0
  430. package/docs/adr/044-global-launcher-and-cli-menu.md +43 -0
  431. package/docs/adr/045-ai-providers-multiproject.md +56 -0
  432. package/docs/adr/046-personal-access-mode.md +32 -0
  433. package/docs/adr/README.md +64 -0
  434. package/examples/.dodo.json.example +20 -0
  435. package/examples/cloudflared.yml +23 -0
  436. package/examples/reverse-proxy-fixture.mjs +37 -0
  437. package/native/desktop-linux.py +387 -0
  438. package/native/desktop-windows.cs +180 -0
  439. package/native/desktop.swift +212 -0
  440. package/package.json +145 -0
  441. package/schemas/global-config.schema.json +497 -0
  442. package/schemas/project-config.schema.json +75 -0
  443. package/schemas/tools.compact.json +3236 -0
  444. package/schemas/tools.hybrid.json +8194 -0
  445. package/schemas/tools.json +34518 -0
  446. package/scripts/guard-publish.mjs +12 -0
  447. package/scripts/setup-multimodal.mjs +70 -0
@@ -0,0 +1,261 @@
1
+ import { z } from 'zod';
2
+ import { defineTool } from './context.js';
3
+ import { DodoError } from '../errors.js';
4
+ import { TRUST_MODE_DESCRIPTIONS } from '../security/policy.js';
5
+ import { accessMode } from '../security/accessMode.js';
6
+ const looseData = z.looseObject({});
7
+ const projectIdInput = z.string().regex(/^prj_[0-9a-hjkmnp-tv-z]{8,64}$/).optional()
8
+ .describe('Optional owner-registered project ID for read-only federation; omit to use the active workspace');
9
+ export const projectOverviewTool = defineTool({
10
+ name: 'project_overview',
11
+ title: 'Project overview',
12
+ description: 'Bootstrap tool: returns the active workspace root, workspaceId + workspaceEpoch (required by every other tool), trust policy, capabilities, detected manifests/languages, runnable task recipes, a shallow file tree, and a scoped git summary. It also lists owner-registered projects this client may read under the current personal/managed access mode. Pass projectId for a read-only federated overview without switching the active workspace. Never executes project code. Call this first.',
13
+ input: { projectId: projectIdInput },
14
+ output: looseData,
15
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
16
+ requiredScope: 'dodo:read',
17
+ action: 'read',
18
+ noWorkspaceContext: true,
19
+ handler: async (args, ctx) => {
20
+ const s = ctx.services;
21
+ if (args.projectId !== undefined) {
22
+ return await s.federation.overview(args.projectId, ctx.principal, { workspaceId: s.workspaceId, workspaceEpoch: s.epoch });
23
+ }
24
+ const data = await s.overview.build({
25
+ workspaceId: s.workspaceId,
26
+ epoch: s.epoch,
27
+ trustMode: ctx.trustMode,
28
+ modeDescription: TRUST_MODE_DESCRIPTIONS[ctx.trustMode],
29
+ projectConfig: s.projectConfig,
30
+ searchBackend: s.search.rgAvailable() ? 'ripgrep' : 'js',
31
+ semanticAvailable: s.intel.available().ok,
32
+ });
33
+ const warnings = [];
34
+ if (data.projectConfigNote)
35
+ warnings.push(data.projectConfigNote);
36
+ let brain;
37
+ try {
38
+ brain = s.brain ? { available: true, ...s.brain.status() } : { available: false, status: 'unavailable' };
39
+ }
40
+ catch {
41
+ brain = { available: false, status: 'recovery_required' };
42
+ warnings.push('Project Brain status needs recovery; use brain_status or brain_rebuild after checking the active workspace.');
43
+ }
44
+ let contextEngine;
45
+ try {
46
+ const status = s.contextEngine?.status(ctx);
47
+ contextEngine = status ? { available: true, ...status } : { available: false, status: 'unavailable' };
48
+ }
49
+ catch {
50
+ contextEngine = { available: false, status: 'recovery_required' };
51
+ warnings.push('Context Engine diagnostics need recovery; retry context_status after checking the active workspace.');
52
+ }
53
+ let memory;
54
+ try {
55
+ const status = s.memory?.status(ctx);
56
+ memory = status ? { available: true, ...status } : { available: false, status: 'unavailable' };
57
+ }
58
+ catch {
59
+ memory = { available: false, status: 'recovery_required' };
60
+ warnings.push('Memory diagnostics need recovery; inspect owner state before creating new proposals.');
61
+ }
62
+ let runtime;
63
+ try {
64
+ runtime = s.runtime ? s.runtime.diagnostics(ctx) : { available: false, status: 'unavailable' };
65
+ }
66
+ catch {
67
+ runtime = { available: false, status: 'recovery_required' };
68
+ warnings.push('Runtime Intelligence diagnostics need recovery; retry after checking this workspace and client access.');
69
+ }
70
+ let agentRuntime;
71
+ try {
72
+ agentRuntime = s.agentRuntime ? s.agentRuntime.diagnostics(ctx) : { available: false, status: 'unavailable' };
73
+ }
74
+ catch {
75
+ agentRuntime = { available: false, status: 'recovery_required' };
76
+ warnings.push('Advanced Agent Runtime diagnostics need recovery; inspect this caller workspace state.');
77
+ }
78
+ const desktop = s.desktop.policy();
79
+ const personal = accessMode(s.store) === 'personal';
80
+ const desktopPlatform = process.platform === 'darwin' ? 'macOS 14+' : process.platform === 'win32' ? 'Windows interactive desktop' : process.platform === 'linux' ? 'Linux X11/XWayland session' : process.platform;
81
+ const federation = s.federation.listAuthorized(ctx.principal);
82
+ return {
83
+ data: {
84
+ ...data,
85
+ brain,
86
+ contextEngine,
87
+ memory,
88
+ runtime,
89
+ agentRuntime,
90
+ accessMode: personal ? 'personal' : 'managed',
91
+ ai: { available: Boolean(s.installation), profiles: s.installation?.ai.availableProfiles(s.workspaceId, ctx.principal) ?? [], note: personal ? 'Enabled profiles are ready on every owner-registered project. Spawn still requires dodo:exec and every action keeps its live scope, context, path, secret and sandbox checks.' : 'Only currently authorized profiles are listed; spawn requires dodo:exec, project/provider permission and live action policy. Discover subagent_spawn for its schema.' },
92
+ capabilities: { ...data.capabilities, desktop: { mode: desktop.mode, persistent: desktop.persistent, setupCommand: "dodo desktop setup", permissionCommand: "dodo desktop allow --app <app-id> --mode view|control --yes", rememberCommand: "dodo desktop allow --app <app-id> --mode view|control --persist --yes", platform: desktopPlatform, scope: "dodo:exec" } },
93
+ federation: {
94
+ mode: 'read-only',
95
+ projects: federation.projects,
96
+ maxProjectsPerSearch: 8,
97
+ note: personal ? 'Owner-registered projects allowed by the live OAuth read scope are listed. Pass projectId for read federation; use targetProjectId plus its workspace context for writes or commands.' : 'Only owner-registered projects with live read ACL are listed. Pass projectId for read federation; use targetProjectId plus its workspace context for writes or commands.',
98
+ },
99
+ },
100
+ warnings,
101
+ truncated: data.treeTruncated || federation.truncated,
102
+ };
103
+ },
104
+ });
105
+ export const listFilesTool = defineTool({
106
+ name: 'list_files',
107
+ title: 'List files',
108
+ description: 'Bounded directory tree under a workspace-relative path ("." = root). Pass an owner-registered projectId for read-only federation without switching the active workspace. Depth and entry counts are capped; symlinks are never followed; ignored/secret paths are excluded (includeIgnored only re-adds ordinary ignores, never secrets).',
109
+ input: {
110
+ projectId: projectIdInput,
111
+ path: z.string().max(1024).default('.'),
112
+ depth: z.number().int().min(1).max(10).optional(),
113
+ includeIgnored: z.boolean().default(false),
114
+ maxEntries: z.number().int().min(1).max(2000).optional(),
115
+ },
116
+ output: looseData,
117
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
118
+ requiredScope: 'dodo:read',
119
+ action: 'read',
120
+ handler: async (args, ctx) => {
121
+ const opts = { includeIgnored: args.includeIgnored };
122
+ if (args.depth !== undefined)
123
+ opts.depth = args.depth;
124
+ if (args.maxEntries !== undefined)
125
+ opts.maxEntries = args.maxEntries;
126
+ if (args.projectId !== undefined) {
127
+ const res = ctx.services.federation.listFiles(args.projectId, ctx.principal, args.path, opts);
128
+ return { data: { tree: res.tree, entryCount: res.entryCount, project: res.project }, truncated: res.truncated };
129
+ }
130
+ const res = ctx.services.listService.tree(args.path, opts);
131
+ return { data: { tree: res.root, entryCount: res.entryCount }, truncated: res.truncated };
132
+ },
133
+ });
134
+ export const readFilesTool = defineTool({
135
+ name: 'read_files',
136
+ title: 'Read files',
137
+ description: 'Read up to 10 UTF-8 text files (workspace-relative paths), optionally by 1-based line range. Pass an owner-registered projectId for read-only federation without switching the active workspace. Returns content, exact line span, total lines, and the SHA-256 of the WHOLE file\'s raw bytes. A federated hash is evidence only: switch that project into the active workspace and re-read before editing. Binary or non-UTF-8 files return a typed error.',
138
+ input: {
139
+ projectId: projectIdInput,
140
+ files: z
141
+ .array(z
142
+ .object({
143
+ path: z.string().max(1024),
144
+ startLine: z.number().int().min(1).optional(),
145
+ endLine: z.number().int().min(1).optional(),
146
+ numbered: z.boolean().optional().describe('prefix lines with their 1-based number (cat -n style)'),
147
+ })
148
+ .strict())
149
+ .min(1)
150
+ .max(10),
151
+ },
152
+ output: looseData,
153
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
154
+ requiredScope: 'dodo:read',
155
+ action: 'read',
156
+ handler: async (args, ctx) => {
157
+ if (args.projectId !== undefined) {
158
+ const res = ctx.services.federation.readFiles(args.projectId, ctx.principal, args.files);
159
+ return { data: { files: res.files, errors: res.errors, project: res.project }, truncated: res.truncated };
160
+ }
161
+ const res = ctx.services.readService.readBatch(args.files);
162
+ return { data: { files: res.files, errors: res.errors }, truncated: res.truncated };
163
+ },
164
+ });
165
+ export const searchCodeTool = defineTool({
166
+ name: 'search_code',
167
+ title: 'Search code',
168
+ description: 'Search file contents (grep). Pass projectId for one owner-registered project or projectIds for a bounded concurrent read across up to 8 authorized projects; this never switches the active workspace. mode "literal" (default) or "regex"; caseSensitive; fileGlob to restrict files; context lines; outputMode "content", "files", or "count". Uses ripgrep when installed, otherwise a bounded JS scan. A cursor is supported for one target only.',
169
+ input: {
170
+ projectId: projectIdInput,
171
+ projectIds: z.array(z.string().regex(/^prj_[0-9a-hjkmnp-tv-z]{8,64}$/)).min(1).max(8).optional()
172
+ .describe('Search up to 8 owner-registered projects concurrently; unavailable authorized projects are reported as partial failures'),
173
+ query: z.string().min(1).max(512),
174
+ mode: z.enum(['literal', 'regex']).default('literal'),
175
+ caseSensitive: z.boolean().default(true),
176
+ paths: z.array(z.string().max(1024)).max(20).optional(),
177
+ fileGlob: z.string().min(1).max(256).optional(),
178
+ includeIgnored: z.boolean().default(false),
179
+ maxResults: z.number().int().min(1).max(100).default(50),
180
+ contextLines: z.number().int().min(0).max(10).default(0),
181
+ contextBefore: z.number().int().min(0).max(10).optional(),
182
+ contextAfter: z.number().int().min(0).max(10).optional(),
183
+ outputMode: z.enum(['content', 'files', 'count']).default('content'),
184
+ cursor: z.string().max(256).optional(),
185
+ },
186
+ output: looseData,
187
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
188
+ requiredScope: 'dodo:read',
189
+ action: 'read',
190
+ handler: async (args, ctx) => {
191
+ if (args.projectId !== undefined && args.projectIds !== undefined) {
192
+ throw new DodoError('INVALID_INPUT', 'use either projectId or projectIds, not both');
193
+ }
194
+ const q = {
195
+ query: args.query,
196
+ mode: args.mode,
197
+ caseSensitive: args.caseSensitive,
198
+ includeIgnored: args.includeIgnored,
199
+ maxResults: args.maxResults,
200
+ contextBefore: args.contextBefore ?? args.contextLines,
201
+ contextAfter: args.contextAfter ?? args.contextLines,
202
+ outputMode: args.outputMode,
203
+ };
204
+ if (args.paths !== undefined)
205
+ q.paths = args.paths;
206
+ if (args.fileGlob !== undefined)
207
+ q.fileGlob = args.fileGlob;
208
+ const federatedIds = args.projectIds ?? (args.projectId !== undefined ? [args.projectId] : undefined);
209
+ if (federatedIds !== undefined) {
210
+ const federated = await ctx.services.federation.searchMany(federatedIds, ctx.principal, q, args.cursor);
211
+ if (args.projectIds === undefined && federated.results.length === 1) {
212
+ const item = federated.results[0];
213
+ return {
214
+ data: {
215
+ matches: item.result.matches,
216
+ files: item.result.files,
217
+ totalMatches: item.result.totalMatches,
218
+ backend: item.result.backend,
219
+ filesScanned: item.result.filesScanned,
220
+ project: item.project,
221
+ sources: item.sources,
222
+ failures: federated.failures,
223
+ },
224
+ truncated: federated.truncated,
225
+ nextCursor: federated.nextCursor ?? null,
226
+ };
227
+ }
228
+ return {
229
+ data: {
230
+ projects: federated.results.map((item) => ({
231
+ project: item.project,
232
+ matches: item.result.matches,
233
+ files: item.result.files,
234
+ totalMatches: item.result.totalMatches,
235
+ backend: item.result.backend,
236
+ filesScanned: item.result.filesScanned,
237
+ sources: item.sources,
238
+ })),
239
+ failures: federated.failures,
240
+ projectCount: federated.results.length,
241
+ totalMatches: federated.results.reduce((sum, item) => sum + item.result.totalMatches, 0),
242
+ },
243
+ truncated: federated.truncated,
244
+ };
245
+ }
246
+ const c = { principal: ctx.principal.grantId, epoch: ctx.services.epoch };
247
+ if (args.cursor !== undefined)
248
+ c.cursor = args.cursor;
249
+ const res = await ctx.services.search.search(q, c);
250
+ return {
251
+ data: { matches: res.matches, files: res.files, totalMatches: res.totalMatches, backend: res.backend, filesScanned: res.filesScanned },
252
+ truncated: res.truncated,
253
+ nextCursor: res.nextCursor ?? null,
254
+ };
255
+ },
256
+ });
257
+ export function requireOneOf(cond, message) {
258
+ if (!cond)
259
+ throw new DodoError('INVALID_INPUT', message);
260
+ }
261
+ //# sourceMappingURL=projectTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectTools.js","sourceRoot":"","sources":["../../src/tools/projectTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,MAAM,SAAS,GAAG,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AACpC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,QAAQ,EAAE;KACjF,QAAQ,CAAC,iGAAiG,CAAC,CAAC;AAE/G,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC;IAC5C,IAAI,EAAE,kBAAkB;IACxB,KAAK,EAAE,kBAAkB;IACzB,WAAW,EACT,seAAse;IACxe,KAAK,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE;IACpC,MAAM,EAAE,SAAS;IACjB,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;IACvG,aAAa,EAAE,WAAW;IAC1B,MAAM,EAAE,MAAM;IACd,kBAAkB,EAAE,IAAI;IACxB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC;QACvB,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,MAAM,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7H,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YAClC,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,eAAe,EAAE,uBAAuB,CAAC,GAAG,CAAC,SAAS,CAAC;YACvD,aAAa,EAAE,CAAC,CAAC,aAAa;YAC9B,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;YACxD,iBAAiB,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE;SAC1C,CAAC,CAAC;QACH,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,iBAAiB;YAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAClE,IAAI,KAA8B,CAAC;QACnC,IAAI,CAAC;YACH,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;QAC3G,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;YAC1D,QAAQ,CAAC,IAAI,CAAC,6GAA6G,CAAC,CAAC;QAC/H,CAAC;QACD,IAAI,aAAsC,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,CAAC,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5C,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;QACxG,CAAC;QAAC,MAAM,CAAC;YACP,aAAa,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;YAClE,QAAQ,CAAC,IAAI,CAAC,qGAAqG,CAAC,CAAC;QACvH,CAAC;QACD,IAAI,MAA+B,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YACrC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;QACjG,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;YAC3D,QAAQ,CAAC,IAAI,CAAC,sFAAsF,CAAC,CAAC;QACxG,CAAC;QACD,IAAI,OAAgC,CAAC;QACrC,IAAI,CAAC;YACH,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;QACjG,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;YAC5D,QAAQ,CAAC,IAAI,CAAC,wGAAwG,CAAC,CAAC;QAC1H,CAAC;QACD,IAAI,YAAqC,CAAC;QAC1C,IAAI,CAAC;YACH,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;QAChH,CAAC;QAAC,MAAM,CAAC;YACP,YAAY,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;YACjE,QAAQ,CAAC,IAAI,CAAC,wFAAwF,CAAC,CAAC;QAC1G,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC;QACpD,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QACpN,MAAM,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9D,OAAO;YACL,IAAI,EAAE;gBACJ,GAAG,IAAI;gBACP,KAAK;gBACL,aAAa;gBACb,MAAM;gBACN,OAAO;gBACP,YAAY;gBACZ,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;gBAC7C,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,WAAW,EAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,+KAA+K,CAAC,CAAC,CAAC,sKAAsK,EAAE;gBACxe,YAAY,EAAE,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,6DAA6D,EAAE,eAAe,EAAE,uEAAuE,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;gBACtW,UAAU,EAAE;oBACV,IAAI,EAAE,WAAW;oBACjB,QAAQ,EAAE,UAAU,CAAC,QAAQ;oBAC7B,oBAAoB,EAAE,CAAC;oBACvB,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,uLAAuL,CAAC,CAAC,CAAC,0KAA0K;iBACtX;aACF;YACD,QAAQ;YACR,SAAS,EAAE,IAAI,CAAC,aAAa,IAAI,UAAU,CAAC,SAAS;SACtD,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;IACtC,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE,YAAY;IACnB,WAAW,EACT,2UAA2U;IAC7U,KAAK,EAAE;QACL,SAAS,EAAE,cAAc;QACzB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;QACvC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;QACjD,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;QAC1C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;KACzD;IACD,MAAM,EAAE,SAAS;IACjB,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;IACvG,aAAa,EAAE,WAAW;IAC1B,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,IAAI,GAAsE,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;QACxH,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACtD,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;YAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACrE,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC9F,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;QAClH,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3D,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;IAC5F,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;IACtC,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE,YAAY;IACnB,WAAW,EACT,8bAA8b;IAChc,KAAK,EAAE;QACL,SAAS,EAAE,cAAc;QACzB,KAAK,EAAE,CAAC;aACL,KAAK,CACJ,CAAC;aACE,MAAM,CAAC;YACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;YAC1B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;YAC7C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;YAC3C,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;SACnG,CAAC;aACD,MAAM,EAAE,CACZ;aACA,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,EAAE,CAAC;KACX;IACD,MAAM,EAAE,SAAS;IACjB,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;IACvG,aAAa,EAAE,WAAW;IAC1B,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACzF,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;QAC5G,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;IACtF,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;IACvC,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,aAAa;IACpB,WAAW,EACT,ubAAub;IACzb,KAAK,EAAE;QACL,SAAS,EAAE,cAAc;QACzB,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;aAC7F,QAAQ,CAAC,yHAAyH,CAAC;QACtI,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QACjC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;QACrD,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QACxC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;QACvD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;QAC/C,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;QAC1C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QACxD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACxD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;QACzD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;QACxD,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;QACpE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;KACvC;IACD,MAAM,EAAE,SAAS;IACjB,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;IACvG,aAAa,EAAE,WAAW;IAC1B,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAClE,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,8CAA8C,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,CAAC,GAAqD;YAC1D,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,YAAY;YACtD,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY;YACpD,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC;QACF,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;YAAE,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACnD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAAE,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACtG,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,YAAY,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACxG,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpE,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAuC,CAAC;gBACxE,OAAO;oBACL,IAAI,EAAE;wBACJ,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;wBAC5B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;wBACxB,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;wBACtC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;wBAC5B,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;wBACtC,OAAO,EAAE,IAAI,CAAC,OAAO;wBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;wBACrB,QAAQ,EAAE,SAAS,CAAC,QAAQ;qBAC7B;oBACD,SAAS,EAAE,SAAS,CAAC,SAAS;oBAC9B,UAAU,EAAE,SAAS,CAAC,UAAU,IAAI,IAAI;iBACzC,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,IAAI,EAAE;oBACJ,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;wBACzC,OAAO,EAAE,IAAI,CAAC,OAAO;wBACrB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;wBAC5B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;wBACxB,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;wBACtC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;wBAC5B,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;wBACtC,OAAO,EAAE,IAAI,CAAC,OAAO;qBACtB,CAAC,CAAC;oBACH,QAAQ,EAAE,SAAS,CAAC,QAAQ;oBAC5B,YAAY,EAAE,SAAS,CAAC,OAAO,CAAC,MAAM;oBACtC,YAAY,EAAE,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;iBACzF;gBACD,SAAS,EAAE,SAAS,CAAC,SAAS;aAC/B,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,GAA0D,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjI,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACtD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACnD,OAAO;YACL,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE;YACtI,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI;SACnC,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,UAAU,YAAY,CAAC,IAAa,EAAE,OAAe;IACzD,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,81 @@
1
+ import { z } from 'zod';
2
+ import { defineTool, policyGate } from './context.js';
3
+ import { DodoError } from '../errors.js';
4
+ import { Hash, Id, Path } from '../services/multimodal/contracts.js';
5
+ import { ResourceChunk, ResourceExtract, ResourceInfo, ResourcePreview } from '../services/resources/contracts.js';
6
+ import { RESOURCE_RANGE_MAX_BYTES } from '../services/resources/casStore.js';
7
+ const read = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false };
8
+ const execute = { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false };
9
+ const ExpectedMime = z.string().regex(/^[a-z0-9!#$&^_.+-]+\/[a-z0-9!#$&^_.+-]+$/i).max(150).optional();
10
+ function use(ctx) {
11
+ const service = ctx.services.resources;
12
+ if (!service)
13
+ throw new DodoError('NOT_SUPPORTED', 'resource service is unavailable in this running build');
14
+ return service;
15
+ }
16
+ const inspectTool = defineTool({
17
+ name: 'resource_inspect', title: 'Ingest or inspect one immutable resource',
18
+ description: 'Create a workspace/principal-scoped reference to one guarded workspace path or owned media asset, or inspect an existing resourceId. Bytes enter the private content-addressed store only after path/link/file-identity checks and SHA-256 verification. A resourceId/URI is never authority and cannot cross clients or workspaces.',
19
+ input: { resourceId: Id.optional(), path: Path.optional(), assetId: Id.optional(), expectedSha256: Hash.optional(), expectedMimeType: ExpectedMime },
20
+ output: ResourceInfo, requiredScope: 'dodo:read', action: 'read', annotations: read,
21
+ handler: async (args, ctx) => {
22
+ const selected = [args.resourceId, args.path, args.assetId].filter((value) => value !== undefined);
23
+ if (selected.length !== 1)
24
+ throw new DodoError('INVALID_INPUT', 'provide exactly one of resourceId, path or assetId');
25
+ const service = use(ctx);
26
+ if (args.path)
27
+ return { data: await service.ingestWorkspace(ctx, args.path, args.expectedSha256, args.expectedMimeType) };
28
+ if (args.assetId)
29
+ return { data: await service.ingestAsset(ctx, args.assetId, args.expectedSha256, args.expectedMimeType) };
30
+ return { data: await service.inspect(ctx, args.resourceId, args.expectedSha256, args.expectedMimeType) };
31
+ },
32
+ });
33
+ const resourceReadTool = defineTool({
34
+ name: 'resource_read', title: 'Read one bounded resource chunk',
35
+ description: 'Read at most 256 KiB from the beginning of an owned resource. Complete UTF-8 text is returned as text; binary or partial data is bounded Base64 with a signed resumeToken. Access, ACL and object hash are rechecked on every call.',
36
+ input: { resourceId: Id, maxBytes: z.number().int().min(1).max(RESOURCE_RANGE_MAX_BYTES).default(64 * 1024), expectedSha256: Hash.optional() },
37
+ output: ResourceChunk, requiredScope: 'dodo:read', action: 'read', annotations: read,
38
+ handler: async (args, ctx) => {
39
+ const result = await use(ctx).read(ctx, args.resourceId, args.maxBytes, args.expectedSha256);
40
+ return { data: { resource: result.info, encoding: result.encoding, data: result.data, range: { start: result.start, endExclusive: result.endExclusive, total: result.info.bytes }, chunkSha256: result.chunkHash, eof: result.eof, nextOffset: result.nextOffset, resumeToken: result.resumeToken }, truncated: !result.eof, nextCursor: result.resumeToken };
41
+ },
42
+ });
43
+ const resourceRangeTool = defineTool({
44
+ name: 'resource_read_range', title: 'Read or resume a bounded byte range',
45
+ description: 'Read one Base64-encoded byte range (maximum 256 KiB) from an owned immutable resource. Continue with resumeToken alone; the signed token is bound to resource hash, workspace and principal but never replaces authorization. Multi-range and unbounded reads are refused.',
46
+ input: { resourceId: Id.optional(), cursor: z.string().max(2048).optional(), offset: z.number().int().min(0).max(RESOURCE_RANGE_MAX_BYTES * 2048).optional(), length: z.number().int().min(1).max(RESOURCE_RANGE_MAX_BYTES).default(64 * 1024), expectedSha256: Hash.optional() },
47
+ output: ResourceChunk, requiredScope: 'dodo:read', action: 'read', annotations: read,
48
+ handler: async (args, ctx) => {
49
+ const result = await use(ctx).readRange(ctx, { ...(args.resourceId ? { resourceId: args.resourceId } : {}), ...(args.cursor ? { cursor: args.cursor } : {}), ...(args.offset !== undefined ? { offset: args.offset } : {}), length: args.length, ...(args.expectedSha256 ? { expectedHash: args.expectedSha256 } : {}) });
50
+ return { data: { resource: result.info, encoding: 'base64', data: result.data, range: { start: result.start, endExclusive: result.endExclusive, total: result.info.bytes }, chunkSha256: result.chunkHash, eof: result.eof, nextOffset: result.nextOffset, resumeToken: result.resumeToken }, truncated: !result.eof, nextCursor: result.resumeToken };
51
+ },
52
+ });
53
+ const previewTool = defineTool({
54
+ name: 'resource_preview', title: 'Preview a resource safely',
55
+ description: 'Return bounded UTF-8 text, a raster thumbnail MCP image block, a <=6 MiB MCP audio block, or metadata-only evidence. SVG stays untrusted text; unsupported formats are never executed or sent to a shell.',
56
+ input: { resourceId: Id, maxEdge: z.number().int().min(64).max(1600).default(1024), expectedSha256: Hash.optional() },
57
+ output: ResourcePreview, requiredScope: 'dodo:read', action: 'read', annotations: read,
58
+ handler: async (args, ctx) => {
59
+ const result = await use(ctx).preview(ctx, args.resourceId, args.maxEdge, args.expectedSha256);
60
+ return { data: result.data, ...(result.block ? { contentBlocks: [result.block] } : {}) };
61
+ },
62
+ });
63
+ const extractTool = defineTool({
64
+ name: 'resource_extract', title: 'Extract bounded deterministic resource data',
65
+ description: 'Extract validated UTF-8 text, safe ZIP central-directory names/sizes, or metadata from an owned resource. Archive entries are never inflated, files are never executed, and OCR/PDF claims are not fabricated when no provider exists.',
66
+ input: { resourceId: Id, kind: z.enum(['auto', 'text', 'metadata', 'archive_entries']).default('auto'), expectedSha256: Hash.optional() },
67
+ output: ResourceExtract, requiredScope: 'dodo:read', action: 'read', annotations: read,
68
+ handler: async (args, ctx) => ({ data: await use(ctx).extract(ctx, args.resourceId, args.kind, args.expectedSha256) }),
69
+ });
70
+ const transformTool = defineTool({
71
+ name: 'resource_transform', title: 'Create a bounded immutable resource transform',
72
+ description: 'Create a JPEG thumbnail from an owned raster image and store it as a new immutable CAS resource. Decoder input is untrusted, dimensions/output are bounded, source hash is rechecked and inspect-mode owner approval still applies. No external command or network access.',
73
+ input: { resourceId: Id, operation: z.literal('thumbnail').default('thumbnail'), maxEdge: z.number().int().min(64).max(1600).default(1024), expectedSha256: Hash.optional() },
74
+ output: ResourceInfo, requiredScope: 'dodo:exec', action: 'exec', annotations: execute,
75
+ handler: async (args, ctx) => {
76
+ policyGate(ctx, { tool: 'resource_transform', action: 'exec', approvalAction: { resourceId: args.resourceId, operation: args.operation, maxEdge: args.maxEdge, expectedSha256: args.expectedSha256 ?? null }, summary: 'create one bounded image thumbnail resource' });
77
+ return { data: await use(ctx).transformImage(ctx, args.resourceId, args.maxEdge, args.expectedSha256) };
78
+ },
79
+ });
80
+ export const RESOURCE_TOOLS = [inspectTool, resourceReadTool, resourceRangeTool, previewTool, extractTool, transformTool];
81
+ //# sourceMappingURL=resourceTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resourceTools.js","sourceRoot":"","sources":["../../src/tools/resourceTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ import { z } from 'zod';
2
+ import { DodoError } from '../errors.js';
3
+ import { EXEC_ARG_BYTES, validateExecArgs } from '../services/jobs/commandInput.js';
4
+ import { RuntimeDiagnosis, RuntimeEvidence, RuntimeEvidenceId, RuntimeSession, RuntimeSessionId, RuntimeSessionStatus, RuntimeTask, RuntimeTaskId, RuntimeTaskKind, } from '../services/runtime/contracts.js';
5
+ import { defineTool, policyGate } from './context.js';
6
+ import { withIdempotency } from './changeTools.js';
7
+ const read = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false };
8
+ const plan = { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false };
9
+ const execute = { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true };
10
+ const IdempotencyKey = z.string().min(8).max(128);
11
+ function use(ctx) {
12
+ const runtime = ctx.services.runtime;
13
+ if (!runtime)
14
+ throw new DodoError('NOT_SUPPORTED', 'Runtime Intelligence is unavailable in this running build');
15
+ return runtime;
16
+ }
17
+ const runtimeSessionOpenTool = defineTool({
18
+ name: 'runtime_session_open', title: 'Open a durable runtime evidence session',
19
+ description: 'Open a caller/workspace-scoped runtime session that persists across MCP reconnects and server restarts. This opens no process, browser, network, desktop, microphone or system audio by itself. Handles expire and live OAuth/target authority is rechecked on every use.',
20
+ input: { label: z.string().min(1).max(160), ttlMinutes: z.number().int().min(1).max(24 * 60).default(60) }, output: RuntimeSession,
21
+ requiredScope: 'dodo:write', action: 'plan', annotations: plan,
22
+ handler: async (args, ctx) => ({ data: use(ctx).open(ctx, args.label, args.ttlMinutes) }),
23
+ });
24
+ const runtimeSessionStatusTool = defineTool({
25
+ name: 'runtime_session_status', title: 'Inspect a runtime session',
26
+ description: 'Return caller-owned session, task and evidence status after rechecking live access. Process metadata is reconnectable; raw command output and browser secrets are never persisted in Runtime Intelligence.',
27
+ input: { sessionId: RuntimeSessionId }, output: RuntimeSessionStatus,
28
+ requiredScope: 'dodo:read', action: 'read', annotations: read,
29
+ handler: async (args, ctx) => ({ data: use(ctx).status(ctx, args.sessionId) }),
30
+ });
31
+ const runtimeSessionCloseTool = defineTool({
32
+ name: 'runtime_session_close', title: 'Close a runtime session',
33
+ description: 'Close one owned runtime session. Refuses while attached tasks are running and never kills work silently. Jobs remain governed by runtime_task_cancel and the existing owned-process rules.',
34
+ input: { sessionId: RuntimeSessionId }, output: RuntimeSession,
35
+ requiredScope: 'dodo:write', action: 'plan', annotations: { ...plan, idempotentHint: true },
36
+ handler: async (args, ctx) => ({ data: use(ctx).closeSession(ctx, args.sessionId) }),
37
+ });
38
+ const runtimeTaskStartTool = defineTool({
39
+ name: 'runtime_task_start', title: 'Start a reconnectable runtime task',
40
+ description: 'Start an explicit program+argv process as process/test/container runtime evidence. No shell string is accepted. Uses the existing trusted executable resolver, execution approval, owner command-sandbox policy, environment allowlist, timeout and durable idempotency. Returns immediately; observe or cancel by runtime task handle.',
41
+ input: {
42
+ sessionId: RuntimeSessionId, kind: RuntimeTaskKind,
43
+ program: z.string().min(1).max(512), args: z.array(z.string().max(EXEC_ARG_BYTES)).max(128).default([]),
44
+ cwd: z.string().max(1024).default('.'), timeoutMs: z.number().int().min(1000).max(30 * 60 * 1000).optional(),
45
+ sandbox: z.boolean().optional(), network: z.boolean().default(false), idempotencyKey: IdempotencyKey,
46
+ },
47
+ output: z.object({ task: RuntimeTask, sandboxed: z.string().nullable(), replayed: z.boolean() }).strict(),
48
+ requiredScope: 'dodo:exec', action: 'exec', annotations: execute,
49
+ handler: async (args, ctx) => {
50
+ validateExecArgs(args.program, args.args);
51
+ use(ctx).prepareTask(ctx, args.sessionId);
52
+ policyGate(ctx, {
53
+ tool: 'runtime_task_start', action: 'exec',
54
+ approvalAction: { sessionId: args.sessionId, kind: args.kind, program: args.program, args: args.args, cwd: args.cwd, timeoutMs: args.timeoutMs ?? null, sandbox: args.sandbox ?? null, network: args.network },
55
+ summary: `runtime ${args.kind}: ${args.program} ${args.args.join(' ')}`.slice(0, 200),
56
+ });
57
+ const { result, replayed } = await withIdempotency(ctx, 'runtime_task_start', args.idempotencyKey, {
58
+ sessionId: args.sessionId, kind: args.kind, program: args.program, args: args.args, cwd: args.cwd,
59
+ timeoutMs: args.timeoutMs ?? null, sandbox: args.sandbox ?? null, network: args.network,
60
+ }, async () => {
61
+ const request = {
62
+ workspaceId: ctx.services.workspaceId, epoch: ctx.services.epoch, principal: ctx.principal.grantId,
63
+ kind: 'exec', program: args.program, args: args.args, cwdRel: args.cwd, sandbox: args.sandbox, network: args.network,
64
+ };
65
+ if (args.timeoutMs !== undefined)
66
+ request.timeoutMs = args.timeoutMs;
67
+ const job = ctx.services.jobs.start(request);
68
+ try {
69
+ return { task: use(ctx).attachTask(ctx, args.sessionId, job.jobId, args.kind), sandboxed: job.sandboxed };
70
+ }
71
+ catch (error) {
72
+ ctx.services.jobs.cancel(job.jobId, ctx.services.workspaceId, 0);
73
+ throw error;
74
+ }
75
+ });
76
+ return { data: { ...result, replayed } };
77
+ },
78
+ });
79
+ const runtimeTaskObserveTool = defineTool({
80
+ name: 'runtime_task_observe', title: 'Record safe process or test evidence',
81
+ description: 'Observe an owned runtime task and persist only status, exit metadata, byte counts and SHA-256 samples. Raw stdout/stderr is not stored. Optional reportPath is read through WorkspaceFS and retains only aggregate JSON test counts plus its source hash.',
82
+ input: { sessionId: RuntimeSessionId, taskId: RuntimeTaskId, reportPath: z.string().max(1024).optional() },
83
+ output: z.object({ task: RuntimeTask, evidence: RuntimeEvidence }).strict(),
84
+ requiredScope: 'dodo:read', action: 'read', annotations: read,
85
+ handler: async (args, ctx) => ({ data: use(ctx).observeTask(ctx, args.sessionId, args.taskId, args.reportPath) }),
86
+ });
87
+ const runtimeTaskCancelTool = defineTool({
88
+ name: 'runtime_task_cancel', title: 'Cancel an owned runtime task',
89
+ description: 'Cancel only the live owned process tree attached to this caller/workspace runtime task. Never signals a stored PID after restart and never broadens owner command policy.',
90
+ input: { sessionId: RuntimeSessionId, taskId: RuntimeTaskId },
91
+ output: z.object({ taskId: RuntimeTaskId, jobId: z.string(), status: z.string() }).strict(),
92
+ requiredScope: 'dodo:exec', action: 'job-control', annotations: { ...execute, openWorldHint: false },
93
+ handler: async (args, ctx) => ({ data: use(ctx).cancelTask(ctx, args.sessionId, args.taskId) }),
94
+ });
95
+ function imageBlock(ctx, assetId) {
96
+ const asset = ctx.services.multimodal?.storage.get(ctx.principal, assetId);
97
+ if (!asset || asset.meta.kind !== 'image')
98
+ throw new DodoError('NOT_FOUND', 'browser screenshot asset expired before response');
99
+ return { type: 'image', data: asset.bytes.toString('base64'), mimeType: asset.meta.mimeType };
100
+ }
101
+ const runtimeBrowserCollectTool = defineTool({
102
+ name: 'runtime_browser_collect', title: 'Collect bounded evidence from an existing browser',
103
+ description: 'Observe an already owner-created browser_session and attach bounded screenshot/DOM/console/network evidence to a runtime session. It never opens a browser or enables public web. Persisted evidence contains hashes, counts and query-free safe URL only; no cookie, authorization header, input value or raw console/DOM text is stored.',
104
+ input: { sessionId: RuntimeSessionId, browserSessionId: z.string().regex(/^browser_[0-9a-hjkmnp-tv-z]{8,64}$/) },
105
+ output: z.looseObject({ evidence: RuntimeEvidence }), requiredScope: 'dodo:read', action: 'read', annotations: read,
106
+ handler: async (args, ctx) => {
107
+ const result = await use(ctx).collectBrowser(ctx, args.sessionId, args.browserSessionId);
108
+ return { data: result, contentBlocks: [imageBlock(ctx, result.observation.asset.assetId)] };
109
+ },
110
+ });
111
+ const runtimeSnapshotTool = defineTool({
112
+ name: 'runtime_snapshot', title: 'Record a guarded workspace snapshot',
113
+ description: 'Record a bounded hash of guarded file metadata plus caller-owned committed changesets eligible to be considered for rollback. It stores no file content and performs no rollback. Actual rollback remains rollback_changes with existing journal and conflict checks.',
114
+ input: { sessionId: RuntimeSessionId }, output: RuntimeEvidence,
115
+ requiredScope: 'dodo:read', action: 'read', annotations: read,
116
+ handler: async (args, ctx) => ({ data: use(ctx).snapshot(ctx, args.sessionId) }),
117
+ });
118
+ const runtimeEvidenceTool = defineTool({
119
+ name: 'runtime_evidence', title: 'Inspect and revalidate runtime evidence',
120
+ description: 'Read one caller/workspace/session-scoped evidence record. By default rechecks the current guarded process, browser observation or workspace snapshot and marks changed/unavailable sources stale. An evidence ID never grants access.',
121
+ input: { sessionId: RuntimeSessionId, evidenceId: RuntimeEvidenceId, refresh: z.boolean().default(true) }, output: RuntimeEvidence,
122
+ requiredScope: 'dodo:read', action: 'read', annotations: read,
123
+ handler: async (args, ctx) => ({ data: await use(ctx).evidence(ctx, args.sessionId, args.evidenceId, args.refresh) }),
124
+ });
125
+ const runtimeDiagnoseTool = defineTool({
126
+ name: 'runtime_diagnose', title: 'Diagnose bounded runtime evidence',
127
+ description: 'Produce deterministic facts, observations and clearly labeled inferences from current caller-owned runtime evidence. It never reads hidden output, executes a fix, changes code, grants permission or claims that process exit alone proves user-visible success.',
128
+ input: { sessionId: RuntimeSessionId, evidenceIds: z.array(RuntimeEvidenceId).min(1).max(16) }, output: RuntimeDiagnosis,
129
+ requiredScope: 'dodo:read', action: 'read', annotations: read,
130
+ handler: async (args, ctx) => ({ data: await use(ctx).diagnose(ctx, args.sessionId, args.evidenceIds) }),
131
+ });
132
+ export const RUNTIME_TOOLS = [
133
+ runtimeSessionOpenTool, runtimeSessionStatusTool, runtimeSessionCloseTool,
134
+ runtimeTaskStartTool, runtimeTaskObserveTool, runtimeTaskCancelTool,
135
+ runtimeBrowserCollectTool, runtimeSnapshotTool, runtimeEvidenceTool, runtimeDiagnoseTool,
136
+ ];
137
+ //# sourceMappingURL=runtimeTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtimeTools.js","sourceRoot":"","sources":["../../src/tools/runtimeTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { z } from 'zod';
2
+ import { defineTool } from './context.js';
3
+ import { ScheduleInput } from '../services/schedules/scheduleService.js';
4
+ const output = z.looseObject({});
5
+ export const scheduleProposeTool = defineTool({
6
+ name: 'schedule_propose', title: 'Propose scheduled command', description: 'Create an immutable PENDING scheduled command. Does not execute or authorize it. Owner must inspect and approve the exact digest locally, with its own local approval. Runs only while HTTP DODO serves this workspace; saved trusted mode required. Current project code/dependencies are not pinned. Default requires OS sandbox, network disabled.',
7
+ input: ScheduleInput.shape, output, annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false }, requiredScope: 'dodo:exec', action: 'exec',
8
+ handler: async (args, ctx) => ({ data: ctx.services.schedules.propose(Object.fromEntries(Object.entries(args).filter(([key]) => key !== 'workspaceId' && key !== 'workspaceEpoch')), ctx.principal) }),
9
+ });
10
+ //# sourceMappingURL=scheduleTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduleTools.js","sourceRoot":"","sources":["../../src/tools/scheduleTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AACzE,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AACjC,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC;IAC5C,IAAI,EAAC,kBAAkB,EAAC,KAAK,EAAC,2BAA2B,EAAC,WAAW,EAAC,uVAAuV;IAC7Z,KAAK,EAAC,aAAa,CAAC,KAAK,EAAC,MAAM,EAAC,WAAW,EAAC,EAAC,YAAY,EAAC,KAAK,EAAC,eAAe,EAAC,KAAK,EAAC,cAAc,EAAC,KAAK,EAAC,aAAa,EAAC,KAAK,EAAC,EAAC,aAAa,EAAC,WAAW,EAAC,MAAM,EAAC,MAAM;IACxK,OAAO,EAAC,KAAK,EAAC,IAAI,EAAC,GAAG,EAAC,EAAE,CAAA,CAAC,EAAC,IAAI,EAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,aAAa,IAAI,GAAG,KAAK,gBAAgB,CAAC,CAAC,EAAC,GAAG,CAAC,SAAS,CAAC,EAAC,CAAC;CAC9L,CAAC,CAAC"}