@intentface/latch-core 0.9.1
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/LICENSE +21 -0
- package/README.md +45 -0
- package/dist/agent.d.ts +200 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +9 -0
- package/dist/agent.js.map +1 -0
- package/dist/compaction.d.ts +33 -0
- package/dist/compaction.d.ts.map +1 -0
- package/dist/compaction.js +104 -0
- package/dist/compaction.js.map +1 -0
- package/dist/connections.d.ts +16 -0
- package/dist/connections.d.ts.map +1 -0
- package/dist/connections.js +41 -0
- package/dist/connections.js.map +1 -0
- package/dist/context.d.ts +41 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +25 -0
- package/dist/context.js.map +1 -0
- package/dist/current-date.d.ts +12 -0
- package/dist/current-date.d.ts.map +1 -0
- package/dist/current-date.js +25 -0
- package/dist/current-date.js.map +1 -0
- package/dist/extensions.d.ts +333 -0
- package/dist/extensions.d.ts.map +1 -0
- package/dist/extensions.js +569 -0
- package/dist/extensions.js.map +1 -0
- package/dist/harness/index.d.ts +17 -0
- package/dist/harness/index.d.ts.map +1 -0
- package/dist/harness/index.js +15 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/tools.d.ts +88 -0
- package/dist/harness/tools.d.ts.map +1 -0
- package/dist/harness/tools.js +296 -0
- package/dist/harness/tools.js.map +1 -0
- package/dist/harness/web-fetch.d.ts +47 -0
- package/dist/harness/web-fetch.d.ts.map +1 -0
- package/dist/harness/web-fetch.js +247 -0
- package/dist/harness/web-fetch.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/limits.d.ts +152 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +97 -0
- package/dist/limits.js.map +1 -0
- package/dist/memory.d.ts +93 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +13 -0
- package/dist/memory.js.map +1 -0
- package/dist/message.d.ts +46 -0
- package/dist/message.d.ts.map +1 -0
- package/dist/message.js +2 -0
- package/dist/message.js.map +1 -0
- package/dist/models/catalog.d.ts +56 -0
- package/dist/models/catalog.d.ts.map +1 -0
- package/dist/models/catalog.js +211 -0
- package/dist/models/catalog.js.map +1 -0
- package/dist/models/defaults.d.ts +23 -0
- package/dist/models/defaults.d.ts.map +1 -0
- package/dist/models/defaults.js +19 -0
- package/dist/models/defaults.js.map +1 -0
- package/dist/models/index.d.ts +23 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +19 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/prompt-caching.d.ts +19 -0
- package/dist/models/prompt-caching.d.ts.map +1 -0
- package/dist/models/prompt-caching.js +18 -0
- package/dist/models/prompt-caching.js.map +1 -0
- package/dist/models/provider.d.ts +19 -0
- package/dist/models/provider.d.ts.map +1 -0
- package/dist/models/provider.js +22 -0
- package/dist/models/provider.js.map +1 -0
- package/dist/models/reasoning.d.ts +21 -0
- package/dist/models/reasoning.d.ts.map +1 -0
- package/dist/models/reasoning.js +59 -0
- package/dist/models/reasoning.js.map +1 -0
- package/dist/pricing.d.ts +52 -0
- package/dist/pricing.d.ts.map +1 -0
- package/dist/pricing.js +37 -0
- package/dist/pricing.js.map +1 -0
- package/dist/principal.d.ts +37 -0
- package/dist/principal.d.ts.map +1 -0
- package/dist/principal.js +30 -0
- package/dist/principal.js.map +1 -0
- package/dist/projections.d.ts +37 -0
- package/dist/projections.d.ts.map +1 -0
- package/dist/projections.js +128 -0
- package/dist/projections.js.map +1 -0
- package/dist/prompt-caching.d.ts +106 -0
- package/dist/prompt-caching.d.ts.map +1 -0
- package/dist/prompt-caching.js +165 -0
- package/dist/prompt-caching.js.map +1 -0
- package/dist/runtime.d.ts +670 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +2425 -0
- package/dist/runtime.js.map +1 -0
- package/dist/scheduler.d.ts +31 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +43 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/storage.d.ts +389 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +38 -0
- package/dist/storage.js.map +1 -0
- package/dist/telemetry.d.ts +155 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +2 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/vault-node.d.ts +20 -0
- package/dist/vault-node.d.ts.map +1 -0
- package/dist/vault-node.js +30 -0
- package/dist/vault-node.js.map +1 -0
- package/dist/vault.d.ts +62 -0
- package/dist/vault.d.ts.map +1 -0
- package/dist/vault.js +88 -0
- package/dist/vault.js.map +1 -0
- package/package.json +95 -0
|
@@ -0,0 +1,569 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------- part
|
|
2
|
+
export const EXTENSION_PART_TYPE = "data-extension";
|
|
3
|
+
/** Thrown when an extension with `onError: "fail"` fails; the turn errors. */
|
|
4
|
+
export class ExtensionFailedError extends Error {
|
|
5
|
+
extension;
|
|
6
|
+
detail;
|
|
7
|
+
code = "extension_failed";
|
|
8
|
+
/** The user message with the failed part appended — persist it so the failure is in the log. */
|
|
9
|
+
partial;
|
|
10
|
+
constructor(extension, detail) {
|
|
11
|
+
super(`Extension "${extension}" failed: ${detail}`);
|
|
12
|
+
this.extension = extension;
|
|
13
|
+
this.detail = detail;
|
|
14
|
+
this.name = "ExtensionFailedError";
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
// ------------------------------------------------------------------- defaults
|
|
18
|
+
/** Names the chat channels claim for their own `/` commands — a slash extension may not use them. */
|
|
19
|
+
export const RESERVED_SLASH_NAMES = new Set([
|
|
20
|
+
"new",
|
|
21
|
+
"reset",
|
|
22
|
+
"compact",
|
|
23
|
+
"cancel",
|
|
24
|
+
"skip",
|
|
25
|
+
"status",
|
|
26
|
+
"help",
|
|
27
|
+
"commands",
|
|
28
|
+
"start",
|
|
29
|
+
]);
|
|
30
|
+
export const EXTENSION_DEFAULTS = {
|
|
31
|
+
timeoutMs: 30_000,
|
|
32
|
+
maxRenderedChars: 50_000,
|
|
33
|
+
maxOutputBytes: 64 * 1024,
|
|
34
|
+
/** Same ceiling `web_fetch` applies — Anthropic caps images at 5 MB of source data. */
|
|
35
|
+
maxMediaBytes: 4.5 * 1024 * 1024,
|
|
36
|
+
};
|
|
37
|
+
/** Media types every provider's vision input accepts, plus PDF. */
|
|
38
|
+
export const EXTENSION_MEDIA_TYPES = new Set([
|
|
39
|
+
"image/png",
|
|
40
|
+
"image/jpeg",
|
|
41
|
+
"image/gif",
|
|
42
|
+
"image/webp",
|
|
43
|
+
"application/pdf",
|
|
44
|
+
]);
|
|
45
|
+
export function resolveExtension(ext) {
|
|
46
|
+
return {
|
|
47
|
+
target: ext.target ?? "message",
|
|
48
|
+
placement: ext.placement ?? "after",
|
|
49
|
+
scope: ext.scope ?? "turn",
|
|
50
|
+
reveal: ext.reveal ?? "command",
|
|
51
|
+
allowMutations: ext.allowMutations ?? false,
|
|
52
|
+
onError: ext.onError ?? "proceed",
|
|
53
|
+
timeoutMs: ext.limits?.timeoutMs ?? EXTENSION_DEFAULTS.timeoutMs,
|
|
54
|
+
maxRenderedChars: ext.limits?.maxRenderedChars ?? EXTENSION_DEFAULTS.maxRenderedChars,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
// -------------------------------------------------------------------- parsing
|
|
58
|
+
/**
|
|
59
|
+
* Same grammar as the channel kernel's `/command` parser (Telegram's, with an
|
|
60
|
+
* optional `@bot` suffix). Only KNOWN names parse: `/Users/me/notes.txt` or an
|
|
61
|
+
* unregistered `/foo` stays an ordinary message.
|
|
62
|
+
*/
|
|
63
|
+
const SLASH_RE = /^\/([A-Za-z0-9_]+)(?:@([A-Za-z0-9_]+))?(?:\s+([\s\S]*))?$/;
|
|
64
|
+
export function parseSlashInvocation(text, names) {
|
|
65
|
+
const m = SLASH_RE.exec(text.trim());
|
|
66
|
+
if (!m)
|
|
67
|
+
return null;
|
|
68
|
+
const word = m[1].toLowerCase();
|
|
69
|
+
let known = false;
|
|
70
|
+
for (const n of names) {
|
|
71
|
+
if (n.toLowerCase() === word) {
|
|
72
|
+
known = true;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (!known)
|
|
77
|
+
return null;
|
|
78
|
+
const args = (m[3] ?? "").trim();
|
|
79
|
+
return { name: word, args, argv: args ? args.split(/\s+/) : [] };
|
|
80
|
+
}
|
|
81
|
+
/** The message's text parts joined — what a slash parser reads. */
|
|
82
|
+
export function messageText(message) {
|
|
83
|
+
if (!message)
|
|
84
|
+
return "";
|
|
85
|
+
return message.parts
|
|
86
|
+
.filter((p) => p.type === "text" && typeof p.text === "string")
|
|
87
|
+
.map((p) => p.text)
|
|
88
|
+
.join("\n");
|
|
89
|
+
}
|
|
90
|
+
export function extensionPartsOf(message) {
|
|
91
|
+
const parts = message.parts;
|
|
92
|
+
if (!Array.isArray(parts))
|
|
93
|
+
return [];
|
|
94
|
+
return parts.filter((p) => p.type === EXTENSION_PART_TYPE);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Which extensions run on this turn. `window` is the live context window
|
|
98
|
+
* (post-compaction) INCLUDING the current user message as its last element.
|
|
99
|
+
*
|
|
100
|
+
* - `slash`: a structured `metadata.extension` wins; else the text parses
|
|
101
|
+
* against the slash names. At most one slash extension per turn.
|
|
102
|
+
* - `every-turn`: always.
|
|
103
|
+
* - `chat-start`: when no earlier message in the window carries a result for
|
|
104
|
+
* it, or the latest one is older than `refresh.afterMs`. Compaction starts a
|
|
105
|
+
* new window, so a chat-start extension re-runs after a compaction.
|
|
106
|
+
*/
|
|
107
|
+
export function selectExtensions(opts) {
|
|
108
|
+
const { extensions, message, window, now } = opts;
|
|
109
|
+
if (!message || message.role !== "user")
|
|
110
|
+
return [];
|
|
111
|
+
const out = [];
|
|
112
|
+
const earlier = window.filter((m) => m !== message && m.id !== message.id);
|
|
113
|
+
const slashes = extensions.filter((e) => e.on === "slash");
|
|
114
|
+
if (slashes.length > 0) {
|
|
115
|
+
const structured = message.metadata
|
|
116
|
+
?.extension;
|
|
117
|
+
const byName = (name) => slashes.find((e) => e.name.toLowerCase() === name.toLowerCase());
|
|
118
|
+
if (structured?.name && byName(structured.name)) {
|
|
119
|
+
out.push({ ext: byName(structured.name), input: structured.input });
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
const parsed = parseSlashInvocation(messageText(message), slashes.map((e) => e.name));
|
|
123
|
+
if (parsed) {
|
|
124
|
+
out.push({ ext: byName(parsed.name), input: { args: parsed.args, argv: parsed.argv } });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
for (const ext of extensions) {
|
|
129
|
+
if (ext.on === "every-turn") {
|
|
130
|
+
out.push({ ext });
|
|
131
|
+
}
|
|
132
|
+
else if (ext.on === "chat-start") {
|
|
133
|
+
const latest = latestPart(earlier, ext.name);
|
|
134
|
+
if (!latest)
|
|
135
|
+
out.push({ ext });
|
|
136
|
+
else if (ext.refresh?.afterMs !== undefined && now - latest.data.at > ext.refresh.afterMs) {
|
|
137
|
+
out.push({ ext });
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return out;
|
|
142
|
+
}
|
|
143
|
+
function latestPart(messages, name) {
|
|
144
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
145
|
+
const parts = extensionPartsOf(messages[i]);
|
|
146
|
+
for (let j = parts.length - 1; j >= 0; j--) {
|
|
147
|
+
if (parts[j].data.name === name)
|
|
148
|
+
return parts[j];
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* System-prompt blocks for this turn, read from the stored history: the latest
|
|
155
|
+
* successful `target: "instructions"` result per extension name. `scope:
|
|
156
|
+
* "chat"` results apply from anywhere in the window; `scope: "turn"` only when
|
|
157
|
+
* they sit on the window's last user message. Reading from history (not
|
|
158
|
+
* re-running) is what makes a resumed turn render identical instructions.
|
|
159
|
+
*/
|
|
160
|
+
export function extensionInstructionBlocks(window) {
|
|
161
|
+
let lastUser = -1;
|
|
162
|
+
for (let i = window.length - 1; i >= 0; i--) {
|
|
163
|
+
if (window[i].role === "user") {
|
|
164
|
+
lastUser = i;
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const byName = new Map();
|
|
169
|
+
window.forEach((m, i) => {
|
|
170
|
+
if (m.role !== "user")
|
|
171
|
+
return;
|
|
172
|
+
for (const p of extensionPartsOf(m)) {
|
|
173
|
+
const d = p.data;
|
|
174
|
+
if (d.target !== "instructions" || !d.rendered)
|
|
175
|
+
continue;
|
|
176
|
+
if (d.scope === "turn" && i !== lastUser)
|
|
177
|
+
continue;
|
|
178
|
+
byName.delete(d.name);
|
|
179
|
+
byName.set(d.name, d.rendered);
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
return [...byName.values()];
|
|
183
|
+
}
|
|
184
|
+
// ---------------------------------------------------------------- projections
|
|
185
|
+
/**
|
|
186
|
+
* Model projection step: a `data-extension` part becomes what the model reads.
|
|
187
|
+
* Message target → a text part with `rendered` before/after the user's text,
|
|
188
|
+
* then any `files` as file parts. A failed extension → a short failure note so
|
|
189
|
+
* the model can proceed (and call the tools itself). The data part itself is
|
|
190
|
+
* always stripped — the SDK would drop it anyway; stripping keeps the rule
|
|
191
|
+
* explicit. Projection-only: stored history is untouched.
|
|
192
|
+
*/
|
|
193
|
+
export function applyExtensionParts(messages) {
|
|
194
|
+
return messages.map((m) => {
|
|
195
|
+
if (m.role !== "user")
|
|
196
|
+
return m;
|
|
197
|
+
const parts = m.parts;
|
|
198
|
+
if (!Array.isArray(parts))
|
|
199
|
+
return m;
|
|
200
|
+
const ext = parts.filter((p) => p.type === EXTENSION_PART_TYPE);
|
|
201
|
+
if (ext.length === 0)
|
|
202
|
+
return m;
|
|
203
|
+
const base = parts.filter((p) => p.type !== EXTENSION_PART_TYPE);
|
|
204
|
+
const before = [];
|
|
205
|
+
const after = [];
|
|
206
|
+
for (const { data } of ext) {
|
|
207
|
+
if (data.rendered && data.target === "message") {
|
|
208
|
+
const block = [{ type: "text", text: data.rendered }];
|
|
209
|
+
for (const f of data.files ?? [])
|
|
210
|
+
block.push({ ...f });
|
|
211
|
+
(data.placement === "before" ? before : after).push(...block);
|
|
212
|
+
}
|
|
213
|
+
else if (data.rendered && data.target === "instructions" && data.files?.length) {
|
|
214
|
+
// The text went to the system prompt; media can only ride on a message.
|
|
215
|
+
for (const f of data.files)
|
|
216
|
+
after.push({ ...f });
|
|
217
|
+
}
|
|
218
|
+
if (data.error && !data.rendered) {
|
|
219
|
+
after.push({
|
|
220
|
+
type: "text",
|
|
221
|
+
text: `[Extension "${data.name}" failed: ${data.error.message}. Proceed without it.]`,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// `before` goes ahead of the first text part; `after` behind the last text
|
|
226
|
+
// part (files the user attached stay where they were).
|
|
227
|
+
const firstText = base.findIndex((p) => p.type === "text");
|
|
228
|
+
let lastText = -1;
|
|
229
|
+
base.forEach((p, i) => {
|
|
230
|
+
if (p.type === "text")
|
|
231
|
+
lastText = i;
|
|
232
|
+
});
|
|
233
|
+
const next = [];
|
|
234
|
+
base.forEach((p, i) => {
|
|
235
|
+
if (i === firstText)
|
|
236
|
+
next.push(...before);
|
|
237
|
+
next.push(p);
|
|
238
|
+
if (i === lastText)
|
|
239
|
+
next.push(...after);
|
|
240
|
+
});
|
|
241
|
+
if (firstText === -1)
|
|
242
|
+
next.unshift(...before);
|
|
243
|
+
if (lastText === -1)
|
|
244
|
+
next.push(...after);
|
|
245
|
+
return { ...m, parts: next };
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Client projection step: with `reveal: "command"` the client learns that an
|
|
250
|
+
* extension ran (name, when, error) but not what it produced — the rendered
|
|
251
|
+
* prompt and the fetched data stay server-side. `prompt` / `both` pass the
|
|
252
|
+
* part through whole; the client decides how to show it. Self-describing:
|
|
253
|
+
* the stored part carries its own `reveal`, so editing the agent later does
|
|
254
|
+
* not rewrite what an older message shows.
|
|
255
|
+
*/
|
|
256
|
+
export function redactExtensionParts(messages) {
|
|
257
|
+
return messages.map((m) => {
|
|
258
|
+
const parts = m.parts;
|
|
259
|
+
if (!Array.isArray(parts))
|
|
260
|
+
return m;
|
|
261
|
+
let changed = false;
|
|
262
|
+
const next = parts.map((p) => {
|
|
263
|
+
if (p.type !== EXTENSION_PART_TYPE)
|
|
264
|
+
return p;
|
|
265
|
+
const d = p.data;
|
|
266
|
+
if (!d || d.reveal !== "command")
|
|
267
|
+
return p;
|
|
268
|
+
changed = true;
|
|
269
|
+
const reduced = {
|
|
270
|
+
name: d.name,
|
|
271
|
+
on: d.on,
|
|
272
|
+
target: d.target,
|
|
273
|
+
reveal: d.reveal,
|
|
274
|
+
at: d.at,
|
|
275
|
+
...(d.input !== undefined ? { input: d.input } : {}),
|
|
276
|
+
...(d.error ? { error: { message: d.error.message } } : {}),
|
|
277
|
+
};
|
|
278
|
+
return { ...p, data: reduced };
|
|
279
|
+
});
|
|
280
|
+
return changed ? { ...m, parts: next } : m;
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
// ------------------------------------------------------------------- bounding
|
|
284
|
+
/** Keep a script output row-sized: over the cap, store a marked preview instead. */
|
|
285
|
+
export function boundOutput(output, maxBytes = EXTENSION_DEFAULTS.maxOutputBytes) {
|
|
286
|
+
if (output === undefined)
|
|
287
|
+
return { output: undefined, truncated: false };
|
|
288
|
+
let json;
|
|
289
|
+
try {
|
|
290
|
+
json = JSON.stringify(output) ?? "";
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
return { output: { __unserializable: true }, truncated: true };
|
|
294
|
+
}
|
|
295
|
+
if (json.length <= maxBytes)
|
|
296
|
+
return { output, truncated: false };
|
|
297
|
+
return {
|
|
298
|
+
output: { __truncated: true, bytes: json.length, preview: json.slice(0, 4000) },
|
|
299
|
+
truncated: true,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Media the script returned for the model: a `files` list on the output, each
|
|
304
|
+
* `{ mediaType, url | data (base64), filename? }` — `web_fetch`'s
|
|
305
|
+
* `{ kind: "media", mediaType, data }` result fits as-is. Unsupported types
|
|
306
|
+
* and anything past the byte cap are dropped, with a reason. Returns the
|
|
307
|
+
* output WITHOUT `files` so the bytes are not stored twice.
|
|
308
|
+
*/
|
|
309
|
+
export function collectFiles(output) {
|
|
310
|
+
if (!output || typeof output !== "object" || Array.isArray(output)) {
|
|
311
|
+
return { output, files: [], dropped: [] };
|
|
312
|
+
}
|
|
313
|
+
const { files: raw, ...rest } = output;
|
|
314
|
+
if (!Array.isArray(raw))
|
|
315
|
+
return { output, files: [], dropped: [] };
|
|
316
|
+
const files = [];
|
|
317
|
+
const dropped = [];
|
|
318
|
+
let total = 0;
|
|
319
|
+
raw.forEach((item, i) => {
|
|
320
|
+
const f = item;
|
|
321
|
+
const label = typeof f?.filename === "string" ? f.filename : `files[${i}]`;
|
|
322
|
+
if (typeof f?.mediaType !== "string" || !EXTENSION_MEDIA_TYPES.has(f.mediaType)) {
|
|
323
|
+
dropped.push(`${label}: unsupported media type ${String(f?.mediaType)}`);
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
let url;
|
|
327
|
+
let bytes = 0;
|
|
328
|
+
if (typeof f.url === "string" && /^(https?:|data:)/i.test(f.url)) {
|
|
329
|
+
url = f.url;
|
|
330
|
+
if (url.startsWith("data:"))
|
|
331
|
+
bytes = Math.floor(((url.split(",")[1] ?? "").length * 3) / 4);
|
|
332
|
+
}
|
|
333
|
+
else if (typeof f.data === "string" && f.data.length > 0) {
|
|
334
|
+
bytes = Math.floor((f.data.length * 3) / 4);
|
|
335
|
+
url = `data:${f.mediaType};base64,${f.data}`;
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
dropped.push(`${label}: no url or data`);
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
if (total + bytes > EXTENSION_DEFAULTS.maxMediaBytes) {
|
|
342
|
+
dropped.push(`${label}: over the ${Math.round(EXTENSION_DEFAULTS.maxMediaBytes / 1024 / 1024 * 10) / 10} MB media cap`);
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
total += bytes;
|
|
346
|
+
files.push({
|
|
347
|
+
type: "file",
|
|
348
|
+
mediaType: f.mediaType,
|
|
349
|
+
url,
|
|
350
|
+
...(typeof f.filename === "string" ? { filename: f.filename } : {}),
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
return { output: rest, files, dropped };
|
|
354
|
+
}
|
|
355
|
+
// ------------------------------------------------------------ tool results
|
|
356
|
+
/**
|
|
357
|
+
* Give a script the VALUE a tool produced, not the wire envelope. MCP tools
|
|
358
|
+
* return `{ content: [{ type: "text", text }], structuredContent?, isError? }`
|
|
359
|
+
* — fine for the model, useless for `output.changes.files`. Mirrors what an
|
|
360
|
+
* MCP client adapter does: `structuredContent` wins; one text part that parses
|
|
361
|
+
* as JSON becomes that value; several text parts join; anything else (files,
|
|
362
|
+
* images, non-MCP shapes) passes through untouched. `isError` throws, so a
|
|
363
|
+
* script's `try/catch` and the step's error branch see it as a failure.
|
|
364
|
+
*/
|
|
365
|
+
export function unwrapToolResult(result) {
|
|
366
|
+
if (!result || typeof result !== "object" || Array.isArray(result))
|
|
367
|
+
return result;
|
|
368
|
+
const r = result;
|
|
369
|
+
if (!Array.isArray(r.content))
|
|
370
|
+
return result;
|
|
371
|
+
const parts = r.content;
|
|
372
|
+
if (!parts.every((p) => p && typeof p === "object" && typeof p.type === "string"))
|
|
373
|
+
return result;
|
|
374
|
+
const texts = parts.filter((p) => p.type === "text" && typeof p.text === "string").map((p) => p.text);
|
|
375
|
+
if (r.isError === true) {
|
|
376
|
+
throw Object.assign(new Error(texts.join("\n") || "tool returned an error"), { code: "tool_error" });
|
|
377
|
+
}
|
|
378
|
+
if (r.structuredContent !== undefined && r.structuredContent !== null)
|
|
379
|
+
return r.structuredContent;
|
|
380
|
+
if (texts.length === parts.length) {
|
|
381
|
+
if (texts.length === 1) {
|
|
382
|
+
const t = texts[0].trim();
|
|
383
|
+
if (/^[[{]/.test(t)) {
|
|
384
|
+
try {
|
|
385
|
+
return JSON.parse(t);
|
|
386
|
+
}
|
|
387
|
+
catch {
|
|
388
|
+
// not JSON after all — hand back the text
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
return texts[0];
|
|
392
|
+
}
|
|
393
|
+
return texts.join("\n");
|
|
394
|
+
}
|
|
395
|
+
return result;
|
|
396
|
+
}
|
|
397
|
+
// ------------------------------------------------------------------- gating
|
|
398
|
+
/**
|
|
399
|
+
* The approval-gated tool names for a turn: harness gates + each source's
|
|
400
|
+
* defaults, with the agent's object-form policy winning per name. A function
|
|
401
|
+
* policy cannot be enumerated, so every tool counts as gated (the same
|
|
402
|
+
* conservative rule test runs use).
|
|
403
|
+
*/
|
|
404
|
+
export function gatedToolNames(opts) {
|
|
405
|
+
const gated = new Set();
|
|
406
|
+
for (const [k, v] of Object.entries(opts.harnessApproval))
|
|
407
|
+
if (v)
|
|
408
|
+
gated.add(k);
|
|
409
|
+
for (const s of opts.sourceApproval) {
|
|
410
|
+
for (const [k, v] of Object.entries(s ?? {}))
|
|
411
|
+
if (v)
|
|
412
|
+
gated.add(k);
|
|
413
|
+
}
|
|
414
|
+
const agent = opts.agentApproval;
|
|
415
|
+
if (agent && typeof agent !== "function") {
|
|
416
|
+
for (const [k, v] of Object.entries(agent)) {
|
|
417
|
+
if (v)
|
|
418
|
+
gated.add(k);
|
|
419
|
+
else
|
|
420
|
+
gated.delete(k);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
else if (typeof agent === "function") {
|
|
424
|
+
for (const k of opts.allNames)
|
|
425
|
+
gated.add(k);
|
|
426
|
+
}
|
|
427
|
+
return gated;
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Run the selected extensions and build their parts. Pure with respect to
|
|
431
|
+
* storage — the caller persists `message` and streams `parts`. Never throws
|
|
432
|
+
* for a `proceed` extension; throws `ExtensionFailedError` for a `fail` one.
|
|
433
|
+
*/
|
|
434
|
+
export async function executeExtensions(opts) {
|
|
435
|
+
const now = opts.now ?? Date.now;
|
|
436
|
+
const newId = opts.newId ?? (() => `ext_${Math.random().toString(36).slice(2, 12)}`);
|
|
437
|
+
const parts = [];
|
|
438
|
+
const details = [];
|
|
439
|
+
for (const { ext, input } of opts.selected) {
|
|
440
|
+
const r = resolveExtension(ext);
|
|
441
|
+
const startedAt = now();
|
|
442
|
+
const data = {
|
|
443
|
+
name: ext.name,
|
|
444
|
+
on: ext.on,
|
|
445
|
+
target: r.target,
|
|
446
|
+
placement: r.placement,
|
|
447
|
+
scope: r.scope,
|
|
448
|
+
reveal: r.reveal,
|
|
449
|
+
...(input !== undefined ? { input } : {}),
|
|
450
|
+
at: startedAt,
|
|
451
|
+
calls: [],
|
|
452
|
+
};
|
|
453
|
+
const fail = (message, code, at) => {
|
|
454
|
+
data.error = { message, ...(code ? { code } : {}), ...(at ? { at } : {}) };
|
|
455
|
+
};
|
|
456
|
+
const detail = {};
|
|
457
|
+
try {
|
|
458
|
+
let scope = { input };
|
|
459
|
+
if (ext.script !== undefined) {
|
|
460
|
+
const all = opts.mounts();
|
|
461
|
+
const names = all.map((t) => t.name);
|
|
462
|
+
const inactive = opts.inactiveNames ?? new Set();
|
|
463
|
+
const analysis = opts.engine.analyze(ext.script, { tools: names });
|
|
464
|
+
if (analysis.plan !== undefined)
|
|
465
|
+
detail.plan = analysis.plan;
|
|
466
|
+
const inactiveCalls = analysis.calls.filter((c) => inactive.has(c));
|
|
467
|
+
const gatedCalls = analysis.calls.filter((c) => opts.gatedNames.has(c));
|
|
468
|
+
if (analysis.issues.length > 0) {
|
|
469
|
+
const available = names.length
|
|
470
|
+
? ` Tools this script can call: ${names.slice(0, 40).join(", ")}${names.length > 40 ? ", …" : ""}.`
|
|
471
|
+
: " No tools are mounted for this agent (are its connections saved and authorized?).";
|
|
472
|
+
fail(analysis.issues.join("; ") + available, "invalid_script");
|
|
473
|
+
}
|
|
474
|
+
else if (inactiveCalls.length > 0) {
|
|
475
|
+
fail(`calls tool(s) not enabled for this agent: ${inactiveCalls.join(", ")} (enable them under the agent's tools)`, "tool_not_enabled");
|
|
476
|
+
}
|
|
477
|
+
else if (gatedCalls.length > 0 && !r.allowMutations) {
|
|
478
|
+
fail(`calls approval-gated tool(s) ${gatedCalls.join(", ")}; set allowMutations to permit`, "gated_tool");
|
|
479
|
+
}
|
|
480
|
+
else {
|
|
481
|
+
{
|
|
482
|
+
// Only what this extension may run: never inactive; gated only when allowed.
|
|
483
|
+
const mounts = all.filter((t) => !inactive.has(t.name) && (r.allowMutations || !opts.gatedNames.has(t.name)));
|
|
484
|
+
const ac = new AbortController();
|
|
485
|
+
const onOuter = () => ac.abort(opts.signal?.reason);
|
|
486
|
+
opts.signal?.addEventListener("abort", onOuter, { once: true });
|
|
487
|
+
const timer = setTimeout(() => ac.abort(new Error(`timed out after ${r.timeoutMs} ms`)), r.timeoutMs);
|
|
488
|
+
timer.unref?.();
|
|
489
|
+
let result;
|
|
490
|
+
try {
|
|
491
|
+
result = await opts.engine.run(analysis.plan, {
|
|
492
|
+
tools: mounts,
|
|
493
|
+
input,
|
|
494
|
+
signal: ac.signal,
|
|
495
|
+
});
|
|
496
|
+
}
|
|
497
|
+
finally {
|
|
498
|
+
clearTimeout(timer);
|
|
499
|
+
opts.signal?.removeEventListener("abort", onOuter);
|
|
500
|
+
}
|
|
501
|
+
data.calls = result.calls;
|
|
502
|
+
detail.steps = Object.fromEntries(Object.entries(result.steps).map(([id, v]) => [id, boundOutput(v, 16 * 1024).output]));
|
|
503
|
+
if (result.status !== "ok") {
|
|
504
|
+
const e = result.error ?? { message: `script ${result.status}` };
|
|
505
|
+
fail(result.status === "suspended"
|
|
506
|
+
? "script suspended (approvals inside extensions are not supported yet)"
|
|
507
|
+
: e.message, e.code ?? result.status, e.at);
|
|
508
|
+
}
|
|
509
|
+
else {
|
|
510
|
+
const media = collectFiles(result.output);
|
|
511
|
+
if (media.files.length > 0)
|
|
512
|
+
data.files = media.files;
|
|
513
|
+
const bounded = boundOutput(media.output);
|
|
514
|
+
data.output = bounded.output;
|
|
515
|
+
if (bounded.truncated)
|
|
516
|
+
data.outputTruncated = true;
|
|
517
|
+
scope = {
|
|
518
|
+
input,
|
|
519
|
+
output: media.output,
|
|
520
|
+
steps: result.steps,
|
|
521
|
+
...result.steps,
|
|
522
|
+
...(media.dropped.length ? { droppedFiles: media.dropped } : {}),
|
|
523
|
+
};
|
|
524
|
+
if (media.dropped.length > 0) {
|
|
525
|
+
// Not a failure — the text still renders; the model just learns
|
|
526
|
+
// some media did not make it.
|
|
527
|
+
data.error = { message: `media dropped: ${media.dropped.join("; ")}`, code: "media_dropped" };
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
if (!data.error || data.error.code === "media_dropped") {
|
|
534
|
+
let rendered;
|
|
535
|
+
if (ext.template !== undefined) {
|
|
536
|
+
rendered = await opts.engine.render(ext.template, scope);
|
|
537
|
+
}
|
|
538
|
+
else {
|
|
539
|
+
const body = scope.output !== undefined ? scope.output : scope.steps;
|
|
540
|
+
rendered =
|
|
541
|
+
body === undefined
|
|
542
|
+
? ""
|
|
543
|
+
: `\`\`\`json\n${JSON.stringify(body, null, 2)}\n\`\`\``;
|
|
544
|
+
}
|
|
545
|
+
if (rendered.length > r.maxRenderedChars) {
|
|
546
|
+
rendered = `${rendered.slice(0, r.maxRenderedChars)}\n[…truncated to ${r.maxRenderedChars} characters]`;
|
|
547
|
+
}
|
|
548
|
+
data.rendered = rendered;
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
catch (e) {
|
|
552
|
+
const err = e;
|
|
553
|
+
fail(typeof err?.message === "string" ? err.message : String(e), typeof err?.code === "string" ? err.code : undefined);
|
|
554
|
+
}
|
|
555
|
+
data.durationMs = now() - startedAt;
|
|
556
|
+
parts.push({ type: EXTENSION_PART_TYPE, id: newId(), data });
|
|
557
|
+
details.push(detail);
|
|
558
|
+
if (data.error && !data.rendered && r.onError === "fail") {
|
|
559
|
+
const err = new ExtensionFailedError(ext.name, data.error.message);
|
|
560
|
+
err.partial = { message: withParts(opts.message, parts), parts, details };
|
|
561
|
+
throw err;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
return { message: withParts(opts.message, parts), parts, details };
|
|
565
|
+
}
|
|
566
|
+
function withParts(message, parts) {
|
|
567
|
+
return { ...message, parts: [...message.parts, ...parts] };
|
|
568
|
+
}
|
|
569
|
+
//# sourceMappingURL=extensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensions.js","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @intentface/latch-core/harness
|
|
3
|
+
*
|
|
4
|
+
* The default harness tools every host used to copy: sandbox file/shell tools,
|
|
5
|
+
* `web_fetch`, `askUser`, and the schedule read/cancel tools. Pass
|
|
6
|
+
* `harnessTools: defaultHarnessTools()` to `createRuntime` (or let
|
|
7
|
+
* `createLatchApp` do it) and grant them per agent with `sandbox` /
|
|
8
|
+
* `defaultTools`.
|
|
9
|
+
*
|
|
10
|
+
* A subpath because `web_fetch` has dependencies beyond `ai`: `turndown` and
|
|
11
|
+
* `@intentface/latch-net` are OPTIONAL peers of core, imported lazily on the
|
|
12
|
+
* first call. The core root imports none of them.
|
|
13
|
+
*/
|
|
14
|
+
export { defaultHarnessTools, sandboxTools, appTools, webFetchToModelOutput, harnessContextOf, tail } from "./tools.js";
|
|
15
|
+
export type { HarnessToolContext, WebFetchToolOutput } from "./tools.js";
|
|
16
|
+
export type { WebFetchFormat, WebFetchResult, SupportedMediaType } from "./web-fetch.js";
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/harness/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,QAAQ,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACxH,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIzE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @intentface/latch-core/harness
|
|
3
|
+
*
|
|
4
|
+
* The default harness tools every host used to copy: sandbox file/shell tools,
|
|
5
|
+
* `web_fetch`, `askUser`, and the schedule read/cancel tools. Pass
|
|
6
|
+
* `harnessTools: defaultHarnessTools()` to `createRuntime` (or let
|
|
7
|
+
* `createLatchApp` do it) and grant them per agent with `sandbox` /
|
|
8
|
+
* `defaultTools`.
|
|
9
|
+
*
|
|
10
|
+
* A subpath because `web_fetch` has dependencies beyond `ai`: `turndown` and
|
|
11
|
+
* `@intentface/latch-net` are OPTIONAL peers of core, imported lazily on the
|
|
12
|
+
* first call. The core root imports none of them.
|
|
13
|
+
*/
|
|
14
|
+
export { defaultHarnessTools, sandboxTools, appTools, webFetchToModelOutput, harnessContextOf, tail } from "./tools.js";
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/harness/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,QAAQ,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC"}
|