zelari-code 0.4.3 → 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 +42 -0
- package/dist/cli/app.js +17 -12
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/compaction.js.map +1 -1
- package/dist/cli/components/ChatStream.js +57 -10
- package/dist/cli/components/ChatStream.js.map +1 -1
- package/dist/cli/components/CollapsibleToolOutput.js +5 -0
- package/dist/cli/components/CollapsibleToolOutput.js.map +1 -1
- package/dist/cli/councilDispatcher.js +1 -1
- 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/eventsToMessages.js +42 -11
- package/dist/cli/hooks/eventsToMessages.js.map +1 -1
- package/dist/cli/hooks/messageHelpers.js +65 -15
- package/dist/cli/hooks/messageHelpers.js.map +1 -1
- package/dist/cli/hooks/useBatchedMessages.js +67 -0
- package/dist/cli/hooks/useBatchedMessages.js.map +1 -0
- package/dist/cli/hooks/useChatTurn.js +97 -41
- package/dist/cli/hooks/useChatTurn.js.map +1 -1
- package/dist/cli/hooks/useSession.js +10 -1
- package/dist/cli/hooks/useSession.js.map +1 -1
- package/dist/cli/hooks/useSlashDispatch.js +4 -1
- package/dist/cli/hooks/useSlashDispatch.js.map +1 -1
- package/dist/cli/main.bundled.js +15328 -14305
- 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 +1 -1
- package/dist/cli/sessionManager.js.map +1 -1
- package/dist/cli/skillSuggest.js +1 -1
- 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/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 +6 -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/toolRegistry.js +2 -2
- package/dist/cli/workspace/toolRegistry.js.map +1 -1
- package/package.json +6 -1
|
@@ -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,12 @@
|
|
|
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
22
|
import { resolveSandboxedPath, SandboxViolationError } from './safety/sandboxPath.js';
|
|
23
23
|
import { assertShellAllowed, ShellBlockedError } from './safety/shellBlocklist.js';
|
|
24
24
|
import { AuditLogger } from './safety/auditLogger.js';
|
|
@@ -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":"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"}
|
|
@@ -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.6.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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { setActiveProviderId, setModelForProvider, } from '../providerConfig.js';
|
|
2
|
+
import { setApiKey as setKeyStoreApiKey } from '../keyStore.js';
|
|
3
|
+
const ORDER = ['welcome', 'provider', 'model', 'apikey', 'confirm'];
|
|
4
|
+
function next(s) {
|
|
5
|
+
const idx = ORDER.indexOf(s);
|
|
6
|
+
if (idx === -1 || idx === ORDER.length - 1)
|
|
7
|
+
return null;
|
|
8
|
+
return ORDER[idx + 1];
|
|
9
|
+
}
|
|
10
|
+
function prev(s) {
|
|
11
|
+
const idx = ORDER.indexOf(s);
|
|
12
|
+
if (idx <= 0)
|
|
13
|
+
return null;
|
|
14
|
+
return ORDER[idx - 1];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Pure-function factory for the wizard state machine. Returned API is
|
|
18
|
+
* stateless from the caller's perspective — pass the same instance to
|
|
19
|
+
* React via `useMemo`.
|
|
20
|
+
*
|
|
21
|
+
* @public
|
|
22
|
+
*/
|
|
23
|
+
export function createWizardState(opts) {
|
|
24
|
+
const persistActive = opts.persistActiveProvider ?? ((id) => setActiveProviderId(id));
|
|
25
|
+
const persistModel = opts.persistModel ?? ((id, m) => setModelForProvider(id, m));
|
|
26
|
+
const persistKey = opts.persistApiKey ?? ((id, k) => setKeyStoreApiKey(id, k));
|
|
27
|
+
let s = {
|
|
28
|
+
step: 'welcome',
|
|
29
|
+
providerCursor: 0,
|
|
30
|
+
apiKeyCursor: 0,
|
|
31
|
+
committed: false,
|
|
32
|
+
};
|
|
33
|
+
const listeners = new Set();
|
|
34
|
+
function notify() {
|
|
35
|
+
for (const l of listeners)
|
|
36
|
+
l();
|
|
37
|
+
}
|
|
38
|
+
const api = {
|
|
39
|
+
get state() {
|
|
40
|
+
return s;
|
|
41
|
+
},
|
|
42
|
+
moveProvider(up) {
|
|
43
|
+
const n = opts.providers.length;
|
|
44
|
+
const c = s.providerCursor;
|
|
45
|
+
s = {
|
|
46
|
+
...s,
|
|
47
|
+
providerCursor: up ? (c - 1 + n) % n : (c + 1) % n,
|
|
48
|
+
};
|
|
49
|
+
notify();
|
|
50
|
+
},
|
|
51
|
+
selectProvider() {
|
|
52
|
+
const provider = opts.providers[s.providerCursor];
|
|
53
|
+
if (!provider)
|
|
54
|
+
return; // shouldn't happen
|
|
55
|
+
s = {
|
|
56
|
+
...s,
|
|
57
|
+
step: 'model',
|
|
58
|
+
providerId: provider.id,
|
|
59
|
+
model: opts.defaultModelFor(provider.id),
|
|
60
|
+
};
|
|
61
|
+
notify();
|
|
62
|
+
},
|
|
63
|
+
setModel(name) {
|
|
64
|
+
const trimmed = name.trim();
|
|
65
|
+
if (!trimmed || !s.providerId)
|
|
66
|
+
return;
|
|
67
|
+
s = { ...s, model: trimmed };
|
|
68
|
+
notify();
|
|
69
|
+
},
|
|
70
|
+
moveApiKey(up) {
|
|
71
|
+
const c = s.apiKeyCursor;
|
|
72
|
+
// 3 options: 0=env, 1=keystore, 2=skip
|
|
73
|
+
s = { ...s, apiKeyCursor: up ? (c - 1 + 3) % 3 : (c + 1) % 3 };
|
|
74
|
+
notify();
|
|
75
|
+
},
|
|
76
|
+
selectApiKey(choice, value) {
|
|
77
|
+
// 'keystore' stores the (trimmed) value; 'env' and 'skip' clear it.
|
|
78
|
+
// Distinguish `value === undefined` (no value provided) from
|
|
79
|
+
// `value === ''` or whitespace-only (empty after trim) — both
|
|
80
|
+
// are guarded at commit time, but the type signature is clearer
|
|
81
|
+
// if we keep `undefined` for "not provided".
|
|
82
|
+
let apiKeyValue;
|
|
83
|
+
if (choice === 'keystore') {
|
|
84
|
+
apiKeyValue = value === undefined ? undefined : value.trim();
|
|
85
|
+
}
|
|
86
|
+
s = {
|
|
87
|
+
...s,
|
|
88
|
+
apiKeyChoice: choice,
|
|
89
|
+
apiKeyValue,
|
|
90
|
+
step: 'confirm',
|
|
91
|
+
};
|
|
92
|
+
notify();
|
|
93
|
+
},
|
|
94
|
+
back() {
|
|
95
|
+
const p = prev(s.step);
|
|
96
|
+
if (!p)
|
|
97
|
+
return;
|
|
98
|
+
s = { ...s, step: p };
|
|
99
|
+
notify();
|
|
100
|
+
},
|
|
101
|
+
commit() {
|
|
102
|
+
if (s.committed || !s.providerId || !s.model)
|
|
103
|
+
return;
|
|
104
|
+
persistActive(s.providerId);
|
|
105
|
+
persistModel(s.providerId, s.model);
|
|
106
|
+
// Persist API key only if user chose 'keystore' AND provided a
|
|
107
|
+
// non-empty value. 'env' means "use env var, don't save" and
|
|
108
|
+
// 'skip' means "no key yet, user will set it later via /login".
|
|
109
|
+
if (s.apiKeyChoice === 'keystore' && s.apiKeyValue && s.apiKeyValue.length > 0) {
|
|
110
|
+
try {
|
|
111
|
+
persistKey(s.providerId, s.apiKeyValue);
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
// Key persistence failure shouldn't block config commit —
|
|
115
|
+
// the user can re-add the key later via /login. Log to
|
|
116
|
+
// stderr for debuggability, then proceed.
|
|
117
|
+
// eslint-disable-next-line no-console
|
|
118
|
+
console.error(`[zelari-code wizard] failed to persist API key for ${s.providerId}: ` +
|
|
119
|
+
(err instanceof Error ? err.message : String(err)));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
s = { ...s, committed: true };
|
|
123
|
+
notify();
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
// Internal: allow React UI to re-render. We expose `subscribe` so the
|
|
127
|
+
// Ink component can useSyncExternalStore (or call manually in tests).
|
|
128
|
+
api.subscribe = (l) => {
|
|
129
|
+
listeners.add(l);
|
|
130
|
+
return () => listeners.delete(l);
|
|
131
|
+
};
|
|
132
|
+
// Advance to first non-welcome step programmatically — used by tests
|
|
133
|
+
// and by the "skip intro" flag (future).
|
|
134
|
+
api.jumpToProvider = () => {
|
|
135
|
+
s = { ...s, step: 'provider' };
|
|
136
|
+
notify();
|
|
137
|
+
};
|
|
138
|
+
// Advance from model to apikey step (used by runWizard when user
|
|
139
|
+
// confirms the model on step 3).
|
|
140
|
+
api.advanceToApikey = () => {
|
|
141
|
+
if (s.step === 'model') {
|
|
142
|
+
s = { ...s, step: 'apikey' };
|
|
143
|
+
notify();
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
return api;
|
|
147
|
+
}
|
|
148
|
+
/** Convenience constants for tests + UI. */
|
|
149
|
+
export const API_KEY_OPTIONS = ['env', 'keystore', 'skip'];
|
|
150
|
+
export const WIZARD_STEPS = ORDER;
|
|
151
|
+
//# sourceMappingURL=useWizardState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useWizardState.js","sourceRoot":"","sources":["../../../src/cli/wizard/useWizardState.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
* from the per-call ToolContext.
|
|
18
18
|
*/
|
|
19
19
|
import { z } from 'zod';
|
|
20
|
-
import { ToolRegistry } from '
|
|
21
|
-
import { typedOk, typedErr } from '
|
|
20
|
+
import { ToolRegistry } from '@zelari/core/harness/tools/registry';
|
|
21
|
+
import { typedOk, typedErr } from '@zelari/core/harness/tools/toolTypes';
|
|
22
22
|
import { createWorkspaceStubs } from './stubs.js';
|
|
23
23
|
/** Build a ToolRegistry containing the workspace stubs bound to ctx. */
|
|
24
24
|
export function createWorkspaceToolRegistry(ctx) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolRegistry.js","sourceRoot":"","sources":["../../../src/cli/workspace/toolRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"toolRegistry.js","sourceRoot":"","sources":["../../../src/cli/workspace/toolRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAoB,MAAM,sCAAsC,CAAC;AAG3F,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD,wEAAwE;AACxE,MAAM,UAAU,2BAA2B,CAAC,GAAqB;IAC/D,MAAM,KAAK,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,yBAAyB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAChD,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,mEAAmE;AACnE,SAAS,yBAAyB,CAChC,IAA4B,EAC5B,YAA8B;IAE9B,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,EAAE;QACf,qEAAqE;QACrE,kEAAkE;QAClE,WAAW,EAAE,CAAC,CAAC,GAAG,EAAE;QACpB,OAAO,EAAE,KAAK,EAAE,KAAc,EAAE,UAAoB,EAAgC,EAAE;YACpF,IAAI,CAAC;gBACH,MAAM,IAAI,GAAI,KAAiC,IAAI,EAAE,CAAC;gBACtD,wEAAwE;gBACxE,mFAAmF;gBACnF,sEAAsE;gBACtE,sEAAsE;gBACtE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE;oBAC3D,OAAO,EAAE,UAAU;iBACpB,CAAC,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAClC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,SAA0D,CAAC,CAC/E,CAAC;gBACF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,QAAQ,CACb,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACrE,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zelari-code",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.2",
|
|
4
4
|
"description": "Zelari Code — AI Council coding agent CLI. Multi-agent orchestration (Caronte, Nettuno, Gerione, Plutone, Minosse, Lucifero) with slash commands, provider-agnostic LLM streaming, and self-update.",
|
|
5
5
|
"author": "N-THEM Studio",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
7
7
|
"type": "module",
|
|
8
|
+
"workspaces": [
|
|
9
|
+
"packages/*"
|
|
10
|
+
],
|
|
8
11
|
"main": "dist/cli/main.js",
|
|
9
12
|
"bin": {
|
|
10
13
|
"zelari-code": "./bin/zelari-code.js"
|
|
@@ -24,12 +27,14 @@
|
|
|
24
27
|
"build": "tsc -p tsconfig.json && node scripts/bundle-cli.mjs",
|
|
25
28
|
"build:cli": "tsc -p tsconfig.json && node scripts/bundle-cli.mjs",
|
|
26
29
|
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
30
|
+
"pretest": "npm run build --workspace=@zelari/core",
|
|
27
31
|
"test": "vitest run",
|
|
28
32
|
"test:watch": "vitest",
|
|
29
33
|
"smoke": "node bin/zelari-code.js --version",
|
|
30
34
|
"prepublishOnly": "node scripts/prepublish.mjs"
|
|
31
35
|
},
|
|
32
36
|
"dependencies": {
|
|
37
|
+
"@zelari/core": "0.6.2",
|
|
33
38
|
"ink": "^6.8.0",
|
|
34
39
|
"ink-text-input": "^6.0.0",
|
|
35
40
|
"react": "^19.2.7",
|