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.
- package/LICENSE +21 -0
- package/README.md +425 -0
- package/dist/auth/adapter.js +43 -0
- package/dist/auth/adapter.js.map +1 -0
- package/dist/auth/clientDeletion.js +45 -0
- package/dist/auth/clientDeletion.js.map +1 -0
- package/dist/auth/clients.js +55 -0
- package/dist/auth/clients.js.map +1 -0
- package/dist/auth/constants.js +10 -0
- package/dist/auth/constants.js.map +1 -0
- package/dist/auth/interactions.js +184 -0
- package/dist/auth/interactions.js.map +1 -0
- package/dist/auth/keys.js +56 -0
- package/dist/auth/keys.js.map +1 -0
- package/dist/auth/provider.js +131 -0
- package/dist/auth/provider.js.map +1 -0
- package/dist/auth/verifier.js +74 -0
- package/dist/auth/verifier.js.map +1 -0
- package/dist/cli/kill.js +124 -0
- package/dist/cli/kill.js.map +1 -0
- package/dist/cli/main.js +1393 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/menu.js +127 -0
- package/dist/cli/menu.js.map +1 -0
- package/dist/cli/terminal.js +30 -0
- package/dist/cli/terminal.js.map +1 -0
- package/dist/config/globalConfig.js +144 -0
- package/dist/config/globalConfig.js.map +1 -0
- package/dist/config/limits.js +42 -0
- package/dist/config/limits.js.map +1 -0
- package/dist/config/paths.js +94 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/projectConfig.js +63 -0
- package/dist/config/projectConfig.js.map +1 -0
- package/dist/config/stateImport.js +306 -0
- package/dist/config/stateImport.js.map +1 -0
- package/dist/config/tunnelConfig.js +23 -0
- package/dist/config/tunnelConfig.js.map +1 -0
- package/dist/errors.js +82 -0
- package/dist/errors.js.map +1 -0
- package/dist/evaluation/contracts.js +86 -0
- package/dist/evaluation/contracts.js.map +1 -0
- package/dist/evaluation/dodoBench.js +69 -0
- package/dist/evaluation/dodoBench.js.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/ipc/authentication.js +117 -0
- package/dist/ipc/authentication.js.map +1 -0
- package/dist/ipc/client.js +86 -0
- package/dist/ipc/client.js.map +1 -0
- package/dist/ipc/installationClient.js +83 -0
- package/dist/ipc/installationClient.js.map +1 -0
- package/dist/ipc/ownerControl.js +46 -0
- package/dist/ipc/ownerControl.js.map +1 -0
- package/dist/ipc/protocol.js +2 -0
- package/dist/ipc/protocol.js.map +1 -0
- package/dist/ipc/server.js +108 -0
- package/dist/ipc/server.js.map +1 -0
- package/dist/platform/execResolve.js +64 -0
- package/dist/platform/execResolve.js.map +1 -0
- package/dist/platform/fileIdentity.js +26 -0
- package/dist/platform/fileIdentity.js.map +1 -0
- package/dist/platform/fsRetry.js +22 -0
- package/dist/platform/fsRetry.js.map +1 -0
- package/dist/platform/pathPolicy.js +29 -0
- package/dist/platform/pathPolicy.js.map +1 -0
- package/dist/platform/privateFs.js +116 -0
- package/dist/platform/privateFs.js.map +1 -0
- package/dist/platform/processTree.js +31 -0
- package/dist/platform/processTree.js.map +1 -0
- package/dist/platform/shell.js +74 -0
- package/dist/platform/shell.js.map +1 -0
- package/dist/platform/speech.js +94 -0
- package/dist/platform/speech.js.map +1 -0
- package/dist/platform/system.js +28 -0
- package/dist/platform/system.js.map +1 -0
- package/dist/platform/windowsSandbox.js +129 -0
- package/dist/platform/windowsSandbox.js.map +1 -0
- package/dist/projects/federation.js +312 -0
- package/dist/projects/federation.js.map +1 -0
- package/dist/projects/registry.js +291 -0
- package/dist/projects/registry.js.map +1 -0
- package/dist/security/accessMode.js +19 -0
- package/dist/security/accessMode.js.map +1 -0
- package/dist/security/approvals.js +56 -0
- package/dist/security/approvals.js.map +1 -0
- package/dist/security/env.js +57 -0
- package/dist/security/env.js.map +1 -0
- package/dist/security/mutationQueue.js +78 -0
- package/dist/security/mutationQueue.js.map +1 -0
- package/dist/security/policy.js +22 -0
- package/dist/security/policy.js.map +1 -0
- package/dist/security/projectAuthority.js +22 -0
- package/dist/security/projectAuthority.js.map +1 -0
- package/dist/security/redact.js +30 -0
- package/dist/security/redact.js.map +1 -0
- package/dist/server/aiAdmin.js +201 -0
- package/dist/server/aiAdmin.js.map +1 -0
- package/dist/server/appServer.js +461 -0
- package/dist/server/appServer.js.map +1 -0
- package/dist/server/bootstrap.js +185 -0
- package/dist/server/bootstrap.js.map +1 -0
- package/dist/server/configUi/app.css +347 -0
- package/dist/server/configUi/app.js +958 -0
- package/dist/server/configUi/index.html +379 -0
- package/dist/server/configUi/ui/alerts.js +92 -0
- package/dist/server/configUi/ui/dom.js +19 -0
- package/dist/server/configUi/ui/tooltips.js +115 -0
- package/dist/server/configUi/vendor/VERSION.txt +1 -0
- package/dist/server/configUi/vendor/sweetalert2.min.css +1 -0
- package/dist/server/configUi/vendor/sweetalert2.min.js +5 -0
- package/dist/server/configUi/workbench.css +62 -0
- package/dist/server/configUi/workbench.js +394 -0
- package/dist/server/installationRuntime.js +155 -0
- package/dist/server/installationRuntime.js.map +1 -0
- package/dist/server/instructions.js +17 -0
- package/dist/server/instructions.js.map +1 -0
- package/dist/server/ipcDispatch.js +225 -0
- package/dist/server/ipcDispatch.js.map +1 -0
- package/dist/server/localConfig.js +561 -0
- package/dist/server/localConfig.js.map +1 -0
- package/dist/server/optionalServices.js +30 -0
- package/dist/server/optionalServices.js.map +1 -0
- package/dist/server/projectLease.js +46 -0
- package/dist/server/projectLease.js.map +1 -0
- package/dist/server/stdioServer.js +75 -0
- package/dist/server/stdioServer.js.map +1 -0
- package/dist/server/version.js +13 -0
- package/dist/server/version.js.map +1 -0
- package/dist/server/workspaceHost.js +194 -0
- package/dist/server/workspaceHost.js.map +1 -0
- package/dist/services/agent/agentService.js +598 -0
- package/dist/services/agent/agentService.js.map +1 -0
- package/dist/services/agent/contracts.js +102 -0
- package/dist/services/agent/contracts.js.map +1 -0
- package/dist/services/ai/adapters.js +287 -0
- package/dist/services/ai/adapters.js.map +1 -0
- package/dist/services/ai/contracts.js +39 -0
- package/dist/services/ai/contracts.js.map +1 -0
- package/dist/services/ai/credentials.js +77 -0
- package/dist/services/ai/credentials.js.map +1 -0
- package/dist/services/ai/network.js +113 -0
- package/dist/services/ai/network.js.map +1 -0
- package/dist/services/ai/settings.js +178 -0
- package/dist/services/ai/settings.js.map +1 -0
- package/dist/services/ai/subagents.js +468 -0
- package/dist/services/ai/subagents.js.map +1 -0
- package/dist/services/assistance/analysis.js +352 -0
- package/dist/services/assistance/analysis.js.map +1 -0
- package/dist/services/assistance/contracts.js +54 -0
- package/dist/services/assistance/contracts.js.map +1 -0
- package/dist/services/assistance/verification.js +274 -0
- package/dist/services/assistance/verification.js.map +1 -0
- package/dist/services/brain/brainParser.js +97 -0
- package/dist/services/brain/brainParser.js.map +1 -0
- package/dist/services/brain/brainService.js +733 -0
- package/dist/services/brain/brainService.js.map +1 -0
- package/dist/services/brain/brainWorker.js +212 -0
- package/dist/services/brain/brainWorker.js.map +1 -0
- package/dist/services/brain/contracts.js +154 -0
- package/dist/services/brain/contracts.js.map +1 -0
- package/dist/services/brain/protocol.js +2 -0
- package/dist/services/brain/protocol.js.map +1 -0
- package/dist/services/changes/applier.js +544 -0
- package/dist/services/changes/applier.js.map +1 -0
- package/dist/services/changes/contentBudget.js +11 -0
- package/dist/services/changes/contentBudget.js.map +1 -0
- package/dist/services/changes/planner.js +284 -0
- package/dist/services/changes/planner.js.map +1 -0
- package/dist/services/changes/types.js +3 -0
- package/dist/services/changes/types.js.map +1 -0
- package/dist/services/context/contextEngine.js +746 -0
- package/dist/services/context/contextEngine.js.map +1 -0
- package/dist/services/context/contracts.js +88 -0
- package/dist/services/context/contracts.js.map +1 -0
- package/dist/services/desktop/desktopPolicy.js +76 -0
- package/dist/services/desktop/desktopPolicy.js.map +1 -0
- package/dist/services/desktop/desktopService.js +130 -0
- package/dist/services/desktop/desktopService.js.map +1 -0
- package/dist/services/desktop/nativeBackend.js +174 -0
- package/dist/services/desktop/nativeBackend.js.map +1 -0
- package/dist/services/desktop/protocol.js +32 -0
- package/dist/services/desktop/protocol.js.map +1 -0
- package/dist/services/files/readService.js +136 -0
- package/dist/services/files/readService.js.map +1 -0
- package/dist/services/git/gitService.js +369 -0
- package/dist/services/git/gitService.js.map +1 -0
- package/dist/services/intelligence/intelService.js +136 -0
- package/dist/services/intelligence/intelService.js.map +1 -0
- package/dist/services/intelligence/protocol.js +2 -0
- package/dist/services/intelligence/protocol.js.map +1 -0
- package/dist/services/intelligence/tsWorker.js +419 -0
- package/dist/services/intelligence/tsWorker.js.map +1 -0
- package/dist/services/jobs/commandInput.js +34 -0
- package/dist/services/jobs/commandInput.js.map +1 -0
- package/dist/services/jobs/jobManager.js +398 -0
- package/dist/services/jobs/jobManager.js.map +1 -0
- package/dist/services/jobs/sandbox.js +156 -0
- package/dist/services/jobs/sandbox.js.map +1 -0
- package/dist/services/jobs/sandboxWiring.js +37 -0
- package/dist/services/jobs/sandboxWiring.js.map +1 -0
- package/dist/services/jobs/spool.js +112 -0
- package/dist/services/jobs/spool.js.map +1 -0
- package/dist/services/jobs/windowsSandboxChild.js +24 -0
- package/dist/services/jobs/windowsSandboxChild.js.map +1 -0
- package/dist/services/jobs/windowsSandboxWorker.js +155 -0
- package/dist/services/jobs/windowsSandboxWorker.js.map +1 -0
- package/dist/services/lsp/documentUri.js +16 -0
- package/dist/services/lsp/documentUri.js.map +1 -0
- package/dist/services/lsp/jsonrpc.js +382 -0
- package/dist/services/lsp/jsonrpc.js.map +1 -0
- package/dist/services/lsp/lspService.js +1051 -0
- package/dist/services/lsp/lspService.js.map +1 -0
- package/dist/services/memory/contracts.js +94 -0
- package/dist/services/memory/contracts.js.map +1 -0
- package/dist/services/memory/memoryService.js +683 -0
- package/dist/services/memory/memoryService.js.map +1 -0
- package/dist/services/multimodal/browserService.js +407 -0
- package/dist/services/multimodal/browserService.js.map +1 -0
- package/dist/services/multimodal/byteRange.js +31 -0
- package/dist/services/multimodal/byteRange.js.map +1 -0
- package/dist/services/multimodal/contracts.js +59 -0
- package/dist/services/multimodal/contracts.js.map +1 -0
- package/dist/services/multimodal/gameService.js +95 -0
- package/dist/services/multimodal/gameService.js.map +1 -0
- package/dist/services/multimodal/images.js +107 -0
- package/dist/services/multimodal/images.js.map +1 -0
- package/dist/services/multimodal/mediaService.js +279 -0
- package/dist/services/multimodal/mediaService.js.map +1 -0
- package/dist/services/multimodal/mediaWorker.js +143 -0
- package/dist/services/multimodal/mediaWorker.js.map +1 -0
- package/dist/services/multimodal/multimodalService.js +51 -0
- package/dist/services/multimodal/multimodalService.js.map +1 -0
- package/dist/services/multimodal/network.js +69 -0
- package/dist/services/multimodal/network.js.map +1 -0
- package/dist/services/multimodal/operations.js +40 -0
- package/dist/services/multimodal/operations.js.map +1 -0
- package/dist/services/multimodal/storage.js +160 -0
- package/dist/services/multimodal/storage.js.map +1 -0
- package/dist/services/multimodal/workflowService.js +179 -0
- package/dist/services/multimodal/workflowService.js.map +1 -0
- package/dist/services/overview.js +284 -0
- package/dist/services/overview.js.map +1 -0
- package/dist/services/resources/casStore.js +304 -0
- package/dist/services/resources/casStore.js.map +1 -0
- package/dist/services/resources/contracts.js +75 -0
- package/dist/services/resources/contracts.js.map +1 -0
- package/dist/services/resources/mime.js +77 -0
- package/dist/services/resources/mime.js.map +1 -0
- package/dist/services/resources/providerRegistry.js +22 -0
- package/dist/services/resources/providerRegistry.js.map +1 -0
- package/dist/services/resources/providers.js +120 -0
- package/dist/services/resources/providers.js.map +1 -0
- package/dist/services/resources/resourceService.js +282 -0
- package/dist/services/resources/resourceService.js.map +1 -0
- package/dist/services/runtime/contracts.js +65 -0
- package/dist/services/runtime/contracts.js.map +1 -0
- package/dist/services/runtime/runtimeService.js +364 -0
- package/dist/services/runtime/runtimeService.js.map +1 -0
- package/dist/services/schedules/scheduleService.js +198 -0
- package/dist/services/schedules/scheduleService.js.map +1 -0
- package/dist/services/search/searchService.js +434 -0
- package/dist/services/search/searchService.js.map +1 -0
- package/dist/services/search/searchWorker.js +58 -0
- package/dist/services/search/searchWorker.js.map +1 -0
- package/dist/setup/componentProbes.js +259 -0
- package/dist/setup/componentProbes.js.map +1 -0
- package/dist/setup/download.js +139 -0
- package/dist/setup/download.js.map +1 -0
- package/dist/setup/managedTools.js +118 -0
- package/dist/setup/managedTools.js.map +1 -0
- package/dist/setup/sandboxProbe.js +172 -0
- package/dist/setup/sandboxProbe.js.map +1 -0
- package/dist/setup/setup.js +522 -0
- package/dist/setup/setup.js.map +1 -0
- package/dist/setup/windowsChromiumAcl.js +56 -0
- package/dist/setup/windowsChromiumAcl.js.map +1 -0
- package/dist/setup/windowsSandboxInstall.js +94 -0
- package/dist/setup/windowsSandboxInstall.js.map +1 -0
- package/dist/setup/windowsSpeechInstall.js +86 -0
- package/dist/setup/windowsSpeechInstall.js.map +1 -0
- package/dist/store/db.js +711 -0
- package/dist/store/db.js.map +1 -0
- package/dist/store/scopeEncoding.js +15 -0
- package/dist/store/scopeEncoding.js.map +1 -0
- package/dist/store/store.js +467 -0
- package/dist/store/store.js.map +1 -0
- package/dist/tools/agentRuntimeTools.js +216 -0
- package/dist/tools/agentRuntimeTools.js.map +1 -0
- package/dist/tools/agentTools.js +317 -0
- package/dist/tools/agentTools.js.map +1 -0
- package/dist/tools/assistanceTools.js +126 -0
- package/dist/tools/assistanceTools.js.map +1 -0
- package/dist/tools/brainTools.js +130 -0
- package/dist/tools/brainTools.js.map +1 -0
- package/dist/tools/catalog.js +30 -0
- package/dist/tools/catalog.js.map +1 -0
- package/dist/tools/changeTools.js +188 -0
- package/dist/tools/changeTools.js.map +1 -0
- package/dist/tools/context.js +243 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/contextTools.js +57 -0
- package/dist/tools/contextTools.js.map +1 -0
- package/dist/tools/coreCatalog.js +82 -0
- package/dist/tools/coreCatalog.js.map +1 -0
- package/dist/tools/desktopTools.js +41 -0
- package/dist/tools/desktopTools.js.map +1 -0
- package/dist/tools/directTools.js +273 -0
- package/dist/tools/directTools.js.map +1 -0
- package/dist/tools/envelope.js +71 -0
- package/dist/tools/envelope.js.map +1 -0
- package/dist/tools/extraTools.js +298 -0
- package/dist/tools/extraTools.js.map +1 -0
- package/dist/tools/gitTools.js +93 -0
- package/dist/tools/gitTools.js.map +1 -0
- package/dist/tools/jobTools.js +454 -0
- package/dist/tools/jobTools.js.map +1 -0
- package/dist/tools/memoryTools.js +102 -0
- package/dist/tools/memoryTools.js.map +1 -0
- package/dist/tools/metaTools.js +153 -0
- package/dist/tools/metaTools.js.map +1 -0
- package/dist/tools/multimodalTools.js +262 -0
- package/dist/tools/multimodalTools.js.map +1 -0
- package/dist/tools/projectTools.js +261 -0
- package/dist/tools/projectTools.js.map +1 -0
- package/dist/tools/resourceTools.js +81 -0
- package/dist/tools/resourceTools.js.map +1 -0
- package/dist/tools/runtimeTools.js +137 -0
- package/dist/tools/runtimeTools.js.map +1 -0
- package/dist/tools/scheduleTools.js +10 -0
- package/dist/tools/scheduleTools.js.map +1 -0
- package/dist/tools/semanticTools.js +141 -0
- package/dist/tools/semanticTools.js.map +1 -0
- package/dist/tools/subagentTools.js +32 -0
- package/dist/tools/subagentTools.js.map +1 -0
- package/dist/tools/surface.js +644 -0
- package/dist/tools/surface.js.map +1 -0
- package/dist/tunnel/control.js +113 -0
- package/dist/tunnel/control.js.map +1 -0
- package/dist/tunnel/credentials.js +392 -0
- package/dist/tunnel/credentials.js.map +1 -0
- package/dist/tunnel/log.js +84 -0
- package/dist/tunnel/log.js.map +1 -0
- package/dist/tunnel/runtime.js +55 -0
- package/dist/tunnel/runtime.js.map +1 -0
- package/dist/tunnel/supervisor.js +280 -0
- package/dist/tunnel/supervisor.js.map +1 -0
- package/dist/util/bytes.js +53 -0
- package/dist/util/bytes.js.map +1 -0
- package/dist/util/hash.js +53 -0
- package/dist/util/hash.js.map +1 -0
- package/dist/workspace/fs.js +305 -0
- package/dist/workspace/fs.js.map +1 -0
- package/dist/workspace/identity.js +17 -0
- package/dist/workspace/identity.js.map +1 -0
- package/dist/workspace/ignores.js +173 -0
- package/dist/workspace/ignores.js.map +1 -0
- package/dist/workspace/root.js +59 -0
- package/dist/workspace/root.js.map +1 -0
- package/docs/AGENT_RUNTIME.md +154 -0
- package/docs/AI_PROVIDERS.md +110 -0
- package/docs/ARCHITECTURE.md +331 -0
- package/docs/ASSISTANCE.md +31 -0
- package/docs/AUTH.md +59 -0
- package/docs/BRAIN.md +92 -0
- package/docs/COMPATIBILITY.md +92 -0
- package/docs/CONFIRMATION.md +13 -0
- package/docs/CONTEXT.md +87 -0
- package/docs/DESKTOP.md +35 -0
- package/docs/EVALUATION.md +86 -0
- package/docs/LARGE_INPUTS.md +21 -0
- package/docs/LSP.md +21 -0
- package/docs/MANUAL_ACCEPTANCE.md +283 -0
- package/docs/MEMORY.md +128 -0
- package/docs/MULTIMODAL.md +32 -0
- package/docs/PROJECTS.md +146 -0
- package/docs/RELEASE_1.0.0.md +111 -0
- package/docs/RELEASE_NOTES.md +92 -0
- package/docs/RESOURCES.md +83 -0
- package/docs/RUNTIME.md +125 -0
- package/docs/SCHEDULES.md +23 -0
- package/docs/SECURITY.md +250 -0
- package/docs/TEST_REPORT.md +312 -0
- package/docs/TUNNEL.md +86 -0
- package/docs/WEB_CLIENTS.md +43 -0
- package/docs/WINDOWS.md +79 -0
- package/docs/adr/001-one-process-one-workspace.md +22 -0
- package/docs/adr/002-external-tunnel.md +19 -0
- package/docs/adr/003-sdk-v2-legacy-stateless.md +20 -0
- package/docs/adr/004-embedded-oauth-provider.md +19 -0
- package/docs/adr/005-static-client-baseline.md +19 -0
- package/docs/adr/006-guarded-fs-explicit-exec.md +16 -0
- package/docs/adr/007-preview-hash-journal.md +18 -0
- package/docs/adr/008-ts-js-semantics-first.md +17 -0
- package/docs/adr/009-jobs-polling.md +18 -0
- package/docs/adr/010-sqlite-better-sqlite3.md +18 -0
- package/docs/adr/011-env-example-secure-default.md +19 -0
- package/docs/adr/012-workspace-scope-grant.md +24 -0
- package/docs/adr/013-loopback-proxy-trust.md +18 -0
- package/docs/adr/014-direct-coding-tier.md +48 -0
- package/docs/adr/015-coding-agent-parity.md +56 -0
- package/docs/adr/016-oidc-openid-consent.md +15 -0
- package/docs/adr/017-installation-identity-local-config.md +44 -0
- package/docs/adr/018-access-scope-encoding.md +11 -0
- package/docs/adr/019-runtime-workspace-switch.md +59 -0
- package/docs/adr/020-desktop-access.md +50 -0
- package/docs/adr/021-persistent-desktop-consent.md +39 -0
- package/docs/adr/022-owner-kill-preserves-login.md +30 -0
- package/docs/adr/023-large-coding-inputs.md +49 -0
- package/docs/adr/024-usage-rounds-and-schedules.md +72 -0
- package/docs/adr/025-owner-chat-whitelist.md +53 -0
- package/docs/adr/026-remove-conversation-confirmation.md +35 -0
- package/docs/adr/027-workspace-client-list.md +20 -0
- package/docs/adr/028-owner-client-deletion.md +25 -0
- package/docs/adr/029-compact-tool-surface.md +121 -0
- package/docs/adr/030-windows-native-candidate.md +71 -0
- package/docs/adr/031-owner-selected-tunnel-supervision.md +13 -0
- package/docs/adr/032-owner-project-registry.md +43 -0
- package/docs/adr/033-read-only-project-federation.md +61 -0
- package/docs/adr/034-universal-resource-cas.md +60 -0
- package/docs/adr/035-project-brain-incremental-index.md +51 -0
- package/docs/adr/036-context-engine-evidence.md +53 -0
- package/docs/adr/037-owner-reviewed-memory.md +46 -0
- package/docs/adr/038-runtime-intelligence.md +46 -0
- package/docs/adr/039-advanced-agent-runtime.md +57 -0
- package/docs/adr/040-dodobench-release-gate.md +43 -0
- package/docs/adr/041-local-macos-docker-linux-gates.md +32 -0
- package/docs/adr/042-project-directory-generation-identity.md +36 -0
- package/docs/adr/043-trusted-self-hosted-platform-gates.md +38 -0
- package/docs/adr/044-global-launcher-and-cli-menu.md +43 -0
- package/docs/adr/045-ai-providers-multiproject.md +56 -0
- package/docs/adr/046-personal-access-mode.md +32 -0
- package/docs/adr/README.md +64 -0
- package/examples/.dodo.json.example +20 -0
- package/examples/cloudflared.yml +23 -0
- package/examples/reverse-proxy-fixture.mjs +37 -0
- package/native/desktop-linux.py +387 -0
- package/native/desktop-windows.cs +180 -0
- package/native/desktop.swift +212 -0
- package/package.json +145 -0
- package/schemas/global-config.schema.json +497 -0
- package/schemas/project-config.schema.json +75 -0
- package/schemas/tools.compact.json +3236 -0
- package/schemas/tools.hybrid.json +8194 -0
- package/schemas/tools.json +34518 -0
- package/scripts/guard-publish.mjs +12 -0
- package/scripts/setup-multimodal.mjs +70 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { defineTool } from './context.js';
|
|
3
|
+
import { DodoError } from '../errors.js';
|
|
4
|
+
import { HashSchema, ContextSchema, ImpactSchema, SymbolSchema, RefactorSchema, OutlineSchema, RecipeSchema } from '../services/assistance/contracts.js';
|
|
5
|
+
import { verifyChanges, VerificationSchema } from '../services/assistance/verification.js';
|
|
6
|
+
const Path = z.string().min(1).max(1024);
|
|
7
|
+
const Symbol = z.string().min(1).max(256);
|
|
8
|
+
const readAnnotations = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false };
|
|
9
|
+
const PreviewSchema = z.object({
|
|
10
|
+
planId: z.string(), planHash: z.string(), expiresAt: z.number(), summary: z.string(),
|
|
11
|
+
risk: z.enum(['low', 'medium', 'high']), requiresApproval: z.boolean(),
|
|
12
|
+
files: z.array(z.object({ path: z.string(), destPath: z.string().optional(), action: z.enum(['create', 'modify', 'delete', 'move']),
|
|
13
|
+
beforeHash: z.string().nullable(), afterHash: z.string().nullable(), diff: z.string(), diffTruncated: z.boolean(), bytesBefore: z.number(), bytesAfter: z.number() })),
|
|
14
|
+
symbol: OutlineSchema, operation: z.literal('replace_body'), notes: z.array(z.string()),
|
|
15
|
+
});
|
|
16
|
+
function budget(ctx, requested) { return Math.min(requested, ctx.services.limits.toolContentBytes - 4096); }
|
|
17
|
+
function assertFiles(ctx, files, allowMissing = false) {
|
|
18
|
+
for (const file of files) {
|
|
19
|
+
const resolved = ctx.services.wfs.resolve(file, { allowMissing });
|
|
20
|
+
if (resolved.stat)
|
|
21
|
+
ctx.services.wfs.assertRegularFileForDirectAccess(resolved);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export const contextForTaskTool = defineTool({
|
|
25
|
+
name: 'context_for_task', title: 'Context for a coding task',
|
|
26
|
+
description: 'Collect ranked source, tests, docs, declarations and static TS/JS dependencies for a goal in one bounded read. Supply identifier/error terms (including English terms for a Thai goal) and optional seed files. Returns paths, line citations and file hashes. No model calls, execution, embeddings or permission changes; content is untrusted. Scan is bounded and omissions are reported.',
|
|
27
|
+
input: { goal: z.string().min(1).max(1000), terms: z.array(z.string().min(1).max(128)).max(12).default([]),
|
|
28
|
+
files: z.array(Path).max(10).default([]), maxFiles: z.number().int().min(1).max(12).default(6),
|
|
29
|
+
maxBytes: z.number().int().min(4096).max(32768).default(16000) },
|
|
30
|
+
output: ContextSchema.extend({ tasks: z.array(RecipeSchema) }), annotations: readAnnotations, requiredScope: 'dodo:read', action: 'read',
|
|
31
|
+
handler: async (args, ctx) => {
|
|
32
|
+
assertFiles(ctx, args.files);
|
|
33
|
+
const limit = budget(ctx, args.maxBytes);
|
|
34
|
+
const data = ContextSchema.parse(await ctx.services.intel.assist({ op: 'assist_context', ...args, maxBytes: Math.max(2048, limit - 1500) }));
|
|
35
|
+
const tasks = ctx.services.overview.discoverTasks(ctx.services.projectConfig).filter(t => /(?:test|lint|typecheck|build|check|vet|clippy)/.test(t.id)).slice(0, 6)
|
|
36
|
+
.map(t => ({ taskId: t.id, recipeDigest: t.recipeDigest, title: t.title }));
|
|
37
|
+
while (tasks.length && Buffer.byteLength(JSON.stringify({ ...data, tasks }), 'utf8') > limit) {
|
|
38
|
+
tasks.pop();
|
|
39
|
+
data.truncated = true;
|
|
40
|
+
}
|
|
41
|
+
return { data: { ...data, tasks }, truncated: data.truncated };
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
export const analyzeImpactTool = defineTool({
|
|
45
|
+
name: 'analyze_impact', title: 'Analyze static change impact',
|
|
46
|
+
description: 'Before editing, find direct/transitive TS/JS import and re-export dependents of workspace files, with evidence lines, hashes and related test paths. Uses the bundled TypeScript parser/resolver, not grep. Missing targets, dynamic loading, external dependencies and scan limits are explicit. This is conservative file-level impact, not a runtime call graph or a reason to skip the full relevant test gate. Read-only.',
|
|
47
|
+
input: { files: z.array(Path).min(1).max(10), maxResults: z.number().int().min(1).max(100).default(40), maxDepth: z.number().int().min(1).max(10).default(5) },
|
|
48
|
+
output: ImpactSchema, annotations: readAnnotations, requiredScope: 'dodo:read', action: 'read',
|
|
49
|
+
handler: async (args, ctx) => {
|
|
50
|
+
assertFiles(ctx, args.files, true);
|
|
51
|
+
const data = ImpactSchema.parse(await ctx.services.intel.assist({ op: 'assist_impact', ...args }));
|
|
52
|
+
while (data.impacted.length && Buffer.byteLength(JSON.stringify(data), 'utf8') > budget(ctx, 32768)) {
|
|
53
|
+
data.impacted.pop();
|
|
54
|
+
data.truncated = true;
|
|
55
|
+
data.relatedTests = data.relatedTests.filter(p => data.impacted.some(i => i.path === p) || args.files.includes(p));
|
|
56
|
+
}
|
|
57
|
+
if (Buffer.byteLength(JSON.stringify(data), 'utf8') > budget(ctx, 32768))
|
|
58
|
+
throw new DodoError('RESOURCE_LIMIT', 'impact metadata exceeds output budget; request fewer targets');
|
|
59
|
+
return { data, truncated: data.truncated };
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
export const readSymbolTool = defineTool({
|
|
63
|
+
name: 'read_symbol', title: 'Read one function, class or method',
|
|
64
|
+
description: 'Read the exact TS/JS AST declaration of a named function/class/method/variable, with file hash and line range. Use a qualified name such as Class.method and optionally a line to disambiguate overloads/nesting. Large content is explicitly truncated. Only block-bodied functions/methods can currently be edited through preview_refactor. No execution.',
|
|
65
|
+
input: { file: Path, symbol: Symbol, line: z.number().int().positive().optional(), maxBytes: z.number().int().min(1024).max(32768).default(12000) },
|
|
66
|
+
output: SymbolSchema, annotations: readAnnotations, requiredScope: 'dodo:read', action: 'read',
|
|
67
|
+
handler: async (args, ctx) => {
|
|
68
|
+
assertFiles(ctx, [args.file]);
|
|
69
|
+
const data = SymbolSchema.parse(await ctx.services.intel.assist({ op: 'assist_symbol', file: args.file, symbol: args.symbol, ...(args.line !== undefined ? { line: args.line } : {}), maxBytes: budget(ctx, args.maxBytes) }));
|
|
70
|
+
return { data, truncated: data.truncated };
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
export const previewRefactorTool = defineTool({
|
|
74
|
+
name: 'preview_refactor', title: 'Preview a symbol-body edit',
|
|
75
|
+
description: 'Preview replacement of the INTERIOR of one TS/JS function/method block body. Read read_symbol first and supply its exact file hash; ambiguous, stale, unsupported or invalid syntax is refused. body excludes outer braces. Preserves unrelated file bytes and original CRLF style. Does not apply edits or prove type/behavior correctness. Apply using existing apply_changes(planId, planHash, idempotencyKey), then verify_changes; rollback uses the existing journal.',
|
|
76
|
+
input: { file: Path, symbol: Symbol, line: z.number().int().positive().optional(), expectedHash: HashSchema,
|
|
77
|
+
operation: z.literal('replace_body').default('replace_body'), body: z.string().max(512 * 1024) },
|
|
78
|
+
output: PreviewSchema, annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false }, requiredScope: 'dodo:write', action: 'plan',
|
|
79
|
+
handler: async (args, ctx) => {
|
|
80
|
+
assertFiles(ctx, [args.file]);
|
|
81
|
+
if (Buffer.byteLength(args.body, 'utf8') > Math.min(ctx.services.limits.readFileBytes, 512 * 1024))
|
|
82
|
+
throw new DodoError('FILE_TOO_LARGE', 'replacement exceeds the active AST byte budget');
|
|
83
|
+
const data = RefactorSchema.parse(await ctx.services.intel.assist({ op: 'assist_refactor', file: args.file, symbol: args.symbol, expectedHash: args.expectedHash, body: args.body, ...(args.line !== undefined ? { line: args.line } : {}) }));
|
|
84
|
+
const s = ctx.services;
|
|
85
|
+
const preview = s.planner.preview({ ops: [{ op: 'replace_file', path: data.path, content: data.content, expectedHash: data.beforeHash }],
|
|
86
|
+
workspaceId: s.workspaceId, epoch: s.epoch, principal: ctx.principal.grantId, trustMode: ctx.trustMode, source: 'preview_changes' });
|
|
87
|
+
return { data: { ...preview, symbol: data.symbol, operation: data.operation,
|
|
88
|
+
notes: ['Syntax checked only; typecheck and behavior tests are still required.', 'Apply and rollback use the existing approval/path/hash/journal machinery.'] }, truncated: preview.files.some(f => f.diffTruncated) };
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
export const verifyChangesTool = defineTool({
|
|
92
|
+
name: 'verify_changes', title: 'Plan, run and report verification',
|
|
93
|
+
description: 'mode=plan discovers verification recipes and a guarded source digest without execution. mode=run requires explicitly selected tasks with recipeDigest, sourceDigest from the plan, and an idempotencyKey; runs them through the EXISTING exec approval/sandbox policy. mode=report takes verificationId and never reruns. Reports exits, recognized Vitest/Jest JSON or Vitest text test counts, missing checks and source drift; zero/unknown tests are not a verified test pass. Requires exec scope even for plan/report because this tool can execute. No automatic fixes, retries, installs or security changes. Poll report or existing job_* tools for running jobs.',
|
|
94
|
+
input: { mode: z.enum(['plan', 'run', 'report']).default('plan'), files: z.array(Path).max(10).default([]),
|
|
95
|
+
tasks: z.array(z.object({ taskId: z.string().min(1).max(128), recipeDigest: HashSchema }).strict()).max(4).default([]),
|
|
96
|
+
sourceDigest: HashSchema.optional(), verificationId: z.string().regex(/^verify_[a-z0-9]+$/).max(128).optional(),
|
|
97
|
+
idempotencyKey: z.string().min(8).max(128).optional(), timeoutMs: z.number().int().min(1000).max(1800000).default(300000),
|
|
98
|
+
waitMs: z.number().int().min(0).max(10000).default(1000) },
|
|
99
|
+
output: VerificationSchema, annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true }, requiredScope: 'dodo:exec', action: 'exec',
|
|
100
|
+
handler: async (args, ctx) => {
|
|
101
|
+
const data = VerificationSchema.parse(await verifyChanges(ctx, args));
|
|
102
|
+
// Keep structured and legacy output bounded, without dropping status or freshness.
|
|
103
|
+
let truncated = false;
|
|
104
|
+
const max = ctx.services.limits.toolContentBytes - 1024;
|
|
105
|
+
while (Buffer.byteLength(JSON.stringify(data), 'utf8') > max) {
|
|
106
|
+
const withFailures = data.checks.find(c => c.tests.failures.length > 0);
|
|
107
|
+
if (withFailures)
|
|
108
|
+
withFailures.tests.failures.pop();
|
|
109
|
+
else if (data.freshness.changedPaths.length) {
|
|
110
|
+
data.freshness.changedPaths.pop();
|
|
111
|
+
data.freshness.changedPathsTruncated = true;
|
|
112
|
+
}
|
|
113
|
+
else if (data.recommendedTasks.length)
|
|
114
|
+
data.recommendedTasks.pop();
|
|
115
|
+
else if (data.files.length)
|
|
116
|
+
data.files.pop();
|
|
117
|
+
else if (data.notRun.length)
|
|
118
|
+
data.notRun.pop();
|
|
119
|
+
else
|
|
120
|
+
break;
|
|
121
|
+
truncated = true;
|
|
122
|
+
}
|
|
123
|
+
return { data, truncated };
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
//# sourceMappingURL=assistanceTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assistanceTools.js","sourceRoot":"","sources":["../../src/tools/assistanceTools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { DodoError } from '../errors.js';
|
|
3
|
+
import { BRAIN_QUERY_MAX, BrainControlResult, BrainEdgeType, BrainNode, BrainNodeType, BrainQueryResult, BrainStatus, } from '../services/brain/contracts.js';
|
|
4
|
+
import { liveAccess } from '../services/multimodal/storage.js';
|
|
5
|
+
import { defineTool, policyGate } from './context.js';
|
|
6
|
+
const read = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false };
|
|
7
|
+
const control = { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false };
|
|
8
|
+
function use(ctx) {
|
|
9
|
+
const brain = ctx.services.brain;
|
|
10
|
+
if (!brain)
|
|
11
|
+
throw new DodoError('NOT_SUPPORTED', 'Project Brain is unavailable in this running build');
|
|
12
|
+
return brain;
|
|
13
|
+
}
|
|
14
|
+
const brainStatusTool = defineTool({
|
|
15
|
+
name: 'brain_status',
|
|
16
|
+
title: 'Inspect Project Brain status',
|
|
17
|
+
description: 'Return bounded Project Brain freshness, parser/schema versions, latest run state and graph counts for the active workspace. Cached index rows are evidence only and never grant source access.',
|
|
18
|
+
input: {},
|
|
19
|
+
output: BrainStatus,
|
|
20
|
+
requiredScope: 'dodo:read',
|
|
21
|
+
action: 'read',
|
|
22
|
+
annotations: read,
|
|
23
|
+
handler: async (_args, ctx) => { liveAccess(ctx, 'dodo:read'); return { data: use(ctx).status() }; },
|
|
24
|
+
});
|
|
25
|
+
const brainQueryTool = defineTool({
|
|
26
|
+
name: 'brain_query',
|
|
27
|
+
title: 'Query project structure',
|
|
28
|
+
description: 'Query bounded files, symbols, routes, tests, dependencies and relationship edges from the active Project Brain. Every returned row is re-authorized and checked against the current guarded source SHA-256; stale rows are omitted by default.',
|
|
29
|
+
input: {
|
|
30
|
+
query: z.string().min(1).max(256).optional(),
|
|
31
|
+
path: z.string().min(1).max(1024).optional(),
|
|
32
|
+
nodeTypes: z.array(BrainNodeType).min(1).max(5).optional(),
|
|
33
|
+
edgeTypes: z.array(BrainEdgeType).min(1).max(6).optional(),
|
|
34
|
+
includeStale: z.boolean().default(false),
|
|
35
|
+
limit: z.number().int().min(1).max(BRAIN_QUERY_MAX).default(50),
|
|
36
|
+
cursor: z.string().max(2048).optional(),
|
|
37
|
+
},
|
|
38
|
+
output: BrainQueryResult,
|
|
39
|
+
requiredScope: 'dodo:read',
|
|
40
|
+
action: 'read',
|
|
41
|
+
annotations: read,
|
|
42
|
+
handler: async (args, ctx) => {
|
|
43
|
+
const input = {
|
|
44
|
+
includeStale: args.includeStale,
|
|
45
|
+
limit: args.limit,
|
|
46
|
+
...(args.query !== undefined ? { query: args.query } : {}),
|
|
47
|
+
...(args.path !== undefined ? { path: args.path } : {}),
|
|
48
|
+
...(args.nodeTypes !== undefined ? { nodeTypes: args.nodeTypes } : {}),
|
|
49
|
+
...(args.edgeTypes !== undefined ? { edgeTypes: args.edgeTypes } : {}),
|
|
50
|
+
...(args.cursor !== undefined ? { cursor: args.cursor } : {}),
|
|
51
|
+
};
|
|
52
|
+
const result = await use(ctx).query(ctx, input);
|
|
53
|
+
return { data: result.data, truncated: result.truncated, nextCursor: result.nextCursor };
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
const brainSymbolTool = defineTool({
|
|
57
|
+
name: 'brain_symbol',
|
|
58
|
+
title: 'Resolve a stable Project Brain symbol',
|
|
59
|
+
description: 'Resolve one symbol:// project entity URI. The stable identity survives an exact-content file move, while the result reports the current path and source freshness.',
|
|
60
|
+
input: { uri: z.string().min(1).max(1024).regex(/^symbol:\/\//) },
|
|
61
|
+
output: BrainNode,
|
|
62
|
+
requiredScope: 'dodo:read',
|
|
63
|
+
action: 'read',
|
|
64
|
+
annotations: read,
|
|
65
|
+
handler: async (args, ctx) => ({ data: await use(ctx).symbol(ctx, args.uri) }),
|
|
66
|
+
});
|
|
67
|
+
const brainRebuildTool = defineTool({
|
|
68
|
+
name: 'brain_rebuild',
|
|
69
|
+
title: 'Rebuild Project Brain',
|
|
70
|
+
description: 'Start one bounded incremental or full Project Brain rebuild. Repository code, plugins and scripts are never executed. This owner-controlled maintenance action retains the active trust/approval policy.',
|
|
71
|
+
input: {
|
|
72
|
+
mode: z.enum(['incremental', 'full']).default('incremental'),
|
|
73
|
+
waitMs: z.number().int().min(0).max(10_000).default(0),
|
|
74
|
+
},
|
|
75
|
+
output: BrainControlResult,
|
|
76
|
+
requiredScope: 'dodo:exec',
|
|
77
|
+
action: 'exec',
|
|
78
|
+
annotations: control,
|
|
79
|
+
handler: async (args, ctx) => {
|
|
80
|
+
liveAccess(ctx, 'dodo:exec');
|
|
81
|
+
policyGate(ctx, { tool: 'brain_rebuild', action: 'exec', approvalAction: { mode: args.mode }, summary: `rebuild the active Project Brain (${args.mode})` });
|
|
82
|
+
const brain = use(ctx);
|
|
83
|
+
const started = await brain.start(args.mode);
|
|
84
|
+
const status = args.waitMs > 0 ? await brain.wait(started.runId, args.waitMs) : brain.status();
|
|
85
|
+
return { data: { runId: started.runId, changed: started.changed, status } };
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
const brainPauseTool = defineTool({
|
|
89
|
+
name: 'brain_pause',
|
|
90
|
+
title: 'Pause or resume Project Brain refresh',
|
|
91
|
+
description: 'Pause or resume automatic indexing for the active workspace. Pausing cancels an in-progress uncommitted index transaction; it never changes source files or permissions.',
|
|
92
|
+
input: { paused: z.boolean().default(true) },
|
|
93
|
+
output: BrainControlResult,
|
|
94
|
+
requiredScope: 'dodo:exec',
|
|
95
|
+
action: 'exec',
|
|
96
|
+
annotations: control,
|
|
97
|
+
handler: async (args, ctx) => {
|
|
98
|
+
liveAccess(ctx, 'dodo:exec');
|
|
99
|
+
policyGate(ctx, { tool: 'brain_pause', action: 'exec', approvalAction: { paused: args.paused }, summary: `${args.paused ? 'pause' : 'resume'} automatic Project Brain indexing` });
|
|
100
|
+
const brain = use(ctx);
|
|
101
|
+
const result = await brain.pause(args.paused);
|
|
102
|
+
return { data: { runId: null, changed: result.changed, status: brain.status() } };
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
const brainCancelTool = defineTool({
|
|
106
|
+
name: 'brain_cancel',
|
|
107
|
+
title: 'Cancel a Project Brain rebuild',
|
|
108
|
+
description: 'Cancel the active Project Brain parser run before commit. Existing committed index data stays available and source files are never modified.',
|
|
109
|
+
input: { runId: z.string().min(1).max(128).optional() },
|
|
110
|
+
output: BrainControlResult,
|
|
111
|
+
requiredScope: 'dodo:exec',
|
|
112
|
+
action: 'exec',
|
|
113
|
+
annotations: control,
|
|
114
|
+
handler: async (args, ctx) => {
|
|
115
|
+
liveAccess(ctx, 'dodo:exec');
|
|
116
|
+
policyGate(ctx, { tool: 'brain_cancel', action: 'exec', approvalAction: { runId: args.runId ?? null }, summary: 'cancel the active Project Brain rebuild' });
|
|
117
|
+
const brain = use(ctx);
|
|
118
|
+
const result = await brain.cancel(args.runId);
|
|
119
|
+
return { data: { runId: args.runId ?? null, changed: result.changed, status: brain.status() } };
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
export const BRAIN_TOOLS = [
|
|
123
|
+
brainStatusTool,
|
|
124
|
+
brainQueryTool,
|
|
125
|
+
brainSymbolTool,
|
|
126
|
+
brainRebuildTool,
|
|
127
|
+
brainPauseTool,
|
|
128
|
+
brainCancelTool,
|
|
129
|
+
];
|
|
130
|
+
//# sourceMappingURL=brainTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brainTools.js","sourceRoot":"","sources":["../../src/tools/brainTools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { SUBAGENT_TOOLS } from './subagentTools.js';
|
|
2
|
+
import { registerTool } from './context.js';
|
|
3
|
+
import { CORE_TOOL_CATALOG } from './coreCatalog.js';
|
|
4
|
+
import { AGENT_RUNTIME_TOOLS } from './agentRuntimeTools.js';
|
|
5
|
+
/**
|
|
6
|
+
* The tool catalog in a FIXED, stable order. Every listed tool is fully
|
|
7
|
+
* implemented; nothing here is a stub, and no roadmap tool is registered.
|
|
8
|
+
*
|
|
9
|
+
* Tiers share one policy and one journal:
|
|
10
|
+
* - understand: overview / list / read / search / glob / images / instructions
|
|
11
|
+
* - direct edits: write / edit / patch / bulk replace / delete / move / mkdir
|
|
12
|
+
* - semantics: TS/JS built in, other languages via owner-registered LSP
|
|
13
|
+
* - reviewed changes: preview_* → apply_changes → rollback
|
|
14
|
+
* - git: status / diff / log / commit
|
|
15
|
+
* - run: run_command(s) (shell, parallel, background, sandbox) + job_* polling,
|
|
16
|
+
* run_task recipes, exec_command (argv)
|
|
17
|
+
* - agent workflow: todo, environment, fetch_url, diagnostics, handoff
|
|
18
|
+
*/
|
|
19
|
+
export const TOOL_CATALOG = [
|
|
20
|
+
...CORE_TOOL_CATALOG,
|
|
21
|
+
// Durable plan/hypothesis/lock/snapshot/skill coordination. Existing 104 names stay an exact prefix.
|
|
22
|
+
...AGENT_RUNTIME_TOOLS,
|
|
23
|
+
...SUBAGENT_TOOLS,
|
|
24
|
+
];
|
|
25
|
+
export function registerCatalog(server, services) {
|
|
26
|
+
for (const def of TOOL_CATALOG) {
|
|
27
|
+
registerTool(server, services, def);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/tools/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAqC,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,GAAG,iBAAiB;IACpB,qGAAqG;IACrG,GAAG,mBAAmB;IACtB,GAAG,cAAc;CAClB,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,QAAqB;IACtE,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { MAX_FILE_BYTES } from '../config/limits.js';
|
|
3
|
+
import { policyGate, defineTool } from './context.js';
|
|
4
|
+
import { DodoError } from '../errors.js';
|
|
5
|
+
import { digestOf } from '../util/hash.js';
|
|
6
|
+
const looseData = z.looseObject({});
|
|
7
|
+
const OperationSchema = z.discriminatedUnion('op', [
|
|
8
|
+
z
|
|
9
|
+
.object({
|
|
10
|
+
op: z.literal('create'),
|
|
11
|
+
path: z.string().max(1024),
|
|
12
|
+
content: z.string().max(MAX_FILE_BYTES),
|
|
13
|
+
createParents: z.boolean().default(false),
|
|
14
|
+
})
|
|
15
|
+
.strict(),
|
|
16
|
+
z
|
|
17
|
+
.object({
|
|
18
|
+
op: z.literal('replace_file'),
|
|
19
|
+
path: z.string().max(1024),
|
|
20
|
+
content: z.string().max(MAX_FILE_BYTES),
|
|
21
|
+
expectedHash: z.string().max(128).optional(),
|
|
22
|
+
})
|
|
23
|
+
.strict(),
|
|
24
|
+
z
|
|
25
|
+
.object({
|
|
26
|
+
op: z.literal('replace_exact'),
|
|
27
|
+
path: z.string().max(1024),
|
|
28
|
+
find: z.string().min(1).max(MAX_FILE_BYTES),
|
|
29
|
+
replace: z.string().max(MAX_FILE_BYTES),
|
|
30
|
+
expectedCount: z.number().int().min(1).max(1000).default(1),
|
|
31
|
+
expectedHash: z.string().max(128).optional(),
|
|
32
|
+
})
|
|
33
|
+
.strict(),
|
|
34
|
+
z.object({ op: z.literal('delete'), path: z.string().max(1024), expectedHash: z.string().max(128).optional() }).strict(),
|
|
35
|
+
z
|
|
36
|
+
.object({
|
|
37
|
+
op: z.literal('move'),
|
|
38
|
+
path: z.string().max(1024),
|
|
39
|
+
destPath: z.string().max(1024),
|
|
40
|
+
expectedHash: z.string().max(128).optional(),
|
|
41
|
+
})
|
|
42
|
+
.strict(),
|
|
43
|
+
]);
|
|
44
|
+
export const previewChangesTool = defineTool({
|
|
45
|
+
name: 'preview_changes',
|
|
46
|
+
title: 'Preview changes',
|
|
47
|
+
description: 'Validate a batch of file operations (create / replace_file / replace_exact / delete / move) and produce an IMMUTABLE plan with per-file diffs, raw-byte before/after SHA-256 hashes, risk and expiry. The workspace is NOT modified. replace_exact requires the target text to occur exactly expectedCount times (default 1) — mismatches fail with AMBIGUOUS_EDIT instead of fuzzy-editing. Apply with apply_changes(planId, planHash, idempotencyKey).',
|
|
48
|
+
input: {
|
|
49
|
+
operations: z.array(OperationSchema).min(1).max(50),
|
|
50
|
+
},
|
|
51
|
+
output: looseData,
|
|
52
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
|
|
53
|
+
requiredScope: 'dodo:write',
|
|
54
|
+
action: 'plan',
|
|
55
|
+
handler: async (args, ctx) => {
|
|
56
|
+
const preview = ctx.services.planner.preview({
|
|
57
|
+
ops: args.operations,
|
|
58
|
+
workspaceId: ctx.services.workspaceId,
|
|
59
|
+
epoch: ctx.services.epoch,
|
|
60
|
+
principal: ctx.principal.grantId,
|
|
61
|
+
trustMode: ctx.trustMode,
|
|
62
|
+
source: 'preview_changes',
|
|
63
|
+
});
|
|
64
|
+
return { data: preview };
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
const IdempotencyKey = z.string().min(8).max(128).describe('Client-generated key; reuse the SAME key when retrying this exact call');
|
|
68
|
+
/**
|
|
69
|
+
* Durable idempotency wrapper (spec §12.3): reserve → side effect → receipt.
|
|
70
|
+
* Same key + same payload replays the stored receipt; same key + different
|
|
71
|
+
* payload is IDEMPOTENCY_CONFLICT; a reservation without a receipt reports an
|
|
72
|
+
* uncertain in-progress/interrupted state and is never blindly re-run.
|
|
73
|
+
*/
|
|
74
|
+
export async function withIdempotency(ctx, tool, key, payload, fn) {
|
|
75
|
+
const store = ctx.services.store;
|
|
76
|
+
const ids = { key, principal: ctx.principal.grantId, workspaceId: ctx.services.workspaceId, tool };
|
|
77
|
+
const payloadHash = digestOf(payload);
|
|
78
|
+
const reservation = store.reserveIdempotency({ ...ids, payloadHash });
|
|
79
|
+
if (reservation.outcome === 'conflict') {
|
|
80
|
+
throw new DodoError('IDEMPOTENCY_CONFLICT', 'this idempotencyKey was already used with different arguments', {
|
|
81
|
+
recovery: 'use a fresh idempotencyKey for a new operation',
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
if (reservation.outcome === 'duplicate') {
|
|
85
|
+
if (reservation.state === 'completed' && reservation.result !== null) {
|
|
86
|
+
return { result: JSON.parse(reservation.result), replayed: true };
|
|
87
|
+
}
|
|
88
|
+
throw new DodoError('RECOVERY_REQUIRED', 'an operation with this key is in progress or was interrupted; its outcome is uncertain', {
|
|
89
|
+
retryable: true,
|
|
90
|
+
recovery: 'wait and retry with the same key to check again; use a NEW key only if you intend to run the operation again',
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
const result = await fn();
|
|
95
|
+
store.completeIdempotency(ids, JSON.stringify(result));
|
|
96
|
+
return { result, replayed: false };
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
const je = err instanceof DodoError ? err : undefined;
|
|
100
|
+
if (je?.code !== 'PARTIAL_RECOVERY_REQUIRED' && je?.code !== 'RECOVERY_REQUIRED') {
|
|
101
|
+
store.releaseIdempotency(ids);
|
|
102
|
+
}
|
|
103
|
+
throw err;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
export const applyChangesTool = defineTool({
|
|
107
|
+
name: 'apply_changes',
|
|
108
|
+
title: 'Apply changes',
|
|
109
|
+
description: 'Apply a previously previewed immutable plan. Requires planId + planHash from preview_changes/preview_rename and a client idempotencyKey (retry-safe: the same key returns the same receipt and never creates a second changeset). Every file hash is re-verified before writing; changed files fail with FILE_CHANGED. In inspect mode this needs a local owner approval first (the error tells you the approval id).',
|
|
110
|
+
input: {
|
|
111
|
+
planId: z.string().max(128),
|
|
112
|
+
planHash: z.string().max(128),
|
|
113
|
+
idempotencyKey: IdempotencyKey,
|
|
114
|
+
},
|
|
115
|
+
output: looseData,
|
|
116
|
+
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false },
|
|
117
|
+
requiredScope: 'dodo:write',
|
|
118
|
+
action: 'mutate-files',
|
|
119
|
+
handler: async (args, ctx) => {
|
|
120
|
+
policyGate(ctx, {
|
|
121
|
+
tool: 'apply_changes',
|
|
122
|
+
action: 'mutate-files',
|
|
123
|
+
approvalAction: { planId: args.planId, planHash: args.planHash },
|
|
124
|
+
summary: `apply change plan ${args.planId}`,
|
|
125
|
+
});
|
|
126
|
+
const { result, replayed } = await withIdempotency(ctx, 'apply_changes', args.idempotencyKey, { planId: args.planId, planHash: args.planHash }, () => ctx.services.applier.apply({
|
|
127
|
+
planId: args.planId,
|
|
128
|
+
planHash: args.planHash,
|
|
129
|
+
workspaceId: ctx.services.workspaceId,
|
|
130
|
+
epoch: ctx.services.epoch,
|
|
131
|
+
principal: ctx.principal.grantId,
|
|
132
|
+
}));
|
|
133
|
+
return { data: { ...result, replayed } };
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
export const rollbackChangesTool = defineTool({
|
|
137
|
+
name: 'rollback_changes',
|
|
138
|
+
title: 'Rollback changes',
|
|
139
|
+
description: 'Restore the files of a committed changeset to their pre-apply bytes from durable backups. Refused with per-file conflicts if ANY affected file was edited after the apply (human work is never overwritten). Takes the changesetId from apply_changes and a fresh idempotencyKey.',
|
|
140
|
+
input: {
|
|
141
|
+
changesetId: z.string().max(128),
|
|
142
|
+
idempotencyKey: IdempotencyKey,
|
|
143
|
+
},
|
|
144
|
+
output: looseData,
|
|
145
|
+
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false },
|
|
146
|
+
requiredScope: 'dodo:write',
|
|
147
|
+
action: 'mutate-files',
|
|
148
|
+
handler: async (args, ctx) => {
|
|
149
|
+
policyGate(ctx, {
|
|
150
|
+
tool: 'rollback_changes',
|
|
151
|
+
action: 'mutate-files',
|
|
152
|
+
approvalAction: { changesetId: args.changesetId },
|
|
153
|
+
summary: `rollback changeset ${args.changesetId}`,
|
|
154
|
+
});
|
|
155
|
+
const { result, replayed } = await withIdempotency(ctx, 'rollback_changes', args.idempotencyKey, { changesetId: args.changesetId }, () => ctx.services.applier.rollback({
|
|
156
|
+
changesetId: args.changesetId,
|
|
157
|
+
workspaceId: ctx.services.workspaceId,
|
|
158
|
+
epoch: ctx.services.epoch,
|
|
159
|
+
principal: ctx.principal.grantId,
|
|
160
|
+
}));
|
|
161
|
+
return { data: { ...result, replayed } };
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
export const changeHistoryTool = defineTool({
|
|
165
|
+
name: 'change_history',
|
|
166
|
+
title: 'Change history',
|
|
167
|
+
description: 'List DODO changesets for this workspace (id, kind, status, summary, timestamps). Only DODO-made changes appear here — external edits are not tracked.',
|
|
168
|
+
input: {
|
|
169
|
+
limit: z.number().int().min(1).max(100).default(20),
|
|
170
|
+
},
|
|
171
|
+
output: looseData,
|
|
172
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
173
|
+
requiredScope: 'dodo:read',
|
|
174
|
+
action: 'read',
|
|
175
|
+
handler: async (args, ctx) => {
|
|
176
|
+
const rows = ctx.services.store.listChangesets(ctx.services.workspaceId, args.limit).map((c) => ({
|
|
177
|
+
changesetId: c.id,
|
|
178
|
+
kind: c.kind,
|
|
179
|
+
status: c.status,
|
|
180
|
+
summary: c.summary,
|
|
181
|
+
createdAt: c.createdAt,
|
|
182
|
+
committedAt: c.committedAt,
|
|
183
|
+
planId: c.planId,
|
|
184
|
+
}));
|
|
185
|
+
return { data: { changesets: rows } };
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
//# sourceMappingURL=changeTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changeTools.js","sourceRoot":"","sources":["../../src/tools/changeTools.ts"],"names":[],"mappings":"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"}
|