better-dsh 0.2.3 → 0.2.4
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/cordis.patch.yml +1 -1
- package/docs/50_test-reports/2026-09-06-write/345/267/245/345/205/267sandbox/345/215/207/347/272/247/351/200/217/344/274/240bug/345/244/215/345/217/221/345/217/212/346/214/202/350/265/267-/344/272/213/344/273/266/346/212/245/345/221/212.md +176 -0
- package/docs/50_test-reports/2026-09-08-hashline-edit-E_RANGE_UNVERIFIED/350/267/250/350/275/256/344/274/232/350/257/235/351/224/256/345/244/261/346/225/210-/350/257/212/346/226/255/346/212/245/345/221/212.md +226 -0
- package/docs/50_test-reports/2026-09-11-control-prompt-into-eval-description/345/256/236/346/265/213/346/212/245/345/221/212.md +222 -0
- package/docs/50_test-reports/2026-09-12-fs-scheme-resolution-/345/256/236/346/265/213/346/212/245/345/221/212.md +81 -0
- package/docs/50_test-reports/2026-09-12-url-schemes-grammar-matrix/344/270/216catalog-centralize-/345/256/236/346/265/213/346/212/245/345/221/212.md +234 -0
- package/docs/50_test-reports/2026-09-12-url-schemes-recallable-context-design/351/252/214/350/257/201/346/212/245/345/221/212.md +160 -0
- package/docs/50_test-reports/2026-09-12-url-schemes-recallable-context-/345/256/236/346/265/213/345/211/247/346/234/254.md +44 -0
- package/docs/50_test-reports/2026-09-12-url-schemes-recallable-context-/345/256/236/346/265/213/346/212/245/345/221/212.md +89 -0
- package/docs/50_test-reports/2026-09-12-url-schemes-/345/205/255scheme/345/206/222/347/203/237/344/270/216/350/276/271/347/225/214/345/256/236/346/265/213/346/212/245/345/221/212.md +198 -0
- package/docs/50_test-reports/2026-09-13-hashline-off/344/270/213scheme/345/217/257/350/276/276/346/200/247/345/267/245/345/205/267/351/235/242/344/270/215/345/257/271/347/247/260-/345/256/236/346/265/213/346/212/245/345/221/212.md +246 -0
- package/docs/50_test-reports/2026-09-13-preact-ui-shell/345/256/236/346/265/213/346/212/245/345/221/212.md +50 -0
- package/docs/50_test-reports/2026-09-14-4999-skill/346/270/205/345/215/225/344/270/216lsp-gate/345/256/236/346/265/213/346/212/245/345/221/212.md +63 -0
- package/docs/50_test-reports/upstream-dsh-0.1.3-alpha.2-local-test-report.md +44 -0
- package/docs/50_test-reports/upstream-dsh-0.1.3-alpha.2-report.md +110 -0
- package/docs/50_test-reports/upstream-dsh-0.1.5-rc.2-local-test-report.md +79 -0
- package/docs/50_test-reports/v0.2.3b-hashline-content-locator/345/256/236/346/265/213/346/212/245/345/221/212.md +73 -0
- package/docs/50_test-reports/v0.2.3c-mobile-wave/345/256/236/346/265/213/346/212/245/345/221/212.md +47 -0
- package/docs/50_test-reports/v0.2.4-ios-focus-zoom-suppression/345/256/236/346/265/213/346/212/245/345/221/212.md +158 -0
- package/docs/specs/agent/spec.md +54 -0
- package/docs/specs/ast/spec.md +34 -0
- package/docs/specs/compaction-recall/spec.md +46 -0
- package/docs/specs/ctx/spec.md +107 -0
- package/docs/specs/dsh/spec.md +47 -0
- package/docs/specs/dvc/spec.md +87 -0
- package/docs/specs/escalation-guidance/spec.md +44 -0
- package/docs/specs/fs-scheme-resolution/spec.md +37 -0
- package/docs/specs/hash-edit/spec.md +41 -0
- package/docs/specs/http-read/spec.md +73 -0
- package/docs/specs/kernel-provisioning/spec.md +53 -0
- package/docs/specs/lsp/spec.md +121 -0
- package/docs/specs/mobile-layout/spec.md +108 -0
- package/docs/specs/model-failover/spec.md +20 -0
- package/docs/specs/preact-ui-shell/spec.md +22 -0
- package/docs/specs/repl-dispatch-resilience/spec.md +21 -0
- package/docs/specs/skill/spec.md +58 -0
- package/docs/specs/tool-surface/spec.md +222 -0
- package/docs/specs/url-schema/spec.md +148 -0
- package/docs/specs/web-trust-fence/spec.md +43 -0
- package/docs/upstream-dsh-0.1.5-rc.2-report.md +156 -0
- package/dsh-docs/AGENTS.md +75 -0
- package/dsh-docs/agent-lifecycle.md +84 -0
- package/dsh-docs/agent-lifecycle.zh.md +86 -0
- package/dsh-docs/api-gateway.md +164 -0
- package/dsh-docs/api-gateway.zh.md +164 -0
- package/dsh-docs/architecture.md +150 -0
- package/dsh-docs/architecture.zh.md +154 -0
- package/dsh-docs/capability-seams.md +543 -0
- package/dsh-docs/capability-seams.zh.md +545 -0
- package/dsh-docs/config-catalog.md +3473 -0
- package/dsh-docs/config-catalog.zh.md +3474 -0
- package/dsh-docs/cookbook/adding-a-package.md +117 -0
- package/dsh-docs/cookbook/adding-a-package.zh.md +119 -0
- package/dsh-docs/cookbook/adding-a-remote-api.md +197 -0
- package/dsh-docs/cookbook/adding-a-remote-api.zh.md +197 -0
- package/dsh-docs/cookbook/adding-a-session-format-version.md +109 -0
- package/dsh-docs/cookbook/adding-a-session-format-version.zh.md +109 -0
- package/dsh-docs/cookbook/adding-a-settings-card.md +102 -0
- package/dsh-docs/cookbook/adding-a-settings-card.zh.md +102 -0
- package/dsh-docs/cookbook/adding-a-tool.md +101 -0
- package/dsh-docs/cookbook/adding-a-tool.zh.md +103 -0
- package/dsh-docs/cookbook/adding-a-vendored-package.md +59 -0
- package/dsh-docs/cookbook/adding-a-vendored-package.zh.md +59 -0
- package/dsh-docs/cookbook/adding-an-llm-adapter.md +43 -0
- package/dsh-docs/cookbook/adding-an-llm-adapter.zh.md +43 -0
- package/dsh-docs/cookbook/extension-cookbook.md +132 -0
- package/dsh-docs/cookbook/extension-cookbook.zh.md +136 -0
- package/dsh-docs/cookbook/maintaining-dsh-code-review.md +64 -0
- package/dsh-docs/cookbook/maintaining-dsh-code-review.zh.md +64 -0
- package/dsh-docs/cookbook/responding-to-pr-review-on-a-stack.md +32 -0
- package/dsh-docs/cookbook/responding-to-pr-review-on-a-stack.zh.md +32 -0
- package/dsh-docs/cordis-api/context.md +364 -0
- package/dsh-docs/cordis-api/context.zh.md +366 -0
- package/dsh-docs/cordis-api/events.md +207 -0
- package/dsh-docs/cordis-api/events.zh.md +209 -0
- package/dsh-docs/cordis-api/fiber.md +375 -0
- package/dsh-docs/cordis-api/fiber.zh.md +377 -0
- package/dsh-docs/cordis-api/inherited.md +39 -0
- package/dsh-docs/cordis-api/registry.md +152 -0
- package/dsh-docs/cordis-api/registry.zh.md +154 -0
- package/dsh-docs/cordis-api/service.md +102 -0
- package/dsh-docs/cordis-api/service.zh.md +104 -0
- package/dsh-docs/cordis-primer.md +45 -0
- package/dsh-docs/cordis-primer.zh.md +51 -0
- package/dsh-docs/cordis-tutorial/01-first-plugin.md +95 -0
- package/dsh-docs/cordis-tutorial/01-first-plugin.zh.md +95 -0
- package/dsh-docs/cordis-tutorial/02-lifecycle-and-effects.md +98 -0
- package/dsh-docs/cordis-tutorial/02-lifecycle-and-effects.zh.md +98 -0
- package/dsh-docs/cordis-tutorial/03-services.md +98 -0
- package/dsh-docs/cordis-tutorial/03-services.zh.md +98 -0
- package/dsh-docs/cordis-tutorial/04-events.md +144 -0
- package/dsh-docs/cordis-tutorial/04-events.zh.md +144 -0
- package/dsh-docs/cordis-tutorial/05-config.md +84 -0
- package/dsh-docs/cordis-tutorial/05-config.zh.md +84 -0
- package/dsh-docs/cordis-tutorial/06-composition-and-hmr.md +113 -0
- package/dsh-docs/cordis-tutorial/06-composition-and-hmr.zh.md +113 -0
- package/dsh-docs/cordis-tutorial/07-into-the-harness.md +108 -0
- package/dsh-docs/cordis-tutorial/07-into-the-harness.zh.md +108 -0
- package/dsh-docs/cordis-tutorial/index.md +60 -0
- package/dsh-docs/cordis-tutorial/index.zh.md +62 -0
- package/dsh-docs/deepseek-llm-api-wire-extensions.md +163 -0
- package/dsh-docs/deepseek-llm-api-wire-extensions.zh.md +163 -0
- package/dsh-docs/defensive-patterns.md +33 -0
- package/dsh-docs/defensive-patterns.zh.md +35 -0
- package/dsh-docs/development.md +167 -0
- package/dsh-docs/development.zh.md +173 -0
- package/dsh-docs/event-producer-consumer.md +86 -0
- package/dsh-docs/event-producer-consumer.zh.md +88 -0
- package/dsh-docs/glossary.md +45 -0
- package/dsh-docs/glossary.zh.md +45 -0
- package/dsh-docs/graph-atlas.md +22 -0
- package/dsh-docs/graph-atlas.zh.md +24 -0
- package/dsh-docs/i18n/README.md +60 -0
- package/dsh-docs/i18n/README.zh.md +62 -0
- package/dsh-docs/i18n/style-samples.md +87 -0
- package/dsh-docs/i18n/terminology.md +214 -0
- package/dsh-docs/i18n/translation-prompt.md +263 -0
- package/dsh-docs/i18n/translation-rules.md +69 -0
- package/dsh-docs/i18n/translation-rules.zh.md +69 -0
- package/dsh-docs/module-graph.md +1411 -0
- package/dsh-docs/module-graph.zh.md +1413 -0
- package/dsh-docs/persistence-catalog.md +1075 -0
- package/dsh-docs/persistence-catalog.zh.md +1077 -0
- package/dsh-docs/postmortem/0001-acp-default-export-drops-inject.md +113 -0
- package/dsh-docs/postmortem/0001-acp-default-export-drops-inject.zh.md +113 -0
- package/dsh-docs/postmortem/0002-js-expression-disabled-filesystem-tools.md +47 -0
- package/dsh-docs/postmortem/0002-js-expression-disabled-filesystem-tools.zh.md +47 -0
- package/dsh-docs/postmortem/0003-web-agent-gui-feedback-loop.md +53 -0
- package/dsh-docs/postmortem/0003-web-agent-gui-feedback-loop.zh.md +53 -0
- package/dsh-docs/postmortem/0004-landlock-partial-notice-misclassified-child-failures.md +55 -0
- package/dsh-docs/postmortem/0004-landlock-partial-notice-misclassified-child-failures.zh.md +55 -0
- package/dsh-docs/postmortem/README.md +18 -0
- package/dsh-docs/postmortem/README.zh.md +18 -0
- package/dsh-docs/rescope.md +53 -0
- package/dsh-docs/rescope.zh.md +53 -0
- package/dsh-docs/session-format-status.md +47 -0
- package/dsh-docs/session-format-status.zh.md +47 -0
- package/dsh-docs/subsystems/README.md +61 -0
- package/dsh-docs/subsystems/README.zh.md +61 -0
- package/dsh-docs/subsystems/agent-team.md +207 -0
- package/dsh-docs/subsystems/agent-team.zh.md +207 -0
- package/dsh-docs/subsystems/approval.md +170 -0
- package/dsh-docs/subsystems/approval.zh.md +170 -0
- package/dsh-docs/subsystems/attachment.md +351 -0
- package/dsh-docs/subsystems/attachment.zh.md +351 -0
- package/dsh-docs/subsystems/client-modules.md +168 -0
- package/dsh-docs/subsystems/client-modules.zh.md +168 -0
- package/dsh-docs/subsystems/client-resources.md +91 -0
- package/dsh-docs/subsystems/client-resources.zh.md +91 -0
- package/dsh-docs/subsystems/code-runtime.md +195 -0
- package/dsh-docs/subsystems/code-runtime.zh.md +195 -0
- package/dsh-docs/subsystems/commands.md +219 -0
- package/dsh-docs/subsystems/commands.zh.md +219 -0
- package/dsh-docs/subsystems/compaction.md +238 -0
- package/dsh-docs/subsystems/compaction.zh.md +238 -0
- package/dsh-docs/subsystems/conversation.md +258 -0
- package/dsh-docs/subsystems/conversation.zh.md +258 -0
- package/dsh-docs/subsystems/core.md +1209 -0
- package/dsh-docs/subsystems/core.zh.md +1219 -0
- package/dsh-docs/subsystems/credentials.md +329 -0
- package/dsh-docs/subsystems/credentials.zh.md +329 -0
- package/dsh-docs/subsystems/extensions.md +382 -0
- package/dsh-docs/subsystems/extensions.zh.md +382 -0
- package/dsh-docs/subsystems/feedback.md +266 -0
- package/dsh-docs/subsystems/feedback.zh.md +266 -0
- package/dsh-docs/subsystems/filesystem.md +505 -0
- package/dsh-docs/subsystems/filesystem.zh.md +505 -0
- package/dsh-docs/subsystems/goal.md +277 -0
- package/dsh-docs/subsystems/goal.zh.md +277 -0
- package/dsh-docs/subsystems/invariants.md +88 -0
- package/dsh-docs/subsystems/invariants.zh.md +88 -0
- package/dsh-docs/subsystems/jobs.md +290 -0
- package/dsh-docs/subsystems/jobs.zh.md +290 -0
- package/dsh-docs/subsystems/llm-streaming.md +1080 -0
- package/dsh-docs/subsystems/llm-streaming.zh.md +1086 -0
- package/dsh-docs/subsystems/lsp.md +202 -0
- package/dsh-docs/subsystems/lsp.zh.md +202 -0
- package/dsh-docs/subsystems/permission-presets.md +131 -0
- package/dsh-docs/subsystems/permission-presets.zh.md +131 -0
- package/dsh-docs/subsystems/persistence.md +395 -0
- package/dsh-docs/subsystems/persistence.zh.md +395 -0
- package/dsh-docs/subsystems/plan.md +87 -0
- package/dsh-docs/subsystems/plan.zh.md +87 -0
- package/dsh-docs/subsystems/sandbox.md +220 -0
- package/dsh-docs/subsystems/sandbox.zh.md +220 -0
- package/dsh-docs/subsystems/schedule.md +192 -0
- package/dsh-docs/subsystems/schedule.zh.md +192 -0
- package/dsh-docs/subsystems/scope.md +59 -0
- package/dsh-docs/subsystems/scope.zh.md +59 -0
- package/dsh-docs/subsystems/session-projection.md +354 -0
- package/dsh-docs/subsystems/session-projection.zh.md +354 -0
- package/dsh-docs/subsystems/session-query.md +509 -0
- package/dsh-docs/subsystems/session-query.zh.md +509 -0
- package/dsh-docs/subsystems/session-reference.md +219 -0
- package/dsh-docs/subsystems/session-reference.zh.md +219 -0
- package/dsh-docs/subsystems/session-telemetry.md +194 -0
- package/dsh-docs/subsystems/session-telemetry.zh.md +194 -0
- package/dsh-docs/subsystems/session-title.md +204 -0
- package/dsh-docs/subsystems/session-title.zh.md +204 -0
- package/dsh-docs/subsystems/session.md +1155 -0
- package/dsh-docs/subsystems/session.zh.md +1159 -0
- package/dsh-docs/subsystems/settings.md +405 -0
- package/dsh-docs/subsystems/settings.zh.md +405 -0
- package/dsh-docs/subsystems/shell.md +303 -0
- package/dsh-docs/subsystems/shell.zh.md +303 -0
- package/dsh-docs/subsystems/sidebar-right.md +148 -0
- package/dsh-docs/subsystems/sidebar-right.zh.md +148 -0
- package/dsh-docs/subsystems/skills.md +354 -0
- package/dsh-docs/subsystems/skills.zh.md +354 -0
- package/dsh-docs/subsystems/slots.md +175 -0
- package/dsh-docs/subsystems/slots.zh.md +175 -0
- package/dsh-docs/subsystems/spill.md +117 -0
- package/dsh-docs/subsystems/spill.zh.md +117 -0
- package/dsh-docs/subsystems/storage.md +260 -0
- package/dsh-docs/subsystems/storage.zh.md +260 -0
- package/dsh-docs/subsystems/subagent.md +766 -0
- package/dsh-docs/subsystems/subagent.zh.md +770 -0
- package/dsh-docs/subsystems/subprocess.md +324 -0
- package/dsh-docs/subsystems/subprocess.zh.md +324 -0
- package/dsh-docs/subsystems/system-prompt.md +220 -0
- package/dsh-docs/subsystems/system-prompt.zh.md +220 -0
- package/dsh-docs/subsystems/terminal.md +184 -0
- package/dsh-docs/subsystems/terminal.zh.md +184 -0
- package/dsh-docs/subsystems/todo.md +32 -0
- package/dsh-docs/subsystems/todo.zh.md +32 -0
- package/dsh-docs/subsystems/token-meter.md +105 -0
- package/dsh-docs/subsystems/token-meter.zh.md +105 -0
- package/dsh-docs/subsystems/tools.md +720 -0
- package/dsh-docs/subsystems/tools.zh.md +720 -0
- package/dsh-docs/subsystems/typert.md +343 -0
- package/dsh-docs/subsystems/typert.zh.md +343 -0
- package/dsh-docs/subsystems/user-questions.md +178 -0
- package/dsh-docs/subsystems/user-questions.zh.md +178 -0
- package/dsh-docs/subsystems/web-client.md +95 -0
- package/dsh-docs/subsystems/web-client.zh.md +95 -0
- package/dsh-docs/subsystems/web-server.md +154 -0
- package/dsh-docs/subsystems/web-server.zh.md +154 -0
- package/dsh-docs/subsystems/web.md +206 -0
- package/dsh-docs/subsystems/web.zh.md +206 -0
- package/dsh-docs/subsystems/webhook.md +70 -0
- package/dsh-docs/subsystems/webhook.zh.md +70 -0
- package/dsh-docs/subsystems/workflow.md +278 -0
- package/dsh-docs/subsystems/workflow.zh.md +278 -0
- package/dsh-docs/subsystems/workspace.md +321 -0
- package/dsh-docs/subsystems/workspace.zh.md +321 -0
- package/dsh-docs/testing.md +54 -0
- package/dsh-docs/testing.zh.md +54 -0
- package/dsh-docs/tool-catalog.md +2225 -0
- package/dsh-docs/tool-catalog.zh.md +2233 -0
- package/dsh-docs/tool-execution-pipeline.md +62 -0
- package/dsh-docs/tool-execution-pipeline.zh.md +64 -0
- package/dsh-docs/user/develop/basic/config.md +106 -0
- package/dsh-docs/user/develop/basic/config.zh.md +106 -0
- package/dsh-docs/user/develop/basic/index.md +144 -0
- package/dsh-docs/user/develop/basic/index.zh.md +144 -0
- package/dsh-docs/user/develop/basic/publish.md +183 -0
- package/dsh-docs/user/develop/basic/publish.zh.md +183 -0
- package/dsh-docs/user/develop/basic/tool.md +52 -0
- package/dsh-docs/user/develop/basic/tool.zh.md +52 -0
- package/dsh-docs/user/develop/framework/events.md +143 -0
- package/dsh-docs/user/develop/framework/events.zh.md +143 -0
- package/dsh-docs/user/develop/framework/index.md +137 -0
- package/dsh-docs/user/develop/framework/index.zh.md +137 -0
- package/dsh-docs/user/develop/framework/service.md +148 -0
- package/dsh-docs/user/develop/framework/service.zh.md +150 -0
- package/dsh-docs/user/develop/practice/dynamic-cordis.md +15 -0
- package/dsh-docs/user/develop/practice/dynamic-cordis.zh.md +15 -0
- package/dsh-docs/user/develop/practice/index.md +155 -0
- package/dsh-docs/user/develop/practice/index.zh.md +155 -0
- package/dsh-docs/user/develop/practice/llm-adapter.md +189 -0
- package/dsh-docs/user/develop/practice/llm-adapter.zh.md +189 -0
- package/dsh-docs/user/guide/github-review.md +102 -0
- package/dsh-docs/user/guide/github-review.zh.md +102 -0
- package/dsh-docs/user/guide/index.md +30 -0
- package/dsh-docs/user/guide/index.zh.md +30 -0
- package/dsh-docs/user/guide/mcp-memory.md +101 -0
- package/dsh-docs/user/guide/mcp-memory.zh.md +101 -0
- package/dsh-docs/user/guide/network-proxy.md +85 -0
- package/dsh-docs/user/guide/network-proxy.zh.md +85 -0
- package/dsh-docs/user/guide/providers.md +190 -0
- package/dsh-docs/user/guide/providers.zh.md +190 -0
- package/dsh-docs/user/guide/python-sdk.md +150 -0
- package/dsh-docs/user/guide/python-sdk.zh.md +150 -0
- package/dsh-docs/user/guide/schedule.md +21 -0
- package/dsh-docs/user/guide/schedule.zh.md +21 -0
- package/dsh-docs/user/index.md +11 -0
- package/dsh-docs/user/index.zh.md +11 -0
- package/dsh-docs/web-styling.md +29 -0
- package/dsh-docs/web-styling.zh.md +29 -0
- package/eval-description.md +33 -0
- package/lib/client/index.js +327 -88
- package/lib/fs-aware/sandbox-plugin.d.ts +71 -0
- package/lib/fs-aware/sandbox-plugin.js +249 -0
- package/lib/index.d.ts +22 -22
- package/lib/index.js +3095 -3204
- package/lib/lsp-server-registry-DkaYmTwt.js +972 -0
- package/lib/lsp-server-registry-_hk-Wcia.js +3 -0
- package/lib/py-sdk-Chvy92MB.js +178 -0
- package/lib/py-sdk.d.ts +19 -2
- package/lib/py-sdk.js +2 -2
- package/lib/wrap-JFjcWwZf.js +747 -0
- package/package.json +9 -3
- package/url-schemes-instruction.md +22 -0
- package/control-prompt.md +0 -37
- package/docs/50_test-reports/v0.1.8d_artifacts/README.md +0 -138
- package/docs/50_test-reports/v0.1.8d_artifacts/code-mode-repl-only.observation.md +0 -74
- package/docs/50_test-reports/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.jsonl +0 -3890
- package/docs/50_test-reports/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.w-sample-0435.jsonl +0 -544
- package/docs/50_test-reports/v0.1.8d_artifacts/functions.json +0 -592
- package/docs/50_test-reports/v0.1.8d_artifacts/skills-catalog.snapshot.md +0 -30
- package/docs/50_test-reports/v0.1.8d_artifacts/tools-sdk.output-schemas.json +0 -1236
- package/docs/50_test-reports/v0.1.8d_artifacts/tools-sdk.python.txt +0 -592
- package/docs/50_test-reports/v0.1.8d_artifacts/tools-sdk.typescript.txt +0 -516
- package/docs/50_test-reports/v0.1.8d_artifacts/wire-vs-transcription.diff.md +0 -54
- package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/Cargo.lock +0 -7
- package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/Cargo.toml +0 -6
- package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/src/bin/messy.rs +0 -8
- package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/src/main.rs +0 -4
- package/docs/50_test-reports/v0.2.0b_artifacts/hashline-probe.md +0 -5
- package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/Cargo.lock +0 -7
- package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/Cargo.toml +0 -7
- package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/build.rs +0 -4
- package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/src/main.rs +0 -13
- package/docs/60_exploration-and-research/cordis-research.md +0 -350
- package/docs/60_exploration-and-research/dsh-web-profile-package-map.md +0 -186
- package/docs/60_exploration-and-research/dsh-web-ui-slot-system-research.md +0 -310
- package/docs/60_exploration-and-research/dsh-webui-strip-boundary-research.md +0 -300
- package/docs/60_exploration-and-research/ios-chat-app-bridge-research.md +0 -324
- package/docs/60_exploration-and-research/web-frontend-composability-research.md +0 -191
- package/docs/REPL-/345/267/245/345/205/267/350/260/203/347/224/250-/346/210/252/346/226/255/350/257/212/346/226/255.md +0 -110
- package/docs/adr/0001-bridge-tool-layer-not-service-layer.md +0 -14
- package/docs/adr/0002-masking-is-presentation-only.md +0 -15
- package/docs/plans/A2A-messaging-channel-test-archive.md +0 -256
- package/docs/plans/code-mode-vs-rlm-ipython-comparison.md +0 -137
- package/docs/plans/dashr-blueprint-review.md +0 -201
- package/docs/plans/dashr-blueprint.md +0 -561
- package/docs/plans/dashr-compaction-window-and-archive.md +0 -307
- package/docs/plans/dashr-profile-layer-feasibility.md +0 -367
- package/docs/plans/dashr-sandbox-escalation-semantics-gap.md +0 -171
- package/docs/plans/dashr-security-sandbox-analysis.md +0 -187
- package/docs/plans/dashr-surface-invariant-and-omp-imports.md +0 -97
- package/docs/plans/ipython-kernel-interactive-interface-test-report.md +0 -152
- package/docs/plans/kernel-refactoring/Dash-IPython-Control-Prompt-draft.md +0 -146
- package/docs/plans/kernel-refactoring/Dash-IPython-Control-Prompt-draft_v3.md +0 -50
- package/docs/plans/kernel-refactoring/Dash-IPython-Control-Prompt-draft_v4.md +0 -79
- package/docs/plans/kernel-refactoring/Dash-vs-PrimeAgent-systemprompt-toolcatalog-comparison.md +0 -138
- package/docs/plans/kernel-refactoring/RLM-system-prompt-injection-gap-report.md +0 -161
- package/docs/plans/kernel-refactoring/V0.1.5-development-plan.md +0 -109
- package/docs/plans/kernel-refactoring/actinoable-surface-to-llm-in-agent-runtime_dsh.md +0 -50
- package/docs/plans/kernel-refactoring/actinoable-surface-to-llm-in-agent-runtime_prime.md +0 -113
- package/docs/plans/recallable-compaction.md +0 -147
- package/docs/plans/spike-tag-repro.mjs +0 -102
- package/docs/plans/upstream-analysis.md +0 -128
- package/docs/v0.1.8-improved-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -142
- package/docs/v0.1.8-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -193
- package/docs/v0.1.8b-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -96
- package/docs/v0.1.8c-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -127
- package/docs/v0.1.8d-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -150
- package/docs/v0.1.8d_artifacts/README.md +0 -138
- package/docs/v0.1.8d_artifacts/code-mode-repl-only.observation.md +0 -74
- package/docs/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.jsonl +0 -3890
- package/docs/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.w-sample-0435.jsonl +0 -544
- package/docs/v0.1.8d_artifacts/functions.json +0 -592
- package/docs/v0.1.8d_artifacts/skills-catalog.snapshot.md +0 -30
- package/docs/v0.1.8d_artifacts/tools-sdk.output-schemas.json +0 -1236
- package/docs/v0.1.8d_artifacts/tools-sdk.python.txt +0 -592
- package/docs/v0.1.8d_artifacts/tools-sdk.typescript.txt +0 -516
- package/docs/v0.1.8d_artifacts/wire-vs-transcription.diff.md +0 -54
- package/docs/v0.1.8e-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -224
- package/docs/v0.1.9a-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -168
- package/docs/v0.2.0b-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -123
- package/docs/v0.2.0b_artifacts/f2probe/Cargo.lock +0 -7
- package/docs/v0.2.0b_artifacts/f2probe/Cargo.toml +0 -6
- package/docs/v0.2.0b_artifacts/f2probe/src/bin/messy.rs +0 -8
- package/docs/v0.2.0b_artifacts/f2probe/src/main.rs +0 -4
- package/docs/v0.2.0b_artifacts/hashline-probe.md +0 -5
- package/docs/v0.2.0b_artifacts/slowprobe/Cargo.lock +0 -7
- package/docs/v0.2.0b_artifacts/slowprobe/Cargo.toml +0 -7
- package/docs/v0.2.0b_artifacts/slowprobe/build.rs +0 -4
- package/docs/v0.2.0b_artifacts/slowprobe/src/main.rs +0 -13
- package/docs/v0.2.1-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -110
- package/docs/v0.2.1b-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -86
- package/docs/v0.2.1c-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -66
- package/lib/py-sdk-BCaOGYz7.d.ts +0 -125
- package/lib/py-sdk-CbgYiX8O.js +0 -691
|
@@ -1,592 +0,0 @@
|
|
|
1
|
-
## Writing code for run_code
|
|
2
|
-
|
|
3
|
-
`run_code` takes two required arguments: `code` — the body of an async Python function (top-level `await` and `return` both work) — and `description`, a short summary of what the program does. At run time exactly two of the names declared below are bound: `tools` and `ToolCallError`. Everything else is a STATIC STUB describing argument and return types — in particular the `TypedDict` classes do NOT exist at run time, so build arguments as plain `dict`/`list` JSON values: `await tools.name({"field": 1})`, never `FooArgs(field=1)`, which raises `NameError`. Inside the program:
|
|
4
|
-
|
|
5
|
-
- Call tools as `await tools.name(args)` — subscript access for exotic, reserved, or underscore-leading names: `await tools["my-tool"](args)`. Every call resolves to the tool's typed canonical JSON value (each method's return type below). Tool arguments must be lossless JSON.
|
|
6
|
-
- A FAILED tool call raises `ToolCallError`, whose `toolName` identifies the failed tool and whose message is human-readable — wrap in `try/except` to handle and continue.
|
|
7
|
-
- Independent read-only calls MAY overlap under `asyncio.gather` (safe calls run concurrently; mutating calls run alone, in submission order). Sequence dependent work with `await`.
|
|
8
|
-
- Emit the run's answer with `print(...)` and/or a top-level `return <value>`; the returned value must be lossless JSON. Only what you print and return is program output. A successful tool result containing an image is attached after the run so you can inspect it on the next step; every other intermediate result stays out of the conversation, so extract just what you need.
|
|
9
|
-
|
|
10
|
-
The available tools:
|
|
11
|
-
|
|
12
|
-
```python
|
|
13
|
-
from typing import Any, Literal, NotRequired, Protocol, TypedDict
|
|
14
|
-
|
|
15
|
-
class ToolCallError(Exception):
|
|
16
|
-
toolName: str
|
|
17
|
-
|
|
18
|
-
class AskUserQuestionArgsQuestionsOptions(TypedDict):
|
|
19
|
-
# Short user-facing option label.
|
|
20
|
-
label: str
|
|
21
|
-
# One sentence explaining the tradeoff or impact.
|
|
22
|
-
description: NotRequired[str]
|
|
23
|
-
# Additional keys beyond those declared are allowed.
|
|
24
|
-
|
|
25
|
-
class AskUserQuestionArgsQuestions(TypedDict):
|
|
26
|
-
# Stable id for this question; echoed in the answer.
|
|
27
|
-
id: str
|
|
28
|
-
# The specific question to ask the user.
|
|
29
|
-
question: str
|
|
30
|
-
# Optional short heading for the question, such as "Confirm" or "Choose Mode".
|
|
31
|
-
header: NotRequired[str]
|
|
32
|
-
# Optional choices to show the user. If you recommend one, put it first and append "(Recommended)" to that label.
|
|
33
|
-
options: NotRequired[list[AskUserQuestionArgsQuestionsOptions]]
|
|
34
|
-
# Whether the user may select more than one option. Defaults to false.
|
|
35
|
-
multi_select: NotRequired[bool]
|
|
36
|
-
# Additional keys beyond those declared are allowed.
|
|
37
|
-
|
|
38
|
-
class AskUserQuestionArgs(TypedDict):
|
|
39
|
-
# Questions to ask the user before continuing.
|
|
40
|
-
questions: list[AskUserQuestionArgsQuestions]
|
|
41
|
-
# Additional keys beyond those declared are allowed.
|
|
42
|
-
|
|
43
|
-
class AskUserQuestionOutputAnswers(TypedDict):
|
|
44
|
-
id: str
|
|
45
|
-
selected: list[str]
|
|
46
|
-
custom: NotRequired[str]
|
|
47
|
-
|
|
48
|
-
class AskUserQuestionOutput(TypedDict):
|
|
49
|
-
answers: list[AskUserQuestionOutputAnswers]
|
|
50
|
-
|
|
51
|
-
class BashArgs(TypedDict):
|
|
52
|
-
# The bash command to execute.
|
|
53
|
-
command: str
|
|
54
|
-
# Clear, concise description of what this command does in active voice, 5-10 words (shown in the UI). Examples: "ls" → "List files in current directory"; "git status" → "Show working tree status"; "npm install" → "Install package dependencies".
|
|
55
|
-
description: str
|
|
56
|
-
# Timeout in milliseconds. The executor applies its configured default and cap, and kills the command on expiry.
|
|
57
|
-
timeoutMs: NotRequired[float]
|
|
58
|
-
# Working directory for this command. Defaults to the session workspace; a relative path is resolved against it.
|
|
59
|
-
workdir: NotRequired[str]
|
|
60
|
-
# Run in the background and return a job id immediately (collect with job_output, stop with job_kill). No timeout applies.
|
|
61
|
-
run_in_background: NotRequired[bool]
|
|
62
|
-
# The wider sandbox mode this command needs. Only valid as a one-shot retry of a command the sandbox just denied; requires justification and user approval.
|
|
63
|
-
sandbox_permissions: NotRequired[Literal["workspace-write", "danger-full-access"]]
|
|
64
|
-
# Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access.
|
|
65
|
-
justification: NotRequired[str]
|
|
66
|
-
# Additional keys beyond those declared are allowed.
|
|
67
|
-
|
|
68
|
-
class BashOutput1(TypedDict):
|
|
69
|
-
kind: Literal["background"]
|
|
70
|
-
jobId: str
|
|
71
|
-
|
|
72
|
-
class BashOutput2Stdout(TypedDict):
|
|
73
|
-
text: str
|
|
74
|
-
truncated: bool
|
|
75
|
-
spillPath: NotRequired[str]
|
|
76
|
-
|
|
77
|
-
class BashOutput2Stderr(TypedDict):
|
|
78
|
-
text: str
|
|
79
|
-
truncated: bool
|
|
80
|
-
spillPath: NotRequired[str]
|
|
81
|
-
|
|
82
|
-
class BashOutput2Sandbox(TypedDict):
|
|
83
|
-
mode: str
|
|
84
|
-
denied: bool
|
|
85
|
-
enforcement: NotRequired[str]
|
|
86
|
-
runnerFailed: NotRequired[bool]
|
|
87
|
-
|
|
88
|
-
class BashOutput2(TypedDict):
|
|
89
|
-
kind: Literal["foreground"]
|
|
90
|
-
exitCode: int | None
|
|
91
|
-
signal: str | None
|
|
92
|
-
timedOut: bool
|
|
93
|
-
aborted: bool
|
|
94
|
-
timeoutMs: float
|
|
95
|
-
stdout: BashOutput2Stdout
|
|
96
|
-
stderr: BashOutput2Stderr
|
|
97
|
-
sandbox: NotRequired[BashOutput2Sandbox]
|
|
98
|
-
|
|
99
|
-
class CreateGoalArgs(TypedDict):
|
|
100
|
-
# The concrete completion objective inferred from the direct human request.
|
|
101
|
-
objective: str
|
|
102
|
-
# Optional positive safe-integer limit on automatic continuation rounds.
|
|
103
|
-
max_goal_rounds: NotRequired[float]
|
|
104
|
-
# Additional keys beyond those declared are allowed.
|
|
105
|
-
|
|
106
|
-
class CreateGoalOutput1(TypedDict):
|
|
107
|
-
goal: None
|
|
108
|
-
|
|
109
|
-
class CreateGoalOutput2GoalBlockedReason(TypedDict):
|
|
110
|
-
code: str
|
|
111
|
-
message: str
|
|
112
|
-
|
|
113
|
-
class CreateGoalOutput2Goal(TypedDict):
|
|
114
|
-
id: str
|
|
115
|
-
revision: int
|
|
116
|
-
objective: str
|
|
117
|
-
phase: Literal["active", "paused", "blocked", "complete"]
|
|
118
|
-
roundsStarted: int
|
|
119
|
-
maxGoalRounds: int
|
|
120
|
-
blockedReason: NotRequired[CreateGoalOutput2GoalBlockedReason]
|
|
121
|
-
|
|
122
|
-
class CreateGoalOutput2(TypedDict):
|
|
123
|
-
goal: CreateGoalOutput2Goal
|
|
124
|
-
activation: Literal["armed", "disarmed"]
|
|
125
|
-
|
|
126
|
-
class EditArgs(TypedDict):
|
|
127
|
-
# Path to edit, resolved by the filesystem backend.
|
|
128
|
-
file_path: str
|
|
129
|
-
# Literal text to replace. Must match exactly.
|
|
130
|
-
old_string: str
|
|
131
|
-
# Literal replacement text. Use an empty string to delete the match.
|
|
132
|
-
new_string: str
|
|
133
|
-
# Replace all matches. Defaults to false; when false, old_string must appear exactly once.
|
|
134
|
-
replace_all: NotRequired[bool]
|
|
135
|
-
# The wider sandbox mode this file operation needs. Only valid as a one-shot retry of an operation the sandbox just denied; requires justification and user approval.
|
|
136
|
-
sandbox_permissions: NotRequired[Literal["workspace-write", "danger-full-access"]]
|
|
137
|
-
# Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access.
|
|
138
|
-
justification: NotRequired[str]
|
|
139
|
-
# Additional keys beyond those declared are allowed.
|
|
140
|
-
|
|
141
|
-
class EditOutput(TypedDict):
|
|
142
|
-
path: str
|
|
143
|
-
before: str
|
|
144
|
-
after: str
|
|
145
|
-
|
|
146
|
-
class ExitPlanModeArgs(TypedDict):
|
|
147
|
-
# The complete plan, as markdown, starting with a # heading that names it.
|
|
148
|
-
plan: str
|
|
149
|
-
# Additional keys beyond those declared are allowed.
|
|
150
|
-
|
|
151
|
-
class ExitPlanModeOutput(TypedDict):
|
|
152
|
-
approved: Literal[True]
|
|
153
|
-
|
|
154
|
-
class GetGoalOutput1(TypedDict):
|
|
155
|
-
goal: None
|
|
156
|
-
|
|
157
|
-
class GetGoalOutput2GoalBlockedReason(TypedDict):
|
|
158
|
-
code: str
|
|
159
|
-
message: str
|
|
160
|
-
|
|
161
|
-
class GetGoalOutput2Goal(TypedDict):
|
|
162
|
-
id: str
|
|
163
|
-
revision: int
|
|
164
|
-
objective: str
|
|
165
|
-
phase: Literal["active", "paused", "blocked", "complete"]
|
|
166
|
-
roundsStarted: int
|
|
167
|
-
maxGoalRounds: int
|
|
168
|
-
blockedReason: NotRequired[GetGoalOutput2GoalBlockedReason]
|
|
169
|
-
|
|
170
|
-
class GetGoalOutput2(TypedDict):
|
|
171
|
-
goal: GetGoalOutput2Goal
|
|
172
|
-
activation: Literal["armed", "disarmed"]
|
|
173
|
-
|
|
174
|
-
class GlobArgs(TypedDict):
|
|
175
|
-
# Glob pattern to match file paths against (e.g. "**/*.ts", "src/**/*.test.js"). A pattern with no "/" matches the basename at any depth, so "*" and "*.ts" both search the whole tree; include a separator to anchor the depth.
|
|
176
|
-
pattern: str
|
|
177
|
-
# Directory to search in. Defaults to the session workspace; a relative path resolves against it.
|
|
178
|
-
path: NotRequired[str]
|
|
179
|
-
# Additional keys beyond those declared are allowed.
|
|
180
|
-
|
|
181
|
-
class GlobOutput(TypedDict):
|
|
182
|
-
root: str
|
|
183
|
-
paths: list[str]
|
|
184
|
-
|
|
185
|
-
class GrepArgs(TypedDict):
|
|
186
|
-
# Regular expression to search for (ripgrep syntax).
|
|
187
|
-
pattern: str
|
|
188
|
-
# File or directory to search. Defaults to the session workspace; a relative path resolves against it.
|
|
189
|
-
path: NotRequired[str]
|
|
190
|
-
# One glob filter for which files to search (e.g. "*.ts", "*.{js,jsx}"). Not a list; negation is not supported.
|
|
191
|
-
include: NotRequired[str]
|
|
192
|
-
# Additional keys beyond those declared are allowed.
|
|
193
|
-
|
|
194
|
-
class GrepOutputMatches(TypedDict):
|
|
195
|
-
path: str
|
|
196
|
-
lineNumber: int
|
|
197
|
-
line: str
|
|
198
|
-
|
|
199
|
-
class GrepOutput(TypedDict):
|
|
200
|
-
matches: list[GrepOutputMatches]
|
|
201
|
-
|
|
202
|
-
class InterruptAgentArgs(TypedDict):
|
|
203
|
-
# The agent id of the running agent to interrupt.
|
|
204
|
-
agent_id: str
|
|
205
|
-
# Additional keys beyond those declared are allowed.
|
|
206
|
-
|
|
207
|
-
class InterruptAgentOutput(TypedDict):
|
|
208
|
-
accepted: bool
|
|
209
|
-
|
|
210
|
-
class JobKillArgs(TypedDict):
|
|
211
|
-
# Job id returned by the tool that started the background work.
|
|
212
|
-
job_id: str
|
|
213
|
-
# Optional short reason, recorded in the log and forwarded to the job.
|
|
214
|
-
reason: NotRequired[str]
|
|
215
|
-
# Additional keys beyond those declared are allowed.
|
|
216
|
-
|
|
217
|
-
class JobKillOutputJob(TypedDict):
|
|
218
|
-
id: str
|
|
219
|
-
kind: str
|
|
220
|
-
label: str
|
|
221
|
-
status: Literal["running", "stopping", "completed", "killed", "failed"]
|
|
222
|
-
detail: NotRequired[str]
|
|
223
|
-
startedAt: int
|
|
224
|
-
finishedAt: NotRequired[int]
|
|
225
|
-
|
|
226
|
-
class JobKillOutput(TypedDict):
|
|
227
|
-
outcome: Literal["cancellation-requested", "already-finished"]
|
|
228
|
-
job: JobKillOutputJob
|
|
229
|
-
|
|
230
|
-
class JobListOutput(TypedDict):
|
|
231
|
-
id: str
|
|
232
|
-
kind: str
|
|
233
|
-
label: str
|
|
234
|
-
status: Literal["running", "stopping", "completed", "killed", "failed"]
|
|
235
|
-
detail: NotRequired[str]
|
|
236
|
-
startedAt: int
|
|
237
|
-
finishedAt: NotRequired[int]
|
|
238
|
-
|
|
239
|
-
class JobOutputArgs(TypedDict):
|
|
240
|
-
# Job id returned by the tool that started the background work.
|
|
241
|
-
job_id: str
|
|
242
|
-
# Block until the job reaches a terminal status or the timeout expires. A timed-out wait returns [status: running] and leaves the job alive.
|
|
243
|
-
wait: NotRequired[bool]
|
|
244
|
-
# Max wait in milliseconds (only meaningful with wait: true). Defaults to the configured wait timeout; capped by the configured maximum.
|
|
245
|
-
timeout_ms: NotRequired[float]
|
|
246
|
-
# Additional keys beyond those declared are allowed.
|
|
247
|
-
|
|
248
|
-
class JobOutputOutputJob(TypedDict):
|
|
249
|
-
id: str
|
|
250
|
-
kind: str
|
|
251
|
-
label: str
|
|
252
|
-
status: Literal["running", "stopping", "completed", "killed", "failed"]
|
|
253
|
-
detail: NotRequired[str]
|
|
254
|
-
startedAt: int
|
|
255
|
-
finishedAt: NotRequired[int]
|
|
256
|
-
|
|
257
|
-
class JobOutputOutput(TypedDict):
|
|
258
|
-
text: str
|
|
259
|
-
job: JobOutputOutputJob
|
|
260
|
-
|
|
261
|
-
class ListAgentsArgs(TypedDict):
|
|
262
|
-
# children (default) lists direct children only; descendants walks the complete tree below you.
|
|
263
|
-
scope: NotRequired[Literal["children", "descendants"]]
|
|
264
|
-
# Additional keys beyond those declared are allowed.
|
|
265
|
-
|
|
266
|
-
class ListAgentsOutput1(TypedDict):
|
|
267
|
-
kind: Literal["child"]
|
|
268
|
-
id: str
|
|
269
|
-
label: str
|
|
270
|
-
status: Literal["running", "idle", "ready"]
|
|
271
|
-
parent: NotRequired[str]
|
|
272
|
-
depth: NotRequired[float]
|
|
273
|
-
|
|
274
|
-
class ListAgentsOutput2(TypedDict):
|
|
275
|
-
kind: Literal["diagnostic"]
|
|
276
|
-
id: str
|
|
277
|
-
reason: Literal["corrupt", "unsupported", "unavailable"]
|
|
278
|
-
parent: NotRequired[str]
|
|
279
|
-
depth: NotRequired[float]
|
|
280
|
-
|
|
281
|
-
class RalphArgs(TypedDict):
|
|
282
|
-
# The immutable completion objective for every fresh Ralph round.
|
|
283
|
-
objective: str
|
|
284
|
-
# Optional positive safe-integer round cap, bounded by the deployment ceiling.
|
|
285
|
-
maxRounds: NotRequired[float]
|
|
286
|
-
# Additional keys beyond those declared are allowed.
|
|
287
|
-
|
|
288
|
-
class RalphOutput(TypedDict):
|
|
289
|
-
runId: str
|
|
290
|
-
agentsStarted: int
|
|
291
|
-
result: Any
|
|
292
|
-
|
|
293
|
-
class ReadArgs(TypedDict):
|
|
294
|
-
# Path to read, resolved by the filesystem backend.
|
|
295
|
-
file_path: str
|
|
296
|
-
# 1-based first line to return. Defaults to 1.
|
|
297
|
-
offset: NotRequired[float]
|
|
298
|
-
# Maximum number of lines to return. Defaults to 2000.
|
|
299
|
-
limit: NotRequired[float]
|
|
300
|
-
# Additional keys beyond those declared are allowed.
|
|
301
|
-
|
|
302
|
-
class ReadOutputLines(TypedDict):
|
|
303
|
-
number: int
|
|
304
|
-
text: str
|
|
305
|
-
|
|
306
|
-
class ReadOutput(TypedDict):
|
|
307
|
-
path: str
|
|
308
|
-
offset: int
|
|
309
|
-
lines: list[ReadOutputLines]
|
|
310
|
-
totalLines: int
|
|
311
|
-
|
|
312
|
-
class ReadImageArgs(TypedDict):
|
|
313
|
-
# Path to the image file, resolved by the filesystem backend.
|
|
314
|
-
file_path: str
|
|
315
|
-
# Additional keys beyond those declared are allowed.
|
|
316
|
-
|
|
317
|
-
class ReadImageOutputImageOriginalDimensions(TypedDict):
|
|
318
|
-
width: int
|
|
319
|
-
height: int
|
|
320
|
-
|
|
321
|
-
class ReadImageOutputImage(TypedDict):
|
|
322
|
-
attachmentId: str
|
|
323
|
-
mediaType: Literal["image/png", "image/jpeg", "image/webp", "image/gif"]
|
|
324
|
-
bytes: int
|
|
325
|
-
width: int
|
|
326
|
-
height: int
|
|
327
|
-
name: NotRequired[str]
|
|
328
|
-
originalDimensions: NotRequired[ReadImageOutputImageOriginalDimensions]
|
|
329
|
-
|
|
330
|
-
class ReadImageOutput(TypedDict):
|
|
331
|
-
path: str
|
|
332
|
-
image: ReadImageOutputImage
|
|
333
|
-
|
|
334
|
-
class SendMessageArgs(TypedDict):
|
|
335
|
-
# The subagent id returned when the background subagent was started.
|
|
336
|
-
subagent_id: str
|
|
337
|
-
# The message to deliver to the subagent.
|
|
338
|
-
message: str
|
|
339
|
-
# Additional keys beyond those declared are allowed.
|
|
340
|
-
|
|
341
|
-
class SendMessageOutput(TypedDict):
|
|
342
|
-
messageId: str
|
|
343
|
-
|
|
344
|
-
class SkillArgs(TypedDict):
|
|
345
|
-
# The exact skill name from the available skills list.
|
|
346
|
-
name: str
|
|
347
|
-
# Additional keys beyond those declared are allowed.
|
|
348
|
-
|
|
349
|
-
class SkillOutputResourceBase1(TypedDict):
|
|
350
|
-
kind: Literal["directory"]
|
|
351
|
-
path: str
|
|
352
|
-
|
|
353
|
-
class SkillOutputResourceBase2(TypedDict):
|
|
354
|
-
kind: Literal["url"]
|
|
355
|
-
url: str
|
|
356
|
-
|
|
357
|
-
class SkillOutputResourceBase3(TypedDict):
|
|
358
|
-
kind: Literal["opaque"]
|
|
359
|
-
description: str
|
|
360
|
-
|
|
361
|
-
class SkillOutput(TypedDict):
|
|
362
|
-
name: str
|
|
363
|
-
provider: str
|
|
364
|
-
resourceBase: NotRequired[SkillOutputResourceBase1 | SkillOutputResourceBase2 | SkillOutputResourceBase3]
|
|
365
|
-
content: str
|
|
366
|
-
|
|
367
|
-
class SubagentArgs(TypedDict):
|
|
368
|
-
# A short (3-5 word) description of the delegated task, for display.
|
|
369
|
-
description: str
|
|
370
|
-
# The complete, self-contained task for the subagent. It does not share this conversation's context, so include everything it needs.
|
|
371
|
-
prompt: str
|
|
372
|
-
# Whether to run in the background and return a durable subagent id immediately. Defaults to true. Set false to wait for the result when your next action depends on it.
|
|
373
|
-
run_in_background: NotRequired[bool]
|
|
374
|
-
# Additional keys beyond those declared are allowed.
|
|
375
|
-
|
|
376
|
-
class SubagentOutput1(TypedDict):
|
|
377
|
-
kind: Literal["background"]
|
|
378
|
-
jobId: str
|
|
379
|
-
|
|
380
|
-
class SubagentOutput2(TypedDict):
|
|
381
|
-
kind: Literal["continuable"]
|
|
382
|
-
subagentId: str
|
|
383
|
-
|
|
384
|
-
class SubagentOutput3(TypedDict):
|
|
385
|
-
kind: Literal["foreground"]
|
|
386
|
-
runId: str
|
|
387
|
-
output: list[Any]
|
|
388
|
-
|
|
389
|
-
class SubagentForkArgs(TypedDict):
|
|
390
|
-
# A short (3-5 word) description of the delegated task, for display.
|
|
391
|
-
description: str
|
|
392
|
-
# The task for the subagent. It already sees this conversation's completed turns, so build on them freely and state only what is new.
|
|
393
|
-
prompt: str
|
|
394
|
-
# Whether to run in the background and return a durable subagent id immediately. Defaults to true. Set false to wait for the result when your next action depends on it.
|
|
395
|
-
run_in_background: NotRequired[bool]
|
|
396
|
-
# Additional keys beyond those declared are allowed.
|
|
397
|
-
|
|
398
|
-
class SubagentForkOutput1(TypedDict):
|
|
399
|
-
kind: Literal["background"]
|
|
400
|
-
jobId: str
|
|
401
|
-
|
|
402
|
-
class SubagentForkOutput2(TypedDict):
|
|
403
|
-
kind: Literal["continuable"]
|
|
404
|
-
subagentId: str
|
|
405
|
-
|
|
406
|
-
class SubagentForkOutput3(TypedDict):
|
|
407
|
-
kind: Literal["foreground"]
|
|
408
|
-
runId: str
|
|
409
|
-
output: list[Any]
|
|
410
|
-
|
|
411
|
-
class TodoWriteArgsTodos(TypedDict):
|
|
412
|
-
# What the task is — a short imperative line.
|
|
413
|
-
content: str
|
|
414
|
-
# pending (not started) | in_progress (now) | completed (done).
|
|
415
|
-
status: Literal["pending", "in_progress", "completed"]
|
|
416
|
-
|
|
417
|
-
class TodoWriteArgs(TypedDict):
|
|
418
|
-
# The COMPLETE task list, replacing any previous list.
|
|
419
|
-
todos: list[TodoWriteArgsTodos]
|
|
420
|
-
# Additional keys beyond those declared are allowed.
|
|
421
|
-
|
|
422
|
-
class TodoWriteOutputTodos(TypedDict):
|
|
423
|
-
content: str
|
|
424
|
-
status: Literal["pending", "in_progress", "completed"]
|
|
425
|
-
|
|
426
|
-
class TodoWriteOutputCounts(TypedDict):
|
|
427
|
-
pending: int
|
|
428
|
-
inProgress: int
|
|
429
|
-
completed: int
|
|
430
|
-
|
|
431
|
-
class TodoWriteOutput(TypedDict):
|
|
432
|
-
todos: list[TodoWriteOutputTodos]
|
|
433
|
-
counts: TodoWriteOutputCounts
|
|
434
|
-
|
|
435
|
-
class UpdateGoalArgs(TypedDict):
|
|
436
|
-
# Exact id returned by get_goal.
|
|
437
|
-
goal_id: str
|
|
438
|
-
# Exact positive revision returned by get_goal.
|
|
439
|
-
revision: float
|
|
440
|
-
# edit | pause | resume | complete | blocked
|
|
441
|
-
action: Literal["edit", "pause", "resume", "complete", "blocked"]
|
|
442
|
-
# Replacement objective; valid only with action edit.
|
|
443
|
-
objective: NotRequired[str]
|
|
444
|
-
# Replacement cap; valid only with action edit.
|
|
445
|
-
max_goal_rounds: NotRequired[float]
|
|
446
|
-
# Concrete blocking condition; required only with action blocked.
|
|
447
|
-
blocked_reason: NotRequired[str]
|
|
448
|
-
# Additional keys beyond those declared are allowed.
|
|
449
|
-
|
|
450
|
-
class UpdateGoalOutput1(TypedDict):
|
|
451
|
-
goal: None
|
|
452
|
-
|
|
453
|
-
class UpdateGoalOutput2GoalBlockedReason(TypedDict):
|
|
454
|
-
code: str
|
|
455
|
-
message: str
|
|
456
|
-
|
|
457
|
-
class UpdateGoalOutput2Goal(TypedDict):
|
|
458
|
-
id: str
|
|
459
|
-
revision: int
|
|
460
|
-
objective: str
|
|
461
|
-
phase: Literal["active", "paused", "blocked", "complete"]
|
|
462
|
-
roundsStarted: int
|
|
463
|
-
maxGoalRounds: int
|
|
464
|
-
blockedReason: NotRequired[UpdateGoalOutput2GoalBlockedReason]
|
|
465
|
-
|
|
466
|
-
class UpdateGoalOutput2(TypedDict):
|
|
467
|
-
goal: UpdateGoalOutput2Goal
|
|
468
|
-
activation: Literal["armed", "disarmed"]
|
|
469
|
-
|
|
470
|
-
class WebSearchArgs(TypedDict):
|
|
471
|
-
# Required search queries; accepts 1–4 items and merges their results.
|
|
472
|
-
queries: list[str]
|
|
473
|
-
# Additional keys beyond those declared are allowed.
|
|
474
|
-
|
|
475
|
-
class WebSearchOutputSources(TypedDict):
|
|
476
|
-
url: str
|
|
477
|
-
title: NotRequired[str]
|
|
478
|
-
snippet: NotRequired[str]
|
|
479
|
-
publishedAt: NotRequired[str]
|
|
480
|
-
|
|
481
|
-
class WebSearchOutput(TypedDict):
|
|
482
|
-
content: NotRequired[str]
|
|
483
|
-
sources: list[WebSearchOutputSources]
|
|
484
|
-
truncated: bool
|
|
485
|
-
|
|
486
|
-
class WorkflowArgsMetaPhases(TypedDict):
|
|
487
|
-
# The phase title phase() calls match by exact string.
|
|
488
|
-
title: str
|
|
489
|
-
# Optional one-line description of the phase.
|
|
490
|
-
detail: NotRequired[str]
|
|
491
|
-
# Optional provider override this phase is expected to use.
|
|
492
|
-
provider: NotRequired[str]
|
|
493
|
-
# Optional model override this phase is expected to use.
|
|
494
|
-
model: NotRequired[str]
|
|
495
|
-
# Additional keys beyond those declared are allowed.
|
|
496
|
-
|
|
497
|
-
class WorkflowArgsMeta(TypedDict):
|
|
498
|
-
# Short kebab-case workflow name.
|
|
499
|
-
name: str
|
|
500
|
-
# One-line description of what the workflow does.
|
|
501
|
-
description: str
|
|
502
|
-
# Optional guidance on when this workflow applies.
|
|
503
|
-
whenToUse: NotRequired[str]
|
|
504
|
-
# Optional phase declarations matched by phase() calls.
|
|
505
|
-
phases: NotRequired[list[WorkflowArgsMetaPhases]]
|
|
506
|
-
# Additional keys beyond those declared are allowed.
|
|
507
|
-
|
|
508
|
-
class WorkflowArgs(TypedDict):
|
|
509
|
-
# The plain-JS workflow script body (top-level await allowed; NO `export const meta` statement; end with `return <json-value>`).
|
|
510
|
-
script: str
|
|
511
|
-
# The workflow identity block (plain JSON — never code).
|
|
512
|
-
meta: WorkflowArgsMeta
|
|
513
|
-
# Optional JSON input exposed to the script as the `args` global (wrap a bare list as a field, e.g. {"files": [...]}).
|
|
514
|
-
args: NotRequired[dict[str, Any]]
|
|
515
|
-
# Additional keys beyond those declared are allowed.
|
|
516
|
-
|
|
517
|
-
class WorkflowOutput(TypedDict):
|
|
518
|
-
runId: str
|
|
519
|
-
agentsStarted: int
|
|
520
|
-
result: Any
|
|
521
|
-
|
|
522
|
-
class WriteArgs(TypedDict):
|
|
523
|
-
# Path to write, resolved by the filesystem backend.
|
|
524
|
-
file_path: str
|
|
525
|
-
# Full UTF-8 text content to write.
|
|
526
|
-
content: str
|
|
527
|
-
# The wider sandbox mode this file operation needs. Only valid as a one-shot retry of an operation the sandbox just denied; requires justification and user approval.
|
|
528
|
-
sandbox_permissions: NotRequired[Literal["workspace-write", "danger-full-access"]]
|
|
529
|
-
# Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access.
|
|
530
|
-
justification: NotRequired[str]
|
|
531
|
-
# Additional keys beyond those declared are allowed.
|
|
532
|
-
|
|
533
|
-
class WriteOutput(TypedDict):
|
|
534
|
-
path: str
|
|
535
|
-
operation: Literal["create", "update"]
|
|
536
|
-
before: str | None
|
|
537
|
-
after: str
|
|
538
|
-
|
|
539
|
-
class Tools(Protocol):
|
|
540
|
-
async def ask_user_question(self, args: AskUserQuestionArgs) -> AskUserQuestionOutput:
|
|
541
|
-
"""Ask the user a concise question when you need confirmation, a choice, or missing information before proceeding. Send one or more questions, each with a stable id that will be echoed in the answer."""
|
|
542
|
-
async def bash(self, args: BashArgs) -> BashOutput1 | BashOutput2:
|
|
543
|
-
"""Execute a bash command (`bash -c`) and return its stdout/stderr. Each call runs in a fresh shell: no state (cwd, variables, functions) persists between calls — pass `workdir` instead of using `cd`. Non-zero exits are reported as `[exit code: N]`. Current harness environment facts are exposed through managed `$DSH_*` variables; inspect them when needed. Commands may run under a file sandbox; a blocked file operation is reported as `[sandbox: file access denied under <mode> mode]` — a policy denial, not a bug in the command; do not retry another way. Long output is truncated to its tail; the full output is saved to a file whose path is reported when available. Set `run_in_background: true` for long-running commands: the call returns a job id immediately; read its output with `job_output` and stop it with `job_kill`. Attempting a command the sandbox may deny is safe and expected: run it and read the marker rather than assuming the denial. When a command is denied and a wider mode would let it succeed, escalate immediately in the same turn — the one sanctioned exception to a denial: retry the exact same command once with `sandbox_permissions` (the narrowest wider mode that suffices) plus a one-sentence `justification`. Do not detour through chat to ask permission first — the approval prompt raised by that retry is how the user consents. If the session states approval prompts are disabled, there is no exception: a denial is final — do not set `sandbox_permissions`. Never escalate speculatively: ground the request in a real denial — normally the one this command just hit; escalating up front is fine only when this session already denied the same access. A rejected escalation is final for that command — stop and explain, never work around it — but it does not forbid attempting or escalating other commands later."""
|
|
544
|
-
async def create_goal(self, args: CreateGoalArgs) -> CreateGoalOutput1 | CreateGoalOutput2:
|
|
545
|
-
"""Create one persisted same-session completion goal when the current direct human request is a long-running objective that should continue across autonomous goal rounds. You may infer that intent without requiring the user to say \"create a goal\". Do not use this for trivial single-turn work. Execution rejects non-human and subagent authority."""
|
|
546
|
-
async def edit(self, args: EditArgs) -> EditOutput:
|
|
547
|
-
"""Edit an existing UTF-8 text file by replacing literal text."""
|
|
548
|
-
async def exit_plan_mode(self, args: ExitPlanModeArgs) -> ExitPlanModeOutput:
|
|
549
|
-
"""Use only in plan mode. Present your plan for the user's review and, on approval, leave plan mode. Send the COMPLETE plan as markdown, starting with a # heading that names it. The user may approve (carry out the plan from your next step) or keep planning — their feedback comes back in the tool result; revise and present again."""
|
|
550
|
-
async def get_goal(self, args: dict[str, Any]) -> GetGoalOutput1 | GetGoalOutput2:
|
|
551
|
-
"""Read the current same-session goal, including its exact id/revision, objective, phase, completed continuation rounds, round limit, blocker reason when present, and whether another continuation is armed. Call this before updating a goal."""
|
|
552
|
-
async def glob(self, args: GlobArgs) -> GlobOutput:
|
|
553
|
-
"""Find files whose paths match a glob pattern. Returns matching file paths — never directories — including hidden and ignored files (VCS metadata directories are excluded). Up to 100 paths come back in modification-time order; a larger result returns the first 100 paths in modification-time order, says so, and reports where the complete sorted list was saved. This tool does not enumerate directory entries."""
|
|
554
|
-
async def grep(self, args: GrepArgs) -> GrepOutput:
|
|
555
|
-
"""Search file contents with a ripgrep regular expression. Returns matching lines with line numbers, grouped by file. Returns the first 250 matches inline; a capped result reports where the complete match list was saved. Use read on a matched file for surrounding context."""
|
|
556
|
-
async def interrupt_agent(self, args: InterruptAgentArgs) -> InterruptAgentOutput:
|
|
557
|
-
"""Request cancellation of a background agent's current turn by its agent id. The target may be your direct child or a deeper agent created under you. Only the current turn stops: messages already queued for the agent stay parked until a later send_message, agents it started keep running, and the agent itself stays available for follow-ups. This call returns as soon as the stop request is accepted, so the target may keep running briefly; interrupting an agent that already finished is an accepted no-op."""
|
|
558
|
-
async def job_kill(self, args: JobKillArgs) -> JobKillOutput:
|
|
559
|
-
"""Request cancellation of a running background job by job id. Returns immediately; the job settles as killed once its work actually stops."""
|
|
560
|
-
async def job_list(self, args: dict[str, Any]) -> list[JobListOutput]:
|
|
561
|
-
"""List your background jobs (running and finished) with their ids, kinds, and statuses."""
|
|
562
|
-
async def job_output(self, args: JobOutputArgs) -> JobOutputOutput:
|
|
563
|
-
"""Read a background job. Stream jobs return only output since the previous read; final-output jobs return their result after settlement. Every response ends with `[status: ...]`. Reads are non-blocking unless `wait: true`, which waits up to the configured cap."""
|
|
564
|
-
async def list_agents(self, args: ListAgentsArgs) -> list[ListAgentsOutput1 | ListAgentsOutput2]:
|
|
565
|
-
"""List your continuable background subagents by durable id and label. Use it to recall which ones you started, not to poll for completion — you are told when one finishes. Status comes from the live registry: running means the agent is working right now, idle means it is loaded but between turns (it may be waiting on agents it started), and ready means it exists only in storage — resumable, not terminal, and not a result waiting to be collected; a `send_message` starts a new turn on the same conversation, and a direct child remains a `send_message` candidate in every status. The snapshot is not a delivery promise — `send_message` performs the authoritative check and may still fail. Children that could not be read are reported as diagnostics instead of being silently dropped. Scope `descendants` walks the whole tree below you in stable pre-order, annotating each entry with its durable direct-parent session id and depth. You may use `send_message` only for depth-1 entries; deeper entries are candidates for `interrupt_agent` only."""
|
|
566
|
-
async def ralph(self, args: RalphArgs) -> RalphOutput:
|
|
567
|
-
"""Run a foreground fresh-agent Ralph loop toward one immutable objective. Use only when the direct human explicitly asks for Ralph or fresh-agent iteration. Each round opens a new child with no parent conversation or prior child session; the shared workspace is long-term memory, and only a bounded structured report crosses rounds. The call returns when a worker reports completion or a concrete blocker, or at the round limit. Ordinary long-running same-session work belongs to goal tools."""
|
|
568
|
-
async def read(self, args: ReadArgs) -> ReadOutput:
|
|
569
|
-
"""Read a UTF-8 text file and return line-numbered content."""
|
|
570
|
-
async def read_image(self, args: ReadImageArgs) -> ReadImageOutput:
|
|
571
|
-
"""Read a PNG/JPEG/WebP/GIF file and return the image itself. Harness validates and downscales large supported images before the next model request, so use this tool directly instead of installing image libraries or creating thumbnails merely to inspect an image. Independent files may be read concurrently in small batches. Requires the current model to accept image input."""
|
|
572
|
-
async def send_message(self, args: SendMessageArgs) -> SendMessageOutput:
|
|
573
|
-
"""Send a message to a background subagent by its subagent id, continuing the same conversation. It becomes the subagent's next turn: if it is still working, the message waits until its current turn finishes, so it cannot redirect work already underway. This call returns no answer from the subagent — only confirmation that the message was delivered — so use it to give it more work. A failure means the message was NOT delivered."""
|
|
574
|
-
async def skill(self, args: SkillArgs) -> SkillOutput:
|
|
575
|
-
"""Load the full instructions for an available skill. Call this with the exact skill name from the session skill catalog before acting on a task that names or clearly matches that skill."""
|
|
576
|
-
async def subagent(self, args: SubagentArgs) -> SubagentOutput1 | SubagentOutput2 | SubagentOutput3:
|
|
577
|
-
"""Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This tool runs in the background by default, immediately returns a durable subagent id, and keeps the child conversation available for later turns. When that run settles, the runtime sends the parent a notice containing its outcome and any final assistant message; `send_message` starts a later turn in the same child conversation. Set `run_in_background: false` only when your next action depends on receiving the result."""
|
|
578
|
-
async def subagent_fork(self, args: SubagentForkArgs) -> SubagentForkOutput1 | SubagentForkOutput2 | SubagentForkOutput3:
|
|
579
|
-
"""Delegate a task to a subagent that inherits this conversation: a child agent seeded with all completed turns so far (it does not see the current in-flight turn). Use this when the subtask builds on this conversation's context — a follow-up analysis, a review, a continuation — without consuming this conversation's context for the work itself. You receive its result, not its intermediate steps. This tool runs in the background by default, immediately returns a durable subagent id, and keeps the child conversation available for later turns. When that run settles, the runtime sends the parent a notice containing its outcome and any final assistant message; `send_message` starts a later turn in the same child conversation. Set `run_in_background: false` only when your next action depends on receiving the result."""
|
|
580
|
-
async def todo_write(self, args: TodoWriteArgs) -> TodoWriteOutput:
|
|
581
|
-
"""Record and update a structured task list for the current work. Send the ENTIRE list every call — it REPLACES the previous list (there are no partial updates, no per-item edits). Use it to plan multi-step work and show progress: add one todo per concrete step before you start. Mark every todo being actively worked on `in_progress` — several at once when work genuinely runs in parallel (e.g. concurrent subagents or background commands), one for sequential work; while work remains, at least one task should be `in_progress`. Mark a todo `completed` the moment it is done (do not batch completions), and allow no `in_progress` item only once all work is complete. Skip the list for trivial single-step tasks. Statuses: `pending` (not started), `in_progress` (being worked on now), `completed` (finished)."""
|
|
582
|
-
async def update_goal(self, args: UpdateGoalArgs) -> UpdateGoalOutput1 | UpdateGoalOutput2:
|
|
583
|
-
"""Update the exact current goal revision. edit, pause, and resume require a direct top-level human request. During an automatic continuation of the current goal, complete and blocked are also allowed. blocked is rejected before the configured minimum round count; the model remains responsible for judging that the same condition persisted across those rounds and must explain it in blocked_reason."""
|
|
584
|
-
async def web_search(self, args: WebSearchArgs) -> WebSearchOutput:
|
|
585
|
-
"""Search the web for current information. Provide 1–4 queries in the required queries array. Returns an optional summary answer and a list of source URLs."""
|
|
586
|
-
async def workflow(self, args: WorkflowArgs) -> WorkflowOutput:
|
|
587
|
-
"""Run a JavaScript workflow script that orchestrates subagents at scale. Use this for work that fans out across many independent pieces — an audit over many files, a migration, multi-angle research, adversarial verification of findings — where you write the orchestration as a script instead of delegating turn by turn. The workflow's identity rides the `meta` parameter as JSON: required `name` (short kebab-case) and `description` strings, optional `whenToUse` string and `phases` array (`{title, detail?, provider?, model?}`). The `script` parameter is the plain JavaScript body ONLY (NOT TypeScript, and NO `export const meta` statement — meta is a parameter, not code), running with top-level await; end with `return <value>` — the value must be JSON-serializable and is this tool's result. Script-body hooks: - `agent(prompt, opts?): Promise<any>` — run one subagent to completion. Without `opts.schema` it resolves to the child's final text; with `opts.schema` (an object-rooted JSON Schema using ONLY type/properties/required/additionalProperties/items/enum/const/oneOf — no pattern/format/numeric bounds) it resolves to the validated object. Resolves `null` when the child fails (filter with `.filter(Boolean)`). Other opts: `label` (display), `phase` (progress group), and independent `provider`/`model` LLM target overrides (either may be provided alone). Anything else (`effort`/`isolation`/`agentType`) is rejected loudly. - `pipeline(items, ...stages): Promise<any[]>` — run each item through the stages independently with NO barrier between stages (prefer this for multi-stage work). Each stage receives `(prev, item, index)`. An ordinary stage throw drops that ITEM to `null` and skips its remaining stages. - `parallel(thunks): Promise<any[]>` — run zero-argument functions concurrently and await ALL of them (a barrier; use only when a stage genuinely needs every prior result together). A throwing thunk resolves to `null`. - `phase(title)` — start a progress phase; `log(message)` — narrate progress; `args` — the tool call's `args` input, verbatim. Misused hooks (bad arguments, unknown options, unsupported schemas, tripped caps) throw errors that ALWAYS kill the script — they never dissolve into a per-item `null`. Constraints: concurrency and total-agent caps apply; no filesystem, network, timers, or Node.js APIs are provided — the agents do the work, the script only coordinates them. The run executes in the foreground: this call returns when the whole script finishes."""
|
|
588
|
-
async def write(self, args: WriteArgs) -> WriteOutput:
|
|
589
|
-
"""Create or fully replace a UTF-8 text file."""
|
|
590
|
-
|
|
591
|
-
tools: Tools
|
|
592
|
-
```
|