hoomanjs 1.55.3 → 1.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/acp/acp-agent.js +25 -2
- package/dist/acp/acp-agent.js.map +1 -1
- package/dist/acp/approvals.js +10 -3
- package/dist/acp/approvals.js.map +1 -1
- package/dist/acp/utils/tool-kind.js +1 -1
- package/dist/acp/utils/tool-kind.js.map +1 -1
- package/dist/acp/utils/tool-locations.js +12 -2
- package/dist/acp/utils/tool-locations.js.map +1 -1
- package/dist/chat/app.js +15 -0
- package/dist/chat/app.js.map +1 -1
- package/dist/chat/approvals.js +3 -0
- package/dist/chat/approvals.js.map +1 -1
- package/dist/chat/components/ApprovalPrompt.js +15 -4
- package/dist/chat/components/ApprovalPrompt.js.map +1 -1
- package/dist/chat/types.d.ts +1 -0
- package/dist/core/agent/gitignore-guard-plugin.js +12 -2
- package/dist/core/agent/gitignore-guard-plugin.js.map +1 -1
- package/dist/core/agent/index.js +11 -5
- package/dist/core/agent/index.js.map +1 -1
- package/dist/core/{prompts/session-mode.js → agent/session-mode-plugin.js} +2 -2
- package/dist/core/agent/session-mode-plugin.js.map +1 -0
- package/dist/core/approvals/allowlist.js +1 -1
- package/dist/core/approvals/allowlist.js.map +1 -1
- package/dist/core/approvals/intervention.d.ts +3 -0
- package/dist/core/approvals/intervention.js +16 -0
- package/dist/core/approvals/intervention.js.map +1 -1
- package/dist/core/filesystem/backend.d.ts +13 -0
- package/dist/core/filesystem/backend.js +2 -0
- package/dist/core/filesystem/backend.js.map +1 -0
- package/dist/core/filesystem/backends/index.d.ts +2 -0
- package/dist/core/filesystem/backends/index.js +3 -0
- package/dist/core/filesystem/backends/index.js.map +1 -0
- package/dist/core/filesystem/backends/local-fs-backend.d.ts +6 -0
- package/dist/core/filesystem/backends/local-fs-backend.js +17 -0
- package/dist/core/filesystem/backends/local-fs-backend.js.map +1 -0
- package/dist/core/filesystem/backends/remote-fs-backend.d.ts +12 -0
- package/dist/core/filesystem/backends/remote-fs-backend.js +20 -0
- package/dist/core/filesystem/backends/remote-fs-backend.js.map +1 -0
- package/dist/core/filesystem/edits/apply.d.ts +4 -0
- package/dist/core/filesystem/edits/apply.js +104 -0
- package/dist/core/filesystem/edits/apply.js.map +1 -0
- package/dist/core/filesystem/edits/types.d.ts +28 -0
- package/dist/core/filesystem/edits/types.js +2 -0
- package/dist/core/filesystem/edits/types.js.map +1 -0
- package/dist/core/filesystem/index.d.ts +12 -0
- package/dist/core/filesystem/index.js +12 -0
- package/dist/core/filesystem/index.js.map +1 -0
- package/dist/core/filesystem/registry.d.ts +4 -0
- package/dist/core/filesystem/registry.js +13 -0
- package/dist/core/filesystem/registry.js.map +1 -0
- package/dist/core/{tools/filesystem.d.ts → filesystem/tools.d.ts} +40 -8
- package/dist/core/{tools/filesystem.js → filesystem/tools.js} +65 -271
- package/dist/core/filesystem/tools.js.map +1 -0
- package/dist/core/modes/definitions.js +4 -4
- package/dist/core/modes/definitions.js.map +1 -1
- package/dist/core/prompts/modes/agent.md +1 -1
- package/dist/core/prompts/modes/ask.md +1 -1
- package/dist/core/prompts/modes/design.md +1 -1
- package/dist/core/prompts/modes/plan.md +1 -1
- package/dist/core/prompts/static/filesystem.md +2 -2
- package/dist/core/prompts/static/switch-mode.md +4 -2
- package/dist/core/state/tool-approvals.d.ts +1 -1
- package/dist/core/state/tool-approvals.js +31 -21
- package/dist/core/state/tool-approvals.js.map +1 -1
- package/dist/core/subagents/index.d.ts +1 -0
- package/dist/core/subagents/index.js +1 -0
- package/dist/core/subagents/index.js.map +1 -1
- package/dist/core/subagents/tool.d.ts +3 -0
- package/dist/core/subagents/tool.js +11 -0
- package/dist/core/subagents/tool.js.map +1 -1
- package/dist/core/subagents/usage.d.ts +12 -0
- package/dist/core/subagents/usage.js +23 -0
- package/dist/core/subagents/usage.js.map +1 -0
- package/dist/core/tools/index.d.ts +0 -1
- package/dist/core/tools/index.js +0 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/switch-mode.js +11 -5
- package/dist/core/tools/switch-mode.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/core/prompts/session-mode.js.map +0 -1
- package/dist/core/tools/filesystem.js.map +0 -1
- /package/dist/core/{prompts/session-mode.d.ts → agent/session-mode-plugin.d.ts} +0 -0
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { applyFileEdit, applyFileEdits, getFsBackend, } from "./index.js";
|
|
2
2
|
import fs from "node:fs/promises";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { tool, TextBlock, } from "@strands-agents/sdk";
|
|
5
5
|
import { normalizeUserPath } from "../utils/normalize-user-path.js";
|
|
6
6
|
import { resolveAgentInstructionsForFile } from "../prompts/runtime/agents.js";
|
|
7
|
-
import { setFileToolDisplay, } from "../state/file-tool-display.js";
|
|
8
7
|
import { readAttachmentAsBlocksOrBase64, } from "../utils/attachments.js";
|
|
9
|
-
import { findReplacementSpan, unescapeModelText, } from "../utils/edit-replace.js";
|
|
10
8
|
import { getLlmModality } from "../state/llm-modality.js";
|
|
11
9
|
import { z } from "zod";
|
|
12
10
|
import { createGitignorePredicate } from "../utils/gitignore.js";
|
|
@@ -21,17 +19,44 @@ export function getTextFsBackend(agent) {
|
|
|
21
19
|
const DEFAULT_READ_LIMIT = 250;
|
|
22
20
|
const DEFAULT_MAX_READ_BYTES = 1024 * 1024;
|
|
23
21
|
const DEFAULT_TREE_DEPTH = 4;
|
|
24
|
-
const SNIPPET_RADIUS = 3;
|
|
25
22
|
const FAST_READ_MAX_BYTES = 10 * 1024 * 1024;
|
|
26
23
|
const STREAM_HIGH_WATER_MARK = 512 * 1024;
|
|
27
24
|
const runtimeResolvedAgentInstructionPaths = new WeakMap();
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
.
|
|
31
|
-
.
|
|
32
|
-
.
|
|
33
|
-
|
|
34
|
-
|
|
25
|
+
const FileEditSchema = z.discriminatedUnion("mode", [
|
|
26
|
+
z
|
|
27
|
+
.object({
|
|
28
|
+
path: z.string(),
|
|
29
|
+
mode: z.literal("write"),
|
|
30
|
+
content: z.string(),
|
|
31
|
+
expected_sha256: z.string().optional(),
|
|
32
|
+
})
|
|
33
|
+
.strict(),
|
|
34
|
+
z
|
|
35
|
+
.object({
|
|
36
|
+
path: z.string(),
|
|
37
|
+
mode: z.literal("edit"),
|
|
38
|
+
content: z.string(),
|
|
39
|
+
insert_at: z.number().int().min(1),
|
|
40
|
+
replace_until: z.number().int().min(1).nullable().optional(),
|
|
41
|
+
expected_sha256: z.string().optional(),
|
|
42
|
+
})
|
|
43
|
+
.strict(),
|
|
44
|
+
z
|
|
45
|
+
.object({
|
|
46
|
+
path: z.string(),
|
|
47
|
+
mode: z.literal("rename"),
|
|
48
|
+
new_path: z.string(),
|
|
49
|
+
expected_sha256: z.string().optional(),
|
|
50
|
+
})
|
|
51
|
+
.strict(),
|
|
52
|
+
z
|
|
53
|
+
.object({
|
|
54
|
+
path: z.string(),
|
|
55
|
+
mode: z.literal("delete"),
|
|
56
|
+
expected_sha256: z.string().optional(),
|
|
57
|
+
})
|
|
58
|
+
.strict(),
|
|
59
|
+
]);
|
|
35
60
|
const textReadState = new Map();
|
|
36
61
|
function toJsonValue(value) {
|
|
37
62
|
return JSON.parse(JSON.stringify(value));
|
|
@@ -109,24 +134,6 @@ function globToRegExp(pattern) {
|
|
|
109
134
|
function splitLines(content) {
|
|
110
135
|
return content.split(/\r?\n/);
|
|
111
136
|
}
|
|
112
|
-
function normalizeLineEndings(content) {
|
|
113
|
-
return content.replaceAll("\r\n", "\n");
|
|
114
|
-
}
|
|
115
|
-
function detectLineEndings(content) {
|
|
116
|
-
return content.includes("\r\n") ? "CRLF" : "LF";
|
|
117
|
-
}
|
|
118
|
-
function restoreLineEndings(content, lineEndings) {
|
|
119
|
-
if (lineEndings === "LF") {
|
|
120
|
-
return content;
|
|
121
|
-
}
|
|
122
|
-
return normalizeLineEndings(content).split("\n").join("\r\n");
|
|
123
|
-
}
|
|
124
|
-
function countLines(content) {
|
|
125
|
-
if (content.length === 0) {
|
|
126
|
-
return 0;
|
|
127
|
-
}
|
|
128
|
-
return splitLines(content).length;
|
|
129
|
-
}
|
|
130
137
|
function makeLineExcerpt(content, offset = 1, limit = DEFAULT_READ_LIMIT) {
|
|
131
138
|
const lines = splitLines(content);
|
|
132
139
|
const totalLines = lines.length;
|
|
@@ -299,118 +306,6 @@ async function readBinaryFile(filePath, options) {
|
|
|
299
306
|
metadata: options?.modality ?? null,
|
|
300
307
|
});
|
|
301
308
|
}
|
|
302
|
-
function snippetAroundChange(content, index, replacementLength) {
|
|
303
|
-
const before = content.slice(0, index);
|
|
304
|
-
const startLine = Math.max(0, countLines(before) - SNIPPET_RADIUS);
|
|
305
|
-
const endLine = countLines(before) + replacementLength + SNIPPET_RADIUS;
|
|
306
|
-
const lines = splitLines(content);
|
|
307
|
-
return lines.slice(startLine, endLine).join("\n");
|
|
308
|
-
}
|
|
309
|
-
function lineNumberForIndex(content, index) {
|
|
310
|
-
let line = 1;
|
|
311
|
-
for (let i = 0; i < index; i += 1) {
|
|
312
|
-
if (content[i] === "\n") {
|
|
313
|
-
line += 1;
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
return line;
|
|
317
|
-
}
|
|
318
|
-
function buildPatchHunk(original, oldText, newText, index) {
|
|
319
|
-
const originalLines = splitLines(original);
|
|
320
|
-
const oldLines = splitLines(oldText);
|
|
321
|
-
const newLines = splitLines(newText);
|
|
322
|
-
const changedLine = lineNumberForIndex(original, index);
|
|
323
|
-
const contextStart = Math.max(1, changedLine - SNIPPET_RADIUS);
|
|
324
|
-
const oldStart = contextStart;
|
|
325
|
-
const newStart = contextStart;
|
|
326
|
-
const prefixContext = originalLines.slice(contextStart - 1, changedLine - 1);
|
|
327
|
-
const oldEnd = changedLine + oldLines.length - 1;
|
|
328
|
-
const suffixContext = originalLines.slice(oldEnd, Math.min(originalLines.length, oldEnd + SNIPPET_RADIUS));
|
|
329
|
-
const lines = [
|
|
330
|
-
...prefixContext.map((line) => ` ${line}`),
|
|
331
|
-
...oldLines.map((line) => `-${line}`),
|
|
332
|
-
...newLines.map((line) => `+${line}`),
|
|
333
|
-
...suffixContext.map((line) => ` ${line}`),
|
|
334
|
-
];
|
|
335
|
-
return {
|
|
336
|
-
oldStart,
|
|
337
|
-
oldLines: prefixContext.length + oldLines.length + suffixContext.length,
|
|
338
|
-
newStart,
|
|
339
|
-
newLines: prefixContext.length + newLines.length + suffixContext.length,
|
|
340
|
-
lines,
|
|
341
|
-
};
|
|
342
|
-
}
|
|
343
|
-
function patchLines(content) {
|
|
344
|
-
return content.length === 0 ? [] : splitLines(content);
|
|
345
|
-
}
|
|
346
|
-
function buildContentPatchHunks(original, edited) {
|
|
347
|
-
const oldLines = patchLines(original);
|
|
348
|
-
const newLines = patchLines(edited);
|
|
349
|
-
let prefix = 0;
|
|
350
|
-
while (prefix < oldLines.length &&
|
|
351
|
-
prefix < newLines.length &&
|
|
352
|
-
oldLines[prefix] === newLines[prefix]) {
|
|
353
|
-
prefix += 1;
|
|
354
|
-
}
|
|
355
|
-
let oldEnd = oldLines.length - 1;
|
|
356
|
-
let newEnd = newLines.length - 1;
|
|
357
|
-
while (oldEnd >= prefix &&
|
|
358
|
-
newEnd >= prefix &&
|
|
359
|
-
oldLines[oldEnd] === newLines[newEnd]) {
|
|
360
|
-
oldEnd -= 1;
|
|
361
|
-
newEnd -= 1;
|
|
362
|
-
}
|
|
363
|
-
if (oldEnd < prefix && newEnd < prefix) {
|
|
364
|
-
return [];
|
|
365
|
-
}
|
|
366
|
-
const contextStart = Math.max(0, prefix - SNIPPET_RADIUS);
|
|
367
|
-
const oldSuffixStart = oldEnd + 1;
|
|
368
|
-
const oldSuffixEnd = Math.min(oldLines.length, oldSuffixStart + SNIPPET_RADIUS);
|
|
369
|
-
const prefixContext = oldLines.slice(contextStart, prefix);
|
|
370
|
-
const removed = oldLines.slice(prefix, oldEnd + 1);
|
|
371
|
-
const added = newLines.slice(prefix, newEnd + 1);
|
|
372
|
-
const suffixContext = oldLines.slice(oldSuffixStart, oldSuffixEnd);
|
|
373
|
-
return [
|
|
374
|
-
{
|
|
375
|
-
oldStart: contextStart + 1,
|
|
376
|
-
oldLines: prefixContext.length + removed.length + suffixContext.length,
|
|
377
|
-
newStart: contextStart + 1,
|
|
378
|
-
newLines: prefixContext.length + added.length + suffixContext.length,
|
|
379
|
-
lines: [
|
|
380
|
-
...prefixContext.map((line) => ` ${line}`),
|
|
381
|
-
...removed.map((line) => `-${line}`),
|
|
382
|
-
...added.map((line) => `+${line}`),
|
|
383
|
-
...suffixContext.map((line) => ` ${line}`),
|
|
384
|
-
],
|
|
385
|
-
},
|
|
386
|
-
];
|
|
387
|
-
}
|
|
388
|
-
function applyEdits(original, edits) {
|
|
389
|
-
let current = original;
|
|
390
|
-
const replacements = [];
|
|
391
|
-
for (const edit of edits) {
|
|
392
|
-
// Compare against the file's normalized (LF) form so line endings never
|
|
393
|
-
// cause a spurious mismatch. The tolerant matcher returns the exact span
|
|
394
|
-
// present in the file, which we splice and diff for byte-accurate output.
|
|
395
|
-
const oldText = normalizeLineEndings(edit.oldText);
|
|
396
|
-
let newText = normalizeLineEndings(edit.newText);
|
|
397
|
-
const { index, text: matched } = findReplacementSpan(current, oldText);
|
|
398
|
-
// If the target only matched after unescaping (the model over-escaped its
|
|
399
|
-
// JSON tool arguments), the replacement carries the same over-escaping.
|
|
400
|
-
if (matched !== oldText && matched === unescapeModelText(oldText)) {
|
|
401
|
-
newText = unescapeModelText(newText);
|
|
402
|
-
}
|
|
403
|
-
const previous = current;
|
|
404
|
-
current =
|
|
405
|
-
current.slice(0, index) + newText + current.slice(index + matched.length);
|
|
406
|
-
replacements.push({
|
|
407
|
-
index,
|
|
408
|
-
snippet: snippetAroundChange(current, index, countLines(newText)),
|
|
409
|
-
hunk: buildPatchHunk(previous, matched, newText, index),
|
|
410
|
-
});
|
|
411
|
-
}
|
|
412
|
-
return { content: current, replacements };
|
|
413
|
-
}
|
|
414
309
|
async function walkDirectory(dirPath, options) {
|
|
415
310
|
const results = [];
|
|
416
311
|
const recursive = options?.recursive ?? false;
|
|
@@ -505,25 +400,9 @@ function createFilesystemSchema() {
|
|
|
505
400
|
.optional()
|
|
506
401
|
.describe("Read each path as binary. Images, videos, and documents become multimodal content blocks (when the model supports them); other binaries come back as base64. Offset/limit are ignored when binary is true."),
|
|
507
402
|
}),
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
append: z.boolean().optional().describe("Append instead of overwrite."),
|
|
512
|
-
create_parents: z
|
|
513
|
-
.boolean()
|
|
514
|
-
.optional()
|
|
515
|
-
.describe("Create parent directories if needed."),
|
|
516
|
-
}),
|
|
517
|
-
editFile: z.object({
|
|
518
|
-
path: z.string().describe("File path to edit."),
|
|
519
|
-
edits: z
|
|
520
|
-
.array(EditSchema)
|
|
521
|
-
.min(1)
|
|
522
|
-
.describe("Exact text replacements to apply in order."),
|
|
523
|
-
dry_run: z
|
|
524
|
-
.boolean()
|
|
525
|
-
.optional()
|
|
526
|
-
.describe("Preview edits without writing the file."),
|
|
403
|
+
editFile: FileEditSchema,
|
|
404
|
+
editMultipleFiles: z.object({
|
|
405
|
+
edits: z.array(FileEditSchema).min(1).max(100),
|
|
527
406
|
}),
|
|
528
407
|
createDirectory: z.object({
|
|
529
408
|
path: z.string().describe("Directory path to create."),
|
|
@@ -645,121 +524,36 @@ export function createFilesystemTools() {
|
|
|
645
524
|
},
|
|
646
525
|
}),
|
|
647
526
|
tool({
|
|
648
|
-
name: "
|
|
649
|
-
description: "
|
|
650
|
-
inputSchema: schema.
|
|
527
|
+
name: "edit_file",
|
|
528
|
+
description: "Create, overwrite, edit line ranges, rename, or delete one file.",
|
|
529
|
+
inputSchema: schema.editFile,
|
|
651
530
|
callback: async (input, context) => {
|
|
652
|
-
const
|
|
653
|
-
const
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
? await backend.readTextFile(filePath)
|
|
663
|
-
: await fs.readFile(filePath, "utf8"));
|
|
664
|
-
fileExisted = true;
|
|
665
|
-
}
|
|
666
|
-
catch {
|
|
667
|
-
oldContent = "";
|
|
668
|
-
}
|
|
669
|
-
const newContent = input.append
|
|
670
|
-
? `${oldContent}${normalizeLineEndings(input.content)}`
|
|
671
|
-
: normalizeLineEndings(input.content);
|
|
672
|
-
if (backend?.canWrite) {
|
|
673
|
-
await backend.writeTextFile(filePath, input.append ? `${oldContent}${input.content}` : input.content);
|
|
674
|
-
}
|
|
675
|
-
else if (input.append) {
|
|
676
|
-
await fs.appendFile(filePath, input.content, "utf8");
|
|
677
|
-
}
|
|
678
|
-
else {
|
|
679
|
-
await fs.writeFile(filePath, input.content, "utf8");
|
|
680
|
-
}
|
|
681
|
-
const structuredPatch = buildContentPatchHunks(oldContent, newContent);
|
|
682
|
-
if (structuredPatch.length > 0) {
|
|
683
|
-
if (context) {
|
|
684
|
-
setFileToolDisplay(context.agent.appState, context.toolUse.toolUseId, {
|
|
685
|
-
structuredPatch,
|
|
686
|
-
path: filePath,
|
|
687
|
-
oldText: fileExisted ? oldContent : null,
|
|
688
|
-
newText: newContent,
|
|
689
|
-
});
|
|
690
|
-
}
|
|
691
|
-
}
|
|
692
|
-
return toJsonValue({
|
|
693
|
-
path: filePath,
|
|
694
|
-
appended: input.append ?? false,
|
|
695
|
-
bytes_written: Buffer.byteLength(input.content, "utf8"),
|
|
696
|
-
});
|
|
531
|
+
const edit = input;
|
|
532
|
+
const normalized = {
|
|
533
|
+
...edit,
|
|
534
|
+
path: normalizeUserPath(edit.path),
|
|
535
|
+
...(edit.mode === "rename"
|
|
536
|
+
? { new_path: normalizeUserPath(edit.new_path) }
|
|
537
|
+
: {}),
|
|
538
|
+
};
|
|
539
|
+
const result = await applyFileEdit(getFsBackend(context?.agent), normalized);
|
|
540
|
+
return toJsonValue(result);
|
|
697
541
|
},
|
|
698
542
|
}),
|
|
699
543
|
tool({
|
|
700
|
-
name: "
|
|
701
|
-
description: "Apply
|
|
702
|
-
inputSchema: schema.
|
|
544
|
+
name: "edit_multiple_files",
|
|
545
|
+
description: "Apply ordered create, overwrite, line-range edit, rename, or delete operations to multiple files.",
|
|
546
|
+
inputSchema: schema.editMultipleFiles,
|
|
703
547
|
callback: async (input, context) => {
|
|
704
|
-
const
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
const stat = await statFile(filePath);
|
|
714
|
-
const previousRead = textReadState.get(filePath);
|
|
715
|
-
rawOriginal = await fs.readFile(filePath, "utf8");
|
|
716
|
-
const original = normalizeLineEndings(rawOriginal);
|
|
717
|
-
if (previousRead && stat.mtimeMs > previousRead.mtimeMs) {
|
|
718
|
-
const fullReadWasUnchanged = !previousRead.isPartial && previousRead.content === original;
|
|
719
|
-
if (!fullReadWasUnchanged) {
|
|
720
|
-
throw new Error("File changed since it was last read. Read the file again before editing.");
|
|
721
|
-
}
|
|
722
|
-
}
|
|
723
|
-
}
|
|
724
|
-
const lineEndings = detectLineEndings(rawOriginal);
|
|
725
|
-
const original = normalizeLineEndings(rawOriginal);
|
|
726
|
-
const edited = applyEdits(original, input.edits);
|
|
727
|
-
const contentToWrite = restoreLineEndings(edited.content, lineEndings);
|
|
728
|
-
if (!input.dry_run) {
|
|
729
|
-
if (backend?.canWrite) {
|
|
730
|
-
await backend.writeTextFile(filePath, contentToWrite);
|
|
731
|
-
}
|
|
732
|
-
else {
|
|
733
|
-
await fs.writeFile(filePath, contentToWrite, "utf8");
|
|
734
|
-
const updatedStat = await fs.stat(filePath);
|
|
735
|
-
textReadState.set(filePath, {
|
|
736
|
-
content: edited.content,
|
|
737
|
-
mtimeMs: updatedStat.mtimeMs,
|
|
738
|
-
offset: 1,
|
|
739
|
-
limit: undefined,
|
|
740
|
-
isPartial: false,
|
|
741
|
-
});
|
|
742
|
-
}
|
|
743
|
-
}
|
|
744
|
-
if (context) {
|
|
745
|
-
setFileToolDisplay(context.agent.appState, context.toolUse.toolUseId, {
|
|
746
|
-
previews: edited.replacements.map((item) => item.snippet),
|
|
747
|
-
structuredPatch: edited.replacements.map((item) => item.hunk),
|
|
748
|
-
path: filePath,
|
|
749
|
-
oldText: original,
|
|
750
|
-
newText: edited.content,
|
|
751
|
-
});
|
|
752
|
-
}
|
|
753
|
-
return toJsonValue({
|
|
754
|
-
path: filePath,
|
|
755
|
-
dry_run: input.dry_run ?? false,
|
|
756
|
-
edits_applied: input.edits.length,
|
|
757
|
-
changed: edited.content !== original,
|
|
758
|
-
sha256_before: createHash("sha256").update(original).digest("hex"),
|
|
759
|
-
sha256_after: createHash("sha256")
|
|
760
|
-
.update(edited.content)
|
|
761
|
-
.digest("hex"),
|
|
762
|
-
});
|
|
548
|
+
const edits = input.edits.map((edit) => ({
|
|
549
|
+
...edit,
|
|
550
|
+
path: normalizeUserPath(edit.path),
|
|
551
|
+
...(edit.mode === "rename"
|
|
552
|
+
? { new_path: normalizeUserPath(edit.new_path) }
|
|
553
|
+
: {}),
|
|
554
|
+
}));
|
|
555
|
+
const results = await applyFileEdits(getFsBackend(context?.agent), edits);
|
|
556
|
+
return toJsonValue({ edits: results, count: results.length });
|
|
763
557
|
},
|
|
764
558
|
}),
|
|
765
559
|
tool({
|
|
@@ -851,4 +645,4 @@ export function createFilesystemTools() {
|
|
|
851
645
|
}),
|
|
852
646
|
];
|
|
853
647
|
}
|
|
854
|
-
//# sourceMappingURL=
|
|
648
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/core/filesystem/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,8 +26,8 @@ export const MODE_DEFINITIONS = [
|
|
|
26
26
|
"grep",
|
|
27
27
|
"read_file",
|
|
28
28
|
"read_multiple_files",
|
|
29
|
-
"write_file",
|
|
30
29
|
"edit_file",
|
|
30
|
+
"edit_multiple_files",
|
|
31
31
|
"create_directory",
|
|
32
32
|
"move_file",
|
|
33
33
|
"ask_user",
|
|
@@ -62,8 +62,8 @@ export const MODE_DEFINITIONS = [
|
|
|
62
62
|
"grep",
|
|
63
63
|
"read_file",
|
|
64
64
|
"read_multiple_files",
|
|
65
|
-
"write_file",
|
|
66
65
|
"edit_file",
|
|
66
|
+
"edit_multiple_files",
|
|
67
67
|
"ask_user",
|
|
68
68
|
"search_tools",
|
|
69
69
|
"activate_tools",
|
|
@@ -96,8 +96,8 @@ export const MODE_DEFINITIONS = [
|
|
|
96
96
|
"grep",
|
|
97
97
|
"read_file",
|
|
98
98
|
"read_multiple_files",
|
|
99
|
-
"write_file",
|
|
100
99
|
"edit_file",
|
|
100
|
+
"edit_multiple_files",
|
|
101
101
|
"ask_user",
|
|
102
102
|
"search_tools",
|
|
103
103
|
"activate_tools",
|
|
@@ -127,8 +127,8 @@ export const MODE_DEFINITIONS = [
|
|
|
127
127
|
"grep",
|
|
128
128
|
"read_file",
|
|
129
129
|
"read_multiple_files",
|
|
130
|
-
"write_file",
|
|
131
130
|
"edit_file",
|
|
131
|
+
"edit_multiple_files",
|
|
132
132
|
"ask_user",
|
|
133
133
|
"search_tools",
|
|
134
134
|
"activate_tools",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../../src/core/modes/definitions.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,gBAAgB,GAA8B;IACzD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,OAAO;QACb,YAAY,EAAE,gBAAgB;QAC9B,WAAW,EAAE,6BAA6B;QAC1C,KAAK,EAAE;YACL,OAAO;YACP,YAAY;YACZ,QAAQ;YACR,4BAA4B;YAC5B,eAAe;YACf,2BAA2B;YAC3B,cAAc;YACd,OAAO;YACP,iBAAiB;YACjB,OAAO;YACP,OAAO;YACP,cAAc;YACd,YAAY;YACZ,cAAc;YACd,kBAAkB;YAClB,gBAAgB;YAChB,eAAe;YACf,gBAAgB;YAChB,MAAM;YACN,WAAW;YACX,qBAAqB;YACrB,
|
|
1
|
+
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../../src/core/modes/definitions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
## Agent mode
|
|
2
2
|
|
|
3
|
-
You are in **agent** mode
|
|
3
|
+
You are in **agent** mode; this is the authoritative active session mode. Do not call `switch_mode` with `mode: "agent"`; continue directly. You can make use of any available tool to fulfil your current task.
|
|
4
4
|
|
|
5
5
|
For HTML design artifacts (prototypes, decks, Figma-derived layouts), prefer **`switch_mode`** to **design** so craft rules, `DESIGN.md`, and the `hooman-design` skill apply.
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
## Ask mode
|
|
2
2
|
|
|
3
|
-
You are in **ask** mode: a narrowed tool surface for exploration, research, and answering questions.
|
|
3
|
+
You are in **ask** mode; this is the authoritative active session mode. Do not call `switch_mode` with `mode: "ask"`; continue directly. This mode has a narrowed tool surface for exploration, research, and answering questions.
|
|
4
4
|
|
|
5
5
|
- Prefer inspection and analysis over changing the repo or runtime.
|
|
6
6
|
- Explain architecture, behavior, APIs, trade-offs, options, and risks from what you can inspect.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
## Design mode
|
|
2
2
|
|
|
3
|
-
You are in **design** mode:
|
|
3
|
+
You are in **design** mode; this is the authoritative active session mode. Do not call `switch_mode` with `mode: "design"`; continue the design workflow directly. Produce previewable HTML design artifacts shaped by craft rules and the project's `DESIGN.md` (when present).
|
|
4
4
|
|
|
5
5
|
Follow the **strict phased workflow** in the `hooman-design` skill (`references/workflow.md`). Do not skip phases.
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
## Planning mode
|
|
2
2
|
|
|
3
|
-
You are in
|
|
3
|
+
You are in **plan** mode; this is the authoritative active session mode. Do not call `switch_mode` with `mode: "plan"` unless you intentionally need a brand-new plan document and pass `fresh: true`. **Do not implement here.** Implementation begins only once the user approves your `switch_mode` proposal to leave plan (typically to `agent`); approving it is their go-ahead.
|
|
4
4
|
|
|
5
5
|
**Plan file:** {{#if (lookup state 'hooman.planFile')}}{{lookup state 'hooman.planFile'}}{{else}}—{{/if}}
|
|
6
6
|
|
|
@@ -5,7 +5,7 @@ You have access to filesystem tools for reading, writing, editing, moving, listi
|
|
|
5
5
|
- Prefer filesystem tools over `shell` when the task is mainly about file contents, directory structure, or metadata.
|
|
6
6
|
- Use `read_file` for one known file, `read_multiple_files` for several known files, `grep` for exact text or symbols, and `list_directory` or `directory_tree` for structure discovery.
|
|
7
7
|
- Prefer `read_multiple_files` with `binary: true` when reviewing several screenshots or other media files in one call (e.g. design-review `reviews/*.png`).
|
|
8
|
-
- Use `
|
|
9
|
-
- `read_file` and `read_multiple_files` return file content verbatim as plain text in text mode. Bracketed `[...]` lines carry metadata: a leading line for partial reads (line range and how to read more) and a trailing `[AGENTS.md instructions ...]` block with file-scoped project instructions; treat the latter as additional project instructions when relevant. Everything else is the file's own text —
|
|
8
|
+
- Use `edit_file`, `edit_multiple_files`, `create_directory`, `move_file`, and `get_file_info` for the corresponding focused operations.
|
|
9
|
+
- `read_file` and `read_multiple_files` return file content verbatim as plain text in text mode. Bracketed `[...]` lines carry metadata: a leading line for partial reads (line range and how to read more) and a trailing `[AGENTS.md instructions ...]` block with file-scoped project instructions; treat the latter as additional project instructions when relevant. Everything else is the file's own text — use the returned line numbers with `edit_file` edit-mode ranges. With `binary: true`, media is returned as multimodal content blocks when the model supports them.
|
|
10
10
|
- Prefer bounded reads for long files, and batch independent file reads or searches when supported.
|
|
11
11
|
- Prefer the narrowest operation that solves the task, read before editing when that reduces risk, and be careful with overwrites, renames, and broad recursive changes.
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
## Switching mode
|
|
2
2
|
|
|
3
|
-
You have a `switch_mode` tool to propose changing the session mode (`agent`, `ask`, `plan`, or `design`).
|
|
3
|
+
You have a `switch_mode` tool to propose changing the session mode (`agent`, `ask`, `plan`, or `design`). Real mode changes and fresh-plan requests require explicit user approval via the **permission UI** (never "always allow"); redundant same-mode no-ops continue without prompting.
|
|
4
4
|
|
|
5
|
-
**Critical:**
|
|
5
|
+
**Critical:** The injected mode-specific prompt states the session's active mode and is authoritative. Check it before calling `switch_mode`. Do not request the mode you are already in; continue directly instead. The only meaningful same-mode request is `plan` → `plan` with `fresh: true`, which proposes replacing the active plan document with a new one.
|
|
6
|
+
|
|
7
|
+
Calling `switch_mode` already triggers the permission card. When that call returns successfully, the user has already approved — **do not** ask again in chat ("please approve…", "say Done…", "confirm the switch…"). Continue immediately with the next tool calls for the active mode.
|
|
6
8
|
|
|
7
9
|
- Use **`plan`** for multi-step, ambiguous, or high-risk work: call `switch_mode` with `mode: "plan"` before exploring or implementing, then follow the plan-mode instructions that arrive with it. Leaving plan (e.g. to `agent`) is a proposal — the user approving the permission card is their go-ahead to implement. After an approved leave, briefly confirm the approach and begin implementing without re-asking; never implement while still in plan mode.
|
|
8
10
|
- Use **`design`** for HTML design artifacts (prototypes, decks, dashboards, Figma-derived layouts): call `switch_mode` with `mode: "design"` before writing under `.hooman/design/`, then follow the design-mode instructions that arrive with it (craft rules, `DESIGN.md`, visual QA). After an approved switch, activate the `hooman-design` skill and stay in design mode until the artifact is reviewed; for unrestricted implementation or shell work, switch back to **agent**.
|
|
@@ -10,7 +10,7 @@ type AgentLike = {
|
|
|
10
10
|
export declare const SWITCH_MODE_TOOL = "switch_mode";
|
|
11
11
|
export declare const INTERNAL_ALWAYS_ALLOWED: Set<string>;
|
|
12
12
|
/**
|
|
13
|
-
* In plan mode, reject
|
|
13
|
+
* In plan mode, reject file edits unless their destination paths
|
|
14
14
|
* is under the plans directory, and reject `fetch` with `save_as` entirely.
|
|
15
15
|
* Runs before any “always allow” grant.
|
|
16
16
|
*/
|