bonecode 1.3.0 → 1.4.2
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/README.md +42 -0
- package/compat/opencode_adapter.ts +69 -8
- package/dist/compat/opencode_adapter.js +63 -7
- package/dist/compat/opencode_adapter.js.map +1 -1
- package/dist/src/db_adapter.js +30 -0
- package/dist/src/db_adapter.js.map +1 -1
- package/dist/src/engine/session/build_mode.d.ts +83 -0
- package/dist/src/engine/session/build_mode.js +800 -0
- package/dist/src/engine/session/build_mode.js.map +1 -0
- package/dist/src/engine/session/build_mode_helpers.d.ts +6 -0
- package/dist/src/engine/session/build_mode_helpers.js +61 -0
- package/dist/src/engine/session/build_mode_helpers.js.map +1 -0
- package/dist/src/engine/session/leaked_tool_call.d.ts +49 -0
- package/dist/src/engine/session/leaked_tool_call.js +174 -0
- package/dist/src/engine/session/leaked_tool_call.js.map +1 -0
- package/dist/src/engine/session/prompt/bonescript.txt +11 -0
- package/dist/src/engine/session/prompt.js +173 -2
- package/dist/src/engine/session/prompt.js.map +1 -1
- package/dist/src/tui.js +146 -9
- package/dist/src/tui.js.map +1 -1
- package/package.json +1 -1
- package/scripts/debug_extract.js +40 -0
- package/scripts/test_build_fallback.js +221 -0
- package/scripts/test_build_mode.js +301 -0
- package/scripts/test_leaked_tool_call.js +269 -0
- package/src/db_adapter.ts +29 -0
- package/src/engine/session/build_mode.ts +906 -0
- package/src/engine/session/build_mode_helpers.ts +72 -0
- package/src/engine/session/leaked_tool_call.ts +166 -0
- package/src/engine/session/prompt/bonescript.txt +11 -0
- package/src/engine/session/prompt.ts +219 -2
- package/src/tui.ts +147 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build_mode.js","sourceRoot":"","sources":["../../../../src/engine/session/build_mode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider/model factory used by build_mode.ts for structured-output prompts.
|
|
3
|
+
* Mirrors the factory in prompt.ts so the build orchestrator can issue
|
|
4
|
+
* non-streaming model calls without depending on the streaming agent loop.
|
|
5
|
+
*/
|
|
6
|
+
export declare function getLanguageModel(provider_id: string, model_id: string): any;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Provider/model factory used by build_mode.ts for structured-output prompts.
|
|
4
|
+
* Mirrors the factory in prompt.ts so the build orchestrator can issue
|
|
5
|
+
* non-streaming model calls without depending on the streaming agent loop.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.getLanguageModel = void 0;
|
|
9
|
+
const openai_1 = require("@ai-sdk/openai");
|
|
10
|
+
const anthropic_1 = require("@ai-sdk/anthropic");
|
|
11
|
+
const google_1 = require("@ai-sdk/google");
|
|
12
|
+
function getLanguageModel(provider_id, model_id) {
|
|
13
|
+
const pid = provider_id.toLowerCase();
|
|
14
|
+
const resolvedProvider = pid === "local"
|
|
15
|
+
? (process.env.DEFAULT_PROVIDER || "openai_compatible").toLowerCase()
|
|
16
|
+
: pid;
|
|
17
|
+
const resolvedModel = pid === "local"
|
|
18
|
+
? (process.env.DEFAULT_MODEL || model_id)
|
|
19
|
+
: model_id;
|
|
20
|
+
const apiKey = (process.env[`${resolvedProvider.toUpperCase()}_API_KEY`] ||
|
|
21
|
+
process.env.OPENAI_API_KEY ||
|
|
22
|
+
"not-needed");
|
|
23
|
+
const baseUrl = (process.env[`${resolvedProvider.toUpperCase()}_BASE_URL`] ||
|
|
24
|
+
process.env.OPENAI_BASE_URL);
|
|
25
|
+
switch (resolvedProvider) {
|
|
26
|
+
case "anthropic":
|
|
27
|
+
return (0, anthropic_1.createAnthropic)({ apiKey, baseURL: baseUrl })(resolvedModel);
|
|
28
|
+
case "google":
|
|
29
|
+
return (0, google_1.createGoogleGenerativeAI)({ apiKey })(resolvedModel);
|
|
30
|
+
case "groq": {
|
|
31
|
+
const { createGroq } = require("@ai-sdk/groq");
|
|
32
|
+
return createGroq({ apiKey: process.env.GROQ_API_KEY || apiKey })(resolvedModel);
|
|
33
|
+
}
|
|
34
|
+
case "cerebras": {
|
|
35
|
+
const { createCerebras } = require("@ai-sdk/cerebras");
|
|
36
|
+
return createCerebras({ apiKey: process.env.CEREBRAS_API_KEY || apiKey })(resolvedModel);
|
|
37
|
+
}
|
|
38
|
+
case "deepseek":
|
|
39
|
+
return (0, openai_1.createOpenAI)({
|
|
40
|
+
apiKey: process.env.DEEPSEEK_API_KEY || apiKey,
|
|
41
|
+
baseURL: "https://api.deepseek.com/v1",
|
|
42
|
+
})(resolvedModel);
|
|
43
|
+
case "openrouter": {
|
|
44
|
+
const { createOpenRouter } = require("@openrouter/ai-sdk-provider");
|
|
45
|
+
return createOpenRouter({
|
|
46
|
+
apiKey: process.env.OPENROUTER_API_KEY || apiKey,
|
|
47
|
+
})(resolvedModel);
|
|
48
|
+
}
|
|
49
|
+
case "ollama":
|
|
50
|
+
return (0, openai_1.createOpenAI)({
|
|
51
|
+
apiKey: "ollama",
|
|
52
|
+
baseURL: process.env.OLLAMA_BASE_URL || "http://localhost:11434/v1",
|
|
53
|
+
})(resolvedModel);
|
|
54
|
+
case "openai":
|
|
55
|
+
case "openai_compatible":
|
|
56
|
+
default:
|
|
57
|
+
return (0, openai_1.createOpenAI)({ apiKey, baseURL: baseUrl })(resolvedModel);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.getLanguageModel = getLanguageModel;
|
|
61
|
+
//# sourceMappingURL=build_mode_helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build_mode_helpers.js","sourceRoot":"","sources":["../../../../src/engine/session/build_mode_helpers.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,2CAA8C;AAC9C,iDAAoD;AACpD,2CAA0D;AAE1D,SAAgB,gBAAgB,CAAC,WAAmB,EAAE,QAAgB;IACpE,MAAM,GAAG,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;IAEtC,MAAM,gBAAgB,GAAG,GAAG,KAAK,OAAO;QACtC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,mBAAmB,CAAC,CAAC,WAAW,EAAE;QACrE,CAAC,CAAC,GAAG,CAAC;IACR,MAAM,aAAa,GAAG,GAAG,KAAK,OAAO;QACnC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,QAAQ,CAAC;QACzC,CAAC,CAAC,QAAQ,CAAC;IAEb,MAAM,MAAM,GAAG,CACb,OAAO,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,WAAW,EAAE,UAAU,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,cAAc;QAC1B,YAAY,CACb,CAAC;IACF,MAAM,OAAO,GAAG,CACd,OAAO,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,eAAe,CAC5B,CAAC;IAEF,QAAQ,gBAAgB,EAAE,CAAC;QACzB,KAAK,WAAW;YACd,OAAO,IAAA,2BAAe,EAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;QAEtE,KAAK,QAAQ;YACX,OAAO,IAAA,iCAAwB,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;QAE7D,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;YAC/C,OAAO,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,MAAM,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;QACnF,CAAC;QAED,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;YACvD,OAAO,cAAc,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,MAAM,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;QAC3F,CAAC;QAED,KAAK,UAAU;YACb,OAAO,IAAA,qBAAY,EAAC;gBAClB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,MAAM;gBAC9C,OAAO,EAAE,6BAA6B;aACvC,CAAC,CAAC,aAAa,CAAC,CAAC;QAEpB,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;YACpE,OAAO,gBAAgB,CAAC;gBACtB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,MAAM;aACjD,CAAC,CAAC,aAAa,CAAC,CAAC;QACpB,CAAC;QAED,KAAK,QAAQ;YACX,OAAO,IAAA,qBAAY,EAAC;gBAClB,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,2BAA2B;aACpE,CAAC,CAAC,aAAa,CAAC,CAAC;QAEpB,KAAK,QAAQ,CAAC;QACd,KAAK,mBAAmB,CAAC;QACzB;YACE,OAAO,IAAA,qBAAY,EAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AA7DD,4CA6DC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure, side-effect-free parser for leaked tool-call markers.
|
|
3
|
+
*
|
|
4
|
+
* Some local models (gemma, qwen, llama variants) emit their internal
|
|
5
|
+
* tool-call markers as raw text instead of producing structured tool_call
|
|
6
|
+
* events. The AI SDK's parser misses these, so the model's prose appears in
|
|
7
|
+
* the output but no tool ever runs.
|
|
8
|
+
*
|
|
9
|
+
* This module recovers the intended call by pattern-matching the leaked text.
|
|
10
|
+
* No DB, no network, no global state — pure functions only, fully testable.
|
|
11
|
+
*
|
|
12
|
+
* Patterns recognized (across multiple template formats):
|
|
13
|
+
* <|tool_call|>{"name":"write","arguments":{...}}<|/tool_call|>
|
|
14
|
+
* <|tool_call>name:write{...args...}<tool_call|>
|
|
15
|
+
* <tool_call>{"name":"write","arguments":{...}}</tool_call>
|
|
16
|
+
* <function_call>{"name":"write","arguments":{...}}</function_call>
|
|
17
|
+
* ```tool_code\nwrite(path="x", content="y")\n```
|
|
18
|
+
* <|python_tag|>write({"path": "x"})<|/python_tag|>
|
|
19
|
+
*/
|
|
20
|
+
export interface LeakedToolCall {
|
|
21
|
+
toolName: string;
|
|
22
|
+
toolInput: Record<string, any>;
|
|
23
|
+
startIndex: number;
|
|
24
|
+
endIndex: number;
|
|
25
|
+
}
|
|
26
|
+
export declare function extractLeakedToolCall(text: string): LeakedToolCall | null;
|
|
27
|
+
/**
|
|
28
|
+
* Parse the body of a leaked tool-call block. Tries multiple formats:
|
|
29
|
+
* - JSON: {"name": "write", "arguments": {...}} or {"tool":"write","args":{...}}
|
|
30
|
+
* - Function-call style: write(path="x", content="y")
|
|
31
|
+
* - Pseudo-syntax: call:write{path:"x"}
|
|
32
|
+
*/
|
|
33
|
+
export declare function parseLeakedBody(body: string): {
|
|
34
|
+
toolName: string;
|
|
35
|
+
toolInput: Record<string, any>;
|
|
36
|
+
} | null;
|
|
37
|
+
export declare function safeParseJson(s: string): any | null;
|
|
38
|
+
/**
|
|
39
|
+
* Parse Python-style kwargs from a function-call body:
|
|
40
|
+
* path="x", content="y", count=42
|
|
41
|
+
* Strips `<|"|>` style escape markers some templates inject.
|
|
42
|
+
*/
|
|
43
|
+
export declare function parseKwargs(s: string): Record<string, any> | null;
|
|
44
|
+
/**
|
|
45
|
+
* Parse a loose key:value object body (no surrounding braces, no enforced
|
|
46
|
+
* JSON quoting). Used for pseudo-syntax fallbacks like:
|
|
47
|
+
* file_path:<|"|>medieval_market.bone<|"|>
|
|
48
|
+
*/
|
|
49
|
+
export declare function parseLooseObject(s: string): Record<string, any> | null;
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Pure, side-effect-free parser for leaked tool-call markers.
|
|
4
|
+
*
|
|
5
|
+
* Some local models (gemma, qwen, llama variants) emit their internal
|
|
6
|
+
* tool-call markers as raw text instead of producing structured tool_call
|
|
7
|
+
* events. The AI SDK's parser misses these, so the model's prose appears in
|
|
8
|
+
* the output but no tool ever runs.
|
|
9
|
+
*
|
|
10
|
+
* This module recovers the intended call by pattern-matching the leaked text.
|
|
11
|
+
* No DB, no network, no global state — pure functions only, fully testable.
|
|
12
|
+
*
|
|
13
|
+
* Patterns recognized (across multiple template formats):
|
|
14
|
+
* <|tool_call|>{"name":"write","arguments":{...}}<|/tool_call|>
|
|
15
|
+
* <|tool_call>name:write{...args...}<tool_call|>
|
|
16
|
+
* <tool_call>{"name":"write","arguments":{...}}</tool_call>
|
|
17
|
+
* <function_call>{"name":"write","arguments":{...}}</function_call>
|
|
18
|
+
* ```tool_code\nwrite(path="x", content="y")\n```
|
|
19
|
+
* <|python_tag|>write({"path": "x"})<|/python_tag|>
|
|
20
|
+
*/
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.parseLooseObject = exports.parseKwargs = exports.safeParseJson = exports.parseLeakedBody = exports.extractLeakedToolCall = void 0;
|
|
23
|
+
function extractLeakedToolCall(text) {
|
|
24
|
+
// Pattern 1: <|tool_call|>...<|/tool_call|> or <tool_call>...</tool_call>
|
|
25
|
+
const blockPatterns = [
|
|
26
|
+
/<\|tool_call\|?>([\s\S]*?)<\|?\/?tool_call\|?>/i,
|
|
27
|
+
/<tool_call>([\s\S]*?)<\/?tool_call>/i,
|
|
28
|
+
/<function_call>([\s\S]*?)<\/?function_call>/i,
|
|
29
|
+
/<\|python_tag\|>([\s\S]*?)<\|?\/?python_tag\|?>/i,
|
|
30
|
+
];
|
|
31
|
+
for (const re of blockPatterns) {
|
|
32
|
+
const m = text.match(re);
|
|
33
|
+
if (!m || m.index === undefined)
|
|
34
|
+
continue;
|
|
35
|
+
const body = m[1];
|
|
36
|
+
const parsed = parseLeakedBody(body);
|
|
37
|
+
if (parsed) {
|
|
38
|
+
return { ...parsed, startIndex: m.index, endIndex: m.index + m[0].length };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Pattern 2: ```tool_code ... ```
|
|
42
|
+
const codeBlock = text.match(/```(?:tool_code|tool_call|function|python)\s*\n([\s\S]*?)\n```/i);
|
|
43
|
+
if (codeBlock && codeBlock.index !== undefined) {
|
|
44
|
+
const parsed = parseLeakedBody(codeBlock[1]);
|
|
45
|
+
if (parsed) {
|
|
46
|
+
return { ...parsed, startIndex: codeBlock.index, endIndex: codeBlock.index + codeBlock[0].length };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
exports.extractLeakedToolCall = extractLeakedToolCall;
|
|
52
|
+
/**
|
|
53
|
+
* Parse the body of a leaked tool-call block. Tries multiple formats:
|
|
54
|
+
* - JSON: {"name": "write", "arguments": {...}} or {"tool":"write","args":{...}}
|
|
55
|
+
* - Function-call style: write(path="x", content="y")
|
|
56
|
+
* - Pseudo-syntax: call:write{path:"x"}
|
|
57
|
+
*/
|
|
58
|
+
function parseLeakedBody(body) {
|
|
59
|
+
if (!body)
|
|
60
|
+
return null;
|
|
61
|
+
const trimmed = body.trim();
|
|
62
|
+
// Try JSON first
|
|
63
|
+
try {
|
|
64
|
+
const json = JSON.parse(trimmed);
|
|
65
|
+
if (json && typeof json === "object") {
|
|
66
|
+
const name = json.name || json.tool || json.tool_name || json.function;
|
|
67
|
+
const args = json.arguments || json.args || json.parameters || json.input || {};
|
|
68
|
+
if (typeof name === "string" && name.length > 0) {
|
|
69
|
+
const parsedArgs = typeof args === "string" ? safeParseJson(args) : args;
|
|
70
|
+
return { toolName: name, toolInput: parsedArgs ?? {} };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch { }
|
|
75
|
+
// Try function-call style: name(arg1=val1, arg2="val2")
|
|
76
|
+
const fnMatch = trimmed.match(/^([a-zA-Z_][\w]*)\s*\(([\s\S]*)\)\s*$/);
|
|
77
|
+
if (fnMatch) {
|
|
78
|
+
const toolName = fnMatch[1];
|
|
79
|
+
const argsStr = fnMatch[2];
|
|
80
|
+
// Try JSON-shaped arg first: write({"path": "x"})
|
|
81
|
+
const innerJson = safeParseJson(argsStr);
|
|
82
|
+
if (innerJson && typeof innerJson === "object" && !Array.isArray(innerJson)) {
|
|
83
|
+
return { toolName, toolInput: innerJson };
|
|
84
|
+
}
|
|
85
|
+
const toolInput = parseKwargs(argsStr);
|
|
86
|
+
if (toolInput)
|
|
87
|
+
return { toolName, toolInput };
|
|
88
|
+
}
|
|
89
|
+
// Try pseudo-syntax: call:name{key:"val", ...} or name:foo{...}
|
|
90
|
+
const callMatch = trimmed.match(/(?:call:|name:|tool:|function:)([a-zA-Z_][\w]*)\s*\{([\s\S]*)\}\s*/i);
|
|
91
|
+
if (callMatch) {
|
|
92
|
+
const toolName = callMatch[1];
|
|
93
|
+
const innerJson = "{" + callMatch[2] + "}";
|
|
94
|
+
const toolInput = safeParseJson(innerJson) || parseLooseObject(callMatch[2]);
|
|
95
|
+
if (toolInput)
|
|
96
|
+
return { toolName, toolInput };
|
|
97
|
+
}
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
exports.parseLeakedBody = parseLeakedBody;
|
|
101
|
+
function safeParseJson(s) {
|
|
102
|
+
try {
|
|
103
|
+
return JSON.parse(s);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
exports.safeParseJson = safeParseJson;
|
|
110
|
+
/**
|
|
111
|
+
* Parse Python-style kwargs from a function-call body:
|
|
112
|
+
* path="x", content="y", count=42
|
|
113
|
+
* Strips `<|"|>` style escape markers some templates inject.
|
|
114
|
+
*/
|
|
115
|
+
function parseKwargs(s) {
|
|
116
|
+
if (!s.trim())
|
|
117
|
+
return {};
|
|
118
|
+
const cleaned = s.replace(/<\|"\|>/g, '"').replace(/<\|'\|>/g, "'");
|
|
119
|
+
const result = {};
|
|
120
|
+
const re = /([a-zA-Z_][\w]*)\s*=\s*("([^"\\]|\\.)*"|'([^'\\]|\\.)*'|-?\d+(?:\.\d+)?|true|false|null)/g;
|
|
121
|
+
let m;
|
|
122
|
+
let matched = false;
|
|
123
|
+
while ((m = re.exec(cleaned)) !== null) {
|
|
124
|
+
matched = true;
|
|
125
|
+
const key = m[1];
|
|
126
|
+
const raw = m[2];
|
|
127
|
+
let value = raw;
|
|
128
|
+
if (raw === "true")
|
|
129
|
+
value = true;
|
|
130
|
+
else if (raw === "false")
|
|
131
|
+
value = false;
|
|
132
|
+
else if (raw === "null")
|
|
133
|
+
value = null;
|
|
134
|
+
else if (/^-?\d/.test(raw))
|
|
135
|
+
value = parseFloat(raw);
|
|
136
|
+
else
|
|
137
|
+
value = raw.slice(1, -1).replace(/\\(.)/g, "$1");
|
|
138
|
+
result[key] = value;
|
|
139
|
+
}
|
|
140
|
+
return matched ? result : null;
|
|
141
|
+
}
|
|
142
|
+
exports.parseKwargs = parseKwargs;
|
|
143
|
+
/**
|
|
144
|
+
* Parse a loose key:value object body (no surrounding braces, no enforced
|
|
145
|
+
* JSON quoting). Used for pseudo-syntax fallbacks like:
|
|
146
|
+
* file_path:<|"|>medieval_market.bone<|"|>
|
|
147
|
+
*/
|
|
148
|
+
function parseLooseObject(s) {
|
|
149
|
+
const cleaned = s.replace(/<\|"\|>/g, '"').replace(/<\|'\|>/g, "'");
|
|
150
|
+
const result = {};
|
|
151
|
+
const re = /([a-zA-Z_][\w]*)\s*[:=]\s*("([^"\\]|\\.)*"|'([^'\\]|\\.)*'|-?\d+(?:\.\d+)?|true|false|null|[^\s,}]+)/g;
|
|
152
|
+
let m;
|
|
153
|
+
let matched = false;
|
|
154
|
+
while ((m = re.exec(cleaned)) !== null) {
|
|
155
|
+
matched = true;
|
|
156
|
+
const key = m[1];
|
|
157
|
+
const raw = m[2];
|
|
158
|
+
let value = raw;
|
|
159
|
+
if (raw === "true")
|
|
160
|
+
value = true;
|
|
161
|
+
else if (raw === "false")
|
|
162
|
+
value = false;
|
|
163
|
+
else if (raw === "null")
|
|
164
|
+
value = null;
|
|
165
|
+
else if (/^-?\d/.test(raw))
|
|
166
|
+
value = parseFloat(raw);
|
|
167
|
+
else if (raw.startsWith('"') || raw.startsWith("'"))
|
|
168
|
+
value = raw.slice(1, -1).replace(/\\(.)/g, "$1");
|
|
169
|
+
result[key] = value;
|
|
170
|
+
}
|
|
171
|
+
return matched ? result : null;
|
|
172
|
+
}
|
|
173
|
+
exports.parseLooseObject = parseLooseObject;
|
|
174
|
+
//# sourceMappingURL=leaked_tool_call.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaked_tool_call.js","sourceRoot":"","sources":["../../../../src/engine/session/leaked_tool_call.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;;AASH,SAAgB,qBAAqB,CAAC,IAAY;IAChD,0EAA0E;IAC1E,MAAM,aAAa,GAAG;QACpB,iDAAiD;QACjD,sCAAsC;QACtC,8CAA8C;QAC9C,kDAAkD;KACnD,CAAC;IACF,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS;YAAE,SAAS;QAC1C,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;IAChG,IAAI,SAAS,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACrG,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AA5BD,sDA4BC;AAED;;;;;GAKG;AACH,SAAgB,eAAe,CAAC,IAAY;IAC1C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAE5B,iBAAiB;IACjB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC;YACvE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YAChF,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChD,MAAM,UAAU,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACzE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,IAAI,EAAE,EAAE,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,wDAAwD;IACxD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IACvE,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3B,kDAAkD;QAClD,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;QAC5C,CAAC;QACD,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,SAAS;YAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAChD,CAAC;IAED,gEAAgE;IAChE,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACvG,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAC3C,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,IAAI,SAAS;YAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAChD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAzCD,0CAyCC;AAED,SAAgB,aAAa,CAAC,CAAS;IACrC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAND,sCAMC;AAED;;;;GAIG;AACH,SAAgB,WAAW,CAAC,CAAS;IACnC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IACzB,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACpE,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,MAAM,EAAE,GAAG,2FAA2F,CAAC;IACvG,IAAI,CAAyB,CAAC;IAC9B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACvC,OAAO,GAAG,IAAI,CAAC;QACf,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACjB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,KAAK,GAAQ,GAAG,CAAC;QACrB,IAAI,GAAG,KAAK,MAAM;YAAE,KAAK,GAAG,IAAI,CAAC;aAC5B,IAAI,GAAG,KAAK,OAAO;YAAE,KAAK,GAAG,KAAK,CAAC;aACnC,IAAI,GAAG,KAAK,MAAM;YAAE,KAAK,GAAG,IAAI,CAAC;aACjC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;;YAC/C,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,OAAO,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC;AApBD,kCAoBC;AAED;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,CAAS;IACxC,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACpE,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,MAAM,EAAE,GAAG,uGAAuG,CAAC;IACnH,IAAI,CAAyB,CAAC;IAC9B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACvC,OAAO,GAAG,IAAI,CAAC;QACf,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACjB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,KAAK,GAAQ,GAAG,CAAC;QACrB,IAAI,GAAG,KAAK,MAAM;YAAE,KAAK,GAAG,IAAI,CAAC;aAC5B,IAAI,GAAG,KAAK,OAAO;YAAE,KAAK,GAAG,KAAK,CAAC;aACnC,IAAI,GAAG,KAAK,MAAM;YAAE,KAAK,GAAG,IAAI,CAAC;aACjC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;aAC/C,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACtG,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,OAAO,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC;AAnBD,4CAmBC"}
|
|
@@ -31,6 +31,17 @@ Use plain Python/TypeScript/etc. only for:
|
|
|
31
31
|
|
|
32
32
|
If the request is ambiguous (e.g. "a 2D market simulation"), ask the user: "Is this a self-contained simulation script (plain code) or a backend service with persistence (BoneScript)?"
|
|
33
33
|
|
|
34
|
+
## Build mode
|
|
35
|
+
|
|
36
|
+
When the user starts a session with a project-scoped prompt ("build me X", "create a full Y"), BoneCode runs you in **build mode**. Build mode is a state machine: clarify → plan → execute → verify → done. You will receive structured prompts at each stage. Specifically:
|
|
37
|
+
|
|
38
|
+
- **Clarify stage**: you'll be asked to either propose a design document (JSON) or ask 1-3 questions. Be concrete. Don't ramble.
|
|
39
|
+
- **Plan stage**: you'll be asked for a JSON todo list. Each todo must be a single concrete file action.
|
|
40
|
+
- **Execute stage**: you'll receive one todo at a time. **YOU MUST CALL TOOLS** — `write`, `edit`, `bash`. Prose-only responses are detected and rejected. The system will inject a reminder if you describe edits without calling tools.
|
|
41
|
+
- **Verify stage**: for each requirement, you'll be asked yes/no whether it's satisfied. Be honest. If a requirement is not yet met, say so — the orchestrator will create fix-up tasks.
|
|
42
|
+
|
|
43
|
+
The user can resume a build session at any time. Build state is persisted.
|
|
44
|
+
|
|
34
45
|
## BoneScript syntax — authoritative reference
|
|
35
46
|
|
|
36
47
|
### `system` block
|
|
@@ -66,6 +66,7 @@ const compaction_logic_1 = require("./compaction_logic");
|
|
|
66
66
|
const system_prompt_1 = require("./system_prompt");
|
|
67
67
|
const instruction_loader_1 = require("./instruction_loader");
|
|
68
68
|
const tool_registry_1 = require("./tool_registry");
|
|
69
|
+
const leaked_tool_call_1 = require("./leaked_tool_call");
|
|
69
70
|
const DOOM_LOOP_THRESHOLD = 3;
|
|
70
71
|
const MAX_TURNS = 20; // safety cap — most tasks complete in 1-3 turns
|
|
71
72
|
// ─── Main Agent Loop ──────────────────────────────────────────────────────────
|
|
@@ -85,6 +86,7 @@ async function runAgentLoop(input) {
|
|
|
85
86
|
await events_1.eventBus.publish("SessionStateChanged", { session_id, from_state: session.state, to_state: "busy", changed_at: new Date().toISOString() }, "AgentLoop");
|
|
86
87
|
const stats = { tokens_in: 0, tokens_out: 0, cost: 0, compacted: false };
|
|
87
88
|
let turn = 0;
|
|
89
|
+
let lazyReminderSent = false;
|
|
88
90
|
let lastFinishReason = "unknown";
|
|
89
91
|
try {
|
|
90
92
|
// ── Main multi-turn loop ──────────────────────────────────────────────────
|
|
@@ -146,6 +148,30 @@ async function runAgentLoop(input) {
|
|
|
146
148
|
// 3. "content-filter" = blocked — stop
|
|
147
149
|
// 4. "tool-calls" with no actual tool calls = model confused — stop
|
|
148
150
|
const terminalReasons = new Set(["stop", "length", "content-filter", "end-turn"]);
|
|
151
|
+
// Detect "lazy assistant" — the model claims it's editing/creating files
|
|
152
|
+
// in prose but never actually called a tool. Common with non-tool-tuned
|
|
153
|
+
// local models. Once per session, push a synthetic reminder and re-run.
|
|
154
|
+
const lazyAssistant = !result.has_tool_calls &&
|
|
155
|
+
Object.keys(tools).length > 0 &&
|
|
156
|
+
!lazyReminderSent &&
|
|
157
|
+
await wasLazyResponse(session_id, assistantMsgId);
|
|
158
|
+
if (lazyAssistant) {
|
|
159
|
+
lazyReminderSent = true;
|
|
160
|
+
(0, websocket_1.broadcastToChannel)("session_events", {
|
|
161
|
+
type: "session.warning",
|
|
162
|
+
session_id,
|
|
163
|
+
message: "Model claimed it would edit files but didn't call any tools. Reminding it to actually use the tools.",
|
|
164
|
+
});
|
|
165
|
+
// Insert a synthetic user reminder so the next turn sees it
|
|
166
|
+
const reminderMsgId = (0, uuid_1.v4)();
|
|
167
|
+
await db_1.pool.query(`INSERT INTO messages (id, session_id, role) VALUES ($1, $2, 'user')`, [reminderMsgId, session_id]);
|
|
168
|
+
const reminderPartId = (0, uuid_1.v4)();
|
|
169
|
+
await db_1.pool.query(`INSERT INTO parts (id, message_id, session_id, part_type, data, order_index) VALUES ($1, $2, $3, 'text', $4, 0)`, [reminderPartId, reminderMsgId, session_id, JSON.stringify({
|
|
170
|
+
text: "<system-reminder>You described file changes but did not actually invoke any tools. The user cannot see prose descriptions of edits — only real tool calls produce file changes. Call the `write` or `edit` tool now to perform the actions you described. Do not respond with prose; emit a tool call.</system-reminder>",
|
|
171
|
+
synthetic: true,
|
|
172
|
+
})]);
|
|
173
|
+
continue; // re-run the loop with the reminder appended
|
|
174
|
+
}
|
|
149
175
|
if (terminalReasons.has(result.finish_reason) && !result.has_tool_calls) {
|
|
150
176
|
break;
|
|
151
177
|
}
|
|
@@ -185,9 +211,19 @@ async function streamWithRetry(ctx) {
|
|
|
185
211
|
return await streamOnce(currentCtx);
|
|
186
212
|
}
|
|
187
213
|
catch (e) {
|
|
188
|
-
// On Bad Request with tools, retry without tools
|
|
214
|
+
// On Bad Request with tools, retry without tools BUT log it visibly so
|
|
215
|
+
// the user knows their model can't do tool calls — otherwise they get
|
|
216
|
+
// pure-prose responses with no real edits.
|
|
189
217
|
if (e.message?.includes("Bad Request") && Object.keys(currentCtx.tools).length > 0 && attempt === 0) {
|
|
190
|
-
|
|
218
|
+
logger_1.logger.error("model_tools_unsupported", {
|
|
219
|
+
event: "tools_stripped",
|
|
220
|
+
metadata: { model: ctx.model_id, provider: ctx.provider_id, error: e.message },
|
|
221
|
+
});
|
|
222
|
+
(0, websocket_1.broadcastToChannel)("session_events", {
|
|
223
|
+
type: "session.warning",
|
|
224
|
+
session_id: ctx.session_id,
|
|
225
|
+
message: `Model ${ctx.model_id} rejected tool definitions — running without tools (no file edits possible). Set MODEL_SUPPORTS_TOOLS=false to suppress this warning, or use a tool-capable model.`,
|
|
226
|
+
});
|
|
191
227
|
currentCtx = { ...currentCtx, tools: {} };
|
|
192
228
|
attempt++;
|
|
193
229
|
continue;
|
|
@@ -248,6 +284,29 @@ async function streamOnce(ctx) {
|
|
|
248
284
|
await db_1.pool.query(`INSERT INTO parts (id, message_id, session_id, part_type, data, order_index) VALUES ($1, $2, $3, 'text', $4, 0)`, [currentTextPartId, assistantMsgId, session_id, JSON.stringify({ text: "" })]);
|
|
249
285
|
}
|
|
250
286
|
currentTextContent += text;
|
|
287
|
+
// Detect models leaking their internal tool-call markers as raw text
|
|
288
|
+
// (gemma, qwen, llama variants do this when the tokenizer template
|
|
289
|
+
// doesn't match the AI SDK's expected format). When we find a complete
|
|
290
|
+
// leaked call, synthesize a real tool execution.
|
|
291
|
+
const leak = (0, leaked_tool_call_1.extractLeakedToolCall)(currentTextContent);
|
|
292
|
+
if (leak) {
|
|
293
|
+
// Strip the leaked markers from the displayed text part
|
|
294
|
+
currentTextContent = currentTextContent.slice(0, leak.startIndex) +
|
|
295
|
+
currentTextContent.slice(leak.endIndex);
|
|
296
|
+
await db_1.pool.query(`UPDATE parts SET data = $2, updated_at = NOW() WHERE id = $1`, [currentTextPartId, JSON.stringify({ text: currentTextContent })]);
|
|
297
|
+
// Execute the synthesized tool call directly via the registry
|
|
298
|
+
await executeSynthesizedToolCall({
|
|
299
|
+
session_id,
|
|
300
|
+
agentId: ctx.agentId,
|
|
301
|
+
assistantMsgId,
|
|
302
|
+
toolName: leak.toolName,
|
|
303
|
+
toolInput: leak.toolInput,
|
|
304
|
+
tools,
|
|
305
|
+
});
|
|
306
|
+
// Mark the turn as having tool calls so the loop continues
|
|
307
|
+
hasToolCalls = true;
|
|
308
|
+
break;
|
|
309
|
+
}
|
|
251
310
|
// Broadcast delta to WebSocket part_stream for live streaming
|
|
252
311
|
(0, websocket_1.broadcastToChannel)("part_stream", {
|
|
253
312
|
type: "part.delta",
|
|
@@ -406,6 +465,26 @@ async function runCompaction(session_id, agentId, model_id, provider_id, message
|
|
|
406
465
|
}
|
|
407
466
|
}
|
|
408
467
|
// ─── Message History Builder ──────────────────────────────────────────────────
|
|
468
|
+
// Detect a "lazy" response — assistant text says it will edit/create files
|
|
469
|
+
// but no tool was actually invoked. Common with non-tool-tuned local models.
|
|
470
|
+
async function wasLazyResponse(session_id, messageId) {
|
|
471
|
+
const r = await db_1.pool.query(`SELECT data FROM parts WHERE message_id = $1 AND part_type = 'text' ORDER BY order_index ASC`, [messageId]);
|
|
472
|
+
const text = r.rows.map((row) => row.data?.text || "").join(" ").toLowerCase();
|
|
473
|
+
if (!text || text.length < 30)
|
|
474
|
+
return false;
|
|
475
|
+
// Phrases that imply the model is committing to a file edit it didn't make
|
|
476
|
+
const editIntentPatterns = [
|
|
477
|
+
/\bi['']ll\s+(create|write|update|edit|modify|add|implement|generate)\b/,
|
|
478
|
+
/\bi['']m\s+(creating|writing|updating|editing|modifying|adding|implementing|generating)\b/,
|
|
479
|
+
/\b(creating|writing|updating|editing|generating)\s+(?:the\s+)?(?:file|files|spec)\b/,
|
|
480
|
+
/\bi\s+(?:will|am\s+going\s+to)\s+(create|write|update|edit|implement|generate)\b/,
|
|
481
|
+
/\blet\s+me\s+(create|write|update|edit|implement)\b/,
|
|
482
|
+
/\bhere['']s\s+(?:the\s+)?(?:updated|new)\s+(?:file|version|content)\b/,
|
|
483
|
+
/\.(bone|ts|tsx|js|jsx|py|md|json|yaml|yml|sql|sh|html|css)\b.*\b(updated|created|written|modified|added)\b/,
|
|
484
|
+
/\b(updated|created|written|modified|added)\b.*\.(bone|ts|tsx|js|jsx|py|md|json|yaml|yml|sql|sh|html|css)\b/,
|
|
485
|
+
];
|
|
486
|
+
return editIntentPatterns.some(re => re.test(text));
|
|
487
|
+
}
|
|
409
488
|
async function loadMessageHistory(session_id) {
|
|
410
489
|
const result = await db_1.pool.query(`SELECT m.id, m.role, m.model_id, m.provider_id, m.tokens_input, m.tokens_output,
|
|
411
490
|
json_agg(p.* ORDER BY p.order_index, p.created_at) FILTER (WHERE p.id IS NOT NULL) AS parts
|
|
@@ -623,4 +702,96 @@ function supportsTools(model_id) {
|
|
|
623
702
|
// Default: try with tools, fall back gracefully on error
|
|
624
703
|
return true;
|
|
625
704
|
}
|
|
705
|
+
// ─── Synthesized tool-call execution ──────────────────────────────────────────
|
|
706
|
+
/**
|
|
707
|
+
* Execute a synthesized tool call when we detect a leak. Mirrors the work the
|
|
708
|
+
* AI SDK would normally do: insert a tool_invocation part, broadcast events,
|
|
709
|
+
* run the registered tool's execute() function.
|
|
710
|
+
*/
|
|
711
|
+
async function executeSynthesizedToolCall(input) {
|
|
712
|
+
const { session_id, agentId, assistantMsgId, toolName, toolInput, tools } = input;
|
|
713
|
+
// Map common aliases (write_file → write, edit_file → edit, etc.)
|
|
714
|
+
const aliases = {
|
|
715
|
+
write_file: "write",
|
|
716
|
+
edit_file: "edit",
|
|
717
|
+
read_file: "read",
|
|
718
|
+
run_command: "bash",
|
|
719
|
+
shell: "bash",
|
|
720
|
+
search_files: "grep",
|
|
721
|
+
};
|
|
722
|
+
const resolvedName = aliases[toolName] || toolName;
|
|
723
|
+
const tool = tools[resolvedName];
|
|
724
|
+
if (!tool || !tool.execute) {
|
|
725
|
+
logger_1.logger.warn("synthesized_tool_unknown", { event: "leak", metadata: { toolName, resolvedName } });
|
|
726
|
+
return;
|
|
727
|
+
}
|
|
728
|
+
const callId = (0, uuid_1.v4)();
|
|
729
|
+
// Persist the tool call record
|
|
730
|
+
try {
|
|
731
|
+
await db_1.pool.query(`INSERT INTO tool_calls (id, session_id, agent_id, tool_name, tool_input, state) VALUES ($1, $2, $3, $4, $5, 'running')`, [callId, session_id, agentId, resolvedName, JSON.stringify(toolInput)]);
|
|
732
|
+
}
|
|
733
|
+
catch { }
|
|
734
|
+
// Broadcast tool.requested so the TUI shows "← Edit foo.bone"
|
|
735
|
+
(0, websocket_1.broadcastToChannel)("part_stream", {
|
|
736
|
+
type: "tool.requested",
|
|
737
|
+
session_id,
|
|
738
|
+
tool_call_id: callId,
|
|
739
|
+
tool_name: resolvedName,
|
|
740
|
+
tool_input: toolInput,
|
|
741
|
+
});
|
|
742
|
+
// Persist as a tool_invocation part on the assistant message
|
|
743
|
+
const partId = (0, uuid_1.v4)();
|
|
744
|
+
await db_1.pool.query(`INSERT INTO parts (id, message_id, session_id, part_type, data, order_index) VALUES ($1, $2, $3, 'tool_invocation', $4, 0)`, [partId, assistantMsgId, session_id, JSON.stringify({ tool_call_id: callId, tool_name: resolvedName, args: toolInput, state: "running" })]);
|
|
745
|
+
// Run the actual tool — emit ToolCallRequested so the same machinery as a
|
|
746
|
+
// real tool call kicks in.
|
|
747
|
+
await events_1.eventBus.publish("ToolCallRequested", {
|
|
748
|
+
tool_call_id: callId,
|
|
749
|
+
session_id,
|
|
750
|
+
agent_id: agentId,
|
|
751
|
+
tool_name: resolvedName,
|
|
752
|
+
tool_input: toolInput,
|
|
753
|
+
requested_at: new Date().toISOString(),
|
|
754
|
+
}, "AgentLoop").catch(() => { });
|
|
755
|
+
const startMs = Date.now();
|
|
756
|
+
let success = true;
|
|
757
|
+
let output = "";
|
|
758
|
+
try {
|
|
759
|
+
const result = await tool.execute(toolInput, { toolCallId: callId });
|
|
760
|
+
output = typeof result === "string" ? result : (result?.output || "");
|
|
761
|
+
}
|
|
762
|
+
catch (e) {
|
|
763
|
+
success = false;
|
|
764
|
+
output = e?.message || "tool execution failed";
|
|
765
|
+
}
|
|
766
|
+
// Update the part with the result
|
|
767
|
+
const durationMs = Date.now() - startMs;
|
|
768
|
+
try {
|
|
769
|
+
await db_1.pool.query(`UPDATE parts SET data = $2, updated_at = NOW() WHERE id = $1`, [partId, JSON.stringify({
|
|
770
|
+
tool_call_id: callId,
|
|
771
|
+
tool_name: resolvedName,
|
|
772
|
+
args: toolInput,
|
|
773
|
+
state: success ? "done" : "failed",
|
|
774
|
+
output,
|
|
775
|
+
})]);
|
|
776
|
+
await db_1.pool.query(`UPDATE tool_calls SET state = $2, tool_output = $3, duration_ms = $4, updated_at = NOW() WHERE id = $1`, [callId, success ? "done" : "failed", JSON.stringify({ output }), durationMs]);
|
|
777
|
+
}
|
|
778
|
+
catch { }
|
|
779
|
+
// Broadcast completion
|
|
780
|
+
(0, websocket_1.broadcastToChannel)("part_stream", {
|
|
781
|
+
type: success ? "tool.completed" : "tool.failed",
|
|
782
|
+
session_id,
|
|
783
|
+
tool_call_id: callId,
|
|
784
|
+
tool_name: resolvedName,
|
|
785
|
+
tool_input: toolInput,
|
|
786
|
+
duration_ms: durationMs,
|
|
787
|
+
...(success ? {} : { error: output }),
|
|
788
|
+
});
|
|
789
|
+
await events_1.eventBus.publish("ToolCallCompleted", {
|
|
790
|
+
tool_call_id: callId,
|
|
791
|
+
session_id,
|
|
792
|
+
tool_name: resolvedName,
|
|
793
|
+
duration_ms: durationMs,
|
|
794
|
+
completed_at: new Date().toISOString(),
|
|
795
|
+
}, "AgentLoop").catch(() => { });
|
|
796
|
+
}
|
|
626
797
|
//# sourceMappingURL=prompt.js.map
|