@chances-ai/engine 24.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/dist/agents/discover.d.ts +30 -0
- package/dist/agents/discover.d.ts.map +1 -0
- package/dist/agents/discover.js +183 -0
- package/dist/agents/discover.js.map +1 -0
- package/dist/agents/index.d.ts +20 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +52 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/parse.d.ts +61 -0
- package/dist/agents/parse.d.ts.map +1 -0
- package/dist/agents/parse.js +527 -0
- package/dist/agents/parse.js.map +1 -0
- package/dist/agents/types.d.ts +52 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +8 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/ai/adapters/ai-sdk-stream.d.ts +19 -0
- package/dist/ai/adapters/ai-sdk-stream.d.ts.map +1 -0
- package/dist/ai/adapters/ai-sdk-stream.js +125 -0
- package/dist/ai/adapters/ai-sdk-stream.js.map +1 -0
- package/dist/ai/adapters/ai-sdk.d.ts +56 -0
- package/dist/ai/adapters/ai-sdk.d.ts.map +1 -0
- package/dist/ai/adapters/ai-sdk.js +112 -0
- package/dist/ai/adapters/ai-sdk.js.map +1 -0
- package/dist/ai/adapters/mock.d.ts +13 -0
- package/dist/ai/adapters/mock.d.ts.map +1 -0
- package/dist/ai/adapters/mock.js +54 -0
- package/dist/ai/adapters/mock.js.map +1 -0
- package/dist/ai/adapters/openai-compatible.d.ts +23 -0
- package/dist/ai/adapters/openai-compatible.d.ts.map +1 -0
- package/dist/ai/adapters/openai-compatible.js +45 -0
- package/dist/ai/adapters/openai-compatible.js.map +1 -0
- package/dist/ai/cost.d.ts +3 -0
- package/dist/ai/cost.d.ts.map +1 -0
- package/dist/ai/cost.js +5 -0
- package/dist/ai/cost.js.map +1 -0
- package/dist/ai/index.d.ts +12 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +11 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/known-models.d.ts +20 -0
- package/dist/ai/known-models.d.ts.map +1 -0
- package/dist/ai/known-models.js +129 -0
- package/dist/ai/known-models.js.map +1 -0
- package/dist/ai/registry.d.ts +12 -0
- package/dist/ai/registry.d.ts.map +1 -0
- package/dist/ai/registry.js +24 -0
- package/dist/ai/registry.js.map +1 -0
- package/dist/ai/retry.d.ts +11 -0
- package/dist/ai/retry.d.ts.map +1 -0
- package/dist/ai/retry.js +14 -0
- package/dist/ai/retry.js.map +1 -0
- package/dist/ai/router.d.ts +25 -0
- package/dist/ai/router.d.ts.map +1 -0
- package/dist/ai/router.js +36 -0
- package/dist/ai/router.js.map +1 -0
- package/dist/ai/setup.d.ts +23 -0
- package/dist/ai/setup.d.ts.map +1 -0
- package/dist/ai/setup.js +47 -0
- package/dist/ai/setup.js.map +1 -0
- package/dist/ai/summarizer.d.ts +24 -0
- package/dist/ai/summarizer.d.ts.map +1 -0
- package/dist/ai/summarizer.js +56 -0
- package/dist/ai/summarizer.js.map +1 -0
- package/dist/ai/types.d.ts +83 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +2 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/core/compaction/circuit-breaker.d.ts +32 -0
- package/dist/core/compaction/circuit-breaker.d.ts.map +1 -0
- package/dist/core/compaction/circuit-breaker.js +42 -0
- package/dist/core/compaction/circuit-breaker.js.map +1 -0
- package/dist/core/compaction/compactor.d.ts +75 -0
- package/dist/core/compaction/compactor.d.ts.map +1 -0
- package/dist/core/compaction/compactor.js +261 -0
- package/dist/core/compaction/compactor.js.map +1 -0
- package/dist/core/compaction/estimate.d.ts +39 -0
- package/dist/core/compaction/estimate.d.ts.map +1 -0
- package/dist/core/compaction/estimate.js +74 -0
- package/dist/core/compaction/estimate.js.map +1 -0
- package/dist/core/compaction/index.d.ts +5 -0
- package/dist/core/compaction/index.d.ts.map +1 -0
- package/dist/core/compaction/index.js +5 -0
- package/dist/core/compaction/index.js.map +1 -0
- package/dist/core/compaction/prune.d.ts +43 -0
- package/dist/core/compaction/prune.d.ts.map +1 -0
- package/dist/core/compaction/prune.js +51 -0
- package/dist/core/compaction/prune.js.map +1 -0
- package/dist/core/engine.d.ts +268 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +767 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/task-tool.d.ts +175 -0
- package/dist/core/task-tool.d.ts.map +1 -0
- package/dist/core/task-tool.js +901 -0
- package/dist/core/task-tool.js.map +1 -0
- package/dist/core/workspace-query.d.ts +83 -0
- package/dist/core/workspace-query.d.ts.map +1 -0
- package/dist/core/workspace-query.js +217 -0
- package/dist/core/workspace-query.js.map +1 -0
- package/dist/core/worktree/active-marker.d.ts +31 -0
- package/dist/core/worktree/active-marker.d.ts.map +1 -0
- package/dist/core/worktree/active-marker.js +109 -0
- package/dist/core/worktree/active-marker.js.map +1 -0
- package/dist/core/worktree/create.d.ts +40 -0
- package/dist/core/worktree/create.d.ts.map +1 -0
- package/dist/core/worktree/create.js +121 -0
- package/dist/core/worktree/create.js.map +1 -0
- package/dist/core/worktree/errors.d.ts +7 -0
- package/dist/core/worktree/errors.d.ts.map +1 -0
- package/dist/core/worktree/errors.js +11 -0
- package/dist/core/worktree/errors.js.map +1 -0
- package/dist/core/worktree/gc.d.ts +39 -0
- package/dist/core/worktree/gc.d.ts.map +1 -0
- package/dist/core/worktree/gc.js +146 -0
- package/dist/core/worktree/gc.js.map +1 -0
- package/dist/core/worktree/git.d.ts +53 -0
- package/dist/core/worktree/git.d.ts.map +1 -0
- package/dist/core/worktree/git.js +166 -0
- package/dist/core/worktree/git.js.map +1 -0
- package/dist/core/worktree/index.d.ts +8 -0
- package/dist/core/worktree/index.d.ts.map +1 -0
- package/dist/core/worktree/index.js +8 -0
- package/dist/core/worktree/index.js.map +1 -0
- package/dist/core/worktree/paths.d.ts +26 -0
- package/dist/core/worktree/paths.d.ts.map +1 -0
- package/dist/core/worktree/paths.js +57 -0
- package/dist/core/worktree/paths.js.map +1 -0
- package/dist/core/worktree/slug.d.ts +6 -0
- package/dist/core/worktree/slug.d.ts.map +1 -0
- package/dist/core/worktree/slug.js +21 -0
- package/dist/core/worktree/slug.js.map +1 -0
- package/dist/local-vault/file-store.d.ts +64 -0
- package/dist/local-vault/file-store.d.ts.map +1 -0
- package/dist/local-vault/file-store.js +225 -0
- package/dist/local-vault/file-store.js.map +1 -0
- package/dist/local-vault/index.d.ts +57 -0
- package/dist/local-vault/index.d.ts.map +1 -0
- package/dist/local-vault/index.js +68 -0
- package/dist/local-vault/index.js.map +1 -0
- package/dist/local-vault/keychain.d.ts +58 -0
- package/dist/local-vault/keychain.d.ts.map +1 -0
- package/dist/local-vault/keychain.js +200 -0
- package/dist/local-vault/keychain.js.map +1 -0
- package/dist/local-vault/mutex.d.ts +20 -0
- package/dist/local-vault/mutex.d.ts.map +1 -0
- package/dist/local-vault/mutex.js +44 -0
- package/dist/local-vault/mutex.js.map +1 -0
- package/dist/local-vault/passphrase.d.ts +30 -0
- package/dist/local-vault/passphrase.d.ts.map +1 -0
- package/dist/local-vault/passphrase.js +72 -0
- package/dist/local-vault/passphrase.js.map +1 -0
- package/dist/lsp/config.d.ts +34 -0
- package/dist/lsp/config.d.ts.map +1 -0
- package/dist/lsp/config.js +68 -0
- package/dist/lsp/config.js.map +1 -0
- package/dist/lsp/detect.d.ts +7 -0
- package/dist/lsp/detect.d.ts.map +1 -0
- package/dist/lsp/detect.js +78 -0
- package/dist/lsp/detect.js.map +1 -0
- package/dist/lsp/errors.d.ts +11 -0
- package/dist/lsp/errors.d.ts.map +1 -0
- package/dist/lsp/errors.js +11 -0
- package/dist/lsp/errors.js.map +1 -0
- package/dist/lsp/formatters.d.ts +147 -0
- package/dist/lsp/formatters.d.ts.map +1 -0
- package/dist/lsp/formatters.js +259 -0
- package/dist/lsp/formatters.js.map +1 -0
- package/dist/lsp/index.d.ts +31 -0
- package/dist/lsp/index.d.ts.map +1 -0
- package/dist/lsp/index.js +31 -0
- package/dist/lsp/index.js.map +1 -0
- package/dist/lsp/instance.d.ts +72 -0
- package/dist/lsp/instance.d.ts.map +1 -0
- package/dist/lsp/instance.js +489 -0
- package/dist/lsp/instance.js.map +1 -0
- package/dist/lsp/lazy-load.d.ts +27 -0
- package/dist/lsp/lazy-load.d.ts.map +1 -0
- package/dist/lsp/lazy-load.js +57 -0
- package/dist/lsp/lazy-load.js.map +1 -0
- package/dist/lsp/manager.d.ts +59 -0
- package/dist/lsp/manager.d.ts.map +1 -0
- package/dist/lsp/manager.js +242 -0
- package/dist/lsp/manager.js.map +1 -0
- package/dist/lsp/ops.d.ts +13 -0
- package/dist/lsp/ops.d.ts.map +1 -0
- package/dist/lsp/ops.js +225 -0
- package/dist/lsp/ops.js.map +1 -0
- package/dist/lsp/rpc.d.ts +47 -0
- package/dist/lsp/rpc.d.ts.map +1 -0
- package/dist/lsp/rpc.js +134 -0
- package/dist/lsp/rpc.js.map +1 -0
- package/dist/lsp/safe-uri.d.ts +18 -0
- package/dist/lsp/safe-uri.d.ts.map +1 -0
- package/dist/lsp/safe-uri.js +96 -0
- package/dist/lsp/safe-uri.js.map +1 -0
- package/dist/lsp/types.d.ts +70 -0
- package/dist/lsp/types.d.ts.map +1 -0
- package/dist/lsp/types.js +16 -0
- package/dist/lsp/types.js.map +1 -0
- package/dist/mcp/bridge.d.ts +57 -0
- package/dist/mcp/bridge.d.ts.map +1 -0
- package/dist/mcp/bridge.js +98 -0
- package/dist/mcp/bridge.js.map +1 -0
- package/dist/mcp/category.d.ts +22 -0
- package/dist/mcp/category.d.ts.map +1 -0
- package/dist/mcp/category.js +11 -0
- package/dist/mcp/category.js.map +1 -0
- package/dist/mcp/client.d.ts +228 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +352 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/content.d.ts +86 -0
- package/dist/mcp/content.d.ts.map +1 -0
- package/dist/mcp/content.js +147 -0
- package/dist/mcp/content.js.map +1 -0
- package/dist/mcp/env.d.ts +19 -0
- package/dist/mcp/env.d.ts.map +1 -0
- package/dist/mcp/env.js +50 -0
- package/dist/mcp/env.js.map +1 -0
- package/dist/mcp/host.d.ts +199 -0
- package/dist/mcp/host.d.ts.map +1 -0
- package/dist/mcp/host.js +530 -0
- package/dist/mcp/host.js.map +1 -0
- package/dist/mcp/index.d.ts +18 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +17 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/load-mcp-host.d.ts +32 -0
- package/dist/mcp/load-mcp-host.d.ts.map +1 -0
- package/dist/mcp/load-mcp-host.js +49 -0
- package/dist/mcp/load-mcp-host.js.map +1 -0
- package/dist/mcp/oauth/callback-server.d.ts +73 -0
- package/dist/mcp/oauth/callback-server.d.ts.map +1 -0
- package/dist/mcp/oauth/callback-server.js +280 -0
- package/dist/mcp/oauth/callback-server.js.map +1 -0
- package/dist/mcp/oauth/config-hash.d.ts +24 -0
- package/dist/mcp/oauth/config-hash.d.ts.map +1 -0
- package/dist/mcp/oauth/config-hash.js +55 -0
- package/dist/mcp/oauth/config-hash.js.map +1 -0
- package/dist/mcp/oauth/error-normalize.d.ts +39 -0
- package/dist/mcp/oauth/error-normalize.d.ts.map +1 -0
- package/dist/mcp/oauth/error-normalize.js +91 -0
- package/dist/mcp/oauth/error-normalize.js.map +1 -0
- package/dist/mcp/oauth/provider.d.ts +190 -0
- package/dist/mcp/oauth/provider.d.ts.map +1 -0
- package/dist/mcp/oauth/provider.js +305 -0
- package/dist/mcp/oauth/provider.js.map +1 -0
- package/dist/mcp/oauth/refresh-coalescer.d.ts +46 -0
- package/dist/mcp/oauth/refresh-coalescer.d.ts.map +1 -0
- package/dist/mcp/oauth/refresh-coalescer.js +77 -0
- package/dist/mcp/oauth/refresh-coalescer.js.map +1 -0
- package/dist/mcp/oauth/sdk-shapes.d.ts +77 -0
- package/dist/mcp/oauth/sdk-shapes.d.ts.map +1 -0
- package/dist/mcp/oauth/sdk-shapes.js +21 -0
- package/dist/mcp/oauth/sdk-shapes.js.map +1 -0
- package/dist/mcp/parse.d.ts +28 -0
- package/dist/mcp/parse.d.ts.map +1 -0
- package/dist/mcp/parse.js +209 -0
- package/dist/mcp/parse.js.map +1 -0
- package/dist/mcp/prompts.d.ts +31 -0
- package/dist/mcp/prompts.d.ts.map +1 -0
- package/dist/mcp/prompts.js +71 -0
- package/dist/mcp/prompts.js.map +1 -0
- package/dist/mcp/redact.d.ts +62 -0
- package/dist/mcp/redact.d.ts.map +1 -0
- package/dist/mcp/redact.js +87 -0
- package/dist/mcp/redact.js.map +1 -0
- package/dist/mcp/resources.d.ts +70 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +170 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/types.d.ts +123 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +2 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/memory/frontmatter.d.ts +18 -0
- package/dist/memory/frontmatter.d.ts.map +1 -0
- package/dist/memory/frontmatter.js +81 -0
- package/dist/memory/frontmatter.js.map +1 -0
- package/dist/memory/index.d.ts +5 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +5 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/store.d.ts +44 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +237 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/memory/tools.d.ts +11 -0
- package/dist/memory/tools.d.ts.map +1 -0
- package/dist/memory/tools.js +159 -0
- package/dist/memory/tools.js.map +1 -0
- package/dist/memory/types.d.ts +32 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +20 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/plugin-api/index.d.ts +167 -0
- package/dist/plugin-api/index.d.ts.map +1 -0
- package/dist/plugin-api/index.js +151 -0
- package/dist/plugin-api/index.js.map +1 -0
- package/dist/plugin-logger/index.d.ts +21 -0
- package/dist/plugin-logger/index.d.ts.map +1 -0
- package/dist/plugin-logger/index.js +59 -0
- package/dist/plugin-logger/index.js.map +1 -0
- package/dist/session/index.d.ts +125 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +202 -0
- package/dist/session/index.js.map +1 -0
- package/dist/tools/approval.d.ts +33 -0
- package/dist/tools/approval.d.ts.map +1 -0
- package/dist/tools/approval.js +53 -0
- package/dist/tools/approval.js.map +1 -0
- package/dist/tools/builtins/_shared.d.ts +94 -0
- package/dist/tools/builtins/_shared.d.ts.map +1 -0
- package/dist/tools/builtins/_shared.js +246 -0
- package/dist/tools/builtins/_shared.js.map +1 -0
- package/dist/tools/builtins/ask-user-question.d.ts +27 -0
- package/dist/tools/builtins/ask-user-question.d.ts.map +1 -0
- package/dist/tools/builtins/ask-user-question.js +191 -0
- package/dist/tools/builtins/ask-user-question.js.map +1 -0
- package/dist/tools/builtins/bash.d.ts +3 -0
- package/dist/tools/builtins/bash.d.ts.map +1 -0
- package/dist/tools/builtins/bash.js +158 -0
- package/dist/tools/builtins/bash.js.map +1 -0
- package/dist/tools/builtins/diff.d.ts +3 -0
- package/dist/tools/builtins/diff.d.ts.map +1 -0
- package/dist/tools/builtins/diff.js +83 -0
- package/dist/tools/builtins/diff.js.map +1 -0
- package/dist/tools/builtins/edit.d.ts +3 -0
- package/dist/tools/builtins/edit.d.ts.map +1 -0
- package/dist/tools/builtins/edit.js +40 -0
- package/dist/tools/builtins/edit.js.map +1 -0
- package/dist/tools/builtins/glob.d.ts +3 -0
- package/dist/tools/builtins/glob.d.ts.map +1 -0
- package/dist/tools/builtins/glob.js +37 -0
- package/dist/tools/builtins/glob.js.map +1 -0
- package/dist/tools/builtins/grep.d.ts +3 -0
- package/dist/tools/builtins/grep.d.ts.map +1 -0
- package/dist/tools/builtins/grep.js +81 -0
- package/dist/tools/builtins/grep.js.map +1 -0
- package/dist/tools/builtins/lsp.d.ts +3 -0
- package/dist/tools/builtins/lsp.d.ts.map +1 -0
- package/dist/tools/builtins/lsp.js +102 -0
- package/dist/tools/builtins/lsp.js.map +1 -0
- package/dist/tools/builtins/pty.d.ts +64 -0
- package/dist/tools/builtins/pty.d.ts.map +1 -0
- package/dist/tools/builtins/pty.js +536 -0
- package/dist/tools/builtins/pty.js.map +1 -0
- package/dist/tools/builtins/read.d.ts +3 -0
- package/dist/tools/builtins/read.d.ts.map +1 -0
- package/dist/tools/builtins/read.js +18 -0
- package/dist/tools/builtins/read.js.map +1 -0
- package/dist/tools/builtins/web-fetch.d.ts +4 -0
- package/dist/tools/builtins/web-fetch.d.ts.map +1 -0
- package/dist/tools/builtins/web-fetch.js +353 -0
- package/dist/tools/builtins/web-fetch.js.map +1 -0
- package/dist/tools/builtins/write.d.ts +3 -0
- package/dist/tools/builtins/write.d.ts.map +1 -0
- package/dist/tools/builtins/write.js +48 -0
- package/dist/tools/builtins/write.js.map +1 -0
- package/dist/tools/builtins.d.ts +9 -0
- package/dist/tools/builtins.d.ts.map +1 -0
- package/dist/tools/builtins.js +29 -0
- package/dist/tools/builtins.js.map +1 -0
- package/dist/tools/diff.d.ts +18 -0
- package/dist/tools/diff.d.ts.map +1 -0
- package/dist/tools/diff.js +57 -0
- package/dist/tools/diff.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +9 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/permission.d.ts +120 -0
- package/dist/tools/permission.d.ts.map +1 -0
- package/dist/tools/permission.js +208 -0
- package/dist/tools/permission.js.map +1 -0
- package/dist/tools/registry.d.ts +12 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +19 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +244 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +15 -0
- package/dist/tools/types.js.map +1 -0
- package/package.json +109 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_shared.js","sourceRoot":"","sources":["../../../src/tools/builtins/_shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { JSONValue } from "@chances-ai/runtime";
|
|
2
|
+
import { type QuestionSpec, type Tool } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* (5.10b) Pure validation of the model's args into typed {@link QuestionSpec}[].
|
|
5
|
+
* Schema-locked (counts + types) with uniqueness refines on question texts and
|
|
6
|
+
* per-question option labels. Returns a typed result so the engine path AND a
|
|
7
|
+
* unit test both assert it without a TTY (the `reduceModelPicker` convention).
|
|
8
|
+
* NB: `packages/tools` intentionally has NO zod dependency — every builtin
|
|
9
|
+
* hand-rolls its arg validation, so the asker does too.
|
|
10
|
+
*/
|
|
11
|
+
export declare function parseQuestions(args: JSONValue): {
|
|
12
|
+
ok: true;
|
|
13
|
+
questions: QuestionSpec[];
|
|
14
|
+
} | {
|
|
15
|
+
ok: false;
|
|
16
|
+
error: string;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* (5.10b) `ask_user_question` — let the model ask the user a structured,
|
|
20
|
+
* select-don't-type question and wait for the answer. Read-only (`search`): it
|
|
21
|
+
* has no side effect beyond presenting a chooser, so it is the ONE tool allowed
|
|
22
|
+
* on the question permission channel (the engine fail-closes any other tool that
|
|
23
|
+
* emits a `question` request). Headless / `-p` / RPC have no UI → the resolver
|
|
24
|
+
* declines and we return a deterministic message.
|
|
25
|
+
*/
|
|
26
|
+
export declare const askUserQuestionTool: Tool;
|
|
27
|
+
//# sourceMappingURL=ask-user-question.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-user-question.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/ask-user-question.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,IAAI,EAGV,MAAM,aAAa,CAAC;AAiBrB;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,SAAS,GACd;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,YAAY,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CA6DxE;AAkBD;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,EAAE,IA6EjC,CAAC"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { ASK_USER_QUESTION_TOOL_NAME, } from "../types.js";
|
|
2
|
+
// (5.10b) Schema-locked bounds — mirror claude-code's AskUserQuestion (1–4
|
|
3
|
+
// questions, 2–4 options, short header). The model declares the options; the UI
|
|
4
|
+
// injects the "Other" free-text row itself (the model never declares it).
|
|
5
|
+
const MIN_QUESTIONS = 1;
|
|
6
|
+
const MAX_QUESTIONS = 4;
|
|
7
|
+
const MIN_OPTIONS = 2;
|
|
8
|
+
const MAX_OPTIONS = 4;
|
|
9
|
+
const MAX_HEADER = 16;
|
|
10
|
+
// (codex R2 SHOULD-FIX #2) Upper bound on an option label. The schema asks for
|
|
11
|
+
// 1–5 words; we enforce a length cap (UI safety — a runaway label breaks the tab
|
|
12
|
+
// / list layout) but deliberately NOT word count or a trailing "?" on questions:
|
|
13
|
+
// those are prose guidelines, not correctness constraints (rejecting "Choose an
|
|
14
|
+
// approach:" would be over-strict and would silently drop a valid question).
|
|
15
|
+
const MAX_LABEL = 60;
|
|
16
|
+
/**
|
|
17
|
+
* (5.10b) Pure validation of the model's args into typed {@link QuestionSpec}[].
|
|
18
|
+
* Schema-locked (counts + types) with uniqueness refines on question texts and
|
|
19
|
+
* per-question option labels. Returns a typed result so the engine path AND a
|
|
20
|
+
* unit test both assert it without a TTY (the `reduceModelPicker` convention).
|
|
21
|
+
* NB: `packages/tools` intentionally has NO zod dependency — every builtin
|
|
22
|
+
* hand-rolls its arg validation, so the asker does too.
|
|
23
|
+
*/
|
|
24
|
+
export function parseQuestions(args) {
|
|
25
|
+
if (typeof args !== "object" || args === null || Array.isArray(args)) {
|
|
26
|
+
return { ok: false, error: "args must be an object" };
|
|
27
|
+
}
|
|
28
|
+
const raw = args.questions;
|
|
29
|
+
if (!Array.isArray(raw))
|
|
30
|
+
return { ok: false, error: "`questions` must be an array" };
|
|
31
|
+
if (raw.length < MIN_QUESTIONS || raw.length > MAX_QUESTIONS) {
|
|
32
|
+
return { ok: false, error: `\`questions\` must have ${MIN_QUESTIONS}–${MAX_QUESTIONS} items` };
|
|
33
|
+
}
|
|
34
|
+
const questions = [];
|
|
35
|
+
const seenQuestions = new Set();
|
|
36
|
+
for (const q of raw) {
|
|
37
|
+
if (typeof q !== "object" || q === null)
|
|
38
|
+
return { ok: false, error: "each question must be an object" };
|
|
39
|
+
const obj = q;
|
|
40
|
+
const question = obj.question;
|
|
41
|
+
const header = obj.header;
|
|
42
|
+
if (typeof question !== "string" || question.trim() === "") {
|
|
43
|
+
return { ok: false, error: "`question` must be a non-empty string" };
|
|
44
|
+
}
|
|
45
|
+
if (typeof header !== "string" || header.trim() === "" || header.length > MAX_HEADER) {
|
|
46
|
+
return { ok: false, error: `\`header\` must be a non-empty string ≤${MAX_HEADER} chars` };
|
|
47
|
+
}
|
|
48
|
+
if (seenQuestions.has(question))
|
|
49
|
+
return { ok: false, error: `duplicate question: "${question}"` };
|
|
50
|
+
seenQuestions.add(question);
|
|
51
|
+
const options = obj.options;
|
|
52
|
+
if (!Array.isArray(options) || options.length < MIN_OPTIONS || options.length > MAX_OPTIONS) {
|
|
53
|
+
return { ok: false, error: `each question needs ${MIN_OPTIONS}–${MAX_OPTIONS} options` };
|
|
54
|
+
}
|
|
55
|
+
const parsedOptions = [];
|
|
56
|
+
const seenLabels = new Set();
|
|
57
|
+
for (const o of options) {
|
|
58
|
+
if (typeof o !== "object" || o === null)
|
|
59
|
+
return { ok: false, error: "each option must be an object" };
|
|
60
|
+
const oo = o;
|
|
61
|
+
const label = oo.label;
|
|
62
|
+
if (typeof label !== "string" || label.trim() === "") {
|
|
63
|
+
return { ok: false, error: "option `label` must be a non-empty string" };
|
|
64
|
+
}
|
|
65
|
+
if (label.length > MAX_LABEL) {
|
|
66
|
+
return { ok: false, error: `option \`label\` must be ≤${MAX_LABEL} chars (keep choices concise)` };
|
|
67
|
+
}
|
|
68
|
+
if (seenLabels.has(label)) {
|
|
69
|
+
return { ok: false, error: `duplicate option label "${label}" in question "${question}"` };
|
|
70
|
+
}
|
|
71
|
+
seenLabels.add(label);
|
|
72
|
+
const description = typeof oo.description === "string" ? oo.description : undefined;
|
|
73
|
+
const preview = typeof oo.preview === "string" ? oo.preview : undefined;
|
|
74
|
+
parsedOptions.push({
|
|
75
|
+
label,
|
|
76
|
+
...(description ? { description } : {}),
|
|
77
|
+
...(preview ? { preview } : {}),
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
const multiSelect = typeof obj.multiSelect === "boolean" ? obj.multiSelect : undefined;
|
|
81
|
+
questions.push({
|
|
82
|
+
question,
|
|
83
|
+
header,
|
|
84
|
+
options: parsedOptions,
|
|
85
|
+
...(multiSelect !== undefined ? { multiSelect } : {}),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return { ok: true, questions };
|
|
89
|
+
}
|
|
90
|
+
/** (5.10b) Render the user's answers as a single model-facing string. The TOOL
|
|
91
|
+
* owns this wording (the engine never serializes answers) — mirrors claude-code's
|
|
92
|
+
* `mapToolResultToToolResultBlockParam`. */
|
|
93
|
+
function formatAnswers(questions, decision) {
|
|
94
|
+
const lines = questions.map((q) => {
|
|
95
|
+
const picked = decision.answers[q.question];
|
|
96
|
+
const joined = picked && picked.length > 0 ? picked.map((a) => `"${a}"`).join(", ") : "(no answer)";
|
|
97
|
+
return `- "${q.question}" → ${joined}`;
|
|
98
|
+
});
|
|
99
|
+
const notes = questions
|
|
100
|
+
.map((q) => decision.annotations?.[q.question]?.notes)
|
|
101
|
+
.filter((n) => typeof n === "string" && n.trim() !== "");
|
|
102
|
+
const noteBlock = notes.length > 0 ? `\n\nNotes: ${notes.join(" | ")}` : "";
|
|
103
|
+
return `User has answered the question(s):\n${lines.join("\n")}${noteBlock}`;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* (5.10b) `ask_user_question` — let the model ask the user a structured,
|
|
107
|
+
* select-don't-type question and wait for the answer. Read-only (`search`): it
|
|
108
|
+
* has no side effect beyond presenting a chooser, so it is the ONE tool allowed
|
|
109
|
+
* on the question permission channel (the engine fail-closes any other tool that
|
|
110
|
+
* emits a `question` request). Headless / `-p` / RPC have no UI → the resolver
|
|
111
|
+
* declines and we return a deterministic message.
|
|
112
|
+
*/
|
|
113
|
+
export const askUserQuestionTool = {
|
|
114
|
+
name: ASK_USER_QUESTION_TOOL_NAME,
|
|
115
|
+
description: "Ask the user one or more multiple-choice questions and wait for their answer. " +
|
|
116
|
+
"Use when a decision is genuinely the user's to make and you can't resolve it from " +
|
|
117
|
+
"the request, the code, or sensible defaults — e.g. choosing between approaches, or " +
|
|
118
|
+
"clarifying ambiguous requirements. Each question has 2–4 mutually-exclusive options; " +
|
|
119
|
+
"set multiSelect to allow several. Do NOT add an 'Other' option — the UI adds it. " +
|
|
120
|
+
"Prefer proceeding with a sensible default over asking when the choice is obvious.",
|
|
121
|
+
category: "search",
|
|
122
|
+
parameters: {
|
|
123
|
+
type: "object",
|
|
124
|
+
properties: {
|
|
125
|
+
questions: {
|
|
126
|
+
type: "array",
|
|
127
|
+
minItems: MIN_QUESTIONS,
|
|
128
|
+
maxItems: MAX_QUESTIONS,
|
|
129
|
+
description: "1–4 questions to ask the user.",
|
|
130
|
+
items: {
|
|
131
|
+
type: "object",
|
|
132
|
+
properties: {
|
|
133
|
+
question: { type: "string", description: "The complete question, ending with '?'." },
|
|
134
|
+
header: { type: "string", description: `Short tab/chip label (≤${MAX_HEADER} chars).` },
|
|
135
|
+
multiSelect: { type: "boolean", description: "Allow selecting multiple options (default false)." },
|
|
136
|
+
options: {
|
|
137
|
+
type: "array",
|
|
138
|
+
minItems: MIN_OPTIONS,
|
|
139
|
+
maxItems: MAX_OPTIONS,
|
|
140
|
+
description: "2–4 mutually-exclusive choices. Do not include an 'Other' option.",
|
|
141
|
+
items: {
|
|
142
|
+
type: "object",
|
|
143
|
+
properties: {
|
|
144
|
+
label: { type: "string", description: "Concise choice (1–5 words)." },
|
|
145
|
+
description: { type: "string", description: "What this option means / its trade-offs." },
|
|
146
|
+
preview: { type: "string", description: "Optional Markdown preview shown beside the list." },
|
|
147
|
+
},
|
|
148
|
+
required: ["label"],
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
required: ["question", "header", "options"],
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
required: ["questions"],
|
|
157
|
+
},
|
|
158
|
+
summarize(args) {
|
|
159
|
+
const parsed = parseQuestions(args);
|
|
160
|
+
return parsed.ok ? `ask: ${parsed.questions[0].header}` : "ask: (invalid args)";
|
|
161
|
+
},
|
|
162
|
+
permission(args) {
|
|
163
|
+
const parsed = parseQuestions(args);
|
|
164
|
+
// Invalid args: return null so the engine bypasses the question channel and
|
|
165
|
+
// runs execute(), which surfaces the validation error to the model (rather
|
|
166
|
+
// than presenting an empty/garbage chooser).
|
|
167
|
+
if (!parsed.ok)
|
|
168
|
+
return null;
|
|
169
|
+
return {
|
|
170
|
+
kind: "question",
|
|
171
|
+
name: ASK_USER_QUESTION_TOOL_NAME,
|
|
172
|
+
category: "search",
|
|
173
|
+
questions: parsed.questions,
|
|
174
|
+
};
|
|
175
|
+
},
|
|
176
|
+
async execute(args, ctx) {
|
|
177
|
+
const parsed = parseQuestions(args);
|
|
178
|
+
if (!parsed.ok) {
|
|
179
|
+
return { ok: false, output: `Invalid ask_user_question args: ${parsed.error}` };
|
|
180
|
+
}
|
|
181
|
+
const decision = ctx.questionDecision;
|
|
182
|
+
// No decision (only reachable via the invalid-args null-bypass, defensive) OR
|
|
183
|
+
// an explicit decline (user cancelled, or a non-interactive resolver) ⇒ a
|
|
184
|
+
// deterministic "declined" result.
|
|
185
|
+
if (!decision || decision.declined) {
|
|
186
|
+
return { ok: true, output: "User declined to answer the question(s)." };
|
|
187
|
+
}
|
|
188
|
+
return { ok: true, output: formatAnswers(parsed.questions, decision) };
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
//# sourceMappingURL=ask-user-question.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-user-question.js","sourceRoot":"","sources":["../../../src/tools/builtins/ask-user-question.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/bash.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,aAAa,CAAC;AA4GpD,eAAO,MAAM,QAAQ,EAAE,IAiEtB,CAAC"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { native } from "@chances-ai/native";
|
|
2
|
+
import { cleanOutput, optNum, persistFullOutput, str } from "./_shared.js";
|
|
3
|
+
/**
|
|
4
|
+
* `bash` runs a shell command in a real PTY when the native addon is
|
|
5
|
+
* loaded — programs see `isatty(stdout) === true`, signals propagate to
|
|
6
|
+
* the process group with a 100 ms grace before SIGKILL. When the addon is
|
|
7
|
+
* missing (binary not staged for the host platform yet) the facade falls
|
|
8
|
+
* back to `child_process.spawn`; the user-visible contract is the same,
|
|
9
|
+
* minus the PTY semantics.
|
|
10
|
+
*
|
|
11
|
+
* Output handling is modelled on claude-code's bash tool: ANSI codes are
|
|
12
|
+
* stripped before the model sees the body (they're tokens of noise for an
|
|
13
|
+
* LLM); when the stripped body would exceed `INLINE_OUTPUT_BYTES`, the
|
|
14
|
+
* full payload is persisted to a per-call file under
|
|
15
|
+
* `.chances/tool-results/` and the inline preview points at it. Per-call
|
|
16
|
+
* `timeout` defaults to 2 min and caps at 10 min (also claude-code
|
|
17
|
+
* defaults — long enough for builds and tests, short enough to fail loud
|
|
18
|
+
* on a hung command).
|
|
19
|
+
*/
|
|
20
|
+
/** Default 2 min, max 10 min — claude-code's `BASH_DEFAULT_TIMEOUT_MS` /
|
|
21
|
+
* `BASH_MAX_TIMEOUT_MS` (timeouts.ts:2-39). The model can override per
|
|
22
|
+
* call via the `timeout` arg (in seconds). */
|
|
23
|
+
const DEFAULT_TIMEOUT_MS = 120_000;
|
|
24
|
+
const MAX_TIMEOUT_MS = 600_000;
|
|
25
|
+
/** Inline payload cap. Larger outputs get persisted; matches claude-code's
|
|
26
|
+
* `BASH_MAX_OUTPUT_LENGTH` default of 30 000 chars. */
|
|
27
|
+
const INLINE_OUTPUT_BYTES = 30_000;
|
|
28
|
+
/** ANSI / OSC / DCS stripper + line-ending normaliser moved to
|
|
29
|
+
* `_shared.ts` in 5.1 so the new `pty` registry can apply the same
|
|
30
|
+
* scrubber before bus emit. Original family-of-escape-codes design
|
|
31
|
+
* notes live there. */
|
|
32
|
+
function clampTimeoutMs(timeoutSec) {
|
|
33
|
+
if (timeoutSec === undefined)
|
|
34
|
+
return DEFAULT_TIMEOUT_MS;
|
|
35
|
+
const ms = Math.floor(timeoutSec * 1000);
|
|
36
|
+
if (!Number.isFinite(ms) || ms <= 0)
|
|
37
|
+
return DEFAULT_TIMEOUT_MS;
|
|
38
|
+
return Math.min(ms, MAX_TIMEOUT_MS);
|
|
39
|
+
}
|
|
40
|
+
/** Persistence helper extracted to `_shared.ts` in 5.1. Same 0o700 dir
|
|
41
|
+
* + 0o600 file POSIX permissions, same Windows caveat (Node `mode`
|
|
42
|
+
* only affects the read-only bit there — explicit DACL hardening is a
|
|
43
|
+
* follow-up). */
|
|
44
|
+
/** Format the final tool body. Layout when oversized:
|
|
45
|
+
* `<status prefix line, if any>`
|
|
46
|
+
* `[output truncated: showing first 30 KB of 123 KB; full output saved to <path>]`
|
|
47
|
+
* `<inline preview>`
|
|
48
|
+
*
|
|
49
|
+
* The truncation banner is the first thing after any status prefix so
|
|
50
|
+
* the model can tell at a glance whether it's looking at the full
|
|
51
|
+
* payload or a head.
|
|
52
|
+
*
|
|
53
|
+
* **`runtimeDropped` is the Rust layer's `outputTruncatedBytes`** —
|
|
54
|
+
* bytes dropped at the 64 MiB Rust ceiling BEFORE the JS layer ever
|
|
55
|
+
* sees them. The banner has to surface this honestly: if we said
|
|
56
|
+
* "full output saved to <path>" while the runtime already silently
|
|
57
|
+
* dropped 10 GB, the model would assume the persisted file is the
|
|
58
|
+
* whole story. Round 3 codex SHOULD-FIX. */
|
|
59
|
+
function formatBody(cleaned, workspaceRoot, runtimeDropped, callId) {
|
|
60
|
+
if (cleaned.length <= INLINE_OUTPUT_BYTES && runtimeDropped === 0) {
|
|
61
|
+
return { body: cleaned, persistedPath: null, persistedSize: null };
|
|
62
|
+
}
|
|
63
|
+
const inlineBytes = INLINE_OUTPUT_BYTES;
|
|
64
|
+
const totalBytes = cleaned.length;
|
|
65
|
+
const head = cleaned.length > inlineBytes ? cleaned.slice(0, inlineBytes) : cleaned;
|
|
66
|
+
const headStr = (Math.min(inlineBytes, cleaned.length) / 1024).toFixed(0);
|
|
67
|
+
const totalStr = (totalBytes / 1024).toFixed(0);
|
|
68
|
+
// Caveat for the model if the runtime layer ALREADY dropped bytes —
|
|
69
|
+
// the persisted file isn't actually the full story in that case.
|
|
70
|
+
const runtimeNote = runtimeDropped > 0
|
|
71
|
+
? `; runtime also dropped ${(runtimeDropped / (1024 * 1024)).toFixed(1)} MiB past the 64 MiB cap (NOT included in the persisted file)`
|
|
72
|
+
: "";
|
|
73
|
+
// If the cleaned body fits inline AND the only signal is runtime
|
|
74
|
+
// drop, we can return the inline body with just a one-line warning
|
|
75
|
+
// (no persistence needed — the cleaned body IS the full visible
|
|
76
|
+
// story, we just want the model to know it's incomplete).
|
|
77
|
+
if (cleaned.length <= inlineBytes) {
|
|
78
|
+
return {
|
|
79
|
+
body: `[runtime dropped ${(runtimeDropped / (1024 * 1024)).toFixed(1)} MiB past the 64 MiB cap]\n${cleaned}`,
|
|
80
|
+
persistedPath: null,
|
|
81
|
+
persistedSize: null,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
const persistedPath = persistFullOutput(workspaceRoot, cleaned, "bash", "output.txt", callId);
|
|
85
|
+
const banner = persistedPath
|
|
86
|
+
? `[output truncated: showing first ${headStr} KB of ${totalStr} KB; full output saved to ${persistedPath}${runtimeNote}]`
|
|
87
|
+
: `[output truncated: showing first ${headStr} KB of ${totalStr} KB; persistence failed, remainder dropped${runtimeNote}]`;
|
|
88
|
+
return {
|
|
89
|
+
body: `${banner}\n${head}`,
|
|
90
|
+
persistedPath,
|
|
91
|
+
persistedSize: totalBytes,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
export const bashTool = {
|
|
95
|
+
name: "bash",
|
|
96
|
+
description: "Run a shell command via a real PTY (ANSI passthrough at the runtime layer; output is stripped of escape codes before being returned to you to save tokens). Output is capped at 30 KB inline; longer outputs are persisted to .chances/tool-results/<id>/output.txt and the inline preview includes the path. Default timeout 120 s, max 600 s. Cancelled / timed-out runs return ok:false with a status prefix.",
|
|
97
|
+
category: "shell",
|
|
98
|
+
parameters: {
|
|
99
|
+
type: "object",
|
|
100
|
+
properties: {
|
|
101
|
+
command: { type: "string", description: "Shell command to execute" },
|
|
102
|
+
timeout: {
|
|
103
|
+
type: "number",
|
|
104
|
+
description: "Optional per-call timeout in seconds (default 120, max 600).",
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
required: ["command"],
|
|
108
|
+
},
|
|
109
|
+
summarize: (args) => `bash: ${str(args, "command")}`,
|
|
110
|
+
async execute(args, ctx) {
|
|
111
|
+
const command = str(args, "command");
|
|
112
|
+
const timeoutMs = clampTimeoutMs(optNum(args, "timeout"));
|
|
113
|
+
const result = await native.ptyRun({
|
|
114
|
+
command,
|
|
115
|
+
cwd: ctx.cwd,
|
|
116
|
+
signal: ctx.signal,
|
|
117
|
+
timeoutMs,
|
|
118
|
+
});
|
|
119
|
+
// A bash command can mutate anything (mv/rm/build/codegen) and we can't
|
|
120
|
+
// tell what, so drop the WHOLE shared fs-scan cache — a path-scoped
|
|
121
|
+
// invalidate would miss files the command created elsewhere ([10.4] /
|
|
122
|
+
// design §8: bash = full-clear).
|
|
123
|
+
native.invalidateFsScanCache();
|
|
124
|
+
const cleaned = cleanOutput(result.output);
|
|
125
|
+
// (4.1 Round-2 SHOULD-FIX #4) Persist oversized output to the
|
|
126
|
+
// PARENT workspace's `.chances/tool-results/...` when we're inside
|
|
127
|
+
// an isolated subagent — the worktree may be removed after the
|
|
128
|
+
// task finishes (clean exit), which would invalidate any path
|
|
129
|
+
// surfaced to the model. Outside isolation, `parentWorkspaceRoot`
|
|
130
|
+
// equals `workspaceRoot`, so this is a no-op.
|
|
131
|
+
const persistRoot = ctx.parentWorkspaceRoot ?? ctx.workspaceRoot;
|
|
132
|
+
const { body } = formatBody(cleaned, persistRoot, result.outputTruncatedBytes, ctx.callId);
|
|
133
|
+
// Status prefix is what the model reads first — must be unambiguous.
|
|
134
|
+
// Order matters: cancel beats timeout beats non-zero exit, because a
|
|
135
|
+
// user-initiated cancel might race with a timeout and the user
|
|
136
|
+
// intent is the more informative attribution.
|
|
137
|
+
if (result.cancelled) {
|
|
138
|
+
return { ok: false, output: prefix("(cancelled)", body) };
|
|
139
|
+
}
|
|
140
|
+
if (result.timedOut) {
|
|
141
|
+
return {
|
|
142
|
+
ok: false,
|
|
143
|
+
output: prefix(`(timed out after ${(timeoutMs / 1000).toFixed(0)}s)`, body),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
if (result.exitCode === 0) {
|
|
147
|
+
return { ok: true, output: body || "(no output)" };
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
ok: false,
|
|
151
|
+
output: prefix(`(exit ${result.exitCode ?? "unknown"})`, body),
|
|
152
|
+
};
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
function prefix(status, body) {
|
|
156
|
+
return body.length === 0 ? status : `${status}\n${body}`;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=bash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../src/tools/builtins/bash.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/diff.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,aAAa,CAAC;AAKpD,eAAO,MAAM,QAAQ,EAAE,IA6EtB,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { diffStats, linesDiff } from "../diff.js";
|
|
3
|
+
import { PREVIEW_BYTE_CAP, optNum, optStr, safePath, str } from "./_shared.js";
|
|
4
|
+
const DIFF_DEFAULT_MAX_LINES = 60;
|
|
5
|
+
export const diffTool = {
|
|
6
|
+
name: "diff",
|
|
7
|
+
description: "Compare two workspace files, or a workspace file vs inline content, and return a unified-style preview. Use this to see what a proposed change would look like before calling 'write' or 'edit'. Exactly one of 'pathB' or 'content' must be provided.",
|
|
8
|
+
category: "file-read",
|
|
9
|
+
parameters: {
|
|
10
|
+
type: "object",
|
|
11
|
+
properties: {
|
|
12
|
+
pathA: { type: "string", description: "Path to the baseline file (workspace-relative or absolute under the workspace root)." },
|
|
13
|
+
pathB: { type: "string", description: "Path to the comparison file. Mutually exclusive with 'content'." },
|
|
14
|
+
content: { type: "string", description: "Inline content to compare against pathA. Mutually exclusive with 'pathB'." },
|
|
15
|
+
maxLines: { type: "number", description: `Cap on diff rows in the preview. Default ${DIFF_DEFAULT_MAX_LINES}.` },
|
|
16
|
+
},
|
|
17
|
+
required: ["pathA"],
|
|
18
|
+
},
|
|
19
|
+
summarize: (args) => {
|
|
20
|
+
const pathA = str(args, "pathA");
|
|
21
|
+
const pathB = optStr(args, "pathB");
|
|
22
|
+
const content = optStr(args, "content");
|
|
23
|
+
if (pathB)
|
|
24
|
+
return `diff ${pathA} vs ${pathB}`;
|
|
25
|
+
if (content !== undefined)
|
|
26
|
+
return `diff ${pathA} vs ⟨${content.length}-byte input⟩`;
|
|
27
|
+
return `diff ${pathA}`;
|
|
28
|
+
},
|
|
29
|
+
async execute(args, ctx) {
|
|
30
|
+
const pathARaw = str(args, "pathA");
|
|
31
|
+
const pathBRaw = optStr(args, "pathB");
|
|
32
|
+
const inlineRaw = optStr(args, "content");
|
|
33
|
+
const maxLines = optNum(args, "maxLines") ?? DIFF_DEFAULT_MAX_LINES;
|
|
34
|
+
if (pathBRaw === undefined && inlineRaw === undefined) {
|
|
35
|
+
return { ok: false, output: "diff requires either 'pathB' or 'content'" };
|
|
36
|
+
}
|
|
37
|
+
if (pathBRaw !== undefined && inlineRaw !== undefined) {
|
|
38
|
+
return { ok: false, output: "diff cannot accept both 'pathB' and 'content'" };
|
|
39
|
+
}
|
|
40
|
+
const pathA = safePath(ctx, pathARaw);
|
|
41
|
+
if (!existsSync(pathA))
|
|
42
|
+
return { ok: false, output: `No such file: ${pathARaw}` };
|
|
43
|
+
const sizeA = statSync(pathA).size;
|
|
44
|
+
let after;
|
|
45
|
+
let afterLabel;
|
|
46
|
+
let afterSize;
|
|
47
|
+
if (pathBRaw !== undefined) {
|
|
48
|
+
const pathB = safePath(ctx, pathBRaw);
|
|
49
|
+
if (!existsSync(pathB))
|
|
50
|
+
return { ok: false, output: `No such file: ${pathBRaw}` };
|
|
51
|
+
afterSize = statSync(pathB).size;
|
|
52
|
+
if (sizeA > PREVIEW_BYTE_CAP || afterSize > PREVIEW_BYTE_CAP) {
|
|
53
|
+
return {
|
|
54
|
+
ok: true,
|
|
55
|
+
output: `${pathARaw} (${sizeA} bytes) vs ${pathBRaw} (${afterSize} bytes) — diff preview skipped (one side over ${PREVIEW_BYTE_CAP} bytes).`,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
after = readFileSync(pathB, "utf8");
|
|
59
|
+
afterLabel = pathBRaw;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
afterSize = inlineRaw.length;
|
|
63
|
+
if (sizeA > PREVIEW_BYTE_CAP || afterSize > PREVIEW_BYTE_CAP) {
|
|
64
|
+
return {
|
|
65
|
+
ok: true,
|
|
66
|
+
output: `${pathARaw} (${sizeA} bytes) vs ⟨inline⟩ (${afterSize} bytes) — diff preview skipped (one side over ${PREVIEW_BYTE_CAP} bytes).`,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
after = inlineRaw;
|
|
70
|
+
afterLabel = "⟨inline⟩";
|
|
71
|
+
}
|
|
72
|
+
const before = readFileSync(pathA, "utf8");
|
|
73
|
+
if (before === after)
|
|
74
|
+
return { ok: true, output: `${pathARaw} and ${afterLabel} are identical` };
|
|
75
|
+
const { removed, added } = diffStats(before, after);
|
|
76
|
+
const hunk = linesDiff(before, after, maxLines);
|
|
77
|
+
return {
|
|
78
|
+
ok: true,
|
|
79
|
+
output: `--- ${pathARaw}\n+++ ${afterLabel}\n${hunk}\n(${removed} removed, ${added} added)`,
|
|
80
|
+
};
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/tools/builtins/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/edit.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,aAAa,CAAC;AAGpD,eAAO,MAAM,QAAQ,EAAE,IA8BtB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { native } from "@chances-ai/native";
|
|
4
|
+
import { linesDiff } from "../diff.js";
|
|
5
|
+
import { preview, safePath, str } from "./_shared.js";
|
|
6
|
+
export const editTool = {
|
|
7
|
+
name: "edit",
|
|
8
|
+
description: "Replace an exact, unique substring in a workspace file.",
|
|
9
|
+
category: "file-write",
|
|
10
|
+
parameters: {
|
|
11
|
+
type: "object",
|
|
12
|
+
properties: { path: { type: "string" }, find: { type: "string" }, replace: { type: "string" } },
|
|
13
|
+
required: ["path", "find", "replace"],
|
|
14
|
+
},
|
|
15
|
+
summarize: (args) => {
|
|
16
|
+
const path = str(args, "path");
|
|
17
|
+
const find = str(args, "find");
|
|
18
|
+
const replace = str(args, "replace");
|
|
19
|
+
if (!find.includes("\n") && !replace.includes("\n")) {
|
|
20
|
+
return `edit ${path}: replace ${preview(find)} → ${preview(replace)}`;
|
|
21
|
+
}
|
|
22
|
+
return `edit ${path}\n${linesDiff(find, replace)}`;
|
|
23
|
+
},
|
|
24
|
+
async execute(args, ctx) {
|
|
25
|
+
const path = safePath(ctx, str(args, "path"), { resolveSymlinks: true });
|
|
26
|
+
if (!existsSync(path))
|
|
27
|
+
return { ok: false, output: `No such file: ${str(args, "path")}` };
|
|
28
|
+
const find = str(args, "find");
|
|
29
|
+
const content = readFileSync(path, "utf8");
|
|
30
|
+
const count = content.split(find).length - 1;
|
|
31
|
+
if (count === 0)
|
|
32
|
+
return { ok: false, output: `Substring not found in ${str(args, "path")}` };
|
|
33
|
+
if (count > 1)
|
|
34
|
+
return { ok: false, output: `Substring not unique (${count} matches)` };
|
|
35
|
+
writeFileSync(path, content.replace(find, str(args, "replace")));
|
|
36
|
+
native.invalidateFsScanCache(dirname(path));
|
|
37
|
+
return { ok: true, output: `Edited ${str(args, "path")}` };
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../src/tools/builtins/edit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/glob.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,aAAa,CAAC;AAKpD,eAAO,MAAM,QAAQ,EAAE,IAgCtB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { native } from "@chances-ai/native";
|
|
3
|
+
import { optNum, optStr, safePath, str } from "./_shared.js";
|
|
4
|
+
const GLOB_DEFAULT_LIMIT = 100;
|
|
5
|
+
export const globTool = {
|
|
6
|
+
name: "glob",
|
|
7
|
+
description: "List workspace files matching a glob pattern (e.g. '**/*.ts', 'src/**/*.tsx'). Honors common ignore directories (node_modules, .git, dist, target, .turbo).",
|
|
8
|
+
category: "search",
|
|
9
|
+
parameters: {
|
|
10
|
+
type: "object",
|
|
11
|
+
properties: {
|
|
12
|
+
pattern: { type: "string", description: "Glob pattern to match against relative file paths." },
|
|
13
|
+
path: { type: "string", description: "Sub-path within the workspace to search. Defaults to the workspace root." },
|
|
14
|
+
limit: { type: "number", description: `Max paths returned. Default ${GLOB_DEFAULT_LIMIT}.` },
|
|
15
|
+
},
|
|
16
|
+
required: ["pattern"],
|
|
17
|
+
},
|
|
18
|
+
summarize: (args) => {
|
|
19
|
+
const where = optStr(args, "path");
|
|
20
|
+
return `glob ${str(args, "pattern")}${where ? ` in ${where}` : ""}`;
|
|
21
|
+
},
|
|
22
|
+
async execute(args, ctx) {
|
|
23
|
+
const pattern = str(args, "pattern");
|
|
24
|
+
const subPath = optStr(args, "path");
|
|
25
|
+
const limit = optNum(args, "limit") ?? GLOB_DEFAULT_LIMIT;
|
|
26
|
+
const searchRoot = subPath ? safePath(ctx, subPath) : ctx.workspaceRoot;
|
|
27
|
+
if (!existsSync(searchRoot))
|
|
28
|
+
return { ok: false, output: `No such path: ${subPath}` };
|
|
29
|
+
const files = await native.glob(pattern, searchRoot, { maxResults: limit + 1, signal: ctx.signal });
|
|
30
|
+
if (files.length === 0)
|
|
31
|
+
return { ok: true, output: "No files matched" };
|
|
32
|
+
const shown = files.slice(0, limit);
|
|
33
|
+
const more = files.length > limit ? `\n…(more results, raise limit to see them)` : "";
|
|
34
|
+
return { ok: true, output: shown.join("\n") + more };
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=glob.js.map
|