@lloyal-labs/rig 2.1.0 → 3.0.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.
Files changed (100) hide show
  1. package/LICENSE +107 -0
  2. package/LICENSE-FAQ.md +256 -0
  3. package/README.md +78 -72
  4. package/dist/bundle.d.ts +211 -0
  5. package/dist/bundle.d.ts.map +1 -0
  6. package/dist/bundle.js +296 -0
  7. package/dist/bundle.js.map +1 -0
  8. package/dist/cancellable-fetch.d.ts +98 -0
  9. package/dist/cancellable-fetch.d.ts.map +1 -0
  10. package/dist/cancellable-fetch.js +133 -0
  11. package/dist/cancellable-fetch.js.map +1 -0
  12. package/dist/config-store.d.ts +30 -0
  13. package/dist/config-store.d.ts.map +1 -0
  14. package/dist/config-store.js +45 -0
  15. package/dist/config-store.js.map +1 -0
  16. package/dist/define-app.d.ts +98 -0
  17. package/dist/define-app.d.ts.map +1 -0
  18. package/dist/define-app.js +232 -0
  19. package/dist/define-app.js.map +1 -0
  20. package/dist/grant-store.d.ts +31 -0
  21. package/dist/grant-store.d.ts.map +1 -0
  22. package/dist/grant-store.js +49 -0
  23. package/dist/grant-store.js.map +1 -0
  24. package/dist/index.d.ts +13 -6
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +37 -11
  27. package/dist/index.js.map +1 -1
  28. package/dist/node.d.ts +3 -2
  29. package/dist/node.d.ts.map +1 -1
  30. package/dist/node.js +3 -2
  31. package/dist/node.js.map +1 -1
  32. package/dist/protocol.d.ts +155 -0
  33. package/dist/protocol.d.ts.map +1 -0
  34. package/dist/protocol.js +184 -0
  35. package/dist/protocol.js.map +1 -0
  36. package/dist/registry.d.ts +87 -0
  37. package/dist/registry.d.ts.map +1 -0
  38. package/dist/registry.js +245 -0
  39. package/dist/registry.js.map +1 -0
  40. package/dist/reranker.d.ts +25 -7
  41. package/dist/reranker.d.ts.map +1 -1
  42. package/dist/reranker.js +103 -63
  43. package/dist/reranker.js.map +1 -1
  44. package/dist/resources/types.d.ts +10 -37
  45. package/dist/resources/types.d.ts.map +1 -1
  46. package/dist/resources/types.js +12 -0
  47. package/dist/resources/types.js.map +1 -1
  48. package/dist/spine-render.d.ts +97 -0
  49. package/dist/spine-render.d.ts.map +1 -0
  50. package/dist/spine-render.js +121 -0
  51. package/dist/spine-render.js.map +1 -0
  52. package/dist/tools/index.d.ts +26 -22
  53. package/dist/tools/index.d.ts.map +1 -1
  54. package/dist/tools/index.js +24 -28
  55. package/dist/tools/index.js.map +1 -1
  56. package/dist/tools/keyless-search.d.ts +67 -0
  57. package/dist/tools/keyless-search.d.ts.map +1 -0
  58. package/dist/tools/keyless-search.js +401 -0
  59. package/dist/tools/keyless-search.js.map +1 -0
  60. package/dist/tools/plan.d.ts +31 -4
  61. package/dist/tools/plan.d.ts.map +1 -1
  62. package/dist/tools/plan.js +46 -11
  63. package/dist/tools/plan.js.map +1 -1
  64. package/dist/tools/types.d.ts +12 -56
  65. package/dist/tools/types.d.ts.map +1 -1
  66. package/dist/tools/types.js +17 -0
  67. package/dist/tools/types.js.map +1 -1
  68. package/dist/tools/web-search.d.ts +9 -25
  69. package/dist/tools/web-search.d.ts.map +1 -1
  70. package/dist/tools/web-search.js +11 -119
  71. package/dist/tools/web-search.js.map +1 -1
  72. package/package.json +9 -6
  73. package/dist/sources/corpus.d.ts +0 -80
  74. package/dist/sources/corpus.d.ts.map +0 -1
  75. package/dist/sources/corpus.js +0 -100
  76. package/dist/sources/corpus.js.map +0 -1
  77. package/dist/sources/index.d.ts +0 -12
  78. package/dist/sources/index.d.ts.map +0 -1
  79. package/dist/sources/index.js +0 -14
  80. package/dist/sources/index.js.map +0 -1
  81. package/dist/sources/web.d.ts +0 -67
  82. package/dist/sources/web.d.ts.map +0 -1
  83. package/dist/sources/web.js +0 -104
  84. package/dist/sources/web.js.map +0 -1
  85. package/dist/tools/fetch-page.d.ts +0 -48
  86. package/dist/tools/fetch-page.d.ts.map +0 -1
  87. package/dist/tools/fetch-page.js +0 -309
  88. package/dist/tools/fetch-page.js.map +0 -1
  89. package/dist/tools/grep.d.ts +0 -35
  90. package/dist/tools/grep.d.ts.map +0 -1
  91. package/dist/tools/grep.js +0 -84
  92. package/dist/tools/grep.js.map +0 -1
  93. package/dist/tools/read-file.d.ts +0 -74
  94. package/dist/tools/read-file.d.ts.map +0 -1
  95. package/dist/tools/read-file.js +0 -192
  96. package/dist/tools/read-file.js.map +0 -1
  97. package/dist/tools/search.d.ts +0 -34
  98. package/dist/tools/search.d.ts.map +0 -1
  99. package/dist/tools/search.js +0 -101
  100. package/dist/tools/search.js.map +0 -1
@@ -0,0 +1,401 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createKeylessSearchProvider = createKeylessSearchProvider;
4
+ const effection_1 = require("effection");
5
+ const lloyal_agents_1 = require("@lloyal-labs/lloyal-agents");
6
+ // ── Endpoints ───────────────────────────────────────────────────
7
+ const DDG_URL = "https://html.duckduckgo.com/html/";
8
+ const MARGINALIA_URL = "https://api2.marginalia-search.com/search";
9
+ const DEFAULT_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15";
10
+ const TRACKING_PARAMS = new Set([
11
+ "utm_source",
12
+ "utm_medium",
13
+ "utm_campaign",
14
+ "utm_term",
15
+ "utm_content",
16
+ "gclid",
17
+ "fbclid",
18
+ "mc_cid",
19
+ "mc_eid",
20
+ "ref",
21
+ "ref_src",
22
+ ]);
23
+ function createBreaker(threshold, cooldownMs) {
24
+ let state = "closed";
25
+ let failures = 0;
26
+ let openedAt = 0;
27
+ return {
28
+ canProceed() {
29
+ if (state === "closed" || state === "half-open")
30
+ return true;
31
+ if (Date.now() - openedAt >= cooldownMs) {
32
+ state = "half-open";
33
+ return true;
34
+ }
35
+ return false;
36
+ },
37
+ onSuccess() {
38
+ state = "closed";
39
+ failures = 0;
40
+ },
41
+ onHardFailure() {
42
+ if (state === "half-open") {
43
+ state = "open";
44
+ openedAt = Date.now();
45
+ failures = threshold;
46
+ return;
47
+ }
48
+ failures++;
49
+ if (failures >= threshold) {
50
+ state = "open";
51
+ openedAt = Date.now();
52
+ }
53
+ },
54
+ get state() {
55
+ return state;
56
+ },
57
+ };
58
+ }
59
+ /**
60
+ * Scope-owned shared pacer. A single internal `spawn` loop pops one waiter
61
+ * per jittered interval. Concurrent callers wait their turn via `action()`;
62
+ * the action's cleanup deregisters a waiter if its caller scope halts before
63
+ * release, so cancelled callers never resolve into a stale slot.
64
+ *
65
+ * No timestamp arithmetic per caller — central loop owns all timing.
66
+ */
67
+ function useRequestPacer(opts) {
68
+ return (0, effection_1.resource)(function* (provide) {
69
+ const waiters = [];
70
+ yield* (0, effection_1.spawn)(function* () {
71
+ while (true) {
72
+ const delay = opts.baseMs + Math.floor(Math.random() * opts.jitterMs);
73
+ yield* opts.sleepOp(delay);
74
+ const next = waiters.shift();
75
+ if (next)
76
+ next();
77
+ }
78
+ });
79
+ yield* provide({
80
+ acquire() {
81
+ return (0, effection_1.action)((resolve) => {
82
+ const fn = () => resolve();
83
+ waiters.push(fn);
84
+ return () => {
85
+ const i = waiters.indexOf(fn);
86
+ if (i >= 0)
87
+ waiters.splice(i, 1);
88
+ };
89
+ });
90
+ },
91
+ });
92
+ });
93
+ }
94
+ // ── Internal: cancellable HTTP ──────────────────────────────────
95
+ class HardFailure extends Error {
96
+ }
97
+ /**
98
+ * Effection-native cancellable timeout. `race` halts the loser on win, and
99
+ * `useAbortSignal` aborts the underlying socket when the http leg is halted.
100
+ * If the timeout wins, `HardFailure` is thrown and the in-flight fetch is
101
+ * genuinely cancelled — not abandoned.
102
+ */
103
+ function* fetchWithTimeout(url, init, timeoutMs, fetchImpl, sleepOp) {
104
+ const httpLeg = function* () {
105
+ const signal = yield* (0, effection_1.useAbortSignal)();
106
+ const res = yield* (0, effection_1.call)(() => fetchImpl(url, { ...init, signal }));
107
+ const text = yield* (0, effection_1.call)(() => res.text());
108
+ return { status: res.status, text };
109
+ };
110
+ const timeoutLeg = function* () {
111
+ yield* sleepOp(timeoutMs);
112
+ throw new HardFailure(`Request timed out after ${timeoutMs}ms`);
113
+ };
114
+ return yield* (0, effection_1.race)([httpLeg(), timeoutLeg()]);
115
+ }
116
+ // ── Internal: DDG parsing ───────────────────────────────────────
117
+ const HTML_ENTITY_RE = /&(amp|lt|gt|quot|#x27|#39);/g;
118
+ const HTML_ENTITIES = {
119
+ amp: "&",
120
+ lt: "<",
121
+ gt: ">",
122
+ quot: '"',
123
+ "#x27": "'",
124
+ "#39": "'",
125
+ };
126
+ function decodeHtml(s) {
127
+ return s.replace(HTML_ENTITY_RE, (_, e) => HTML_ENTITIES[e] ?? "");
128
+ }
129
+ function stripTags(s) {
130
+ return s.replace(/<[^>]*>/g, "").replace(/\s+/g, " ").trim();
131
+ }
132
+ const ANCHOR_RE = /<a\b([^>]*)>([\s\S]*?)<\/a>/g;
133
+ const HREF_RE = /\bhref="([^"]+)"/;
134
+ const CLASS_RE = /\bclass="([^"]*)"/;
135
+ /**
136
+ * Extract `result__a` (title + href) and `result__snippet` anchors from a
137
+ * DuckDuckGo HTML SERP. Returns an empty array on length-too-short or
138
+ * zero-anchor output (treated as soft-block by the caller).
139
+ */
140
+ function parseDdgHtml(html) {
141
+ if (!html || html.length < 200)
142
+ return [];
143
+ const titles = [];
144
+ const snippets = [];
145
+ for (const m of html.matchAll(ANCHOR_RE)) {
146
+ const attrs = m[1];
147
+ const inner = m[2];
148
+ const clsMatch = CLASS_RE.exec(attrs);
149
+ if (!clsMatch)
150
+ continue;
151
+ const classes = clsMatch[1].split(/\s+/);
152
+ if (classes.includes("result__a")) {
153
+ const hrefMatch = HREF_RE.exec(attrs);
154
+ if (!hrefMatch)
155
+ continue;
156
+ titles.push({
157
+ url: decodeHtml(hrefMatch[1]),
158
+ title: decodeHtml(stripTags(inner)),
159
+ });
160
+ }
161
+ else if (classes.includes("result__snippet")) {
162
+ snippets.push(decodeHtml(stripTags(inner)));
163
+ }
164
+ }
165
+ const out = [];
166
+ for (let i = 0; i < titles.length; i++) {
167
+ out.push({
168
+ title: titles[i].title,
169
+ url: titles[i].url,
170
+ snippet: snippets[i] ?? "",
171
+ });
172
+ }
173
+ return out;
174
+ }
175
+ function parseMarginaliaJson(text) {
176
+ let data;
177
+ try {
178
+ data = JSON.parse(text);
179
+ }
180
+ catch {
181
+ return [];
182
+ }
183
+ if (!Array.isArray(data.results))
184
+ return [];
185
+ const out = [];
186
+ for (const r of data.results) {
187
+ if (!r.url || !r.title)
188
+ continue;
189
+ const snippet = (r.description ?? "").replace(/\s+/g, " ").trim().slice(0, 500);
190
+ out.push({ title: r.title, url: r.url, snippet });
191
+ }
192
+ return out;
193
+ }
194
+ // ── Internal: URL normalization + dedup ─────────────────────────
195
+ /**
196
+ * Normalize a candidate URL: drop fragment, lowercase host, expand
197
+ * protocol-relative, strip common tracking params, reject non-http(s) and
198
+ * `.pdf` paths (which fetch-page hard-rejects downstream — dead slots).
199
+ */
200
+ function normalizeUrl(raw) {
201
+ let s = raw.trim();
202
+ if (!s)
203
+ return null;
204
+ if (s.startsWith("//"))
205
+ s = "https:" + s;
206
+ let u;
207
+ try {
208
+ u = new URL(s);
209
+ }
210
+ catch {
211
+ return null;
212
+ }
213
+ if (u.protocol !== "http:" && u.protocol !== "https:")
214
+ return null;
215
+ const lowerPath = u.pathname.toLowerCase();
216
+ if (lowerPath.endsWith(".pdf") ||
217
+ lowerPath.endsWith(".pdf/") ||
218
+ lowerPath.includes(".pdf?") ||
219
+ lowerPath.includes(".pdf#")) {
220
+ return null;
221
+ }
222
+ for (const k of [...u.searchParams.keys()]) {
223
+ if (TRACKING_PARAMS.has(k.toLowerCase()))
224
+ u.searchParams.delete(k);
225
+ }
226
+ u.hash = "";
227
+ u.hostname = u.hostname.toLowerCase();
228
+ return u.toString();
229
+ }
230
+ function dedupResults(results) {
231
+ const seen = new Set();
232
+ const out = [];
233
+ for (const r of results) {
234
+ if (seen.has(r.url))
235
+ continue;
236
+ seen.add(r.url);
237
+ out.push(r);
238
+ }
239
+ return out;
240
+ }
241
+ // ── Factory ─────────────────────────────────────────────────────
242
+ /**
243
+ * Create the keyless, in-process default {@link SearchProvider}.
244
+ *
245
+ * Two engines, primary with circuit-broken fallback:
246
+ *
247
+ * - **Primary**: DuckDuckGo HTML (`html.duckduckgo.com/html/`). Static,
248
+ * no-JS endpoint. Paced behind a shared FIFO request limiter to avoid
249
+ * triggering rate-limit responses on a residential IP. Wrapped in a
250
+ * circuit breaker that opens on consecutive hard failures (403/429/
251
+ * network/timeout) and recovers via a half-open probe after a cooldown.
252
+ *
253
+ * - **Fallback**: Marginalia public JSON API (`api2.marginalia-search.com`,
254
+ * shared `public` API key via header). Independent niche index;
255
+ * shared-key saturation surfaces as 503/429 and is treated as soft-empty.
256
+ *
257
+ * Returned results omit the `score` field by design — the upstream
258
+ * `WebSearchTool` exploit-mode ranking falls back cleanly to entailment-only
259
+ * when scores are absent, while a fabricated provider score would corrupt
260
+ * `min(providerScore, entailment)`.
261
+ *
262
+ * The provider is bound to the scope where this factory is yielded — the
263
+ * pacer's central tick loop is halted when that scope exits.
264
+ *
265
+ * @example
266
+ * ```ts
267
+ * yield* initAgents(ctx);
268
+ * const provider = yield* createKeylessSearchProvider();
269
+ * // Inject into an App factory (e.g. createWebApp) that constructs its
270
+ * // Source bound to the provider + reranker.
271
+ * ```
272
+ *
273
+ * @category Rig
274
+ */
275
+ function createKeylessSearchProvider(opts = {}) {
276
+ return (0, effection_1.resource)(function* (provide) {
277
+ const paceBaseMs = opts.paceBaseMs ?? 3000;
278
+ const paceJitterMs = opts.paceJitterMs ?? 2000;
279
+ if (paceBaseMs <= 0) {
280
+ throw new Error("createKeylessSearchProvider: paceBaseMs must be > 0. Unpaced egress on a residential IP is unsafe — fail loudly rather than risk being blocked silently.");
281
+ }
282
+ if (paceJitterMs < 0) {
283
+ throw new Error("createKeylessSearchProvider: paceJitterMs must be >= 0.");
284
+ }
285
+ const breakerThreshold = opts.breakerThreshold ?? 2;
286
+ const breakerCooldownMs = opts.breakerCooldownMs ?? 15_000;
287
+ const requestTimeoutMs = opts.requestTimeoutMs ?? 8000;
288
+ const sleepOp = opts.sleepOp ?? effection_1.sleep;
289
+ const fetchImpl = opts.fetchImpl ?? fetch;
290
+ const userAgent = opts.userAgent ?? DEFAULT_USER_AGENT;
291
+ const scope = yield* (0, effection_1.useScope)();
292
+ const pacer = yield* useRequestPacer({
293
+ baseMs: paceBaseMs,
294
+ jitterMs: paceJitterMs,
295
+ sleepOp,
296
+ });
297
+ const breaker = createBreaker(breakerThreshold, breakerCooldownMs);
298
+ /** Park duration handed to the pool when DDG rate-limits and the
299
+ * fallback is empty. Tracks DDG's observed quota-refill cadence (~86s
300
+ * bought one success in trace-2026-06-11T00-39); must exceed
301
+ * breakerCooldownMs (default 15s) so the retry lands on a half-open
302
+ * probe, not an open breaker. */
303
+ const RETRY_AFTER_MS = 90_000;
304
+ function* doDdg(query, max) {
305
+ yield* pacer.acquire();
306
+ let res;
307
+ try {
308
+ res = yield* fetchWithTimeout(DDG_URL, {
309
+ method: "POST",
310
+ headers: {
311
+ "User-Agent": userAgent,
312
+ "Content-Type": "application/x-www-form-urlencoded",
313
+ },
314
+ body: new URLSearchParams({ q: query }).toString(),
315
+ }, requestTimeoutMs, fetchImpl, sleepOp);
316
+ }
317
+ catch {
318
+ return "hard-fail";
319
+ }
320
+ // 403/429 are rate-limit semantics, not generic failure. DDG's bot
321
+ // detection serves 202 + a challenge page (observed live 2026-06-11:
322
+ // status 202, 47 anomaly/challenge markers, zero result links) — it
323
+ // passes a naive 2xx check and parses to zero results, which the old
324
+ // soft-fail classification rendered indistinguishable from "no matches"
325
+ // and never tripped the breaker.
326
+ if (res.status === 403 || res.status === 429)
327
+ return "rate-limited";
328
+ if (res.status === 202)
329
+ return "rate-limited";
330
+ if (res.status < 200 || res.status >= 300)
331
+ return "hard-fail";
332
+ const parsed = parseDdgHtml(res.text);
333
+ if (parsed.length === 0) {
334
+ return /anomaly|challenge|captcha|detected unusual/i.test(res.text)
335
+ ? "rate-limited"
336
+ : "soft-fail";
337
+ }
338
+ return parsed.slice(0, max);
339
+ }
340
+ function* doMarginalia(query, max) {
341
+ const url = `${MARGINALIA_URL}?query=${encodeURIComponent(query)}&count=${Math.min(Math.max(max, 1), 100)}`;
342
+ let res;
343
+ try {
344
+ res = yield* fetchWithTimeout(url, { headers: { "API-Key": "public" } }, requestTimeoutMs, fetchImpl, sleepOp);
345
+ }
346
+ catch {
347
+ return [];
348
+ }
349
+ if (res.status === 503 || res.status === 429)
350
+ return []; // shared-key saturation = soft-empty
351
+ if (res.status < 200 || res.status >= 300)
352
+ return [];
353
+ return parseMarginaliaJson(res.text);
354
+ }
355
+ function postProcess(results, max) {
356
+ const cleaned = [];
357
+ for (const r of results) {
358
+ const url = normalizeUrl(r.url);
359
+ if (!url)
360
+ continue;
361
+ cleaned.push({ title: r.title, url, snippet: r.snippet });
362
+ }
363
+ return dedupResults(cleaned).slice(0, max);
364
+ }
365
+ const provider = {
366
+ returnsFullContentMarkdown: false,
367
+ search(query, maxResults) {
368
+ const q = query.trim();
369
+ if (!q)
370
+ return Promise.resolve([]);
371
+ return scope.run(function* () {
372
+ let primary = "hard-fail";
373
+ if (breaker.canProceed()) {
374
+ primary = yield* doDdg(q, maxResults);
375
+ if (primary === "hard-fail" || primary === "rate-limited") {
376
+ breaker.onHardFailure();
377
+ }
378
+ else if (Array.isArray(primary)) {
379
+ breaker.onSuccess();
380
+ }
381
+ // soft-fail: breaker state unchanged (neutral)
382
+ }
383
+ if (Array.isArray(primary))
384
+ return postProcess(primary, maxResults);
385
+ const fallback = yield* doMarginalia(q, maxResults);
386
+ const processed = postProcess(fallback, maxResults);
387
+ // Rate-limited primary + nothing from the fallback: throwing (vs
388
+ // returning []) is the difference between the model thrashing on
389
+ // "no results" and the pool parking the agent for one quiet retry
390
+ // (trace-2026-06-11T00-39: nine zero-result retries in 80s).
391
+ if (primary === "rate-limited" && processed.length === 0) {
392
+ throw new lloyal_agents_1.ToolRetryError("Search provider rate-limited and fallback returned no results.", RETRY_AFTER_MS);
393
+ }
394
+ return processed;
395
+ });
396
+ },
397
+ };
398
+ yield* provide(provider);
399
+ });
400
+ }
401
+ //# sourceMappingURL=keyless-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyless-search.js","sourceRoot":"","sources":["../../src/tools/keyless-search.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { Operation } from 'effection';
2
2
  import { Tool } from '@lloyal-labs/lloyal-agents';
3
- import type { JsonSchema } from '@lloyal-labs/lloyal-agents';
3
+ import type { JsonSchema, App } from '@lloyal-labs/lloyal-agents';
4
4
  import { Session } from '@lloyal-labs/sdk';
5
5
  /**
6
6
  * Configuration for {@link PlanTool}.
@@ -15,10 +15,27 @@ export interface PlanToolOpts {
15
15
  };
16
16
  /** Active session whose trunk is used as the parent branch for generation. */
17
17
  session: Session;
18
- /** Maximum number of tasks the planner may produce. */
19
- maxQuestions: number;
18
+ /** Maximum number of research tasks the planner may produce. Caps the
19
+ * `tasks` array via grammar `maxItems` and renders into the planner
20
+ * prompt as `it.count` so the model sees the limit. Does NOT bound
21
+ * `clarifyQuestions` (the planner prompt limits those by instruction only;
22
+ * add a separate cap if grammar-enforced bound is needed). */
23
+ maxTasks: number;
20
24
  /** Sampling temperature for plan generation. @default 0.3 */
21
25
  temperature?: number;
26
+ /**
27
+ * Apps available to route research tasks to. When provided
28
+ * and non-empty, the plan grammar constrains each task's `app` field to
29
+ * an enum of these apps' `manifest.protocol.name` values — the names
30
+ * the planner sees in the spine catalog — so the planner must assign
31
+ * every task to a real protocol. The harness maps each emitted
32
+ * `task.app` (a protocol name) back to its `manifest.name` to set
33
+ * `SpawnSpec.assignedApp` when spawning research agents.
34
+ *
35
+ * Omit for single-app or app-agnostic pipelines: the grammar drops the
36
+ * `app` field entirely and {@link ResearchTask.app} stays undefined.
37
+ */
38
+ availableApps?: readonly App[];
22
39
  }
23
40
  /**
24
41
  * A structured research task produced by the planner.
@@ -31,6 +48,15 @@ export interface PlanToolOpts {
31
48
  export interface ResearchTask {
32
49
  /** What to find out — a specific, actionable research assignment. */
33
50
  description: string;
51
+ /**
52
+ * Contract name of the app this task is routed to (matches one of the
53
+ * planner's `availableApps`' `manifest.protocol.name`). Present only
54
+ * when the planner ran with {@link PlanToolOpts.availableApps}; the
55
+ * harness maps it to the App's `manifest.name` for
56
+ * `SpawnSpec.assignedApp`. Undefined for single-app / app-agnostic
57
+ * pipelines.
58
+ */
59
+ app?: string;
34
60
  }
35
61
  /**
36
62
  * Convert a ResearchTask to agent content string.
@@ -88,8 +114,9 @@ export declare class PlanTool extends Tool<{
88
114
  readonly parameters: JsonSchema;
89
115
  private _prompt;
90
116
  private _session;
91
- private _maxQuestions;
117
+ private _maxTasks;
92
118
  private _temperature;
119
+ private _appProtocolNames;
93
120
  constructor(opts: PlanToolOpts);
94
121
  execute(args: {
95
122
  query: string;
@@ -1 +1 @@
1
- {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/tools/plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAyB,MAAM,4BAA4B,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,0GAA0G;IAC1G,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,8EAA8E;IAC9E,OAAO,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAExD;AAED;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,UAAU,CAAC;AAEhE;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,uEAAuE;IACvE,MAAM,EAAE,UAAU,CAAC;IACnB,8EAA8E;IAC9E,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,mGAAmG;IACnG,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,QAAS,SAAQ,IAAI,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;IACrE,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,WAAW,0KAA0K;IAC9L,QAAQ,CAAC,UAAU,EAAE,UAAU,CAO7B;IAEF,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAS;gBAEjB,IAAI,EAAE,YAAY;IAQ7B,OAAO,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,OAAO,CAAC;CA4ExE"}
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/tools/plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAyB,MAAM,4BAA4B,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,0GAA0G;IAC1G,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,8EAA8E;IAC9E,OAAO,EAAE,OAAO,CAAC;IACjB;;;;mEAI+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,EAAE,SAAS,GAAG,EAAE,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAExD;AAuBD;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,UAAU,CAAC;AAEhE;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,uEAAuE;IACvE,MAAM,EAAE,UAAU,CAAC;IACnB,8EAA8E;IAC9E,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,mGAAmG;IACnG,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,QAAS,SAAQ,IAAI,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;IACrE,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,WAAW,0KAA0K;IAC9L,QAAQ,CAAC,UAAU,EAAE,UAAU,CAO7B;IAEF,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,iBAAiB,CAAW;gBAExB,IAAI,EAAE,YAAY;IAS7B,OAAO,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,OAAO,CAAC;CAyFxE"}
@@ -11,6 +11,27 @@ const lloyal_agents_1 = require("@lloyal-labs/lloyal-agents");
11
11
  function taskToContent(task) {
12
12
  return task.description;
13
13
  }
14
+ /**
15
+ * Parse the planner's JSON, tolerant of a markdown code fence or surrounding
16
+ * prose. Grammar-constrained generation *should* emit bare JSON, but instruct
17
+ * models routinely wrap it in ```json … ``` — the few-shot examples in the plan
18
+ * prompt prime exactly that. A bare `JSON.parse` throws on the fence, which used
19
+ * to silently demote a real research plan to passthrough (no plan presented for
20
+ * approval), so extract the outermost `{…}` object before parsing.
21
+ */
22
+ function parsePlanJson(raw) {
23
+ try {
24
+ return JSON.parse(raw);
25
+ }
26
+ catch {
27
+ const start = raw.indexOf('{');
28
+ const end = raw.lastIndexOf('}');
29
+ if (start === -1 || end <= start) {
30
+ throw new Error('planner output contained no JSON object');
31
+ }
32
+ return JSON.parse(raw.slice(start, end + 1));
33
+ }
34
+ }
14
35
  /**
15
36
  * Grammar-constrained query planner.
16
37
  *
@@ -35,17 +56,31 @@ class PlanTool extends lloyal_agents_1.Tool {
35
56
  };
36
57
  _prompt;
37
58
  _session;
38
- _maxQuestions;
59
+ _maxTasks;
39
60
  _temperature;
61
+ _appProtocolNames;
40
62
  constructor(opts) {
41
63
  super();
42
64
  this._prompt = opts.prompt;
43
65
  this._temperature = opts.temperature ?? 0.3;
44
66
  this._session = opts.session;
45
- this._maxQuestions = opts.maxQuestions;
67
+ this._maxTasks = opts.maxTasks;
68
+ this._appProtocolNames = (opts.availableApps ?? []).map(a => a.manifest.protocol.name);
46
69
  }
47
70
  *execute(args) {
48
71
  const t = performance.now();
72
+ // When apps are available, force the planner to route every task to
73
+ // one of their protocol names via a grammar enum. With no
74
+ // apps the task carries only a description.
75
+ const hasApps = this._appProtocolNames.length > 0;
76
+ const taskProperties = {
77
+ description: { type: 'string' },
78
+ };
79
+ const taskRequired = ['description'];
80
+ if (hasApps) {
81
+ taskProperties.app = { type: 'string', enum: this._appProtocolNames };
82
+ taskRequired.push('app');
83
+ }
49
84
  const schema = {
50
85
  type: 'object',
51
86
  properties: {
@@ -54,12 +89,10 @@ class PlanTool extends lloyal_agents_1.Tool {
54
89
  type: 'array',
55
90
  items: {
56
91
  type: 'object',
57
- properties: {
58
- description: { type: 'string' },
59
- },
60
- required: ['description'],
92
+ properties: taskProperties,
93
+ required: taskRequired,
61
94
  },
62
- maxItems: this._maxQuestions,
95
+ maxItems: this._maxTasks,
63
96
  },
64
97
  clarifyQuestions: {
65
98
  type: 'array',
@@ -70,7 +103,7 @@ class PlanTool extends lloyal_agents_1.Tool {
70
103
  };
71
104
  const userContent = (0, lloyal_agents_1.renderTemplate)(this._prompt.user, {
72
105
  query: args.query,
73
- count: this._maxQuestions,
106
+ count: this._maxTasks,
74
107
  context: args.context || null,
75
108
  });
76
109
  const planAgent = yield* (0, lloyal_agents_1.agent)({
@@ -83,14 +116,16 @@ class PlanTool extends lloyal_agents_1.Tool {
83
116
  const timeMs = performance.now() - t;
84
117
  const tokenCount = planAgent.tokenCount;
85
118
  try {
86
- const parsed = JSON.parse(planAgent.rawOutput);
119
+ const parsed = parsePlanJson(planAgent.rawOutput);
87
120
  const intent = parsed.intent === 'clarify' || parsed.intent === 'passthrough' || parsed.intent === 'research'
88
121
  ? parsed.intent
89
122
  : 'research';
90
123
  const tasks = (parsed.tasks ?? [])
91
- .slice(0, this._maxQuestions)
124
+ .slice(0, this._maxTasks)
92
125
  .filter(t => typeof t.description === 'string')
93
- .map(t => ({ description: t.description }));
126
+ .map(t => (typeof t.app === 'string'
127
+ ? { description: t.description, app: t.app }
128
+ : { description: t.description }));
94
129
  const clarifyQuestions = (parsed.clarifyQuestions ?? []).filter(q => typeof q === 'string');
95
130
  return { intent, tasks, clarifyQuestions, tokenCount, timeMs };
96
131
  }
@@ -1 +1 @@
1
- {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/tools/plan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/tools/plan.ts"],"names":[],"mappings":"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"}