@wrongstack/tools 0.284.1 → 0.286.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/README.md +19 -0
- package/dist/_concurrency.d.ts +16 -0
- package/dist/_concurrency.d.ts.map +1 -0
- package/dist/_danger-detect.d.ts +54 -0
- package/dist/_danger-detect.d.ts.map +1 -0
- package/dist/_edit-match.d.ts +86 -0
- package/dist/_edit-match.d.ts.map +1 -0
- package/dist/_env.d.ts +6 -0
- package/dist/_env.d.ts.map +1 -0
- package/dist/_fetch-guard.d.ts +31 -0
- package/dist/_fetch-guard.d.ts.map +1 -0
- package/dist/_output-spool.d.ts +38 -0
- package/dist/_output-spool.d.ts.map +1 -0
- package/dist/_redact-command.d.ts +6 -0
- package/dist/_redact-command.d.ts.map +1 -0
- package/dist/_regex.d.ts +39 -0
- package/dist/_regex.d.ts.map +1 -0
- package/dist/_session-shell.d.ts +73 -0
- package/dist/_session-shell.d.ts.map +1 -0
- package/dist/_shell-pick.d.ts +158 -0
- package/dist/_shell-pick.d.ts.map +1 -0
- package/dist/_spawn-stream.d.ts +32 -0
- package/dist/_spawn-stream.d.ts.map +1 -0
- package/dist/_syntax-check.d.ts +16 -0
- package/dist/_syntax-check.d.ts.map +1 -0
- package/dist/_util.d.ts +68 -0
- package/dist/_util.d.ts.map +1 -0
- package/dist/_win32-resolve.d.ts +42 -0
- package/dist/_win32-resolve.d.ts.map +1 -0
- package/dist/audit.d.ts +4 -5
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +2743 -28
- package/dist/audit.js.map +7 -1
- package/dist/bash-kill-guard.d.ts +62 -0
- package/dist/bash-kill-guard.d.ts.map +1 -0
- package/dist/bash.d.ts +4 -5
- package/dist/bash.d.ts.map +1 -0
- package/dist/bash.js +59 -30
- package/dist/bash.js.map +7 -1
- package/dist/batch-tool-use.d.ts +4 -5
- package/dist/batch-tool-use.d.ts.map +1 -0
- package/dist/batch-tool-use.js +3 -3
- package/dist/batch-tool-use.js.map +7 -1
- package/dist/browser/artifacts.d.ts +13 -0
- package/dist/browser/artifacts.d.ts.map +1 -0
- package/dist/browser/index.d.ts +7 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +1264 -0
- package/dist/browser/index.js.map +7 -0
- package/dist/browser/manager.d.ts +57 -0
- package/dist/browser/manager.d.ts.map +1 -0
- package/dist/browser/network-guard-proxy.d.ts +23 -0
- package/dist/browser/network-guard-proxy.d.ts.map +1 -0
- package/dist/browser/security.d.ts +29 -0
- package/dist/browser/security.d.ts.map +1 -0
- package/dist/browser/tools.d.ts +62 -0
- package/dist/browser/tools.d.ts.map +1 -0
- package/dist/browser/types.d.ts +60 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/builtin.d.ts +11 -12
- package/dist/builtin.d.ts.map +1 -0
- package/dist/builtin.js +8099 -2178
- package/dist/builtin.js.map +7 -1
- package/dist/circuit-breaker.d.ts +4 -5
- package/dist/circuit-breaker.d.ts.map +1 -0
- package/dist/circuit-breaker.js +3 -3
- package/dist/circuit-breaker.js.map +7 -1
- package/dist/codebase-index/background-indexer.d.ts +116 -0
- package/dist/codebase-index/background-indexer.d.ts.map +1 -0
- package/dist/codebase-index/bm25.d.ts +40 -0
- package/dist/codebase-index/bm25.d.ts.map +1 -0
- package/dist/codebase-index/circuit-breaker.d.ts +94 -0
- package/dist/codebase-index/circuit-breaker.d.ts.map +1 -0
- package/dist/codebase-index/codebase-index-tool.d.ts +17 -0
- package/dist/codebase-index/codebase-index-tool.d.ts.map +1 -0
- package/dist/codebase-index/codebase-search-tool.d.ts +43 -0
- package/dist/codebase-index/codebase-search-tool.d.ts.map +1 -0
- package/dist/codebase-index/codebase-stats-tool.d.ts +23 -0
- package/dist/codebase-index/codebase-stats-tool.d.ts.map +1 -0
- package/dist/codebase-index/gitignore.d.ts +22 -0
- package/dist/codebase-index/gitignore.d.ts.map +1 -0
- package/dist/codebase-index/go-parser.d.ts +16 -0
- package/dist/codebase-index/go-parser.d.ts.map +1 -0
- package/dist/codebase-index/index-service.d.ts +25 -0
- package/dist/codebase-index/index-service.d.ts.map +1 -0
- package/dist/codebase-index/index.d.ts +23 -271
- package/dist/codebase-index/index.d.ts.map +1 -0
- package/dist/codebase-index/index.js +136 -68
- package/dist/codebase-index/index.js.map +7 -1
- package/dist/codebase-index/indexer.d.ts +28 -0
- package/dist/codebase-index/indexer.d.ts.map +1 -0
- package/dist/codebase-index/json-parser.d.ts +8 -0
- package/dist/codebase-index/json-parser.d.ts.map +1 -0
- package/dist/codebase-index/lsp-kind.d.ts +53 -0
- package/dist/codebase-index/lsp-kind.d.ts.map +1 -0
- package/dist/codebase-index/py-parser.d.ts +16 -0
- package/dist/codebase-index/py-parser.d.ts.map +1 -0
- package/dist/codebase-index/refs-extractor.d.ts +25 -0
- package/dist/codebase-index/refs-extractor.d.ts.map +1 -0
- package/dist/codebase-index/rs-parser.d.ts +8 -0
- package/dist/codebase-index/rs-parser.d.ts.map +1 -0
- package/dist/codebase-index/schema.d.ts +82 -0
- package/dist/codebase-index/schema.d.ts.map +1 -0
- package/dist/codebase-index/ts-parser.d.ts +30 -0
- package/dist/codebase-index/ts-parser.d.ts.map +1 -0
- package/dist/codebase-index/worker-protocol.d.ts +77 -0
- package/dist/codebase-index/worker-protocol.d.ts.map +1 -0
- package/dist/codebase-index/worker.d.ts +16 -2
- package/dist/codebase-index/worker.d.ts.map +1 -0
- package/dist/codebase-index/worker.js +103 -65
- package/dist/codebase-index/worker.js.map +7 -1
- package/dist/codebase-index/writer.d.ts +189 -0
- package/dist/codebase-index/writer.d.ts.map +1 -0
- package/dist/codebase-index/yaml-parser.d.ts +8 -0
- package/dist/codebase-index/yaml-parser.d.ts.map +1 -0
- package/dist/design.d.ts +38 -0
- package/dist/design.d.ts.map +1 -0
- package/dist/design.js +270 -0
- package/dist/design.js.map +7 -0
- package/dist/diff.d.ts +4 -5
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +14 -12
- package/dist/diff.js.map +7 -1
- package/dist/document.d.ts +4 -5
- package/dist/document.d.ts.map +1 -0
- package/dist/document.js +8 -7
- package/dist/document.js.map +7 -1
- package/dist/e2e.d.ts +56 -0
- package/dist/e2e.d.ts.map +1 -0
- package/dist/edit.d.ts +5 -36
- package/dist/edit.d.ts.map +1 -0
- package/dist/edit.js +28 -16
- package/dist/edit.js.map +7 -1
- package/dist/exec.d.ts +67 -2
- package/dist/exec.d.ts.map +1 -0
- package/dist/exec.js +51 -26
- package/dist/exec.js.map +7 -1
- package/dist/fetch.d.ts +4 -32
- package/dist/fetch.d.ts.map +1 -0
- package/dist/fetch.js +89 -77
- package/dist/fetch.js.map +7 -1
- package/dist/format.d.ts +4 -5
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +2415 -28
- package/dist/format.js.map +7 -1
- package/dist/git.d.ts +4 -5
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +10 -9
- package/dist/git.js.map +7 -1
- package/dist/glob.d.ts +4 -5
- package/dist/glob.d.ts.map +1 -0
- package/dist/glob.js +15 -12
- package/dist/glob.js.map +7 -1
- package/dist/grep.d.ts +4 -5
- package/dist/grep.d.ts.map +1 -0
- package/dist/grep.js +13 -10
- package/dist/grep.js.map +7 -1
- package/dist/index.d.ts +21 -724
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8955 -2866
- package/dist/index.js.map +7 -1
- package/dist/install.d.ts +4 -5
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +2680 -31
- package/dist/install.js.map +7 -1
- package/dist/json.d.ts +4 -5
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +13 -11
- package/dist/json.js.map +7 -1
- package/dist/kanban.d.ts +107 -0
- package/dist/kanban.d.ts.map +1 -0
- package/dist/kanban.js +845 -0
- package/dist/kanban.js.map +7 -0
- package/dist/languages/detect.d.ts +3 -0
- package/dist/languages/detect.d.ts.map +1 -0
- package/dist/languages/diagnostics.d.ts +15 -0
- package/dist/languages/diagnostics.d.ts.map +1 -0
- package/dist/languages/execute-tool.d.ts +34 -0
- package/dist/languages/execute-tool.d.ts.map +1 -0
- package/dist/languages/execute.d.ts +18 -0
- package/dist/languages/execute.d.ts.map +1 -0
- package/dist/languages/index.d.ts +12 -0
- package/dist/languages/index.d.ts.map +1 -0
- package/dist/languages/index.js +4457 -0
- package/dist/languages/index.js.map +7 -0
- package/dist/languages/legacy-bridge.d.ts +29 -0
- package/dist/languages/legacy-bridge.d.ts.map +1 -0
- package/dist/languages/package-tool.d.ts +29 -0
- package/dist/languages/package-tool.d.ts.map +1 -0
- package/dist/languages/plan.d.ts +4 -0
- package/dist/languages/plan.d.ts.map +1 -0
- package/dist/languages/profile-helpers.d.ts +14 -0
- package/dist/languages/profile-helpers.d.ts.map +1 -0
- package/dist/languages/profiles/additional.d.ts +3 -0
- package/dist/languages/profiles/additional.d.ts.map +1 -0
- package/dist/languages/profiles/primary.d.ts +3 -0
- package/dist/languages/profiles/primary.d.ts.map +1 -0
- package/dist/languages/registry.d.ts +11 -0
- package/dist/languages/registry.d.ts.map +1 -0
- package/dist/languages/tool.d.ts +32 -0
- package/dist/languages/tool.d.ts.map +1 -0
- package/dist/languages/types.d.ts +207 -0
- package/dist/languages/types.d.ts.map +1 -0
- package/dist/lint.d.ts +4 -5
- package/dist/lint.d.ts.map +1 -0
- package/dist/lint.js +2415 -27
- package/dist/lint.js.map +7 -1
- package/dist/logs.d.ts +4 -5
- package/dist/logs.d.ts.map +1 -0
- package/dist/logs.js +16 -10
- package/dist/logs.js.map +7 -1
- package/dist/memory.d.ts +7 -8
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +7 -5
- package/dist/memory.js.map +7 -1
- package/dist/mode.d.ts +4 -5
- package/dist/mode.d.ts.map +1 -0
- package/dist/mode.js +3 -3
- package/dist/mode.js.map +7 -1
- package/dist/next-steps.d.ts +5 -6
- package/dist/next-steps.d.ts.map +1 -0
- package/dist/next-steps.js +5 -4
- package/dist/next-steps.js.map +7 -1
- package/dist/outdated.d.ts +4 -5
- package/dist/outdated.d.ts.map +1 -0
- package/dist/outdated.js +4777 -68
- package/dist/outdated.js.map +7 -1
- package/dist/pack.d.ts +3 -6
- package/dist/pack.d.ts.map +1 -0
- package/dist/pack.js +8134 -2204
- package/dist/pack.js.map +7 -1
- package/dist/patch.d.ts +4 -5
- package/dist/patch.d.ts.map +1 -0
- package/dist/patch.js +18 -16
- package/dist/patch.js.map +7 -1
- package/dist/plan.d.ts +55 -0
- package/dist/plan.d.ts.map +1 -0
- package/dist/plan.js +280 -0
- package/dist/plan.js.map +7 -0
- package/dist/process-guardian.d.ts +100 -0
- package/dist/process-guardian.d.ts.map +1 -0
- package/dist/process-registry-persistent.d.ts +121 -0
- package/dist/process-registry-persistent.d.ts.map +1 -0
- package/dist/process-registry.d.ts +13 -17
- package/dist/process-registry.d.ts.map +1 -0
- package/dist/process-registry.js +15 -9
- package/dist/process-registry.js.map +7 -1
- package/dist/ps-slash.d.ts +106 -0
- package/dist/ps-slash.d.ts.map +1 -0
- package/dist/ps-slash.js +1291 -0
- package/dist/ps-slash.js.map +7 -0
- package/dist/read.d.ts +4 -5
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +13 -11
- package/dist/read.js.map +7 -1
- package/dist/replace.d.ts +4 -5
- package/dist/replace.d.ts.map +1 -0
- package/dist/replace.js +26 -13
- package/dist/replace.js.map +7 -1
- package/dist/scaffold.d.ts +4 -5
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +16 -14
- package/dist/scaffold.js.map +7 -1
- package/dist/search.d.ts +5 -6
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +32 -27
- package/dist/search.js.map +7 -1
- package/dist/set-working-dir.d.ts +18 -0
- package/dist/set-working-dir.d.ts.map +1 -0
- package/dist/shim/node-sqlite.d.ts +3 -0
- package/dist/shim/node-sqlite.d.ts.map +1 -0
- package/dist/skill.d.ts +45 -0
- package/dist/skill.d.ts.map +1 -0
- package/dist/skill.js +175 -0
- package/dist/skill.js.map +7 -0
- package/dist/spawn-background.d.ts +80 -0
- package/dist/spawn-background.d.ts.map +1 -0
- package/dist/task.d.ts +35 -0
- package/dist/task.d.ts.map +1 -0
- package/dist/task.js +380 -0
- package/dist/task.js.map +7 -0
- package/dist/test.d.ts +4 -5
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +2419 -27
- package/dist/test.js.map +7 -1
- package/dist/todo.d.ts +4 -5
- package/dist/todo.d.ts.map +1 -0
- package/dist/todo.js +5 -5
- package/dist/todo.js.map +7 -1
- package/dist/tool-diff.d.ts +16 -17
- package/dist/tool-diff.d.ts.map +1 -0
- package/dist/tool-diff.js +11 -3
- package/dist/tool-diff.js.map +7 -1
- package/dist/tool-help.d.ts +4 -5
- package/dist/tool-help.d.ts.map +1 -0
- package/dist/tool-help.js +3 -3
- package/dist/tool-help.js.map +7 -1
- package/dist/tool-icon-map.d.ts +46 -0
- package/dist/tool-icon-map.d.ts.map +1 -0
- package/dist/tool-icons.d.ts +5 -6
- package/dist/tool-icons.d.ts.map +1 -0
- package/dist/tool-icons.js +16 -4
- package/dist/tool-icons.js.map +7 -1
- package/dist/tool-search.d.ts +4 -5
- package/dist/tool-search.d.ts.map +1 -0
- package/dist/tool-search.js +3 -3
- package/dist/tool-search.js.map +7 -1
- package/dist/tool-summary.d.ts +4 -5
- package/dist/tool-summary.d.ts.map +1 -0
- package/dist/tool-summary.js +5 -3
- package/dist/tool-summary.js.map +7 -1
- package/dist/tool-use.d.ts +4 -5
- package/dist/tool-use.d.ts.map +1 -0
- package/dist/tool-use.js +3 -3
- package/dist/tool-use.js.map +7 -1
- package/dist/tree.d.ts +4 -5
- package/dist/tree.d.ts.map +1 -0
- package/dist/tree.js +11 -9
- package/dist/tree.js.map +7 -1
- package/dist/typecheck.d.ts +4 -5
- package/dist/typecheck.d.ts.map +1 -0
- package/dist/typecheck.js +2416 -28
- package/dist/typecheck.js.map +7 -1
- package/dist/write.d.ts +4 -5
- package/dist/write.d.ts.map +1 -0
- package/dist/write.js +21 -16
- package/dist/write.js.map +7 -1
- package/package.json +39 -6
- package/dist/background-indexer-BeDBxfSh.d.ts +0 -371
- package/dist/exec-2OKoT6tk.d.ts +0 -121
package/dist/todo.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import type { TodoItem, Tool } from '@wrongstack/core';
|
|
3
2
|
interface TodoInput {
|
|
4
3
|
todos: TodoItem[];
|
|
5
4
|
}
|
|
@@ -7,6 +6,6 @@ interface TodoOutput {
|
|
|
7
6
|
count: number;
|
|
8
7
|
in_progress: number;
|
|
9
8
|
}
|
|
10
|
-
declare const todoTool: Tool<TodoInput, TodoOutput>;
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
export declare const todoTool: Tool<TodoInput, TodoOutput>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=todo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todo.d.ts","sourceRoot":"","sources":["../src/todo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAIvD,UAAU,SAAS;IACjB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,CA6HhD,CAAC"}
|
package/dist/todo.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { loadPlan, setPlanItemStatus, savePlan, loadTasks, saveTasks } from '@wrongstack/core';
|
|
2
|
-
|
|
3
1
|
// src/todo.ts
|
|
2
|
+
import { loadPlan, savePlan, setPlanItemStatus } from "@wrongstack/core";
|
|
3
|
+
import { loadTasks, saveTasks } from "@wrongstack/core";
|
|
4
4
|
var todoTool = {
|
|
5
5
|
name: "todo",
|
|
6
6
|
category: "Session",
|
|
@@ -109,7 +109,7 @@ var todoTool = {
|
|
|
109
109
|
};
|
|
110
110
|
}
|
|
111
111
|
};
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
export {
|
|
113
|
+
todoTool
|
|
114
|
+
};
|
|
114
115
|
//# sourceMappingURL=todo.js.map
|
|
115
|
-
//# sourceMappingURL=todo.js.map
|
package/dist/todo.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/todo.ts"],
|
|
4
|
+
"sourcesContent": ["import type { TodoItem, Tool } from '@wrongstack/core';\nimport { loadPlan, savePlan, setPlanItemStatus } from '@wrongstack/core';\nimport { loadTasks, saveTasks } from '@wrongstack/core';\n\ninterface TodoInput {\n todos: TodoItem[];\n}\n\ninterface TodoOutput {\n count: number;\n in_progress: number;\n}\n\nexport const todoTool: Tool<TodoInput, TodoOutput> = {\n name: 'todo',\n category: 'Session',\n description:\n 'Manage the session-level todo list. This is the primary mechanism for tracking multi-step work. ' +\n 'The list is fully replaced on every call (not appended).',\n usageHint:\n 'BEST PRACTICE for complex tasks:\\n' +\n '- At the beginning of a non-trivial task, create a clear todo list with specific, actionable items.\\n' +\n '- Only **one** item should be `in_progress` at any time.\\n' +\n '- Update the list frequently as work progresses (mark items done, add new ones, change status).\\n' +\n '- **Re-order items** to reflect current priorities \u2014 the full list is replaced each call, so item order is entirely under your control.\\n' +\n '- When all items are completed the board auto-clears \u2014 you do NOT need to send an empty list.\\n' +\n '- The system and user can see this list, so keep it honest and up-to-date.\\n' +\n 'This tool is extremely valuable for maintaining focus and giving the user visibility into your plan.',\n permission: 'auto',\n mutating: false, // mutates only conversation state (ctx.todos), not external state \u2014 no confirmation needed\n timeoutMs: 1_000,\n capabilities: ['session.todo'],\n icon: 'todo',\n inputSchema: {\n type: 'object',\n properties: {\n todos: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Unique identifier for the todo item (e.g. \"1\", \"auth-flow\").',\n },\n content: {\n type: 'string',\n description: 'Clear, actionable description of the task.',\n },\n status: {\n type: 'string',\n enum: ['pending', 'in_progress', 'completed'],\n description: 'Current status. Only one item should be \"in_progress\" at a time.',\n },\n activeForm: {\n type: 'string',\n description: 'Optional present-tense form shown while the task is active (e.g. \"Fixing auth bug\").',\n },\n },\n required: ['id', 'content', 'status'],\n },\n description: 'The complete new list of todos. This replaces the previous list entirely.',\n },\n },\n required: ['todos'],\n },\n async execute(input, ctx) {\n if (!Array.isArray(input?.todos)) {\n throw new Error('todo: todos must be an array');\n }\n const items = input.todos.filter((t): t is TodoItem => Boolean(t?.id && t.content));\n const inProgress = items.filter((t) => t.status === 'in_progress');\n if (inProgress.length > 1) {\n // Keep only the first as in_progress, mark rest pending\n let seenInProgress = false;\n for (const item of items) {\n if (item.status === 'in_progress') {\n if (seenInProgress) item.status = 'pending';\n seenInProgress = true;\n }\n }\n }\n ctx.state.replaceTodos(items);\n\n // Auto-complete parent plan items / tasks when all their promoted\n // todos are done. Runs after state mutation so the UI sees the new\n // todo list before we touch the plan/task files.\n const completedPlanIds = new Set<string>();\n const completedTaskIds = new Set<string>();\n const pendingPlanIds = new Set<string>();\n const pendingTaskIds = new Set<string>();\n\n for (const item of items) {\n if (item.promotedFromPlan) {\n (item.status === 'completed' ? completedPlanIds : pendingPlanIds).add(item.promotedFromPlan);\n }\n if (item.promotedFromTask) {\n (item.status === 'completed' ? completedTaskIds : pendingTaskIds).add(item.promotedFromTask);\n }\n }\n\n // Mark fully-completed plan items as done\n for (const planId of completedPlanIds) {\n if (pendingPlanIds.has(planId)) continue; // not all done yet\n const planPath = (ctx.meta as Record<string, unknown>)['plan.path'];\n if (typeof planPath !== 'string' || !planPath) continue;\n try {\n const plan = await loadPlan(planPath);\n if (plan) {\n const updated = setPlanItemStatus(plan, planId, 'done');\n await savePlan(planPath, updated);\n }\n } catch { /* best-effort */ }\n }\n\n // Mark fully-completed tasks as completed\n for (const taskId of completedTaskIds) {\n if (pendingTaskIds.has(taskId)) continue; // not all done yet\n const taskPath = (ctx.meta as Record<string, unknown>)['task.path'];\n if (typeof taskPath !== 'string' || !taskPath) continue;\n try {\n const file = await loadTasks(taskPath);\n if (file) {\n const task = file.tasks.find((t) => t.id === taskId);\n if (task && task.status !== 'completed') {\n task.status = 'completed';\n task.updatedAt = new Date().toISOString();\n await saveTasks(taskPath, file);\n }\n }\n } catch { /* best-effort */ }\n }\n\n return {\n count: items.length,\n in_progress: items.filter((t) => t.status === 'in_progress').length,\n };\n },\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/tool-diff.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/** A single rendered diff line. */
|
|
2
|
-
type DiffRowKind = 'add' | 'del' | 'ctx' | 'meta';
|
|
3
|
-
interface DiffRow {
|
|
2
|
+
export type DiffRowKind = 'add' | 'del' | 'ctx' | 'meta';
|
|
3
|
+
export interface DiffRow {
|
|
4
4
|
kind: DiffRowKind;
|
|
5
5
|
text: string;
|
|
6
6
|
}
|
|
7
7
|
/** Extraction result: enough for a caller to render without re-inspecting input. */
|
|
8
|
-
type ToolDiff = {
|
|
8
|
+
export type ToolDiff = {
|
|
9
9
|
mode: 'lcs';
|
|
10
10
|
oldText: string;
|
|
11
11
|
newText: string;
|
|
@@ -16,7 +16,7 @@ type ToolDiff = {
|
|
|
16
16
|
caption: string;
|
|
17
17
|
};
|
|
18
18
|
/** Max lines per side before we bail out of the O(n*m) LCS table. */
|
|
19
|
-
declare const DIFF_MAX_LINES = 5000;
|
|
19
|
+
export declare const DIFF_MAX_LINES = 5000;
|
|
20
20
|
/**
|
|
21
21
|
* Recognise the edit-family tools and pull a renderable diff descriptor out of
|
|
22
22
|
* their input. Returns null when the tool doesn't carry diffable input.
|
|
@@ -24,39 +24,39 @@ declare const DIFF_MAX_LINES = 5000;
|
|
|
24
24
|
* @param toolName canonical or aliased tool name.
|
|
25
25
|
* @param input tool input — a parsed object OR a JSON string.
|
|
26
26
|
*/
|
|
27
|
-
declare function diffFromToolInput(toolName: string | undefined, input: unknown): ToolDiff | null;
|
|
27
|
+
export declare function diffFromToolInput(toolName: string | undefined, input: unknown): ToolDiff | null;
|
|
28
28
|
/**
|
|
29
29
|
* LCS-based line diff. Returns null when either side exceeds DIFF_MAX_LINES
|
|
30
30
|
* (an O(n*m) memory guard — fine for a normal edit, prohibitive for a huge
|
|
31
31
|
* generated-file rewrite).
|
|
32
32
|
*/
|
|
33
|
-
declare function computeLineDiff(oldText: string, newText: string): DiffRow[] | null;
|
|
33
|
+
export declare function computeLineDiff(oldText: string, newText: string): DiffRow[] | null;
|
|
34
34
|
/**
|
|
35
35
|
* Parse a unified-diff string into renderable rows. Hunk headers (`@@ ... @@`)
|
|
36
36
|
* and file headers (`--- `, `+++ `, `diff `, `index `) become `meta` rows; body
|
|
37
37
|
* lines map to add/del/ctx by their leading char. ``
|
|
38
38
|
* is kept as a meta row.
|
|
39
39
|
*/
|
|
40
|
-
declare function parseUnifiedDiff(patchText: string): DiffRow[];
|
|
40
|
+
export declare function parseUnifiedDiff(patchText: string): DiffRow[];
|
|
41
41
|
/**
|
|
42
42
|
* Convenience: extract + render to rows in one call. Returns null when the tool
|
|
43
43
|
* carries no diffable input, or `{ caption, rows: null }` when the diff is too
|
|
44
44
|
* large to render (LCS guard).
|
|
45
45
|
*/
|
|
46
|
-
declare function diffRowsFromToolInput(toolName: string | undefined, input: unknown): {
|
|
46
|
+
export declare function diffRowsFromToolInput(toolName: string | undefined, input: unknown): {
|
|
47
47
|
caption: string;
|
|
48
48
|
rows: DiffRow[] | null;
|
|
49
49
|
} | null;
|
|
50
50
|
/** Rich diff row: like DiffRow but with a dedicated `hunk` kind and gutters. */
|
|
51
|
-
type DiffLineKind = 'add' | 'del' | 'hunk' | 'ctx' | 'meta';
|
|
52
|
-
interface DiffLineRow {
|
|
51
|
+
export type DiffLineKind = 'add' | 'del' | 'hunk' | 'ctx' | 'meta';
|
|
52
|
+
export interface DiffLineRow {
|
|
53
53
|
kind: DiffLineKind;
|
|
54
54
|
text: string;
|
|
55
55
|
oldLine?: number | undefined;
|
|
56
56
|
newLine?: number | undefined;
|
|
57
57
|
}
|
|
58
58
|
/** A parsed unified-diff preview: rows plus visible/hidden tallies. */
|
|
59
|
-
interface DiffPreview {
|
|
59
|
+
export interface DiffPreview {
|
|
60
60
|
rows: DiffLineRow[];
|
|
61
61
|
hidden: number;
|
|
62
62
|
added: number;
|
|
@@ -69,9 +69,9 @@ interface DiffPreview {
|
|
|
69
69
|
* one-line files (minified bundles, huge JSON) flooding a consumer. Real code
|
|
70
70
|
* lines are never truncated at this length.
|
|
71
71
|
*/
|
|
72
|
-
declare const DIFF_LINE_SAFETY_CAP = 4000;
|
|
72
|
+
export declare const DIFF_LINE_SAFETY_CAP = 4000;
|
|
73
73
|
/** Truncate the middle-out: keep the head, append an ellipsis, past `max`. */
|
|
74
|
-
declare function truncMid(s: string, max: number): string;
|
|
74
|
+
export declare function truncMid(s: string, max: number): string;
|
|
75
75
|
/**
|
|
76
76
|
* Parse a unified-diff string into a {@link DiffPreview} with per-row line
|
|
77
77
|
* numbers and add/remove tallies. `maxLines` caps the visible rows; the rest
|
|
@@ -82,7 +82,6 @@ declare function truncMid(s: string, max: number): string;
|
|
|
82
82
|
* `hunk` kind (rather than folding hunk headers into `meta`) and tracks old/new
|
|
83
83
|
* line gutters, which a terminal/gutter renderer needs.
|
|
84
84
|
*/
|
|
85
|
-
declare function parseUnifiedDiffPreview(diff: string, maxLines: number, lineCap?: number): DiffPreview;
|
|
86
|
-
declare const TOOL_DIFF_BROWSER_SRC: string;
|
|
87
|
-
|
|
88
|
-
export { DIFF_LINE_SAFETY_CAP, DIFF_MAX_LINES, type DiffLineKind, type DiffLineRow, type DiffPreview, type DiffRow, type DiffRowKind, TOOL_DIFF_BROWSER_SRC, type ToolDiff, computeLineDiff, diffFromToolInput, diffRowsFromToolInput, parseUnifiedDiff, parseUnifiedDiffPreview, truncMid };
|
|
85
|
+
export declare function parseUnifiedDiffPreview(diff: string, maxLines: number, lineCap?: number): DiffPreview;
|
|
86
|
+
export declare const TOOL_DIFF_BROWSER_SRC: string;
|
|
87
|
+
//# sourceMappingURL=tool-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-diff.d.ts","sourceRoot":"","sources":["../src/tool-diff.ts"],"names":[],"mappings":"AAiBA,mCAAmC;AACnC,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AACzD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,oFAAoF;AACpF,MAAM,MAAM,QAAQ,GAChB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D,qEAAqE;AACrE,eAAO,MAAM,cAAc,OAAO,CAAC;AAmBnC;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,IAAI,CAiC/F;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,IAAI,CAgClF;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE,CA2B7D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,KAAK,EAAE,OAAO,GACb;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAKpD;AAgBD,gFAAgF;AAChF,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AACnE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,uEAAuE;AACvE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC,8EAA8E;AAC9E,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,MAA6B,GACrC,WAAW,CAsDb;AAYD,eAAO,MAAM,qBAAqB,EAAE,MAyDxB,CAAC"}
|
package/dist/tool-diff.js
CHANGED
|
@@ -223,7 +223,15 @@ var TOOL_DIFF_BROWSER_SRC = [
|
|
|
223
223
|
" return { caption:d.caption, rows:computeLineDiff(d.oldText, d.newText) };",
|
|
224
224
|
"}"
|
|
225
225
|
].join("\n");
|
|
226
|
-
|
|
227
|
-
|
|
226
|
+
export {
|
|
227
|
+
DIFF_LINE_SAFETY_CAP,
|
|
228
|
+
DIFF_MAX_LINES,
|
|
229
|
+
TOOL_DIFF_BROWSER_SRC,
|
|
230
|
+
computeLineDiff,
|
|
231
|
+
diffFromToolInput,
|
|
232
|
+
diffRowsFromToolInput,
|
|
233
|
+
parseUnifiedDiff,
|
|
234
|
+
parseUnifiedDiffPreview,
|
|
235
|
+
truncMid
|
|
236
|
+
};
|
|
228
237
|
//# sourceMappingURL=tool-diff.js.map
|
|
229
|
-
//# sourceMappingURL=tool-diff.js.map
|
package/dist/tool-diff.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tool-diff.ts"],"names":["i","j"],"mappings":"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","file":"tool-diff.js","sourcesContent":["// Tool-output diff model — the single source of truth for turning an\n// edit/write/patch tool call into a red/green diff, shared by the WebUI\n// (DiffView) and the HQ dashboard chat-history sidebar.\n//\n// PURE + browser-safe (no node imports). Two consumption modes, mirroring the\n// pattern in ./tool-summary:\n// 1. WebUI/TS: import { diffFromToolInput, computeLineDiff } directly.\n// 2. HQ: it is a served template-literal string that cannot `import`, so it\n// embeds the *_BROWSER_SRC transcriptions and a parity test guarantees the\n// two never drift.\n//\n// Three tool families produce three diff shapes:\n// - edit / str_replace -> { mode:'lcs', oldText, newText } (LCS line diff)\n// - write / create -> { mode:'lcs', oldText:'', newText } (all additions)\n// - patch -> { mode:'unified', patchText } (already a unified\n// diff — parse its hunks directly, do NOT recompute)\n\n/** A single rendered diff line. */\nexport type DiffRowKind = 'add' | 'del' | 'ctx' | 'meta';\nexport interface DiffRow {\n kind: DiffRowKind;\n text: string;\n}\n\n/** Extraction result: enough for a caller to render without re-inspecting input. */\nexport type ToolDiff =\n | { mode: 'lcs'; oldText: string; newText: string; caption: string }\n | { mode: 'unified'; patchText: string; caption: string };\n\n/** Max lines per side before we bail out of the O(n*m) LCS table. */\nexport const DIFF_MAX_LINES = 5000;\n\nfunction asObject(input: unknown): Record<string, unknown> | null {\n if (typeof input === 'string') {\n const s = input.trim();\n if (s.startsWith('{') || s.startsWith('[')) {\n try {\n const parsed = JSON.parse(s);\n if (parsed && typeof parsed === 'object') return parsed as Record<string, unknown>;\n } catch {\n return null;\n }\n }\n return null;\n }\n if (input && typeof input === 'object') return input as Record<string, unknown>;\n return null;\n}\n\n/**\n * Recognise the edit-family tools and pull a renderable diff descriptor out of\n * their input. Returns null when the tool doesn't carry diffable input.\n *\n * @param toolName canonical or aliased tool name.\n * @param input tool input — a parsed object OR a JSON string.\n */\nexport function diffFromToolInput(toolName: string | undefined, input: unknown): ToolDiff | null {\n if (!toolName) return null;\n const obj = asObject(input);\n if (!obj) return null;\n const name = toolName.toLowerCase();\n const filePath = String(obj.file_path ?? obj.path ?? '');\n\n switch (name) {\n case 'edit':\n case 'str_replace':\n case 'edit_file':\n case 'multi_edit': {\n const oldText = typeof obj.old_string === 'string' ? obj.old_string : '';\n const newText = typeof obj.new_string === 'string' ? obj.new_string : '';\n if (!oldText && !newText) return null;\n return { mode: 'lcs', oldText, newText, caption: `edit ${filePath}`.trim() };\n }\n case 'write':\n case 'write_file':\n case 'create_file': {\n const content = typeof obj.content === 'string' ? obj.content : '';\n if (!content) return null;\n // Fresh write: no \"old\" side, everything shows green.\n return { mode: 'lcs', oldText: '', newText: content, caption: `write ${filePath} (new)`.trim() };\n }\n case 'patch': {\n const patchText = typeof obj.patch === 'string' ? obj.patch : '';\n if (!patchText.trim()) return null;\n return { mode: 'unified', patchText, caption: filePath ? `patch ${filePath}` : 'patch' };\n }\n default:\n return null;\n }\n}\n\n/**\n * LCS-based line diff. Returns null when either side exceeds DIFF_MAX_LINES\n * (an O(n*m) memory guard — fine for a normal edit, prohibitive for a huge\n * generated-file rewrite).\n */\nexport function computeLineDiff(oldText: string, newText: string): DiffRow[] | null {\n const a = oldText.split('\\n');\n const b = newText.split('\\n');\n if (a.length > DIFF_MAX_LINES || b.length > DIFF_MAX_LINES) return null;\n const n = a.length;\n const m = b.length;\n // dp[i][j] = LCS length of a[i..] and b[j..]\n const dp: number[][] = Array.from({ length: n + 1 }, () => new Array<number>(m + 1).fill(0));\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n dp[i]![j] = a[i] === b[j] ? dp[i + 1]![j + 1]! + 1 : Math.max(dp[i + 1]![j]!, dp[i]![j + 1]!);\n }\n }\n const rows: DiffRow[] = [];\n let i = 0;\n let j = 0;\n while (i < n && j < m) {\n if (a[i] === b[j]) {\n rows.push({ kind: 'ctx', text: a[i]! });\n i++;\n j++;\n } else if (dp[i + 1]![j]! >= dp[i]![j + 1]!) {\n rows.push({ kind: 'del', text: a[i]! });\n i++;\n } else {\n rows.push({ kind: 'add', text: b[j]! });\n j++;\n }\n }\n while (i < n) rows.push({ kind: 'del', text: a[i++]! });\n while (j < m) rows.push({ kind: 'add', text: b[j++]! });\n return rows;\n}\n\n/**\n * Parse a unified-diff string into renderable rows. Hunk headers (`@@ ... @@`)\n * and file headers (`--- `, `+++ `, `diff `, `index `) become `meta` rows; body\n * lines map to add/del/ctx by their leading char. `\`\n * is kept as a meta row.\n */\nexport function parseUnifiedDiff(patchText: string): DiffRow[] {\n const rows: DiffRow[] = [];\n const lines = patchText.split('\\n');\n for (const raw of lines) {\n if (\n raw.startsWith('@@') ||\n raw.startsWith('--- ') ||\n raw.startsWith('+++ ') ||\n raw.startsWith('diff ') ||\n raw.startsWith('index ') ||\n raw.startsWith('\\\\ ')\n ) {\n rows.push({ kind: 'meta', text: raw });\n } else if (raw.startsWith('+')) {\n rows.push({ kind: 'add', text: raw.slice(1) });\n } else if (raw.startsWith('-')) {\n rows.push({ kind: 'del', text: raw.slice(1) });\n } else {\n // context line (leading space) or a bare line\n rows.push({ kind: 'ctx', text: raw.startsWith(' ') ? raw.slice(1) : raw });\n }\n }\n // Drop a trailing empty row that a final newline in patchText introduces.\n if (rows.length > 0 && rows[rows.length - 1]!.kind === 'ctx' && rows[rows.length - 1]!.text === '') {\n rows.pop();\n }\n return rows;\n}\n\n/**\n * Convenience: extract + render to rows in one call. Returns null when the tool\n * carries no diffable input, or `{ caption, rows: null }` when the diff is too\n * large to render (LCS guard).\n */\nexport function diffRowsFromToolInput(\n toolName: string | undefined,\n input: unknown,\n): { caption: string; rows: DiffRow[] | null } | null {\n const d = diffFromToolInput(toolName, input);\n if (!d) return null;\n if (d.mode === 'unified') return { caption: d.caption, rows: parseUnifiedDiff(d.patchText) };\n return { caption: d.caption, rows: computeLineDiff(d.oldText, d.newText) };\n}\n\n// ===========================================================================\n// Rich preview model (line-number gutters + maxLines cap + hidden counts).\n//\n// Promoted verbatim from the TUI's code-block.tsx so the terminal can consume\n// this instead of a third local copy. It is a SUPERSET of the flat DiffRow\n// model above: `DiffLineRow` carries per-row old/new line numbers and a `hunk`\n// kind, and `parseUnifiedDiffPreview` returns a `DiffPreview` with add/remove\n// totals plus a maxLines cap that folds the overflow into hidden counts.\n//\n// This is pure and browser-safe; the TUI-only rendering (ink/theme/wrap) stays\n// in code-block.tsx. Kept as separate names from the flat `parseUnifiedDiff`\n// above so WebUI/HQ callers are unaffected.\n// ===========================================================================\n\n/** Rich diff row: like DiffRow but with a dedicated `hunk` kind and gutters. */\nexport type DiffLineKind = 'add' | 'del' | 'hunk' | 'ctx' | 'meta';\nexport interface DiffLineRow {\n kind: DiffLineKind;\n text: string;\n oldLine?: number | undefined;\n newLine?: number | undefined;\n}\n\n/** A parsed unified-diff preview: rows plus visible/hidden tallies. */\nexport interface DiffPreview {\n rows: DiffLineRow[];\n hidden: number;\n added: number;\n removed: number;\n hiddenAdded: number;\n hiddenRemoved: number;\n}\n\n/**\n * Safety cap on a single diff row's stored text — guards against pathological\n * one-line files (minified bundles, huge JSON) flooding a consumer. Real code\n * lines are never truncated at this length.\n */\nexport const DIFF_LINE_SAFETY_CAP = 4000;\n\n/** Truncate the middle-out: keep the head, append an ellipsis, past `max`. */\nexport function truncMid(s: string, max: number): string {\n if (s.length <= max) return s;\n return `${s.slice(0, max - 1)}…`;\n}\n\n/**\n * Parse a unified-diff string into a {@link DiffPreview} with per-row line\n * numbers and add/remove tallies. `maxLines` caps the visible rows; the rest\n * fold into `hidden`/`hiddenAdded`/`hiddenRemoved`. Pass\n * `Number.POSITIVE_INFINITY` to render everything.\n *\n * This is the richer sibling of {@link parseUnifiedDiff}: it keeps a dedicated\n * `hunk` kind (rather than folding hunk headers into `meta`) and tracks old/new\n * line gutters, which a terminal/gutter renderer needs.\n */\nexport function parseUnifiedDiffPreview(\n diff: string,\n maxLines: number,\n lineCap: number = DIFF_LINE_SAFETY_CAP,\n): DiffPreview {\n const all: DiffLineRow[] = [];\n let oldLn = 0;\n let newLn = 0;\n for (const raw of diff.split('\\n')) {\n const line = raw.replace(/\\r$/, '');\n if (line.startsWith('+++') || line.startsWith('---')) continue;\n if (line.startsWith('diff --git') || line.startsWith('index ')) continue;\n if (line.startsWith('@@')) {\n const m = line.match(/^@@\\s+-(\\d+)(?:,\\d+)?\\s+\\+(\\d+)(?:,\\d+)?\\s+@@/);\n if (m) {\n oldLn = Number.parseInt(m[1] ?? '0', 10) || 0;\n newLn = Number.parseInt(m[2] ?? '0', 10) || 0;\n }\n all.push({ kind: 'hunk', text: truncMid(line, 60) });\n continue;\n }\n if (line.startsWith('+')) {\n all.push({ kind: 'add', text: truncMid(line, lineCap), newLine: newLn });\n newLn++;\n continue;\n }\n if (line.startsWith('-')) {\n all.push({ kind: 'del', text: truncMid(line, lineCap), oldLine: oldLn });\n oldLn++;\n continue;\n }\n if (line.startsWith('\\\\ No newline')) {\n all.push({ kind: 'meta', text: line });\n continue;\n }\n if (line.length === 0) continue;\n all.push({ kind: 'ctx', text: truncMid(line, lineCap), oldLine: oldLn, newLine: newLn });\n oldLn++;\n newLn++;\n }\n const added = all.filter((row) => row.kind === 'add').length;\n const removed = all.filter((row) => row.kind === 'del').length;\n if (all.length === 0) {\n return { rows: [], hidden: 0, added: 0, removed: 0, hiddenAdded: 0, hiddenRemoved: 0 };\n }\n if (all.length <= maxLines) {\n return { rows: all, hidden: 0, added, removed, hiddenAdded: 0, hiddenRemoved: 0 };\n }\n const rows = all.slice(0, maxLines);\n const hiddenRows = all.slice(maxLines);\n return {\n rows,\n hidden: hiddenRows.length,\n added,\n removed,\n hiddenAdded: hiddenRows.filter((row) => row.kind === 'add').length,\n hiddenRemoved: hiddenRows.filter((row) => row.kind === 'del').length,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Browser-JS transcriptions for HQ (served template literal, cannot import).\n// Authored with string concatenation only: NO backticks, NO ${...} — the HQ\n// template escapes those. A parity test asserts identical output to the TS\n// functions above. Together these define, on the global scope:\n// diffFromToolInput(name, rawInput) -> {mode,...}|null\n// computeLineDiff(oldText, newText) -> rows|null\n// parseUnifiedDiff(patchText) -> rows\n// diffRowsFromToolInput(name, raw) -> {caption, rows}|null\n// ---------------------------------------------------------------------------\nexport const TOOL_DIFF_BROWSER_SRC: string = [\n 'var DIFF_MAX_LINES = 5000;',\n 'function __diffObj(input){',\n ' if(typeof input===\"string\"){ var s=input.trim(); if(s.charAt(0)===\"{\"||s.charAt(0)===\"[\"){ try{ var p=JSON.parse(s); if(p&&typeof p===\"object\") return p; }catch(_e){} } return null; }',\n ' if(input&&typeof input===\"object\") return input; return null;',\n '}',\n 'function diffFromToolInput(name, input){',\n ' if(!name) return null;',\n ' var obj=__diffObj(input); if(!obj) return null;',\n ' var n=String(name).toLowerCase();',\n ' var fp=String(obj.file_path!=null?obj.file_path:(obj.path!=null?obj.path:\"\"));',\n ' if(n===\"edit\"||n===\"str_replace\"||n===\"edit_file\"||n===\"multi_edit\"){',\n ' var oldT=typeof obj.old_string===\"string\"?obj.old_string:\"\";',\n ' var newT=typeof obj.new_string===\"string\"?obj.new_string:\"\";',\n ' if(!oldT&&!newT) return null;',\n ' return { mode:\"lcs\", oldText:oldT, newText:newT, caption:(\"edit \"+fp).replace(/\\\\s+$/,\"\") };',\n ' }',\n ' if(n===\"write\"||n===\"write_file\"||n===\"create_file\"){',\n ' var c=typeof obj.content===\"string\"?obj.content:\"\";',\n ' if(!c) return null;',\n ' return { mode:\"lcs\", oldText:\"\", newText:c, caption:(\"write \"+fp+\" (new)\").replace(/\\\\s+/g,\" \").replace(/\\\\s+$/,\"\") };',\n ' }',\n ' if(n===\"patch\"){',\n ' var pt=typeof obj.patch===\"string\"?obj.patch:\"\";',\n ' if(!pt.replace(/\\\\s/g,\"\")) return null;',\n ' return { mode:\"unified\", patchText:pt, caption: fp ? (\"patch \"+fp) : \"patch\" };',\n ' }',\n ' return null;',\n '}',\n 'function computeLineDiff(oldText, newText){',\n ' var a=oldText.split(\"\\\\n\"), b=newText.split(\"\\\\n\");',\n ' if(a.length>DIFF_MAX_LINES||b.length>DIFF_MAX_LINES) return null;',\n ' var nn=a.length, mm=b.length, i, j;',\n ' var dp=new Array(nn+1); for(i=0;i<=nn;i++){ dp[i]=new Array(mm+1); for(j=0;j<=mm;j++) dp[i][j]=0; }',\n ' for(i=nn-1;i>=0;i--){ for(j=mm-1;j>=0;j--){ dp[i][j]= a[i]===b[j] ? dp[i+1][j+1]+1 : Math.max(dp[i+1][j], dp[i][j+1]); } }',\n ' var rows=[]; i=0; j=0;',\n ' while(i<nn&&j<mm){ if(a[i]===b[j]){ rows.push({kind:\"ctx\",text:a[i]}); i++; j++; } else if(dp[i+1][j]>=dp[i][j+1]){ rows.push({kind:\"del\",text:a[i]}); i++; } else { rows.push({kind:\"add\",text:b[j]}); j++; } }',\n ' while(i<nn){ rows.push({kind:\"del\",text:a[i]}); i++; }',\n ' while(j<mm){ rows.push({kind:\"add\",text:b[j]}); j++; }',\n ' return rows;',\n '}',\n 'function parseUnifiedDiff(patchText){',\n ' var rows=[], lines=patchText.split(\"\\\\n\"), k, raw;',\n ' for(k=0;k<lines.length;k++){ raw=lines[k];',\n ' if(raw.indexOf(\"@@\")===0||raw.indexOf(\"--- \")===0||raw.indexOf(\"+++ \")===0||raw.indexOf(\"diff \")===0||raw.indexOf(\"index \")===0||raw.indexOf(\"\\\\\\\\ \")===0){ rows.push({kind:\"meta\",text:raw}); }',\n ' else if(raw.charAt(0)===\"+\"){ rows.push({kind:\"add\",text:raw.slice(1)}); }',\n ' else if(raw.charAt(0)===\"-\"){ rows.push({kind:\"del\",text:raw.slice(1)}); }',\n ' else { rows.push({kind:\"ctx\",text: raw.charAt(0)===\" \" ? raw.slice(1) : raw}); }',\n ' }',\n ' if(rows.length>0 && rows[rows.length-1].kind===\"ctx\" && rows[rows.length-1].text===\"\"){ rows.pop(); }',\n ' return rows;',\n '}',\n 'function diffRowsFromToolInput(name, input){',\n ' var d=diffFromToolInput(name, input); if(!d) return null;',\n ' if(d.mode===\"unified\") return { caption:d.caption, rows:parseUnifiedDiff(d.patchText) };',\n ' return { caption:d.caption, rows:computeLineDiff(d.oldText, d.newText) };',\n '}',\n].join('\\n');\n"]}
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/tool-diff.ts"],
|
|
4
|
+
"sourcesContent": ["// Tool-output diff model \u2014 the single source of truth for turning an\n// edit/write/patch tool call into a red/green diff, shared by the WebUI\n// (DiffView) and the HQ dashboard chat-history sidebar.\n//\n// PURE + browser-safe (no node imports). Two consumption modes, mirroring the\n// pattern in ./tool-summary:\n// 1. WebUI/TS: import { diffFromToolInput, computeLineDiff } directly.\n// 2. HQ: it is a served template-literal string that cannot `import`, so it\n// embeds the *_BROWSER_SRC transcriptions and a parity test guarantees the\n// two never drift.\n//\n// Three tool families produce three diff shapes:\n// - edit / str_replace -> { mode:'lcs', oldText, newText } (LCS line diff)\n// - write / create -> { mode:'lcs', oldText:'', newText } (all additions)\n// - patch -> { mode:'unified', patchText } (already a unified\n// diff \u2014 parse its hunks directly, do NOT recompute)\n\n/** A single rendered diff line. */\nexport type DiffRowKind = 'add' | 'del' | 'ctx' | 'meta';\nexport interface DiffRow {\n kind: DiffRowKind;\n text: string;\n}\n\n/** Extraction result: enough for a caller to render without re-inspecting input. */\nexport type ToolDiff =\n | { mode: 'lcs'; oldText: string; newText: string; caption: string }\n | { mode: 'unified'; patchText: string; caption: string };\n\n/** Max lines per side before we bail out of the O(n*m) LCS table. */\nexport const DIFF_MAX_LINES = 5000;\n\nfunction asObject(input: unknown): Record<string, unknown> | null {\n if (typeof input === 'string') {\n const s = input.trim();\n if (s.startsWith('{') || s.startsWith('[')) {\n try {\n const parsed = JSON.parse(s);\n if (parsed && typeof parsed === 'object') return parsed as Record<string, unknown>;\n } catch {\n return null;\n }\n }\n return null;\n }\n if (input && typeof input === 'object') return input as Record<string, unknown>;\n return null;\n}\n\n/**\n * Recognise the edit-family tools and pull a renderable diff descriptor out of\n * their input. Returns null when the tool doesn't carry diffable input.\n *\n * @param toolName canonical or aliased tool name.\n * @param input tool input \u2014 a parsed object OR a JSON string.\n */\nexport function diffFromToolInput(toolName: string | undefined, input: unknown): ToolDiff | null {\n if (!toolName) return null;\n const obj = asObject(input);\n if (!obj) return null;\n const name = toolName.toLowerCase();\n const filePath = String(obj.file_path ?? obj.path ?? '');\n\n switch (name) {\n case 'edit':\n case 'str_replace':\n case 'edit_file':\n case 'multi_edit': {\n const oldText = typeof obj.old_string === 'string' ? obj.old_string : '';\n const newText = typeof obj.new_string === 'string' ? obj.new_string : '';\n if (!oldText && !newText) return null;\n return { mode: 'lcs', oldText, newText, caption: `edit ${filePath}`.trim() };\n }\n case 'write':\n case 'write_file':\n case 'create_file': {\n const content = typeof obj.content === 'string' ? obj.content : '';\n if (!content) return null;\n // Fresh write: no \"old\" side, everything shows green.\n return { mode: 'lcs', oldText: '', newText: content, caption: `write ${filePath} (new)`.trim() };\n }\n case 'patch': {\n const patchText = typeof obj.patch === 'string' ? obj.patch : '';\n if (!patchText.trim()) return null;\n return { mode: 'unified', patchText, caption: filePath ? `patch ${filePath}` : 'patch' };\n }\n default:\n return null;\n }\n}\n\n/**\n * LCS-based line diff. Returns null when either side exceeds DIFF_MAX_LINES\n * (an O(n*m) memory guard \u2014 fine for a normal edit, prohibitive for a huge\n * generated-file rewrite).\n */\nexport function computeLineDiff(oldText: string, newText: string): DiffRow[] | null {\n const a = oldText.split('\\n');\n const b = newText.split('\\n');\n if (a.length > DIFF_MAX_LINES || b.length > DIFF_MAX_LINES) return null;\n const n = a.length;\n const m = b.length;\n // dp[i][j] = LCS length of a[i..] and b[j..]\n const dp: number[][] = Array.from({ length: n + 1 }, () => new Array<number>(m + 1).fill(0));\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n dp[i]![j] = a[i] === b[j] ? dp[i + 1]![j + 1]! + 1 : Math.max(dp[i + 1]![j]!, dp[i]![j + 1]!);\n }\n }\n const rows: DiffRow[] = [];\n let i = 0;\n let j = 0;\n while (i < n && j < m) {\n if (a[i] === b[j]) {\n rows.push({ kind: 'ctx', text: a[i]! });\n i++;\n j++;\n } else if (dp[i + 1]![j]! >= dp[i]![j + 1]!) {\n rows.push({ kind: 'del', text: a[i]! });\n i++;\n } else {\n rows.push({ kind: 'add', text: b[j]! });\n j++;\n }\n }\n while (i < n) rows.push({ kind: 'del', text: a[i++]! });\n while (j < m) rows.push({ kind: 'add', text: b[j++]! });\n return rows;\n}\n\n/**\n * Parse a unified-diff string into renderable rows. Hunk headers (`@@ ... @@`)\n * and file headers (`--- `, `+++ `, `diff `, `index `) become `meta` rows; body\n * lines map to add/del/ctx by their leading char. `\`\n * is kept as a meta row.\n */\nexport function parseUnifiedDiff(patchText: string): DiffRow[] {\n const rows: DiffRow[] = [];\n const lines = patchText.split('\\n');\n for (const raw of lines) {\n if (\n raw.startsWith('@@') ||\n raw.startsWith('--- ') ||\n raw.startsWith('+++ ') ||\n raw.startsWith('diff ') ||\n raw.startsWith('index ') ||\n raw.startsWith('\\\\ ')\n ) {\n rows.push({ kind: 'meta', text: raw });\n } else if (raw.startsWith('+')) {\n rows.push({ kind: 'add', text: raw.slice(1) });\n } else if (raw.startsWith('-')) {\n rows.push({ kind: 'del', text: raw.slice(1) });\n } else {\n // context line (leading space) or a bare line\n rows.push({ kind: 'ctx', text: raw.startsWith(' ') ? raw.slice(1) : raw });\n }\n }\n // Drop a trailing empty row that a final newline in patchText introduces.\n if (rows.length > 0 && rows[rows.length - 1]!.kind === 'ctx' && rows[rows.length - 1]!.text === '') {\n rows.pop();\n }\n return rows;\n}\n\n/**\n * Convenience: extract + render to rows in one call. Returns null when the tool\n * carries no diffable input, or `{ caption, rows: null }` when the diff is too\n * large to render (LCS guard).\n */\nexport function diffRowsFromToolInput(\n toolName: string | undefined,\n input: unknown,\n): { caption: string; rows: DiffRow[] | null } | null {\n const d = diffFromToolInput(toolName, input);\n if (!d) return null;\n if (d.mode === 'unified') return { caption: d.caption, rows: parseUnifiedDiff(d.patchText) };\n return { caption: d.caption, rows: computeLineDiff(d.oldText, d.newText) };\n}\n\n// ===========================================================================\n// Rich preview model (line-number gutters + maxLines cap + hidden counts).\n//\n// Promoted verbatim from the TUI's code-block.tsx so the terminal can consume\n// this instead of a third local copy. It is a SUPERSET of the flat DiffRow\n// model above: `DiffLineRow` carries per-row old/new line numbers and a `hunk`\n// kind, and `parseUnifiedDiffPreview` returns a `DiffPreview` with add/remove\n// totals plus a maxLines cap that folds the overflow into hidden counts.\n//\n// This is pure and browser-safe; the TUI-only rendering (ink/theme/wrap) stays\n// in code-block.tsx. Kept as separate names from the flat `parseUnifiedDiff`\n// above so WebUI/HQ callers are unaffected.\n// ===========================================================================\n\n/** Rich diff row: like DiffRow but with a dedicated `hunk` kind and gutters. */\nexport type DiffLineKind = 'add' | 'del' | 'hunk' | 'ctx' | 'meta';\nexport interface DiffLineRow {\n kind: DiffLineKind;\n text: string;\n oldLine?: number | undefined;\n newLine?: number | undefined;\n}\n\n/** A parsed unified-diff preview: rows plus visible/hidden tallies. */\nexport interface DiffPreview {\n rows: DiffLineRow[];\n hidden: number;\n added: number;\n removed: number;\n hiddenAdded: number;\n hiddenRemoved: number;\n}\n\n/**\n * Safety cap on a single diff row's stored text \u2014 guards against pathological\n * one-line files (minified bundles, huge JSON) flooding a consumer. Real code\n * lines are never truncated at this length.\n */\nexport const DIFF_LINE_SAFETY_CAP = 4000;\n\n/** Truncate the middle-out: keep the head, append an ellipsis, past `max`. */\nexport function truncMid(s: string, max: number): string {\n if (s.length <= max) return s;\n return `${s.slice(0, max - 1)}\u2026`;\n}\n\n/**\n * Parse a unified-diff string into a {@link DiffPreview} with per-row line\n * numbers and add/remove tallies. `maxLines` caps the visible rows; the rest\n * fold into `hidden`/`hiddenAdded`/`hiddenRemoved`. Pass\n * `Number.POSITIVE_INFINITY` to render everything.\n *\n * This is the richer sibling of {@link parseUnifiedDiff}: it keeps a dedicated\n * `hunk` kind (rather than folding hunk headers into `meta`) and tracks old/new\n * line gutters, which a terminal/gutter renderer needs.\n */\nexport function parseUnifiedDiffPreview(\n diff: string,\n maxLines: number,\n lineCap: number = DIFF_LINE_SAFETY_CAP,\n): DiffPreview {\n const all: DiffLineRow[] = [];\n let oldLn = 0;\n let newLn = 0;\n for (const raw of diff.split('\\n')) {\n const line = raw.replace(/\\r$/, '');\n if (line.startsWith('+++') || line.startsWith('---')) continue;\n if (line.startsWith('diff --git') || line.startsWith('index ')) continue;\n if (line.startsWith('@@')) {\n const m = line.match(/^@@\\s+-(\\d+)(?:,\\d+)?\\s+\\+(\\d+)(?:,\\d+)?\\s+@@/);\n if (m) {\n oldLn = Number.parseInt(m[1] ?? '0', 10) || 0;\n newLn = Number.parseInt(m[2] ?? '0', 10) || 0;\n }\n all.push({ kind: 'hunk', text: truncMid(line, 60) });\n continue;\n }\n if (line.startsWith('+')) {\n all.push({ kind: 'add', text: truncMid(line, lineCap), newLine: newLn });\n newLn++;\n continue;\n }\n if (line.startsWith('-')) {\n all.push({ kind: 'del', text: truncMid(line, lineCap), oldLine: oldLn });\n oldLn++;\n continue;\n }\n if (line.startsWith('\\\\ No newline')) {\n all.push({ kind: 'meta', text: line });\n continue;\n }\n if (line.length === 0) continue;\n all.push({ kind: 'ctx', text: truncMid(line, lineCap), oldLine: oldLn, newLine: newLn });\n oldLn++;\n newLn++;\n }\n const added = all.filter((row) => row.kind === 'add').length;\n const removed = all.filter((row) => row.kind === 'del').length;\n if (all.length === 0) {\n return { rows: [], hidden: 0, added: 0, removed: 0, hiddenAdded: 0, hiddenRemoved: 0 };\n }\n if (all.length <= maxLines) {\n return { rows: all, hidden: 0, added, removed, hiddenAdded: 0, hiddenRemoved: 0 };\n }\n const rows = all.slice(0, maxLines);\n const hiddenRows = all.slice(maxLines);\n return {\n rows,\n hidden: hiddenRows.length,\n added,\n removed,\n hiddenAdded: hiddenRows.filter((row) => row.kind === 'add').length,\n hiddenRemoved: hiddenRows.filter((row) => row.kind === 'del').length,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Browser-JS transcriptions for HQ (served template literal, cannot import).\n// Authored with string concatenation only: NO backticks, NO ${...} \u2014 the HQ\n// template escapes those. A parity test asserts identical output to the TS\n// functions above. Together these define, on the global scope:\n// diffFromToolInput(name, rawInput) -> {mode,...}|null\n// computeLineDiff(oldText, newText) -> rows|null\n// parseUnifiedDiff(patchText) -> rows\n// diffRowsFromToolInput(name, raw) -> {caption, rows}|null\n// ---------------------------------------------------------------------------\nexport const TOOL_DIFF_BROWSER_SRC: string = [\n 'var DIFF_MAX_LINES = 5000;',\n 'function __diffObj(input){',\n ' if(typeof input===\"string\"){ var s=input.trim(); if(s.charAt(0)===\"{\"||s.charAt(0)===\"[\"){ try{ var p=JSON.parse(s); if(p&&typeof p===\"object\") return p; }catch(_e){} } return null; }',\n ' if(input&&typeof input===\"object\") return input; return null;',\n '}',\n 'function diffFromToolInput(name, input){',\n ' if(!name) return null;',\n ' var obj=__diffObj(input); if(!obj) return null;',\n ' var n=String(name).toLowerCase();',\n ' var fp=String(obj.file_path!=null?obj.file_path:(obj.path!=null?obj.path:\"\"));',\n ' if(n===\"edit\"||n===\"str_replace\"||n===\"edit_file\"||n===\"multi_edit\"){',\n ' var oldT=typeof obj.old_string===\"string\"?obj.old_string:\"\";',\n ' var newT=typeof obj.new_string===\"string\"?obj.new_string:\"\";',\n ' if(!oldT&&!newT) return null;',\n ' return { mode:\"lcs\", oldText:oldT, newText:newT, caption:(\"edit \"+fp).replace(/\\\\s+$/,\"\") };',\n ' }',\n ' if(n===\"write\"||n===\"write_file\"||n===\"create_file\"){',\n ' var c=typeof obj.content===\"string\"?obj.content:\"\";',\n ' if(!c) return null;',\n ' return { mode:\"lcs\", oldText:\"\", newText:c, caption:(\"write \"+fp+\" (new)\").replace(/\\\\s+/g,\" \").replace(/\\\\s+$/,\"\") };',\n ' }',\n ' if(n===\"patch\"){',\n ' var pt=typeof obj.patch===\"string\"?obj.patch:\"\";',\n ' if(!pt.replace(/\\\\s/g,\"\")) return null;',\n ' return { mode:\"unified\", patchText:pt, caption: fp ? (\"patch \"+fp) : \"patch\" };',\n ' }',\n ' return null;',\n '}',\n 'function computeLineDiff(oldText, newText){',\n ' var a=oldText.split(\"\\\\n\"), b=newText.split(\"\\\\n\");',\n ' if(a.length>DIFF_MAX_LINES||b.length>DIFF_MAX_LINES) return null;',\n ' var nn=a.length, mm=b.length, i, j;',\n ' var dp=new Array(nn+1); for(i=0;i<=nn;i++){ dp[i]=new Array(mm+1); for(j=0;j<=mm;j++) dp[i][j]=0; }',\n ' for(i=nn-1;i>=0;i--){ for(j=mm-1;j>=0;j--){ dp[i][j]= a[i]===b[j] ? dp[i+1][j+1]+1 : Math.max(dp[i+1][j], dp[i][j+1]); } }',\n ' var rows=[]; i=0; j=0;',\n ' while(i<nn&&j<mm){ if(a[i]===b[j]){ rows.push({kind:\"ctx\",text:a[i]}); i++; j++; } else if(dp[i+1][j]>=dp[i][j+1]){ rows.push({kind:\"del\",text:a[i]}); i++; } else { rows.push({kind:\"add\",text:b[j]}); j++; } }',\n ' while(i<nn){ rows.push({kind:\"del\",text:a[i]}); i++; }',\n ' while(j<mm){ rows.push({kind:\"add\",text:b[j]}); j++; }',\n ' return rows;',\n '}',\n 'function parseUnifiedDiff(patchText){',\n ' var rows=[], lines=patchText.split(\"\\\\n\"), k, raw;',\n ' for(k=0;k<lines.length;k++){ raw=lines[k];',\n ' if(raw.indexOf(\"@@\")===0||raw.indexOf(\"--- \")===0||raw.indexOf(\"+++ \")===0||raw.indexOf(\"diff \")===0||raw.indexOf(\"index \")===0||raw.indexOf(\"\\\\\\\\ \")===0){ rows.push({kind:\"meta\",text:raw}); }',\n ' else if(raw.charAt(0)===\"+\"){ rows.push({kind:\"add\",text:raw.slice(1)}); }',\n ' else if(raw.charAt(0)===\"-\"){ rows.push({kind:\"del\",text:raw.slice(1)}); }',\n ' else { rows.push({kind:\"ctx\",text: raw.charAt(0)===\" \" ? raw.slice(1) : raw}); }',\n ' }',\n ' if(rows.length>0 && rows[rows.length-1].kind===\"ctx\" && rows[rows.length-1].text===\"\"){ rows.pop(); }',\n ' return rows;',\n '}',\n 'function diffRowsFromToolInput(name, input){',\n ' var d=diffFromToolInput(name, input); if(!d) return null;',\n ' if(d.mode===\"unified\") return { caption:d.caption, rows:parseUnifiedDiff(d.patchText) };',\n ' return { caption:d.caption, rows:computeLineDiff(d.oldText, d.newText) };',\n '}',\n].join('\\n');\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["i", "j"]
|
|
7
|
+
}
|
package/dist/tool-help.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { Tool } from '@wrongstack/core';
|
|
2
|
-
|
|
1
|
+
import type { Tool } from '@wrongstack/core';
|
|
3
2
|
interface ToolHelpInput {
|
|
4
3
|
tool?: string | undefined;
|
|
5
4
|
format?: 'short' | 'full' | 'markdown' | undefined;
|
|
@@ -18,6 +17,6 @@ interface ToolHelpOutput {
|
|
|
18
17
|
}[];
|
|
19
18
|
total: number;
|
|
20
19
|
}
|
|
21
|
-
declare const toolHelpTool: Tool<ToolHelpInput, ToolHelpOutput>;
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
export declare const toolHelpTool: Tool<ToolHelpInput, ToolHelpOutput>;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=tool-help.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-help.d.ts","sourceRoot":"","sources":["../src/tool-help.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IACnD,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACxC;AAED,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,OAAO,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,OAAO,CAAC;KACnB,EAAE,CAAC;IACJ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,cAAc,CAoF5D,CAAC"}
|
package/dist/tool-help.js
CHANGED
package/dist/tool-help.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/tool-help.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Tool } from '@wrongstack/core';\n\ninterface ToolHelpInput {\n tool?: string | undefined;\n format?: 'short' | 'full' | 'markdown' | undefined;\n include_examples?: boolean | undefined;\n}\n\ninterface ToolHelpOutput {\n tool?: string | undefined;\n help: string;\n tools: {\n name: string;\n description: string;\n usageHint: string;\n inputSchema: unknown;\n permission: string;\n mutating: boolean;\n }[];\n total: number;\n}\n\nexport const toolHelpTool: Tool<ToolHelpInput, ToolHelpOutput> = {\n name: 'tool_help',\n category: 'Meta',\n description:\n 'Get detailed help for a specific tool, including its full input schema and usage guidance. ' +\n 'If you do not know which tool to use, search with `tool_search` first, then call this with the tool name.',\n usageHint:\n 'USE WHEN YOU NEED PRECISE TOOL INFORMATION:\\n\\n' +\n '- Call with a specific `tool` name when you want the full schema and current usageHint.\\n' +\n '- Omit `tool` to get an overview of all available tools.\\n' +\n '- Different `format` options give you different levels of detail.\\n' +\n '- Tip: use `tool_search` to find the right tool name, then `tool_help` for the full schema.\\n' +\n 'This tool is extremely valuable for self-correction when you are unsure about a tool\\'s interface.',\n permission: 'auto',\n mutating: false,\n timeoutMs: 5_000,\n capabilities: ['tool.meta'],\n icon: 'meta',\n inputSchema: {\n type: 'object',\n properties: {\n tool: {\n type: 'string',\n description: 'Specific tool name to get detailed help for. Omit to get a list of all tools.',\n },\n format: {\n type: 'string',\n enum: ['short', 'full', 'markdown'],\n description: 'Level of detail: \"short\" (summary), \"full\" (with full schema), \"markdown\" (human readable).',\n },\n include_examples: {\n type: 'boolean',\n description: 'Whether to include example usage in the response.',\n },\n },\n },\n async execute(input, ctx) {\n const format = input.format ?? 'short';\n const includeExamples = input.include_examples ?? false;\n\n if (input.tool) {\n const tool = ctx.tools.find((t: Tool) => t.name === input.tool);\n if (!tool) {\n return {\n tool: input.tool,\n help: `No tool found with name \"${input.tool}\"`,\n tools: [],\n total: 0,\n };\n }\n\n return {\n tool: tool.name,\n help: formatToolHelp(tool, format, includeExamples),\n tools: [\n {\n name: tool.name,\n description: tool.description,\n usageHint: tool.usageHint ?? '',\n inputSchema: tool.inputSchema,\n permission: tool.permission,\n mutating: tool.mutating,\n },\n ],\n total: 1,\n };\n }\n\n const allTools = ctx.tools.map((t: Tool) => ({\n name: t.name,\n description: t.description,\n usageHint: t.usageHint ?? '',\n inputSchema: format === 'full' ? t.inputSchema : undefined,\n permission: t.permission,\n mutating: t.mutating,\n }));\n\n return {\n help:\n format === 'markdown' ? formatAllToolsMarkdown(allTools) : formatAllToolsShort(allTools),\n tools: allTools,\n total: allTools.length,\n };\n },\n};\n\nfunction formatToolHelp(tool: Tool, format: string, includeExamples: boolean): string {\n const lines: string[] = [];\n\n if (format === 'short') {\n lines.push(`${tool.name}: ${tool.description}`);\n if (tool.usageHint) lines.push(`Hint: ${tool.usageHint}`);\n return lines.join('\\n');\n }\n\n if (format === 'markdown') {\n lines.push(`## ${tool.name}`);\n lines.push('');\n lines.push(tool.description);\n lines.push('');\n lines.push('**Permission:** ' + tool.permission);\n lines.push('**Mutating:** ' + (tool.mutating ? 'yes' : 'no'));\n if (tool.usageHint) {\n lines.push('');\n lines.push('### Usage Hint');\n lines.push(tool.usageHint);\n }\n if (includeExamples && tool.inputSchema) {\n lines.push('');\n lines.push('### Input Schema');\n lines.push('```json');\n lines.push(JSON.stringify(tool.inputSchema, null, 2));\n lines.push('```');\n }\n return lines.join('\\n');\n }\n\n lines.push(`Tool: ${tool.name}`);\n lines.push(`Description: ${tool.description}`);\n lines.push(`Permission: ${tool.permission}`);\n lines.push(`Mutating: ${tool.mutating}`);\n if (tool.usageHint) lines.push(`Usage: ${tool.usageHint}`);\n if (format === 'full' && tool.inputSchema) {\n lines.push('Schema: ' + JSON.stringify(tool.inputSchema, null, 2));\n }\n return lines.join('\\n');\n}\n\nfunction formatAllToolsShort(tools: { name: string; description: string }[]): string {\n return tools.map((t) => ` ${t.name.padEnd(16)} ${t.description}`).join('\\n');\n}\n\nfunction formatAllToolsMarkdown(\n tools: { name: string; description: string; usageHint: string }[],\n): string {\n const lines: string[] = ['## Available Tools', ''];\n lines.push('| Tool | Description |');\n lines.push('|------|-------------|');\n for (const t of tools) {\n lines.push(`| \\`${t.name}\\` | ${t.description} |`);\n }\n return lines.join('\\n');\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared tool icon mapping for all WrongStack UIs (WebUI, TUI, REPL).
|
|
3
|
+
*
|
|
4
|
+
* Each UI renders icons using its own library:
|
|
5
|
+
* - WebUI: lucide-react
|
|
6
|
+
* - TUI: ink icons or text characters
|
|
7
|
+
* - REPL: unicode characters or ASCII art
|
|
8
|
+
*
|
|
9
|
+
* This module exports the canonical tool → icon-name mapping.
|
|
10
|
+
* Add new tools here, never hardcode icon names in UI components.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Icon identifiers — each UI maps these to its own icon library.
|
|
14
|
+
* Using a common set of identifiers ensures consistency across all surfaces.
|
|
15
|
+
*/
|
|
16
|
+
export type ToolIconId = 'file' | 'edit' | 'search' | 'folder' | 'terminal' | 'web' | 'git' | 'tree' | 'code' | 'test' | 'package' | 'document' | 'scaffold' | 'todo' | 'plan' | 'task' | 'meta' | 'index' | 'json' | 'diff' | 'logs' | 'settings' | 'brain' | 'fallback';
|
|
17
|
+
/**
|
|
18
|
+
* Canonical mapping of WrongStack tool names to icon identifiers.
|
|
19
|
+
* Coverage: shared core tool names + common aliases. Browser-specific tools
|
|
20
|
+
* use their surface-owned icon mappings.
|
|
21
|
+
*/
|
|
22
|
+
export declare const TOOL_ICON_MAP: Record<string, ToolIconId>;
|
|
23
|
+
/**
|
|
24
|
+
* Get the icon identifier for a tool name.
|
|
25
|
+
* Returns 'fallback' for unknown tools.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getToolIcon(toolName: string): ToolIconId;
|
|
28
|
+
/**
|
|
29
|
+
* Icon configuration including color for rendering.
|
|
30
|
+
*/
|
|
31
|
+
export interface ToolIconConfig {
|
|
32
|
+
icon: ToolIconId;
|
|
33
|
+
/** CSS color string, e.g. '#6366f1' or 'var(--tool-file)' */
|
|
34
|
+
color: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Icon configurations — icon id -> { icon, color }.
|
|
38
|
+
* Each UI applies its own icon library (lucide-react, ink, unicode, etc.)
|
|
39
|
+
* but uses these canonical color values.
|
|
40
|
+
*/
|
|
41
|
+
export declare const TOOL_ICON_CONFIG: Record<ToolIconId, ToolIconConfig>;
|
|
42
|
+
/**
|
|
43
|
+
* Default fallback icon for unknown tools.
|
|
44
|
+
*/
|
|
45
|
+
export declare const FALLBACK_ICON: ToolIconId;
|
|
46
|
+
//# sourceMappingURL=tool-icon-map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-icon-map.d.ts","sourceRoot":"","sources":["../src/tool-icon-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;GAGG;AACH,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,KAAK,GACL,KAAK,GACL,MAAM,GACN,MAAM,GACN,MAAM,GACN,SAAS,GACT,UAAU,GACV,UAAU,GACV,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,OAAO,GACP,MAAM,GACN,MAAM,GACN,MAAM,GACN,UAAU,GACV,OAAO,GACP,UAAU,CAAC;AAEf;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CA+HpD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAExD;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,UAAU,EAAE,cAAc,CAyB/D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,UAAuB,CAAC"}
|
package/dist/tool-icons.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** The closed set of visual identities a tool can map to. */
|
|
2
|
-
type ToolIconId = 'file' | 'edit' | 'search' | 'folder' | 'terminal' | 'web' | 'git' | 'tree' | 'code' | 'test' | 'package' | 'document' | 'scaffold' | 'todo' | 'plan' | 'task' | 'meta' | 'index' | 'json' | 'diff' | 'logs' | 'settings' | 'brain' | 'fallback';
|
|
2
|
+
export type ToolIconId = 'file' | 'edit' | 'search' | 'folder' | 'terminal' | 'web' | 'git' | 'tree' | 'code' | 'test' | 'package' | 'document' | 'scaffold' | 'todo' | 'plan' | 'task' | 'meta' | 'index' | 'json' | 'diff' | 'logs' | 'settings' | 'brain' | 'fallback';
|
|
3
3
|
/** Canonical hex color per icon id — the single source both surfaces read. */
|
|
4
|
-
declare const TOOL_ICON_CONFIG: Record<ToolIconId, {
|
|
4
|
+
export declare const TOOL_ICON_CONFIG: Record<ToolIconId, {
|
|
5
5
|
color: string;
|
|
6
6
|
}>;
|
|
7
7
|
/**
|
|
@@ -9,12 +9,11 @@ declare const TOOL_ICON_CONFIG: Record<ToolIconId, {
|
|
|
9
9
|
* lowercases the query, so lookups are case-insensitive. Covers every builtin
|
|
10
10
|
* tool plus the aliases models commonly emit.
|
|
11
11
|
*/
|
|
12
|
-
declare const TOOL_ICON_MAP: Record<string, ToolIconId>;
|
|
12
|
+
export declare const TOOL_ICON_MAP: Record<string, ToolIconId>;
|
|
13
13
|
/**
|
|
14
14
|
* Resolve a tool name to its canonical `ToolIconId`. Case-insensitive.
|
|
15
15
|
* Unknown names — including `mcp__*` server tools and plugin tools — fall back
|
|
16
16
|
* to `'fallback'`.
|
|
17
17
|
*/
|
|
18
|
-
declare function getToolIcon(name: string): ToolIconId;
|
|
19
|
-
|
|
20
|
-
export { TOOL_ICON_CONFIG, TOOL_ICON_MAP, type ToolIconId, getToolIcon };
|
|
18
|
+
export declare function getToolIcon(name: string): ToolIconId;
|
|
19
|
+
//# sourceMappingURL=tool-icons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-icons.d.ts","sourceRoot":"","sources":["../src/tool-icons.ts"],"names":[],"mappings":"AAYA,6DAA6D;AAC7D,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,KAAK,GACL,KAAK,GACL,MAAM,GACN,MAAM,GACN,MAAM,GACN,SAAS,GACT,UAAU,GACV,UAAU,GACV,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,OAAO,GACP,MAAM,GACN,MAAM,GACN,MAAM,GACN,UAAU,GACV,OAAO,GACP,UAAU,CAAC;AAEf,8EAA8E;AAC9E,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,UAAU,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAyBlE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAgFpD,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAGpD"}
|
package/dist/tool-icons.js
CHANGED
|
@@ -92,6 +92,9 @@ var TOOL_ICON_MAP = {
|
|
|
92
92
|
lint: "code",
|
|
93
93
|
format: "settings",
|
|
94
94
|
typecheck: "code",
|
|
95
|
+
language_info: "code",
|
|
96
|
+
language: "code",
|
|
97
|
+
language_package: "package",
|
|
95
98
|
test: "test",
|
|
96
99
|
// ── packages ──
|
|
97
100
|
install: "package",
|
|
@@ -118,13 +121,22 @@ var TOOL_ICON_MAP = {
|
|
|
118
121
|
remember: "brain",
|
|
119
122
|
forget: "brain",
|
|
120
123
|
search_memory: "brain",
|
|
121
|
-
find_related_memories: "brain"
|
|
124
|
+
find_related_memories: "brain",
|
|
125
|
+
memory_for_file: "brain",
|
|
126
|
+
memory_for_path: "brain",
|
|
127
|
+
memory_search: "brain",
|
|
128
|
+
memory_graph: "brain",
|
|
129
|
+
memory_verify: "brain",
|
|
130
|
+
memory_hygiene: "brain",
|
|
131
|
+
memory_candidates: "brain"
|
|
122
132
|
};
|
|
123
133
|
function getToolIcon(name) {
|
|
124
134
|
if (!name) return "fallback";
|
|
125
135
|
return TOOL_ICON_MAP[name.toLowerCase()] ?? "fallback";
|
|
126
136
|
}
|
|
127
|
-
|
|
128
|
-
|
|
137
|
+
export {
|
|
138
|
+
TOOL_ICON_CONFIG,
|
|
139
|
+
TOOL_ICON_MAP,
|
|
140
|
+
getToolIcon
|
|
141
|
+
};
|
|
129
142
|
//# sourceMappingURL=tool-icons.js.map
|
|
130
|
-
//# sourceMappingURL=tool-icons.js.map
|
package/dist/tool-icons.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/tool-icons.ts"],
|
|
4
|
+
"sourcesContent": ["// Canonical, surface-agnostic per-tool icon identity + color.\n//\n// This is PURE DATA (no node imports) so it is safe to import from the browser\n// (WebUI) as well as the TUI. Each surface maps a `ToolIconId` to its own\n// rendering primitive \u2014 the WebUI to a lucide-react component (`tool-icon.ts`),\n// the TUI to a unicode glyph (`tool-glyph.ts`) \u2014 and pulls the shared color\n// from `TOOL_ICON_CONFIG` so both stay in lockstep.\n//\n// Add a new tool by giving it an entry in `TOOL_ICON_MAP` (name \u2192 id). The id\n// must be one of the `ToolIconId` union members below; every id already has a\n// color, a lucide component, and a glyph.\n\n/** The closed set of visual identities a tool can map to. */\nexport type ToolIconId =\n | 'file'\n | 'edit'\n | 'search'\n | 'folder'\n | 'terminal'\n | 'web'\n | 'git'\n | 'tree'\n | 'code'\n | 'test'\n | 'package'\n | 'document'\n | 'scaffold'\n | 'todo'\n | 'plan'\n | 'task'\n | 'meta'\n | 'index'\n | 'json'\n | 'diff'\n | 'logs'\n | 'settings'\n | 'brain'\n | 'fallback';\n\n/** Canonical hex color per icon id \u2014 the single source both surfaces read. */\nexport const TOOL_ICON_CONFIG: Record<ToolIconId, { color: string }> = {\n file: { color: '#60a5fa' }, // blue\n edit: { color: '#fbbf24' }, // amber\n search: { color: '#a78bfa' }, // violet\n folder: { color: '#38bdf8' }, // sky\n terminal: { color: '#67e8f9' }, // cyan-light\n web: { color: '#34d399' }, // emerald\n git: { color: '#a3e635' }, // lime\n tree: { color: '#22d3ee' }, // cyan\n code: { color: '#818cf8' }, // indigo\n test: { color: '#4ade80' }, // green\n package: { color: '#f472b6' }, // pink\n document: { color: '#94a3b8' }, // slate\n scaffold: { color: '#c084fc' }, // purple\n todo: { color: '#facc15' }, // yellow\n plan: { color: '#2dd4bf' }, // teal\n task: { color: '#5eead4' }, // teal-light\n meta: { color: '#cbd5e1' }, // slate-light\n index: { color: '#06b6d4' }, // cyan-dark\n json: { color: '#eab308' }, // yellow-dark\n diff: { color: '#93c5fd' }, // blue-light\n logs: { color: '#a3a3a3' }, // neutral\n settings: { color: '#9ca3af' }, // gray\n brain: { color: '#e879f9' }, // fuchsia\n fallback: { color: '#9ca3af' }, // gray\n};\n\n/**\n * Tool name (and common alias) \u2192 icon id. Keys are lowercase; `getToolIcon`\n * lowercases the query, so lookups are case-insensitive. Covers every builtin\n * tool plus the aliases models commonly emit.\n */\nexport const TOOL_ICON_MAP: Record<string, ToolIconId> = {\n // \u2500\u2500 file IO \u2500\u2500\n read: 'file',\n cat: 'file',\n view: 'file',\n write: 'file',\n create: 'file',\n edit: 'edit',\n replace: 'edit',\n str_replace: 'edit',\n multi_edit: 'edit',\n patch: 'diff',\n // \u2500\u2500 search \u2500\u2500\n grep: 'search',\n search: 'search',\n rg: 'search',\n ripgrep: 'search',\n glob: 'search',\n find: 'search',\n // \u2500\u2500 navigation \u2500\u2500\n folder: 'folder',\n ls: 'folder',\n list: 'folder',\n set_working_dir: 'folder',\n tree: 'tree',\n // \u2500\u2500 shell \u2500\u2500\n bash: 'terminal',\n shell: 'terminal',\n sh: 'terminal',\n exec: 'terminal',\n run: 'terminal',\n command: 'terminal',\n // \u2500\u2500 web \u2500\u2500\n fetch: 'web',\n web_fetch: 'web',\n web_search: 'web',\n // \u2500\u2500 vcs \u2500\u2500\n git: 'git',\n diff: 'diff',\n // \u2500\u2500 code quality \u2500\u2500\n lint: 'code',\n format: 'settings',\n typecheck: 'code',\n language_info: 'code',\n language: 'code',\n language_package: 'package',\n test: 'test',\n // \u2500\u2500 packages \u2500\u2500\n install: 'package',\n outdated: 'package',\n audit: 'package',\n // \u2500\u2500 docs / scaffold \u2500\u2500\n document: 'document',\n scaffold: 'scaffold',\n // \u2500\u2500 planning / work tracking \u2500\u2500\n todo: 'todo',\n plan: 'plan',\n task: 'task',\n // \u2500\u2500 data \u2500\u2500\n json: 'json',\n index: 'index',\n logs: 'logs',\n // \u2500\u2500 meta / tooling \u2500\u2500\n mode: 'meta',\n tool_search: 'meta',\n tool_use: 'meta',\n batch_tool_use: 'meta',\n tool_help: 'meta',\n // \u2500\u2500 memory \u2500\u2500\n remember: 'brain',\n forget: 'brain',\n search_memory: 'brain',\n find_related_memories: 'brain',\n memory_for_file: 'brain',\n memory_for_path: 'brain',\n memory_search: 'brain',\n memory_graph: 'brain',\n memory_verify: 'brain',\n memory_hygiene: 'brain',\n memory_candidates: 'brain',\n};\n\n/**\n * Resolve a tool name to its canonical `ToolIconId`. Case-insensitive.\n * Unknown names \u2014 including `mcp__*` server tools and plugin tools \u2014 fall back\n * to `'fallback'`.\n */\nexport function getToolIcon(name: string): ToolIconId {\n if (!name) return 'fallback';\n return TOOL_ICON_MAP[name.toLowerCase()] ?? 'fallback';\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/tool-search.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { Tool } from '@wrongstack/core';
|
|
2
|
-
|
|
1
|
+
import type { Tool } from '@wrongstack/core';
|
|
3
2
|
interface ToolSearchInput {
|
|
4
3
|
query?: string | undefined;
|
|
5
4
|
tags?: string[] | undefined;
|
|
@@ -19,6 +18,6 @@ interface ToolSearchOutput {
|
|
|
19
18
|
/** Total count of tools in the registry (for "no results" hints). */
|
|
20
19
|
_available?: number;
|
|
21
20
|
}
|
|
22
|
-
declare const toolSearchTool: Tool<ToolSearchInput, ToolSearchOutput>;
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
export declare const toolSearchTool: Tool<ToolSearchInput, ToolSearchOutput>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=tool-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-search.d.ts","sourceRoot":"","sources":["../src/tool-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,UAAU,eAAe;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED,UAAU,gBAAgB;IACxB,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,OAAO,CAAC;KACnB,EAAE,CAAC;IACJ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAmGlE,CAAC"}
|