@nexrall/code-core 1.4.71 → 1.4.73
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/agent/agentRegistry.d.ts.map +1 -1
- package/dist/agent/agentRegistry.js +28 -10
- package/dist/agent/agentTypes.d.ts.map +1 -1
- package/dist/agent/agentTypes.js +159 -48
- package/dist/agent/askOnce.d.ts.map +1 -1
- package/dist/agent/askOnce.js +14 -5
- package/dist/agent/backgroundAgents.d.ts.map +1 -1
- package/dist/agent/backgroundAgents.js +22 -8
- package/dist/agent/claimEvidence.d.ts.map +1 -1
- package/dist/agent/claimEvidence.js +2 -1
- package/dist/agent/compaction.d.ts.map +1 -1
- package/dist/agent/compaction.js +31 -10
- package/dist/agent/crossProcessLock.d.ts.map +1 -1
- package/dist/agent/crossProcessLock.js +14 -6
- package/dist/agent/editCompleteness.d.ts.map +1 -1
- package/dist/agent/fileLocks.d.ts.map +1 -1
- package/dist/agent/fileLocks.js +14 -5
- package/dist/agent/flaky.d.ts.map +1 -1
- package/dist/agent/hooks.d.ts.map +1 -1
- package/dist/agent/hooks.js +284 -75
- package/dist/agent/iterationPolicy.d.ts.map +1 -1
- package/dist/agent/iterationPolicy.js +26 -23
- package/dist/agent/lifecycleHost.d.ts.map +1 -1
- package/dist/agent/lifecycleHost.js +35 -11
- package/dist/agent/loop.d.ts +22 -4
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +238 -51
- package/dist/agent/memory.d.ts.map +1 -1
- package/dist/agent/memory.js +13 -7
- package/dist/agent/modelCatalogue.d.ts.map +1 -1
- package/dist/agent/modelCatalogue.js +4 -1
- package/dist/agent/nestedInstructions.d.ts +122 -0
- package/dist/agent/nestedInstructions.d.ts.map +1 -0
- package/dist/agent/nestedInstructions.js +696 -0
- package/dist/agent/peerRegistry.d.ts.map +1 -1
- package/dist/agent/peerRegistry.js +44 -6
- package/dist/agent/peerTransport.d.ts.map +1 -1
- package/dist/agent/peerTransport.js +18 -6
- package/dist/agent/planMode.d.ts.map +1 -1
- package/dist/agent/planMode.js +194 -41
- package/dist/agent/readDedupe.d.ts.map +1 -1
- package/dist/agent/readDedupe.js +3 -1
- package/dist/agent/securityLint.d.ts.map +1 -1
- package/dist/agent/sharedTasks.d.ts.map +1 -1
- package/dist/agent/sharedTasks.js +20 -5
- package/dist/agent/skills.d.ts +79 -0
- package/dist/agent/skills.d.ts.map +1 -1
- package/dist/agent/skills.js +403 -14
- package/dist/agent/subAgentBudget.d.ts.map +1 -1
- package/dist/agent/subTask.d.ts.map +1 -1
- package/dist/agent/subTask.js +87 -37
- package/dist/agent/subTaskSupport.d.ts.map +1 -1
- package/dist/agent/subTaskSupport.js +43 -14
- package/dist/agent/testIntegrity.d.ts.map +1 -1
- package/dist/agent/testIntegrity.js +4 -2
- package/dist/agent/toolDescriptions.d.ts.map +1 -1
- package/dist/agent/toolPrefetch.d.ts.map +1 -1
- package/dist/agent/toolPrefetch.js +15 -11
- package/dist/agent/trust.d.ts.map +1 -1
- package/dist/agent/trust.js +6 -2
- package/dist/agent/worktree.d.ts.map +1 -1
- package/dist/agent/worktree.js +70 -16
- package/dist/agent/worktreeEnforcement.d.ts.map +1 -1
- package/dist/agent/worktreeEnforcement.js +9 -4
- package/dist/api/client.d.ts +6 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +64 -31
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +3 -1
- package/dist/checkpoint/manager.d.ts.map +1 -1
- package/dist/checkpoint/manager.js +22 -7
- package/dist/commands/loader.d.ts.map +1 -1
- package/dist/commands/loader.js +6 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/mcp/client.d.ts +42 -0
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +89 -24
- package/dist/mcp/httpClient.d.ts +24 -1
- package/dist/mcp/httpClient.d.ts.map +1 -1
- package/dist/mcp/httpClient.js +80 -14
- package/dist/mcp/instructions.d.ts +11 -0
- package/dist/mcp/instructions.d.ts.map +1 -0
- package/dist/mcp/instructions.js +42 -0
- package/dist/mcp/manager.d.ts +35 -0
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +135 -24
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +48 -14
- package/dist/mcp/sseClient.d.ts +9 -1
- package/dist/mcp/sseClient.d.ts.map +1 -1
- package/dist/mcp/sseClient.js +43 -10
- package/dist/mcp/stats.d.ts.map +1 -1
- package/dist/permissions/bashClassify.d.ts.map +1 -1
- package/dist/permissions/bashClassify.js +25 -3
- package/dist/permissions/destructive.d.ts.map +1 -1
- package/dist/permissions/destructive.js +7 -2
- package/dist/permissions/destructiveTokens.d.ts.map +1 -1
- package/dist/permissions/destructiveTokens.js +104 -24
- package/dist/permissions/modePolicy.d.ts.map +1 -1
- package/dist/permissions/modePolicy.js +40 -17
- package/dist/permissions/rules.d.ts.map +1 -1
- package/dist/permissions/rules.js +7 -5
- package/dist/plugins/data.d.ts.map +1 -1
- package/dist/plugins/data.js +6 -2
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +18 -7
- package/dist/plugins/installer.d.ts.map +1 -1
- package/dist/plugins/installer.js +17 -10
- package/dist/plugins/sources.d.ts.map +1 -1
- package/dist/plugins/sources.js +9 -3
- package/dist/tools/executor.d.ts.map +1 -1
- package/dist/tools/executor.js +454 -168
- package/dist/tools/sandbox.d.ts.map +1 -1
- package/dist/tools/sandbox.js +5 -1
- package/dist/tools/symbols.d.ts.map +1 -1
- package/dist/tools/symbols.js +30 -8
- package/dist/tools/tsLangService.d.ts.map +1 -1
- package/dist/tools/tsLangService.js +12 -4
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/util/frontmatter.d.ts.map +1 -1
- package/dist/util/miniYaml.d.ts.map +1 -1
- package/dist/util/miniYaml.js +3 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peerRegistry.d.ts","sourceRoot":"","sources":["../../src/agent/peerRegistry.ts"],"names":[],"mappings":"AA2CA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE7D,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,yJAAyJ;IACzJ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AASD,iBAAS,SAAS,IAAI,MAAM,CAE3B;AAED,iBAAS,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEtC;
|
|
1
|
+
{"version":3,"file":"peerRegistry.d.ts","sourceRoot":"","sources":["../../src/agent/peerRegistry.ts"],"names":[],"mappings":"AA2CA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE7D,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,yJAAyJ;IACzJ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AASD,iBAAS,SAAS,IAAI,MAAM,CAE3B;AAED,iBAAS,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEtC;AAWD,iBAAS,aAAa,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CAG7C;AAoDD,8FAA8F;AAC9F,wBAAgB,cAAc,IAAI,MAAM,CAIvC;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,+IAA+I;IAC/I,SAAS,IAAI,IAAI,CAAC;IAClB,sJAAsJ;IACtJ,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IAC9C,mKAAmK;IACnK,UAAU,IAAI,IAAI,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,UAAU,CAiDlE;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE,CAgCtD;AAED,wHAAwH;AACxH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAE9D;AAED,eAAO,MAAM,qBAAqB;;;;;;CAMjC,CAAC"}
|
|
@@ -127,8 +127,34 @@ function writeRecord(r) {
|
|
|
127
127
|
fs.writeFileSync(tmp, JSON.stringify(r));
|
|
128
128
|
fs.renameSync(tmp, p);
|
|
129
129
|
}
|
|
130
|
-
const ADJECTIVES = [
|
|
131
|
-
|
|
130
|
+
const ADJECTIVES = [
|
|
131
|
+
'graceful',
|
|
132
|
+
'quiet',
|
|
133
|
+
'brave',
|
|
134
|
+
'calm',
|
|
135
|
+
'swift',
|
|
136
|
+
'keen',
|
|
137
|
+
'bold',
|
|
138
|
+
'clear',
|
|
139
|
+
'gentle',
|
|
140
|
+
'sharp',
|
|
141
|
+
'steady',
|
|
142
|
+
'curious',
|
|
143
|
+
];
|
|
144
|
+
const NOUNS = [
|
|
145
|
+
'unicorn',
|
|
146
|
+
'falcon',
|
|
147
|
+
'otter',
|
|
148
|
+
'harbor',
|
|
149
|
+
'meadow',
|
|
150
|
+
'ember',
|
|
151
|
+
'summit',
|
|
152
|
+
'cedar',
|
|
153
|
+
'quartz',
|
|
154
|
+
'heron',
|
|
155
|
+
'lynx',
|
|
156
|
+
'delta',
|
|
157
|
+
];
|
|
132
158
|
/** Generate a readable random peer name, same shape Claude Code uses ("graceful-unicorn"). */
|
|
133
159
|
function randomPeerName() {
|
|
134
160
|
const a = ADJECTIVES[crypto.randomInt(ADJECTIVES.length)];
|
|
@@ -160,7 +186,9 @@ function registerPeer(opts) {
|
|
|
160
186
|
}
|
|
161
187
|
const now = Date.now();
|
|
162
188
|
const record = {
|
|
163
|
-
id,
|
|
189
|
+
id,
|
|
190
|
+
name,
|
|
191
|
+
pid: process.pid,
|
|
164
192
|
clientType: opts.clientType,
|
|
165
193
|
workDir: opts.workDir,
|
|
166
194
|
socketPath: opts.socketPath,
|
|
@@ -185,7 +213,9 @@ function registerPeer(opts) {
|
|
|
185
213
|
try {
|
|
186
214
|
fs.unlinkSync(recordPath(id));
|
|
187
215
|
}
|
|
188
|
-
catch {
|
|
216
|
+
catch {
|
|
217
|
+
/* already gone */
|
|
218
|
+
}
|
|
189
219
|
},
|
|
190
220
|
};
|
|
191
221
|
}
|
|
@@ -222,7 +252,9 @@ function listPeers(ownId) {
|
|
|
222
252
|
try {
|
|
223
253
|
fs.unlinkSync(recordPath(id));
|
|
224
254
|
}
|
|
225
|
-
catch {
|
|
255
|
+
catch {
|
|
256
|
+
/* raced with another GC — fine */
|
|
257
|
+
}
|
|
226
258
|
}
|
|
227
259
|
}
|
|
228
260
|
if (ownId) {
|
|
@@ -234,5 +266,11 @@ function listPeers(ownId) {
|
|
|
234
266
|
function findPeerByName(name) {
|
|
235
267
|
return listPeers().find((p) => p.name === name) ?? null;
|
|
236
268
|
}
|
|
237
|
-
exports._peerRegistryInternal = {
|
|
269
|
+
exports._peerRegistryInternal = {
|
|
270
|
+
peersRoot,
|
|
271
|
+
recordPath,
|
|
272
|
+
isRecordAlive,
|
|
273
|
+
HEARTBEAT_STALE_MS,
|
|
274
|
+
HEARTBEAT_INTERVAL_MS,
|
|
275
|
+
};
|
|
238
276
|
//# sourceMappingURL=peerRegistry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peerTransport.d.ts","sourceRoot":"","sources":["../../src/agent/peerTransport.ts"],"names":[],"mappings":"AAgDA,MAAM,WAAW,WAAW;IAC1B,uFAAuF;IACvF,IAAI,EAAE,MAAM,CAAC;IACb,iGAAiG;IACjG,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AA+CD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,iBAAS,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmB7D;AAED,MAAM,WAAW,gBAAgB;IAC/B,0FAA0F;IAC1F,SAAS,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IACtC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"peerTransport.d.ts","sourceRoot":"","sources":["../../src/agent/peerTransport.ts"],"names":[],"mappings":"AAgDA,MAAM,WAAW,WAAW;IAC1B,uFAAuF;IACvF,IAAI,EAAE,MAAM,CAAC;IACb,iGAAiG;IACjG,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AA+CD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,iBAAS,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmB7D;AAED,MAAM,WAAW,gBAAgB;IAC/B,0FAA0F;IAC1F,SAAS,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IACtC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,SAAS,CAgGhF;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,gBAAgB,EAAE,MAAM,EACxB,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,GACnC,OAAO,CAAC,qBAAqB,CAAC,CAqChC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,eAAe,EAAE,EAC1B,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,GACnC,OAAO,CAAC,eAAe,EAAE,CAAC,CAQ5B;AAED,eAAO,MAAM,sBAAsB;;;;;CAA2E,CAAC"}
|
|
@@ -215,7 +215,9 @@ function startPeerInbox(peerId, opts) {
|
|
|
215
215
|
try {
|
|
216
216
|
fs.unlinkSync(socketPath);
|
|
217
217
|
}
|
|
218
|
-
catch {
|
|
218
|
+
catch {
|
|
219
|
+
/* did not exist */
|
|
220
|
+
}
|
|
219
221
|
}
|
|
220
222
|
// No directory/stale-file handling needed on Windows — named pipes have no
|
|
221
223
|
// on-disk path component (see socketPathFor's doc comment), and a stale
|
|
@@ -247,10 +249,14 @@ function startPeerInbox(peerId, opts) {
|
|
|
247
249
|
});
|
|
248
250
|
}
|
|
249
251
|
}
|
|
250
|
-
catch {
|
|
252
|
+
catch {
|
|
253
|
+
/* malformed message — drop silently, same as a corrupt network packet */
|
|
254
|
+
}
|
|
251
255
|
conn.end();
|
|
252
256
|
});
|
|
253
|
-
conn.on('error', () => {
|
|
257
|
+
conn.on('error', () => {
|
|
258
|
+
/* peer disconnected mid-write — nothing to recover */
|
|
259
|
+
});
|
|
254
260
|
});
|
|
255
261
|
server.listen(socketPath, () => {
|
|
256
262
|
if (isWindows)
|
|
@@ -261,14 +267,18 @@ function startPeerInbox(peerId, opts) {
|
|
|
261
267
|
try {
|
|
262
268
|
fs.chmodSync(socketPath, 0o600);
|
|
263
269
|
}
|
|
264
|
-
catch {
|
|
270
|
+
catch {
|
|
271
|
+
/* best-effort on platforms without POSIX chmod semantics */
|
|
272
|
+
}
|
|
265
273
|
});
|
|
266
274
|
// See PeerInboxOptions.onError's own comment for why this used to be a
|
|
267
275
|
// pure no-op (`() => {}`) and why that was a real bug, not a deliberate
|
|
268
276
|
// simplification: `listen()` failing (EINVAL for an over-length path,
|
|
269
277
|
// EADDRINUSE, EACCES, ...) used to be indistinguishable from success from
|
|
270
278
|
// this function's return value alone.
|
|
271
|
-
server.on('error', (err) => {
|
|
279
|
+
server.on('error', (err) => {
|
|
280
|
+
opts.onError?.(err instanceof Error ? err : new Error(String(err)));
|
|
281
|
+
});
|
|
272
282
|
return {
|
|
273
283
|
socketPath,
|
|
274
284
|
close() {
|
|
@@ -286,7 +296,9 @@ function startPeerInbox(peerId, opts) {
|
|
|
286
296
|
try {
|
|
287
297
|
fs.unlinkSync(socketPath);
|
|
288
298
|
}
|
|
289
|
-
catch {
|
|
299
|
+
catch {
|
|
300
|
+
/* already gone, or never existed (Windows) */
|
|
301
|
+
}
|
|
290
302
|
},
|
|
291
303
|
};
|
|
292
304
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planMode.d.ts","sourceRoot":"","sources":["../../src/agent/planMode.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"planMode.d.ts","sourceRoot":"","sources":["../../src/agent/planMode.ts"],"names":[],"mappings":"AAwOA,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,MAAM,EAAE,eAAe,GAAG,oBAAoB,CAAC;IAC/C,gFAAgF;IAChF,OAAO,EAAE,MAAM,CAAC;CACjB;AAuKD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CA8D1D;AAQD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAU3D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,GAAG,IAAI,CAoClG;AAED,oEAAoE;AACpE,eAAO,MAAM,sBAAsB,QAqBvB,CAAC"}
|
package/dist/agent/planMode.js
CHANGED
|
@@ -31,18 +31,26 @@ exports.checkPlanMode = checkPlanMode;
|
|
|
31
31
|
* and the refusal is visible the first time anybody tries it.
|
|
32
32
|
*/
|
|
33
33
|
const READ_ONLY_TOOLS = new Set([
|
|
34
|
-
'read_file',
|
|
34
|
+
'read_file',
|
|
35
|
+
'search_files',
|
|
36
|
+
'glob',
|
|
37
|
+
'list_directory',
|
|
38
|
+
'notebook_read',
|
|
35
39
|
// Planning bookkeeping. todo_write persists only to the session's own todo
|
|
36
40
|
// list, not the repo, so it stays available — a plan mode that cannot draft
|
|
37
41
|
// a checklist is missing the point of plan mode.
|
|
38
|
-
'todo_write',
|
|
39
|
-
'
|
|
42
|
+
'todo_write',
|
|
43
|
+
'todo_read',
|
|
44
|
+
'cron_list',
|
|
45
|
+
'mcp_list_resources',
|
|
46
|
+
'mcp_read_resource',
|
|
40
47
|
// Reading memory is fine; memory_write is NOT here on purpose. Memory is
|
|
41
48
|
// durable state that survives the session, so writing it is a real mutation
|
|
42
49
|
// even though no file in the repo changes.
|
|
43
50
|
'memory_read',
|
|
44
51
|
'use_skill',
|
|
45
|
-
'fetch_url',
|
|
52
|
+
'fetch_url',
|
|
53
|
+
'web_search',
|
|
46
54
|
// Delegating research is ALLOWED, and this is safe rather than a hole:
|
|
47
55
|
// runSubTask passes planMode down, so the sub-agent is under the same lock and
|
|
48
56
|
// its own write tools are refused by this very function one level deeper.
|
|
@@ -53,8 +61,12 @@ const READ_ONLY_TOOLS = new Set([
|
|
|
53
61
|
// the mode's headline use case worse, for no security gain.
|
|
54
62
|
'task',
|
|
55
63
|
// VS Code language server — all pure queries.
|
|
56
|
-
'get_symbols',
|
|
57
|
-
'
|
|
64
|
+
'get_symbols',
|
|
65
|
+
'get_workspace_symbols',
|
|
66
|
+
'find_references',
|
|
67
|
+
'go_to_definition',
|
|
68
|
+
'get_hover',
|
|
69
|
+
'get_diagnostics',
|
|
58
70
|
// Reading output from an ALREADY-running background shell. Starting one is
|
|
59
71
|
// gated with the rest of bash below; draining a buffer is not a new effect.
|
|
60
72
|
'bash_output',
|
|
@@ -68,16 +80,71 @@ const READ_ONLY_TOOLS = new Set([
|
|
|
68
80
|
* `isReadOnlyCommand` for the several that are read-only ONLY in some forms.
|
|
69
81
|
*/
|
|
70
82
|
const READ_ONLY_BASH = new Set([
|
|
71
|
-
'ls',
|
|
72
|
-
'
|
|
73
|
-
'
|
|
74
|
-
'
|
|
75
|
-
'
|
|
76
|
-
'
|
|
83
|
+
'ls',
|
|
84
|
+
'cat',
|
|
85
|
+
'head',
|
|
86
|
+
'tail',
|
|
87
|
+
'wc',
|
|
88
|
+
'file',
|
|
89
|
+
'stat',
|
|
90
|
+
'du',
|
|
91
|
+
'df',
|
|
92
|
+
'pwd',
|
|
93
|
+
'which',
|
|
94
|
+
'type',
|
|
95
|
+
'echo',
|
|
96
|
+
'printf',
|
|
97
|
+
'basename',
|
|
98
|
+
'dirname',
|
|
99
|
+
'realpath',
|
|
100
|
+
'readlink',
|
|
101
|
+
'grep',
|
|
102
|
+
'egrep',
|
|
103
|
+
'fgrep',
|
|
104
|
+
'rg',
|
|
105
|
+
'ag',
|
|
106
|
+
'ack',
|
|
107
|
+
'find',
|
|
108
|
+
'fd',
|
|
109
|
+
'locate',
|
|
110
|
+
'diff',
|
|
111
|
+
'comm',
|
|
112
|
+
'cmp',
|
|
113
|
+
'sort',
|
|
114
|
+
'uniq',
|
|
115
|
+
'cut',
|
|
116
|
+
'tr',
|
|
117
|
+
'column',
|
|
118
|
+
'jq',
|
|
119
|
+
'yq',
|
|
120
|
+
'date',
|
|
121
|
+
'whoami',
|
|
122
|
+
'hostname',
|
|
123
|
+
'uname',
|
|
124
|
+
'env',
|
|
125
|
+
'printenv',
|
|
126
|
+
'id',
|
|
127
|
+
'groups',
|
|
128
|
+
'ps',
|
|
129
|
+
'uptime',
|
|
130
|
+
'free',
|
|
131
|
+
'node',
|
|
132
|
+
'python',
|
|
133
|
+
'python3',
|
|
77
134
|
// `less`/`more`/`top` are deliberately NOT here: pagers run `!cmd` from inside and
|
|
78
135
|
// `top` never exits. `env` is listed but only bare — see toolFlagsOk.
|
|
79
|
-
'tree',
|
|
80
|
-
'
|
|
136
|
+
'tree',
|
|
137
|
+
'nl',
|
|
138
|
+
'tac',
|
|
139
|
+
'strings',
|
|
140
|
+
'md5sum',
|
|
141
|
+
'sha256sum',
|
|
142
|
+
'true',
|
|
143
|
+
'false',
|
|
144
|
+
'test',
|
|
145
|
+
'sleep',
|
|
146
|
+
'seq',
|
|
147
|
+
'expr',
|
|
81
148
|
// Changes this shell's cwd only. Needed so `cd x && ls` is not refused.
|
|
82
149
|
'cd',
|
|
83
150
|
]);
|
|
@@ -87,9 +154,7 @@ const READ_ONLY_BASH = new Set([
|
|
|
87
154
|
* `build/git` — attacker-written files — were classified by their NAME and waved
|
|
88
155
|
* through as read-only.
|
|
89
156
|
*/
|
|
90
|
-
const SYSTEM_BIN_DIRS = new Set([
|
|
91
|
-
'/bin', '/usr/bin', '/usr/local/bin', '/sbin', '/usr/sbin', '/opt/homebrew/bin',
|
|
92
|
-
]);
|
|
157
|
+
const SYSTEM_BIN_DIRS = new Set(['/bin', '/usr/bin', '/usr/local/bin', '/sbin', '/usr/sbin', '/opt/homebrew/bin']);
|
|
93
158
|
/**
|
|
94
159
|
* Environment assignments that change WHAT a read-only verb runs: the search path,
|
|
95
160
|
* loader, pager/editor/external-diff hooks, and the interpreters' option vars.
|
|
@@ -106,10 +171,31 @@ const GH_NOUNS = new Set(['pr', 'issue', 'run', 'repo', 'release', 'workflow', '
|
|
|
106
171
|
*/
|
|
107
172
|
const READ_ONLY_SUBCOMMANDS = {
|
|
108
173
|
git: new Set([
|
|
109
|
-
'log',
|
|
110
|
-
'
|
|
111
|
-
'
|
|
112
|
-
'
|
|
174
|
+
'log',
|
|
175
|
+
'show',
|
|
176
|
+
'diff',
|
|
177
|
+
'status',
|
|
178
|
+
'blame',
|
|
179
|
+
'branch',
|
|
180
|
+
'tag',
|
|
181
|
+
'remote',
|
|
182
|
+
'describe',
|
|
183
|
+
'rev-parse',
|
|
184
|
+
'rev-list',
|
|
185
|
+
'ls-files',
|
|
186
|
+
'ls-tree',
|
|
187
|
+
'ls-remote',
|
|
188
|
+
'cat-file',
|
|
189
|
+
'shortlog',
|
|
190
|
+
'reflog',
|
|
191
|
+
'whatchanged',
|
|
192
|
+
'grep',
|
|
193
|
+
'config',
|
|
194
|
+
'check-ignore',
|
|
195
|
+
'merge-base',
|
|
196
|
+
'name-rev',
|
|
197
|
+
'count-objects',
|
|
198
|
+
'verify-commit',
|
|
113
199
|
]),
|
|
114
200
|
// Package managers: only their query verbs.
|
|
115
201
|
npm: new Set(['ls', 'list', 'view', 'info', 'outdated', 'why', 'config', 'ping', 'search']),
|
|
@@ -151,23 +237,33 @@ function toolFlagsOk(verb, args) {
|
|
|
151
237
|
const flags = args.filter((a) => a.startsWith('-'));
|
|
152
238
|
const pos = args.filter((a) => !a.startsWith('-'));
|
|
153
239
|
switch (verb) {
|
|
154
|
-
case 'env':
|
|
240
|
+
case 'env':
|
|
241
|
+
return args.length === 0; // `env CMD` RUNS CMD
|
|
155
242
|
case 'sort':
|
|
156
243
|
return !flags.some((f) => (isShort(f) && /^-[A-Za-z]*o/.test(f)) || f.startsWith('--output') || f.startsWith('--compress-program'));
|
|
157
|
-
case 'uniq':
|
|
244
|
+
case 'uniq':
|
|
245
|
+
return pos.length <= 1; // second positional is an OUTPUT file
|
|
158
246
|
case 'find':
|
|
159
247
|
return !args.some((a) => ['-exec', '-execdir', '-delete', '-ok', '-okdir', '-fprint', '-fprint0', '-fprintf', '-fls'].includes(a));
|
|
160
248
|
case 'fd':
|
|
161
249
|
return !flags.some((f) => f.startsWith('--exec') || (isShort(f) && /^-[A-Za-z]*[xX]/.test(f)));
|
|
162
|
-
case 'rg':
|
|
250
|
+
case 'rg':
|
|
251
|
+
return !flags.some((f) => flagName(f) === '--pre' || f.startsWith('--hostname-bin'));
|
|
163
252
|
case 'ag':
|
|
164
|
-
case 'ack':
|
|
165
|
-
|
|
166
|
-
case '
|
|
167
|
-
|
|
168
|
-
case '
|
|
169
|
-
|
|
170
|
-
|
|
253
|
+
case 'ack':
|
|
254
|
+
return !flags.some((f) => f.startsWith('--pager'));
|
|
255
|
+
case 'yq':
|
|
256
|
+
return !flags.some((f) => (isShort(f) && /^-[A-Za-z]*i/.test(f)) || f.startsWith('--inplace'));
|
|
257
|
+
case 'tree':
|
|
258
|
+
return !flags.some((f) => isShort(f) && /^-[A-Za-z]*o/.test(f));
|
|
259
|
+
case 'date':
|
|
260
|
+
return !flags.some((f) => (isShort(f) && /^-[A-Za-z]*s/.test(f)) || f.startsWith('--set'));
|
|
261
|
+
case 'hostname':
|
|
262
|
+
return pos.length === 0; // `hostname NAME` renames the machine
|
|
263
|
+
case 'file':
|
|
264
|
+
return !flags.some((f) => (isShort(f) && /^-[A-Za-z]*C/.test(f)) || f.startsWith('--compile'));
|
|
265
|
+
default:
|
|
266
|
+
return true;
|
|
171
267
|
}
|
|
172
268
|
}
|
|
173
269
|
/** Every flag must be a known read-only one; anything unfamiliar fails closed. */
|
|
@@ -192,18 +288,72 @@ function subcommandFlagsOk(verb, sub, args) {
|
|
|
192
288
|
return false;
|
|
193
289
|
switch (sub) {
|
|
194
290
|
case 'branch':
|
|
195
|
-
return flagsWithin(flags, 'arvlq', [
|
|
196
|
-
|
|
291
|
+
return (flagsWithin(flags, 'arvlq', [
|
|
292
|
+
'--all',
|
|
293
|
+
'--remotes',
|
|
294
|
+
'--verbose',
|
|
295
|
+
'--list',
|
|
296
|
+
'--show-current',
|
|
297
|
+
'--contains',
|
|
298
|
+
'--no-contains',
|
|
299
|
+
'--merged',
|
|
300
|
+
'--no-merged',
|
|
301
|
+
'--points-at',
|
|
302
|
+
'--sort',
|
|
303
|
+
'--format',
|
|
304
|
+
'--column',
|
|
305
|
+
'--no-column',
|
|
306
|
+
'--color',
|
|
307
|
+
'--no-color',
|
|
308
|
+
'--abbrev',
|
|
309
|
+
'--no-abbrev',
|
|
310
|
+
'--ignore-case',
|
|
311
|
+
'--omit-empty',
|
|
312
|
+
]) &&
|
|
313
|
+
(pos.length <= 1 || listish));
|
|
197
314
|
case 'tag':
|
|
198
|
-
return flagsWithin(flags, 'lnv', [
|
|
199
|
-
|
|
315
|
+
return (flagsWithin(flags, 'lnv', [
|
|
316
|
+
'--list',
|
|
317
|
+
'--contains',
|
|
318
|
+
'--no-contains',
|
|
319
|
+
'--merged',
|
|
320
|
+
'--no-merged',
|
|
321
|
+
'--points-at',
|
|
322
|
+
'--sort',
|
|
323
|
+
'--format',
|
|
324
|
+
'--column',
|
|
325
|
+
'--no-column',
|
|
326
|
+
'--color',
|
|
327
|
+
'--no-color',
|
|
328
|
+
'--verify',
|
|
329
|
+
'--ignore-case',
|
|
330
|
+
'--omit-empty',
|
|
331
|
+
]) &&
|
|
332
|
+
(pos.length <= 1 || listish || flags.some((f) => f === '-v' || f === '--verify')));
|
|
200
333
|
case 'remote':
|
|
201
|
-
return flagsWithin(flags, 'vn', ['--verbose']) && (pos[1] === undefined || pos[1] === 'show' || pos[1] === 'get-url');
|
|
334
|
+
return (flagsWithin(flags, 'vn', ['--verbose']) && (pos[1] === undefined || pos[1] === 'show' || pos[1] === 'get-url'));
|
|
202
335
|
case 'config':
|
|
203
|
-
return flagsWithin(flags, 'lz', [
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
336
|
+
return (flagsWithin(flags, 'lz', [
|
|
337
|
+
'--get',
|
|
338
|
+
'--get-all',
|
|
339
|
+
'--get-regexp',
|
|
340
|
+
'--list',
|
|
341
|
+
'--show-origin',
|
|
342
|
+
'--show-scope',
|
|
343
|
+
'--global',
|
|
344
|
+
'--local',
|
|
345
|
+
'--system',
|
|
346
|
+
'--worktree',
|
|
347
|
+
'--name-only',
|
|
348
|
+
'--null',
|
|
349
|
+
'--includes',
|
|
350
|
+
'--no-includes',
|
|
351
|
+
'--type',
|
|
352
|
+
]) && pos.length <= 2); // `config` itself + at most one key
|
|
353
|
+
case 'reflog':
|
|
354
|
+
return pos[1] !== 'expire' && pos[1] !== 'delete';
|
|
355
|
+
default:
|
|
356
|
+
return true;
|
|
207
357
|
}
|
|
208
358
|
}
|
|
209
359
|
if (sub === 'config' && (verb === 'npm' || verb === 'pnpm' || verb === 'yarn')) {
|
|
@@ -312,7 +462,10 @@ function isReadOnlyPipeline(command) {
|
|
|
312
462
|
return false;
|
|
313
463
|
if (/[>`]|\$\(|<\(/.test(cmd))
|
|
314
464
|
return false;
|
|
315
|
-
const segs = cmd
|
|
465
|
+
const segs = cmd
|
|
466
|
+
.split(/\|\||&&|[;|\n\r]/)
|
|
467
|
+
.map((x) => x.trim())
|
|
468
|
+
.filter(Boolean);
|
|
316
469
|
if (!segs.length)
|
|
317
470
|
return false;
|
|
318
471
|
return segs.every((seg) => !seg.includes('&') && isReadOnlyCommand(seg));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readDedupe.d.ts","sourceRoot":"","sources":["../../src/agent/readDedupe.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"readDedupe.d.ts","sourceRoot":"","sources":["../../src/agent/readDedupe.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAUxC,qBAAa,UAAU;IAGT,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAFrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;gBAE5B,OAAO,CAAC,EAAE,MAAM,YAAA;IAE7C,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,GAAG;IAQX,0EAA0E;IAC1E,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,GAAG,IAAI;IA0BzE,0FAA0F;IAC1F,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAW/D,uFAAuF;IACvF,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;CAOrC"}
|
package/dist/agent/readDedupe.js
CHANGED
|
@@ -109,7 +109,9 @@ class ReadDedupe {
|
|
|
109
109
|
const st = fs.statSync(k.abs);
|
|
110
110
|
this.records.set(k.key, { toolUseId, mtimeMs: st.mtimeMs, size: st.size });
|
|
111
111
|
}
|
|
112
|
-
catch {
|
|
112
|
+
catch {
|
|
113
|
+
/* unreadable now — nothing to remember */
|
|
114
|
+
}
|
|
113
115
|
}
|
|
114
116
|
/** Forget every recorded range of these absolute paths (a write tool touched them). */
|
|
115
117
|
invalidate(absPaths) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"securityLint.d.ts","sourceRoot":"","sources":["../../src/agent/securityLint.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"securityLint.d.ts","sourceRoot":"","sources":["../../src/agent/securityLint.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC;CAChB;AAyJD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,SAAI,GAAG,eAAe,EAAE,CA8CzE;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,CAapE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sharedTasks.d.ts","sourceRoot":"","sources":["../../src/agent/sharedTasks.ts"],"names":[],"mappings":"AA6DA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,SAAS,CAAC;AAE7E,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,UAAU,CAAC;IACnB,4HAA4H;IAC5H,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8HAA8H;IAC9H,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kGAAkG;IAClG,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA0BD,iBAAS,SAAS,IAAI,MAAM,CAE3B;AAED,iBAAS,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGzC;AAED,iBAAS,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEzD;
|
|
1
|
+
{"version":3,"file":"sharedTasks.d.ts","sourceRoot":"","sources":["../../src/agent/sharedTasks.ts"],"names":[],"mappings":"AA6DA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,SAAS,CAAC;AAE7E,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,UAAU,CAAC;IACnB,4HAA4H;IAC5H,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8HAA8H;IAC9H,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kGAAkG;IAClG,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA0BD,iBAAS,SAAS,IAAI,MAAM,CAE3B;AAED,iBAAS,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGzC;AAED,iBAAS,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEzD;AAiCD,0HAA0H;AAC1H,iBAAS,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAenD;AAED,4GAA4G;AAC5G,iBAAS,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAG/D;AAED,0IAA0I;AAC1I,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAe7D;AAED,sJAAsJ;AACtJ,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,IAAI,GAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GAC/C,UAAU,CAaZ;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAC9B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,iBAAiB,GAAG,SAAS,GAAG,aAAa,CAAA;CAAE,CAAC;AAEvF;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAmCxG;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,EAClB,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAChC,OAAO,CAAC,WAAW,CAAC,CA0BtB;AAED,eAAO,MAAM,oBAAoB;;;;;;;;CAQhC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAOzE"}
|
|
@@ -171,7 +171,9 @@ function isClaimAbandoned(task) {
|
|
|
171
171
|
// verdict is withheld until the claim has existed for a minimum age —
|
|
172
172
|
// without this guard, a session that legitimately claims-then-exits
|
|
173
173
|
// quickly can have its still-valid claim stolen out from under it.
|
|
174
|
-
if (age >= MIN_CLAIM_AGE_FOR_DEATH_CHECK_MS &&
|
|
174
|
+
if (age >= MIN_CLAIM_AGE_FOR_DEATH_CHECK_MS &&
|
|
175
|
+
typeof task.claimedByPid === 'number' &&
|
|
176
|
+
!isPidAlive(task.claimedByPid))
|
|
175
177
|
return true;
|
|
176
178
|
if (age > CLAIM_STALE_MS)
|
|
177
179
|
return true;
|
|
@@ -208,9 +210,12 @@ function createSharedTask(workDir, content, opts = {}) {
|
|
|
208
210
|
const id = opts.id ?? crypto.randomBytes(6).toString('hex');
|
|
209
211
|
const now = Date.now();
|
|
210
212
|
const task = {
|
|
211
|
-
id,
|
|
213
|
+
id,
|
|
214
|
+
content,
|
|
215
|
+
status: 'pending',
|
|
212
216
|
blockedBy: opts.blockedBy?.length ? opts.blockedBy : undefined,
|
|
213
|
-
createdAt: now,
|
|
217
|
+
createdAt: now,
|
|
218
|
+
updatedAt: now,
|
|
214
219
|
};
|
|
215
220
|
writeTask(workDir, task);
|
|
216
221
|
return task;
|
|
@@ -275,13 +280,23 @@ async function updateSharedTaskStatus(workDir, taskId, status, opts = {}) {
|
|
|
275
280
|
...task,
|
|
276
281
|
status,
|
|
277
282
|
updatedAt: Date.now(),
|
|
278
|
-
...(status === 'pending' || status === 'completed'
|
|
283
|
+
...(status === 'pending' || status === 'completed'
|
|
284
|
+
? { claimedBy: undefined, claimedByPid: undefined, claimedAt: undefined }
|
|
285
|
+
: {}),
|
|
279
286
|
};
|
|
280
287
|
writeTask(workDir, updated);
|
|
281
288
|
return { ok: true, task: updated };
|
|
282
289
|
}, workDir);
|
|
283
290
|
}
|
|
284
|
-
exports._sharedTasksInternal = {
|
|
291
|
+
exports._sharedTasksInternal = {
|
|
292
|
+
tasksRoot,
|
|
293
|
+
scopeDir,
|
|
294
|
+
taskPath,
|
|
295
|
+
isClaimAbandoned,
|
|
296
|
+
isUnblocked,
|
|
297
|
+
CLAIM_STALE_MS,
|
|
298
|
+
MIN_CLAIM_AGE_FOR_DEATH_CHECK_MS,
|
|
299
|
+
};
|
|
285
300
|
/**
|
|
286
301
|
* Remove a task outright — the veto path for a `TaskCreated` hook. Claude Code creates the
|
|
287
302
|
* task, and when a hook refuses it the task is DELETED and the reason goes back to the
|