@tianshu-ai/tianshu 0.133.0 → 0.134.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/package.json +1 -1
- package/packages/server/dist/chat/agent-tool-adapter.d.ts.map +1 -1
- package/packages/server/dist/chat/agent-tool-adapter.js +0 -36
- package/packages/server/dist/chat/agent-tool-adapter.js.map +1 -1
- package/packages/server/dist/chat/handler.d.ts.map +1 -1
- package/packages/server/dist/chat/handler.js +96 -3
- package/packages/server/dist/chat/handler.js.map +1 -1
- package/packages/server/dist/chat/pi-compat/harness-types.d.ts.map +1 -1
- package/packages/server/dist/chat/pi-compat/harness-types.js +1 -0
- package/packages/server/dist/chat/pi-compat/harness-types.js.map +1 -1
- package/packages/web/dist/assets/{DataSourceConfigForm-D4y6KJ3B.js → DataSourceConfigForm-geqHMq3x.js} +1 -1
- package/packages/web/dist/assets/{bundle-web-DGSEldSr.js → bundle-web-BclThylK.js} +1 -1
- package/packages/web/dist/assets/{index-BluDtlL9.js → index-vUXQ8w9R.js} +4 -4
- package/packages/web/dist/assets/{react-force-graph-2d-hlABNFoG.js → react-force-graph-2d-C9xIwwXx.js} +1 -1
- package/packages/web/dist/index.html +1 -1
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-tool-adapter.d.ts","sourceRoot":"","sources":["../../src/chat/agent-tool-adapter.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EACV,SAAS,IAAI,WAAW,EAEzB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAKjD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb;;;gEAG4D;IAC5D,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvD;AAsBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CA+B/D;AAED,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB;mEAC+D;IAC/D,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;CACjC;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,
|
|
1
|
+
{"version":3,"file":"agent-tool-adapter.d.ts","sourceRoot":"","sources":["../../src/chat/agent-tool-adapter.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EACV,SAAS,IAAI,WAAW,EAEzB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAKjD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb;;;gEAG4D;IAC5D,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvD;AAsBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CA+B/D;AAED,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB;mEAC+D;IAC/D,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;CACjC;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAiI7D;AAED;;qEAEqE;AACrE,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAIvD"}
|
|
@@ -100,35 +100,6 @@ export function adaptToolset(toolset) {
|
|
|
100
100
|
// permissive message, repeat. Persisting across turns lets us
|
|
101
101
|
// catch "second time the same tool ate truncation" reliably.
|
|
102
102
|
const truncationCount = new Map();
|
|
103
|
-
// ── Repetitive tool call detection ────────────────────────────
|
|
104
|
-
// Track recent tool calls by fingerprint (name + JSON-stable args).
|
|
105
|
-
// If the exact same call appears MAX_REPEAT times consecutively,
|
|
106
|
-
// return an error instead of executing — breaks infinite loops
|
|
107
|
-
// (e.g. ds_query calling the same SQL over and over).
|
|
108
|
-
const MAX_REPEAT = 3;
|
|
109
|
-
const recentFingerprints = [];
|
|
110
|
-
function checkRepetition(name, args) {
|
|
111
|
-
let argsStr;
|
|
112
|
-
try {
|
|
113
|
-
argsStr = JSON.stringify(args, Object.keys(args ?? {}).sort());
|
|
114
|
-
}
|
|
115
|
-
catch {
|
|
116
|
-
argsStr = String(args);
|
|
117
|
-
}
|
|
118
|
-
const fp = `${name}::${argsStr}`;
|
|
119
|
-
recentFingerprints.push(fp);
|
|
120
|
-
// Only keep the last MAX_REPEAT entries
|
|
121
|
-
if (recentFingerprints.length > MAX_REPEAT * 2)
|
|
122
|
-
recentFingerprints.splice(0, recentFingerprints.length - MAX_REPEAT * 2);
|
|
123
|
-
// Check if the last MAX_REPEAT calls are identical
|
|
124
|
-
if (recentFingerprints.length >= MAX_REPEAT) {
|
|
125
|
-
const tail = recentFingerprints.slice(-MAX_REPEAT);
|
|
126
|
-
if (tail.every(f => f === fp)) {
|
|
127
|
-
return `Note: You have called ${name} with the same arguments ${MAX_REPEAT} times in a row and got the same result each time. Consider whether you need to continue, or try a different approach.`;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
return null;
|
|
131
|
-
}
|
|
132
103
|
const tools = toolset.schemas.map((schema) => {
|
|
133
104
|
const exec = toolset.executors[schema.name];
|
|
134
105
|
const piTool = {
|
|
@@ -180,13 +151,6 @@ export function adaptToolset(toolset) {
|
|
|
180
151
|
? params
|
|
181
152
|
: {};
|
|
182
153
|
// ── Repetitive call circuit breaker ──
|
|
183
|
-
const loopMsg = checkRepetition(schema.name, args);
|
|
184
|
-
if (loopMsg) {
|
|
185
|
-
return {
|
|
186
|
-
content: [{ type: "text", text: loopMsg }],
|
|
187
|
-
details: undefined,
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
154
|
if (!exec) {
|
|
191
155
|
// Should be unreachable — schema came from the same map.
|
|
192
156
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-tool-adapter.js","sourceRoot":"","sources":["../../src/chat/agent-tool-adapter.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"agent-tool-adapter.js","sourceRoot":"","sources":["../../src/chat/agent-tool-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/chat/handler.ts"],"names":[],"mappings":"AAwDA,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EAGrB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC9B,MAAM,uBAAuB,CAAC;AAI/B,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,GAC9B,CAAC;AAGF,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,8BAA8B,EAC9B,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,EACxB,2BAA2B,EAC3B,yBAAyB,EACzB,6BAA6B,EAC7B,2BAA2B,EAC3B,4BAA4B,EAC5B,KAAK,oBAAoB,GAC1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAQL,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAuC1B,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAWL,KAAK,WAAW,EAGjB,MAAM,eAAe,CAAC;AAgBvB,OAAO,EAGL,KAAK,SAAS,EAEd,KAAK,cAAc,EAEpB,MAAM,kBAAkB,CAAC;AA8B1B,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,aAAa,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,CAAC;IAClB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,6BAA6B,EAAE,cAAc,CAAC;IACtE,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAYD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAmrB7D;AAED,UAAU,aAAa;IACrB,GAAG,EAAE,aAAa,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,MAAM,EAAE,WAAW,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,6BAA6B,EAAE,cAAc,CAAC;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;4BAGwB;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,OAAO,eAAe,EAAE,WAAW,CAAC;IAC9C;;;;;;OAMG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;kCAE8B;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/chat/handler.ts"],"names":[],"mappings":"AAwDA,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EAGrB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC9B,MAAM,uBAAuB,CAAC;AAI/B,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,GAC9B,CAAC;AAGF,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,8BAA8B,EAC9B,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,EACxB,2BAA2B,EAC3B,yBAAyB,EACzB,6BAA6B,EAC7B,2BAA2B,EAC3B,4BAA4B,EAC5B,KAAK,oBAAoB,GAC1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAQL,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAuC1B,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAWL,KAAK,WAAW,EAGjB,MAAM,eAAe,CAAC;AAgBvB,OAAO,EAGL,KAAK,SAAS,EAEd,KAAK,cAAc,EAEpB,MAAM,kBAAkB,CAAC;AA8B1B,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,aAAa,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,CAAC;IAClB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,6BAA6B,EAAE,cAAc,CAAC;IACtE,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAYD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAmrB7D;AAED,UAAU,aAAa;IACrB,GAAG,EAAE,aAAa,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,MAAM,EAAE,WAAW,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,6BAA6B,EAAE,cAAc,CAAC;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;4BAGwB;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,OAAO,eAAe,EAAE,WAAW,CAAC;IAC9C;;;;;;OAMG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;kCAE8B;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA0tDlE;AAyYD,wBAAgB,uBAAuB,CACrC,oBAAoB,EAAE,WAAW,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAC3D,2BAA2B,CAAC,EAAE,MAAM,GACnC,MAAM,CAuCR;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,oBAAoB,EAAE,MAAM,GAAG,MAAM,EAAE,CAgB3E;AA0ED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,aAAa,EAClB,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,IAAI,CA0Ef;AAolBD,wBAAgB,cAAc,IAAI,WAAW,EAAE,CAkC9C;AAGD,YAAY,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -1297,6 +1297,65 @@ export async function runPrompt(args) {
|
|
|
1297
1297
|
// the next LLM request. When context exceeds the threshold it runs
|
|
1298
1298
|
// an in-place compact so the agent continues with a smaller window.
|
|
1299
1299
|
const midTurnCompactRef = {};
|
|
1300
|
+
// ── Repetitive tool call loop detection ──────────────────────
|
|
1301
|
+
// Two detection modes:
|
|
1302
|
+
// A) Exact match — same tool + identical JSON-stable args
|
|
1303
|
+
// B) Name match — same tool name called consecutively (any args)
|
|
1304
|
+
//
|
|
1305
|
+
// Strategy: afterToolCall tracks calls. When threshold is hit,
|
|
1306
|
+
// set a flag → finishTurn returns { action: "end" } to stop the
|
|
1307
|
+
// current run → enqueueInbox sends a system notice so the next
|
|
1308
|
+
// run's LLM sees the warning and changes behavior.
|
|
1309
|
+
//
|
|
1310
|
+
// Thresholds (exact / name-only):
|
|
1311
|
+
// hint: 3 / 5 warn: 5 / 8 stop: 10 / 15
|
|
1312
|
+
const EXACT_HINT = 3, EXACT_WARN = 5, EXACT_STOP = 10;
|
|
1313
|
+
const NAME_HINT = 5, NAME_WARN = 8, NAME_STOP = 15;
|
|
1314
|
+
const loopCalls = [];
|
|
1315
|
+
let loopEndReason = null; // set by afterToolCall, read by finishTurn
|
|
1316
|
+
// Detect if this run was triggered by a loop notice — if so, don't
|
|
1317
|
+
// send another one (prevents meta-loop).
|
|
1318
|
+
const isLoopNoticeRun = args.content.includes('[System] ') && args.content.includes('tool call loop');
|
|
1319
|
+
function checkToolLoop(name, args) {
|
|
1320
|
+
let argsStr;
|
|
1321
|
+
try {
|
|
1322
|
+
argsStr = JSON.stringify(args, Object.keys(args ?? {}).sort());
|
|
1323
|
+
}
|
|
1324
|
+
catch {
|
|
1325
|
+
argsStr = String(args);
|
|
1326
|
+
}
|
|
1327
|
+
const fp = `${name}::${argsStr}`;
|
|
1328
|
+
loopCalls.push({ name, fp });
|
|
1329
|
+
if (loopCalls.length > NAME_STOP + 2)
|
|
1330
|
+
loopCalls.splice(0, loopCalls.length - NAME_STOP - 2);
|
|
1331
|
+
let exactStreak = 0;
|
|
1332
|
+
for (let i = loopCalls.length - 1; i >= 0; i--) {
|
|
1333
|
+
if (loopCalls[i].fp === fp)
|
|
1334
|
+
exactStreak++;
|
|
1335
|
+
else
|
|
1336
|
+
break;
|
|
1337
|
+
}
|
|
1338
|
+
let nameStreak = 0;
|
|
1339
|
+
for (let i = loopCalls.length - 1; i >= 0; i--) {
|
|
1340
|
+
if (loopCalls[i].name === name)
|
|
1341
|
+
nameStreak++;
|
|
1342
|
+
else
|
|
1343
|
+
break;
|
|
1344
|
+
}
|
|
1345
|
+
if (exactStreak >= EXACT_STOP)
|
|
1346
|
+
return { action: "stop", message: `Repetitive tool call loop detected: ${name} was called ${exactStreak} times with identical arguments. The result is the same every time. Do NOT call this tool again. Respond to the user or try a completely different approach.` };
|
|
1347
|
+
if (nameStreak >= NAME_STOP)
|
|
1348
|
+
return { action: "stop", message: `Repetitive tool call loop detected: ${name} was called ${nameStreak} times consecutively. You are stuck in a loop. Do NOT call ${name} again. Respond to the user or try a completely different approach.` };
|
|
1349
|
+
if (exactStreak >= EXACT_WARN)
|
|
1350
|
+
return { action: "warn", message: `Warning: ${name} was called ${exactStreak} times with identical arguments. The result is the same every time. Stop repeating this call and try a different approach.` };
|
|
1351
|
+
if (nameStreak >= NAME_WARN)
|
|
1352
|
+
return { action: "warn", message: `Warning: ${name} was called ${nameStreak} times consecutively. You appear to be in a loop. Stop and work with the data you already have.` };
|
|
1353
|
+
if (exactStreak >= EXACT_HINT)
|
|
1354
|
+
return { action: "hint", message: `Note: ${name} was called ${exactStreak} times with identical arguments. Consider whether continuing is productive, or try a different approach.` };
|
|
1355
|
+
if (nameStreak >= NAME_HINT)
|
|
1356
|
+
return { action: "hint", message: `Note: ${name} was called ${nameStreak} times consecutively. Make sure you are making progress and not stuck in a loop.` };
|
|
1357
|
+
return { action: "ok" };
|
|
1358
|
+
}
|
|
1300
1359
|
turnLog.info(`AgentHarness.create starting session=${session.id}`);
|
|
1301
1360
|
const { harness } = await AgentHarness.create({
|
|
1302
1361
|
session: piSession,
|
|
@@ -1317,9 +1376,11 @@ export async function runPrompt(args) {
|
|
|
1317
1376
|
model: piModel,
|
|
1318
1377
|
toProviderMessages,
|
|
1319
1378
|
prepareRequest: async (_request, signal) => {
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1379
|
+
// Mid-turn compaction DISABLED (2026-11-04) — suspected cause
|
|
1380
|
+
// of LLM repeat loops. Compaction between tool calls may erase
|
|
1381
|
+
// recent tool results, making the LLM "forget" what it just did
|
|
1382
|
+
// and repeat the same action. Re-enable after confirming.
|
|
1383
|
+
// if (midTurnCompactRef.fn) await midTurnCompactRef.fn(signal);
|
|
1323
1384
|
return undefined;
|
|
1324
1385
|
},
|
|
1325
1386
|
models: buildModels(piModel, apiKey, {
|
|
@@ -1351,6 +1412,38 @@ export async function runPrompt(args) {
|
|
|
1351
1412
|
});
|
|
1352
1413
|
},
|
|
1353
1414
|
}),
|
|
1415
|
+
// ── Loop detection: afterToolCall tracks, finishTurn ends ──
|
|
1416
|
+
afterToolCall: async (ctx) => {
|
|
1417
|
+
const check = checkToolLoop(ctx.toolCall.name, ctx.args);
|
|
1418
|
+
if (check.action === "ok")
|
|
1419
|
+
return undefined;
|
|
1420
|
+
turnLog.warn(`[loop_detect] action=${check.action} tool=${ctx.toolCall.name} streak=${loopCalls.length} msg=${check.message}`);
|
|
1421
|
+
// Set flag for finishTurn to end the run
|
|
1422
|
+
loopEndReason = check.message;
|
|
1423
|
+
return undefined;
|
|
1424
|
+
},
|
|
1425
|
+
finishTurn: async () => {
|
|
1426
|
+
if (!loopEndReason)
|
|
1427
|
+
return undefined;
|
|
1428
|
+
const reason = loopEndReason;
|
|
1429
|
+
loopEndReason = null;
|
|
1430
|
+
turnLog.warn(`[loop_detect] ending run, sending system notice`);
|
|
1431
|
+
// Send a system notice so the agent starts a new run with
|
|
1432
|
+
// awareness of the loop. Skip if this run was itself triggered
|
|
1433
|
+
// by a loop notice (prevents meta-loop).
|
|
1434
|
+
if (!isLoopNoticeRun) {
|
|
1435
|
+
setTimeout(() => {
|
|
1436
|
+
void enqueueInbox(ctx, session.id, {
|
|
1437
|
+
kind: "system_note",
|
|
1438
|
+
text: `[System] ${reason} Do not repeat the same tool calls. If the user's task is not yet complete, continue with a different approach. If you have enough information, respond to the user with your results.`,
|
|
1439
|
+
});
|
|
1440
|
+
}, 500);
|
|
1441
|
+
}
|
|
1442
|
+
else {
|
|
1443
|
+
turnLog.warn(`[loop_detect] skipping system notice — this run was already triggered by a loop notice`);
|
|
1444
|
+
}
|
|
1445
|
+
return { action: "end" };
|
|
1446
|
+
},
|
|
1354
1447
|
}, piContext).catch((err) => {
|
|
1355
1448
|
turnLog.error(`AgentHarness.create FAILED session=${session.id}`, err);
|
|
1356
1449
|
throw err;
|