zelari-code 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +156 -0
- package/bin/zelari-code.js +64 -0
- package/dist/agents/advancedTools.js +115 -0
- package/dist/agents/advancedTools.js.map +1 -0
- package/dist/agents/councilApi.js +375 -0
- package/dist/agents/councilApi.js.map +1 -0
- package/dist/agents/councilDirectives.js +100 -0
- package/dist/agents/councilDirectives.js.map +1 -0
- package/dist/agents/promoteMember.js +210 -0
- package/dist/agents/promoteMember.js.map +1 -0
- package/dist/agents/promptModules.js +139 -0
- package/dist/agents/promptModules.js.map +1 -0
- package/dist/agents/roles.js +281 -0
- package/dist/agents/roles.js.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.js +301 -0
- package/dist/agents/skills/builtin/docs.js.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.js +335 -0
- package/dist/agents/skills/builtin/planning.js.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.js +302 -0
- package/dist/agents/skills/builtin/review.js.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.js +272 -0
- package/dist/agents/skills.js.map +1 -0
- package/dist/agents/systemPromptBuilder.js +151 -0
- package/dist/agents/systemPromptBuilder.js.map +1 -0
- package/dist/agents/toolSchemas.js +249 -0
- package/dist/agents/toolSchemas.js.map +1 -0
- package/dist/agents/tools.js +196 -0
- package/dist/agents/tools.js.map +1 -0
- package/dist/agents/vaultTools.js +134 -0
- package/dist/agents/vaultTools.js.map +1 -0
- package/dist/cli/app.js +1823 -0
- package/dist/cli/app.js.map +1 -0
- package/dist/cli/branchManager.js +280 -0
- package/dist/cli/branchManager.js.map +1 -0
- package/dist/cli/compaction.js +63 -0
- package/dist/cli/compaction.js.map +1 -0
- package/dist/cli/components/ChatStream.js +23 -0
- package/dist/cli/components/ChatStream.js.map +1 -0
- package/dist/cli/components/CollapsibleToolOutput.js +38 -0
- package/dist/cli/components/CollapsibleToolOutput.js.map +1 -0
- package/dist/cli/components/Header.js +31 -0
- package/dist/cli/components/Header.js.map +1 -0
- package/dist/cli/components/InputBar.js +9 -0
- package/dist/cli/components/InputBar.js.map +1 -0
- package/dist/cli/components/Sidebar.js +17 -0
- package/dist/cli/components/Sidebar.js.map +1 -0
- package/dist/cli/councilCost.js +81 -0
- package/dist/cli/councilCost.js.map +1 -0
- package/dist/cli/councilDispatcher.js +56 -0
- package/dist/cli/councilDispatcher.js.map +1 -0
- package/dist/cli/councilFeedback.js +164 -0
- package/dist/cli/councilFeedback.js.map +1 -0
- package/dist/cli/crossProviderFailover.js +83 -0
- package/dist/cli/crossProviderFailover.js.map +1 -0
- package/dist/cli/gitOps.js +96 -0
- package/dist/cli/gitOps.js.map +1 -0
- package/dist/cli/grokOAuth.js +375 -0
- package/dist/cli/grokOAuth.js.map +1 -0
- package/dist/cli/keyStore.js +263 -0
- package/dist/cli/keyStore.js.map +1 -0
- package/dist/cli/keyValidator.js +83 -0
- package/dist/cli/keyValidator.js.map +1 -0
- package/dist/cli/main.bundled.js +21428 -0
- package/dist/cli/main.bundled.js.map +7 -0
- package/dist/cli/main.js +72 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/metrics.js +131 -0
- package/dist/cli/metrics.js.map +1 -0
- package/dist/cli/modelDiscovery.js +234 -0
- package/dist/cli/modelDiscovery.js.map +1 -0
- package/dist/cli/modelPricing.js +112 -0
- package/dist/cli/modelPricing.js.map +1 -0
- package/dist/cli/oauthCallbackServer.js +207 -0
- package/dist/cli/oauthCallbackServer.js.map +1 -0
- package/dist/cli/provider/openai-compatible.js +236 -0
- package/dist/cli/provider/openai-compatible.js.map +1 -0
- package/dist/cli/providerConfig.js +210 -0
- package/dist/cli/providerConfig.js.map +1 -0
- package/dist/cli/providerFailover.js +90 -0
- package/dist/cli/providerFailover.js.map +1 -0
- package/dist/cli/refreshRegistry.js +77 -0
- package/dist/cli/refreshRegistry.js.map +1 -0
- package/dist/cli/safety/auditLogger.js +111 -0
- package/dist/cli/safety/auditLogger.js.map +1 -0
- package/dist/cli/safety/sandboxPath.js +62 -0
- package/dist/cli/safety/sandboxPath.js.map +1 -0
- package/dist/cli/safety/shellBlocklist.js +71 -0
- package/dist/cli/safety/shellBlocklist.js.map +1 -0
- package/dist/cli/sessionManager.js +149 -0
- package/dist/cli/sessionManager.js.map +1 -0
- package/dist/cli/skillCache.js +205 -0
- package/dist/cli/skillCache.js.map +1 -0
- package/dist/cli/skillHistory.js +178 -0
- package/dist/cli/skillHistory.js.map +1 -0
- package/dist/cli/skillSuggest.js +132 -0
- package/dist/cli/skillSuggest.js.map +1 -0
- package/dist/cli/slashCommands.js +431 -0
- package/dist/cli/slashCommands.js.map +1 -0
- package/dist/cli/toolRegistry.js +187 -0
- package/dist/cli/toolRegistry.js.map +1 -0
- package/dist/cli/updater.js +157 -0
- package/dist/cli/updater.js.map +1 -0
- package/dist/main/core/AgentHarness.js +345 -0
- package/dist/main/core/AgentHarness.js.map +1 -0
- package/dist/main/core/providerStream.js +99 -0
- package/dist/main/core/providerStream.js.map +1 -0
- package/dist/main/core/sessionJsonl.js +99 -0
- package/dist/main/core/sessionJsonl.js.map +1 -0
- package/dist/main/core/tools/auditLog.js +26 -0
- package/dist/main/core/tools/auditLog.js.map +1 -0
- package/dist/main/core/tools/builtin/filesystem.js +110 -0
- package/dist/main/core/tools/builtin/filesystem.js.map +1 -0
- package/dist/main/core/tools/builtin/search.js +56 -0
- package/dist/main/core/tools/builtin/search.js.map +1 -0
- package/dist/main/core/tools/builtin/shell.js +51 -0
- package/dist/main/core/tools/builtin/shell.js.map +1 -0
- package/dist/main/core/tools/registry.js +71 -0
- package/dist/main/core/tools/registry.js.map +1 -0
- package/dist/main/core/tools/toolTypes.js +8 -0
- package/dist/main/core/tools/toolTypes.js.map +1 -0
- package/dist/main/core/tools/zodBridge.js +48 -0
- package/dist/main/core/tools/zodBridge.js.map +1 -0
- package/dist/shared/eventBus.js +104 -0
- package/dist/shared/eventBus.js.map +1 -0
- package/dist/shared/events.js +73 -0
- package/dist/shared/events.js.map +1 -0
- package/dist/shared/index.js +8 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/types/context.js +3 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/knowledge.js +2 -0
- package/dist/types/knowledge.js.map +1 -0
- package/dist/types/systemTypes.js +10 -0
- package/dist/types/systemTypes.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse a user input string starting with '/' into a SlashCommand + args.
|
|
3
|
+
* Returns { command, args } or null if not a slash command.
|
|
4
|
+
*/
|
|
5
|
+
function parseSlashCommand(text) {
|
|
6
|
+
const trimmed = text.trim();
|
|
7
|
+
if (!trimmed.startsWith('/'))
|
|
8
|
+
return null;
|
|
9
|
+
const parts = trimmed.slice(1).split(/\s+/);
|
|
10
|
+
const command = parts[0];
|
|
11
|
+
const args = parts.slice(1);
|
|
12
|
+
return { command, args };
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Expand a skill's systemPromptFragment + the user's input into a complete
|
|
16
|
+
* prompt ready to send to AgentHarness. If the skill is invoked WITHOUT
|
|
17
|
+
* an input arg (e.g. just `/skill architect-feature`), generate a placeholder
|
|
18
|
+
* prompt asking the user for the input.
|
|
19
|
+
*/
|
|
20
|
+
export function expandSkillTemplate(skill, options = {}) {
|
|
21
|
+
const userInput = options.input?.trim() ?? '';
|
|
22
|
+
const prompt = userInput
|
|
23
|
+
? `${skill.systemPromptFragment}\n\n## User input\n${userInput}`
|
|
24
|
+
: `${skill.systemPromptFragment}\n\n## User input\n(Please provide the task description or input for this skill.)`;
|
|
25
|
+
return {
|
|
26
|
+
skillId: skill.id,
|
|
27
|
+
prompt,
|
|
28
|
+
requiredRoles: skill.requiredRoles,
|
|
29
|
+
requiredTools: skill.requiredTools,
|
|
30
|
+
estimatedCost: skill.estimatedCost,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Format the list of available skills for `/skill` autocomplete or `/help`.
|
|
35
|
+
* Group by category.
|
|
36
|
+
*/
|
|
37
|
+
export function formatSkillList(skills) {
|
|
38
|
+
if (skills.length === 0)
|
|
39
|
+
return '(no skills available)';
|
|
40
|
+
const byCategory = new Map();
|
|
41
|
+
for (const skill of skills) {
|
|
42
|
+
const list = byCategory.get(skill.category) ?? [];
|
|
43
|
+
list.push(skill);
|
|
44
|
+
byCategory.set(skill.category, list);
|
|
45
|
+
}
|
|
46
|
+
const lines = ['Available skills:'];
|
|
47
|
+
for (const [category, list] of [...byCategory.entries()].sort()) {
|
|
48
|
+
lines.push(`\n[${category}]`);
|
|
49
|
+
for (const skill of list) {
|
|
50
|
+
const costLabel = skill.estimatedCost;
|
|
51
|
+
lines.push(` /skill ${skill.id} — ${skill.name} (${costLabel} cost)`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return lines.join('\n');
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Handle a slash command from the CLI user. Returns a SlashCommandResult
|
|
58
|
+
* describing what the caller should do. Pure function — no side effects,
|
|
59
|
+
* no I/O. The caller (Phase 14's Ink UI) is responsible for actually
|
|
60
|
+
* performing the action (e.g. sending the expandedSkill.prompt to
|
|
61
|
+
* AgentHarness, clearing the transcript, etc.).
|
|
62
|
+
*/
|
|
63
|
+
export function handleSlashCommand(text, availableSkills) {
|
|
64
|
+
const parsed = parseSlashCommand(text);
|
|
65
|
+
if (!parsed) {
|
|
66
|
+
return { handled: false, kind: 'unknown' };
|
|
67
|
+
}
|
|
68
|
+
const { command, args } = parsed;
|
|
69
|
+
switch (command) {
|
|
70
|
+
case 'help':
|
|
71
|
+
return {
|
|
72
|
+
handled: true,
|
|
73
|
+
kind: 'help',
|
|
74
|
+
message: `Available commands:\n /login <provider> — authenticate with provider (grok, minimax, glm, custom)\n /model <name> — switch the active model\n /model refresh — re-discover models for the active provider (v3-U)\n /models — list discovered models for the active provider (v3-U)\n /models refresh — re-discover models for the active provider (v3-U)\n /provider <name> — switch the active provider\n /provider custom <baseUrl> — point the active provider at a self-hosted endpoint (Ollama, LM Studio, vLLM, ...)\n /provider custom clear — clear the custom endpoint override\n /skill <name> [input] — invoke a skill (autocomplete with /skill <TAB>)\n /skill-stats [name] — show invocation stats (success rate, avg duration, total tokens)\n /council <input> — invoke the multi-agent council on input\n /council-feedback <memberId> <1-5> [note] — rate a council member for future ranking (Task I.2)
|
|
75
|
+
/promote-member <memberId> — promote a council member to a standalone skill (v3-K)
|
|
76
|
+
/update [--yes|-y] — check for zelari-coder updates; --yes performs the update (v3-N)\n /steer <text> — enqueue a follow-up prompt on the active run (Task 18.2)\n /steer --interrupt <text> — cancel current run + enqueue <text> for next dispatch (Task C.3.2)\n /compact — compact the session transcript\n /clear — clear the visible transcript (session is preserved)\n /sessions — list past sessions\n /resume <id> — load a past session\n /branch <name> — snapshot the current session into a new branch\n /branches — list branches\n /checkout <name> — switch the active branch\n /new — start a fresh session\n /diff [--staged] — show uncommitted changes (or staged with --staged)\n /undo [--yes] — revert working-tree changes (destructive! requires --yes)\n /help — show this help\n /exit — exit the CLI\n\n${formatSkillList(availableSkills)}`,
|
|
77
|
+
};
|
|
78
|
+
case 'exit':
|
|
79
|
+
return { handled: true, kind: 'exit', message: 'Goodbye.' };
|
|
80
|
+
case 'clear':
|
|
81
|
+
return { handled: true, kind: 'clear', message: 'Transcript cleared.' };
|
|
82
|
+
case 'login': {
|
|
83
|
+
const provider = args[0];
|
|
84
|
+
if (!provider) {
|
|
85
|
+
return { handled: true, kind: 'login', message: 'Usage: /login <provider> [key] (or /login <provider> for OAuth if supported)' };
|
|
86
|
+
}
|
|
87
|
+
const key = args.slice(1).join(' ').trim();
|
|
88
|
+
if (!key) {
|
|
89
|
+
// No key supplied: if provider supports OAuth, signal OAuth flow;
|
|
90
|
+
// otherwise, show env-var hint as before.
|
|
91
|
+
if (provider === 'grok') {
|
|
92
|
+
return { handled: true, kind: 'login_oauth', provider };
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
handled: true,
|
|
96
|
+
kind: 'login',
|
|
97
|
+
provider,
|
|
98
|
+
message: `[login] no key supplied — set ${provider.toUpperCase()}_API_KEY env or pass the key: /login ${provider} <key>`,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
return { handled: true, kind: 'login', provider, loginKey: key };
|
|
102
|
+
}
|
|
103
|
+
case 'model': {
|
|
104
|
+
const model = args[0];
|
|
105
|
+
if (!model) {
|
|
106
|
+
return {
|
|
107
|
+
handled: true,
|
|
108
|
+
kind: 'model_show',
|
|
109
|
+
message: 'Usage: /model <name> to change, /model to show current',
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
if (model === 'refresh') {
|
|
113
|
+
return { handled: true, kind: 'model_refresh' };
|
|
114
|
+
}
|
|
115
|
+
return { handled: true, kind: 'model_set', model };
|
|
116
|
+
}
|
|
117
|
+
case 'models': {
|
|
118
|
+
const sub = args[0];
|
|
119
|
+
if (sub === 'refresh') {
|
|
120
|
+
return { handled: true, kind: 'models_refresh' };
|
|
121
|
+
}
|
|
122
|
+
return { handled: true, kind: 'models_list' };
|
|
123
|
+
}
|
|
124
|
+
case 'provider': {
|
|
125
|
+
const subcommand = args[0];
|
|
126
|
+
if (!subcommand) {
|
|
127
|
+
return {
|
|
128
|
+
handled: true,
|
|
129
|
+
kind: 'provider_list',
|
|
130
|
+
message: 'Usage: /provider <name> — switch active provider\n /provider custom <baseUrl> — set custom base URL (Ollama, LM Studio, vLLM, ...)\n /provider custom clear — clear the custom override\n /provider <name> refresh — force token refresh (v3-F)\n /provider <name> status — show key source, expiry, refresh impl (v3-F)\nAvailable: openai-compatible, minimax, glm, grok, custom',
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
if (subcommand === 'custom') {
|
|
134
|
+
const target = args[1];
|
|
135
|
+
if (!target || target === 'show') {
|
|
136
|
+
return {
|
|
137
|
+
handled: true,
|
|
138
|
+
kind: 'provider_custom',
|
|
139
|
+
message: 'Usage: /provider custom <baseUrl> — set custom base URL for the active provider\n /provider custom clear — clear the custom override for the active provider',
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
if (target === 'clear') {
|
|
143
|
+
return {
|
|
144
|
+
handled: true,
|
|
145
|
+
kind: 'provider_custom',
|
|
146
|
+
customClear: true,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
// Treat the rest of the line as the URL (supports paths with spaces
|
|
150
|
+
// in user-typed input, though unusual).
|
|
151
|
+
const url = args.slice(1).join(' ').trim();
|
|
152
|
+
// Identify the provider id from the active provider at handler time.
|
|
153
|
+
// The caller (app.tsx) resolves this from providerConfig.activeProviderId.
|
|
154
|
+
return {
|
|
155
|
+
handled: true,
|
|
156
|
+
kind: 'provider_custom',
|
|
157
|
+
customEndpoint: url,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
// v3-F: /provider <id> refresh | status subcommands.
|
|
161
|
+
// subcommand is the provider id here; args[1] is the sub-subcommand.
|
|
162
|
+
const providerId = subcommand;
|
|
163
|
+
const sub = args[1];
|
|
164
|
+
if (sub === 'refresh') {
|
|
165
|
+
return { handled: true, kind: 'provider_refresh', provider: providerId };
|
|
166
|
+
}
|
|
167
|
+
if (sub === 'status') {
|
|
168
|
+
return { handled: true, kind: 'provider_status', provider: providerId };
|
|
169
|
+
}
|
|
170
|
+
return { handled: true, kind: 'provider_set', provider: subcommand };
|
|
171
|
+
}
|
|
172
|
+
case 'branch': {
|
|
173
|
+
const name = args[0];
|
|
174
|
+
if (!name) {
|
|
175
|
+
return {
|
|
176
|
+
handled: true,
|
|
177
|
+
kind: 'branch_create',
|
|
178
|
+
message: 'Usage: /branch <name> — snapshots the current session into a new branch',
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
return { handled: true, kind: 'branch_create', branchName: name };
|
|
182
|
+
}
|
|
183
|
+
case 'branches':
|
|
184
|
+
return { handled: true, kind: 'branch_list' };
|
|
185
|
+
case 'checkout': {
|
|
186
|
+
const name = args[0];
|
|
187
|
+
if (!name) {
|
|
188
|
+
return {
|
|
189
|
+
handled: true,
|
|
190
|
+
kind: 'branch_checkout',
|
|
191
|
+
message: 'Usage: /checkout <name> — switch the active branch',
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
return { handled: true, kind: 'branch_checkout', branchName: name };
|
|
195
|
+
}
|
|
196
|
+
case 'compact': {
|
|
197
|
+
// Optional flags: --threshold N, --keep N
|
|
198
|
+
let compactThreshold;
|
|
199
|
+
let compactKeepRecent;
|
|
200
|
+
for (let i = 0; i < args.length; i++) {
|
|
201
|
+
const a = args[i];
|
|
202
|
+
if (a === '--threshold' || a === '-t') {
|
|
203
|
+
const v = Number.parseInt(args[++i] ?? '', 10);
|
|
204
|
+
if (Number.isFinite(v) && v > 0)
|
|
205
|
+
compactThreshold = v;
|
|
206
|
+
}
|
|
207
|
+
else if (a === '--keep' || a === '-k') {
|
|
208
|
+
const v = Number.parseInt(args[++i] ?? '', 10);
|
|
209
|
+
if (Number.isFinite(v) && v > 0)
|
|
210
|
+
compactKeepRecent = v;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
handled: true,
|
|
215
|
+
kind: 'compact',
|
|
216
|
+
message: 'Compacting session...',
|
|
217
|
+
compactThreshold,
|
|
218
|
+
compactKeepRecent,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
case 'sessions':
|
|
222
|
+
return { handled: true, kind: 'session' };
|
|
223
|
+
case 'resume': {
|
|
224
|
+
const targetId = args[0];
|
|
225
|
+
if (!targetId) {
|
|
226
|
+
return { handled: true, kind: 'resume', message: 'Usage: /resume <id>' };
|
|
227
|
+
}
|
|
228
|
+
return {
|
|
229
|
+
handled: true,
|
|
230
|
+
kind: 'resume',
|
|
231
|
+
targetSessionId: targetId,
|
|
232
|
+
message: `[resume] session ${targetId} ready — restart zelari-code to load`,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
case 'new':
|
|
236
|
+
return {
|
|
237
|
+
handled: true,
|
|
238
|
+
kind: 'new',
|
|
239
|
+
message: '[new] session reset — next prompt starts fresh',
|
|
240
|
+
};
|
|
241
|
+
case 'council': {
|
|
242
|
+
const input = args.join(' ').trim();
|
|
243
|
+
if (!input) {
|
|
244
|
+
return {
|
|
245
|
+
handled: true,
|
|
246
|
+
kind: 'council',
|
|
247
|
+
message: 'Usage: /council <input> — invokes the multi-agent council on the input',
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
return { handled: true, kind: 'council', councilInput: input };
|
|
251
|
+
}
|
|
252
|
+
case 'council-feedback': {
|
|
253
|
+
// Usage: /council-feedback <memberId> <1-5> [note...]
|
|
254
|
+
const memberId = args[0];
|
|
255
|
+
const scoreStr = args[1];
|
|
256
|
+
if (!memberId || !scoreStr) {
|
|
257
|
+
return {
|
|
258
|
+
handled: true,
|
|
259
|
+
kind: 'council_feedback',
|
|
260
|
+
message: 'Usage: /council-feedback <memberId> <1-5> [note...] — rate a council member (e.g. /council-feedback sisyphus 4 great framing)',
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
const score = Number.parseInt(scoreStr, 10);
|
|
264
|
+
if (!Number.isInteger(score) || score < 1 || score > 5) {
|
|
265
|
+
return {
|
|
266
|
+
handled: true,
|
|
267
|
+
kind: 'council_feedback',
|
|
268
|
+
message: `Invalid score "${scoreStr}" — must be an integer in [1, 5].`,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
const note = args.slice(2).join(' ').trim() || undefined;
|
|
272
|
+
return {
|
|
273
|
+
handled: true,
|
|
274
|
+
kind: 'council_feedback',
|
|
275
|
+
feedbackMemberId: memberId,
|
|
276
|
+
feedbackScore: score,
|
|
277
|
+
...(note ? { feedbackNote: note } : {}),
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
case 'skill': {
|
|
281
|
+
const skillId = args[0];
|
|
282
|
+
if (!skillId) {
|
|
283
|
+
return {
|
|
284
|
+
handled: true,
|
|
285
|
+
kind: 'skill',
|
|
286
|
+
skillError: 'Usage: /skill <name> [input]',
|
|
287
|
+
message: formatSkillList(availableSkills),
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
const skill = availableSkills.find((s) => s.id === skillId);
|
|
291
|
+
if (!skill) {
|
|
292
|
+
return {
|
|
293
|
+
handled: true,
|
|
294
|
+
kind: 'skill',
|
|
295
|
+
skillError: `Unknown skill: "${skillId}". Use /skill <TAB> for autocomplete.`,
|
|
296
|
+
message: formatSkillList(availableSkills),
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
const input = args.slice(1).join(' ');
|
|
300
|
+
const expandedSkill = expandSkillTemplate(skill, { input });
|
|
301
|
+
return { handled: true, kind: 'skill', expandedSkill };
|
|
302
|
+
}
|
|
303
|
+
case 'skill_stats': {
|
|
304
|
+
// `/skill-stats [name]` — show aggregated stats from skill-history.jsonl.
|
|
305
|
+
// name is optional; when omitted, returns stats across all skills.
|
|
306
|
+
const skillId = args[0];
|
|
307
|
+
return {
|
|
308
|
+
handled: true,
|
|
309
|
+
kind: 'skill_stats',
|
|
310
|
+
skillStatsSkillId: skillId,
|
|
311
|
+
message: skillId ? `Computing stats for skill "${skillId}"…` : 'Computing stats for all skills…',
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
case 'skill-compare': {
|
|
315
|
+
// `/skill-compare <id1> <id2>` — side-by-side stats for two skills.
|
|
316
|
+
// Args: exactly 2 IDs (whitespace-separated).
|
|
317
|
+
const id1 = args[0];
|
|
318
|
+
const id2 = args[1];
|
|
319
|
+
if (!id1 || !id2) {
|
|
320
|
+
return {
|
|
321
|
+
handled: true,
|
|
322
|
+
kind: 'skill-compare',
|
|
323
|
+
message: '⚠ /skill-compare requires exactly 2 skill IDs (e.g. `/skill-compare debug refactor`).',
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
return {
|
|
327
|
+
handled: true,
|
|
328
|
+
kind: 'skill-compare',
|
|
329
|
+
compareIds: [id1, id2],
|
|
330
|
+
message: `Comparing skills "${id1}" vs "${id2}"…`,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
case 'steer': {
|
|
334
|
+
// /steer <text> → enqueue follow-up prompt (queue-only)
|
|
335
|
+
// /steer --interrupt <text> → enqueue + cancel current run (Task C.3.2)
|
|
336
|
+
// /steer -i <text> → short form of --interrupt
|
|
337
|
+
let interrupt = false;
|
|
338
|
+
const filtered = [];
|
|
339
|
+
for (const a of args) {
|
|
340
|
+
if (a === '--interrupt' || a === '-i') {
|
|
341
|
+
interrupt = true;
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
filtered.push(a);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
const text = filtered.join(' ').trim();
|
|
348
|
+
if (!text) {
|
|
349
|
+
return {
|
|
350
|
+
handled: true,
|
|
351
|
+
kind: interrupt ? 'steer_interrupt' : 'steer',
|
|
352
|
+
message: 'Usage: /steer [--interrupt|-i] <text> — enqueue (and optionally cancel) a follow-up prompt',
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
return {
|
|
356
|
+
handled: true,
|
|
357
|
+
kind: interrupt ? 'steer_interrupt' : 'steer',
|
|
358
|
+
steerText: text,
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
case 'diff': {
|
|
362
|
+
const staged = args.includes('--staged') || args.includes('--cached');
|
|
363
|
+
return { handled: true, kind: 'diff', diffStaged: staged ? true : undefined };
|
|
364
|
+
}
|
|
365
|
+
case 'promote-member': {
|
|
366
|
+
// Usage: /promote-member <memberId>
|
|
367
|
+
// Validates the id against the AGENT_ROLES registry; if invalid,
|
|
368
|
+
// surfaces a usage-style error (the parser is pure, so we don't
|
|
369
|
+
// throw — the dispatcher can render the error message).
|
|
370
|
+
const memberId = args[0];
|
|
371
|
+
if (!memberId) {
|
|
372
|
+
return {
|
|
373
|
+
handled: true,
|
|
374
|
+
kind: 'promote_member_error',
|
|
375
|
+
promoteMemberError: 'Usage: /promote-member <memberId> — e.g. /promote-member hephaestus',
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
// Quick sanity check — the dispatcher will do the full UnknownMemberError
|
|
379
|
+
// handling via promoteMember(). Here we just echo the id.
|
|
380
|
+
return { handled: true, kind: 'promote_member', promoteMemberId: memberId };
|
|
381
|
+
}
|
|
382
|
+
case 'update': {
|
|
383
|
+
// Usage:
|
|
384
|
+
// /update → check for updates (silent current vs latest)
|
|
385
|
+
// /update --yes | /update -y → perform the update
|
|
386
|
+
// Any other args → usage hint
|
|
387
|
+
let force = false;
|
|
388
|
+
for (const a of args) {
|
|
389
|
+
if (a === '--yes' || a === '-y') {
|
|
390
|
+
force = true;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
if (args.length > 0 && !force) {
|
|
394
|
+
return {
|
|
395
|
+
handled: true,
|
|
396
|
+
kind: 'update_usage',
|
|
397
|
+
message: 'Usage: /update — check for the latest zelari-coder version\n' +
|
|
398
|
+
' /update --yes (or -y) — install the latest version (will ask you to restart manually)',
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
return {
|
|
402
|
+
handled: true,
|
|
403
|
+
kind: force ? 'update_perform' : 'update_check',
|
|
404
|
+
updateForce: force,
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
case 'undo': {
|
|
408
|
+
const confirmed = args.includes('--yes') || args.includes('-y');
|
|
409
|
+
if (confirmed) {
|
|
410
|
+
return { handled: true, kind: 'undo_confirm', undoConfirmed: true };
|
|
411
|
+
}
|
|
412
|
+
// Without --yes, surface a destructive warning. The caller (app.tsx)
|
|
413
|
+
// can still emit the actual git operation but should prefix with a
|
|
414
|
+
// "are you sure?" banner. We keep two distinct kinds so the UI can
|
|
415
|
+
// ask before acting.
|
|
416
|
+
return {
|
|
417
|
+
handled: true,
|
|
418
|
+
kind: 'undo',
|
|
419
|
+
message: '⚠ /undo is DESTRUCTIVE — it reverts all unstaged modifications ' +
|
|
420
|
+
'and unstages everything.\nUse `/undo --yes` (or `/undo -y`) to confirm.',
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
default:
|
|
424
|
+
return {
|
|
425
|
+
handled: false,
|
|
426
|
+
kind: 'unknown',
|
|
427
|
+
message: `Unknown command: /${command}. Type /help for available commands.`,
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
//# sourceMappingURL=slashCommands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slashCommands.js","sourceRoot":"","sources":["../../src/cli/slashCommands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* toolRegistry — default ToolRegistry for the zelari-code CLI.
|
|
3
|
+
*
|
|
4
|
+
* Wires the 5 built-in tools (filesystem read/write/edit + bash + grep) into a
|
|
5
|
+
* ToolRegistry instance that the AgentHarness can hand to the provider via
|
|
6
|
+
* `tools: registry.toOpenAITools()` + `toolRegistry: registry`.
|
|
7
|
+
*
|
|
8
|
+
* Task A1 of AnathemaCoder v3-A: enable the existing tool pipeline.
|
|
9
|
+
* Task A2 of v3-A: wrap each tool with the safety layer (sandbox path,
|
|
10
|
+
* shell blocklist, audit log).
|
|
11
|
+
*
|
|
12
|
+
* @see docs/plans/2026-06-29-anathema-coder-v3.md (Tasks A1 + A2)
|
|
13
|
+
*/
|
|
14
|
+
import { ToolRegistry } from '../main/core/tools/registry.js';
|
|
15
|
+
import { readFileTool, writeFileTool, editFileTool, } from '../main/core/tools/builtin/filesystem.js';
|
|
16
|
+
import { bashTool } from '../main/core/tools/builtin/shell.js';
|
|
17
|
+
import { grepContentTool } from '../main/core/tools/builtin/search.js';
|
|
18
|
+
import { resolveSandboxedPath, SandboxViolationError } from './safety/sandboxPath.js';
|
|
19
|
+
import { assertShellAllowed, ShellBlockedError } from './safety/shellBlocklist.js';
|
|
20
|
+
import { AuditLogger } from './safety/auditLogger.js';
|
|
21
|
+
/**
|
|
22
|
+
* Create a fresh ToolRegistry pre-populated with the 5 built-in tools,
|
|
23
|
+
* each wrapped with the safety layer (Task A2).
|
|
24
|
+
*
|
|
25
|
+
* Safety policy applied:
|
|
26
|
+
* - filesystem tools: resolveSandboxedPath() on every path arg; throws
|
|
27
|
+
* SandboxViolationError if the path escapes the root.
|
|
28
|
+
* - bash: assertShellAllowed() on the command; throws ShellBlockedError
|
|
29
|
+
* on any blocklist match.
|
|
30
|
+
* - every tool: AuditLogger.runTool() wraps the call to record ts,
|
|
31
|
+
* args (redacted), ok, duration, summary.
|
|
32
|
+
*/
|
|
33
|
+
export function createBuiltinToolRegistry(options = {}) {
|
|
34
|
+
const root = options.root ?? process.cwd();
|
|
35
|
+
const audit = options.audit ?? new AuditLogger();
|
|
36
|
+
const sessionId = options.sessionId ?? 'cli';
|
|
37
|
+
// Wrap filesystem tools: sandbox the path argument before delegating.
|
|
38
|
+
const safeReadFile = wrapWithSandbox(readFileTool, ['path'], root, audit, sessionId);
|
|
39
|
+
const safeWriteFile = wrapWithSandbox(writeFileTool, ['path'], root, audit, sessionId);
|
|
40
|
+
const safeEditFile = wrapWithSandbox(editFileTool, ['path'], root, audit, sessionId);
|
|
41
|
+
const safeGrepContent = wrapWithSandbox(grepContentTool, ['path'], root, audit, sessionId);
|
|
42
|
+
// Wrap bash: shell blocklist + audit.
|
|
43
|
+
const safeBash = wrapWithShellSafety(bashTool, audit, sessionId);
|
|
44
|
+
const registry = new ToolRegistry();
|
|
45
|
+
registry.register(safeReadFile);
|
|
46
|
+
registry.register(safeWriteFile);
|
|
47
|
+
registry.register(safeEditFile);
|
|
48
|
+
registry.register(safeBash);
|
|
49
|
+
registry.register(safeGrepContent);
|
|
50
|
+
const tools = [
|
|
51
|
+
safeReadFile,
|
|
52
|
+
safeWriteFile,
|
|
53
|
+
safeEditFile,
|
|
54
|
+
safeBash,
|
|
55
|
+
safeGrepContent,
|
|
56
|
+
].map((t) => ({
|
|
57
|
+
name: t.name,
|
|
58
|
+
description: t.description,
|
|
59
|
+
permissions: t.permissions ?? [],
|
|
60
|
+
}));
|
|
61
|
+
return { registry, tools };
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Wrap a tool so that the named string args are validated through
|
|
65
|
+
* resolveSandboxedPath() before the original execute() runs. The path
|
|
66
|
+
* arg is rewritten to its resolved form so the tool sees the absolute
|
|
67
|
+
* sandboxed path.
|
|
68
|
+
*/
|
|
69
|
+
function wrapWithSandbox(original, pathArgs, root, audit, sessionId) {
|
|
70
|
+
return {
|
|
71
|
+
...original,
|
|
72
|
+
execute: async (rawArgs, ctx) => {
|
|
73
|
+
// Pre-flight: sandbox all path args; rewrite them in-place.
|
|
74
|
+
const args = rawArgs;
|
|
75
|
+
for (const key of pathArgs) {
|
|
76
|
+
const v = args[key];
|
|
77
|
+
if (typeof v === 'string' && v.length > 0) {
|
|
78
|
+
try {
|
|
79
|
+
args[key] = resolveSandboxedPath(v, { root });
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
if (err instanceof SandboxViolationError) {
|
|
83
|
+
// Audit + return typedErr so the caller gets a friendly error.
|
|
84
|
+
await audit.append({
|
|
85
|
+
ts: new Date().toISOString(),
|
|
86
|
+
sessionId,
|
|
87
|
+
tool: original.name,
|
|
88
|
+
args: redactForAudit(args),
|
|
89
|
+
ok: false,
|
|
90
|
+
resultSummary: err.message,
|
|
91
|
+
durationMs: 0,
|
|
92
|
+
error: 'sandbox_violation',
|
|
93
|
+
});
|
|
94
|
+
return {
|
|
95
|
+
ok: false,
|
|
96
|
+
error: `[sandbox] ${err.message}`,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
throw err;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Audit-wrapped execution.
|
|
104
|
+
try {
|
|
105
|
+
return await audit.runTool({
|
|
106
|
+
tool: original.name,
|
|
107
|
+
args: redactForAudit(args),
|
|
108
|
+
sessionId,
|
|
109
|
+
fn: () => original.execute(rawArgs, ctx),
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
return {
|
|
114
|
+
ok: false,
|
|
115
|
+
error: err instanceof Error ? err.message : String(err),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Wrap the bash tool: assertShellAllowed() runs before execute(), and
|
|
123
|
+
* every invocation is audited.
|
|
124
|
+
*/
|
|
125
|
+
function wrapWithShellSafety(original, audit, sessionId) {
|
|
126
|
+
return {
|
|
127
|
+
...original,
|
|
128
|
+
execute: async (rawArgs, ctx) => {
|
|
129
|
+
const args = rawArgs;
|
|
130
|
+
const cmd = args['command'];
|
|
131
|
+
if (typeof cmd === 'string') {
|
|
132
|
+
try {
|
|
133
|
+
assertShellAllowed(cmd);
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
if (err instanceof ShellBlockedError) {
|
|
137
|
+
await audit.append({
|
|
138
|
+
ts: new Date().toISOString(),
|
|
139
|
+
sessionId,
|
|
140
|
+
tool: original.name,
|
|
141
|
+
args: redactForAudit(args),
|
|
142
|
+
ok: false,
|
|
143
|
+
resultSummary: err.message,
|
|
144
|
+
durationMs: 0,
|
|
145
|
+
error: 'shell_blocked',
|
|
146
|
+
});
|
|
147
|
+
return {
|
|
148
|
+
ok: false,
|
|
149
|
+
error: `[shell-blocked] ${err.message}`,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
throw err;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
return await audit.runTool({
|
|
157
|
+
tool: original.name,
|
|
158
|
+
args: redactForAudit(args),
|
|
159
|
+
sessionId,
|
|
160
|
+
fn: () => original.execute(rawArgs, ctx),
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
return {
|
|
165
|
+
ok: false,
|
|
166
|
+
error: err instanceof Error ? err.message : String(err),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function redactForAudit(args) {
|
|
173
|
+
const out = {};
|
|
174
|
+
for (const [k, v] of Object.entries(args)) {
|
|
175
|
+
if (/(api[_-]?key|secret|token|password)/i.test(k) && typeof v === 'string') {
|
|
176
|
+
out[k] = '***';
|
|
177
|
+
}
|
|
178
|
+
else if (typeof v === 'string' && v.length > 200) {
|
|
179
|
+
out[k] = v.slice(0, 200) + '…';
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
out[k] = v;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return out;
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=toolRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolRegistry.js","sourceRoot":"","sources":["../../src/cli/toolRegistry.ts"],"names":[],"mappings":"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"}
|