zelari-code 0.4.3 → 0.7.5
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 +42 -0
- package/bin/zelari-code.js +1 -1
- 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 +50 -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 +23 -13
- 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 +2 -9
- package/dist/agents/tools.js.map +1 -1
- package/dist/cli/app.js +72 -33
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/compaction.js.map +1 -1
- package/dist/cli/components/ChatStream.js +43 -82
- package/dist/cli/components/ChatStream.js.map +1 -1
- package/dist/cli/components/CollapsibleToolOutput.js +8 -21
- package/dist/cli/components/CollapsibleToolOutput.js.map +1 -1
- package/dist/cli/components/Header.js +6 -18
- package/dist/cli/components/Header.js.map +1 -1
- package/dist/cli/components/LiveRegion.js +54 -0
- package/dist/cli/components/LiveRegion.js.map +1 -0
- package/dist/cli/components/Sidebar.js +33 -31
- package/dist/cli/components/Sidebar.js.map +1 -1
- package/dist/cli/components/StatusBar.js +42 -0
- package/dist/cli/components/StatusBar.js.map +1 -0
- package/dist/cli/components/ToolOutput.js +68 -0
- package/dist/cli/components/ToolOutput.js.map +1 -0
- package/dist/cli/components/toolFormat.js +195 -0
- package/dist/cli/components/toolFormat.js.map +1 -0
- package/dist/cli/councilDispatcher.js +1 -1
- package/dist/cli/councilDispatcher.js.map +1 -1
- package/dist/cli/grokOAuth.js +93 -75
- package/dist/cli/grokOAuth.js.map +1 -1
- package/dist/cli/headless.js +137 -0
- package/dist/cli/headless.js.map +1 -0
- package/dist/cli/hooks/chatState.js +139 -0
- package/dist/cli/hooks/chatState.js.map +1 -0
- package/dist/cli/hooks/eventsToMessages.js +42 -11
- package/dist/cli/hooks/eventsToMessages.js.map +1 -1
- package/dist/cli/hooks/messageHelpers.js +72 -15
- package/dist/cli/hooks/messageHelpers.js.map +1 -1
- package/dist/cli/hooks/useBatchedMessages.js +71 -0
- package/dist/cli/hooks/useBatchedMessages.js.map +1 -0
- package/dist/cli/hooks/useChatTurn.js +453 -84
- package/dist/cli/hooks/useChatTurn.js.map +1 -1
- package/dist/cli/hooks/useSession.js +24 -3
- package/dist/cli/hooks/useSession.js.map +1 -1
- package/dist/cli/hooks/useSlashDispatch.js +13 -2
- package/dist/cli/hooks/useSlashDispatch.js.map +1 -1
- package/dist/cli/main.bundled.js +10607 -7889
- package/dist/cli/main.bundled.js.map +4 -4
- package/dist/cli/main.js +120 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/mcp/mcpClient.js +152 -0
- package/dist/cli/mcp/mcpClient.js.map +1 -0
- package/dist/cli/mcp/mcpManager.js +139 -0
- package/dist/cli/mcp/mcpManager.js.map +1 -0
- package/dist/cli/provider/openai-compatible.js +9 -2
- package/dist/cli/provider/openai-compatible.js.map +1 -1
- package/dist/cli/refreshRegistry.js +9 -6
- package/dist/cli/refreshRegistry.js.map +1 -1
- package/dist/cli/runHeadless.js +160 -0
- package/dist/cli/runHeadless.js.map +1 -0
- package/dist/cli/sessionManager.js +1 -1
- package/dist/cli/sessionManager.js.map +1 -1
- package/dist/cli/skillSuggest.js +1 -1
- package/dist/cli/skillsMd.js +155 -0
- package/dist/cli/skillsMd.js.map +1 -0
- package/dist/cli/slashHandlers/branch.js +11 -2
- package/dist/cli/slashHandlers/branch.js.map +1 -1
- package/dist/cli/slashHandlers/git.js +0 -75
- package/dist/cli/slashHandlers/git.js.map +1 -1
- package/dist/cli/slashHandlers/promoteMember.js +25 -0
- package/dist/cli/slashHandlers/promoteMember.js.map +1 -0
- package/dist/cli/slashHandlers/skills.js +16 -0
- package/dist/cli/slashHandlers/skills.js.map +1 -1
- 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/toolRegistry.js +37 -6
- package/dist/cli/toolRegistry.js.map +1 -1
- 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/paths.js +20 -13
- package/dist/cli/workspace/paths.js.map +1 -1
- package/dist/cli/workspace/storage.js +7 -3
- package/dist/cli/workspace/storage.js.map +1 -1
- package/dist/cli/workspace/stubs.js +122 -44
- package/dist/cli/workspace/stubs.js.map +1 -1
- package/dist/cli/workspace/toolRegistry.js +2 -2
- package/dist/cli/workspace/toolRegistry.js.map +1 -1
- package/dist/cli/workspace/workspaceSummary.js +255 -0
- package/dist/cli/workspace/workspaceSummary.js.map +1 -0
- package/dist/main/core/AgentHarness.js +36 -7
- package/dist/main/core/AgentHarness.js.map +1 -1
- package/dist/main/core/tools/builtin/listFiles.js +43 -5
- package/dist/main/core/tools/builtin/listFiles.js.map +1 -1
- package/dist/main/core/tools/builtin/search.js +28 -120
- package/dist/main/core/tools/builtin/search.js.map +1 -1
- package/package.json +6 -1
- package/dist/cli/oauthCallbackServer.js +0 -207
- package/dist/cli/oauthCallbackServer.js.map +0 -1
- package/dist/main/core/tools/builtin/_walk.js +0 -129
- package/dist/main/core/tools/builtin/_walk.js.map +0 -1
- package/dist/main/core/tools/builtin/diff.js +0 -477
- package/dist/main/core/tools/builtin/diff.js.map +0 -1
|
@@ -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"}
|
package/dist/cli/toolRegistry.js
CHANGED
|
@@ -13,12 +13,13 @@
|
|
|
13
13
|
* @see docs/plans/2026-06-29-anathema-coder-v3.md (Tasks A1 + A2)
|
|
14
14
|
* @see docs/plans/2026-07-01-v0-4-0-fix-audit.md (v0.4.0 scope)
|
|
15
15
|
*/
|
|
16
|
-
import { ToolRegistry } from '
|
|
17
|
-
import { readFileTool, writeFileTool, editFileTool, } from '
|
|
18
|
-
import { bashTool } from '
|
|
19
|
-
import { grepContentTool } from '
|
|
20
|
-
import { listFilesTool } from '
|
|
21
|
-
import { showDiffTool, applyDiffTool } from '
|
|
16
|
+
import { ToolRegistry } from '@zelari/core/harness/tools/registry';
|
|
17
|
+
import { readFileTool, writeFileTool, editFileTool, } from '@zelari/core/harness/tools/builtin/filesystem';
|
|
18
|
+
import { bashTool } from '@zelari/core/harness/tools/builtin/shell';
|
|
19
|
+
import { grepContentTool } from '@zelari/core/harness/tools/builtin/search';
|
|
20
|
+
import { listFilesTool } from '@zelari/core/harness/tools/builtin/listFiles';
|
|
21
|
+
import { showDiffTool, applyDiffTool } from '@zelari/core/harness/tools/builtin/diff';
|
|
22
|
+
import { fetchUrlTool, webSearchTool } from '@zelari/core/harness/tools/builtin/web';
|
|
22
23
|
import { resolveSandboxedPath, SandboxViolationError } from './safety/sandboxPath.js';
|
|
23
24
|
import { assertShellAllowed, ShellBlockedError } from './safety/shellBlocklist.js';
|
|
24
25
|
import { AuditLogger } from './safety/auditLogger.js';
|
|
@@ -48,6 +49,10 @@ export function createBuiltinToolRegistry(options = {}) {
|
|
|
48
49
|
const safeApplyDiff = wrapWithSandbox(applyDiffTool, ['path'], root, audit, sessionId);
|
|
49
50
|
// Wrap bash: shell blocklist + audit.
|
|
50
51
|
const safeBash = wrapWithShellSafety(bashTool, audit, sessionId);
|
|
52
|
+
// v0.7.5: network tools — audit-only wrap (no filesystem paths to sandbox;
|
|
53
|
+
// the tools themselves enforce http(s)-only + timeout + size caps).
|
|
54
|
+
const safeFetchUrl = wrapWithAudit(fetchUrlTool, audit, sessionId);
|
|
55
|
+
const safeWebSearch = wrapWithAudit(webSearchTool, audit, sessionId);
|
|
51
56
|
const registry = new ToolRegistry();
|
|
52
57
|
registry.register(safeReadFile);
|
|
53
58
|
registry.register(safeWriteFile);
|
|
@@ -57,6 +62,8 @@ export function createBuiltinToolRegistry(options = {}) {
|
|
|
57
62
|
registry.register(safeListFiles);
|
|
58
63
|
registry.register(safeShowDiff);
|
|
59
64
|
registry.register(safeApplyDiff);
|
|
65
|
+
registry.register(safeFetchUrl);
|
|
66
|
+
registry.register(safeWebSearch);
|
|
60
67
|
const tools = [
|
|
61
68
|
safeReadFile,
|
|
62
69
|
safeWriteFile,
|
|
@@ -66,6 +73,8 @@ export function createBuiltinToolRegistry(options = {}) {
|
|
|
66
73
|
safeListFiles,
|
|
67
74
|
safeShowDiff,
|
|
68
75
|
safeApplyDiff,
|
|
76
|
+
safeFetchUrl,
|
|
77
|
+
safeWebSearch,
|
|
69
78
|
].map((t) => ({
|
|
70
79
|
name: t.name,
|
|
71
80
|
description: t.description,
|
|
@@ -131,6 +140,28 @@ function wrapWithSandbox(original, pathArgs, root, audit, sessionId) {
|
|
|
131
140
|
},
|
|
132
141
|
};
|
|
133
142
|
}
|
|
143
|
+
/** Audit-only wrap for tools with no path/shell args (network tools). */
|
|
144
|
+
function wrapWithAudit(original, audit, sessionId) {
|
|
145
|
+
return {
|
|
146
|
+
...original,
|
|
147
|
+
execute: async (rawArgs, ctx) => {
|
|
148
|
+
try {
|
|
149
|
+
return await audit.runTool({
|
|
150
|
+
tool: original.name,
|
|
151
|
+
args: redactForAudit(rawArgs),
|
|
152
|
+
sessionId,
|
|
153
|
+
fn: () => original.execute(rawArgs, ctx),
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
return {
|
|
158
|
+
ok: false,
|
|
159
|
+
error: err instanceof Error ? err.message : String(err),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
134
165
|
/**
|
|
135
166
|
* Wrap the bash tool: assertShellAllowed() runs before execute(), and
|
|
136
167
|
* every invocation is audited.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolRegistry.js","sourceRoot":"","sources":["../../src/cli/toolRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"toolRegistry.js","sourceRoot":"","sources":["../../src/cli/toolRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,EACL,YAAY,EACZ,aAAa,EACb,YAAY,GACb,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAqBtD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,yBAAyB,CACvC,UAAiC,EAAE;IAEnC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,WAAW,EAAE,CAAC;IACjD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAE7C,sEAAsE;IACtE,MAAM,YAAY,GAAG,eAAe,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACrF,MAAM,aAAa,GAAG,eAAe,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACvF,MAAM,YAAY,GAAG,eAAe,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACrF,MAAM,eAAe,GAAG,eAAe,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAC3F,MAAM,aAAa,GAAG,eAAe,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACvF,MAAM,YAAY,GAAG,eAAe,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACrF,MAAM,aAAa,GAAG,eAAe,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAEvF,sCAAsC;IACtC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAEjE,2EAA2E;IAC3E,oEAAoE;IACpE,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,aAAa,CAAC,aAAa,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAErE,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAEjC,MAAM,KAAK,GAAyB;QAClC,YAAY;QACZ,aAAa;QACb,YAAY;QACZ,QAAQ;QACR,eAAe;QACf,aAAa;QACb,YAAY;QACZ,aAAa;QACb,YAAY;QACZ,aAAa;KACd,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;KACjC,CAAC,CAAC,CAAC;IACJ,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,SAAS,eAAe,CACtB,QAA8B,EAC9B,QAA2B,EAC3B,IAAY,EACZ,KAAkB,EAClB,SAAiB;IAEjB,OAAO;QACL,GAAG,QAAQ;QACX,OAAO,EAAE,KAAK,EAAE,OAAU,EAAE,GAAgB,EAA2B,EAAE;YACvE,4DAA4D;YAC5D,MAAM,IAAI,GAAG,OAAkC,CAAC;YAChD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1C,IAAI,CAAC;wBACH,IAAI,CAAC,GAAG,CAAC,GAAG,oBAAoB,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;oBAChD,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,IAAI,GAAG,YAAY,qBAAqB,EAAE,CAAC;4BACzC,+DAA+D;4BAC/D,MAAM,KAAK,CAAC,MAAM,CAAC;gCACjB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gCAC5B,SAAS;gCACT,IAAI,EAAE,QAAQ,CAAC,IAAI;gCACnB,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC;gCAC1B,EAAE,EAAE,KAAK;gCACT,aAAa,EAAE,GAAG,CAAC,OAAO;gCAC1B,UAAU,EAAE,CAAC;gCACb,KAAK,EAAE,mBAAmB;6BAC3B,CAAC,CAAC;4BACH,OAAO;gCACL,EAAE,EAAE,KAAK;gCACT,KAAK,EAAE,aAAa,GAAG,CAAC,OAAO,EAAE;6BAChB,CAAC;wBACtB,CAAC;wBACD,MAAM,GAAG,CAAC;oBACZ,CAAC;gBACH,CAAC;YACH,CAAC;YACD,2BAA2B;YAC3B,IAAI,CAAC;gBACH,OAAO,MAAM,KAAK,CAAC,OAAO,CAAC;oBACzB,IAAI,EAAE,QAAQ,CAAC,IAAI;oBACnB,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC;oBAC1B,SAAS;oBACT,EAAE,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;iBACzC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACtC,CAAC;YACtB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,SAAS,aAAa,CACpB,QAA8B,EAC9B,KAAkB,EAClB,SAAiB;IAEjB,OAAO;QACL,GAAG,QAAQ;QACX,OAAO,EAAE,KAAK,EAAE,OAAU,EAAE,GAAgB,EAA2B,EAAE;YACvE,IAAI,CAAC;gBACH,OAAO,MAAM,KAAK,CAAC,OAAO,CAAC;oBACzB,IAAI,EAAE,QAAQ,CAAC,IAAI;oBACnB,IAAI,EAAE,cAAc,CAAC,OAAkC,CAAC;oBACxD,SAAS;oBACT,EAAE,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;iBACzC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACtC,CAAC;YACtB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAC1B,QAA8B,EAC9B,KAAkB,EAClB,SAAiB;IAEjB,OAAO;QACL,GAAG,QAAQ;QACX,OAAO,EAAE,KAAK,EAAE,OAAU,EAAE,GAAgB,EAA2B,EAAE;YACvE,MAAM,IAAI,GAAG,OAAkC,CAAC;YAChD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;YAC5B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBACH,kBAAkB,CAAC,GAAG,CAAC,CAAC;gBAC1B,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,GAAG,YAAY,iBAAiB,EAAE,CAAC;wBACrC,MAAM,KAAK,CAAC,MAAM,CAAC;4BACjB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;4BAC5B,SAAS;4BACT,IAAI,EAAE,QAAQ,CAAC,IAAI;4BACnB,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC;4BAC1B,EAAE,EAAE,KAAK;4BACT,aAAa,EAAE,GAAG,CAAC,OAAO;4BAC1B,UAAU,EAAE,CAAC;4BACb,KAAK,EAAE,eAAe;yBACvB,CAAC,CAAC;wBACH,OAAO;4BACL,EAAE,EAAE,KAAK;4BACT,KAAK,EAAE,mBAAmB,GAAG,CAAC,OAAO,EAAE;yBACtB,CAAC;oBACtB,CAAC;oBACD,MAAM,GAAG,CAAC;gBACZ,CAAC;YACH,CAAC;YACD,IAAI,CAAC;gBACH,OAAO,MAAM,KAAK,CAAC,OAAO,CAAC;oBACzB,IAAI,EAAE,QAAQ,CAAC,IAAI;oBACnB,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC;oBAC1B,SAAS;oBACT,EAAE,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;iBACzC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACtC,CAAC;YACtB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,IAA6B;IACnD,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,IAAI,sCAAsC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC5E,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACjB,CAAC;aAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACnD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* firstRun — detection logic for the onboarding wizard.
|
|
3
|
+
*
|
|
4
|
+
* Decides whether `zelari-code` should launch the wizard instead of
|
|
5
|
+
* the regular TUI. The decision is a pure function of:
|
|
6
|
+
* - CLI flags (--no-wizard, --reset-config)
|
|
7
|
+
* - Environment variables (ZELARI_NO_WIZARD)
|
|
8
|
+
* - Presence of the provider config file on disk
|
|
9
|
+
*
|
|
10
|
+
* All three inputs are injected so tests don't touch real fs/env.
|
|
11
|
+
*
|
|
12
|
+
* @public
|
|
13
|
+
* @since 0.5.0
|
|
14
|
+
*/
|
|
15
|
+
import { existsSync } from 'node:fs';
|
|
16
|
+
/**
|
|
17
|
+
* Decide whether the wizard should run on startup.
|
|
18
|
+
*
|
|
19
|
+
* Order of precedence (highest first):
|
|
20
|
+
* 1. `--reset-config` → always run wizard (force re-onboarding).
|
|
21
|
+
* 2. `--no-wizard` or `ZELARI_NO_WIZARD` → never run wizard.
|
|
22
|
+
* 3. Config file missing on disk → run wizard (first-run case).
|
|
23
|
+
* 4. Otherwise → skip wizard.
|
|
24
|
+
*
|
|
25
|
+
* @public
|
|
26
|
+
*/
|
|
27
|
+
export function shouldRunWizard(input) {
|
|
28
|
+
const exists = input.exists ?? existsSync;
|
|
29
|
+
if (input.hasResetConfigFlag) {
|
|
30
|
+
return { shouldRun: true, reason: '--reset-config flag forced wizard' };
|
|
31
|
+
}
|
|
32
|
+
if (input.hasNoWizardFlag) {
|
|
33
|
+
return { shouldRun: false, reason: '--no-wizard flag suppressed wizard' };
|
|
34
|
+
}
|
|
35
|
+
if (input.noWizardEnv && input.noWizardEnv.trim().length > 0) {
|
|
36
|
+
return {
|
|
37
|
+
shouldRun: false,
|
|
38
|
+
reason: `ZELARI_NO_WIZARD=${input.noWizardEnv} suppressed wizard`,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
if (!exists(input.configPath)) {
|
|
42
|
+
return {
|
|
43
|
+
shouldRun: true,
|
|
44
|
+
reason: `provider config not found at ${input.configPath} (first run)`,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
shouldRun: false,
|
|
49
|
+
reason: `provider config exists at ${input.configPath}; wizard skipped`,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export function parseWizardFlags(argv) {
|
|
53
|
+
let noWizard = false;
|
|
54
|
+
let resetConfig = false;
|
|
55
|
+
for (const arg of argv) {
|
|
56
|
+
if (arg === '--no-wizard')
|
|
57
|
+
noWizard = true;
|
|
58
|
+
else if (arg === '--reset-config')
|
|
59
|
+
resetConfig = true;
|
|
60
|
+
}
|
|
61
|
+
return { noWizard, resetConfig };
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=firstRun.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firstRun.js","sourceRoot":"","sources":["../../../src/cli/wizard/firstRun.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAyBrC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,KAAoB;IAClD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,UAAU,CAAC;IAE1C,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;QAC7B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,mCAAmC,EAAE,CAAC;IAC1E,CAAC;IAED,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;QAC1B,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,oCAAoC,EAAE,CAAC;IAC5E,CAAC;IAED,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7D,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,oBAAoB,KAAK,CAAC,WAAW,oBAAoB;SAClE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO;YACL,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,gCAAgC,KAAK,CAAC,UAAU,cAAc;SACvE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,MAAM,EAAE,6BAA6B,KAAK,CAAC,UAAU,kBAAkB;KACxE,CAAC;AACJ,CAAC;AAcD,MAAM,UAAU,gBAAgB,CAAC,IAAuB;IACtD,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,aAAa;YAAE,QAAQ,GAAG,IAAI,CAAC;aACtC,IAAI,GAAG,KAAK,gBAAgB;YAAE,WAAW,GAAG,IAAI,CAAC;IACxD,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wizard — Ink UI for first-run onboarding.
|
|
3
|
+
*
|
|
4
|
+
* Renders the step machine from `useWizardState`. Keyboard handling is
|
|
5
|
+
* done at the App level (via useInput in main.tsx) — this component is
|
|
6
|
+
* "dumb" and just renders the current state.
|
|
7
|
+
*
|
|
8
|
+
* Steps:
|
|
9
|
+
* 1. welcome: title + intro text + "Press Enter to begin"
|
|
10
|
+
* 2. provider: list of PROVIDERS with arrow cursor
|
|
11
|
+
* 3. model: read model name from input (or accept default)
|
|
12
|
+
* 4. apikey: choose env/keystore/skip
|
|
13
|
+
* 5. confirm: review + "Press Enter to commit, B to go back"
|
|
14
|
+
*
|
|
15
|
+
* Used in `main.tsx` instead of `<App>` when `shouldRunWizard()` is true.
|
|
16
|
+
*
|
|
17
|
+
* @public
|
|
18
|
+
* @since 0.5.0
|
|
19
|
+
*/
|
|
20
|
+
import React from 'react';
|
|
21
|
+
import { Box, Text } from 'ink';
|
|
22
|
+
import { API_KEY_OPTIONS, } from './useWizardState.js';
|
|
23
|
+
const VERSION = '0.7.2';
|
|
24
|
+
function Frame({ children }) {
|
|
25
|
+
return (React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 2, paddingY: 1 }, children));
|
|
26
|
+
}
|
|
27
|
+
function Step(props) {
|
|
28
|
+
return (React.createElement(Box, null,
|
|
29
|
+
React.createElement(Text, { color: props.active ? 'cyan' : 'gray', inverse: props.active },
|
|
30
|
+
' ',
|
|
31
|
+
props.index,
|
|
32
|
+
"/",
|
|
33
|
+
props.total,
|
|
34
|
+
" ",
|
|
35
|
+
props.name,
|
|
36
|
+
' ')));
|
|
37
|
+
}
|
|
38
|
+
function renderProviderList(providers, cursor) {
|
|
39
|
+
return (React.createElement(Box, { flexDirection: "column" }, providers.map((p, i) => {
|
|
40
|
+
const arrow = i === cursor ? '➜ ' : ' ';
|
|
41
|
+
const color = i === cursor ? 'cyan' : undefined;
|
|
42
|
+
return (React.createElement(Text, { key: p.id, color: color },
|
|
43
|
+
arrow,
|
|
44
|
+
p.displayName,
|
|
45
|
+
" ",
|
|
46
|
+
React.createElement(Text, { color: "gray" },
|
|
47
|
+
"(",
|
|
48
|
+
p.id,
|
|
49
|
+
", uses env ",
|
|
50
|
+
p.envVar,
|
|
51
|
+
")")));
|
|
52
|
+
})));
|
|
53
|
+
}
|
|
54
|
+
function renderApiKeyOptions(cursor) {
|
|
55
|
+
const labels = {
|
|
56
|
+
env: 'Use env var (recommended — safe)',
|
|
57
|
+
keystore: 'Save to local keyStore (encrypted)',
|
|
58
|
+
skip: 'Skip for now (chat will fail until key is set)',
|
|
59
|
+
};
|
|
60
|
+
return (React.createElement(Box, { flexDirection: "column" }, API_KEY_OPTIONS.map((choice, i) => {
|
|
61
|
+
const arrow = i === cursor ? '➜ ' : ' ';
|
|
62
|
+
const color = i === cursor ? 'cyan' : undefined;
|
|
63
|
+
return (React.createElement(Text, { key: choice, color: color },
|
|
64
|
+
arrow,
|
|
65
|
+
labels[choice]));
|
|
66
|
+
})));
|
|
67
|
+
}
|
|
68
|
+
export function Wizard({ state, providers }) {
|
|
69
|
+
const s = state.state;
|
|
70
|
+
if (s.committed) {
|
|
71
|
+
return (React.createElement(Frame, null,
|
|
72
|
+
React.createElement(Text, { color: "green" }, "\u2713 Setup complete!"),
|
|
73
|
+
React.createElement(Text, null,
|
|
74
|
+
"Provider: ",
|
|
75
|
+
React.createElement(Text, { color: "cyan" }, s.providerId),
|
|
76
|
+
' | ',
|
|
77
|
+
"Model: ",
|
|
78
|
+
React.createElement(Text, { color: "cyan" }, s.model),
|
|
79
|
+
' | ',
|
|
80
|
+
"API key: ",
|
|
81
|
+
React.createElement(Text, { color: "cyan" }, s.apiKeyChoice ?? 'n/a')),
|
|
82
|
+
React.createElement(Box, { marginTop: 1 },
|
|
83
|
+
React.createElement(Text, { color: "gray" }, "Launching zelari-code\u2026 (press any key)"))));
|
|
84
|
+
}
|
|
85
|
+
return (React.createElement(Frame, null,
|
|
86
|
+
React.createElement(Text, { color: "cyan", bold: true },
|
|
87
|
+
"zelari-code v",
|
|
88
|
+
VERSION,
|
|
89
|
+
" \u2014 first-time setup"),
|
|
90
|
+
React.createElement(Box, { marginTop: 1, marginBottom: 1, flexDirection: "row" },
|
|
91
|
+
React.createElement(Step, { index: 1, total: 5, name: "welcome", active: s.step === 'welcome' }),
|
|
92
|
+
React.createElement(Step, { index: 2, total: 5, name: "provider", active: s.step === 'provider' }),
|
|
93
|
+
React.createElement(Step, { index: 3, total: 5, name: "model", active: s.step === 'model' }),
|
|
94
|
+
React.createElement(Step, { index: 4, total: 5, name: "apikey", active: s.step === 'apikey' }),
|
|
95
|
+
React.createElement(Step, { index: 5, total: 5, name: "confirm", active: s.step === 'confirm' })),
|
|
96
|
+
s.step === 'welcome' && (React.createElement(React.Fragment, null,
|
|
97
|
+
React.createElement(Text, null, "Welcome! Let's get you coding in under two minutes."),
|
|
98
|
+
React.createElement(Text, { color: "gray" }, "We'll pick a provider, default model, and how to handle your API key."),
|
|
99
|
+
React.createElement(Box, { marginTop: 1 },
|
|
100
|
+
React.createElement(Text, null, "Press "),
|
|
101
|
+
React.createElement(Text, { color: "cyan", inverse: true }, " Enter "),
|
|
102
|
+
React.createElement(Text, null, " to continue, or "),
|
|
103
|
+
React.createElement(Text, { color: "red", inverse: true }, " Q "),
|
|
104
|
+
React.createElement(Text, null, " to quit (re-run with "),
|
|
105
|
+
React.createElement(Text, { color: "gray" }, "--no-wizard"),
|
|
106
|
+
React.createElement(Text, null, " to skip later).")))),
|
|
107
|
+
s.step === 'provider' && (React.createElement(React.Fragment, null,
|
|
108
|
+
React.createElement(Text, null, "Choose your LLM provider:"),
|
|
109
|
+
React.createElement(Box, { marginTop: 1 }, renderProviderList(providers, s.providerCursor)),
|
|
110
|
+
React.createElement(Box, { marginTop: 1 },
|
|
111
|
+
React.createElement(Text, { color: "gray" }, "\u2191/\u2193 to move, Enter to confirm")))),
|
|
112
|
+
s.step === 'model' && (React.createElement(React.Fragment, null,
|
|
113
|
+
React.createElement(Text, null,
|
|
114
|
+
"Model for ",
|
|
115
|
+
React.createElement(Text, { color: "cyan" }, s.providerId),
|
|
116
|
+
":"),
|
|
117
|
+
React.createElement(Box, { marginTop: 1, borderStyle: "single", borderColor: "cyan", paddingX: 1 },
|
|
118
|
+
React.createElement(Text, null, s.model ?? '(empty)')),
|
|
119
|
+
React.createElement(Box, { marginTop: 1 },
|
|
120
|
+
React.createElement(Text, null,
|
|
121
|
+
"Press ",
|
|
122
|
+
React.createElement(Text, { color: "cyan", inverse: true }, " Enter "),
|
|
123
|
+
"to accept, or type a new name. ",
|
|
124
|
+
React.createElement(Text, { color: "gray" }, "(default kept on empty input)"))))),
|
|
125
|
+
s.step === 'apikey' && (React.createElement(React.Fragment, null,
|
|
126
|
+
React.createElement(Text, null, "How should we handle the API key?"),
|
|
127
|
+
React.createElement(Box, { marginTop: 1 }, renderApiKeyOptions(s.apiKeyCursor)),
|
|
128
|
+
React.createElement(Box, { marginTop: 1 },
|
|
129
|
+
React.createElement(Text, { color: "gray" }, "\u2191/\u2193 to move, Enter to confirm")))),
|
|
130
|
+
s.step === 'confirm' && (React.createElement(React.Fragment, null,
|
|
131
|
+
React.createElement(Text, null, "Confirm your setup:"),
|
|
132
|
+
React.createElement(Box, { marginTop: 1, flexDirection: "column" },
|
|
133
|
+
React.createElement(Text, null,
|
|
134
|
+
"Provider: ",
|
|
135
|
+
React.createElement(Text, { color: "cyan" }, s.providerId)),
|
|
136
|
+
React.createElement(Text, null,
|
|
137
|
+
"Model: ",
|
|
138
|
+
React.createElement(Text, { color: "cyan" }, s.model)),
|
|
139
|
+
React.createElement(Text, null,
|
|
140
|
+
"API key: ",
|
|
141
|
+
React.createElement(Text, { color: "cyan" }, s.apiKeyChoice ?? '(unset)'))),
|
|
142
|
+
React.createElement(Box, { marginTop: 1 },
|
|
143
|
+
React.createElement(Text, null,
|
|
144
|
+
"Press ",
|
|
145
|
+
React.createElement(Text, { color: "green", inverse: true }, " Enter "),
|
|
146
|
+
"to save and launch, or ",
|
|
147
|
+
React.createElement(Text, { color: "yellow", inverse: true }, " B "),
|
|
148
|
+
"to go back."))))));
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/wizard/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* runWizard — runs the wizard as a self-contained Ink app, then
|
|
3
|
+
* transparently transitions into the regular App once commit() runs.
|
|
4
|
+
*
|
|
5
|
+
* No process.exit — the same Ink root remains mounted; only the child
|
|
6
|
+
* component changes. This avoids the bad UX of "wizard runs, CLI
|
|
7
|
+
* exits, user has to re-launch" while still honouring the user's
|
|
8
|
+
* decision end-to-end (provider config + api key + model are all
|
|
9
|
+
* persisted before the transition).
|
|
10
|
+
*
|
|
11
|
+
* @public
|
|
12
|
+
* @since 0.5.0
|
|
13
|
+
*/
|
|
14
|
+
import React, { useEffect, useState } from 'react';
|
|
15
|
+
import { Box, Text } from 'ink';
|
|
16
|
+
import { useInput } from 'ink';
|
|
17
|
+
// @ts-ignore — app.tsx is .tsx, esbuild-bundled.
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
19
|
+
import { App } from '../app.js';
|
|
20
|
+
import { PROVIDERS } from '../keyStore.js';
|
|
21
|
+
import { getModelForProvider } from '../providerConfig.js';
|
|
22
|
+
import { Wizard } from './index.js';
|
|
23
|
+
import { createWizardState } from './useWizardState.js';
|
|
24
|
+
export function RunWizard(_props) {
|
|
25
|
+
const [wiz] = useState(() => createWizardState({
|
|
26
|
+
providers: PROVIDERS,
|
|
27
|
+
defaultModelFor: (id) => getModelForProvider(id),
|
|
28
|
+
}));
|
|
29
|
+
const [, force] = useState(0);
|
|
30
|
+
// Force re-render when state machine changes (subscribe pattern).
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
if (typeof wiz.subscribe === 'function') {
|
|
33
|
+
const sub = wiz.subscribe(() => force((n) => n + 1));
|
|
34
|
+
return () => sub();
|
|
35
|
+
}
|
|
36
|
+
return undefined;
|
|
37
|
+
}, [wiz]);
|
|
38
|
+
useInput((input, key) => {
|
|
39
|
+
// Once committed, App takes over. Don't intercept input here
|
|
40
|
+
// (App's own useInput handlers manage keyboard from this point).
|
|
41
|
+
if (wiz.state.committed)
|
|
42
|
+
return;
|
|
43
|
+
const s = wiz.state;
|
|
44
|
+
if (key.escape) {
|
|
45
|
+
process.exit(0);
|
|
46
|
+
}
|
|
47
|
+
// 'q' quits from any step (not just welcome).
|
|
48
|
+
if (input === 'q') {
|
|
49
|
+
process.exit(0);
|
|
50
|
+
}
|
|
51
|
+
if (s.step === 'welcome') {
|
|
52
|
+
if (key.return) {
|
|
53
|
+
wiz.jumpToProvider();
|
|
54
|
+
}
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (s.step === 'provider') {
|
|
58
|
+
if (key.upArrow)
|
|
59
|
+
wiz.moveProvider(true);
|
|
60
|
+
else if (key.downArrow)
|
|
61
|
+
wiz.moveProvider(false);
|
|
62
|
+
else if (key.return)
|
|
63
|
+
wiz.selectProvider();
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (s.step === 'model') {
|
|
67
|
+
if (key.return) {
|
|
68
|
+
// If model is empty, fall back to the default for the
|
|
69
|
+
// currently selected provider. If provider is also unset,
|
|
70
|
+
// just no-op (shouldn't happen in normal flow).
|
|
71
|
+
if (s.model && s.model.trim().length > 0) {
|
|
72
|
+
wiz?.advanceToApikey?.();
|
|
73
|
+
}
|
|
74
|
+
else if (s.providerId) {
|
|
75
|
+
// Re-seed the default and advance.
|
|
76
|
+
wiz.setModel(getModelForProvider(s.providerId));
|
|
77
|
+
wiz?.advanceToApikey?.();
|
|
78
|
+
}
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (key.backspace || key.delete) {
|
|
82
|
+
const m = (s.model ?? '').slice(0, -1);
|
|
83
|
+
wiz.setModel(m);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (input && input.length === 1 && !key.ctrl) {
|
|
87
|
+
wiz.setModel((s.model ?? '') + input);
|
|
88
|
+
}
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (s.step === 'apikey') {
|
|
92
|
+
if (key.upArrow)
|
|
93
|
+
wiz.moveApiKey(true);
|
|
94
|
+
else if (key.downArrow)
|
|
95
|
+
wiz.moveApiKey(false);
|
|
96
|
+
else if (key.return) {
|
|
97
|
+
const choice = ['env', 'keystore', 'skip'][s.apiKeyCursor];
|
|
98
|
+
wiz.selectApiKey(choice);
|
|
99
|
+
}
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (s.step === 'confirm') {
|
|
103
|
+
if (key.return)
|
|
104
|
+
wiz.commit();
|
|
105
|
+
else if (input === 'b' || input === 'B')
|
|
106
|
+
wiz.back();
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
// ── Transition: wizard committed → swap to App in same Ink tree ──
|
|
111
|
+
if (wiz.state.committed) {
|
|
112
|
+
// Show a brief "✓ Setup complete" banner for ~1.2s, then mount App.
|
|
113
|
+
// This gives the user a moment to read what was saved.
|
|
114
|
+
return React.createElement(PostCommitBridge, null);
|
|
115
|
+
}
|
|
116
|
+
return (React.createElement(Box, { flexDirection: "column", paddingX: 2, paddingY: 1 },
|
|
117
|
+
React.createElement(Wizard, { state: wiz, providers: PROVIDERS })));
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* PostCommitBridge — short banner shown after commit() succeeds, then
|
|
121
|
+
* fades into <App>. Uses internal state to time the transition.
|
|
122
|
+
*/
|
|
123
|
+
function PostCommitBridge() {
|
|
124
|
+
const [showApp, setShowApp] = useState(false);
|
|
125
|
+
useEffect(() => {
|
|
126
|
+
const t = setTimeout(() => setShowApp(true), 1200);
|
|
127
|
+
return () => clearTimeout(t);
|
|
128
|
+
}, []);
|
|
129
|
+
if (showApp) {
|
|
130
|
+
return React.createElement(App, null);
|
|
131
|
+
}
|
|
132
|
+
return (React.createElement(Box, { flexDirection: "column", paddingX: 2, paddingY: 1 },
|
|
133
|
+
React.createElement(Box, { borderStyle: "round", borderColor: "green", paddingX: 2, paddingY: 1, flexDirection: "column" },
|
|
134
|
+
React.createElement(Text, { color: "green", bold: true }, "\u2713 Setup complete! Launching zelari-code\u2026"),
|
|
135
|
+
React.createElement(Text, { color: "gray" }, "Press Ctrl+C any time to exit."))));
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=runWizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runWizard.js","sourceRoot":"","sources":["../../../src/cli/wizard/runWizard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC/B,iDAAiD;AACjD,6DAA6D;AAC7D,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAOxD,MAAM,UAAU,SAAS,CAAC,MAAsB;IAC9C,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAC1B,iBAAiB,CAAC;QAChB,SAAS,EAAE,SAAS;QACpB,eAAe,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC;KACjD,CAAC,CACH,CAAC;IACF,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE9B,kEAAkE;IAClE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAQ,GAAgE,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;YACtG,MAAM,GAAG,GAAI,GAA+D,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAClH,OAAO,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;QACrB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEV,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,6DAA6D;QAC7D,iEAAiE;QACjE,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS;YAAE,OAAO;QAChC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;QAEpB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,8CAA8C;QAC9C,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACd,GAA6C,CAAC,cAAc,EAAE,CAAC;YAClE,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC1B,IAAI,GAAG,CAAC,OAAO;gBAAE,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;iBACnC,IAAI,GAAG,CAAC,SAAS;gBAAE,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;iBAC3C,IAAI,GAAG,CAAC,MAAM;gBAAE,GAAG,CAAC,cAAc,EAAE,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACvB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACf,sDAAsD;gBACtD,0DAA0D;gBAC1D,gDAAgD;gBAChD,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxC,GAA8C,EAAE,eAAe,EAAE,EAAE,CAAC;gBACvE,CAAC;qBAAM,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;oBACxB,mCAAmC;oBACnC,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;oBAC/C,GAA8C,EAAE,eAAe,EAAE,EAAE,CAAC;gBACvE,CAAC;gBACD,OAAO;YACT,CAAC;YACD,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBAChC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACvC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YACD,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC7C,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;YACxC,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxB,IAAI,GAAG,CAAC,OAAO;gBAAE,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;iBACjC,IAAI,GAAG,CAAC,SAAS;gBAAE,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;iBACzC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACpB,MAAM,MAAM,GAAI,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;gBACtE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC3B,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,GAAG,CAAC,MAAM;gBAAE,GAAG,CAAC,MAAM,EAAE,CAAC;iBACxB,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG;gBAAE,GAAG,CAAC,IAAI,EAAE,CAAC;YACpD,OAAO;QACT,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,oEAAoE;IACpE,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACxB,oEAAoE;QACpE,uDAAuD;QACvD,OAAO,oBAAC,gBAAgB,OAAG,CAAC;IAC9B,CAAC;IAED,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;QAClD,oBAAC,MAAM,IAAC,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,GAAI,CACxC,CACP,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB;IACvB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QACnD,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,oBAAC,GAAG,OAAG,CAAC;IACjB,CAAC;IAED,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;QAClD,oBAAC,GAAG,IAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ;YAC3F,oBAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,+DAEjB;YACP,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,qCAAsC,CACpD,CACF,CACP,CAAC;AACJ,CAAC"}
|