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 CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.684",
3
+ "version": "0.1.685",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "workspace": [
@@ -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;AAyBF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEjE;AAmMD,wBAAgB,qCAAqC,CACnD,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,GACd;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,CAY1C;AAED,wBAAgB,yBAAyB,IAAI,mBAAmB,CAE/D;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,mBAAmB,EAC1B,KAAK,EAAE,+BAA+B,GACrC,IAAI,CAgBN;AAkED,wBAAgB,sCAAsC,CACpD,KAAK,EAAE,mBAAmB,EAC1B,QAAQ,EAAE,SAAS,mCAAmC,EAAE,EACxD,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,IAAI,CAAA;CAAE,GACvB,IAAI,CA6BN;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAI1E;AAED,KAAK,eAAe,GAAG,MAAM,CAC3B,MAAM,EACN;IACE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;CACxD,CACF,CAAC;AAEF,KAAK,sBAAsB,GAAG;IAC5B,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CACd,MAAM,EACN;QACE,MAAM,EAAE,UAAU,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;KAClB,CACF,CAAC;CACH,CAAC;AA4FF,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,mBAAmB,GACzB,cAAc,CAwChB;AAED,wBAAgB,uCAAuC,CACrD,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,mBAAmB,GACzB,MAAM,CAOR"}
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
- semanticCalls[semantic.key] = mergeSemanticToolCall(semanticCalls[semantic.key], call, semantic.parameters);
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":"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"}
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":"AAgIA;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA4D/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"}
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({
@@ -1,3 +1,3 @@
1
1
  /** Shared version value. */
2
- export declare const VERSION = "0.1.684";
2
+ export declare const VERSION = "0.1.685";
3
3
  //# sourceMappingURL=version-constant.d.ts.map
@@ -1,4 +1,4 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
3
  /** Shared version value. */
4
- export const VERSION = "0.1.684";
4
+ export const VERSION = "0.1.685";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.684",
3
+ "version": "0.1.685",
4
4
  "description": "The simplest way to build AI-powered apps",
5
5
  "keywords": [
6
6
  "react",