@wrongstack/tools 0.310.1 → 0.313.1

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.
Files changed (135) hide show
  1. package/dist/_shell-pick.d.ts +5 -10
  2. package/dist/audit.js +10 -4055
  3. package/dist/bash.js +9 -2332
  4. package/dist/batch-tool-use.js +2 -187
  5. package/dist/browser/index.js +25 -1339
  6. package/dist/builtin.js +69 -33985
  7. package/dist/chunk-2CTB3UK5.js +197 -0
  8. package/dist/chunk-2ME7ZWDD.js +1272 -0
  9. package/dist/chunk-2TFQDEPU.js +113 -0
  10. package/dist/chunk-2ZCJNKFE.js +315 -0
  11. package/dist/chunk-3PVYQFRQ.js +472 -0
  12. package/dist/chunk-3QMQBO5Z.js +89 -0
  13. package/dist/chunk-42AKKX7O.js +385 -0
  14. package/dist/chunk-42SKEETB.js +113 -0
  15. package/dist/chunk-4BHUSMNL.js +104 -0
  16. package/dist/chunk-4I4LWFOO.js +431 -0
  17. package/dist/chunk-553IQUMO.js +478 -0
  18. package/dist/chunk-55KF77OK.js +1944 -0
  19. package/dist/chunk-6HLZK37X.js +359 -0
  20. package/dist/chunk-6RNIFLG4.js +305 -0
  21. package/dist/chunk-A6BRWIXN.js +317 -0
  22. package/dist/chunk-AHHDWNXC.js +200 -0
  23. package/dist/chunk-B2CIOKWP.js +899 -0
  24. package/dist/chunk-BTSFTGIL.js +7 -0
  25. package/dist/chunk-D33S4RQG.js +222 -0
  26. package/dist/chunk-DIJKHSUO.js +134 -0
  27. package/dist/chunk-DPL47QGS.js +3515 -0
  28. package/dist/chunk-EMRGN4KM.js +170 -0
  29. package/dist/chunk-FGOABE4Z.js +955 -0
  30. package/dist/chunk-FW65TP4G.js +520 -0
  31. package/dist/chunk-GOIZNNOA.js +221 -0
  32. package/dist/chunk-H5MJUAA6.js +295 -0
  33. package/dist/chunk-H5OHH6F4.js +223 -0
  34. package/dist/chunk-HC5RM4WY.js +199 -0
  35. package/dist/chunk-HEQFMLZ7.js +190 -0
  36. package/dist/chunk-HFXSNKCV.js +196 -0
  37. package/dist/chunk-HXSBQ2SE.js +1723 -0
  38. package/dist/chunk-ILESNGNM.js +163 -0
  39. package/dist/chunk-INF5CGAO.js +137 -0
  40. package/dist/chunk-IWDFZ6XR.js +337 -0
  41. package/dist/chunk-IXMNTNW5.js +238 -0
  42. package/dist/chunk-J4SRJKBW.js +428 -0
  43. package/dist/chunk-J5SKD6LN.js +235 -0
  44. package/dist/chunk-JRJJX3L5.js +424 -0
  45. package/dist/chunk-KXNDHMUB.js +366 -0
  46. package/dist/chunk-LIJQMYYX.js +59 -0
  47. package/dist/chunk-MAN26PZ5.js +260 -0
  48. package/dist/chunk-MKRQMLZA.js +474 -0
  49. package/dist/chunk-NBDZMMG2.js +169 -0
  50. package/dist/chunk-NHA6BEIH.js +101 -0
  51. package/dist/chunk-OA6YJIWL.js +4412 -0
  52. package/dist/chunk-OZC255IC.js +2830 -0
  53. package/dist/chunk-PUR6WU2B.js +154 -0
  54. package/dist/chunk-Q5JPPCZC.js +12 -0
  55. package/dist/chunk-QBV725YG.js +128 -0
  56. package/dist/chunk-QHVW4AAM.js +892 -0
  57. package/dist/chunk-QNJ7AQ4B.js +1000 -0
  58. package/dist/chunk-RGISBZBD.js +231 -0
  59. package/dist/chunk-RJZQWEMS.js +84 -0
  60. package/dist/chunk-RP2ZA47V.js +15 -0
  61. package/dist/chunk-RXISBFR5.js +315 -0
  62. package/dist/chunk-S5CCLZL3.js +99 -0
  63. package/dist/chunk-TVTCSBJF.js +122 -0
  64. package/dist/chunk-U4D5S3VQ.js +21 -0
  65. package/dist/chunk-U4VAATKP.js +193 -0
  66. package/dist/chunk-UKU2ZX4C.js +203 -0
  67. package/dist/chunk-UNSKG6DC.js +159 -0
  68. package/dist/chunk-URFKEIHM.js +1091 -0
  69. package/dist/chunk-UTV7YAW7.js +178 -0
  70. package/dist/chunk-V43EQ6VR.js +68 -0
  71. package/dist/chunk-VB3MJGCV.js +610 -0
  72. package/dist/chunk-WHIIIREL.js +223 -0
  73. package/dist/chunk-XMIFYKUT.js +1371 -0
  74. package/dist/chunk-YF2RSV34.js +54 -0
  75. package/dist/chunk-Z6DAKQ3U.js +1 -0
  76. package/dist/chunk-ZIGAZFWE.js +522 -0
  77. package/dist/circuit-breaker.js +3 -191
  78. package/dist/codebase-index/index.js +84 -13688
  79. package/dist/codebase-index/parser-worker-script.js +8 -3995
  80. package/dist/codebase-index/project-server.js +60 -8548
  81. package/dist/codebase-index/worker.js +20 -8416
  82. package/dist/design.js +2 -299
  83. package/dist/diff.js +4 -256
  84. package/dist/document.js +4 -222
  85. package/dist/e2e.js +5 -476
  86. package/dist/edit.js +14 -10200
  87. package/dist/exec.js +16 -3131
  88. package/dist/fetch.js +8 -398
  89. package/dist/format.js +10 -3750
  90. package/dist/generic-parser-VUXDIAOZ.js +13 -0
  91. package/dist/git.js +4 -380
  92. package/dist/glob.js +6 -280
  93. package/dist/go-parser-6CA77WZ4.js +469 -0
  94. package/dist/grep.js +7 -604
  95. package/dist/index.js +318 -35423
  96. package/dist/install.js +10 -4091
  97. package/dist/json-parser-7YMDJSBJ.js +213 -0
  98. package/dist/json.js +4 -665
  99. package/dist/kanban.js +3 -2096
  100. package/dist/languages/index.js +23 -4664
  101. package/dist/legacy-bridge-7UKZT46G.js +18 -0
  102. package/dist/lint.js +10 -3706
  103. package/dist/logs.js +4 -287
  104. package/dist/memory.js +6 -215
  105. package/dist/mode.js +3 -99
  106. package/dist/outdated.js +4 -5170
  107. package/dist/pack.js +65 -33933
  108. package/dist/parser-dispatch-VPOFDO2U.js +14 -0
  109. package/dist/patch.js +13 -9935
  110. package/dist/plan.js +5 -3286
  111. package/dist/process-registry.js +8 -651
  112. package/dist/ps-slash.js +12 -1439
  113. package/dist/py-parser-GPM5VYRG.js +16 -0
  114. package/dist/read.js +13 -9816
  115. package/dist/replace.js +15 -10014
  116. package/dist/rs-parser-WVQ4KYCX.js +81 -0
  117. package/dist/scaffold.js +4 -253
  118. package/dist/search.js +5 -585
  119. package/dist/session-kanban.js +30 -972
  120. package/dist/skill.js +2 -215
  121. package/dist/task.js +5 -3410
  122. package/dist/test.js +10 -3773
  123. package/dist/todo.js +4 -2891
  124. package/dist/tool-help.js +3 -123
  125. package/dist/tool-search.js +3 -79
  126. package/dist/tool-tier.js +68 -34020
  127. package/dist/tool-use.js +2 -93
  128. package/dist/tree-sitter-parser-YCILHGZD.js +17 -0
  129. package/dist/tree.js +4 -288
  130. package/dist/ts-parser-YH4ZMWMH.js +232 -0
  131. package/dist/typecheck.js +10 -3753
  132. package/dist/win32.js +6 -60
  133. package/dist/write.js +14 -9882
  134. package/dist/yaml-parser-GFAOKV53.js +157 -0
  135. package/package.json +5 -5
@@ -0,0 +1,154 @@
1
+ import {
2
+ checkSyntax
3
+ } from "./chunk-3QMQBO5Z.js";
4
+ import {
5
+ enqueueReindex
6
+ } from "./chunk-2ME7ZWDD.js";
7
+ import {
8
+ safeResolveReal,
9
+ sha256hex,
10
+ truncateDiffPayload
11
+ } from "./chunk-D33S4RQG.js";
12
+
13
+ // src/write.ts
14
+ import * as fs from "node:fs/promises";
15
+ import { ToolValidationError } from "@wrongstack/core/types";
16
+ import {
17
+ atomicWrite,
18
+ detectNewlineStyle,
19
+ normalizeToLf,
20
+ toStyle,
21
+ unifiedDiff
22
+ } from "@wrongstack/core/utils";
23
+ var MAX_DIFF_BYTES = 262144;
24
+ var writeTool = {
25
+ name: "write",
26
+ category: "Filesystem",
27
+ description: "Write or completely overwrite a file on disk. This is a high-privilege operation. For modifying existing files, you should almost always prefer the `edit` tool instead, because `edit` is safer and works on the last-read version of the file.",
28
+ usageHint: "RULES FOR CORRECT USAGE:\n- Use `write` primarily for **new files** or when you want to replace the entire content.\n- For any existing file, strongly prefer `edit` (it requires a prior `read` in the same session and is more precise).\n- When overwriting an existing file, the tool reads the current content itself to compute the diff \u2014 but still `read` the file first before large rewrites so you know what you are replacing.\n- When overwriting an existing file, the content is normalized to the dominant line-ending style (CRLF/LF) of the existing file; new files are written verbatim.\n- The path is resolved relative to the project root and protected against escaping the workspace.",
29
+ selection: {
30
+ doNotUseWhen: "making a precise change to part of an existing file.",
31
+ useInstead: ["edit"]
32
+ },
33
+ permission: "confirm",
34
+ // WS-046: gives permission decisions something to key on — the file being
35
+ // written, so trust rules can scope by path.
36
+ subjectKey: "path",
37
+ mutating: true,
38
+ timeoutMs: 5e3,
39
+ maxOutputBytes: 262144,
40
+ capabilities: ["fs.write"],
41
+ icon: "file",
42
+ inputSchema: {
43
+ type: "object",
44
+ properties: {
45
+ path: {
46
+ type: "string",
47
+ description: "Relative path from project root. Must not escape the project."
48
+ },
49
+ content: {
50
+ type: "string",
51
+ description: "The complete new content of the file."
52
+ }
53
+ },
54
+ required: ["path", "content"]
55
+ },
56
+ async execute(input, ctx, opts) {
57
+ return writeFile(input, ctx, opts?.signal);
58
+ },
59
+ async *executeStream(input, ctx, opts) {
60
+ const prepared = await prepareWrite(input, ctx);
61
+ if (!prepared.existed) {
62
+ for (const line of input.content.split("\n")) {
63
+ yield { type: "partial_output", text: `${line}
64
+ `, data: { livePreview: true } };
65
+ }
66
+ }
67
+ yield { type: "final", output: await finishWrite(input, ctx, prepared, opts?.signal) };
68
+ }
69
+ };
70
+ async function writeFile(input, ctx, signal) {
71
+ return finishWrite(input, ctx, await prepareWrite(input, ctx), signal);
72
+ }
73
+ async function prepareWrite(input, ctx) {
74
+ if (!input?.path) {
75
+ throw new ToolValidationError({
76
+ message: "write: path is required",
77
+ field: "path"
78
+ });
79
+ }
80
+ if (input.content === void 0) {
81
+ throw new ToolValidationError({
82
+ message: "write: content is required",
83
+ field: "content"
84
+ });
85
+ }
86
+ const absPath = await safeResolveReal(input.path, ctx);
87
+ let existed = false;
88
+ let prev = "";
89
+ try {
90
+ const stat2 = await fs.stat(absPath);
91
+ existed = stat2.isFile();
92
+ if (existed) {
93
+ if (!ctx.hasRead(absPath)) {
94
+ prev = await fs.readFile(absPath, "utf8");
95
+ ctx.recordRead(absPath, stat2.mtimeMs, "write", sha256hex(prev));
96
+ } else {
97
+ prev = await fs.readFile(absPath, "utf8");
98
+ }
99
+ }
100
+ } catch (err) {
101
+ if (err.code !== "ENOENT") {
102
+ throw err;
103
+ }
104
+ }
105
+ return { absPath, existed, prev };
106
+ }
107
+ async function finishWrite(input, ctx, prepared, signal) {
108
+ const content = prepared.existed ? toStyle(normalizeToLf(input.content), detectNewlineStyle(prepared.prev)) : input.content;
109
+ signal?.throwIfAborted();
110
+ await atomicWrite(prepared.absPath, content);
111
+ try {
112
+ enqueueReindex({ projectRoot: ctx.projectRoot, files: [prepared.absPath] });
113
+ } catch {
114
+ }
115
+ const rawDiff = prepared.existed ? unifiedDiff(prepared.prev, content, { fromFile: input.path, toFile: input.path }) : `+++ ${input.path}
116
+ + (new file, ${content.split("\n").length} lines)`;
117
+ const { text: diff, truncated: diffTruncated } = truncateDiffPayload(rawDiff, MAX_DIFF_BYTES);
118
+ const stat2 = await fs.stat(prepared.absPath);
119
+ ctx.recordRead(prepared.absPath, stat2.mtimeMs, "write", sha256hex(content));
120
+ ctx.session?.recordFileChange?.({
121
+ path: prepared.absPath,
122
+ action: prepared.existed ? "modified" : "created",
123
+ before: prepared.existed ? prepared.prev : null,
124
+ after: content
125
+ });
126
+ const syntax = await checkSyntax(
127
+ prepared.absPath,
128
+ content,
129
+ prepared.existed ? prepared.prev : void 0
130
+ ).catch(() => void 0);
131
+ const hasSyntaxErrors = syntax !== void 0 && syntax.errors.length > 0;
132
+ const notes = [];
133
+ if (diffTruncated) {
134
+ notes.push("Diff truncated to the 256 KiB output budget \u2014 the full write is on disk.");
135
+ }
136
+ if (hasSyntaxErrors) {
137
+ notes.push(
138
+ syntax.preExisting ? "Syntax check: the file still has parse errors (they pre-date this write) \u2014 see syntax_errors." : `Syntax check: the written content has ${syntax.errors.length} parse error(s) \u2014 fix them now, see syntax_errors.`
139
+ );
140
+ }
141
+ return {
142
+ path: prepared.absPath,
143
+ bytes_written: Buffer.byteLength(content, "utf8"),
144
+ created: !prepared.existed,
145
+ diff,
146
+ syntax_errors: hasSyntaxErrors ? syntax.errors : void 0,
147
+ note: notes.length > 0 ? notes.join("\n") : void 0
148
+ };
149
+ }
150
+
151
+ export {
152
+ writeTool
153
+ };
154
+ //# sourceMappingURL=chunk-PUR6WU2B.js.map
@@ -0,0 +1,12 @@
1
+ // src/_regex.ts
2
+ import {
3
+ capSubject,
4
+ compileUserRegex,
5
+ MAX_SUBJECT_LEN
6
+ } from "@wrongstack/primitives";
7
+
8
+ export {
9
+ capSubject,
10
+ compileUserRegex
11
+ };
12
+ //# sourceMappingURL=chunk-Q5JPPCZC.js.map
@@ -0,0 +1,128 @@
1
+ // src/tool-help.ts
2
+ var toolHelpTool = {
3
+ name: "tool_help",
4
+ category: "Meta",
5
+ description: "Get detailed help for a specific tool, including its full input schema and usage guidance. If you do not know which tool to use, search with `tool_search` first, then call this with the tool name.",
6
+ usageHint: "USE WHEN YOU NEED PRECISE TOOL INFORMATION:\n\n- Call with a specific `tool` name when you want the full schema and current usageHint.\n- Omit `tool` to get an overview of all available tools.\n- Different `format` options give you different levels of detail.\n- Tip: use `tool_search` to find the right tool name, then `tool_help` for the full schema.\nThis tool is extremely valuable for self-correction when you are unsure about a tool's interface.",
7
+ permission: "auto",
8
+ mutating: false,
9
+ timeoutMs: 5e3,
10
+ capabilities: ["tool.meta"],
11
+ icon: "meta",
12
+ inputSchema: {
13
+ type: "object",
14
+ properties: {
15
+ tool: {
16
+ type: "string",
17
+ description: "Specific tool name to get detailed help for. Omit to get a list of all tools."
18
+ },
19
+ format: {
20
+ type: "string",
21
+ enum: ["short", "full", "markdown"],
22
+ description: 'Level of detail: "short" (summary), "full" (with full schema), "markdown" (human readable).'
23
+ },
24
+ include_examples: {
25
+ type: "boolean",
26
+ description: "Whether to include example usage in the response."
27
+ }
28
+ }
29
+ },
30
+ async execute(input, ctx) {
31
+ const format = input.format ?? "short";
32
+ const includeExamples = input.include_examples ?? false;
33
+ if (input.tool) {
34
+ const tool = (ctx.catalogTools ?? ctx.tools).find((t) => t.name === input.tool);
35
+ if (!tool) {
36
+ return {
37
+ tool: input.tool,
38
+ help: `No tool found with name "${input.tool}"`,
39
+ tools: [],
40
+ total: 0
41
+ };
42
+ }
43
+ return {
44
+ tool: tool.name,
45
+ help: formatToolHelp(tool, format, includeExamples),
46
+ tools: [
47
+ {
48
+ name: tool.name,
49
+ description: tool.description,
50
+ usageHint: tool.usageHint ?? "",
51
+ inputSchema: tool.inputSchema,
52
+ permission: tool.permission,
53
+ mutating: tool.mutating
54
+ }
55
+ ],
56
+ total: 1
57
+ };
58
+ }
59
+ const allTools = (ctx.catalogTools ?? ctx.tools).map((t) => ({
60
+ name: t.name,
61
+ description: t.description,
62
+ usageHint: t.usageHint ?? "",
63
+ inputSchema: format === "full" ? t.inputSchema : void 0,
64
+ permission: t.permission,
65
+ mutating: t.mutating
66
+ }));
67
+ return {
68
+ help: format === "markdown" ? formatAllToolsMarkdown(allTools) : formatAllToolsShort(allTools),
69
+ tools: allTools,
70
+ total: allTools.length
71
+ };
72
+ }
73
+ };
74
+ function formatToolHelp(tool, format, includeExamples) {
75
+ const lines = [];
76
+ if (format === "short") {
77
+ lines.push(`${tool.name}: ${tool.description}`);
78
+ if (tool.usageHint) lines.push(`Hint: ${tool.usageHint}`);
79
+ return lines.join("\n");
80
+ }
81
+ if (format === "markdown") {
82
+ lines.push(`## ${tool.name}`);
83
+ lines.push("");
84
+ lines.push(tool.description);
85
+ lines.push("");
86
+ lines.push("**Permission:** " + tool.permission);
87
+ lines.push("**Mutating:** " + (tool.mutating ? "yes" : "no"));
88
+ if (tool.usageHint) {
89
+ lines.push("");
90
+ lines.push("### Usage Hint");
91
+ lines.push(tool.usageHint);
92
+ }
93
+ if (includeExamples && tool.inputSchema) {
94
+ lines.push("");
95
+ lines.push("### Input Schema");
96
+ lines.push("```json");
97
+ lines.push(JSON.stringify(tool.inputSchema, null, 2));
98
+ lines.push("```");
99
+ }
100
+ return lines.join("\n");
101
+ }
102
+ lines.push(`Tool: ${tool.name}`);
103
+ lines.push(`Description: ${tool.description}`);
104
+ lines.push(`Permission: ${tool.permission}`);
105
+ lines.push(`Mutating: ${tool.mutating}`);
106
+ if (tool.usageHint) lines.push(`Usage: ${tool.usageHint}`);
107
+ if (format === "full" && tool.inputSchema) {
108
+ lines.push("Schema: " + JSON.stringify(tool.inputSchema, null, 2));
109
+ }
110
+ return lines.join("\n");
111
+ }
112
+ function formatAllToolsShort(tools) {
113
+ return tools.map((t) => ` ${t.name.padEnd(16)} ${t.description}`).join("\n");
114
+ }
115
+ function formatAllToolsMarkdown(tools) {
116
+ const lines = ["## Available Tools", ""];
117
+ lines.push("| Tool | Description |");
118
+ lines.push("|------|-------------|");
119
+ for (const t of tools) {
120
+ lines.push(`| \`${t.name}\` | ${t.description} |`);
121
+ }
122
+ return lines.join("\n");
123
+ }
124
+
125
+ export {
126
+ toolHelpTool
127
+ };
128
+ //# sourceMappingURL=chunk-QBV725YG.js.map