@chances-ai/engine 26.0.0 → 27.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/adapters/ai-sdk-stream.d.ts.map +1 -1
- package/dist/ai/adapters/ai-sdk-stream.js +6 -1
- package/dist/ai/adapters/ai-sdk-stream.js.map +1 -1
- package/dist/ai/index.d.ts +1 -0
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +1 -0
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/overflow.d.ts +40 -0
- package/dist/ai/overflow.d.ts.map +1 -0
- package/dist/ai/overflow.js +84 -0
- package/dist/ai/overflow.js.map +1 -0
- package/dist/ai/types.d.ts +8 -1
- package/dist/ai/types.d.ts.map +1 -1
- package/dist/core/engine.d.ts +205 -10
- package/dist/core/engine.d.ts.map +1 -1
- package/dist/core/engine.js +539 -272
- package/dist/core/engine.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/task-tool.d.ts.map +1 -1
- package/dist/core/task-tool.js +6 -0
- package/dist/core/task-tool.js.map +1 -1
- package/dist/session/index.d.ts +11 -0
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/index.js +22 -1
- package/dist/session/index.js.map +1 -1
- package/dist/tools/bash-readonly.d.ts +26 -0
- package/dist/tools/bash-readonly.d.ts.map +1 -0
- package/dist/tools/bash-readonly.js +130 -0
- package/dist/tools/bash-readonly.js.map +1 -0
- package/dist/tools/builtins/bash.d.ts.map +1 -1
- package/dist/tools/builtins/bash.js +12 -0
- package/dist/tools/builtins/bash.js.map +1 -1
- package/dist/tools/builtins/edit.d.ts.map +1 -1
- package/dist/tools/builtins/edit.js +18 -12
- package/dist/tools/builtins/edit.js.map +1 -1
- package/dist/tools/builtins/todo.d.ts +33 -0
- package/dist/tools/builtins/todo.d.ts.map +1 -0
- package/dist/tools/builtins/todo.js +245 -0
- package/dist/tools/builtins/todo.js.map +1 -0
- package/dist/tools/builtins/write.d.ts.map +1 -1
- package/dist/tools/builtins/write.js +10 -5
- package/dist/tools/builtins/write.js.map +1 -1
- package/dist/tools/concurrency.d.ts +37 -0
- package/dist/tools/concurrency.d.ts.map +1 -0
- package/dist/tools/concurrency.js +50 -0
- package/dist/tools/concurrency.js.map +1 -0
- package/dist/tools/file-lock.d.ts +22 -0
- package/dist/tools/file-lock.d.ts.map +1 -0
- package/dist/tools/file-lock.js +85 -0
- package/dist/tools/file-lock.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/types.d.ts +31 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { native } from "@chances-ai/native";
|
|
2
|
+
import { isBashCommandReadOnly } from "../bash-readonly.js";
|
|
2
3
|
import { cleanOutput, optNum, persistFullOutput, str } from "./_shared.js";
|
|
3
4
|
/**
|
|
4
5
|
* `bash` runs a shell command in a real PTY when the native addon is
|
|
@@ -107,6 +108,17 @@ export const bashTool = {
|
|
|
107
108
|
required: ["command"],
|
|
108
109
|
},
|
|
109
110
|
summarize: (args) => `bash: ${str(args, "command")}`,
|
|
111
|
+
// (7.7 §3.1) A bash call may join a parallel read-only batch only when its
|
|
112
|
+
// command is provably read-only (fail-closed classifier). Otherwise it runs
|
|
113
|
+
// serially, exactly as before.
|
|
114
|
+
isConcurrencySafe(args) {
|
|
115
|
+
try {
|
|
116
|
+
return isBashCommandReadOnly(str(args, "command"));
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
},
|
|
110
122
|
async execute(args, ctx) {
|
|
111
123
|
const command = str(args, "command");
|
|
112
124
|
const timeoutMs = clampTimeoutMs(optNum(args, "timeout"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../src/tools/builtins/bash.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../src/tools/builtins/bash.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/edit.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/edit.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,aAAa,CAAC;AAGpD,eAAO,MAAM,QAAQ,EAAE,IAmCtB,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { existsSync, readFileSync } from "node:fs";
|
|
|
2
2
|
import { dirname } from "node:path";
|
|
3
3
|
import { native } from "@chances-ai/native";
|
|
4
4
|
import { linesDiff } from "../diff.js";
|
|
5
|
+
import { withFileLock } from "../file-lock.js";
|
|
5
6
|
import { guardWrite, preview, str, writeFileAtomic } from "./_shared.js";
|
|
6
7
|
export const editTool = {
|
|
7
8
|
name: "edit",
|
|
@@ -23,18 +24,23 @@ export const editTool = {
|
|
|
23
24
|
},
|
|
24
25
|
async execute(args, ctx) {
|
|
25
26
|
const path = guardWrite(ctx, str(args, "path"));
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
27
|
+
// (7.7 §3.4) Hold the per-file mutation lock for the whole read-modify-write
|
|
28
|
+
// so a concurrent edit/write to the SAME file (another subagent, task 08)
|
|
29
|
+
// can't interleave and corrupt it. Reads never take the lock.
|
|
30
|
+
return withFileLock(path, async () => {
|
|
31
|
+
if (!existsSync(path))
|
|
32
|
+
return { ok: false, output: `No such file: ${str(args, "path")}` };
|
|
33
|
+
const find = str(args, "find");
|
|
34
|
+
const content = readFileSync(path, "utf8");
|
|
35
|
+
const count = content.split(find).length - 1;
|
|
36
|
+
if (count === 0)
|
|
37
|
+
return { ok: false, output: `Substring not found in ${str(args, "path")}` };
|
|
38
|
+
if (count > 1)
|
|
39
|
+
return { ok: false, output: `Substring not unique (${count} matches)` };
|
|
40
|
+
writeFileAtomic(path, content.replace(find, str(args, "replace")));
|
|
41
|
+
native.invalidateFsScanCache(dirname(path));
|
|
42
|
+
return { ok: true, output: `Edited ${str(args, "path")}` };
|
|
43
|
+
});
|
|
38
44
|
},
|
|
39
45
|
};
|
|
40
46
|
//# sourceMappingURL=edit.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../src/tools/builtins/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../src/tools/builtins/edit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { TodoPhase } from "@chances-ai/runtime";
|
|
2
|
+
import type { Tool } from "../types.js";
|
|
3
|
+
/** (7.7 §5) The phased todo tool. Op-based edits (init/start/done/rm/drop/
|
|
4
|
+
* append/note) over named phases, normalized to exactly one in_progress,
|
|
5
|
+
* rendered back to the model as markdown. Ported from oh-my-pi
|
|
6
|
+
* `coding-agent/src/tools/todo-write.ts`. State lives on the SessionManager
|
|
7
|
+
* (injected via the factory); the engine emits the `todo` AppEvent after a
|
|
8
|
+
* successful call so all four surfaces render the panel. */
|
|
9
|
+
export declare const TODO_TOOL_NAME = "todo";
|
|
10
|
+
export type TodoOp = "init" | "start" | "done" | "rm" | "drop" | "append" | "note";
|
|
11
|
+
interface TodoOpEntry {
|
|
12
|
+
op: TodoOp;
|
|
13
|
+
phase?: string;
|
|
14
|
+
task?: string;
|
|
15
|
+
items?: string[];
|
|
16
|
+
text?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface CreateTodoToolDeps {
|
|
19
|
+
getPhases: () => TodoPhase[];
|
|
20
|
+
setPhases: (phases: TodoPhase[]) => void;
|
|
21
|
+
}
|
|
22
|
+
/** Render phases as markdown (model-facing result + the basis for the `/todo`
|
|
23
|
+
* slash editor in task 12). */
|
|
24
|
+
export declare function phasesToMarkdown(phases: TodoPhase[]): string;
|
|
25
|
+
/** (7.7 §5) Apply a batch of ops to a starting state, normalizing once at the
|
|
26
|
+
* end. Exported so the engine reminder + (later) the `/todo` slash share it. */
|
|
27
|
+
export declare function applyTodoOps(start: TodoPhase[], ops: TodoOpEntry[]): {
|
|
28
|
+
phases: TodoPhase[];
|
|
29
|
+
error?: string;
|
|
30
|
+
};
|
|
31
|
+
export declare function createTodoTool(deps: CreateTodoToolDeps): Tool;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=todo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todo.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/todo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,SAAS,EAAc,MAAM,qBAAqB,CAAC;AACtF,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,aAAa,CAAC;AAEpD;;;;;6DAK6D;AAE7D,eAAO,MAAM,cAAc,SAAS,CAAC;AAErC,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEnF,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AASD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,SAAS,EAAE,CAAC;IAC7B,SAAS,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;CAC1C;AAyGD;gCACgC;AAChC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAW5D;AAiCD;iFACiF;AACjF,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG;IAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAQ5G;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAgD7D"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/** (7.7 §5) The phased todo tool. Op-based edits (init/start/done/rm/drop/
|
|
2
|
+
* append/note) over named phases, normalized to exactly one in_progress,
|
|
3
|
+
* rendered back to the model as markdown. Ported from oh-my-pi
|
|
4
|
+
* `coding-agent/src/tools/todo-write.ts`. State lives on the SessionManager
|
|
5
|
+
* (injected via the factory); the engine emits the `todo` AppEvent after a
|
|
6
|
+
* successful call so all four surfaces render the panel. */
|
|
7
|
+
export const TODO_TOOL_NAME = "todo";
|
|
8
|
+
const STATUS_TO_MARKER = {
|
|
9
|
+
pending: " ",
|
|
10
|
+
in_progress: "/",
|
|
11
|
+
completed: "x",
|
|
12
|
+
abandoned: "-",
|
|
13
|
+
};
|
|
14
|
+
/** Deep-clone phases so op application never mutates the live session array. */
|
|
15
|
+
function clone(phases) {
|
|
16
|
+
return phases.map((p) => ({ name: p.name, tasks: p.tasks.map((t) => ({ ...t, notes: t.notes ? [...t.notes] : undefined })) }));
|
|
17
|
+
}
|
|
18
|
+
function findPhase(phases, name) {
|
|
19
|
+
if (name === undefined)
|
|
20
|
+
return phases[0];
|
|
21
|
+
return phases.find((p) => p.name === name);
|
|
22
|
+
}
|
|
23
|
+
function findTask(phases, content) {
|
|
24
|
+
for (const p of phases) {
|
|
25
|
+
const hit = p.tasks.find((t) => t.content === content);
|
|
26
|
+
if (hit)
|
|
27
|
+
return hit;
|
|
28
|
+
}
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
/** Enforce the invariant: when any task is still open, EXACTLY one is in_progress
|
|
32
|
+
* (oh-my-pi `normalizeInProgressTask`). Keep the first in_progress, demote the
|
|
33
|
+
* rest to pending; if none, promote the first pending. */
|
|
34
|
+
function normalizeInProgress(phases) {
|
|
35
|
+
const open = [];
|
|
36
|
+
for (const p of phases)
|
|
37
|
+
for (const t of p.tasks)
|
|
38
|
+
if (t.status === "in_progress" || t.status === "pending")
|
|
39
|
+
open.push(t);
|
|
40
|
+
const inProgress = open.filter((t) => t.status === "in_progress");
|
|
41
|
+
if (inProgress.length > 1) {
|
|
42
|
+
for (const t of inProgress.slice(1))
|
|
43
|
+
t.status = "pending";
|
|
44
|
+
}
|
|
45
|
+
else if (inProgress.length === 0) {
|
|
46
|
+
const firstPending = open.find((t) => t.status === "pending");
|
|
47
|
+
if (firstPending)
|
|
48
|
+
firstPending.status = "in_progress";
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Apply one op. Returns an error string on a bad op, or null on success. */
|
|
52
|
+
function applyOp(phases, e) {
|
|
53
|
+
// Reject synthetic ids — tasks are referenced by content (oh-my-pi).
|
|
54
|
+
if (e.task && /^task-\d+$/.test(e.task)) {
|
|
55
|
+
return `tasks are referenced by their content text, not ids like "${e.task}"`;
|
|
56
|
+
}
|
|
57
|
+
switch (e.op) {
|
|
58
|
+
case "init": {
|
|
59
|
+
const name = e.phase ?? "Tasks";
|
|
60
|
+
const items = e.items ?? [];
|
|
61
|
+
const phase = { name, tasks: items.map((c) => ({ content: c, status: "pending" })) };
|
|
62
|
+
phases.length = 0;
|
|
63
|
+
phases.push(phase);
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
case "append": {
|
|
67
|
+
const name = e.phase ?? phases[phases.length - 1]?.name ?? "Tasks";
|
|
68
|
+
let phase = findPhase(phases, name);
|
|
69
|
+
if (!phase) {
|
|
70
|
+
phase = { name, tasks: [] };
|
|
71
|
+
phases.push(phase);
|
|
72
|
+
}
|
|
73
|
+
for (const c of e.items ?? []) {
|
|
74
|
+
if (phase.tasks.some((t) => t.content === c))
|
|
75
|
+
continue; // skip duplicates
|
|
76
|
+
phase.tasks.push({ content: c, status: "pending" });
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
case "start": {
|
|
81
|
+
if (!e.task)
|
|
82
|
+
return "start requires a task";
|
|
83
|
+
const t = findTask(phases, e.task);
|
|
84
|
+
if (!t)
|
|
85
|
+
return `no such task: ${e.task}`;
|
|
86
|
+
for (const p of phases)
|
|
87
|
+
for (const x of p.tasks)
|
|
88
|
+
if (x.status === "in_progress")
|
|
89
|
+
x.status = "pending";
|
|
90
|
+
t.status = "in_progress";
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
case "done":
|
|
94
|
+
case "drop": {
|
|
95
|
+
if (!e.task)
|
|
96
|
+
return `${e.op} requires a task`;
|
|
97
|
+
const t = findTask(phases, e.task);
|
|
98
|
+
if (!t)
|
|
99
|
+
return `no such task: ${e.task}`;
|
|
100
|
+
t.status = e.op === "done" ? "completed" : "abandoned";
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
case "rm": {
|
|
104
|
+
if (!e.task)
|
|
105
|
+
return "rm requires a task";
|
|
106
|
+
let removed = false;
|
|
107
|
+
for (const p of phases) {
|
|
108
|
+
const i = p.tasks.findIndex((t) => t.content === e.task);
|
|
109
|
+
if (i >= 0) {
|
|
110
|
+
p.tasks.splice(i, 1);
|
|
111
|
+
removed = true;
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return removed ? null : `no such task: ${e.task}`;
|
|
116
|
+
}
|
|
117
|
+
case "note": {
|
|
118
|
+
if (!e.task)
|
|
119
|
+
return "note requires a task";
|
|
120
|
+
if (!e.text)
|
|
121
|
+
return "note requires text";
|
|
122
|
+
const t = findTask(phases, e.task);
|
|
123
|
+
if (!t)
|
|
124
|
+
return `no such task: ${e.task}`;
|
|
125
|
+
(t.notes ??= []).push(e.text.trim());
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
default:
|
|
129
|
+
return `unknown op: ${String(e.op)}`;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/** Render phases as markdown (model-facing result + the basis for the `/todo`
|
|
133
|
+
* slash editor in task 12). */
|
|
134
|
+
export function phasesToMarkdown(phases) {
|
|
135
|
+
if (phases.length === 0)
|
|
136
|
+
return "(no todos)";
|
|
137
|
+
const out = [];
|
|
138
|
+
for (const p of phases) {
|
|
139
|
+
out.push(`# ${p.name}`);
|
|
140
|
+
for (const t of p.tasks) {
|
|
141
|
+
out.push(`- [${STATUS_TO_MARKER[t.status]}] ${t.content}`);
|
|
142
|
+
for (const n of t.notes ?? [])
|
|
143
|
+
out.push(` > ${n}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return out.join("\n");
|
|
147
|
+
}
|
|
148
|
+
function summarize(phases) {
|
|
149
|
+
let total = 0;
|
|
150
|
+
let done = 0;
|
|
151
|
+
for (const p of phases)
|
|
152
|
+
for (const t of p.tasks) {
|
|
153
|
+
total++;
|
|
154
|
+
if (t.status === "completed" || t.status === "abandoned")
|
|
155
|
+
done++;
|
|
156
|
+
}
|
|
157
|
+
return `${done}/${total} tasks complete\n\n${phasesToMarkdown(phases)}`;
|
|
158
|
+
}
|
|
159
|
+
/** Parse the raw args into ops, tolerating a single-op shorthand. */
|
|
160
|
+
function parseOps(args) {
|
|
161
|
+
const a = args;
|
|
162
|
+
const raw = Array.isArray(a.ops) ? a.ops : null;
|
|
163
|
+
if (!raw)
|
|
164
|
+
return { error: "todo requires an `ops` array" };
|
|
165
|
+
const ops = [];
|
|
166
|
+
for (const r of raw) {
|
|
167
|
+
if (typeof r !== "object" || r === null)
|
|
168
|
+
return { error: "each op must be an object" };
|
|
169
|
+
const o = r;
|
|
170
|
+
if (typeof o.op !== "string")
|
|
171
|
+
return { error: "each op needs an `op` field" };
|
|
172
|
+
ops.push({
|
|
173
|
+
op: o.op,
|
|
174
|
+
phase: typeof o.phase === "string" ? o.phase : undefined,
|
|
175
|
+
task: typeof o.task === "string" ? o.task : undefined,
|
|
176
|
+
items: Array.isArray(o.items) ? o.items.filter((x) => typeof x === "string") : undefined,
|
|
177
|
+
text: typeof o.text === "string" ? o.text : undefined,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
return ops;
|
|
181
|
+
}
|
|
182
|
+
/** (7.7 §5) Apply a batch of ops to a starting state, normalizing once at the
|
|
183
|
+
* end. Exported so the engine reminder + (later) the `/todo` slash share it. */
|
|
184
|
+
export function applyTodoOps(start, ops) {
|
|
185
|
+
const phases = clone(start);
|
|
186
|
+
for (const e of ops) {
|
|
187
|
+
const err = applyOp(phases, e);
|
|
188
|
+
if (err)
|
|
189
|
+
return { phases: start, error: err };
|
|
190
|
+
}
|
|
191
|
+
normalizeInProgress(phases);
|
|
192
|
+
return { phases };
|
|
193
|
+
}
|
|
194
|
+
export function createTodoTool(deps) {
|
|
195
|
+
return {
|
|
196
|
+
name: TODO_TOOL_NAME,
|
|
197
|
+
description: "Track multi-step work as a phased checklist the user sees live. Send op-based edits: " +
|
|
198
|
+
"init {phase, items} (replace the plan), append {phase, items}, start {task}, done {task}, " +
|
|
199
|
+
"drop {task} (abandon), rm {task}, note {task, text}. Reference tasks by their exact content " +
|
|
200
|
+
"text, not ids. Exactly one task is in_progress at a time (auto-normalized). Use this to plan " +
|
|
201
|
+
"before a multi-step task and to mark progress as you go.",
|
|
202
|
+
category: "file-read", // plan mode permits it (read-tier), like oh-my-pi approval:'read'
|
|
203
|
+
parameters: {
|
|
204
|
+
type: "object",
|
|
205
|
+
properties: {
|
|
206
|
+
ops: {
|
|
207
|
+
type: "array",
|
|
208
|
+
description: "Ordered batch of todo operations.",
|
|
209
|
+
items: {
|
|
210
|
+
type: "object",
|
|
211
|
+
properties: {
|
|
212
|
+
op: { type: "string", enum: ["init", "start", "done", "rm", "drop", "append", "note"] },
|
|
213
|
+
phase: { type: "string" },
|
|
214
|
+
task: { type: "string" },
|
|
215
|
+
items: { type: "array", items: { type: "string" } },
|
|
216
|
+
text: { type: "string" },
|
|
217
|
+
},
|
|
218
|
+
required: ["op"],
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
required: ["ops"],
|
|
223
|
+
},
|
|
224
|
+
summarize: (args) => {
|
|
225
|
+
const parsed = parseOps(args);
|
|
226
|
+
if ("error" in parsed)
|
|
227
|
+
return "todo (invalid)";
|
|
228
|
+
return `todo: ${parsed.map((o) => o.op).join(", ")}`;
|
|
229
|
+
},
|
|
230
|
+
// (7.7 §3.1) The todo tool is read-tier but state-MUTATING, so it must run
|
|
231
|
+
// exclusively (never coalesced into a parallel batch).
|
|
232
|
+
isConcurrencySafe: () => false,
|
|
233
|
+
async execute(args) {
|
|
234
|
+
const parsed = parseOps(args);
|
|
235
|
+
if ("error" in parsed)
|
|
236
|
+
return { ok: false, output: parsed.error };
|
|
237
|
+
const { phases, error } = applyTodoOps(deps.getPhases(), parsed);
|
|
238
|
+
if (error)
|
|
239
|
+
return { ok: false, output: error };
|
|
240
|
+
deps.setPhases(phases);
|
|
241
|
+
return { ok: true, output: summarize(phases) };
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=todo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todo.js","sourceRoot":"","sources":["../../../src/tools/builtins/todo.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/write.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/write.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,aAAa,CAAC;AAGpD,eAAO,MAAM,SAAS,EAAE,IA0CvB,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { existsSync, readFileSync, statSync } from "node:fs";
|
|
|
2
2
|
import { dirname } from "node:path";
|
|
3
3
|
import { native } from "@chances-ai/native";
|
|
4
4
|
import { linesDiff } from "../diff.js";
|
|
5
|
+
import { withFileLock } from "../file-lock.js";
|
|
5
6
|
import { PREVIEW_BYTE_CAP, containWritePath, guardWrite, str, writeFileAtomic } from "./_shared.js";
|
|
6
7
|
export const writeTool = {
|
|
7
8
|
name: "write",
|
|
@@ -37,11 +38,15 @@ export const writeTool = {
|
|
|
37
38
|
},
|
|
38
39
|
async execute(args, ctx) {
|
|
39
40
|
const path = guardWrite(ctx, str(args, "path"));
|
|
40
|
-
|
|
41
|
-
//
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
// (7.7 §3.4) Serialize concurrent writes to the same file via the per-file
|
|
42
|
+
// mutation lock (cross-subagent safety; reads never lock).
|
|
43
|
+
return withFileLock(path, async () => {
|
|
44
|
+
writeFileAtomic(path, str(args, "content"));
|
|
45
|
+
// Drop the shared fs-scan cache for this dir so a later glob/ast in the
|
|
46
|
+
// same turn sees the new file ([10.4]).
|
|
47
|
+
native.invalidateFsScanCache(dirname(path));
|
|
48
|
+
return { ok: true, output: `Wrote ${str(args, "path")}` };
|
|
49
|
+
});
|
|
45
50
|
},
|
|
46
51
|
};
|
|
47
52
|
//# sourceMappingURL=write.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../../src/tools/builtins/write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../../src/tools/builtins/write.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { JSONValue } from "@chances-ai/runtime";
|
|
2
|
+
import type { ToolCallRequest } from "../ai/types.js";
|
|
3
|
+
import type { Tool } from "./types.js";
|
|
4
|
+
/** One contiguous run of tool calls that execute together. `safe` batches run
|
|
5
|
+
* concurrently (bounded); `!safe` batches run serially (each unsafe call is its
|
|
6
|
+
* own batch). Batch order — and call order within a batch — is submission
|
|
7
|
+
* order. */
|
|
8
|
+
export interface ToolBatch {
|
|
9
|
+
safe: boolean;
|
|
10
|
+
calls: ToolCallRequest[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* (7.7 §3.3) Order-preserving partition of one assistant turn's tool calls into
|
|
14
|
+
* execution batches (claude-code `partitionToolCalls`,
|
|
15
|
+
* `toolOrchestration.ts:106-131`). A concurrency-safe call coalesces onto the
|
|
16
|
+
* previous batch ONLY if that batch is also safe; any unsafe call starts a fresh
|
|
17
|
+
* batch. Therefore a write is never reordered before a preceding read, and the
|
|
18
|
+
* result order is deterministic.
|
|
19
|
+
*/
|
|
20
|
+
export declare function partitionToolCalls(calls: readonly ToolCallRequest[], isSafe: (call: ToolCallRequest) => boolean): ToolBatch[];
|
|
21
|
+
/**
|
|
22
|
+
* (7.7 §3.1) Decide whether a single tool call may run in a parallel batch.
|
|
23
|
+
*
|
|
24
|
+
* Precedence:
|
|
25
|
+
* 1. If the tool implements `isConcurrencySafe(args)`, use it (with a
|
|
26
|
+
* fail-closed try/catch — any throw ⇒ not safe, matching claude-code's
|
|
27
|
+
* `partitionToolCalls`).
|
|
28
|
+
* 2. Otherwise derive from `category`: read-only categories (file-read /
|
|
29
|
+
* search / memory-read / network-read) are safe; write / shell /
|
|
30
|
+
* integration are not.
|
|
31
|
+
*
|
|
32
|
+
* Fail-closed by construction: the worst a wrong answer can do is force a
|
|
33
|
+
* read-only call to run serially (lost parallelism), never run a mutating call
|
|
34
|
+
* concurrently.
|
|
35
|
+
*/
|
|
36
|
+
export declare function isCallConcurrencySafe(tool: Tool, args: JSONValue): boolean;
|
|
37
|
+
//# sourceMappingURL=concurrency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concurrency.d.ts","sourceRoot":"","sources":["../../src/tools/concurrency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC;;;aAGa;AACb,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,eAAe,EAAE,EACjC,MAAM,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,OAAO,GACzC,SAAS,EAAE,CAYb;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAS1E"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { READONLY_CATEGORIES } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* (7.7 §3.3) Order-preserving partition of one assistant turn's tool calls into
|
|
4
|
+
* execution batches (claude-code `partitionToolCalls`,
|
|
5
|
+
* `toolOrchestration.ts:106-131`). A concurrency-safe call coalesces onto the
|
|
6
|
+
* previous batch ONLY if that batch is also safe; any unsafe call starts a fresh
|
|
7
|
+
* batch. Therefore a write is never reordered before a preceding read, and the
|
|
8
|
+
* result order is deterministic.
|
|
9
|
+
*/
|
|
10
|
+
export function partitionToolCalls(calls, isSafe) {
|
|
11
|
+
const batches = [];
|
|
12
|
+
for (const call of calls) {
|
|
13
|
+
const safe = isSafe(call);
|
|
14
|
+
const last = batches[batches.length - 1];
|
|
15
|
+
if (safe && last?.safe) {
|
|
16
|
+
last.calls.push(call);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
batches.push({ safe, calls: [call] });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return batches;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* (7.7 §3.1) Decide whether a single tool call may run in a parallel batch.
|
|
26
|
+
*
|
|
27
|
+
* Precedence:
|
|
28
|
+
* 1. If the tool implements `isConcurrencySafe(args)`, use it (with a
|
|
29
|
+
* fail-closed try/catch — any throw ⇒ not safe, matching claude-code's
|
|
30
|
+
* `partitionToolCalls`).
|
|
31
|
+
* 2. Otherwise derive from `category`: read-only categories (file-read /
|
|
32
|
+
* search / memory-read / network-read) are safe; write / shell /
|
|
33
|
+
* integration are not.
|
|
34
|
+
*
|
|
35
|
+
* Fail-closed by construction: the worst a wrong answer can do is force a
|
|
36
|
+
* read-only call to run serially (lost parallelism), never run a mutating call
|
|
37
|
+
* concurrently.
|
|
38
|
+
*/
|
|
39
|
+
export function isCallConcurrencySafe(tool, args) {
|
|
40
|
+
if (tool.isConcurrencySafe) {
|
|
41
|
+
try {
|
|
42
|
+
return tool.isConcurrencySafe(args) === true;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return READONLY_CATEGORIES.has(tool.category);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=concurrency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concurrency.js","sourceRoot":"","sources":["../../src/tools/concurrency.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAWjD;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAiC,EACjC,MAA0C;IAE1C,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzC,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAU,EAAE,IAAe;IAC/D,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Normalises a path to a stable lock key. realpath collapses symlinks; ENOENT
|
|
2
|
+
* (not-yet-created file) falls back to the absolute lexical path. */
|
|
3
|
+
export declare function fileLockKey(path: string): string;
|
|
4
|
+
/**
|
|
5
|
+
* Acquire the mutation lock for `path`. Returns a one-shot `release`. ALWAYS
|
|
6
|
+
* release in a `finally` so a throwing critical section can't deadlock the
|
|
7
|
+
* file:
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* const release = await acquireFileLock(path);
|
|
11
|
+
* try { ... read-modify-write ... } finally { release(); }
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export declare function acquireFileLock(path: string): Promise<() => void>;
|
|
15
|
+
/**
|
|
16
|
+
* Convenience wrapper: run `fn` while holding the lock for `path`, releasing on
|
|
17
|
+
* any exit (success or throw).
|
|
18
|
+
*/
|
|
19
|
+
export declare function withFileLock<T>(path: string, fn: () => Promise<T>): Promise<T>;
|
|
20
|
+
/** Test-only: drop all lock state. Not exported from the package barrel. */
|
|
21
|
+
export declare function __resetFileLocks(): void;
|
|
22
|
+
//# sourceMappingURL=file-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-lock.d.ts","sourceRoot":"","sources":["../../src/tools/file-lock.ts"],"names":[],"mappings":"AAsCA;sEACsE;AACtE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOhD;AAaD;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAEvE;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOpF;AAED,4EAA4E;AAC5E,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
|