@zelari/core 0.7.9
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/dist/agents/advancedTools.d.ts +7 -0
- package/dist/agents/advancedTools.d.ts.map +1 -0
- package/dist/agents/advancedTools.js +115 -0
- package/dist/agents/advancedTools.js.map +1 -0
- package/dist/agents/councilApi.d.ts +328 -0
- package/dist/agents/councilApi.d.ts.map +1 -0
- package/dist/agents/councilApi.js +952 -0
- package/dist/agents/councilApi.js.map +1 -0
- package/dist/agents/councilDirectives.d.ts +26 -0
- package/dist/agents/councilDirectives.d.ts.map +1 -0
- package/dist/agents/councilDirectives.js +98 -0
- package/dist/agents/councilDirectives.js.map +1 -0
- package/dist/agents/harnessToolBridge.d.ts +26 -0
- package/dist/agents/harnessToolBridge.d.ts.map +1 -0
- package/dist/agents/harnessToolBridge.js +60 -0
- package/dist/agents/harnessToolBridge.js.map +1 -0
- package/dist/agents/promoteMember.d.ts +77 -0
- package/dist/agents/promoteMember.d.ts.map +1 -0
- package/dist/agents/promoteMember.js +210 -0
- package/dist/agents/promoteMember.js.map +1 -0
- package/dist/agents/promptModules.d.ts +20 -0
- package/dist/agents/promptModules.d.ts.map +1 -0
- package/dist/agents/promptModules.js +139 -0
- package/dist/agents/promptModules.js.map +1 -0
- package/dist/agents/roles.d.ts +40 -0
- package/dist/agents/roles.d.ts.map +1 -0
- package/dist/agents/roles.js +352 -0
- package/dist/agents/roles.js.map +1 -0
- package/dist/agents/skills/builtin/debugging.d.ts +2 -0
- package/dist/agents/skills/builtin/debugging.d.ts.map +1 -0
- package/dist/agents/skills/builtin/debugging.js +248 -0
- package/dist/agents/skills/builtin/debugging.js.map +1 -0
- package/dist/agents/skills/builtin/docs.d.ts +2 -0
- package/dist/agents/skills/builtin/docs.d.ts.map +1 -0
- package/dist/agents/skills/builtin/docs.js +291 -0
- package/dist/agents/skills/builtin/docs.js.map +1 -0
- package/dist/agents/skills/builtin/git-ops.d.ts +2 -0
- package/dist/agents/skills/builtin/git-ops.d.ts.map +1 -0
- package/dist/agents/skills/builtin/git-ops.js +301 -0
- package/dist/agents/skills/builtin/git-ops.js.map +1 -0
- package/dist/agents/skills/builtin/planning.d.ts +2 -0
- package/dist/agents/skills/builtin/planning.d.ts.map +1 -0
- package/dist/agents/skills/builtin/planning.js +335 -0
- package/dist/agents/skills/builtin/planning.js.map +1 -0
- package/dist/agents/skills/builtin/refactoring.d.ts +2 -0
- package/dist/agents/skills/builtin/refactoring.d.ts.map +1 -0
- package/dist/agents/skills/builtin/refactoring.js +261 -0
- package/dist/agents/skills/builtin/refactoring.js.map +1 -0
- package/dist/agents/skills/builtin/review.d.ts +2 -0
- package/dist/agents/skills/builtin/review.d.ts.map +1 -0
- package/dist/agents/skills/builtin/review.js +302 -0
- package/dist/agents/skills/builtin/review.js.map +1 -0
- package/dist/agents/skills/builtin/testing.d.ts +2 -0
- package/dist/agents/skills/builtin/testing.d.ts.map +1 -0
- package/dist/agents/skills/builtin/testing.js +245 -0
- package/dist/agents/skills/builtin/testing.js.map +1 -0
- package/dist/agents/skills.d.ts +138 -0
- package/dist/agents/skills.d.ts.map +1 -0
- package/dist/agents/skills.js +277 -0
- package/dist/agents/skills.js.map +1 -0
- package/dist/agents/systemPromptBuilder.d.ts +45 -0
- package/dist/agents/systemPromptBuilder.d.ts.map +1 -0
- package/dist/agents/systemPromptBuilder.js +159 -0
- package/dist/agents/systemPromptBuilder.js.map +1 -0
- package/dist/agents/toolSchemas.d.ts +55 -0
- package/dist/agents/toolSchemas.d.ts.map +1 -0
- package/dist/agents/toolSchemas.js +316 -0
- package/dist/agents/toolSchemas.js.map +1 -0
- package/dist/agents/tools.d.ts +67 -0
- package/dist/agents/tools.d.ts.map +1 -0
- package/dist/agents/tools.js +225 -0
- package/dist/agents/tools.js.map +1 -0
- package/dist/agents/vaultTools.d.ts +9 -0
- package/dist/agents/vaultTools.d.ts.map +1 -0
- package/dist/agents/vaultTools.js +134 -0
- package/dist/agents/vaultTools.js.map +1 -0
- package/dist/core/AgentHarness.d.ts +250 -0
- package/dist/core/AgentHarness.d.ts.map +1 -0
- package/dist/core/AgentHarness.js +614 -0
- package/dist/core/AgentHarness.js.map +1 -0
- package/dist/core/providerStream.d.ts +61 -0
- package/dist/core/providerStream.d.ts.map +1 -0
- package/dist/core/providerStream.js +99 -0
- package/dist/core/providerStream.js.map +1 -0
- package/dist/core/sessionJsonl.d.ts +50 -0
- package/dist/core/sessionJsonl.d.ts.map +1 -0
- package/dist/core/sessionJsonl.js +99 -0
- package/dist/core/sessionJsonl.js.map +1 -0
- package/dist/core/tools/auditLog.d.ts +14 -0
- package/dist/core/tools/auditLog.d.ts.map +1 -0
- package/dist/core/tools/auditLog.js +26 -0
- package/dist/core/tools/auditLog.js.map +1 -0
- package/dist/core/tools/builtin/_walk.d.ts +40 -0
- package/dist/core/tools/builtin/_walk.d.ts.map +1 -0
- package/dist/core/tools/builtin/_walk.js +129 -0
- package/dist/core/tools/builtin/_walk.js.map +1 -0
- package/dist/core/tools/builtin/diff.d.ts +45 -0
- package/dist/core/tools/builtin/diff.d.ts.map +1 -0
- package/dist/core/tools/builtin/diff.js +477 -0
- package/dist/core/tools/builtin/diff.js.map +1 -0
- package/dist/core/tools/builtin/filesystem.d.ts +45 -0
- package/dist/core/tools/builtin/filesystem.d.ts.map +1 -0
- package/dist/core/tools/builtin/filesystem.js +110 -0
- package/dist/core/tools/builtin/filesystem.js.map +1 -0
- package/dist/core/tools/builtin/listFiles.d.ts +18 -0
- package/dist/core/tools/builtin/listFiles.d.ts.map +1 -0
- package/dist/core/tools/builtin/listFiles.js +48 -0
- package/dist/core/tools/builtin/listFiles.js.map +1 -0
- package/dist/core/tools/builtin/search.d.ts +49 -0
- package/dist/core/tools/builtin/search.d.ts.map +1 -0
- package/dist/core/tools/builtin/search.js +148 -0
- package/dist/core/tools/builtin/search.js.map +1 -0
- package/dist/core/tools/builtin/shell.d.ts +27 -0
- package/dist/core/tools/builtin/shell.d.ts.map +1 -0
- package/dist/core/tools/builtin/shell.js +98 -0
- package/dist/core/tools/builtin/shell.js.map +1 -0
- package/dist/core/tools/builtin/shellResolver.d.ts +25 -0
- package/dist/core/tools/builtin/shellResolver.d.ts.map +1 -0
- package/dist/core/tools/builtin/shellResolver.js +117 -0
- package/dist/core/tools/builtin/shellResolver.js.map +1 -0
- package/dist/core/tools/builtin/web.d.ts +43 -0
- package/dist/core/tools/builtin/web.d.ts.map +1 -0
- package/dist/core/tools/builtin/web.js +208 -0
- package/dist/core/tools/builtin/web.js.map +1 -0
- package/dist/core/tools/registry.d.ts +31 -0
- package/dist/core/tools/registry.d.ts.map +1 -0
- package/dist/core/tools/registry.js +115 -0
- package/dist/core/tools/registry.js.map +1 -0
- package/dist/core/tools/toolTypes.d.ts +60 -0
- package/dist/core/tools/toolTypes.d.ts.map +1 -0
- package/dist/core/tools/toolTypes.js +8 -0
- package/dist/core/tools/toolTypes.js.map +1 -0
- package/dist/core/tools/zodBridge.d.ts +6 -0
- package/dist/core/tools/zodBridge.d.ts.map +1 -0
- package/dist/core/tools/zodBridge.js +56 -0
- package/dist/core/tools/zodBridge.js.map +1 -0
- package/dist/council/index.d.ts +14 -0
- package/dist/council/index.d.ts.map +1 -0
- package/dist/council/index.js +14 -0
- package/dist/council/index.js.map +1 -0
- package/dist/council/modeBanners.d.ts +5 -0
- package/dist/council/modeBanners.d.ts.map +1 -0
- package/dist/council/modeBanners.js +10 -0
- package/dist/council/modeBanners.js.map +1 -0
- package/dist/council/runMode.d.ts +25 -0
- package/dist/council/runMode.d.ts.map +1 -0
- package/dist/council/runMode.js +41 -0
- package/dist/council/runMode.js.map +1 -0
- package/dist/events/index.d.ts +6 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +6 -0
- package/dist/events/index.js.map +1 -0
- package/dist/harness/index.d.ts +9 -0
- package/dist/harness/index.d.ts.map +1 -0
- package/dist/harness/index.js +9 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/tools/index.d.ts +20 -0
- package/dist/harness/tools/index.d.ts.map +1 -0
- package/dist/harness/tools/index.js +19 -0
- package/dist/harness/tools/index.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/shared/eventBus.d.ts +58 -0
- package/dist/shared/eventBus.d.ts.map +1 -0
- package/dist/shared/eventBus.js +104 -0
- package/dist/shared/eventBus.js.map +1 -0
- package/dist/shared/events.d.ts +230 -0
- package/dist/shared/events.d.ts.map +1 -0
- package/dist/shared/events.js +76 -0
- package/dist/shared/events.js.map +1 -0
- package/dist/shared/index.d.ts +8 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +8 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/skills/index.d.ts +10 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +10 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/types/context.d.ts +54 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/context.js +3 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/index.d.ts +13 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/knowledge.d.ts +79 -0
- package/dist/types/knowledge.d.ts.map +1 -0
- package/dist/types/knowledge.js +5 -0
- package/dist/types/knowledge.js.map +1 -0
- package/dist/types/legacy.d.ts +466 -0
- package/dist/types/legacy.d.ts.map +1 -0
- package/dist/types/legacy.js +2 -0
- package/dist/types/legacy.js.map +1 -0
- package/dist/types/systemTypes.d.ts +113 -0
- package/dist/types/systemTypes.d.ts.map +1 -0
- package/dist/types/systemTypes.js +10 -0
- package/dist/types/systemTypes.js.map +1 -0
- package/package.json +151 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../../../src/core/tools/builtin/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAyDzE;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkB/C;AAID,QAAA,MAAM,kBAAkB;;;iBAKtB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,YAAY,EAAE,cAAc,CAoCrE,CAAC;AAIF,QAAA,MAAM,mBAAmB;;;iBAKvB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,QAAQ,GAAG,YAAY,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,sEAAsE;AACtE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,EAAE,CA8BpF;AA0CD,eAAO,MAAM,aAAa,EAAE,cAAc,CAAC,aAAa,EAAE,eAAe,CA6BxE,CAAC"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { typedOk, typedErr } from '../toolTypes.js';
|
|
3
|
+
/**
|
|
4
|
+
* web.ts — network tools: fetch_url + web_search (v0.7.5).
|
|
5
|
+
*
|
|
6
|
+
* Fills the CLI's biggest functional gap vs peer agents (opencode's
|
|
7
|
+
* webfetch/websearch, Hermes' web_search): until now the only network
|
|
8
|
+
* access was `bash` + curl, which is fragile on Windows and blocked by
|
|
9
|
+
* the non-interactive shell constraints.
|
|
10
|
+
*
|
|
11
|
+
* Design constraints:
|
|
12
|
+
* - http(s) only; other schemes rejected before any I/O.
|
|
13
|
+
* - Hard timeout via AbortController (default 15s) — a hung host must
|
|
14
|
+
* not stall the whole agent turn.
|
|
15
|
+
* - Output truncated (default 40k chars) — a 5MB page must not blow the
|
|
16
|
+
* prompt budget.
|
|
17
|
+
* - `web_search` needs no API key by default (DuckDuckGo HTML endpoint);
|
|
18
|
+
* set TAVILY_API_KEY to switch to Tavily's JSON API for better results.
|
|
19
|
+
*/
|
|
20
|
+
const FETCH_TIMEOUT_MS = 15_000;
|
|
21
|
+
const MAX_CHARS_DEFAULT = 40_000;
|
|
22
|
+
const USER_AGENT = 'zelari-code (+https://github.com/N-THEM-Studio/zelari-code)';
|
|
23
|
+
/** Reject anything that is not plain http/https BEFORE any network I/O. */
|
|
24
|
+
function assertHttpUrl(raw) {
|
|
25
|
+
let url;
|
|
26
|
+
try {
|
|
27
|
+
url = new URL(raw);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
throw new Error(`Invalid URL: ${raw}`);
|
|
31
|
+
}
|
|
32
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:') {
|
|
33
|
+
throw new Error(`Only http(s) URLs are allowed, got: ${url.protocol}//`);
|
|
34
|
+
}
|
|
35
|
+
return url;
|
|
36
|
+
}
|
|
37
|
+
/** Fetch with an AbortController timeout, propagating the tool ctx signal. */
|
|
38
|
+
async function fetchWithTimeout(url, init, outerSignal, timeoutMs) {
|
|
39
|
+
const ctrl = new AbortController();
|
|
40
|
+
const timer = setTimeout(() => ctrl.abort(new Error(`timeout after ${timeoutMs}ms`)), timeoutMs);
|
|
41
|
+
const onOuterAbort = () => ctrl.abort(outerSignal?.reason);
|
|
42
|
+
outerSignal?.addEventListener('abort', onOuterAbort, { once: true });
|
|
43
|
+
try {
|
|
44
|
+
return await fetch(url, { ...init, signal: ctrl.signal });
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
clearTimeout(timer);
|
|
48
|
+
outerSignal?.removeEventListener('abort', onOuterAbort);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Reduce an HTML document to readable text: drop script/style/head noise,
|
|
53
|
+
* convert tags to whitespace, decode the handful of entities that matter.
|
|
54
|
+
* Deliberately dependency-free — good enough for LLM consumption, not for
|
|
55
|
+
* rendering.
|
|
56
|
+
*/
|
|
57
|
+
export function htmlToText(html) {
|
|
58
|
+
return html
|
|
59
|
+
.replace(/<script[\s\S]*?<\/script>/gi, ' ')
|
|
60
|
+
.replace(/<style[\s\S]*?<\/style>/gi, ' ')
|
|
61
|
+
.replace(/<head[\s\S]*?<\/head>/gi, ' ')
|
|
62
|
+
.replace(/<!--[\s\S]*?-->/g, ' ')
|
|
63
|
+
.replace(/<br\s*\/?>(\s*)/gi, '\n')
|
|
64
|
+
.replace(/<\/(p|div|li|h[1-6]|tr|section|article)>/gi, '\n')
|
|
65
|
+
.replace(/<[^>]+>/g, ' ')
|
|
66
|
+
.replace(/ /g, ' ')
|
|
67
|
+
.replace(/&/g, '&')
|
|
68
|
+
.replace(/</g, '<')
|
|
69
|
+
.replace(/>/g, '>')
|
|
70
|
+
.replace(/"/g, '"')
|
|
71
|
+
.replace(/'|'/g, "'")
|
|
72
|
+
.replace(/[ \t]+/g, ' ')
|
|
73
|
+
.replace(/\n\s*\n\s*\n+/g, '\n\n')
|
|
74
|
+
.trim();
|
|
75
|
+
}
|
|
76
|
+
// ── fetch_url ─────────────────────────────────────────────────────────
|
|
77
|
+
const FetchUrlArgsSchema = z.object({
|
|
78
|
+
/** The http(s) URL to fetch. */
|
|
79
|
+
url: z.string().min(1),
|
|
80
|
+
/** Max characters of extracted text returned (default 40000). */
|
|
81
|
+
maxChars: z.number().int().positive().max(200_000).default(MAX_CHARS_DEFAULT),
|
|
82
|
+
});
|
|
83
|
+
export const fetchUrlTool = {
|
|
84
|
+
name: 'fetch_url',
|
|
85
|
+
description: 'Fetch an http(s) URL and return its readable text content (HTML is stripped to text). ' +
|
|
86
|
+
'Use for documentation pages, READMEs, API references, raw files. Not for binary content.',
|
|
87
|
+
permissions: ['network'],
|
|
88
|
+
inputSchema: FetchUrlArgsSchema,
|
|
89
|
+
timeoutMs: FETCH_TIMEOUT_MS + 5_000,
|
|
90
|
+
execute: async (args, ctx) => {
|
|
91
|
+
try {
|
|
92
|
+
const url = assertHttpUrl(args.url);
|
|
93
|
+
const res = await fetchWithTimeout(url.toString(), { headers: { 'user-agent': USER_AGENT, accept: 'text/html,text/plain,application/json,*/*' }, redirect: 'follow' }, ctx.signal, FETCH_TIMEOUT_MS);
|
|
94
|
+
const contentType = res.headers.get('content-type') ?? '';
|
|
95
|
+
if (/image|video|audio|octet-stream|zip|pdf/i.test(contentType)) {
|
|
96
|
+
return typedErr(`fetch_url: unsupported content-type "${contentType}" (binary). Only text content is supported.`);
|
|
97
|
+
}
|
|
98
|
+
const raw = await res.text();
|
|
99
|
+
const isHtml = /html/i.test(contentType) || /^\s*<(!doctype|html)/i.test(raw);
|
|
100
|
+
const text = isHtml ? htmlToText(raw) : raw;
|
|
101
|
+
const truncated = text.length > args.maxChars;
|
|
102
|
+
return typedOk({
|
|
103
|
+
url: res.url || url.toString(),
|
|
104
|
+
status: res.status,
|
|
105
|
+
contentType,
|
|
106
|
+
text: truncated ? text.slice(0, args.maxChars) + '\n…[truncated]' : text,
|
|
107
|
+
truncated,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
return typedErr(`fetch_url failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
// ── web_search ────────────────────────────────────────────────────────
|
|
116
|
+
const WebSearchArgsSchema = z.object({
|
|
117
|
+
/** Search query. */
|
|
118
|
+
query: z.string().min(2),
|
|
119
|
+
/** Max results (default 5). */
|
|
120
|
+
maxResults: z.number().int().positive().max(10).default(5),
|
|
121
|
+
});
|
|
122
|
+
/** Parse the DuckDuckGo HTML SERP (html.duckduckgo.com) into hits. */
|
|
123
|
+
export function parseDuckDuckGoHtml(html, maxResults) {
|
|
124
|
+
const hits = [];
|
|
125
|
+
// Each organic result renders as <a class="result__a" href="…">title</a>
|
|
126
|
+
// … <a class="result__snippet" …>snippet</a>. Attribute order is stable
|
|
127
|
+
// on the html.duckduckgo.com endpoint.
|
|
128
|
+
const linkRe = /<a[^>]*class="[^"]*result__a[^"]*"[^>]*href="([^"]+)"[^>]*>([\s\S]*?)<\/a>/gi;
|
|
129
|
+
const snippetRe = /<a[^>]*class="[^"]*result__snippet[^"]*"[^>]*>([\s\S]*?)<\/a>/gi;
|
|
130
|
+
const snippets = [];
|
|
131
|
+
let sm;
|
|
132
|
+
while ((sm = snippetRe.exec(html)) !== null)
|
|
133
|
+
snippets.push(htmlToText(sm[1] ?? ''));
|
|
134
|
+
let m;
|
|
135
|
+
while ((m = linkRe.exec(html)) !== null && hits.length < maxResults) {
|
|
136
|
+
let href = m[1] ?? '';
|
|
137
|
+
// DDG wraps results as //duckduckgo.com/l/?uddg=<encoded-target>&rut=…
|
|
138
|
+
const uddg = /[?&]uddg=([^&]+)/.exec(href);
|
|
139
|
+
if (uddg?.[1]) {
|
|
140
|
+
try {
|
|
141
|
+
href = decodeURIComponent(uddg[1]);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// keep the wrapped URL — still clickable
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (href.startsWith('//'))
|
|
148
|
+
href = 'https:' + href;
|
|
149
|
+
hits.push({
|
|
150
|
+
title: htmlToText(m[2] ?? ''),
|
|
151
|
+
url: href,
|
|
152
|
+
snippet: snippets[hits.length] ?? '',
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
return hits;
|
|
156
|
+
}
|
|
157
|
+
async function searchTavily(query, maxResults, apiKey, signal) {
|
|
158
|
+
const res = await fetchWithTimeout('https://api.tavily.com/search', {
|
|
159
|
+
method: 'POST',
|
|
160
|
+
headers: { 'content-type': 'application/json' },
|
|
161
|
+
body: JSON.stringify({ api_key: apiKey, query, max_results: maxResults }),
|
|
162
|
+
}, signal, FETCH_TIMEOUT_MS);
|
|
163
|
+
if (!res.ok)
|
|
164
|
+
throw new Error(`Tavily HTTP ${res.status}`);
|
|
165
|
+
const data = (await res.json());
|
|
166
|
+
return (data.results ?? []).slice(0, maxResults).map((r) => ({
|
|
167
|
+
title: r.title ?? '',
|
|
168
|
+
url: r.url ?? '',
|
|
169
|
+
snippet: (r.content ?? '').slice(0, 400),
|
|
170
|
+
}));
|
|
171
|
+
}
|
|
172
|
+
async function searchDuckDuckGo(query, maxResults, signal) {
|
|
173
|
+
const res = await fetchWithTimeout('https://html.duckduckgo.com/html/?q=' + encodeURIComponent(query), { headers: { 'user-agent': USER_AGENT, accept: 'text/html' } }, signal, FETCH_TIMEOUT_MS);
|
|
174
|
+
if (!res.ok)
|
|
175
|
+
throw new Error(`DuckDuckGo HTTP ${res.status}`);
|
|
176
|
+
return parseDuckDuckGoHtml(await res.text(), maxResults);
|
|
177
|
+
}
|
|
178
|
+
export const webSearchTool = {
|
|
179
|
+
name: 'web_search',
|
|
180
|
+
description: 'Search the web and return result titles, URLs, and snippets. ' +
|
|
181
|
+
'Follow up with fetch_url on the most promising result to read the page. ' +
|
|
182
|
+
'No API key needed (set TAVILY_API_KEY for higher-quality results).',
|
|
183
|
+
permissions: ['network'],
|
|
184
|
+
inputSchema: WebSearchArgsSchema,
|
|
185
|
+
timeoutMs: FETCH_TIMEOUT_MS + 5_000,
|
|
186
|
+
execute: async (args, ctx) => {
|
|
187
|
+
const tavilyKey = process.env['TAVILY_API_KEY'];
|
|
188
|
+
try {
|
|
189
|
+
if (tavilyKey) {
|
|
190
|
+
const results = await searchTavily(args.query, args.maxResults, tavilyKey, ctx.signal);
|
|
191
|
+
return typedOk({ provider: 'tavily', query: args.query, results });
|
|
192
|
+
}
|
|
193
|
+
const results = await searchDuckDuckGo(args.query, args.maxResults, ctx.signal);
|
|
194
|
+
if (results.length === 0) {
|
|
195
|
+
return typedOk({
|
|
196
|
+
provider: 'duckduckgo',
|
|
197
|
+
query: args.query,
|
|
198
|
+
results: [],
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
return typedOk({ provider: 'duckduckgo', query: args.query, results });
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
return typedErr(`web_search failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
//# sourceMappingURL=web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../../../src/core/tools/builtin/web.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type ToolDefinition, type TypedResult } from './toolTypes.js';
|
|
2
|
+
export interface InvokeOptions {
|
|
3
|
+
timeoutMs?: number;
|
|
4
|
+
signal?: AbortSignal;
|
|
5
|
+
cwd?: string;
|
|
6
|
+
sessionId?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class ToolRegistry {
|
|
9
|
+
private tools;
|
|
10
|
+
register<I, O>(def: ToolDefinition<I, O>): void;
|
|
11
|
+
get(name: string): ToolDefinition | undefined;
|
|
12
|
+
list(): string[];
|
|
13
|
+
/**
|
|
14
|
+
* Resolve a hallucinated tool name to a registered one, or null.
|
|
15
|
+
* Case/underscore-insensitive so `Read`, `list_dir`, `Search_RAG` all map.
|
|
16
|
+
*/
|
|
17
|
+
private suggestFor;
|
|
18
|
+
/** Invoke a tool with validated input + timeout + audit + permissions check. */
|
|
19
|
+
invoke<O>(name: string, rawInput: unknown, options?: InvokeOptions): Promise<TypedResult<O>>;
|
|
20
|
+
/** Return all tool definitions in OpenAI function-calling format. */
|
|
21
|
+
toOpenAITools(): Array<{
|
|
22
|
+
type: 'function';
|
|
23
|
+
function: {
|
|
24
|
+
name: string;
|
|
25
|
+
description: string;
|
|
26
|
+
parameters: Record<string, unknown>;
|
|
27
|
+
};
|
|
28
|
+
}>;
|
|
29
|
+
}
|
|
30
|
+
export declare function getToolRegistry(): ToolRegistry;
|
|
31
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/tools/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,cAAc,EAAoB,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEnG,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmCD,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAqC;IAElD,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI;IAI/C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI7C,IAAI,IAAI,MAAM,EAAE;IAIhB;;;OAGG;IACH,OAAO,CAAC,UAAU;IAMlB,gFAAgF;IAC1E,MAAM,CAAC,CAAC,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,EACjB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IA8C1B,qEAAqE;IACrE,aAAa,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,CAAA;KAAE,CAAC;CAUnI;AAID,wBAAgB,eAAe,IAAI,YAAY,CAG9C"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { zodToJsonSchema } from './zodBridge.js';
|
|
2
|
+
import { typedErr } from './toolTypes.js';
|
|
3
|
+
/**
|
|
4
|
+
* Common hallucinated tool names → canonical registry names. Models trained
|
|
5
|
+
* on other agent stacks routinely call `Read`/`Glob` (Claude Code), `list_dir`
|
|
6
|
+
* (Cursor), or legacy Electron-era names (`searchRAG`) — each such call burns
|
|
7
|
+
* a per-turn tool-budget slot on a guaranteed failure (live test 2026-07-03).
|
|
8
|
+
* The alias map turns the failure into a one-step recovery: the error names
|
|
9
|
+
* the intended tool explicitly ("Did you mean …").
|
|
10
|
+
*/
|
|
11
|
+
const TOOL_NAME_ALIASES = {
|
|
12
|
+
read: 'read_file',
|
|
13
|
+
readfile: 'read_file',
|
|
14
|
+
cat: 'read_file',
|
|
15
|
+
write: 'write_file',
|
|
16
|
+
writefile: 'write_file',
|
|
17
|
+
edit: 'edit_file',
|
|
18
|
+
editfile: 'edit_file',
|
|
19
|
+
glob: 'list_files',
|
|
20
|
+
listdir: 'list_files',
|
|
21
|
+
listdirectory: 'list_files',
|
|
22
|
+
ls: 'list_files',
|
|
23
|
+
dir: 'list_files',
|
|
24
|
+
find: 'list_files',
|
|
25
|
+
grep: 'grep_content',
|
|
26
|
+
search: 'grep_content',
|
|
27
|
+
searchrag: 'searchDocuments',
|
|
28
|
+
rag: 'searchDocuments',
|
|
29
|
+
shell: 'bash',
|
|
30
|
+
terminal: 'bash',
|
|
31
|
+
cmd: 'bash',
|
|
32
|
+
run: 'bash',
|
|
33
|
+
exec: 'bash',
|
|
34
|
+
};
|
|
35
|
+
export class ToolRegistry {
|
|
36
|
+
tools = new Map();
|
|
37
|
+
register(def) {
|
|
38
|
+
this.tools.set(def.name, def);
|
|
39
|
+
}
|
|
40
|
+
get(name) {
|
|
41
|
+
return this.tools.get(name);
|
|
42
|
+
}
|
|
43
|
+
list() {
|
|
44
|
+
return Array.from(this.tools.keys());
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Resolve a hallucinated tool name to a registered one, or null.
|
|
48
|
+
* Case/underscore-insensitive so `Read`, `list_dir`, `Search_RAG` all map.
|
|
49
|
+
*/
|
|
50
|
+
suggestFor(name) {
|
|
51
|
+
const normalized = name.toLowerCase().replace(/[_-]/g, '');
|
|
52
|
+
const target = TOOL_NAME_ALIASES[normalized];
|
|
53
|
+
return target && this.tools.has(target) ? target : null;
|
|
54
|
+
}
|
|
55
|
+
/** Invoke a tool with validated input + timeout + audit + permissions check. */
|
|
56
|
+
async invoke(name, rawInput, options = {}) {
|
|
57
|
+
const tool = this.tools.get(name);
|
|
58
|
+
if (!tool) {
|
|
59
|
+
const suggestion = this.suggestFor(name);
|
|
60
|
+
return typedErr(`Tool "${name}" not found.` +
|
|
61
|
+
(suggestion ? ` Did you mean "${suggestion}"? Retry with that exact name.` : '') +
|
|
62
|
+
` Available: ${this.list().join(', ')}`);
|
|
63
|
+
}
|
|
64
|
+
// Zod validation
|
|
65
|
+
const parsed = tool.inputSchema.safeParse(rawInput);
|
|
66
|
+
if (!parsed.success) {
|
|
67
|
+
return typedErr(`Invalid input: ${parsed.error.message}`);
|
|
68
|
+
}
|
|
69
|
+
// Timeout + cancellation
|
|
70
|
+
const timeoutMs = options.timeoutMs ?? tool.timeoutMs ?? 30000;
|
|
71
|
+
const signal = options.signal;
|
|
72
|
+
const ctx = {
|
|
73
|
+
signal: signal ?? new AbortController().signal,
|
|
74
|
+
cwd: options.cwd ?? process.cwd(),
|
|
75
|
+
audit: () => { },
|
|
76
|
+
sessionId: options.sessionId ?? 'default',
|
|
77
|
+
};
|
|
78
|
+
try {
|
|
79
|
+
const result = await Promise.race([
|
|
80
|
+
tool.execute(parsed.data, ctx),
|
|
81
|
+
new Promise((_, reject) => {
|
|
82
|
+
const timer = setTimeout(() => reject(new Error(`Tool "${name}" timed out after ${timeoutMs}ms`)), timeoutMs);
|
|
83
|
+
signal?.addEventListener('abort', () => {
|
|
84
|
+
clearTimeout(timer);
|
|
85
|
+
reject(new Error(`Tool "${name}" aborted`));
|
|
86
|
+
});
|
|
87
|
+
}),
|
|
88
|
+
]);
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
93
|
+
return typedErr(error);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/** Return all tool definitions in OpenAI function-calling format. */
|
|
97
|
+
toOpenAITools() {
|
|
98
|
+
return Array.from(this.tools.values()).map((t) => ({
|
|
99
|
+
type: 'function',
|
|
100
|
+
function: {
|
|
101
|
+
name: t.name,
|
|
102
|
+
description: t.description,
|
|
103
|
+
parameters: t.jsonSchema ?? zodToJsonSchema(t.inputSchema),
|
|
104
|
+
},
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** Singleton instance (caller can override via setInstance). */
|
|
109
|
+
let _instance = null;
|
|
110
|
+
export function getToolRegistry() {
|
|
111
|
+
if (!_instance)
|
|
112
|
+
_instance = new ToolRegistry();
|
|
113
|
+
return _instance;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/tools/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { ZodSchema } from 'zod';
|
|
2
|
+
/** Discriminated union for tool execution results. */
|
|
3
|
+
export type TypedResult<T> = {
|
|
4
|
+
ok: true;
|
|
5
|
+
value: T;
|
|
6
|
+
} | {
|
|
7
|
+
ok: false;
|
|
8
|
+
error: string;
|
|
9
|
+
};
|
|
10
|
+
/** Tool permission categories. The CLI prompts the user before invoking
|
|
11
|
+
* tools with write/execute/network permissions. */
|
|
12
|
+
export type ToolPermission = 'read' | 'write' | 'execute' | 'network';
|
|
13
|
+
export interface ToolDefinition<I = unknown, O = unknown> {
|
|
14
|
+
/** Stable tool name (used by LLM function-calling). */
|
|
15
|
+
name: string;
|
|
16
|
+
/** Human-readable description (shown to LLM in prompt). */
|
|
17
|
+
description: string;
|
|
18
|
+
/** Permissions required to invoke. Empty array = no permissions. */
|
|
19
|
+
permissions: ToolPermission[];
|
|
20
|
+
/** Timeout in ms (default 30000 if not specified). */
|
|
21
|
+
timeoutMs?: number;
|
|
22
|
+
/** Zod schema for input validation. */
|
|
23
|
+
inputSchema: ZodSchema<I>;
|
|
24
|
+
/** Async executor. Receives validated input + context, returns TypedResult. */
|
|
25
|
+
execute: (input: I, ctx: ToolContext) => Promise<TypedResult<O>>;
|
|
26
|
+
/**
|
|
27
|
+
* Optional raw JSON Schema for the tool parameters. When present it is
|
|
28
|
+
* forwarded to the provider VERBATIM instead of converting inputSchema
|
|
29
|
+
* (used by MCP tools, whose servers publish JSON Schema directly and
|
|
30
|
+
* validate their own inputs — the local zod gate stays permissive).
|
|
31
|
+
*/
|
|
32
|
+
jsonSchema?: Record<string, unknown>;
|
|
33
|
+
/** Optional related tools (for discovery in UI). */
|
|
34
|
+
relatedTools?: string[];
|
|
35
|
+
}
|
|
36
|
+
export interface ToolContext {
|
|
37
|
+
/** Per-tool-call timeout + cancellation signal. */
|
|
38
|
+
signal: AbortSignal;
|
|
39
|
+
/** Working directory (defaults to process.cwd()). */
|
|
40
|
+
cwd: string;
|
|
41
|
+
/** Audit logger. Tools should call audit() for every invocation. */
|
|
42
|
+
audit: (entry: AuditEntry) => void;
|
|
43
|
+
/** Session id (for audit grouping). */
|
|
44
|
+
sessionId: string;
|
|
45
|
+
}
|
|
46
|
+
export interface AuditEntry {
|
|
47
|
+
tool: string;
|
|
48
|
+
args: unknown;
|
|
49
|
+
result: {
|
|
50
|
+
ok: boolean;
|
|
51
|
+
durationMs: number;
|
|
52
|
+
sizeBytes?: number;
|
|
53
|
+
};
|
|
54
|
+
ts: number;
|
|
55
|
+
sessionId: string;
|
|
56
|
+
}
|
|
57
|
+
/** Helper: wrap a thrown error into TypedResult. */
|
|
58
|
+
export declare function typedOk<T>(value: T): TypedResult<T>;
|
|
59
|
+
export declare function typedErr<T = never>(error: string): TypedResult<T>;
|
|
60
|
+
//# sourceMappingURL=toolTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolTypes.d.ts","sourceRoot":"","sources":["../../../src/core/tools/toolTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAGrC,sDAAsD;AACtD,MAAM,MAAM,WAAW,CAAC,CAAC,IACrB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACtB;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC;oDACoD;AACpD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAEtE,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO;IACtD,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAC1B,+EAA+E;IAC/E,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,MAAM,EAAE,WAAW,CAAC;IACpB,qDAAqD;IACrD,GAAG,EAAE,MAAM,CAAC;IACZ,oEAAoE;IACpE,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACnC,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,oDAAoD;AACpD,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAEnD;AAED,wBAAgB,QAAQ,CAAC,CAAC,GAAG,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAEjE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolTypes.js","sourceRoot":"","sources":["../../../src/core/tools/toolTypes.ts"],"names":[],"mappings":"AAuDA,oDAAoD;AACpD,MAAM,UAAU,OAAO,CAAI,KAAQ;IACjC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAY,KAAa;IAC/C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ZodSchema } from 'zod';
|
|
2
|
+
/** Convert a Zod schema into a JSON Schema-like object suitable for LLM
|
|
3
|
+
* function-calling definitions. Best-effort: handles primitives, objects,
|
|
4
|
+
* arrays, unions, optionals. Does not handle refinements beyond type. */
|
|
5
|
+
export declare function zodToJsonSchema(schema: ZodSchema): Record<string, unknown>;
|
|
6
|
+
//# sourceMappingURL=zodBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zodBridge.d.ts","sourceRoot":"","sources":["../../../src/core/tools/zodBridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,KAAK,CAAC;AAEjD;;0EAE0E;AAC1E,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAU1E"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/** Convert a Zod schema into a JSON Schema-like object suitable for LLM
|
|
2
|
+
* function-calling definitions. Best-effort: handles primitives, objects,
|
|
3
|
+
* arrays, unions, optionals. Does not handle refinements beyond type. */
|
|
4
|
+
export function zodToJsonSchema(schema) {
|
|
5
|
+
if (typeof schema.toJSONSchema === 'function') {
|
|
6
|
+
const res = schema.toJSONSchema();
|
|
7
|
+
if (res && typeof res === 'object') {
|
|
8
|
+
const copy = { ...res };
|
|
9
|
+
delete copy['$schema'];
|
|
10
|
+
return copy;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return _convert(schema);
|
|
14
|
+
}
|
|
15
|
+
function _convert(schema) {
|
|
16
|
+
const def = schema._def;
|
|
17
|
+
if (!def)
|
|
18
|
+
return {};
|
|
19
|
+
switch (def.typeName) {
|
|
20
|
+
case 'ZodString': return { type: 'string' };
|
|
21
|
+
case 'ZodNumber': return { type: 'number' };
|
|
22
|
+
case 'ZodBoolean': return { type: 'boolean' };
|
|
23
|
+
case 'ZodObject': {
|
|
24
|
+
const shape = schema.shape;
|
|
25
|
+
const properties = {};
|
|
26
|
+
const required = [];
|
|
27
|
+
for (const [key, value] of Object.entries(shape)) {
|
|
28
|
+
properties[key] = _convert(value);
|
|
29
|
+
// If inner type is not ZodOptional, mark required
|
|
30
|
+
const vDef = value._def;
|
|
31
|
+
if (vDef?.typeName !== 'ZodOptional') {
|
|
32
|
+
required.push(key);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return { type: 'object', properties, required };
|
|
36
|
+
}
|
|
37
|
+
case 'ZodArray': {
|
|
38
|
+
const inner = def.innerType;
|
|
39
|
+
return { type: 'array', items: _convert(inner) };
|
|
40
|
+
}
|
|
41
|
+
case 'ZodOptional': {
|
|
42
|
+
const inner = def.innerType;
|
|
43
|
+
return _convert(inner);
|
|
44
|
+
}
|
|
45
|
+
case 'ZodUnion': {
|
|
46
|
+
const options = def.options ?? [];
|
|
47
|
+
return { anyOf: options.map(_convert) };
|
|
48
|
+
}
|
|
49
|
+
case 'ZodEnum': {
|
|
50
|
+
const values = schema.options;
|
|
51
|
+
return { type: 'string', enum: values };
|
|
52
|
+
}
|
|
53
|
+
default: return {};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=zodBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zodBridge.js","sourceRoot":"","sources":["../../../src/core/tools/zodBridge.ts"],"names":[],"mappings":"AAEA;;0EAE0E;AAC1E,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,IAAI,OAAQ,MAAc,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;QACvD,MAAM,GAAG,GAAI,MAAc,CAAC,YAAY,EAAE,CAAC;QAC3C,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,MAAoB,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,QAAQ,CAAC,MAAkB;IAClC,MAAM,GAAG,GAAI,MAAgH,CAAC,IAAI,CAAC;IACnI,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,GAAG,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,WAAW,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC5C,KAAK,WAAW,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC5C,KAAK,YAAY,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC9C,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,KAAK,GAAI,MAA2D,CAAC,KAAK,CAAC;YACjF,MAAM,UAAU,GAA4B,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjD,UAAU,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAClC,kDAAkD;gBAClD,MAAM,IAAI,GAAI,KAAkE,CAAC,IAAI,CAAC;gBACtF,IAAI,IAAI,EAAE,QAAQ,KAAK,aAAa,EAAE,CAAC;oBACrC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;QAClD,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,KAAK,GAAG,GAAG,CAAC,SAAuB,CAAC;YAC1C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACnD,CAAC;QACD,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,KAAK,GAAG,GAAG,CAAC,SAAuB,CAAC;YAC1C,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,OAAO,GAAI,GAAG,CAAC,OAAwB,IAAI,EAAE,CAAC;YACpD,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1C,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,MAAM,GAAI,MAAoD,CAAC,OAAO,CAAC;YAC7E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1C,CAAC;QACD,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Council — multi-agent orchestration primitives.
|
|
3
|
+
* The 6 dantesche roles (Caronte, Nettuno, Gerione, Plutone, Minosse, Lucifero)
|
|
4
|
+
* coordinate via a feedback loop driven by the `runCouncilPure` generator.
|
|
5
|
+
*/
|
|
6
|
+
export * from '../agents/councilApi.js';
|
|
7
|
+
export * from './runMode.js';
|
|
8
|
+
export * from './modeBanners.js';
|
|
9
|
+
export * from '../agents/roles.js';
|
|
10
|
+
export * from '../agents/promoteMember.js';
|
|
11
|
+
export * from '../agents/councilDirectives.js';
|
|
12
|
+
export * from '../agents/systemPromptBuilder.js';
|
|
13
|
+
export * from '../agents/promptModules.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/council/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Council — multi-agent orchestration primitives.
|
|
3
|
+
* The 6 dantesche roles (Caronte, Nettuno, Gerione, Plutone, Minosse, Lucifero)
|
|
4
|
+
* coordinate via a feedback loop driven by the `runCouncilPure` generator.
|
|
5
|
+
*/
|
|
6
|
+
export * from '../agents/councilApi.js';
|
|
7
|
+
export * from './runMode.js';
|
|
8
|
+
export * from './modeBanners.js';
|
|
9
|
+
export * from '../agents/roles.js';
|
|
10
|
+
export * from '../agents/promoteMember.js';
|
|
11
|
+
export * from '../agents/councilDirectives.js';
|
|
12
|
+
export * from '../agents/systemPromptBuilder.js';
|
|
13
|
+
export * from '../agents/promptModules.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/council/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CouncilRunMode } from './runMode.js';
|
|
2
|
+
export declare const DESIGN_PHASE_MODE_BANNER = "COUNCIL RUN MODE: design-phase.\nWorkspace tool emissions described in your role prompt are MANDATORY in this run \u2014 prose alone does not count as a deliverable. Persist artifacts via the workspace tools listed in your AVAILABLE TOOLS section.";
|
|
3
|
+
export declare const IMPLEMENTATION_MODE_BANNER = "COUNCIL RUN MODE: implementation.\nPrefer write_file, edit_file, and bash for code changes. Design-phase mandatory workspace blocks in your role prompt are INACTIVE in this run \u2014 only call workspace tools when they add durable project value.";
|
|
4
|
+
export declare function councilModeBanner(runMode: CouncilRunMode): string;
|
|
5
|
+
//# sourceMappingURL=modeBanners.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modeBanners.d.ts","sourceRoot":"","sources":["../../src/council/modeBanners.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,eAAO,MAAM,wBAAwB,4PAC6K,CAAC;AAEnN,eAAO,MAAM,0BAA0B,2PACwK,CAAC;AAEhN,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAIjE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const DESIGN_PHASE_MODE_BANNER = `COUNCIL RUN MODE: design-phase.
|
|
2
|
+
Workspace tool emissions described in your role prompt are MANDATORY in this run — prose alone does not count as a deliverable. Persist artifacts via the workspace tools listed in your AVAILABLE TOOLS section.`;
|
|
3
|
+
export const IMPLEMENTATION_MODE_BANNER = `COUNCIL RUN MODE: implementation.
|
|
4
|
+
Prefer write_file, edit_file, and bash for code changes. Design-phase mandatory workspace blocks in your role prompt are INACTIVE in this run — only call workspace tools when they add durable project value.`;
|
|
5
|
+
export function councilModeBanner(runMode) {
|
|
6
|
+
return runMode === 'design-phase'
|
|
7
|
+
? DESIGN_PHASE_MODE_BANNER
|
|
8
|
+
: IMPLEMENTATION_MODE_BANNER;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=modeBanners.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modeBanners.js","sourceRoot":"","sources":["../../src/council/modeBanners.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,wBAAwB,GAAG;kNAC0K,CAAC;AAEnN,MAAM,CAAC,MAAM,0BAA0B,GAAG;+MACqK,CAAC;AAEhN,MAAM,UAAU,iBAAiB,CAAC,OAAuB;IACvD,OAAO,OAAO,KAAK,cAAc;QAC/B,CAAC,CAAC,wBAAwB;QAC1B,CAAC,CAAC,0BAA0B,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Council run-mode detection — implementation vs design-phase.
|
|
3
|
+
*
|
|
4
|
+
* Drives gated tool-emission enforcement, mode banners in member prompts,
|
|
5
|
+
* and the complete-design post-processor skip in implementation runs.
|
|
6
|
+
*/
|
|
7
|
+
export type CouncilRunMode = 'implementation' | 'design-phase';
|
|
8
|
+
export interface CouncilRunModeInput {
|
|
9
|
+
userMessage: string;
|
|
10
|
+
/** True when `.zelari/plan.json` exists with at least one phase. */
|
|
11
|
+
hasExistingPlan?: boolean;
|
|
12
|
+
forceMode?: CouncilRunMode;
|
|
13
|
+
env?: {
|
|
14
|
+
ZELARI_COUNCIL_MODE?: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Resolve how this council run should behave.
|
|
19
|
+
*
|
|
20
|
+
* Override order: `forceMode` → `ZELARI_COUNCIL_MODE` env → heuristics →
|
|
21
|
+
* default `implementation`.
|
|
22
|
+
*/
|
|
23
|
+
export declare function resolveCouncilRunMode(input: CouncilRunModeInput): CouncilRunMode;
|
|
24
|
+
export declare function councilTierFromSize(councilSize: number): 'lite' | 'full';
|
|
25
|
+
//# sourceMappingURL=runMode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runMode.d.ts","sourceRoot":"","sources":["../../src/council/runMode.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,cAAc,CAAC;AAE/D,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,GAAG,CAAC,EAAE;QAAE,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACxC;AAWD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,GAAG,cAAc,CAyBhF;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAExE"}
|