@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,61 @@
|
|
|
1
|
+
import type { AgentMessage, AgentToolSpec, ProviderStreamFn } from './AgentHarness.js';
|
|
2
|
+
/**
|
|
3
|
+
* Adapter that wraps a legacy LlmChatParams-based streaming call
|
|
4
|
+
* (streamMiniMax / streamGlm / streamGrok / streamCustom in llm.ts)
|
|
5
|
+
* into the new AgentHarness provider-stream interface.
|
|
6
|
+
*
|
|
7
|
+
* The adapter converts SSE chunks into ProviderDelta events:
|
|
8
|
+
* text chunks → { kind: 'text', delta }
|
|
9
|
+
* finish chunks → { kind: 'finish', reason }
|
|
10
|
+
* errors → { kind: 'error', message } (or thrown)
|
|
11
|
+
*/
|
|
12
|
+
export interface LegacyStreamFn {
|
|
13
|
+
(params: {
|
|
14
|
+
apiKey: string;
|
|
15
|
+
model: string;
|
|
16
|
+
provider: string;
|
|
17
|
+
messages: {
|
|
18
|
+
role: string;
|
|
19
|
+
content: string;
|
|
20
|
+
}[];
|
|
21
|
+
tools?: Array<{
|
|
22
|
+
type: 'function';
|
|
23
|
+
function: {
|
|
24
|
+
name: string;
|
|
25
|
+
description: string;
|
|
26
|
+
parameters: object;
|
|
27
|
+
};
|
|
28
|
+
}>;
|
|
29
|
+
temperature?: number;
|
|
30
|
+
stream: true;
|
|
31
|
+
customBaseUrl?: string;
|
|
32
|
+
customAuthStyle?: 'openai' | 'anthropic';
|
|
33
|
+
onChunk: (chunk: string) => void;
|
|
34
|
+
onRequestId?: (requestId: string) => void;
|
|
35
|
+
signal?: AbortSignal;
|
|
36
|
+
}): Promise<{
|
|
37
|
+
content: string;
|
|
38
|
+
toolCalls: Array<{
|
|
39
|
+
id: string;
|
|
40
|
+
name: string;
|
|
41
|
+
args: Record<string, unknown>;
|
|
42
|
+
}>;
|
|
43
|
+
}>;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Wrap a legacy stream function into a ProviderStreamFn that yields
|
|
47
|
+
* provider-neutral deltas. Text chunks are forwarded; finish/end is detected
|
|
48
|
+
* by the legacy function's resolved result (content length is the sum of deltas).
|
|
49
|
+
*
|
|
50
|
+
* NOTE: This adapter does NOT yield tool_call deltas yet — it treats tool calls
|
|
51
|
+
* as a single 'finish' + tools-in-result pattern. Full tool-call streaming lands
|
|
52
|
+
* in a later task.
|
|
53
|
+
*/
|
|
54
|
+
export declare function wrapLegacyStream(legacyStream: LegacyStreamFn, params: {
|
|
55
|
+
apiKey: string;
|
|
56
|
+
model: string;
|
|
57
|
+
provider: string;
|
|
58
|
+
customBaseUrl?: string;
|
|
59
|
+
customAuthStyle?: 'openai' | 'anthropic';
|
|
60
|
+
}, _messages: AgentMessage[], _tools: AgentToolSpec[]): ProviderStreamFn;
|
|
61
|
+
//# sourceMappingURL=providerStream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providerStream.d.ts","sourceRoot":"","sources":["../../src/core/providerStream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAiB,MAAM,mBAAmB,CAAC;AAEtG;;;;;;;;;GASG;AAEH,MAAM,WAAW,cAAc;IAC7B,CAAC,MAAM,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QAC9C,KAAK,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,UAAU,CAAC;YAAC,QAAQ,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,WAAW,EAAE,MAAM,CAAC;gBAAC,UAAU,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC,CAAC;QACzG,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,IAAI,CAAC;QACb,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,eAAe,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;QACzC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;QACjC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;QAC1C,MAAM,CAAC,EAAE,WAAW,CAAC;KACtB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;CACjH;AAoBD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,cAAc,EAC5B,MAAM,EAAE;IACN,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;CAC1C,EACD,SAAS,EAAE,YAAY,EAAE,EACzB,MAAM,EAAE,aAAa,EAAE,GACtB,gBAAgB,CAyElB"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert AgentHarness AgentMessage[] → legacy {role, content}[].
|
|
3
|
+
* Tool messages pass through their content (renderer fills these).
|
|
4
|
+
*/
|
|
5
|
+
function toLegacyMessages(messages) {
|
|
6
|
+
return messages.map((m) => ({ role: m.role, content: m.content }));
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Convert AgentHarness AgentToolSpec[] → legacy OpenAI-shaped tool descriptors.
|
|
10
|
+
*/
|
|
11
|
+
function toLegacyTools(tools) {
|
|
12
|
+
return tools.map((t) => ({
|
|
13
|
+
type: 'function',
|
|
14
|
+
function: { name: t.name, description: t.description, parameters: t.parameters },
|
|
15
|
+
}));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Wrap a legacy stream function into a ProviderStreamFn that yields
|
|
19
|
+
* provider-neutral deltas. Text chunks are forwarded; finish/end is detected
|
|
20
|
+
* by the legacy function's resolved result (content length is the sum of deltas).
|
|
21
|
+
*
|
|
22
|
+
* NOTE: This adapter does NOT yield tool_call deltas yet — it treats tool calls
|
|
23
|
+
* as a single 'finish' + tools-in-result pattern. Full tool-call streaming lands
|
|
24
|
+
* in a later task.
|
|
25
|
+
*/
|
|
26
|
+
export function wrapLegacyStream(legacyStream, params, _messages, _tools) {
|
|
27
|
+
return async function* (providerParams) {
|
|
28
|
+
const accumulatedChunks = [];
|
|
29
|
+
const legacyParams = {
|
|
30
|
+
apiKey: params.apiKey,
|
|
31
|
+
model: providerParams.model,
|
|
32
|
+
provider: providerParams.provider,
|
|
33
|
+
messages: toLegacyMessages(providerParams.messages),
|
|
34
|
+
tools: toLegacyTools(providerParams.tools),
|
|
35
|
+
temperature: 0.7,
|
|
36
|
+
stream: true,
|
|
37
|
+
customBaseUrl: params.customBaseUrl,
|
|
38
|
+
customAuthStyle: params.customAuthStyle,
|
|
39
|
+
onChunk: (chunk) => {
|
|
40
|
+
accumulatedChunks.push(chunk);
|
|
41
|
+
},
|
|
42
|
+
onRequestId: undefined,
|
|
43
|
+
signal: providerParams.signal,
|
|
44
|
+
};
|
|
45
|
+
// Fire the legacy stream and yield chunks as they arrive.
|
|
46
|
+
// We can't await the whole result before yielding — we need to yield
|
|
47
|
+
// chunks incrementally. Use a small async queue.
|
|
48
|
+
const queue = [];
|
|
49
|
+
let resolveNext = null;
|
|
50
|
+
let done = false;
|
|
51
|
+
let error = null;
|
|
52
|
+
const promise = legacyStream(legacyParams)
|
|
53
|
+
.then((result) => {
|
|
54
|
+
// After legacy stream completes, emit a tool_call event for each tool
|
|
55
|
+
// it returned (AgentHarness will then schedule tool execution in 12.6).
|
|
56
|
+
for (const tc of result.toolCalls) {
|
|
57
|
+
queue.push({ kind: 'tool_call', toolCallId: tc.id, toolName: tc.name, args: tc.args });
|
|
58
|
+
}
|
|
59
|
+
queue.push({ kind: 'finish', reason: 'stop' });
|
|
60
|
+
})
|
|
61
|
+
.catch((err) => {
|
|
62
|
+
error = err;
|
|
63
|
+
})
|
|
64
|
+
.finally(() => {
|
|
65
|
+
done = true;
|
|
66
|
+
if (resolveNext) {
|
|
67
|
+
resolveNext();
|
|
68
|
+
resolveNext = null;
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
// Pump chunks from accumulatedChunks every microtask
|
|
72
|
+
let lastEmittedIndex = 0;
|
|
73
|
+
while (!done || queue.length > 0 || lastEmittedIndex < accumulatedChunks.length) {
|
|
74
|
+
// Emit any new chunks
|
|
75
|
+
while (lastEmittedIndex < accumulatedChunks.length) {
|
|
76
|
+
yield { kind: 'text', delta: accumulatedChunks[lastEmittedIndex] };
|
|
77
|
+
lastEmittedIndex++;
|
|
78
|
+
}
|
|
79
|
+
// Emit any queued deltas
|
|
80
|
+
while (queue.length > 0) {
|
|
81
|
+
const d = queue.shift();
|
|
82
|
+
yield d;
|
|
83
|
+
}
|
|
84
|
+
// If error, throw
|
|
85
|
+
if (error) {
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
// If done but nothing left, exit
|
|
89
|
+
if (done)
|
|
90
|
+
break;
|
|
91
|
+
// Wait for next microtask
|
|
92
|
+
await new Promise((resolve) => {
|
|
93
|
+
resolveNext = resolve;
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
await promise; // Ensure the legacy promise resolves (catches final errors)
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=providerStream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providerStream.js","sourceRoot":"","sources":["../../src/core/providerStream.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sessionJsonl — append-only JSONL sidecar writer for a single agent session.
|
|
3
|
+
*
|
|
4
|
+
* Every {@link BrainEvent} is appended as one JSON object per line so the raw
|
|
5
|
+
* session transcript can be inspected with `cat`, `jq`, or any text editor.
|
|
6
|
+
* Each session gets its own file under `<baseDir>/<sessionId>.jsonl`.
|
|
7
|
+
*
|
|
8
|
+
* Pure `node:fs` — zero Electron deps, so this module is browser-importable
|
|
9
|
+
* for jsdom tests. The main-process caller passes `<userData>/sessions` as
|
|
10
|
+
* `baseDir`; tests pass a temp dir.
|
|
11
|
+
*
|
|
12
|
+
* @see docs/plans/2026-06-28-zelari-code.md (Task 12.3)
|
|
13
|
+
*/
|
|
14
|
+
import type { BrainEvent } from '../shared/events.js';
|
|
15
|
+
export interface SessionJsonlOptions {
|
|
16
|
+
/** Base directory for session files. Defaults to `<userData>/sessions/`
|
|
17
|
+
* in main process; tests can pass a temp dir explicitly. */
|
|
18
|
+
baseDir?: string;
|
|
19
|
+
/** Optional logger callback (defaults to console.error). */
|
|
20
|
+
onError?: (message: string) => void;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Append-only JSONL writer for a single session.
|
|
24
|
+
*
|
|
25
|
+
* One JSON object per line, shape:
|
|
26
|
+
* {"ts": <epoch-ms>, "sessionId": "<uuid>", "event": { ...BrainEvent }}
|
|
27
|
+
*
|
|
28
|
+
* The writer is line-buffered: every `append()` flushes synchronously
|
|
29
|
+
* to ensure no events are lost on crash. Uses O_APPEND for atomicity.
|
|
30
|
+
*
|
|
31
|
+
* Malformed lines on read are skipped (with a warning) so the file is
|
|
32
|
+
* always recoverable via `readSession()`.
|
|
33
|
+
*/
|
|
34
|
+
export declare class SessionJsonlWriter {
|
|
35
|
+
private readonly filePath;
|
|
36
|
+
private readonly onError;
|
|
37
|
+
constructor(sessionId: string, options?: SessionJsonlOptions);
|
|
38
|
+
/** Absolute path to the session JSONL file. */
|
|
39
|
+
get path(): string;
|
|
40
|
+
/** Append a BrainEvent as one JSON line. Creates the file + parent dirs if missing. */
|
|
41
|
+
append(event: BrainEvent): Promise<void>;
|
|
42
|
+
/** Close the writer (no-op currently, but reserved for future buffered mode). */
|
|
43
|
+
close(): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Read all events from a session JSONL file. Malformed lines are skipped.
|
|
47
|
+
* Returns an empty array if the file does not exist.
|
|
48
|
+
*/
|
|
49
|
+
export declare function readSession(filePath: string): Promise<BrainEvent[]>;
|
|
50
|
+
//# sourceMappingURL=sessionJsonl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionJsonl.d.ts","sourceRoot":"","sources":["../../src/core/sessionJsonl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,WAAW,mBAAmB;IAClC;iEAC6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;gBAEpC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB;IAMhE,+CAA+C;IAC/C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,uFAAuF;IACjF,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9C,iFAAiF;IAC3E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAqBzE"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sessionJsonl — append-only JSONL sidecar writer for a single agent session.
|
|
3
|
+
*
|
|
4
|
+
* Every {@link BrainEvent} is appended as one JSON object per line so the raw
|
|
5
|
+
* session transcript can be inspected with `cat`, `jq`, or any text editor.
|
|
6
|
+
* Each session gets its own file under `<baseDir>/<sessionId>.jsonl`.
|
|
7
|
+
*
|
|
8
|
+
* Pure `node:fs` — zero Electron deps, so this module is browser-importable
|
|
9
|
+
* for jsdom tests. The main-process caller passes `<userData>/sessions` as
|
|
10
|
+
* `baseDir`; tests pass a temp dir.
|
|
11
|
+
*
|
|
12
|
+
* @see docs/plans/2026-06-28-zelari-code.md (Task 12.3)
|
|
13
|
+
*/
|
|
14
|
+
import { promises as fs } from 'node:fs';
|
|
15
|
+
import path from 'node:path';
|
|
16
|
+
import os from 'node:os';
|
|
17
|
+
/**
|
|
18
|
+
* Append-only JSONL writer for a single session.
|
|
19
|
+
*
|
|
20
|
+
* One JSON object per line, shape:
|
|
21
|
+
* {"ts": <epoch-ms>, "sessionId": "<uuid>", "event": { ...BrainEvent }}
|
|
22
|
+
*
|
|
23
|
+
* The writer is line-buffered: every `append()` flushes synchronously
|
|
24
|
+
* to ensure no events are lost on crash. Uses O_APPEND for atomicity.
|
|
25
|
+
*
|
|
26
|
+
* Malformed lines on read are skipped (with a warning) so the file is
|
|
27
|
+
* always recoverable via `readSession()`.
|
|
28
|
+
*/
|
|
29
|
+
export class SessionJsonlWriter {
|
|
30
|
+
filePath;
|
|
31
|
+
onError;
|
|
32
|
+
constructor(sessionId, options = {}) {
|
|
33
|
+
const baseDir = options.baseDir ?? defaultBaseDir();
|
|
34
|
+
this.filePath = path.join(baseDir, `${sessionId}.jsonl`);
|
|
35
|
+
this.onError = options.onError ?? console.error;
|
|
36
|
+
}
|
|
37
|
+
/** Absolute path to the session JSONL file. */
|
|
38
|
+
get path() {
|
|
39
|
+
return this.filePath;
|
|
40
|
+
}
|
|
41
|
+
/** Append a BrainEvent as one JSON line. Creates the file + parent dirs if missing. */
|
|
42
|
+
async append(event) {
|
|
43
|
+
try {
|
|
44
|
+
await fs.mkdir(path.dirname(this.filePath), { recursive: true });
|
|
45
|
+
const line = JSON.stringify({
|
|
46
|
+
ts: event.ts,
|
|
47
|
+
sessionId: event.sessionId,
|
|
48
|
+
event,
|
|
49
|
+
}) + '\n';
|
|
50
|
+
await fs.appendFile(this.filePath, line, { encoding: 'utf-8', mode: 0o644 });
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
this.onError(`[sessionJsonl] failed to append event to ${this.filePath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/** Close the writer (no-op currently, but reserved for future buffered mode). */
|
|
57
|
+
async close() {
|
|
58
|
+
// No buffered state to flush yet.
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Read all events from a session JSONL file. Malformed lines are skipped.
|
|
63
|
+
* Returns an empty array if the file does not exist.
|
|
64
|
+
*/
|
|
65
|
+
export async function readSession(filePath) {
|
|
66
|
+
try {
|
|
67
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
68
|
+
const events = [];
|
|
69
|
+
for (const line of content.split('\n')) {
|
|
70
|
+
const trimmed = line.trim();
|
|
71
|
+
if (!trimmed)
|
|
72
|
+
continue;
|
|
73
|
+
try {
|
|
74
|
+
const parsed = JSON.parse(trimmed);
|
|
75
|
+
if (parsed && typeof parsed === 'object' && 'event' in parsed) {
|
|
76
|
+
events.push(parsed.event);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Skip malformed lines silently.
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return events;
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
if (err.code === 'ENOENT')
|
|
87
|
+
return [];
|
|
88
|
+
throw err;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** Default base directory: `<userData>/sessions/` (resolved at runtime via electron.app).
|
|
92
|
+
* In test environments, override via `new SessionJsonlWriter(id, { baseDir: '/tmp/test' })`. */
|
|
93
|
+
function defaultBaseDir() {
|
|
94
|
+
// We can't import 'electron' here (this module is browser-importable for tests).
|
|
95
|
+
// The caller must pass baseDir explicitly OR we use a sensible fallback.
|
|
96
|
+
// In main process, the AgentHarness caller will pass `<userData>/sessions`.
|
|
97
|
+
return path.join(os.tmpdir(), 'zelari-code', 'sessions');
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=sessionJsonl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionJsonl.js","sourceRoot":"","sources":["../../src/core/sessionJsonl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AuditEntry } from './toolTypes.js';
|
|
2
|
+
/** In-memory audit log (last N entries). Persisting to disk is a follow-up. */
|
|
3
|
+
export declare class AuditLog {
|
|
4
|
+
private entries;
|
|
5
|
+
private maxEntries;
|
|
6
|
+
constructor(maxEntries?: number);
|
|
7
|
+
record(entry: AuditEntry): void;
|
|
8
|
+
/** Return the last N entries (most recent last). */
|
|
9
|
+
recent(n?: number): AuditEntry[];
|
|
10
|
+
/** Filter by sessionId. */
|
|
11
|
+
bySession(sessionId: string): AuditEntry[];
|
|
12
|
+
clear(): void;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=auditLog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auditLog.d.ts","sourceRoot":"","sources":["../../../src/core/tools/auditLog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,+EAA+E;AAC/E,qBAAa,QAAQ;IACnB,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,SAAO;IAI7B,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAO/B,oDAAoD;IACpD,MAAM,CAAC,CAAC,SAAK,GAAG,UAAU,EAAE;IAI5B,2BAA2B;IAC3B,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE;IAI1C,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** In-memory audit log (last N entries). Persisting to disk is a follow-up. */
|
|
2
|
+
export class AuditLog {
|
|
3
|
+
entries = [];
|
|
4
|
+
maxEntries;
|
|
5
|
+
constructor(maxEntries = 1000) {
|
|
6
|
+
this.maxEntries = maxEntries;
|
|
7
|
+
}
|
|
8
|
+
record(entry) {
|
|
9
|
+
this.entries.push(entry);
|
|
10
|
+
if (this.entries.length > this.maxEntries) {
|
|
11
|
+
this.entries.shift();
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/** Return the last N entries (most recent last). */
|
|
15
|
+
recent(n = 50) {
|
|
16
|
+
return this.entries.slice(-n);
|
|
17
|
+
}
|
|
18
|
+
/** Filter by sessionId. */
|
|
19
|
+
bySession(sessionId) {
|
|
20
|
+
return this.entries.filter((e) => e.sessionId === sessionId);
|
|
21
|
+
}
|
|
22
|
+
clear() {
|
|
23
|
+
this.entries = [];
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=auditLog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auditLog.js","sourceRoot":"","sources":["../../../src/core/tools/auditLog.ts"],"names":[],"mappings":"AAEA,+EAA+E;AAC/E,MAAM,OAAO,QAAQ;IACX,OAAO,GAAiB,EAAE,CAAC;IAC3B,UAAU,CAAS;IAE3B,YAAY,UAAU,GAAG,IAAI;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,KAAiB;QACtB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,MAAM,CAAC,CAAC,GAAG,EAAE;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IAED,2BAA2B;IAC3B,SAAS,CAAC,SAAiB;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* _walk — Shared directory walker used by list_files and grep_content.
|
|
3
|
+
*
|
|
4
|
+
* Walks a directory recursively up to {@link maxDepth} and yields
|
|
5
|
+
* {@link FileEntry} objects (path relative to the walked directory + type).
|
|
6
|
+
* Honors {@link exclude} glob patterns and skips unreadable subdirectories
|
|
7
|
+
* silently. Honors {@link signal} for cancellation.
|
|
8
|
+
*
|
|
9
|
+
* Glob syntax (intentionally minimal — no external deps):
|
|
10
|
+
* - `*` → any sequence of non-/ characters
|
|
11
|
+
* - `?` → any single non-/ character
|
|
12
|
+
* - `[abc]` → char class
|
|
13
|
+
* - Everything else is a literal (special regex chars auto-escaped)
|
|
14
|
+
*
|
|
15
|
+
* @internal Exported for tests + sibling tools in `builtin/`.
|
|
16
|
+
*/
|
|
17
|
+
export interface FileEntry {
|
|
18
|
+
/** Path relative to the listed directory. */
|
|
19
|
+
name: string;
|
|
20
|
+
/** 'file' | 'directory' | 'other' (symlink, socket, etc.). */
|
|
21
|
+
type: 'file' | 'directory' | 'other';
|
|
22
|
+
}
|
|
23
|
+
export declare function matchesAny(name: string, patterns: string[]): boolean;
|
|
24
|
+
export declare const DEFAULT_EXCLUDES: string[];
|
|
25
|
+
/**
|
|
26
|
+
* Walk a directory tree, collecting file/dir entries.
|
|
27
|
+
* Mutates {@link entries} in place (avoids large array allocations on deep trees).
|
|
28
|
+
*
|
|
29
|
+
* Depth semantics: depth=0 means "do NOT descend into subdirectories" (root
|
|
30
|
+
* entries only). depth=N means "descend at most N levels below root".
|
|
31
|
+
*
|
|
32
|
+
* The root directory itself is NOT added as an entry.
|
|
33
|
+
*/
|
|
34
|
+
export declare function walk(dir: string, baseRel: string, depth: number, maxDepth: number, exclude: string[], entries: FileEntry[], signal: AbortSignal | undefined): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Filter a flat list of FileEntry to those whose relative path matches at
|
|
37
|
+
* least one of {@link include} globs (matched against forward-slash paths).
|
|
38
|
+
*/
|
|
39
|
+
export declare function filterByInclude(entries: FileEntry[], include: string[]): FileEntry[];
|
|
40
|
+
//# sourceMappingURL=_walk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_walk.d.ts","sourceRoot":"","sources":["../../../../src/core/tools/builtin/_walk.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,SAAS;IACxB,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC;CACtC;AAoDD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAMpE;AAED,eAAO,MAAM,gBAAgB,UAY5B,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAsB,IAAI,CACxB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,SAAS,EAAE,EACpB,MAAM,EAAE,WAAW,GAAG,SAAS,GAC9B,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CASpF"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
const REGEX_ESCAPE = /[.+^${}()|[\]\\]/g;
|
|
4
|
+
function escapeRegex(p) {
|
|
5
|
+
return p.replace(REGEX_ESCAPE, '\\$&');
|
|
6
|
+
}
|
|
7
|
+
function globToRegex(glob) {
|
|
8
|
+
// Convert glob pattern to anchored RegExp.
|
|
9
|
+
// Semantics:
|
|
10
|
+
// - `*` → any chars except `/` (one segment)
|
|
11
|
+
// - `**` → any chars including `/` (zero or more segments)
|
|
12
|
+
// - `**/` → zero or more dirs (must be followed by something or end)
|
|
13
|
+
// - `?` → any single char except `/`
|
|
14
|
+
// - `[abc]` → char class
|
|
15
|
+
// - everything else is literal (regex special chars auto-escaped)
|
|
16
|
+
let re = '';
|
|
17
|
+
for (let i = 0; i < glob.length; i++) {
|
|
18
|
+
const c = glob[i];
|
|
19
|
+
if (c === '*') {
|
|
20
|
+
if (glob[i + 1] === '*') {
|
|
21
|
+
if (glob[i + 2] === '/') {
|
|
22
|
+
// **/ → zero or more dirs. Skip both stars AND the slash.
|
|
23
|
+
re += '(?:.*/)?';
|
|
24
|
+
i += 2; // skip second * AND trailing /
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
// ** at end (or **<not-slash>) → match anything
|
|
28
|
+
re += '.*';
|
|
29
|
+
i++; // skip second *
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// single * → match within one segment
|
|
34
|
+
re += '[^/]*';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else if (c === '?') {
|
|
38
|
+
re += '[^/]';
|
|
39
|
+
}
|
|
40
|
+
else if (c === '[') {
|
|
41
|
+
const end = glob.indexOf(']', i);
|
|
42
|
+
if (end === -1) {
|
|
43
|
+
re += escapeRegex(c);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
re += glob.slice(i, end + 1);
|
|
47
|
+
i = end;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
re += escapeRegex(c);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return new RegExp('^' + re + '$');
|
|
55
|
+
}
|
|
56
|
+
export function matchesAny(name, patterns) {
|
|
57
|
+
for (const p of patterns) {
|
|
58
|
+
const re = globToRegex(p);
|
|
59
|
+
if (re.test(name))
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
export const DEFAULT_EXCLUDES = [
|
|
65
|
+
'node_modules',
|
|
66
|
+
'.git',
|
|
67
|
+
'dist',
|
|
68
|
+
'build',
|
|
69
|
+
'.next',
|
|
70
|
+
'__pycache__',
|
|
71
|
+
'.cache',
|
|
72
|
+
'.zelari', // v3-W workspace storage (never inspect)
|
|
73
|
+
'.venv',
|
|
74
|
+
'coverage',
|
|
75
|
+
'.nyc_output',
|
|
76
|
+
];
|
|
77
|
+
/**
|
|
78
|
+
* Walk a directory tree, collecting file/dir entries.
|
|
79
|
+
* Mutates {@link entries} in place (avoids large array allocations on deep trees).
|
|
80
|
+
*
|
|
81
|
+
* Depth semantics: depth=0 means "do NOT descend into subdirectories" (root
|
|
82
|
+
* entries only). depth=N means "descend at most N levels below root".
|
|
83
|
+
*
|
|
84
|
+
* The root directory itself is NOT added as an entry.
|
|
85
|
+
*/
|
|
86
|
+
export async function walk(dir, baseRel, depth, maxDepth, exclude, entries, signal) {
|
|
87
|
+
if (depth > maxDepth)
|
|
88
|
+
return;
|
|
89
|
+
if (signal?.aborted)
|
|
90
|
+
return;
|
|
91
|
+
let dirents;
|
|
92
|
+
try {
|
|
93
|
+
dirents = await fs.readdir(dir, { withFileTypes: true });
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return; // unreadable subdirectory — skip silently
|
|
97
|
+
}
|
|
98
|
+
if (signal?.aborted)
|
|
99
|
+
return;
|
|
100
|
+
for (const dirent of dirents) {
|
|
101
|
+
if (matchesAny(dirent.name, exclude))
|
|
102
|
+
continue;
|
|
103
|
+
const rel = baseRel ? `${baseRel}/${dirent.name}` : dirent.name;
|
|
104
|
+
const isDir = dirent.isDirectory();
|
|
105
|
+
entries.push({
|
|
106
|
+
name: rel,
|
|
107
|
+
type: isDir ? 'directory' : dirent.isFile() ? 'file' : 'other',
|
|
108
|
+
});
|
|
109
|
+
if (isDir && depth < maxDepth) {
|
|
110
|
+
await walk(path.join(dir, dirent.name), rel, depth + 1, maxDepth, exclude, entries, signal);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Filter a flat list of FileEntry to those whose relative path matches at
|
|
116
|
+
* least one of {@link include} globs (matched against forward-slash paths).
|
|
117
|
+
*/
|
|
118
|
+
export function filterByInclude(entries, include) {
|
|
119
|
+
if (include.length === 0 || (include.length === 1 && include[0] === '*')) {
|
|
120
|
+
return entries.filter(e => e.type === 'file');
|
|
121
|
+
}
|
|
122
|
+
const regexes = include.map(globToRegex);
|
|
123
|
+
return entries.filter(e => {
|
|
124
|
+
if (e.type !== 'file')
|
|
125
|
+
return false;
|
|
126
|
+
return regexes.some(re => re.test(e.name));
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=_walk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_walk.js","sourceRoot":"","sources":["../../../../src/core/tools/builtin/_walk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { type ToolDefinition } from '../toolTypes.js';
|
|
3
|
+
interface DiffHunkSummary {
|
|
4
|
+
oldStart: number;
|
|
5
|
+
oldLines: number;
|
|
6
|
+
newStart: number;
|
|
7
|
+
newLines: number;
|
|
8
|
+
added: number;
|
|
9
|
+
removed: number;
|
|
10
|
+
}
|
|
11
|
+
declare const ShowDiffArgsSchema: z.ZodObject<{
|
|
12
|
+
path: z.ZodString;
|
|
13
|
+
proposedContent: z.ZodString;
|
|
14
|
+
contextLines: z.ZodDefault<z.ZodNumber>;
|
|
15
|
+
}, z.core.$strip>;
|
|
16
|
+
export { ShowDiffArgsSchema };
|
|
17
|
+
type ShowDiffArgs = z.infer<typeof ShowDiffArgsSchema>;
|
|
18
|
+
interface ShowDiffResult {
|
|
19
|
+
path: string;
|
|
20
|
+
diff: string;
|
|
21
|
+
hunks: DiffHunkSummary[];
|
|
22
|
+
added: number;
|
|
23
|
+
removed: number;
|
|
24
|
+
unchanged: boolean;
|
|
25
|
+
}
|
|
26
|
+
export declare const showDiffTool: ToolDefinition<ShowDiffArgs, ShowDiffResult>;
|
|
27
|
+
declare const ApplyDiffArgsSchema: z.ZodObject<{
|
|
28
|
+
path: z.ZodString;
|
|
29
|
+
diff: z.ZodString;
|
|
30
|
+
fuzzyMatch: z.ZodDefault<z.ZodBoolean>;
|
|
31
|
+
dryRun: z.ZodDefault<z.ZodBoolean>;
|
|
32
|
+
}, z.core.$strip>;
|
|
33
|
+
export { ApplyDiffArgsSchema };
|
|
34
|
+
type ApplyDiffArgs = z.infer<typeof ApplyDiffArgsSchema>;
|
|
35
|
+
interface ApplyDiffResult {
|
|
36
|
+
path: string;
|
|
37
|
+
applied: boolean;
|
|
38
|
+
hunksApplied: number;
|
|
39
|
+
hunksSkipped: number;
|
|
40
|
+
finalContent: string;
|
|
41
|
+
dryRun: boolean;
|
|
42
|
+
reason?: string;
|
|
43
|
+
}
|
|
44
|
+
export declare const applyDiffTool: ToolDefinition<ApplyDiffArgs, ApplyDiffResult>;
|
|
45
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../../src/core/tools/builtin/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAuBzE,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AA0QD,QAAA,MAAM,kBAAkB;;;;iBAItB,CAAC;AAEH,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,KAAK,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEvD,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,YAAY,EAAE,cAAc,CAwGrE,CAAC;AAMF,QAAA,MAAM,mBAAmB;;;;;iBAKvB,CAAC;AAEH,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAE/B,KAAK,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEzD,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,aAAa,EAAE,cAAc,CAAC,aAAa,EAAE,eAAe,CAsDxE,CAAC"}
|