zelari-code 0.2.2 → 0.6.2
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/README.md +97 -2
- package/dist/agents/councilApi.js +7 -7
- package/dist/agents/councilApi.js.map +1 -1
- package/dist/agents/councilDirectives.js +3 -3
- package/dist/agents/promoteMember.js +2 -2
- package/dist/agents/roles.js +32 -32
- package/dist/agents/roles.js.map +1 -1
- package/dist/agents/skills/builtin/debugging.js +4 -4
- package/dist/agents/skills/builtin/debugging.js.map +1 -1
- package/dist/agents/skills/builtin/docs.js +13 -23
- package/dist/agents/skills/builtin/docs.js.map +1 -1
- package/dist/agents/skills/builtin/git-ops.js +3 -3
- package/dist/agents/skills/builtin/git-ops.js.map +1 -1
- package/dist/agents/skills/builtin/planning.js +4 -4
- package/dist/agents/skills/builtin/planning.js.map +1 -1
- package/dist/agents/skills/builtin/refactoring.js +3 -3
- package/dist/agents/skills/builtin/refactoring.js.map +1 -1
- package/dist/agents/skills/builtin/review.js +9 -9
- package/dist/agents/skills/builtin/review.js.map +1 -1
- package/dist/agents/skills/builtin/testing.js +3 -3
- package/dist/agents/skills/builtin/testing.js.map +1 -1
- package/dist/agents/tools.js +9 -2
- package/dist/agents/tools.js.map +1 -1
- package/dist/cli/app.js +94 -1861
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/compaction.js.map +1 -1
- package/dist/cli/components/ChatStream.js +81 -14
- package/dist/cli/components/ChatStream.js.map +1 -1
- package/dist/cli/components/CollapsibleToolOutput.js +26 -3
- package/dist/cli/components/CollapsibleToolOutput.js.map +1 -1
- package/dist/cli/components/Header.js +20 -1
- package/dist/cli/components/Header.js.map +1 -1
- package/dist/cli/components/InputBar.js +34 -2
- package/dist/cli/components/InputBar.js.map +1 -1
- package/dist/cli/components/Sidebar.js +30 -10
- package/dist/cli/components/Sidebar.js.map +1 -1
- package/dist/cli/councilDispatcher.js +10 -2
- package/dist/cli/councilDispatcher.js.map +1 -1
- package/dist/cli/headless.js +137 -0
- package/dist/cli/headless.js.map +1 -0
- package/dist/cli/hooks/chatStats.js +28 -0
- package/dist/cli/hooks/chatStats.js.map +1 -0
- package/dist/cli/hooks/eventsToMessages.js +111 -0
- package/dist/cli/hooks/eventsToMessages.js.map +1 -0
- package/dist/cli/hooks/messageHelpers.js +125 -0
- package/dist/cli/hooks/messageHelpers.js.map +1 -0
- package/dist/cli/hooks/skillCompare.js +69 -0
- package/dist/cli/hooks/skillCompare.js.map +1 -0
- package/dist/cli/hooks/steer.js +28 -0
- package/dist/cli/hooks/steer.js.map +1 -0
- package/dist/cli/hooks/useBatchedMessages.js +67 -0
- package/dist/cli/hooks/useBatchedMessages.js.map +1 -0
- package/dist/cli/hooks/useChatTurn.js +363 -0
- package/dist/cli/hooks/useChatTurn.js.map +1 -0
- package/dist/cli/hooks/useSession.js +116 -0
- package/dist/cli/hooks/useSession.js.map +1 -0
- package/dist/cli/hooks/useSlashDispatch.js +303 -0
- package/dist/cli/hooks/useSlashDispatch.js.map +1 -0
- package/dist/cli/hooks/useTerminalSize.js +60 -0
- package/dist/cli/hooks/useTerminalSize.js.map +1 -0
- package/dist/cli/main.bundled.js +25212 -21722
- package/dist/cli/main.bundled.js.map +4 -4
- package/dist/cli/main.js +86 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/provider/openai-compatible.js +9 -2
- package/dist/cli/provider/openai-compatible.js.map +1 -1
- package/dist/cli/runHeadless.js +160 -0
- package/dist/cli/runHeadless.js.map +1 -0
- package/dist/cli/sessionManager.js +47 -1
- package/dist/cli/sessionManager.js.map +1 -1
- package/dist/cli/skillSuggest.js +1 -1
- package/dist/cli/slashCommands.js +72 -3
- package/dist/cli/slashCommands.js.map +1 -1
- package/dist/cli/slashHandlers/branch.js +57 -0
- package/dist/cli/slashHandlers/branch.js.map +1 -0
- package/dist/cli/slashHandlers/git.js +40 -0
- package/dist/cli/slashHandlers/git.js.map +1 -0
- package/dist/cli/slashHandlers/promoteMember.js +25 -0
- package/dist/cli/slashHandlers/promoteMember.js.map +1 -0
- package/dist/cli/slashHandlers/provider.js +199 -0
- package/dist/cli/slashHandlers/provider.js.map +1 -0
- package/dist/cli/slashHandlers/skills.js +82 -0
- package/dist/cli/slashHandlers/skills.js.map +1 -0
- package/dist/cli/slashHandlers/transcript.js +13 -0
- package/dist/cli/slashHandlers/transcript.js.map +1 -0
- package/dist/cli/slashHandlers/updater.js +40 -0
- package/dist/cli/slashHandlers/updater.js.map +1 -0
- package/dist/cli/slashHandlers/workspace.js +118 -0
- package/dist/cli/slashHandlers/workspace.js.map +1 -0
- package/dist/cli/toolRegistry.js +17 -8
- package/dist/cli/toolRegistry.js.map +1 -1
- package/dist/cli/utils/duration.js +34 -0
- package/dist/cli/utils/duration.js.map +1 -0
- package/dist/cli/wizard/firstRun.js +63 -0
- package/dist/cli/wizard/firstRun.js.map +1 -0
- package/dist/cli/wizard/index.js +150 -0
- package/dist/cli/wizard/index.js.map +1 -0
- package/dist/cli/wizard/runWizard.js +137 -0
- package/dist/cli/wizard/runWizard.js.map +1 -0
- package/dist/cli/wizard/useWizardState.js +151 -0
- package/dist/cli/wizard/useWizardState.js.map +1 -0
- package/dist/cli/workspace/agentsMd.js +314 -0
- package/dist/cli/workspace/agentsMd.js.map +1 -0
- package/dist/cli/workspace/index.js +24 -0
- package/dist/cli/workspace/index.js.map +1 -0
- package/dist/cli/workspace/paths.js +88 -0
- package/dist/cli/workspace/paths.js.map +1 -0
- package/dist/cli/workspace/postCouncilHook.js +38 -0
- package/dist/cli/workspace/postCouncilHook.js.map +1 -0
- package/dist/cli/workspace/storage.js +392 -0
- package/dist/cli/workspace/storage.js.map +1 -0
- package/dist/cli/workspace/stubs.js +528 -0
- package/dist/cli/workspace/stubs.js.map +1 -0
- package/dist/cli/workspace/toolRegistry.js +61 -0
- package/dist/cli/workspace/toolRegistry.js.map +1 -0
- package/dist/cli/workspace/types.js +10 -0
- package/dist/cli/workspace/types.js.map +1 -0
- package/dist/main/core/tools/builtin/_walk.js +129 -0
- package/dist/main/core/tools/builtin/_walk.js.map +1 -0
- package/dist/main/core/tools/builtin/diff.js +477 -0
- package/dist/main/core/tools/builtin/diff.js.map +1 -0
- package/dist/main/core/tools/builtin/listFiles.js +5 -43
- package/dist/main/core/tools/builtin/listFiles.js.map +1 -1
- package/dist/main/core/tools/builtin/search.js +120 -28
- package/dist/main/core/tools/builtin/search.js.map +1 -1
- package/package.json +10 -2
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { createBranch, listBranches, branchExists as checkBranchExists, } from '../branchManager.js';
|
|
2
|
+
// v0.4.4 (agy audit): the previous import of setCurrentBranch / getCurrentBranch
|
|
3
|
+
// from `branchManager.js` resolved to no-op STUBS (see branchManager.ts:324-332
|
|
4
|
+
// "no-op stub — see comment above"). The real implementations live in
|
|
5
|
+
// `sessionManager.ts` (file-based currentBranch.txt persistence). Without this
|
|
6
|
+
// fix, /checkout silently did nothing on disk and /branches would show stale data.
|
|
7
|
+
import { setCurrentBranch, getCurrentBranch } from '../sessionManager.js';
|
|
8
|
+
import { appendSystem } from '../hooks/messageHelpers.js';
|
|
9
|
+
export async function handleBranchCreate(ctx, branchName) {
|
|
10
|
+
if (!ctx.sessionId) {
|
|
11
|
+
appendSystem(ctx.setMessages, '[branch] no active session — wait for bootstrap or run a prompt first');
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
const info = await createBranch(branchName, ctx.sessionId);
|
|
16
|
+
setCurrentBranch(info.name);
|
|
17
|
+
appendSystem(ctx.setMessages, `[branch] created "${info.name}" from session ${info.fromSessionId.slice(0, 8)}… (${info.sessionCount} session file copied)`);
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
appendSystem(ctx.setMessages, `[branch error] ${err instanceof Error ? err.message : String(err)}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export async function handleBranchList(ctx) {
|
|
24
|
+
try {
|
|
25
|
+
const list = await listBranches();
|
|
26
|
+
if (list.length === 0) {
|
|
27
|
+
appendSystem(ctx.setMessages, '[branches] no branches yet — use /branch <name> to create one');
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const currentBranch = getCurrentBranch();
|
|
31
|
+
const lines = list.slice(0, 10).map((b) => {
|
|
32
|
+
const dt = new Date(b.createdAt).toISOString().replace('T', ' ').slice(0, 16);
|
|
33
|
+
const marker = currentBranch === b.name ? ' *' : ' ';
|
|
34
|
+
return ` ${marker}${b.name.padEnd(20)} from ${b.fromSessionId.slice(0, 8)}… ${b.sessionCount} sessions ${dt}`;
|
|
35
|
+
});
|
|
36
|
+
appendSystem(ctx.setMessages, `[branches] ${list.length} total (* = active):\n${lines.join('\n')}`);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
appendSystem(ctx.setMessages, `[branches error] ${err instanceof Error ? err.message : String(err)}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export async function handleBranchCheckout(ctx, branchName) {
|
|
43
|
+
try {
|
|
44
|
+
if (!checkBranchExists(branchName)) {
|
|
45
|
+
throw new Error(`Branch "${branchName}" does not exist. Use /branches to list.`);
|
|
46
|
+
}
|
|
47
|
+
setCurrentBranch(branchName);
|
|
48
|
+
appendSystem(ctx.setMessages, `[checkout] active branch set to "${branchName}".\n` +
|
|
49
|
+
` ⚠ This only takes effect on the next zelari-code launch —\n` +
|
|
50
|
+
` your current session still belongs to the previous branch.\n` +
|
|
51
|
+
` Run /exit (or Ctrl+C) and start zelari-code again to load it.`);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
appendSystem(ctx.setMessages, `[checkout error] ${err instanceof Error ? err.message : String(err)}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=branch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch.js","sourceRoot":"","sources":["../../../src/cli/slashHandlers/branch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { getWorkingDiff, undoWorkingChanges, isGitRepo, defaultProjectRoot } from '../gitOps.js';
|
|
2
|
+
import { appendSystem } from '../hooks/messageHelpers.js';
|
|
3
|
+
export async function handleDiff(ctx, diffStaged) {
|
|
4
|
+
try {
|
|
5
|
+
const repoRoot = defaultProjectRoot();
|
|
6
|
+
if (!(await isGitRepo(repoRoot))) {
|
|
7
|
+
appendSystem(ctx.setMessages, '[diff] not a git repository — nothing to show');
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const { diff, truncated, empty } = await getWorkingDiff({ cwd: repoRoot, staged: diffStaged });
|
|
11
|
+
const banner = empty
|
|
12
|
+
? `[diff] working tree clean${diffStaged ? ' (incl. staged)' : ''}`
|
|
13
|
+
: `[diff]${diffStaged ? ' (staged + unstaged)' : ''} — ${truncated ? 'truncated to 50k chars' : 'full output follows'}`;
|
|
14
|
+
const body = empty ? '' : `\n\n${diff}`;
|
|
15
|
+
appendSystem(ctx.setMessages, `${banner}${body}`);
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
appendSystem(ctx.setMessages, `[diff error] ${err instanceof Error ? err.message : String(err)}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export async function handleUndo(ctx, warningMessage, doConfirm) {
|
|
22
|
+
if (warningMessage) {
|
|
23
|
+
appendSystem(ctx.setMessages, warningMessage);
|
|
24
|
+
}
|
|
25
|
+
if (!doConfirm)
|
|
26
|
+
return;
|
|
27
|
+
try {
|
|
28
|
+
const repoRoot = defaultProjectRoot();
|
|
29
|
+
if (!(await isGitRepo(repoRoot))) {
|
|
30
|
+
appendSystem(ctx.setMessages, '[undo] not a git repository — nothing to revert');
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const res = await undoWorkingChanges({ cwd: repoRoot });
|
|
34
|
+
appendSystem(ctx.setMessages, `[undo] ${res.summary}${res.reverted.length > 0 ? `\n - ${res.reverted.slice(0, 10).join('\n - ')}${res.reverted.length > 10 ? `\n ... +${res.reverted.length - 10} more` : ''}` : ''}`);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
appendSystem(ctx.setMessages, `[undo error] ${err instanceof Error ? err.message : String(err)}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/cli/slashHandlers/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import { appendSystem } from '../hooks/messageHelpers.js';
|
|
5
|
+
export async function handlePromoteMember(ctx, memberId) {
|
|
6
|
+
try {
|
|
7
|
+
const { promoteMember } = await import('@zelari/core/council');
|
|
8
|
+
const { skill, markdown } = promoteMember(memberId);
|
|
9
|
+
const skillDir = process.env.ANATHEMA_SKILL_DIR
|
|
10
|
+
?? path.join(os.homedir(), '.tmp', 'zelari-code', 'skills');
|
|
11
|
+
await fs.mkdir(skillDir, { recursive: true });
|
|
12
|
+
const filePath = path.join(skillDir, `${skill.id}.md`);
|
|
13
|
+
await fs.writeFile(filePath, markdown, 'utf8');
|
|
14
|
+
appendSystem(ctx.setMessages, `[promote-member] ${skill.name} (${memberId}) → ${filePath}\n` +
|
|
15
|
+
` category: ${skill.category}\n` +
|
|
16
|
+
` cost: ${skill.estimatedCost}\n` +
|
|
17
|
+
` required: ${skill.requiredRoles.join(', ') || '—'}\n` +
|
|
18
|
+
` tools: ${skill.requiredTools.join(', ') || '—'}\n` +
|
|
19
|
+
` tags: ${skill.tags.join(', ')}`);
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
appendSystem(ctx.setMessages, `[promote-member error] ${err instanceof Error ? err.message : String(err)}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=promoteMember.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promoteMember.js","sourceRoot":"","sources":["../../../src/cli/slashHandlers/promoteMember.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAe1D,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAA8B,EAAE,QAAgB;IACxF,IAAI,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC/D,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB;eAC1C,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;QAC9D,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;QACvD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/C,YAAY,CACV,GAAG,CAAC,WAAW,EACf,oBAAoB,KAAK,CAAC,IAAI,KAAK,QAAQ,OAAO,QAAQ,IAAI;YAC5D,kBAAkB,KAAK,CAAC,QAAQ,IAAI;YACpC,kBAAkB,KAAK,CAAC,aAAa,IAAI;YACzC,kBAAkB,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI;YAC3D,kBAAkB,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI;YAC3D,kBAAkB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC5C,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,0BAA0B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9G,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { getProviderSpec, setApiKey, setOAuthToken, maskKey, resolveApiKeyWithMeta, getOAuthToken, } from '../keyStore.js';
|
|
2
|
+
import { getRefreshImpl } from '../refreshRegistry.js';
|
|
3
|
+
import { validateApiKey } from '../keyValidator.js';
|
|
4
|
+
import { getActiveProvider as getActiveProviderSpec, setActiveProviderId as persistActiveProvider, setModelForProvider as persistModelForProvider, getModelForProvider, setCustomEndpoint, clearCustomEndpoint, getCustomEndpoint, } from '../providerConfig.js';
|
|
5
|
+
import { discoverModelsInBackground, discoverModelsForProvider, getCachedModels } from '../modelDiscovery.js';
|
|
6
|
+
import { appendSystem } from '../hooks/messageHelpers.js';
|
|
7
|
+
import { formatDuration } from '../utils/duration.js';
|
|
8
|
+
const UNKNOWN_PROVIDER_MSG = (id) => `[provider] unknown: ${id}. Available: openai-compatible, minimax, glm, grok, custom`;
|
|
9
|
+
export function handleProviderList(ctx) {
|
|
10
|
+
const list = getActiveProviderSpec();
|
|
11
|
+
const customEp = getCustomEndpoint(list.id);
|
|
12
|
+
const epHint = customEp ? ` — custom endpoint: ${customEp}` : '';
|
|
13
|
+
appendSystem(ctx.setMessages, `[provider] current: ${list.displayName} (model: ${ctx.activeModel})${epHint} — available: openai-compatible, minimax, glm, grok, custom`);
|
|
14
|
+
}
|
|
15
|
+
export function handleProviderSet(ctx, providerId) {
|
|
16
|
+
const spec = getProviderSpec(providerId);
|
|
17
|
+
if (!spec) {
|
|
18
|
+
appendSystem(ctx.setMessages, UNKNOWN_PROVIDER_MSG(providerId));
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
persistActiveProvider(spec.id);
|
|
23
|
+
ctx.setProviderConfig(getProviderSpec(spec.id)); // refresh from getProviderConfig()
|
|
24
|
+
appendSystem(ctx.setMessages, `[provider] active: ${spec.displayName} (model: ${getModelForProvider(spec.id)})`);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
appendSystem(ctx.setMessages, `[provider error] ${err instanceof Error ? err.message : String(err)}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function handleProviderCustom(ctx, opts) {
|
|
31
|
+
const id = ctx.activeProviderSpec.id;
|
|
32
|
+
try {
|
|
33
|
+
if (opts.clear) {
|
|
34
|
+
clearCustomEndpoint(id);
|
|
35
|
+
appendSystem(ctx.setMessages, `[provider] cleared custom endpoint for ${id} — falling back to default`);
|
|
36
|
+
}
|
|
37
|
+
else if (opts.endpoint) {
|
|
38
|
+
setCustomEndpoint(id, opts.endpoint);
|
|
39
|
+
appendSystem(ctx.setMessages, `[provider] custom endpoint for ${id} set to ${opts.endpoint}`);
|
|
40
|
+
}
|
|
41
|
+
else if (opts.message) {
|
|
42
|
+
appendSystem(ctx.setMessages, `[provider] ${opts.message}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
appendSystem(ctx.setMessages, `[provider error] ${err instanceof Error ? err.message : String(err)}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export async function handleProviderRefresh(ctx, providerId) {
|
|
50
|
+
const spec = getProviderSpec(providerId);
|
|
51
|
+
if (!spec) {
|
|
52
|
+
appendSystem(ctx.setMessages, UNKNOWN_PROVIDER_MSG(providerId));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const refreshed = await resolveApiKeyWithMeta(spec.id);
|
|
57
|
+
if (!refreshed) {
|
|
58
|
+
appendSystem(ctx.setMessages, `[provider refresh] ${spec.id}: no key configured (use /login ${spec.id} <key>)`);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const expires = refreshed.expiresAt
|
|
62
|
+
? ` — expires in ${formatDuration(refreshed.expiresAt - Date.now())}`
|
|
63
|
+
: '';
|
|
64
|
+
const impl = getRefreshImpl(spec.id);
|
|
65
|
+
const implNote = impl ? '' : ' (no refresh impl registered — stale token returned)';
|
|
66
|
+
appendSystem(ctx.setMessages, `[provider refresh] ${spec.id}: ok — key ${maskKey(refreshed.apiKey)}${expires}${implNote}`);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
appendSystem(ctx.setMessages, `[provider refresh error] ${err instanceof Error ? err.message : String(err)}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export async function handleProviderStatus(ctx, providerId) {
|
|
73
|
+
const spec = getProviderSpec(providerId);
|
|
74
|
+
if (!spec) {
|
|
75
|
+
appendSystem(ctx.setMessages, UNKNOWN_PROVIDER_MSG(providerId));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const envKey = process.env[spec.envVar];
|
|
79
|
+
const stored = getOAuthToken(spec.id);
|
|
80
|
+
const source = envKey && envKey.trim().length > 0
|
|
81
|
+
? `env (${spec.envVar})`
|
|
82
|
+
: stored ? 'store' : 'missing';
|
|
83
|
+
const expires = stored?.expiresAt ? formatDuration(stored.expiresAt - Date.now()) : '—';
|
|
84
|
+
const hasRefresh = getRefreshImpl(spec.id) ? 'yes' : 'no';
|
|
85
|
+
const hasRefreshToken = stored?.refreshToken ? 'yes' : 'no';
|
|
86
|
+
const baseUrl = spec.baseUrl ?? '—';
|
|
87
|
+
const validation = await validateApiKey(spec.id, envKey ?? stored?.apiKey ?? '').catch(() => null);
|
|
88
|
+
const valLine = validation
|
|
89
|
+
? validation.skipped
|
|
90
|
+
? `validation: skipped (no baseUrl)`
|
|
91
|
+
: `validation: ${validation.ok ? 'ok' : `fail (${validation.reason})`}${validation.durationMs ? ` ${validation.durationMs}ms` : ''}`
|
|
92
|
+
: 'validation: error';
|
|
93
|
+
appendSystem(ctx.setMessages, `[provider status] ${spec.id} (${spec.displayName})\n` +
|
|
94
|
+
` env var: ${spec.envVar}\n` +
|
|
95
|
+
` source: ${source}\n` +
|
|
96
|
+
` expires: ${expires}\n` +
|
|
97
|
+
` refresh: ${hasRefresh} (impl registered)\n` +
|
|
98
|
+
` refreshTkn: ${hasRefreshToken}\n` +
|
|
99
|
+
` baseUrl: ${baseUrl}\n` +
|
|
100
|
+
` ${valLine}`);
|
|
101
|
+
}
|
|
102
|
+
export async function handleLoginKey(ctx, providerId, key) {
|
|
103
|
+
const spec = getProviderSpec(providerId);
|
|
104
|
+
const displayName = spec?.displayName ?? providerId;
|
|
105
|
+
try {
|
|
106
|
+
setApiKey(providerId, key);
|
|
107
|
+
persistActiveProvider(providerId);
|
|
108
|
+
const currentModel = getModelForProvider(providerId);
|
|
109
|
+
if (!currentModel) {
|
|
110
|
+
const fallbackModel = ctx.providerDefaults[providerId];
|
|
111
|
+
if (fallbackModel) {
|
|
112
|
+
persistModelForProvider(providerId, fallbackModel);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
appendSystem(ctx.setMessages, `[login] ${displayName} key stored (${maskKey(key)}). Active provider switched to ${displayName} — try a prompt now.`);
|
|
116
|
+
// Background model discovery (fire-and-forget)
|
|
117
|
+
const discoveryProvider = providerId;
|
|
118
|
+
if (['grok', 'glm', 'minimax', 'openai-compatible'].includes(discoveryProvider)) {
|
|
119
|
+
discoverModelsInBackground(discoveryProvider, {
|
|
120
|
+
onError: (err) => appendSystem(ctx.setMessages, `[models] discovery failed for ${discoveryProvider}: ${err.message} (using static defaults)`),
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
appendSystem(ctx.setMessages, `[login error] ${err instanceof Error ? err.message : String(err)}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
export async function handleLoginOAuthGrok(ctx) {
|
|
129
|
+
const { runGrokOAuthFlow } = await import('../grokOAuth.js');
|
|
130
|
+
appendSystem(ctx.setMessages, '[login oauth] requesting device code from xAI...');
|
|
131
|
+
ctx.setBusy(true);
|
|
132
|
+
try {
|
|
133
|
+
const resultOAuth = await runGrokOAuthFlow({
|
|
134
|
+
onUserCode: (info) => appendSystem(ctx.setMessages, `[login oauth] Open ${info.verificationUri} in your browser and enter the code:\n` +
|
|
135
|
+
` ${info.userCode}\n` +
|
|
136
|
+
`(Opening your browser automatically...)`),
|
|
137
|
+
});
|
|
138
|
+
setOAuthToken('grok', {
|
|
139
|
+
apiKey: resultOAuth.accessToken,
|
|
140
|
+
...(resultOAuth.expiresAt !== undefined ? { expiresAt: resultOAuth.expiresAt } : {}),
|
|
141
|
+
...(resultOAuth.refreshToken ? { refreshToken: resultOAuth.refreshToken } : {}),
|
|
142
|
+
});
|
|
143
|
+
persistActiveProvider('grok');
|
|
144
|
+
if (!getModelForProvider('grok')) {
|
|
145
|
+
persistModelForProvider('grok', ctx.providerDefaults['grok'] ?? 'grok-4');
|
|
146
|
+
}
|
|
147
|
+
const expiresHint = resultOAuth.expiresAt ? `, expires ${new Date(resultOAuth.expiresAt).toISOString()}` : '';
|
|
148
|
+
const refreshHint = resultOAuth.refreshToken ? ', refresh token saved' : '';
|
|
149
|
+
appendSystem(ctx.setMessages, `[login oauth] ✓ Grok authenticated via SuperGrok (token ${maskKey(resultOAuth.accessToken)}${expiresHint}${refreshHint}). Active provider switched to grok — try a prompt now.`);
|
|
150
|
+
discoverModelsInBackground('grok', {
|
|
151
|
+
onError: (err) => appendSystem(ctx.setMessages, `[models] discovery failed for grok: ${err.message} (using static defaults)`),
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
appendSystem(ctx.setMessages, `[login oauth error] ${err instanceof Error ? err.message : String(err)}`);
|
|
156
|
+
}
|
|
157
|
+
finally {
|
|
158
|
+
ctx.setBusy(false);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
export function handleModelShow(ctx) {
|
|
162
|
+
appendSystem(ctx.setMessages, `[model] current: ${ctx.activeProviderSpec.displayName} → ${ctx.activeModel}`);
|
|
163
|
+
}
|
|
164
|
+
export function handleModelSet(ctx, model) {
|
|
165
|
+
const id = ctx.activeProviderSpec.id;
|
|
166
|
+
try {
|
|
167
|
+
persistModelForProvider(id, model);
|
|
168
|
+
appendSystem(ctx.setMessages, `[model] set: ${id} → ${model}`);
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
appendSystem(ctx.setMessages, `[model error] ${err instanceof Error ? err.message : String(err)}`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
export function handleModelsList(ctx) {
|
|
175
|
+
const discId = ctx.activeProviderSpec.id;
|
|
176
|
+
const cached = getCachedModels(discId);
|
|
177
|
+
if (!cached || cached.models.length === 0) {
|
|
178
|
+
appendSystem(ctx.setMessages, `[models] no cache for ${ctx.activeProviderSpec.displayName}. Run /models refresh or /login ${discId} <key> to discover.`);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
const ageMin = Math.round((Date.now() - cached.fetchedAt) / 60_000);
|
|
182
|
+
const list = cached.models.map((m) => ` - ${m.id}${m.ownedBy ? ` (${m.ownedBy})` : ''}`).join('\n');
|
|
183
|
+
appendSystem(ctx.setMessages, `[models] ${ctx.activeProviderSpec.displayName} — ${cached.models.length} models (fetched ${ageMin}m ago from ${cached.baseUrl}):\n${list}`);
|
|
184
|
+
}
|
|
185
|
+
export function handleModelsRefresh(ctx) {
|
|
186
|
+
const discId = ctx.activeProviderSpec.id;
|
|
187
|
+
appendSystem(ctx.setMessages, `[models] refreshing model list for ${ctx.activeProviderSpec.displayName}...`);
|
|
188
|
+
// Fire-and-forget background refresh; result surfaces inline.
|
|
189
|
+
(async () => {
|
|
190
|
+
try {
|
|
191
|
+
const entry = await discoverModelsForProvider(discId);
|
|
192
|
+
appendSystem(ctx.setMessages, `[models] ✓ ${entry.models.length} models discovered for ${ctx.activeProviderSpec.displayName}. Use /model <name> to switch.`);
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
appendSystem(ctx.setMessages, `[models] ✗ discovery failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
196
|
+
}
|
|
197
|
+
})();
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/cli/slashHandlers/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,SAAS,EACT,aAAa,EACb,OAAO,EACP,qBAAqB,EACrB,aAAa,GAEd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,iBAAiB,IAAI,qBAAqB,EAC1C,mBAAmB,IAAI,qBAAqB,EAC5C,mBAAmB,IAAI,uBAAuB,EAC9C,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC9G,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAkBtD,MAAM,oBAAoB,GACxB,CAAC,EAAU,EAAE,EAAE,CAAC,uBAAuB,EAAE,4DAA4D,CAAC;AAExG,MAAM,UAAU,kBAAkB,CAAC,GAAyB;IAC1D,MAAM,IAAI,GAAG,qBAAqB,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,uBAAuB,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACjE,YAAY,CACV,GAAG,CAAC,WAAW,EACf,uBAAuB,IAAI,CAAC,WAAW,YAAY,GAAG,CAAC,WAAW,IAAI,MAAM,6DAA6D,CAC1I,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAyB,EAAE,UAAkB;IAC7E,MAAM,IAAI,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/B,GAAG,CAAC,iBAAiB,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAU,CAAC,CAAC,CAAC,mCAAmC;QAC7F,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,sBAAsB,IAAI,CAAC,WAAW,YAAY,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACnH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,oBAAoB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,GAAyB,EACzB,IAA8D;IAE9D,MAAM,EAAE,GAAG,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,mBAAmB,CAAC,EAAE,CAAC,CAAC;YACxB,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,0CAA0C,EAAE,4BAA4B,CAAC,CAAC;QAC1G,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzB,iBAAiB,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,kCAAkC,EAAE,WAAW,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChG,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxB,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,oBAAoB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxG,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAyB,EAAE,UAAkB;IACvF,MAAM,IAAI,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,sBAAsB,IAAI,CAAC,EAAE,mCAAmC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC;YAChH,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,SAAS,CAAC,SAAS;YACjC,CAAC,CAAC,iBAAiB,cAAc,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE;YACrE,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,sDAAsD,CAAC;QACpF,YAAY,CACV,GAAG,CAAC,WAAW,EACf,sBAAsB,IAAI,CAAC,EAAE,cAAc,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,OAAO,GAAG,QAAQ,EAAE,CAC5F,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,4BAA4B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAyB,EAAE,UAAkB;IACtF,MAAM,IAAI,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAC/C,CAAC,CAAC,QAAQ,IAAI,CAAC,MAAM,GAAG;QACxB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACjC,MAAM,OAAO,GAAG,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACxF,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,MAAM,eAAe,GAAG,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC;IACpC,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACnG,MAAM,OAAO,GAAG,UAAU;QACxB,CAAC,CAAC,UAAU,CAAC,OAAO;YAClB,CAAC,CAAC,kCAAkC;YACpC,CAAC,CAAC,eAAe,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,MAAM,GAAG,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QACtI,CAAC,CAAC,mBAAmB,CAAC;IACxB,YAAY,CACV,GAAG,CAAC,WAAW,EACf,qBAAqB,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,WAAW,KAAK;QACpD,iBAAiB,IAAI,CAAC,MAAM,IAAI;QAChC,iBAAiB,MAAM,IAAI;QAC3B,iBAAiB,OAAO,IAAI;QAC5B,iBAAiB,UAAU,sBAAsB;QACjD,iBAAiB,eAAe,IAAI;QACpC,iBAAiB,OAAO,IAAI;QAC5B,KAAK,OAAO,EAAE,CACjB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAyB,EACzB,UAAkB,EAClB,GAAW;IAEX,MAAM,IAAI,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW,IAAI,UAAU,CAAC;IACpD,IAAI,CAAC;QACH,SAAS,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAC3B,qBAAqB,CAAC,UAAyD,CAAC,CAAC;QACjF,MAAM,YAAY,GAAG,mBAAmB,CAAC,UAAuD,CAAC,CAAC;QAClG,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,aAAa,GAAG,GAAG,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;YACvD,IAAI,aAAa,EAAE,CAAC;gBAClB,uBAAuB,CAAC,UAA2D,EAAE,aAAa,CAAC,CAAC;YACtG,CAAC;QACH,CAAC;QACD,YAAY,CACV,GAAG,CAAC,WAAW,EACf,WAAW,WAAW,gBAAgB,OAAO,CAAC,GAAG,CAAC,kCAAkC,WAAW,sBAAsB,CACtH,CAAC;QACF,+CAA+C;QAC/C,MAAM,iBAAiB,GAAG,UAAiC,CAAC;QAC5D,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAChF,0BAA0B,CAAC,iBAAiB,EAAE;gBAC5C,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CACf,YAAY,CACV,GAAG,CAAC,WAAW,EACf,iCAAiC,iBAAiB,KAAK,GAAG,CAAC,OAAO,0BAA0B,CAC7F;aACJ,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,iBAAiB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACrG,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAyB;IAClE,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC7D,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,kDAAkD,CAAC,CAAC;IAClF,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC;YACzC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CACnB,YAAY,CACV,GAAG,CAAC,WAAW,EACf,sBAAsB,IAAI,CAAC,eAAe,wCAAwC;gBAChF,KAAK,IAAI,CAAC,QAAQ,IAAI;gBACtB,yCAAyC,CAC5C;SACJ,CAAC,CAAC;QACH,aAAa,CAAC,MAAM,EAAE;YACpB,MAAM,EAAE,WAAW,CAAC,WAAW;YAC/B,GAAG,CAAC,WAAW,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpF,GAAG,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChF,CAAC,CAAC;QACH,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,uBAAuB,CAAC,MAAM,EAAE,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9G,MAAM,WAAW,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,YAAY,CACV,GAAG,CAAC,WAAW,EACf,2DAA2D,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,WAAW,GAAG,WAAW,yDAAyD,CACjL,CAAC;QACF,0BAA0B,CAAC,MAAM,EAAE;YACjC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CACf,YAAY,CACV,GAAG,CAAC,WAAW,EACf,uCAAuC,GAAG,CAAC,OAAO,0BAA0B,CAC7E;SACJ,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,uBAAuB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3G,CAAC;YAAS,CAAC;QACT,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAyB;IACvD,YAAY,CACV,GAAG,CAAC,WAAW,EACf,oBAAoB,GAAG,CAAC,kBAAkB,CAAC,WAAW,MAAM,GAAG,CAAC,WAAW,EAAE,CAC9E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAyB,EAAE,KAAa;IACrE,MAAM,EAAE,GAAG,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,uBAAuB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACnC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,gBAAgB,EAAE,MAAM,KAAK,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,iBAAiB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACrG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAyB;IACxD,MAAM,MAAM,GAAG,GAAG,CAAC,kBAAkB,CAAC,EAAyB,CAAC;IAChE,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1C,YAAY,CACV,GAAG,CAAC,WAAW,EACf,yBAAyB,GAAG,CAAC,kBAAkB,CAAC,WAAW,mCAAmC,MAAM,qBAAqB,CAC1H,CAAC;QACF,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrG,YAAY,CACV,GAAG,CAAC,WAAW,EACf,YAAY,GAAG,CAAC,kBAAkB,CAAC,WAAW,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,oBAAoB,MAAM,cAAc,MAAM,CAAC,OAAO,OAAO,IAAI,EAAE,CAC5I,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAyB;IAC3D,MAAM,MAAM,GAAG,GAAG,CAAC,kBAAkB,CAAC,EAAyB,CAAC;IAChE,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,sCAAsC,GAAG,CAAC,kBAAkB,CAAC,WAAW,KAAK,CAAC,CAAC;IAC7G,8DAA8D;IAC9D,CAAC,KAAK,IAAI,EAAE;QACV,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,yBAAyB,CAAC,MAAM,CAAC,CAAC;YACtD,YAAY,CACV,GAAG,CAAC,WAAW,EACf,cAAc,KAAK,CAAC,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,kBAAkB,CAAC,WAAW,gCAAgC,CAC9H,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,YAAY,CACV,GAAG,CAAC,WAAW,EACf,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACnF,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import { readSkillHistory, getSkillStats } from '../skillHistory.js';
|
|
4
|
+
import { FeedbackStore } from '../councilFeedback.js';
|
|
5
|
+
import { compareSkillsFromFile } from '../hooks/skillCompare.js';
|
|
6
|
+
import { appendSystem } from '../hooks/messageHelpers.js';
|
|
7
|
+
import { applySteerInterrupt } from '../hooks/steer.js';
|
|
8
|
+
export async function handleSkillStats(ctx, skillId) {
|
|
9
|
+
const historyFile = process.env.ANATHEMA_SKILL_HISTORY_FILE
|
|
10
|
+
?? path.join(os.homedir(), '.tmp', 'zelari-code', 'skill-history.jsonl');
|
|
11
|
+
try {
|
|
12
|
+
const records = await readSkillHistory(historyFile);
|
|
13
|
+
const stats = getSkillStats(records, skillId);
|
|
14
|
+
const label = skillId ?? 'all skills';
|
|
15
|
+
const formatted = stats.count === 0
|
|
16
|
+
? `[skill-stats] ${label}: no invocations recorded yet`
|
|
17
|
+
: `[skill-stats] ${label}: ${stats.count} invocations, ${(stats.successRate * 100).toFixed(1)}% success, avg ${stats.avgDurationMs.toFixed(0)}ms, ${stats.totalTokens} tokens total`;
|
|
18
|
+
appendSystem(ctx.setMessages, formatted);
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
appendSystem(ctx.setMessages, `[skill-stats error] ${err instanceof Error ? err.message : String(err)}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export async function handleSkillCompare(ctx, ids, fallbackMessage) {
|
|
25
|
+
if (!ids) {
|
|
26
|
+
appendSystem(ctx.setMessages, fallbackMessage ?? '[skill-compare] missing args');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const historyFile = process.env.ANATHEMA_SKILL_HISTORY_FILE
|
|
30
|
+
?? path.join(os.homedir(), '.tmp', 'zelari-code', 'skill-history.jsonl');
|
|
31
|
+
try {
|
|
32
|
+
const formatted = await compareSkillsFromFile(ids[0], ids[1], historyFile);
|
|
33
|
+
appendSystem(ctx.setMessages, formatted);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
appendSystem(ctx.setMessages, `[skill-compare error] ${err instanceof Error ? err.message : String(err)}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export function handleCouncilFeedback(ctx, memberId, score, note) {
|
|
40
|
+
try {
|
|
41
|
+
const store = new FeedbackStore();
|
|
42
|
+
const entry = store.record({
|
|
43
|
+
memberId,
|
|
44
|
+
score,
|
|
45
|
+
...(note ? { note } : {}),
|
|
46
|
+
...(ctx.sessionId ? { sessionId: ctx.sessionId } : {}),
|
|
47
|
+
});
|
|
48
|
+
const stats = store.getStats(memberId);
|
|
49
|
+
appendSystem(ctx.setMessages, `[council-feedback] ${memberId} rated ${entry.score}/5` +
|
|
50
|
+
` — running avg ${stats.avg.toFixed(2)} over ${stats.count} rating(s).`);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
appendSystem(ctx.setMessages, `[council-feedback] failed: ${err instanceof Error ? err.message : 'Unknown'}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export async function handleSteer(ctx, text, usageHint) {
|
|
57
|
+
if (!text) {
|
|
58
|
+
if (usageHint)
|
|
59
|
+
appendSystem(ctx.setMessages, usageHint);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
// Route through the shared interrupt helper so /steer --interrupt and
|
|
63
|
+
// /steer stay behaviorally consistent.
|
|
64
|
+
await applySteerInterrupt({
|
|
65
|
+
text,
|
|
66
|
+
harness: ctx.harnessRef.current
|
|
67
|
+
? {
|
|
68
|
+
enqueue: (t) => ctx.harnessRef.current?.enqueue(t),
|
|
69
|
+
cancel: () => ctx.harnessRef.current?.cancel(),
|
|
70
|
+
queueLength: ctx.harnessRef.current?.queueLength ?? 0,
|
|
71
|
+
}
|
|
72
|
+
: null,
|
|
73
|
+
appendMessage: (content) => appendSystem(ctx.setMessages, content),
|
|
74
|
+
setQueueCount: ctx.setQueueCount,
|
|
75
|
+
dispatchPrompt: ctx.dispatchPrompt,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
export function handleClearChat(setMessages, setSessionActive) {
|
|
79
|
+
setMessages([]);
|
|
80
|
+
setSessionActive(false);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/cli/slashHandlers/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { compactTranscript, formatCompactionSummary } from '../compaction.js';
|
|
2
|
+
import { appendSystem } from '../hooks/messageHelpers.js';
|
|
3
|
+
export function handleCompact(ctx, threshold, keepRecent) {
|
|
4
|
+
const opts = {};
|
|
5
|
+
if (threshold !== undefined)
|
|
6
|
+
opts.threshold = threshold;
|
|
7
|
+
if (keepRecent !== undefined)
|
|
8
|
+
opts.keepRecent = keepRecent;
|
|
9
|
+
const r = compactTranscript(ctx.messages, opts);
|
|
10
|
+
ctx.setMessages([...r.messages]);
|
|
11
|
+
appendSystem(ctx.setMessages, formatCompactionSummary(r));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=transcript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../../src/cli/slashHandlers/transcript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAiB1D,MAAM,UAAU,aAAa,CAC3B,GAA2B,EAC3B,SAA6B,EAC7B,UAA8B;IAE9B,MAAM,IAAI,GAAgD,EAAE,CAAC;IAC7D,IAAI,SAAS,KAAK,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IACxD,IAAI,UAAU,KAAK,SAAS;QAAE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC3D,MAAM,CAAC,GAAG,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAChD,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { appendSystem } from '../hooks/messageHelpers.js';
|
|
2
|
+
export async function handleUpdateCheck(ctx) {
|
|
3
|
+
try {
|
|
4
|
+
const { checkForUpdate } = await import('../updater.js');
|
|
5
|
+
const info = await checkForUpdate();
|
|
6
|
+
if (info.error) {
|
|
7
|
+
appendSystem(ctx.setMessages, `[update] check failed: ${info.error}`);
|
|
8
|
+
}
|
|
9
|
+
else if (info.updateAvailable) {
|
|
10
|
+
appendSystem(ctx.setMessages, `[update] 🆕 zelari-code ${info.latestVersion} available (current: ${info.currentVersion})\n` +
|
|
11
|
+
` Run \`/update --yes\` to install. You'll need to restart manually after.`);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
appendSystem(ctx.setMessages, `[update] up to date (${info.currentVersion})`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
appendSystem(ctx.setMessages, `[update error] ${err instanceof Error ? err.message : String(err)}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export async function handleUpdatePerform(ctx) {
|
|
22
|
+
appendSystem(ctx.setMessages, '[update] running `npm install -g zelari-code@latest`...');
|
|
23
|
+
try {
|
|
24
|
+
const { performUpdate } = await import('../updater.js');
|
|
25
|
+
const res = await performUpdate();
|
|
26
|
+
if (res.ok) {
|
|
27
|
+
appendSystem(ctx.setMessages, `[update] ✅ installed successfully\n\n` +
|
|
28
|
+
`Please restart zelari-code manually to use the new version.\n` +
|
|
29
|
+
`(exit with /exit or Ctrl+C, then run \`zelari-code\` again)`);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
appendSystem(ctx.setMessages, `[update] ❌ failed: ${res.error ?? 'unknown error'}\n\n` +
|
|
33
|
+
`npm output:\n${res.output || '(empty)'}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
appendSystem(ctx.setMessages, `[update error] ${err instanceof Error ? err.message : String(err)}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=updater.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater.js","sourceRoot":"","sources":["../../../src/cli/slashHandlers/updater.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAiB1D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAwB;IAC9D,IAAI,CAAC;QACH,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,0BAA0B,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACxE,CAAC;aAAM,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAChC,YAAY,CACV,GAAG,CAAC,WAAW,EACf,2BAA2B,IAAI,CAAC,aAAa,wBAAwB,IAAI,CAAC,cAAc,KAAK;gBAC3F,iFAAiF,CACpF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,wBAAwB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACtG,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAwB;IAChE,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,yDAAyD,CAAC,CAAC;IACzF,IAAI,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,MAAM,aAAa,EAAE,CAAC;QAClC,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,YAAY,CACV,GAAG,CAAC,WAAW,EACf,uCAAuC;gBACrC,+DAA+D;gBAC/D,6DAA6D,CAChE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,YAAY,CACV,GAAG,CAAC,WAAW,EACf,sBAAsB,GAAG,CAAC,KAAK,IAAI,eAAe,MAAM;gBACtD,gBAAgB,GAAG,CAAC,MAAM,IAAI,SAAS,EAAE,CAC5C,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACtG,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { appendSystem } from '../hooks/messageHelpers.js';
|
|
4
|
+
export async function handleWorkspaceShow(ctx, what) {
|
|
5
|
+
try {
|
|
6
|
+
const zelari = path.join(process.cwd(), '.zelari');
|
|
7
|
+
let content;
|
|
8
|
+
switch (what) {
|
|
9
|
+
case 'plan': {
|
|
10
|
+
const planPath = path.join(zelari, 'plan.md');
|
|
11
|
+
try {
|
|
12
|
+
content = await fs.readFile(planPath, 'utf-8');
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
content = '(no plan.md yet — run a council session first)';
|
|
16
|
+
}
|
|
17
|
+
break;
|
|
18
|
+
}
|
|
19
|
+
case 'decisions': {
|
|
20
|
+
const decisionsDir = path.join(zelari, 'decisions');
|
|
21
|
+
try {
|
|
22
|
+
const files = (await fs.readdir(decisionsDir))
|
|
23
|
+
.filter((f) => f.endsWith('.md'))
|
|
24
|
+
.sort();
|
|
25
|
+
if (files.length === 0) {
|
|
26
|
+
content = '(no ADRs yet — invoke /council to generate some)';
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
const lines = [`# Decisions (${files.length})\n`];
|
|
30
|
+
const { parseFrontmatter } = await import('../workspace/storage.js');
|
|
31
|
+
for (const f of files) {
|
|
32
|
+
const raw = await fs.readFile(path.join(decisionsDir, f), 'utf-8');
|
|
33
|
+
const { meta, body } = parseFrontmatter(raw);
|
|
34
|
+
const title = meta.title ?? body.split('\n')[0]?.replace(/^#\s*/, '').trim() ?? f;
|
|
35
|
+
lines.push(`- **${f.replace(/\.md$/, '')}** [${meta.status ?? 'unknown'}] ${title}`);
|
|
36
|
+
}
|
|
37
|
+
content = lines.join('\n');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
content = '(no .zelari/decisions/ yet)';
|
|
42
|
+
}
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
case 'risks': {
|
|
46
|
+
const risksPath = path.join(zelari, 'risks.md');
|
|
47
|
+
try {
|
|
48
|
+
content = await fs.readFile(risksPath, 'utf-8');
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
content = '(no risks.md yet)';
|
|
52
|
+
}
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
case 'agents': {
|
|
56
|
+
const agentsPath = path.join(process.cwd(), 'AGENTS.MD');
|
|
57
|
+
try {
|
|
58
|
+
content = await fs.readFile(agentsPath, 'utf-8');
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
content = '(no AGENTS.MD yet at project root — run `/workspace sync` after a council session)';
|
|
62
|
+
}
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
case 'docs': {
|
|
66
|
+
const docsDir = path.join(zelari, 'docs');
|
|
67
|
+
try {
|
|
68
|
+
const files = (await fs.readdir(docsDir)).filter((f) => f.endsWith('.md')).sort();
|
|
69
|
+
content = files.length
|
|
70
|
+
? `# Docs (${files.length})\n\n` + files.map((f) => `- ${f}`).join('\n')
|
|
71
|
+
: '(no docs drafts yet)';
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
content = '(no .zelari/docs/ yet)';
|
|
75
|
+
}
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
default:
|
|
79
|
+
content = `Unknown artifact: ${what}`;
|
|
80
|
+
}
|
|
81
|
+
appendSystem(ctx.setMessages, `[workspace: ${what}]\n\n${content}`);
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
appendSystem(ctx.setMessages, `[workspace error] ${err instanceof Error ? err.message : String(err)}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export async function handleWorkspaceSync(ctx) {
|
|
88
|
+
try {
|
|
89
|
+
const { createWorkspaceContext } = await import('../workspace/stubs.js');
|
|
90
|
+
const { updateAgentsMd } = await import('../workspace/agentsMd.js');
|
|
91
|
+
const wsCtx = createWorkspaceContext(process.cwd());
|
|
92
|
+
const out = await updateAgentsMd(wsCtx, process.cwd());
|
|
93
|
+
const msg = out.changed
|
|
94
|
+
? `[workspace] AGENTS.MD updated (${out.sections.join(', ') || 'no auto-sections changed'})`
|
|
95
|
+
: out.reason
|
|
96
|
+
? `[workspace] AGENTS.MD not modified — ${out.reason}`
|
|
97
|
+
: '[workspace] AGENTS.MD already up to date (no changes)';
|
|
98
|
+
appendSystem(ctx.setMessages, msg);
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
appendSystem(ctx.setMessages, `[workspace sync error] ${err instanceof Error ? err.message : String(err)}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export async function handleWorkspaceReset(ctx, force) {
|
|
105
|
+
if (!force) {
|
|
106
|
+
appendSystem(ctx.setMessages, '⚠ /workspace reset is DESTRUCTIVE. Use /workspace reset --yes to confirm.');
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
const target = path.join(process.cwd(), '.zelari');
|
|
111
|
+
await fs.rm(target, { recursive: true, force: true });
|
|
112
|
+
appendSystem(ctx.setMessages, '[workspace] .zelari/ removed');
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
appendSystem(ctx.setMessages, `[workspace reset error] ${err instanceof Error ? err.message : String(err)}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=workspace.js.map
|