@inbrowser/agent 0.1.0 → 0.3.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/LICENSE +21 -0
- package/README.md +2 -2
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/fixtures.d.ts +2 -2
- package/dist/cli/fixtures.d.ts.map +1 -1
- package/dist/cli/fixtures.js +7 -16
- package/dist/cli/fixtures.js.map +1 -1
- package/dist/cli/llm/openrouter.d.ts +4 -4
- package/dist/cli/llm/openrouter.d.ts.map +1 -1
- package/dist/cli/llm/openrouter.js +20 -31
- package/dist/cli/llm/openrouter.js.map +1 -1
- package/dist/diagnostics/index.d.ts +5 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +3 -0
- package/dist/diagnostics/index.js.map +1 -0
- package/dist/diagnostics/timing.d.ts +48 -0
- package/dist/diagnostics/timing.d.ts.map +1 -0
- package/dist/diagnostics/timing.js +85 -0
- package/dist/diagnostics/timing.js.map +1 -0
- package/dist/diagnostics/truthfulness.d.ts +36 -0
- package/dist/diagnostics/truthfulness.d.ts.map +1 -0
- package/dist/diagnostics/truthfulness.js +180 -0
- package/dist/diagnostics/truthfulness.js.map +1 -0
- package/dist/dispatch-memoization.d.ts +84 -0
- package/dist/dispatch-memoization.d.ts.map +1 -0
- package/dist/dispatch-memoization.js +197 -0
- package/dist/dispatch-memoization.js.map +1 -0
- package/dist/eval/comparison-report.d.ts +164 -0
- package/dist/eval/comparison-report.d.ts.map +1 -0
- package/dist/eval/comparison-report.js +316 -0
- package/dist/eval/comparison-report.js.map +1 -0
- package/dist/eval/fixture.d.ts +74 -0
- package/dist/eval/fixture.d.ts.map +1 -0
- package/dist/eval/fixture.js +217 -0
- package/dist/eval/fixture.js.map +1 -0
- package/dist/eval/index.d.ts +13 -0
- package/dist/eval/index.d.ts.map +1 -0
- package/dist/eval/index.js +7 -0
- package/dist/eval/index.js.map +1 -0
- package/dist/eval/load-node.d.ts +16 -0
- package/dist/eval/load-node.d.ts.map +1 -0
- package/dist/eval/load-node.js +58 -0
- package/dist/eval/load-node.js.map +1 -0
- package/dist/eval/metric-collector.d.ts +209 -0
- package/dist/eval/metric-collector.d.ts.map +1 -0
- package/dist/eval/metric-collector.js +293 -0
- package/dist/eval/metric-collector.js.map +1 -0
- package/dist/eval/run-record.d.ts +76 -0
- package/dist/eval/run-record.d.ts.map +1 -0
- package/dist/eval/run-record.js +32 -0
- package/dist/eval/run-record.js.map +1 -0
- package/dist/eval/runner.d.ts +140 -0
- package/dist/eval/runner.d.ts.map +1 -0
- package/dist/eval/runner.js +310 -0
- package/dist/eval/runner.js.map +1 -0
- package/dist/eval/spec-framework.d.ts +113 -0
- package/dist/eval/spec-framework.d.ts.map +1 -0
- package/dist/eval/spec-framework.js +100 -0
- package/dist/eval/spec-framework.js.map +1 -0
- package/dist/eval/spec-helpers.d.ts +245 -0
- package/dist/eval/spec-helpers.d.ts.map +1 -0
- package/dist/eval/spec-helpers.js +605 -0
- package/dist/eval/spec-helpers.js.map +1 -0
- package/dist/index.d.ts +32 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -3
- package/dist/index.js.map +1 -1
- package/dist/llm-adapter.d.ts +30 -34
- package/dist/llm-adapter.d.ts.map +1 -1
- package/dist/llm-adapter.js +61 -51
- package/dist/llm-adapter.js.map +1 -1
- package/dist/mcp/connect.d.ts +68 -0
- package/dist/mcp/connect.d.ts.map +1 -0
- package/dist/mcp/connect.js +111 -0
- package/dist/mcp/connect.js.map +1 -0
- package/dist/metrics.js +4 -4
- package/dist/metrics.js.map +1 -1
- package/dist/node.d.ts +3 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +2 -0
- package/dist/node.js.map +1 -1
- package/dist/planner-executor.d.ts +132 -0
- package/dist/planner-executor.d.ts.map +1 -0
- package/dist/planner-executor.js +274 -0
- package/dist/planner-executor.js.map +1 -0
- package/dist/retrieval.d.ts +74 -0
- package/dist/retrieval.d.ts.map +1 -0
- package/dist/retrieval.js +287 -0
- package/dist/retrieval.js.map +1 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +8 -2
- package/dist/session.js.map +1 -1
- package/dist/skill-catalog.d.ts +81 -0
- package/dist/skill-catalog.d.ts.map +1 -0
- package/dist/skill-catalog.js +388 -0
- package/dist/skill-catalog.js.map +1 -0
- package/dist/skill-router.d.ts +95 -0
- package/dist/skill-router.d.ts.map +1 -0
- package/dist/skill-router.js +130 -0
- package/dist/skill-router.js.map +1 -0
- package/dist/strategy.d.ts +22 -2
- package/dist/strategy.d.ts.map +1 -1
- package/dist/strategy.js +358 -28
- package/dist/strategy.js.map +1 -1
- package/dist/tools.d.ts +15 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +18 -0
- package/dist/tools.js.map +1 -1
- package/dist/types/agent.d.ts +2 -3
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js +1 -1
- package/dist/types/chat.d.ts +0 -15
- package/dist/types/chat.d.ts.map +1 -1
- package/dist/types/llm.d.ts +11 -64
- package/dist/types/llm.d.ts.map +1 -1
- package/dist/types/llm.js +7 -8
- package/dist/types/llm.js.map +1 -1
- package/dist/types/metrics.d.ts +2 -2
- package/dist/types/metrics.d.ts.map +1 -1
- package/dist/types/session.d.ts +2 -2
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/strategy.d.ts +60 -3
- package/dist/types/strategy.d.ts.map +1 -1
- package/dist/types/tools.d.ts +18 -0
- package/dist/types/tools.d.ts.map +1 -1
- package/dist/types/trace.d.ts +67 -15
- package/dist/types/trace.d.ts.map +1 -1
- package/dist/types/trace.js +5 -3
- package/dist/types/trace.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `createRetrievalStrategy()` — a code-orchestrated retrieve-then-read
|
|
3
|
+
* (RAG) `AgentStrategy`.
|
|
4
|
+
*
|
|
5
|
+
* Where `createReactLoopStrategy` lets the model drive — deciding when
|
|
6
|
+
* to call tools and when to stop — this strategy inverts the control
|
|
7
|
+
* flow. The *code* does the retrieval (search + read top-K docs); the
|
|
8
|
+
* model is invoked exactly ONCE, with NO tools advertised, to write a
|
|
9
|
+
* grounded answer from the retrieved excerpts. This is the
|
|
10
|
+
* "zero-agency" tier-1 shape from
|
|
11
|
+
* `plans/retrieval-strategy-and-eval.md`: a small model (e.g. SmolLM2
|
|
12
|
+
* 360M) that can't reliably emit tool calls or decide when to stop
|
|
13
|
+
* still does one thing well — grounded generation over stuffed context.
|
|
14
|
+
*
|
|
15
|
+
* Lifecycle (`run`):
|
|
16
|
+
*
|
|
17
|
+
* 1. SEARCH (code). Synthesize a tool-call id, emit `tool_call`
|
|
18
|
+
* for the search tool with `{ query: input.prompt }`, dispatch it
|
|
19
|
+
* through `input.tools.execute`, emit `tool_result`.
|
|
20
|
+
* 2. READ top-K (code). Pull routes from the search result via
|
|
21
|
+
* `extractRoutes`, take the first `topK`, and for each emit
|
|
22
|
+
* `tool_call`(read) → dispatch → `tool_result`. Collect the
|
|
23
|
+
* extracted text until `contextBudget` chars are reached.
|
|
24
|
+
* 3. COMPOSE. Build `[system, ...history, user(composeContext(...))]`
|
|
25
|
+
* the same way the ReAct loop's `buildMessages` does — except the
|
|
26
|
+
* final user message is the grounded context+question, not the
|
|
27
|
+
* raw prompt.
|
|
28
|
+
* 4. GENERATE. One `input.llm.chat({ messages, tools: [],
|
|
29
|
+
* toolUseEnabled: false })` call; map model `text` / `thinking` /
|
|
30
|
+
* `usage` / `error` events straight to `StrategyEvent`s.
|
|
31
|
+
* 5. `turn_complete` carrying the captured usage.
|
|
32
|
+
*
|
|
33
|
+
* It emits the SAME `tool_call` / `tool_result` / `text` event surface
|
|
34
|
+
* the ReAct loop does, so an existing host (cards, sources, streaming)
|
|
35
|
+
* works unchanged — the only difference is the events are driven by
|
|
36
|
+
* code, not the model.
|
|
37
|
+
*/
|
|
38
|
+
import type { AgentStrategy } from './types/strategy.js';
|
|
39
|
+
export interface RetrievalStrategyOpts {
|
|
40
|
+
/** Tool that returns candidate doc hits for a query. Default `'search_docs'`. */
|
|
41
|
+
searchTool?: string;
|
|
42
|
+
/** Tool that returns a single doc's content by route. Default `'get_doc'`. */
|
|
43
|
+
readTool?: string;
|
|
44
|
+
/** How many of the search hits to read. Default 3. */
|
|
45
|
+
topK?: number;
|
|
46
|
+
/**
|
|
47
|
+
* Pull the routes to read from the search tool's `ToolResult.data`.
|
|
48
|
+
* Default: `(d as { hits: { route }[] }).hits.map((h) => h.route)`.
|
|
49
|
+
*/
|
|
50
|
+
extractRoutes?(searchData: unknown): string[];
|
|
51
|
+
/**
|
|
52
|
+
* Pull the context text from a read tool's `ToolResult.data`.
|
|
53
|
+
* Default: from `{ route, title, body }`.
|
|
54
|
+
*/
|
|
55
|
+
extractText?(readData: unknown): {
|
|
56
|
+
route: string;
|
|
57
|
+
title: string;
|
|
58
|
+
text: string;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Build the grounded user message from the question + retrieved docs.
|
|
62
|
+
* Default: an instruction to answer ONLY from the excerpts and cite
|
|
63
|
+
* the route(s), the labeled excerpts, then the question.
|
|
64
|
+
*/
|
|
65
|
+
composeContext?(question: string, docs: {
|
|
66
|
+
route: string;
|
|
67
|
+
title: string;
|
|
68
|
+
text: string;
|
|
69
|
+
}[]): string;
|
|
70
|
+
/** Cap on total context chars fed to the model. Default ~6000. */
|
|
71
|
+
contextBudget?: number;
|
|
72
|
+
}
|
|
73
|
+
export declare function createRetrievalStrategy(opts?: RetrievalStrategyOpts): AgentStrategy;
|
|
74
|
+
//# sourceMappingURL=retrieval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retrieval.d.ts","sourceRoot":"","sources":["../src/retrieval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAmC,MAAM,qBAAqB,CAAC;AAE1F,MAAM,WAAW,qBAAqB;IACpC,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,aAAa,CAAC,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,EAAE,CAAC;IAC9C;;;OAGG;IACH,WAAW,CAAC,CAAC,QAAQ,EAAE,OAAO,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAChF;;;;OAIG;IACH,cAAc,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,MAAM,CAAC;IAClG,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAoHD,wBAAgB,uBAAuB,CAAC,IAAI,GAAE,qBAA0B,GAAG,aAAa,CA4JvF"}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `createRetrievalStrategy()` — a code-orchestrated retrieve-then-read
|
|
3
|
+
* (RAG) `AgentStrategy`.
|
|
4
|
+
*
|
|
5
|
+
* Where `createReactLoopStrategy` lets the model drive — deciding when
|
|
6
|
+
* to call tools and when to stop — this strategy inverts the control
|
|
7
|
+
* flow. The *code* does the retrieval (search + read top-K docs); the
|
|
8
|
+
* model is invoked exactly ONCE, with NO tools advertised, to write a
|
|
9
|
+
* grounded answer from the retrieved excerpts. This is the
|
|
10
|
+
* "zero-agency" tier-1 shape from
|
|
11
|
+
* `plans/retrieval-strategy-and-eval.md`: a small model (e.g. SmolLM2
|
|
12
|
+
* 360M) that can't reliably emit tool calls or decide when to stop
|
|
13
|
+
* still does one thing well — grounded generation over stuffed context.
|
|
14
|
+
*
|
|
15
|
+
* Lifecycle (`run`):
|
|
16
|
+
*
|
|
17
|
+
* 1. SEARCH (code). Synthesize a tool-call id, emit `tool_call`
|
|
18
|
+
* for the search tool with `{ query: input.prompt }`, dispatch it
|
|
19
|
+
* through `input.tools.execute`, emit `tool_result`.
|
|
20
|
+
* 2. READ top-K (code). Pull routes from the search result via
|
|
21
|
+
* `extractRoutes`, take the first `topK`, and for each emit
|
|
22
|
+
* `tool_call`(read) → dispatch → `tool_result`. Collect the
|
|
23
|
+
* extracted text until `contextBudget` chars are reached.
|
|
24
|
+
* 3. COMPOSE. Build `[system, ...history, user(composeContext(...))]`
|
|
25
|
+
* the same way the ReAct loop's `buildMessages` does — except the
|
|
26
|
+
* final user message is the grounded context+question, not the
|
|
27
|
+
* raw prompt.
|
|
28
|
+
* 4. GENERATE. One `input.llm.chat({ messages, tools: [],
|
|
29
|
+
* toolUseEnabled: false })` call; map model `text` / `thinking` /
|
|
30
|
+
* `usage` / `error` events straight to `StrategyEvent`s.
|
|
31
|
+
* 5. `turn_complete` carrying the captured usage.
|
|
32
|
+
*
|
|
33
|
+
* It emits the SAME `tool_call` / `tool_result` / `text` event surface
|
|
34
|
+
* the ReAct loop does, so an existing host (cards, sources, streaming)
|
|
35
|
+
* works unchanged — the only difference is the events are driven by
|
|
36
|
+
* code, not the model.
|
|
37
|
+
*/
|
|
38
|
+
const DEFAULT_SEARCH_TOOL = 'search_docs';
|
|
39
|
+
const DEFAULT_READ_TOOL = 'get_doc';
|
|
40
|
+
const DEFAULT_TOP_K = 3;
|
|
41
|
+
const DEFAULT_CONTEXT_BUDGET = 6000;
|
|
42
|
+
/** Default route extractor: `data.hits[].route`. Defensive against
|
|
43
|
+
* any non-conforming shape — returns `[]` rather than throwing so the
|
|
44
|
+
* strategy still completes (generating from whatever context it has). */
|
|
45
|
+
function defaultExtractRoutes(searchData) {
|
|
46
|
+
if (!searchData || typeof searchData !== 'object')
|
|
47
|
+
return [];
|
|
48
|
+
const hits = searchData.hits;
|
|
49
|
+
if (!Array.isArray(hits))
|
|
50
|
+
return [];
|
|
51
|
+
const routes = [];
|
|
52
|
+
for (const hit of hits) {
|
|
53
|
+
if (hit && typeof hit === 'object') {
|
|
54
|
+
const route = hit.route;
|
|
55
|
+
if (typeof route === 'string' && route.length > 0)
|
|
56
|
+
routes.push(route);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return routes;
|
|
60
|
+
}
|
|
61
|
+
/** Default text extractor: from `{ route, title, body }`. */
|
|
62
|
+
function defaultExtractText(readData) {
|
|
63
|
+
const obj = (readData && typeof readData === 'object' ? readData : {});
|
|
64
|
+
return {
|
|
65
|
+
route: typeof obj.route === 'string' ? obj.route : '',
|
|
66
|
+
title: typeof obj.title === 'string' ? obj.title : '',
|
|
67
|
+
text: typeof obj.body === 'string' ? obj.body : '',
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/** Default context composer: a tight grounding instruction, the
|
|
71
|
+
* labeled excerpts, then the question. Mirrors the wording in the
|
|
72
|
+
* plan: answer ONLY from the excerpts + cite the route(s). */
|
|
73
|
+
function defaultComposeContext(question, docs) {
|
|
74
|
+
const instruction = 'Answer the question using ONLY the documentation excerpts below. ' +
|
|
75
|
+
'Cite the route(s) you used. If the answer is not in the excerpts, say so.';
|
|
76
|
+
const excerpts = docs.map((doc) => `--- [${doc.route}] ${doc.title}\n${doc.text}`).join('\n\n');
|
|
77
|
+
const excerptBlock = excerpts.length > 0 ? excerpts : '(no documentation excerpts were retrieved)';
|
|
78
|
+
return `${instruction}\n\n${excerptBlock}\n\nQuestion: ${question}`;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Build `[system, ...history, user(<groundedContext>)]`. Identical to
|
|
82
|
+
* the ReAct loop's `buildMessages` except the trailing user message is
|
|
83
|
+
* the grounded context rather than the raw prompt. This strategy never
|
|
84
|
+
* encodes assistant tool-calls of its own — the only tool activity is
|
|
85
|
+
* the code-driven retrieval, which the model never sees.
|
|
86
|
+
*/
|
|
87
|
+
function buildMessages(input, groundedUserText) {
|
|
88
|
+
const out = [];
|
|
89
|
+
out.push({ role: 'system', text: input.systemPrompt });
|
|
90
|
+
for (const m of input.history) {
|
|
91
|
+
if (m.role === 'system')
|
|
92
|
+
continue; // already emitted
|
|
93
|
+
if (m.role === 'assistant') {
|
|
94
|
+
const tc = m.toolCalls?.map((c) => ({
|
|
95
|
+
id: c.id,
|
|
96
|
+
name: c.name,
|
|
97
|
+
args: safeParse(c.argsJson),
|
|
98
|
+
...(c.signature ? { signature: c.signature } : {}),
|
|
99
|
+
})) ?? [];
|
|
100
|
+
out.push({
|
|
101
|
+
role: 'assistant',
|
|
102
|
+
text: m.text,
|
|
103
|
+
...(tc.length > 0 ? { toolCalls: tc } : {}),
|
|
104
|
+
});
|
|
105
|
+
for (const c of m.toolCalls ?? []) {
|
|
106
|
+
if (c.resultJson !== undefined) {
|
|
107
|
+
out.push({
|
|
108
|
+
role: 'tool',
|
|
109
|
+
toolCallId: c.id,
|
|
110
|
+
name: c.name,
|
|
111
|
+
resultJson: c.resultJson,
|
|
112
|
+
text: '',
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
out.push({ role: m.role, text: m.text });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
out.push({ role: 'user', text: groundedUserText });
|
|
122
|
+
return out;
|
|
123
|
+
}
|
|
124
|
+
function safeParse(s) {
|
|
125
|
+
try {
|
|
126
|
+
return JSON.parse(s);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return s;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
let idSeq = 0;
|
|
133
|
+
/** Per-call id for the synthetic, code-driven tool calls. Mirrors the
|
|
134
|
+
* ReAct loop's per-iteration `requestId` discipline — the host only
|
|
135
|
+
* needs the id to be stable + unique across a single run so it can
|
|
136
|
+
* pair `tool_call` with `tool_result`. */
|
|
137
|
+
function rid(prefix) {
|
|
138
|
+
idSeq += 1;
|
|
139
|
+
return `${prefix}-${Date.now().toString(36)}-${idSeq}`;
|
|
140
|
+
}
|
|
141
|
+
export function createRetrievalStrategy(opts = {}) {
|
|
142
|
+
const searchTool = opts.searchTool ?? DEFAULT_SEARCH_TOOL;
|
|
143
|
+
const readTool = opts.readTool ?? DEFAULT_READ_TOOL;
|
|
144
|
+
const topK = opts.topK ?? DEFAULT_TOP_K;
|
|
145
|
+
const extractRoutes = opts.extractRoutes ?? defaultExtractRoutes;
|
|
146
|
+
const extractText = opts.extractText ?? defaultExtractText;
|
|
147
|
+
const composeContext = opts.composeContext ?? defaultComposeContext;
|
|
148
|
+
const contextBudget = opts.contextBudget ?? DEFAULT_CONTEXT_BUDGET;
|
|
149
|
+
return {
|
|
150
|
+
id: 'retrieval',
|
|
151
|
+
async *run(input, signal) {
|
|
152
|
+
if (signal.aborted) {
|
|
153
|
+
yield { kind: 'error', message: 'aborted' };
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
// 1. SEARCH (code-driven). Emit the same `tool_call` /
|
|
157
|
+
// `tool_result` surface the ReAct loop emits for a model-driven
|
|
158
|
+
// call, so the host's "searching" UI + Sources work unchanged.
|
|
159
|
+
const searchId = rid('search');
|
|
160
|
+
yield { kind: 'tool_call', id: searchId, name: searchTool, args: { query: input.prompt } };
|
|
161
|
+
const searchResult = await input.tools.execute({ id: searchId, name: searchTool, args: { query: input.prompt } }, input.toolContext());
|
|
162
|
+
yield { kind: 'tool_result', id: searchId, result: searchResult };
|
|
163
|
+
// 2. READ top-K (code-driven). Even when search failed or
|
|
164
|
+
// returned no usable routes we still proceed to generate — the
|
|
165
|
+
// model grounds on whatever context we managed to collect (or
|
|
166
|
+
// on an explicit "nothing retrieved" note). It never crashes.
|
|
167
|
+
const routes = searchResult.ok ? extractRoutes(searchResult.data).slice(0, topK) : [];
|
|
168
|
+
const docs = [];
|
|
169
|
+
let usedChars = 0;
|
|
170
|
+
for (const route of routes) {
|
|
171
|
+
if (signal.aborted) {
|
|
172
|
+
yield { kind: 'error', message: 'aborted' };
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
if (usedChars >= contextBudget)
|
|
176
|
+
break;
|
|
177
|
+
const readId = rid('read');
|
|
178
|
+
yield { kind: 'tool_call', id: readId, name: readTool, args: { route } };
|
|
179
|
+
const readResult = await input.tools.execute({ id: readId, name: readTool, args: { route } }, input.toolContext());
|
|
180
|
+
yield { kind: 'tool_result', id: readId, result: readResult };
|
|
181
|
+
if (!readResult.ok)
|
|
182
|
+
continue;
|
|
183
|
+
const doc = extractText(readResult.data);
|
|
184
|
+
// Trim the excerpt so the running total never exceeds the
|
|
185
|
+
// budget — a small local model can't hold several full bodies.
|
|
186
|
+
const remaining = contextBudget - usedChars;
|
|
187
|
+
const text = doc.text.length > remaining ? doc.text.slice(0, remaining) : doc.text;
|
|
188
|
+
docs.push({ route: doc.route, title: doc.title, text });
|
|
189
|
+
usedChars += text.length;
|
|
190
|
+
}
|
|
191
|
+
if (signal.aborted) {
|
|
192
|
+
yield { kind: 'error', message: 'aborted' };
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
// 3. COMPOSE. The model's only input is system + history + the
|
|
196
|
+
// grounded question. No tools are advertised → no tool-call
|
|
197
|
+
// parsing, no loop.
|
|
198
|
+
const groundedUserText = composeContext(input.prompt, docs);
|
|
199
|
+
const messages = buildMessages(input, groundedUserText);
|
|
200
|
+
const chatRequest = {
|
|
201
|
+
messages,
|
|
202
|
+
tools: [],
|
|
203
|
+
toolUseEnabled: false,
|
|
204
|
+
};
|
|
205
|
+
// Emit the trace BEFORE dispatch — same agent-layer view the
|
|
206
|
+
// ReAct loop captures. A single-iteration run, so iteration 0.
|
|
207
|
+
const turnIdForReq = input.turnId ?? 'turn-anon';
|
|
208
|
+
const requestId = `${turnIdForReq}#0`;
|
|
209
|
+
if (input.tracer) {
|
|
210
|
+
input.tracer.emit({
|
|
211
|
+
kind: 'llm_request',
|
|
212
|
+
data: {
|
|
213
|
+
requestId,
|
|
214
|
+
turnId: turnIdForReq,
|
|
215
|
+
iteration: 0,
|
|
216
|
+
ts: Date.now(),
|
|
217
|
+
systemPrompt: input.systemPrompt,
|
|
218
|
+
messages: messages.map((m) => ({ ...m })),
|
|
219
|
+
tools: [],
|
|
220
|
+
llm: { id: input.llm.id, supportsTools: input.llm.supportsTools },
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
// 4. GENERATE (the model's ONLY job).
|
|
225
|
+
let turnUsage;
|
|
226
|
+
const turnDetails = { requestedModel: input.llm.id };
|
|
227
|
+
let assistantText = '';
|
|
228
|
+
let assistantThinking = '';
|
|
229
|
+
for await (const ev of input.llm.chat(chatRequest, signal)) {
|
|
230
|
+
if (ev.kind === 'text') {
|
|
231
|
+
assistantText += ev.text;
|
|
232
|
+
yield { kind: 'text', chunk: ev.text };
|
|
233
|
+
}
|
|
234
|
+
else if (ev.kind === 'thinking') {
|
|
235
|
+
assistantThinking += ev.text;
|
|
236
|
+
yield { kind: 'thinking', chunk: ev.text };
|
|
237
|
+
}
|
|
238
|
+
else if (ev.kind === 'usage') {
|
|
239
|
+
turnUsage = ev.usage;
|
|
240
|
+
}
|
|
241
|
+
else if (ev.kind === 'error') {
|
|
242
|
+
yield { kind: 'error', message: ev.message };
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
// `tool_call` events are impossible here (toolUseEnabled:false,
|
|
246
|
+
// no tools advertised); a misbehaving stub that emits one is
|
|
247
|
+
// ignored rather than dispatched — this is a zero-agency
|
|
248
|
+
// strategy and the code already retrieved everything.
|
|
249
|
+
}
|
|
250
|
+
// Pair the `llm_request` with its response — the closing endpoint
|
|
251
|
+
// of this run's language-model wall-clock segment.
|
|
252
|
+
if (input.tracer) {
|
|
253
|
+
input.tracer.emit({
|
|
254
|
+
kind: 'llm_response',
|
|
255
|
+
data: {
|
|
256
|
+
requestId,
|
|
257
|
+
ts: Date.now(),
|
|
258
|
+
text: assistantText,
|
|
259
|
+
thinking: assistantThinking,
|
|
260
|
+
toolCalls: [],
|
|
261
|
+
...(turnUsage
|
|
262
|
+
? {
|
|
263
|
+
usage: {
|
|
264
|
+
promptTokens: turnUsage.promptTokens,
|
|
265
|
+
outputTokens: turnUsage.outputTokens,
|
|
266
|
+
...(turnUsage.cachedTokens !== undefined
|
|
267
|
+
? { cachedTokens: turnUsage.cachedTokens }
|
|
268
|
+
: {}),
|
|
269
|
+
},
|
|
270
|
+
}
|
|
271
|
+
: {}),
|
|
272
|
+
},
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
// 5. turn_complete. Synthesize a zero-usage accounting when the
|
|
276
|
+
// stub never emitted a `usage` event so the strategy always
|
|
277
|
+
// terminates with a `turn_complete` (the contract a host
|
|
278
|
+
// relies on), matching the plan.
|
|
279
|
+
yield {
|
|
280
|
+
kind: 'turn_complete',
|
|
281
|
+
usage: turnUsage ?? { promptTokens: 0, outputTokens: 0 },
|
|
282
|
+
details: turnDetails,
|
|
283
|
+
};
|
|
284
|
+
},
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=retrieval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retrieval.js","sourceRoot":"","sources":["../src/retrieval.ts"],"names":[],"mappings":"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"}
|
package/dist/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAgB,MAAM,oBAAoB,CAAC;AAOzF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAgB,MAAM,oBAAoB,CAAC;AAOzF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CAsI3E"}
|
package/dist/session.js
CHANGED
|
@@ -47,7 +47,13 @@ export function createAgentSession(config) {
|
|
|
47
47
|
async function* run(prompt, signal) {
|
|
48
48
|
const turnId = `t-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`;
|
|
49
49
|
yield { kind: 'turn_started', turnId };
|
|
50
|
-
//
|
|
50
|
+
// The strategy receives the PRE-prompt history — everything
|
|
51
|
+
// before this turn's prompt — and appends `prompt` itself when
|
|
52
|
+
// composing messages. Passing the post-append history here would
|
|
53
|
+
// make every LLM request carry the user prompt twice.
|
|
54
|
+
const priorHistory = history;
|
|
55
|
+
// Capture the user message in the session's own history so the
|
|
56
|
+
// next turn (and persistence) sees it.
|
|
51
57
|
const userMsg = {
|
|
52
58
|
id: `u-${turnId}`,
|
|
53
59
|
role: 'user',
|
|
@@ -58,7 +64,7 @@ export function createAgentSession(config) {
|
|
|
58
64
|
const systemPrompt = config.systemPromptBuilder(workspace, runtime);
|
|
59
65
|
const strategyEvents = config.strategy.run({
|
|
60
66
|
prompt,
|
|
61
|
-
history,
|
|
67
|
+
history: priorHistory,
|
|
62
68
|
workspace,
|
|
63
69
|
runtime,
|
|
64
70
|
llm: config.llm,
|
package/dist/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,IAAI,cAAc,GAAG,CAAC,CAAC;AAEvB,MAAM,UAAU,kBAAkB,CAAC,MAA0B;IAC3D,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,WAAW,EAAE,cAAc,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;IACjF,IAAI,SAAS,GAAc,eAAe,CACxC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,CACjF,CAAC;IACF,IAAI,OAAO,GAAiB,cAAc,EAAE,CAAC;IAC7C,IAAI,OAAO,GAAkB,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,YAAY,GAA2B,IAAI,CAAC;IAEhD,MAAM,OAAO,GAAiB;QAC5B,EAAE;QACF,IAAI,SAAS;YACX,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,OAAO;YACT,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,CAAC,MAAM,EAAE,cAAc;YAC3B,0DAA0D;YAC1D,+CAA+C;YAC/C,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;YACpC,YAAY,GAAG,KAAK,CAAC;YACrB,MAAM,MAAM,GAAG,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACzD,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM;YACJ,YAAY,EAAE,KAAK,EAAE,CAAC;QACxB,CAAC;KACF,CAAC;IAEF,SAAS,aAAa,CAAC,KAAqC;QAC1D,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,SAAS,GAAG,eAAe,CAAC,EAAE,GAAG,SAAS,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,SAAS,WAAW,CAAC,KAAwC;QAC3D,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,OAAO,GAAG,aAAa,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,MAAc,EAAE,MAAmB;QACrD,MAAM,MAAM,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACxF,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;QAEvC,
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static catalog of skill workflows.
|
|
3
|
+
*
|
|
4
|
+
* Phase five of the implementation plan splits the planner-executor work
|
|
5
|
+
* into three branches: this catalog, the router that classifies a user
|
|
6
|
+
* prompt against the catalog, and the executor that walks a chosen
|
|
7
|
+
* skill's prescribed step sequence. This module is the data + types
|
|
8
|
+
* gate — no runtime logic. The router reads `triggerHints` to score
|
|
9
|
+
* candidate matches; the executor reads `steps` to materialize a plan.
|
|
10
|
+
*
|
|
11
|
+
* Each entry's `name` matches a value in the `SkillName` enum from
|
|
12
|
+
* `eval/fixture.ts` (re-exported here for convenience). Step
|
|
13
|
+
* descriptions are imperative, short, and model-agnostic. Per-step
|
|
14
|
+
* `verifier?` references existing starter / custom specs where one
|
|
15
|
+
* fits naturally; not every step has one. Leaf "compile / deploy /
|
|
16
|
+
* verify" steps tend to have a spec; intermediate read / draft steps
|
|
17
|
+
* usually don't.
|
|
18
|
+
*
|
|
19
|
+
* The catalog is hand-authored and intentionally `const`. The
|
|
20
|
+
* companion test in `test/skill-catalog.test.ts` asserts shape
|
|
21
|
+
* invariants: every `name` is in `SKILL_NAMES`, every entry has at
|
|
22
|
+
* least three trigger hints, every entry has between four and nine
|
|
23
|
+
* steps, every step id is unique and kebab-case within its plan, and
|
|
24
|
+
* every `verifier?.name` matches a spec registered by
|
|
25
|
+
* `registerAllSpecs(createSpecRegistry())`.
|
|
26
|
+
*/
|
|
27
|
+
import type { SkillName, SuccessSpecReference } from './eval/fixture.js';
|
|
28
|
+
/**
|
|
29
|
+
* One ordered step in a skill's prescribed workflow.
|
|
30
|
+
*
|
|
31
|
+
* `id` is a stable kebab-case identifier, unique within the parent
|
|
32
|
+
* plan. The executor uses it as the scratch key for the step's
|
|
33
|
+
* bounded sub-loop. `description` is an imperative one-liner — what
|
|
34
|
+
* the step does, in the project's voice. `verifier?` is an optional
|
|
35
|
+
* `SuccessSpecReference` the executor can run after the step finishes
|
|
36
|
+
* to gate whether the plan advances; the same shape that fixtures
|
|
37
|
+
* use, so the executor can re-use `evaluateSpec` without translation.
|
|
38
|
+
*/
|
|
39
|
+
export interface PlanStep {
|
|
40
|
+
/** Stable kebab-case id, unique within the plan. */
|
|
41
|
+
id: string;
|
|
42
|
+
/** Short imperative description of what the step does. */
|
|
43
|
+
description: string;
|
|
44
|
+
/** Optional reference to a success spec that verifies this step. */
|
|
45
|
+
verifier?: SuccessSpecReference;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* One row in the skill catalog. Describes a single skill workflow as
|
|
49
|
+
* a triple of (router signals, plan, identity).
|
|
50
|
+
*/
|
|
51
|
+
export interface SkillCatalogEntry {
|
|
52
|
+
/** Matches a value in `SKILL_NAMES` from `eval/fixture.ts`. */
|
|
53
|
+
name: SkillName;
|
|
54
|
+
/** One-line description used by the router and surfaced in the plan. */
|
|
55
|
+
description: string;
|
|
56
|
+
/**
|
|
57
|
+
* Lowercase keyword tokens the router scans the user prompt for.
|
|
58
|
+
* Order does not matter; at least one hit signals a candidate match.
|
|
59
|
+
*/
|
|
60
|
+
triggerHints: readonly string[];
|
|
61
|
+
/** Prescribed workflow as an ordered sequence of steps. */
|
|
62
|
+
steps: readonly PlanStep[];
|
|
63
|
+
}
|
|
64
|
+
/** Read-only view over the catalog. */
|
|
65
|
+
export type SkillCatalog = readonly SkillCatalogEntry[];
|
|
66
|
+
export declare const SKILL_CATALOG: SkillCatalog;
|
|
67
|
+
/**
|
|
68
|
+
* Look up a catalog entry by skill name. Returns `undefined` when the
|
|
69
|
+
* name is not in the catalog. The router will use this to materialize
|
|
70
|
+
* an entry after picking a winner; the executor will use it to
|
|
71
|
+
* unwrap a router decision into a plan.
|
|
72
|
+
*/
|
|
73
|
+
export declare function getSkillEntry(name: SkillName): SkillCatalogEntry | undefined;
|
|
74
|
+
/**
|
|
75
|
+
* List every skill name present in the catalog, in catalog order. The
|
|
76
|
+
* router uses this to iterate candidates when scoring a prompt; the
|
|
77
|
+
* test suite uses it to assert the catalog covers every value in
|
|
78
|
+
* `SKILL_NAMES`.
|
|
79
|
+
*/
|
|
80
|
+
export declare function listSkillNames(): readonly SkillName[];
|
|
81
|
+
//# sourceMappingURL=skill-catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-catalog.d.ts","sourceRoot":"","sources":["../src/skill-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAWzE;;;;;;;;;;GAUG;AACH,MAAM,WAAW,QAAQ;IACvB,oDAAoD;IACpD,EAAE,EAAE,MAAM,CAAC;IACX,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,oBAAoB,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,+DAA+D;IAC/D,IAAI,EAAE,SAAS,CAAC;IAChB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,2DAA2D;IAC3D,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;CAC5B;AAED,uCAAuC;AACvC,MAAM,MAAM,YAAY,GAAG,SAAS,iBAAiB,EAAE,CAAC;AAQxD,eAAO,MAAM,aAAa,EAAE,YA8V3B,CAAC;AAcF;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAE5E;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,SAAS,SAAS,EAAE,CAErD"}
|