@intentface/latch-core 0.9.1 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/agent.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { LanguageModel } from "ai";
2
2
  import type { MemoryConfig } from "./memory.js";
3
+ import type { Extension } from "./extensions/extension.js";
3
4
  /**
4
5
  * Agent definitions.
5
6
  *
@@ -44,6 +45,16 @@ export interface ToolSource<P> {
44
45
  open(principal: P): Promise<OpenToolSet>;
45
46
  }
46
47
  export interface AgentConfig<P> {
48
+ /**
49
+ * Which stored version of this agent's record produced this config, when it
50
+ * came from a store that versions them (`latch_agent_versions.version`).
51
+ * Absent for code-declared agents, which have no stored record.
52
+ *
53
+ * Recorded on the run and emitted as a trace tag, so a past answer can be
54
+ * traced back to the exact configuration that produced it — and so eval or
55
+ * judge scores can be compared across versions.
56
+ */
57
+ configVersion?: number;
47
58
  model: LanguageModel;
48
59
  instructions?: string;
49
60
  /** Static tools, available every turn. */
@@ -156,6 +167,12 @@ export interface AgentConfig<P> {
156
167
  * background jobs handle extraction and consolidation out of band.
157
168
  */
158
169
  memory?: MemoryConfig;
170
+ /**
171
+ * Extensions attached to this agent's turns, after the runtime-wide ones
172
+ * (`RuntimeConfig.extensions`). See `extensions/extension.ts` for the
173
+ * moments and effects. Omitted → the agent's turns are unchanged.
174
+ */
175
+ extensions?: Extension[];
159
176
  }
160
177
  /** Static, display-only metadata for an agent — surfaced by `runtime.listAgents()`. */
161
178
  export interface AgentMeta {
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/agent.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAyMA,MAAM,UAAU,WAAW,CACzB,GAAqD,EACrD,IAAgB;IAEhB,MAAM,OAAO,GACX,OAAO,GAAG,KAAK,UAAU;QACvB,CAAC,CAAE,GAAuC;QAC1C,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;IAChB,IAAI,IAAI;QAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAC9B,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AA0NA,MAAM,UAAU,WAAW,CACzB,GAAqD,EACrD,IAAgB;IAEhB,MAAM,OAAO,GACX,OAAO,GAAG,KAAK,UAAU;QACvB,CAAC,CAAE,GAAuC;QAC1C,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;IAChB,IAAI,IAAI;QAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAC9B,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * compose.ts — effect dispatch.
3
+ *
4
+ * Extensions run in array order. Each moment has its own merge rule, chosen so
5
+ * the result is predictable when several extensions answer at once:
6
+ *
7
+ * append / inject accumulate — everyone's contribution lands
8
+ * block / stop first wins — a veto is a veto
9
+ * replace / transform last wins — later extensions layer on earlier
10
+ * chained transforms each sees the previous one's output
11
+ *
12
+ * FAILURE. A throwing handler is caught, reported, and treated as "no effect",
13
+ * so one bad extension cannot break the loop. That rule is deliberately NOT
14
+ * universal: an extension marked `critical` rethrows instead, because a
15
+ * persistence handler whose database is down has not "produced no effect", it
16
+ * has lost the step.
17
+ *
18
+ * ORDER MATTERS for `step_end`: handlers run in extension order and the next
19
+ * model call waits for all of them, so list an extension that persists before
20
+ * the ones that merely observe.
21
+ */
22
+ import type { Instructions, LanguageModel, ModelMessage, ToolSet, UIMessage } from "ai";
23
+ import type { Extension, InputEffect, Moment, Part, Principal, RunContext, StepContext, StepInfo, StepUsage, ViewEffect } from "./extension.js";
24
+ export interface ComposeOptions {
25
+ onExtensionError?: (info: {
26
+ extension: string;
27
+ moment: string;
28
+ error: unknown;
29
+ }) => void;
30
+ }
31
+ /** Thrown when a `critical` extension's handler throws. Fails the run. */
32
+ export declare class ExtensionFailedError extends Error {
33
+ readonly extension: string;
34
+ readonly moment: string;
35
+ readonly cause: unknown;
36
+ constructor(extension: string, moment: string, cause: unknown);
37
+ }
38
+ /** Instructions + accumulated text appends, preserving any providerOptions on the base. */
39
+ export declare function withAppends(base: Instructions | undefined, appended: string[]): Instructions | undefined;
40
+ export declare function compose(extensions: Extension[], options?: ComposeOptions): {
41
+ /**
42
+ * Whether any extension listens to a moment. The tool wrapper needs this:
43
+ * a veto is async, and awaiting it before `execute` would defeat the
44
+ * synchronous `Symbol.asyncIterator` sniff that streaming tools rely on.
45
+ * With no `tool_call` listener it can stay on the streaming-safe path.
46
+ */
47
+ has(moment: Moment): boolean;
48
+ /** first wins: the first extension to handle or transform decides */
49
+ input(text: string, messages: UIMessage[], run: RunContext, source?: "user" | "extension"): Promise<InputEffect>;
50
+ /**
51
+ * `replace` is last-wins. `inject` accumulates, and lands BEFORE the final
52
+ * message: the last message is the response anchor (`originalMessages` for
53
+ * the UI stream), so appending a synthetic assistant message there would
54
+ * make the model's reply merge into it.
55
+ */
56
+ messagesIn(moment: "session_start" | "before_agent_start", messages: UIMessage[], run: RunContext): Promise<UIMessage[]>;
57
+ /** stop: first wins. model/activeTools: last wins. */
58
+ stepStart(ctx: StepContext): Promise<{
59
+ stop: boolean;
60
+ model?: LanguageModel;
61
+ activeTools?: string[];
62
+ }>;
63
+ /** append accumulates; a replace resets the accumulation */
64
+ instructions(current: Instructions | undefined, ctx: StepContext): Promise<Instructions | undefined>;
65
+ /** chained: each extension sees the previous one's messages */
66
+ context(messages: ModelMessage[], ctx: StepContext): Promise<ModelMessage[]>;
67
+ tools(tools: ToolSet, run: RunContext): ToolSet;
68
+ /** hide wins outright; otherwise replacements layer */
69
+ view(part: Part, stored: boolean, run?: Partial<RunContext>): ViewEffect;
70
+ /** first block wins — a veto is a veto */
71
+ toolCall(info: {
72
+ toolName: string;
73
+ toolCallId: string;
74
+ input: unknown;
75
+ }, run: RunContext): Promise<{
76
+ block?: true;
77
+ reason?: string;
78
+ } | undefined>;
79
+ /** chained: each extension sees the previous one's output */
80
+ toolResult(info: {
81
+ toolName: string;
82
+ toolCallId: string;
83
+ input: unknown;
84
+ output: unknown;
85
+ isError: boolean;
86
+ source: "server" | "client";
87
+ }, run: RunContext): Promise<{
88
+ output: unknown;
89
+ isError: boolean;
90
+ } | undefined>;
91
+ /** all appends accumulate */
92
+ stepEnd(messages: UIMessage[], info: StepInfo): Promise<Part[]>;
93
+ error(info: {
94
+ error: unknown;
95
+ stepNumber: number;
96
+ messages: UIMessage[];
97
+ }, run: RunContext): Promise<void>;
98
+ agentEnd(info: {
99
+ runId: string;
100
+ principal: Principal;
101
+ messages: UIMessage[];
102
+ stepCount: number;
103
+ isAborted: boolean;
104
+ error?: unknown;
105
+ usage: StepUsage;
106
+ }): Promise<void>;
107
+ };
108
+ export type Composed = ReturnType<typeof compose>;
109
+ /**
110
+ * Stored transcript → what the customer may see. Applies every `render` rule to
111
+ * every part; a message left with no parts is dropped. Call this on a load
112
+ * route, after the client projection.
113
+ */
114
+ export declare function renderTranscript(extensions: Extension[], messages: UIMessage[],
115
+ /** Supply what the caller knows — an authenticated load route has the principal but no run. */
116
+ run?: Partial<RunContext>): UIMessage[];
117
+ //# sourceMappingURL=compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/extensions/compose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,249 @@
1
+ /** Thrown when a `critical` extension's handler throws. Fails the run. */
2
+ export class ExtensionFailedError extends Error {
3
+ extension;
4
+ moment;
5
+ cause;
6
+ constructor(extension, moment, cause) {
7
+ super(`[extension:${extension}] ${moment} failed: ${cause instanceof Error ? cause.message : String(cause)}`);
8
+ this.name = "ExtensionFailedError";
9
+ this.extension = extension;
10
+ this.moment = moment;
11
+ this.cause = cause;
12
+ }
13
+ }
14
+ /** Instructions + accumulated text appends, preserving any providerOptions on the base. */
15
+ export function withAppends(base, appended) {
16
+ if (!appended.length)
17
+ return base;
18
+ const text = appended.join("\n");
19
+ if (base == null)
20
+ return text;
21
+ if (typeof base === "string")
22
+ return [base, text].filter(Boolean).join("\n");
23
+ // A SystemModelMessage (or array of them) may carry providerOptions — e.g. a
24
+ // prompt-cache breakpoint. Never flatten those to a string; add a message.
25
+ const head = Array.isArray(base) ? base : [base];
26
+ return [...head, { role: "system", content: text }];
27
+ }
28
+ export function compose(extensions, options = {}) {
29
+ const report = options.onExtensionError ??
30
+ ((i) => console.error(`[extension:${i.extension}] ${i.moment}`, i.error));
31
+ const handlers = (k) => extensions.flatMap((e) => (e.hooks[k] ?? []).map((fn) => ({
32
+ ext: e.name,
33
+ critical: e.critical === true,
34
+ fn: fn,
35
+ })));
36
+ /**
37
+ * Run one handler. A throw becomes `undefined` and is reported — unless the
38
+ * extension is critical, in which case it is wrapped and rethrown.
39
+ */
40
+ const safe = async (h, moment, run) => {
41
+ try {
42
+ return await run();
43
+ }
44
+ catch (error) {
45
+ if (h.critical)
46
+ throw new ExtensionFailedError(h.ext, moment, error);
47
+ report({ extension: h.ext, moment, error });
48
+ return undefined;
49
+ }
50
+ };
51
+ const safeSync = (h, moment, run) => {
52
+ try {
53
+ return run();
54
+ }
55
+ catch (error) {
56
+ if (h.critical)
57
+ throw new ExtensionFailedError(h.ext, moment, error);
58
+ report({ extension: h.ext, moment, error });
59
+ return undefined;
60
+ }
61
+ };
62
+ return {
63
+ /**
64
+ * Whether any extension listens to a moment. The tool wrapper needs this:
65
+ * a veto is async, and awaiting it before `execute` would defeat the
66
+ * synchronous `Symbol.asyncIterator` sniff that streaming tools rely on.
67
+ * With no `tool_call` listener it can stay on the streaming-safe path.
68
+ */
69
+ has(moment) {
70
+ return extensions.some((e) => (e.hooks[moment]?.length ?? 0) > 0);
71
+ },
72
+ /** first wins: the first extension to handle or transform decides */
73
+ async input(text, messages, run, source = "user") {
74
+ for (const h of handlers("input")) {
75
+ const e = await safe(h, "input", () => h.fn({ text, source, messages }, run));
76
+ if (e)
77
+ return e;
78
+ }
79
+ return undefined;
80
+ },
81
+ /**
82
+ * `replace` is last-wins. `inject` accumulates, and lands BEFORE the final
83
+ * message: the last message is the response anchor (`originalMessages` for
84
+ * the UI stream), so appending a synthetic assistant message there would
85
+ * make the model's reply merge into it.
86
+ */
87
+ async messagesIn(moment, messages, run) {
88
+ let out = messages;
89
+ const injected = [];
90
+ for (const h of handlers(moment)) {
91
+ const e = await safe(h, moment, () => h.fn(out, run));
92
+ if (!e)
93
+ continue;
94
+ if ("replace" in e && e.replace)
95
+ out = e.replace;
96
+ if ("inject" in e && e.inject)
97
+ injected.push(e.inject);
98
+ }
99
+ if (!injected.length)
100
+ return out;
101
+ if (!out.length)
102
+ return injected;
103
+ return [...out.slice(0, -1), ...injected, out[out.length - 1]];
104
+ },
105
+ /** stop: first wins. model/activeTools: last wins. */
106
+ async stepStart(ctx) {
107
+ let stop = false;
108
+ let model;
109
+ let activeTools;
110
+ for (const h of handlers("step_start")) {
111
+ const e = await safe(h, "step_start", () => h.fn(ctx));
112
+ if (!e)
113
+ continue;
114
+ if (e.stop && !stop)
115
+ stop = true;
116
+ if (e.model)
117
+ model = e.model;
118
+ if (e.activeTools)
119
+ activeTools = e.activeTools;
120
+ }
121
+ return { stop, model, activeTools };
122
+ },
123
+ /** append accumulates; a replace resets the accumulation */
124
+ async instructions(current, ctx) {
125
+ let base = current;
126
+ const appended = [];
127
+ for (const h of handlers("instructions")) {
128
+ const e = await safe(h, "instructions", () => h.fn(base, ctx));
129
+ if (!e)
130
+ continue;
131
+ if ("replace" in e && e.replace != null) {
132
+ base = e.replace;
133
+ appended.length = 0;
134
+ }
135
+ if ("append" in e && e.append)
136
+ appended.push(e.append);
137
+ }
138
+ return withAppends(base, appended);
139
+ },
140
+ /** chained: each extension sees the previous one's messages */
141
+ async context(messages, ctx) {
142
+ let out = messages;
143
+ for (const h of handlers("context")) {
144
+ const e = await safe(h, "context", () => h.fn(out, ctx));
145
+ if (e?.messages)
146
+ out = e.messages;
147
+ }
148
+ return out;
149
+ },
150
+ tools(tools, run) {
151
+ let out = tools;
152
+ for (const h of handlers("register_tools")) {
153
+ const r = safeSync(h, "register_tools", () => h.fn(out, run));
154
+ if (r)
155
+ out = r;
156
+ }
157
+ return out;
158
+ },
159
+ /** hide wins outright; otherwise replacements layer */
160
+ view(part, stored, run) {
161
+ let current = part;
162
+ let replaced = false;
163
+ for (const h of handlers("render")) {
164
+ const e = safeSync(h, "render", () => h.fn(current, { stored, ...run }));
165
+ if (!e)
166
+ continue;
167
+ if ("hide" in e && e.hide)
168
+ return { hide: true };
169
+ if ("replace" in e && e.replace) {
170
+ current = e.replace;
171
+ replaced = true;
172
+ }
173
+ }
174
+ return replaced ? { replace: current } : undefined;
175
+ },
176
+ /** first block wins — a veto is a veto */
177
+ async toolCall(info, run) {
178
+ for (const h of handlers("tool_call")) {
179
+ const e = await safe(h, "tool_call", () => h.fn(info, run));
180
+ if (e && "block" in e && e.block)
181
+ return e;
182
+ }
183
+ return undefined;
184
+ },
185
+ /** chained: each extension sees the previous one's output */
186
+ async toolResult(info, run) {
187
+ let { output, isError } = info;
188
+ let changed = false;
189
+ for (const h of handlers("tool_result")) {
190
+ const e = await safe(h, "tool_result", () => h.fn({ ...info, output, isError }, run));
191
+ if (!e)
192
+ continue;
193
+ if ("output" in e && e.output !== undefined) {
194
+ output = e.output;
195
+ changed = true;
196
+ }
197
+ if (e.isError !== undefined) {
198
+ isError = e.isError;
199
+ changed = true;
200
+ }
201
+ }
202
+ return changed ? { output, isError } : undefined;
203
+ },
204
+ /** all appends accumulate */
205
+ async stepEnd(messages, info) {
206
+ const appended = [];
207
+ for (const h of handlers("step_end")) {
208
+ const e = await safe(h, "step_end", () => h.fn(messages, info));
209
+ if (e?.append)
210
+ appended.push(...e.append);
211
+ }
212
+ return appended;
213
+ },
214
+ async error(info, run) {
215
+ for (const h of handlers("error"))
216
+ await safe(h, "error", () => h.fn(info, run));
217
+ },
218
+ async agentEnd(info) {
219
+ for (const h of handlers("agent_end"))
220
+ await safe(h, "agent_end", () => h.fn(info));
221
+ },
222
+ };
223
+ }
224
+ /**
225
+ * Stored transcript → what the customer may see. Applies every `render` rule to
226
+ * every part; a message left with no parts is dropped. Call this on a load
227
+ * route, after the client projection.
228
+ */
229
+ export function renderTranscript(extensions, messages,
230
+ /** Supply what the caller knows — an authenticated load route has the principal but no run. */
231
+ run) {
232
+ const hooks = compose(extensions);
233
+ if (!hooks.has("render"))
234
+ return messages;
235
+ const out = [];
236
+ for (const m of messages) {
237
+ const parts = [];
238
+ for (const p of m.parts) {
239
+ const e = hooks.view(p, true, run);
240
+ if (e && "hide" in e && e.hide)
241
+ continue;
242
+ parts.push(e && "replace" in e && e.replace ? e.replace : p);
243
+ }
244
+ if (parts.length)
245
+ out.push({ ...m, parts });
246
+ }
247
+ return out;
248
+ }
249
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/extensions/compose.ts"],"names":[],"mappings":"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"}