import type { AnthropicToolSchema } from '../types'; /** * Slack Marketplace(`interactionOrigin: 'slack'` かつ `toolPolicy: * 'marketplace_read_only'`)の api チャットモードでのみ有効化される、読み取り専用 * ツール群(Read/Grep/Glob)。Bash 経由の grep/find には一切依存せず、Node 実装で * サンドボックス化する(確定方針1・7)。 * * `containPath` がここでの唯一のセキュリティ境界。`..` を含む相対パスの正規化と * `fs.realpath` によるシンボリックリンク解決の両方を行い、実体が sandboxRoots * (呼び出し元が渡す addDirs 相当、通常は workspace/repos・workspace/docs)の外に * 出ていないかを検証する。検証に失敗した場合やファイルが存在しない場合は例外を * 投げず、`isError: true` の結果を返す。 */ /** ツール実行結果(Anthropic tool_result ブロックへ変換する前段) */ export interface ToolExecutionOutcome { output: string; isError: boolean; } /** * Slack Marketplace の api モード向けツールスキーマを構築する。 * Claude Code の同名ツール(Read/Grep/Glob)に意味を寄せているが、実装は完全に * 独立している。 */ export declare function buildReadOnlyToolSchemas(): AnthropicToolSchema[]; /** * ReDoS(破滅的バックトラッキング)につながりやすい正規表現パターンを検出する * 軽量な静的ヒューリスティック。Grep は Slack 起点(信頼できない入力)から誘導された * パターンを受け取りうるため、`regex.test()` を walk 中の全ファイル・全行に対して * 無防備に同期実行しない(1リクエストのハングが同一 agent プロセス内の他の全チャット * /他テナントを巻き込む。過去の ReDoS 実害事例: ロギングマスキング正規表現で実測7万倍)。 * * 判定対象: * - ネストした量指定子(例: `(a+)+`, `(a*)*`, `((a+)+)+`) * - 量指定子が付いたグループ内のあいまいな選択(例: `(a|a)+`) * * 外部の正規表現解析ライブラリ(safe-regex 等)には依存せず、自前のトークナイザで * 判定する(新規重量依存を避けるため)。安全側に倒した保守的なチェックであり、 * 理論上安全なパターン(例: `(cat|dog|bird)+`)も一部誤検出しうるが、Grep ツールが * 想定する用途(単純な文字列・キーワード検索)では実用上問題にならない。 */ export declare function isDangerousRegexPattern(pattern: string): boolean; /** * exported (not just for `executeReadOnlyTool`'s internal dispatch) so tests can * exercise the real grep logic directly, same-thread. When Grep runs via the * Worker (the normal main-thread path), coverage instrumentation running in the * Jest process cannot see code executed inside the separate Worker thread's own * V8 isolate — direct calls here are what keep this logic under test coverage, * independent of (and in addition to) the worker-wiring integration tests that * go through `executeReadOnlyTool`. */ export declare function grepTool(input: Record, sandboxRoots: string[]): Promise; /** exported for the same direct-coverage reason as {@link grepTool} — see its comment. */ export declare function globTool(input: Record, sandboxRoots: string[]): Promise; /** * Slack Marketplace 読み取り専用ツール(Read/Grep/Glob)を実行する統一エントリポイント。 * 例外は投げず、常に `ToolExecutionOutcome`(isError フラグ付き)を返す。 * * Grep/Glob はメインスレッドから呼ばれた場合、`api-tool-worker-runner.ts` 経由で * Worker スレッド内で実行する(ReDoS・シンボリックリンク循環等のハングがメイン * スレッド=同一 agent プロセス内の他の全チャットを巻き込まないようにするため)。 * Worker スレッド自身の中からこの関数が呼ばれた場合(`isMainThread === false`、 * つまり Worker のブートストラップが同じこの関数を呼び出す場合)は、さらに別の * Worker を生成せず、その場で grepTool/globTool を直接実行する(無限にネストした * Worker 生成を防ぐ)。 * * `abortSignal` は Grep/Glob の Worker 実行にのみ渡される(Read はファイルサイズ * ガードで既に有界なため、キャンセル伝播の主眼ではない)。 */ export declare function executeReadOnlyTool(name: string, input: Record, sandboxRoots: string[], abortSignal?: AbortSignal): Promise; //# sourceMappingURL=api-tool-executor.d.ts.map