veryfront 0.1.684 → 0.1.685
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/esm/deno.js +1 -1
- package/esm/src/agent/runtime/current-run-tool-state.d.ts +18 -0
- package/esm/src/agent/runtime/current-run-tool-state.d.ts.map +1 -1
- package/esm/src/agent/runtime/current-run-tool-state.js +258 -1
- package/esm/src/agent/runtime/index.d.ts.map +1 -1
- package/esm/src/agent/runtime/index.js +26 -1
- package/esm/src/html/styles-builder/plugin-loader.d.ts +6 -0
- package/esm/src/html/styles-builder/plugin-loader.d.ts.map +1 -1
- package/esm/src/html/styles-builder/plugin-loader.js +12 -0
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +1 -1
package/esm/deno.js
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
type ToolStatus = "success" | "empty" | "error";
|
|
2
|
+
export type CurrentRunToolEvidence = {
|
|
3
|
+
recordId: string;
|
|
4
|
+
fields: Record<string, string>;
|
|
5
|
+
};
|
|
2
6
|
export type CurrentRunToolStateCall = {
|
|
3
7
|
toolCallIds: string[];
|
|
4
8
|
input: unknown;
|
|
5
9
|
status: ToolStatus;
|
|
6
10
|
summary: unknown;
|
|
11
|
+
evidence?: CurrentRunToolEvidence[];
|
|
7
12
|
updatedAt: string;
|
|
8
13
|
};
|
|
9
14
|
export type CurrentRunToolState = Record<string, {
|
|
@@ -20,6 +25,13 @@ export type CurrentRunToolStateHydrationMessage = {
|
|
|
20
25
|
role?: string;
|
|
21
26
|
parts?: readonly unknown[];
|
|
22
27
|
};
|
|
28
|
+
export declare function extractCurrentRunEvidence(result: unknown): CurrentRunToolEvidence[];
|
|
29
|
+
export declare function validateInvokeAgentInputAgainstCurrentRunEvidence(state: CurrentRunToolState, input: unknown): {
|
|
30
|
+
ok: true;
|
|
31
|
+
} | {
|
|
32
|
+
ok: false;
|
|
33
|
+
error: string;
|
|
34
|
+
};
|
|
23
35
|
export declare function createToolInputFingerprint(input: unknown): string;
|
|
24
36
|
export declare function summarizeToolResultForCurrentRunState(toolName: string, result: unknown): {
|
|
25
37
|
summary: unknown;
|
|
@@ -46,6 +58,12 @@ type PromptSemanticToolCall = {
|
|
|
46
58
|
};
|
|
47
59
|
type PromptRunState = {
|
|
48
60
|
tools: PromptToolState;
|
|
61
|
+
skills?: Record<string, {
|
|
62
|
+
status: ToolStatus;
|
|
63
|
+
callCount: number;
|
|
64
|
+
source: string;
|
|
65
|
+
summary: unknown;
|
|
66
|
+
}>;
|
|
49
67
|
actions?: Record<string, {
|
|
50
68
|
status: ToolStatus;
|
|
51
69
|
source: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"current-run-tool-state.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/current-run-tool-state.ts"],"names":[],"mappings":"AAIA,KAAK,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAEhD,MAAM,MAAM,uBAAuB,GAAG;IACpC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,MAAM,CACtC,MAAM,EACN;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAA;CAAE,CACnD,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;CAC5B,CAAC;
|
|
1
|
+
{"version":3,"file":"current-run-tool-state.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/current-run-tool-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,12 +2,254 @@ import { historicalToolSummaries } from "../../integrations/_tool_summaries.js";
|
|
|
2
2
|
const MAX_FALLBACK_ITEMS = 5;
|
|
3
3
|
const MAX_FALLBACK_STRING_LENGTH = 300;
|
|
4
4
|
const MAX_OBJECT_ARRAY_ITEMS = 5;
|
|
5
|
+
const MAX_EVIDENCE_TEXT_LENGTH = 20_000;
|
|
6
|
+
const MAX_EVIDENCE_STRINGS = 12;
|
|
7
|
+
const MAX_EVIDENCE_RECORDS = 25;
|
|
8
|
+
const MAX_EVIDENCE_FIELDS_PER_RECORD = 12;
|
|
9
|
+
const RECORD_ID_PATTERN = /\b[A-Z][A-Z0-9]+-\d{4}-\d{3,}\b/g;
|
|
10
|
+
const NEXT_RECORD_ID_PATTERN = /\b[A-Z][A-Z0-9]+-\d{4}-\d{3,}\b/;
|
|
11
|
+
const GUARDED_FACT_ALIASES = {
|
|
12
|
+
supplier: ["supplier", "vendor"],
|
|
13
|
+
vendor: ["vendor", "supplier"],
|
|
14
|
+
customer: ["customer", "client"],
|
|
15
|
+
client: ["client", "customer"],
|
|
16
|
+
owner: ["owner", "assignee", "assigned_to"],
|
|
17
|
+
assignee: ["assignee", "owner", "assigned_to"],
|
|
18
|
+
company: ["company", "organization", "account"],
|
|
19
|
+
account: ["account", "company", "organization"],
|
|
20
|
+
};
|
|
21
|
+
const NON_EVIDENCE_TOOL_NAMES = new Set([
|
|
22
|
+
"load_skill",
|
|
23
|
+
"load_skill_reference",
|
|
24
|
+
"execute_skill_script",
|
|
25
|
+
]);
|
|
5
26
|
function isRecord(value) {
|
|
6
27
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
7
28
|
}
|
|
8
29
|
function truncate(value, maxLength) {
|
|
9
30
|
return value.length > maxLength ? `${value.slice(0, maxLength)}…` : value;
|
|
10
31
|
}
|
|
32
|
+
function normalizeWhitespace(value) {
|
|
33
|
+
return value.replace(/\s+/g, " ").trim();
|
|
34
|
+
}
|
|
35
|
+
function stripMarkdownCell(value) {
|
|
36
|
+
return normalizeWhitespace(value.replace(/^[-–—>→\s]+/, "").replace(/\*\*/g, ""));
|
|
37
|
+
}
|
|
38
|
+
function normalizeEvidenceField(value) {
|
|
39
|
+
return normalizeWhitespace(value)
|
|
40
|
+
.toLowerCase()
|
|
41
|
+
.replace(/[^a-z0-9]+/g, "_")
|
|
42
|
+
.replace(/^_+|_+$/g, "");
|
|
43
|
+
}
|
|
44
|
+
function normalizeEvidenceValue(value) {
|
|
45
|
+
return stripMarkdownCell(value)
|
|
46
|
+
.replace(/^["'`]+|["'`]+$/g, "")
|
|
47
|
+
.replace(/[.!?;,]+$/g, "")
|
|
48
|
+
.trim();
|
|
49
|
+
}
|
|
50
|
+
function getRecordIds(value) {
|
|
51
|
+
return Array.from(new Set(value.match(RECORD_ID_PATTERN) ?? []));
|
|
52
|
+
}
|
|
53
|
+
function mergeEvidenceField(evidenceByRecordId, recordId, field, value) {
|
|
54
|
+
const normalizedField = normalizeEvidenceField(field);
|
|
55
|
+
const normalizedValue = normalizeEvidenceValue(value);
|
|
56
|
+
if (!normalizedField || !normalizedValue || normalizedValue === recordId)
|
|
57
|
+
return;
|
|
58
|
+
if (getRecordIds(normalizedValue).includes(recordId))
|
|
59
|
+
return;
|
|
60
|
+
const fields = evidenceByRecordId.get(recordId) ?? {};
|
|
61
|
+
if (Object.keys(fields).length >= MAX_EVIDENCE_FIELDS_PER_RECORD && !(normalizedField in fields)) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
fields[normalizedField] = truncate(normalizedValue, 160);
|
|
65
|
+
evidenceByRecordId.set(recordId, fields);
|
|
66
|
+
}
|
|
67
|
+
function parseMarkdownTableRow(line) {
|
|
68
|
+
const trimmed = line.trim();
|
|
69
|
+
const withoutOuterPipes = trimmed.replace(/^\|/, "").replace(/\|$/, "");
|
|
70
|
+
return withoutOuterPipes.split("|").map(stripMarkdownCell);
|
|
71
|
+
}
|
|
72
|
+
function isMarkdownTableSeparator(line) {
|
|
73
|
+
const trimmed = line.trim();
|
|
74
|
+
const withoutOuterPipes = trimmed.replace(/^\|/, "").replace(/\|$/, "");
|
|
75
|
+
const cells = withoutOuterPipes.split("|").map((cell) => cell.trim());
|
|
76
|
+
return cells.length > 0 && cells.every((cell) => /^:?-{3,}:?$/.test(cell.replace(/\s+/g, "")));
|
|
77
|
+
}
|
|
78
|
+
function collectStringLeaves(value, strings = []) {
|
|
79
|
+
if (strings.length >= MAX_EVIDENCE_STRINGS)
|
|
80
|
+
return strings;
|
|
81
|
+
if (typeof value === "string") {
|
|
82
|
+
if (value.trim())
|
|
83
|
+
strings.push(value.slice(0, MAX_EVIDENCE_TEXT_LENGTH));
|
|
84
|
+
return strings;
|
|
85
|
+
}
|
|
86
|
+
if (Array.isArray(value)) {
|
|
87
|
+
for (const item of value)
|
|
88
|
+
collectStringLeaves(item, strings);
|
|
89
|
+
return strings;
|
|
90
|
+
}
|
|
91
|
+
if (isRecord(value)) {
|
|
92
|
+
for (const entry of Object.values(value))
|
|
93
|
+
collectStringLeaves(entry, strings);
|
|
94
|
+
}
|
|
95
|
+
return strings;
|
|
96
|
+
}
|
|
97
|
+
function extractEvidenceFromMarkdownTable(lines, startIndex, evidenceByRecordId) {
|
|
98
|
+
const headers = parseMarkdownTableRow(lines[startIndex] ?? "");
|
|
99
|
+
let cursor = startIndex + 2;
|
|
100
|
+
const rows = [];
|
|
101
|
+
while (cursor < lines.length && lines[cursor]?.includes("|")) {
|
|
102
|
+
const row = parseMarkdownTableRow(lines[cursor] ?? "");
|
|
103
|
+
if (row.length === headers.length)
|
|
104
|
+
rows.push(row);
|
|
105
|
+
cursor++;
|
|
106
|
+
}
|
|
107
|
+
const keyValueRows = rows.filter((row) => row.length >= 2);
|
|
108
|
+
const isKeyValueTable = headers.length === 2 &&
|
|
109
|
+
normalizeEvidenceField(headers[0] ?? "") === "field" &&
|
|
110
|
+
normalizeEvidenceField(headers[1] ?? "") === "value";
|
|
111
|
+
const primaryRecordId = keyValueRows
|
|
112
|
+
.map((row) => getRecordIds(row[1] ?? "")[0])
|
|
113
|
+
.find((recordId) => typeof recordId === "string");
|
|
114
|
+
if (isKeyValueTable && primaryRecordId) {
|
|
115
|
+
for (const row of keyValueRows) {
|
|
116
|
+
mergeEvidenceField(evidenceByRecordId, primaryRecordId, row[0] ?? "", row[1] ?? "");
|
|
117
|
+
}
|
|
118
|
+
return cursor;
|
|
119
|
+
}
|
|
120
|
+
for (const row of rows) {
|
|
121
|
+
const rowIds = row.flatMap(getRecordIds);
|
|
122
|
+
for (const recordId of rowIds) {
|
|
123
|
+
for (const [index, value] of row.entries()) {
|
|
124
|
+
const field = headers[index] ?? "";
|
|
125
|
+
if (!field || getRecordIds(value).includes(recordId))
|
|
126
|
+
continue;
|
|
127
|
+
mergeEvidenceField(evidenceByRecordId, recordId, field, value);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return cursor;
|
|
132
|
+
}
|
|
133
|
+
export function extractCurrentRunEvidence(result) {
|
|
134
|
+
const evidenceByRecordId = new Map();
|
|
135
|
+
for (const text of collectStringLeaves(result)) {
|
|
136
|
+
const lines = text.split(/\r?\n/);
|
|
137
|
+
for (let index = 0; index < lines.length; index++) {
|
|
138
|
+
const line = lines[index] ?? "";
|
|
139
|
+
if (!line.includes("|") || !lines[index + 1]?.includes("|"))
|
|
140
|
+
continue;
|
|
141
|
+
if (!isMarkdownTableSeparator(lines[index + 1] ?? ""))
|
|
142
|
+
continue;
|
|
143
|
+
index = extractEvidenceFromMarkdownTable(lines, index, evidenceByRecordId) - 1;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return Array.from(evidenceByRecordId.entries())
|
|
147
|
+
.slice(0, MAX_EVIDENCE_RECORDS)
|
|
148
|
+
.map(([recordId, fields]) => ({ recordId, fields }));
|
|
149
|
+
}
|
|
150
|
+
function getEvidenceFieldsForRecord(state, recordId) {
|
|
151
|
+
const fields = {};
|
|
152
|
+
for (const bucket of Object.values(state)) {
|
|
153
|
+
for (const call of Object.values(bucket.calls)) {
|
|
154
|
+
for (const evidence of call.evidence ?? []) {
|
|
155
|
+
if (evidence.recordId !== recordId)
|
|
156
|
+
continue;
|
|
157
|
+
Object.assign(fields, evidence.fields);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return fields;
|
|
162
|
+
}
|
|
163
|
+
function getExpectedEvidenceField(fields, field) {
|
|
164
|
+
const aliases = GUARDED_FACT_ALIASES[field] ?? [field];
|
|
165
|
+
for (const alias of aliases) {
|
|
166
|
+
if (fields[alias])
|
|
167
|
+
return { field: alias, value: fields[alias] };
|
|
168
|
+
}
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
function hasCompanyLikeShape(value) {
|
|
172
|
+
if (getRecordIds(value).length > 0)
|
|
173
|
+
return false;
|
|
174
|
+
if (/[€$£¥]\s?\d|\d{4,}/.test(value))
|
|
175
|
+
return false;
|
|
176
|
+
if (/\b(invoice|record|item|payment|approval|escalation|matching)\b/i.test(value))
|
|
177
|
+
return false;
|
|
178
|
+
return /\b(GmbH|LLC|Ltd|Limited|Inc|Corp|Corporation|Company|Co\.?|AG|SA|BV|NV|PLC)\b/.test(value) ||
|
|
179
|
+
/^[A-Z][\p{L}'&.-]+(?:\s+[A-Z][\p{L}'&.-]+)+$/u.test(value);
|
|
180
|
+
}
|
|
181
|
+
function extractAssertedFieldValues(text) {
|
|
182
|
+
const assertions = [];
|
|
183
|
+
for (const field of Object.keys(GUARDED_FACT_ALIASES)) {
|
|
184
|
+
const aliases = GUARDED_FACT_ALIASES[field] ?? [field];
|
|
185
|
+
for (const alias of aliases) {
|
|
186
|
+
const pattern = new RegExp(`\\b${alias.replace(/_/g, "[ _-]")}\\b\\s*(?:is|:|=|named|called)?\\s+(.{2,100}?)(?=\\s+(?:for|with|matched|against|on|and|to|has|was|will|ready|blocked|created|released)\\b|[.,;\\n]|$)`, "giu");
|
|
187
|
+
for (const match of text.matchAll(pattern)) {
|
|
188
|
+
const value = normalizeEvidenceValue(match[1] ?? "");
|
|
189
|
+
if (hasCompanyLikeShape(value))
|
|
190
|
+
assertions.push({ field, value });
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return assertions;
|
|
195
|
+
}
|
|
196
|
+
function valuesConflict(actual, expected) {
|
|
197
|
+
const normalize = (value) => normalizeWhitespace(value).toLowerCase();
|
|
198
|
+
const left = normalize(actual);
|
|
199
|
+
const right = normalize(expected);
|
|
200
|
+
return left !== right && !left.includes(right) && !right.includes(left);
|
|
201
|
+
}
|
|
202
|
+
function escapeRegExp(value) {
|
|
203
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
204
|
+
}
|
|
205
|
+
function getRecordTextWindows(text, recordId) {
|
|
206
|
+
const windows = [];
|
|
207
|
+
const pattern = new RegExp(escapeRegExp(recordId), "g");
|
|
208
|
+
for (const match of text.matchAll(pattern)) {
|
|
209
|
+
const index = match.index ?? 0;
|
|
210
|
+
const before = text.slice(0, index);
|
|
211
|
+
const after = text.slice(index + recordId.length);
|
|
212
|
+
const previousRecordMatches = Array.from(before.matchAll(RECORD_ID_PATTERN));
|
|
213
|
+
const previousRecordMatch = previousRecordMatches.at(-1);
|
|
214
|
+
const previousRecordEnd = previousRecordMatch && typeof previousRecordMatch.index === "number"
|
|
215
|
+
? previousRecordMatch.index + previousRecordMatch[0].length
|
|
216
|
+
: -1;
|
|
217
|
+
const windowStart = Math.max(before.lastIndexOf("."), before.lastIndexOf("\n"), before.lastIndexOf(";"));
|
|
218
|
+
const nextRecordMatch = after.match(NEXT_RECORD_ID_PATTERN);
|
|
219
|
+
const nextRecordIndex = nextRecordMatch?.index;
|
|
220
|
+
const windowEnd = typeof nextRecordIndex === "number"
|
|
221
|
+
? Math.max(0, nextRecordIndex)
|
|
222
|
+
: Math.min(after.length, 300);
|
|
223
|
+
windows.push(normalizeWhitespace(text.slice(Math.max(previousRecordEnd, windowStart >= 0 ? windowStart + 1 : Math.max(0, index - 160)), index + recordId.length + windowEnd)));
|
|
224
|
+
}
|
|
225
|
+
return windows;
|
|
226
|
+
}
|
|
227
|
+
export function validateInvokeAgentInputAgainstCurrentRunEvidence(state, input) {
|
|
228
|
+
if (!isRecord(input))
|
|
229
|
+
return { ok: true };
|
|
230
|
+
const text = normalizeWhitespace([input.prompt, input.description, input.input]
|
|
231
|
+
.filter((value) => typeof value === "string")
|
|
232
|
+
.join("\n"));
|
|
233
|
+
if (!text)
|
|
234
|
+
return { ok: true };
|
|
235
|
+
for (const recordId of getRecordIds(text)) {
|
|
236
|
+
const evidenceFields = getEvidenceFieldsForRecord(state, recordId);
|
|
237
|
+
for (const window of getRecordTextWindows(text, recordId)) {
|
|
238
|
+
for (const assertion of extractAssertedFieldValues(window)) {
|
|
239
|
+
const expected = getExpectedEvidenceField(evidenceFields, assertion.field);
|
|
240
|
+
if (!expected || !valuesConflict(assertion.value, expected.value))
|
|
241
|
+
continue;
|
|
242
|
+
return {
|
|
243
|
+
ok: false,
|
|
244
|
+
error: `invoke_agent input conflicts with current run evidence: ${recordId} ${expected.field} is ` +
|
|
245
|
+
`"${expected.value}", but the tool input says "${assertion.value}". ` +
|
|
246
|
+
"Regenerate the tool call from recorded evidence, or delegate only the record id.",
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return { ok: true };
|
|
252
|
+
}
|
|
11
253
|
function normalizeForFingerprint(value) {
|
|
12
254
|
if (Array.isArray(value))
|
|
13
255
|
return value.map(normalizeForFingerprint);
|
|
@@ -209,6 +451,9 @@ export function recordCurrentRunToolResult(state, input) {
|
|
|
209
451
|
const toolBucket = state[input.toolName] ?? { calls: {} };
|
|
210
452
|
const existingCall = toolBucket.calls[fingerprint];
|
|
211
453
|
const { summary, status } = summarizeToolResultForCurrentRunState(input.toolName, input.result);
|
|
454
|
+
const evidence = NON_EVIDENCE_TOOL_NAMES.has(input.toolName)
|
|
455
|
+
? []
|
|
456
|
+
: extractCurrentRunEvidence(input.result);
|
|
212
457
|
toolBucket.calls[fingerprint] = {
|
|
213
458
|
toolCallIds: existingCall?.toolCallIds.includes(input.toolCallId)
|
|
214
459
|
? existingCall.toolCallIds
|
|
@@ -216,6 +461,7 @@ export function recordCurrentRunToolResult(state, input) {
|
|
|
216
461
|
input: input.input ?? {},
|
|
217
462
|
status,
|
|
218
463
|
summary,
|
|
464
|
+
...(evidence.length > 0 ? { evidence } : {}),
|
|
219
465
|
updatedAt: (input.now ?? new Date()).toISOString(),
|
|
220
466
|
};
|
|
221
467
|
state[input.toolName] = toolBucket;
|
|
@@ -396,6 +642,7 @@ function createPromptCallKey(input) {
|
|
|
396
642
|
}
|
|
397
643
|
export function projectCurrentRunToolStateForPrompt(state) {
|
|
398
644
|
const tools = {};
|
|
645
|
+
const skills = {};
|
|
399
646
|
const actions = {};
|
|
400
647
|
for (const [toolName, bucket] of Object.entries(state)) {
|
|
401
648
|
const calls = {};
|
|
@@ -407,7 +654,16 @@ export function projectCurrentRunToolStateForPrompt(state) {
|
|
|
407
654
|
};
|
|
408
655
|
const semantic = getSemanticToolCall({ toolName, call });
|
|
409
656
|
if (semantic) {
|
|
410
|
-
|
|
657
|
+
const mergedSemanticCall = mergeSemanticToolCall(semanticCalls[semantic.key], call, semantic.parameters);
|
|
658
|
+
semanticCalls[semantic.key] = mergedSemanticCall;
|
|
659
|
+
if (toolName === "load_skill" && semantic.parameters.skillId) {
|
|
660
|
+
skills[semantic.parameters.skillId] = {
|
|
661
|
+
status: mergedSemanticCall.status,
|
|
662
|
+
callCount: mergedSemanticCall.callCount,
|
|
663
|
+
source: `tools.${toolName}.semanticCalls.${semantic.key}`,
|
|
664
|
+
summary: mergedSemanticCall.summary,
|
|
665
|
+
};
|
|
666
|
+
}
|
|
411
667
|
actions[`${toolName}:${semantic.key}`] = {
|
|
412
668
|
status: call.status,
|
|
413
669
|
source: `tools.${toolName}.semanticCalls.${semantic.key}`,
|
|
@@ -424,6 +680,7 @@ export function projectCurrentRunToolStateForPrompt(state) {
|
|
|
424
680
|
}
|
|
425
681
|
return {
|
|
426
682
|
tools,
|
|
683
|
+
...(Object.keys(skills).length > 0 ? { skills } : {}),
|
|
427
684
|
...(Object.keys(actions).length > 0 ? { actions } : {}),
|
|
428
685
|
};
|
|
429
686
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,aAAa,EAGlB,KAAK,OAAO,EACZ,KAAK,WAAW,EAEhB,KAAK,QAAQ,EAEb,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAIrB,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAc/D,OAAO,EACL,KAAK,eAAe,EAGpB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB,MAAM,0BAA0B,CAAC;AAYlC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,8BAA8B,EAC9B,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,aAAa,GACd,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EACL,sBAAsB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,0BAA0B,EAC1B,iCAAiC,EACjC,6BAA6B,GAC9B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC5E,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAiBxB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,7 +44,7 @@ import { accumulateUsage, getMaxSteps, normalizeInput } from "./input-utils.js";
|
|
|
44
44
|
import { filterToolsForSkill, isToolAllowedBySkill, validateAllowedToolPatterns, } from "../../skill/allowed-tools.js";
|
|
45
45
|
import { resolveConfiguredAgentModel, resolveRuntimeModel } from "./model-resolution.js";
|
|
46
46
|
import { stringifyToolError, throwIfAborted } from "./error-utils.js";
|
|
47
|
-
import { appendCurrentRunToolStateToSystemPrompt, createCurrentRunToolState, hydrateCurrentRunToolStateFromMessages, recordCurrentRunToolResult, } from "./current-run-tool-state.js";
|
|
47
|
+
import { appendCurrentRunToolStateToSystemPrompt, createCurrentRunToolState, hydrateCurrentRunToolStateFromMessages, recordCurrentRunToolResult, validateInvokeAgentInputAgainstCurrentRunEvidence, } from "./current-run-tool-state.js";
|
|
48
48
|
import { applySkillDelegationOverridesToToolInput, extractSkillDelegationOverrides, } from "./skill-delegation-overrides.js";
|
|
49
49
|
const logger = serverLogger.component("agent");
|
|
50
50
|
const LOAD_SKILL_TOOL_ID = "load_skill";
|
|
@@ -764,6 +764,24 @@ export class AgentRuntime {
|
|
|
764
764
|
const startTime = Date.now();
|
|
765
765
|
const cacheCtx = tryGetCacheKeyContext();
|
|
766
766
|
toolCall.args = applySkillDelegationOverridesToToolInput(tc.toolName, toolCall.args, activeSkillDelegationOverrides);
|
|
767
|
+
if (tc.toolName === "invoke_agent") {
|
|
768
|
+
const evidenceCheck = validateInvokeAgentInputAgainstCurrentRunEvidence(currentRunToolState, toolCall.args);
|
|
769
|
+
if (!evidenceCheck.ok) {
|
|
770
|
+
toolCall.status = "error";
|
|
771
|
+
toolCall.error = evidenceCheck.error;
|
|
772
|
+
const errorMessage = createToolErrorMessage(tc.toolCallId, tc.toolName, evidenceCheck.error);
|
|
773
|
+
currentMessages.push(errorMessage);
|
|
774
|
+
await this.memory.add(errorMessage);
|
|
775
|
+
recordCurrentRunToolResult(currentRunToolState, {
|
|
776
|
+
toolCallId: tc.toolCallId,
|
|
777
|
+
toolName: tc.toolName,
|
|
778
|
+
input: toolCall.args,
|
|
779
|
+
result: { error: evidenceCheck.error },
|
|
780
|
+
});
|
|
781
|
+
toolCalls.push(toolCall);
|
|
782
|
+
return;
|
|
783
|
+
}
|
|
784
|
+
}
|
|
767
785
|
const executionContext = {
|
|
768
786
|
toolCallId: tc.toolCallId,
|
|
769
787
|
...toolContext,
|
|
@@ -1074,6 +1092,13 @@ export class AgentRuntime {
|
|
|
1074
1092
|
toolCall.status = "executing";
|
|
1075
1093
|
const startTime = Date.now();
|
|
1076
1094
|
toolCall.args = applySkillDelegationOverridesToToolInput(tc.name, toolCall.args, activeSkillDelegationOverrides);
|
|
1095
|
+
if (tc.name === "invoke_agent") {
|
|
1096
|
+
const evidenceCheck = validateInvokeAgentInputAgainstCurrentRunEvidence(currentRunToolState, toolCall.args);
|
|
1097
|
+
if (!evidenceCheck.ok) {
|
|
1098
|
+
await this.recordToolError(toolCall, evidenceCheck.error, controller, encoder, currentMessages, toolCalls, currentRunToolState);
|
|
1099
|
+
continue;
|
|
1100
|
+
}
|
|
1101
|
+
}
|
|
1077
1102
|
callbacks?.onToolCall?.(toolCall);
|
|
1078
1103
|
const executionContext = {
|
|
1079
1104
|
toolCallId: tc.id,
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* esm.sh bundles can contain root-relative nested imports. Once the bundle is
|
|
3
|
+
* written to a temp file, Deno resolves those as local file paths unless they
|
|
4
|
+
* are normalized back to esm.sh URLs.
|
|
5
|
+
*/
|
|
6
|
+
export declare function rewriteEsmShRootRelativeImports(code: string): string;
|
|
1
7
|
/**
|
|
2
8
|
* Dynamically load a module from esm.sh in a compiled Deno binary.
|
|
3
9
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-loader.d.ts","sourceRoot":"","sources":["../../../../src/src/html/styles-builder/plugin-loader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin-loader.d.ts","sourceRoot":"","sources":["../../../../src/src/html/styles-builder/plugin-loader.ts"],"names":[],"mappings":"AA0GA;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiBpE;AAwBD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA6D/E;AAED,wBAAsB,UAAU,CAC9B,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,GAC/B,OAAO,CAAC,OAAO,CAAC,CAwClB"}
|
|
@@ -75,6 +75,17 @@ function encodeToBase64(source) {
|
|
|
75
75
|
binary += String.fromCharCode(byte);
|
|
76
76
|
return btoa(binary);
|
|
77
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* esm.sh bundles can contain root-relative nested imports. Once the bundle is
|
|
80
|
+
* written to a temp file, Deno resolves those as local file paths unless they
|
|
81
|
+
* are normalized back to esm.sh URLs.
|
|
82
|
+
*/
|
|
83
|
+
export function rewriteEsmShRootRelativeImports(code) {
|
|
84
|
+
return code
|
|
85
|
+
.replace(/\b(from\s*)(["'])(\/(?!\/)[^"']+)\2/g, (_match, prefix, quote, specifier) => `${prefix}${quote}https://esm.sh${specifier}${quote}`)
|
|
86
|
+
.replace(/\b(import\s*)(["'])(\/(?!\/)[^"']+)\2/g, (_match, prefix, quote, specifier) => `${prefix}${quote}https://esm.sh${specifier}${quote}`)
|
|
87
|
+
.replace(/\b(import\s*\(\s*)(["'])(\/(?!\/)[^"']+)\2/g, (_match, prefix, quote, specifier) => `${prefix}${quote}https://esm.sh${specifier}${quote}`);
|
|
88
|
+
}
|
|
78
89
|
async function importBundledModule(code) {
|
|
79
90
|
if (!isRealDenoRuntime()) {
|
|
80
91
|
const dataUrl = `data:text/javascript;base64,${encodeToBase64(code)}`;
|
|
@@ -123,6 +134,7 @@ export async function loadModuleFromEsmSh(packageName) {
|
|
|
123
134
|
throw NETWORK_ERROR.create({ detail: `Failed to fetch bundle: ${bundleResponse.status}` });
|
|
124
135
|
}
|
|
125
136
|
let code = await bundleResponse.text();
|
|
137
|
+
code = rewriteEsmShRootRelativeImports(code);
|
|
126
138
|
// Step 3: Verify it's actually JavaScript (not an HTML error page)
|
|
127
139
|
if (code.trimStart().startsWith("<!") || code.trimStart().startsWith("<html")) {
|
|
128
140
|
throw IMPORT_RESOLUTION_ERROR.create({
|