@zhihaohong52/sonata 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +437 -0
  3. package/dist/adapters/claude.js +83 -0
  4. package/dist/adapters/claude.js.map +1 -0
  5. package/dist/adapters/codex.js +382 -0
  6. package/dist/adapters/codex.js.map +1 -0
  7. package/dist/adapters/index.js +21 -0
  8. package/dist/adapters/index.js.map +1 -0
  9. package/dist/adapters/opencode.js +104 -0
  10. package/dist/adapters/opencode.js.map +1 -0
  11. package/dist/adapters/pi.js +152 -0
  12. package/dist/adapters/pi.js.map +1 -0
  13. package/dist/adapters/reasonix.js +358 -0
  14. package/dist/adapters/reasonix.js.map +1 -0
  15. package/dist/adapters/types.js +2 -0
  16. package/dist/adapters/types.js.map +1 -0
  17. package/dist/agent-markers.js +3 -0
  18. package/dist/agent-markers.js.map +1 -0
  19. package/dist/aipricing.js +109 -0
  20. package/dist/aipricing.js.map +1 -0
  21. package/dist/catalog.js +274 -0
  22. package/dist/catalog.js.map +1 -0
  23. package/dist/cli.js +766 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/commands/approve.js +23 -0
  26. package/dist/commands/approve.js.map +1 -0
  27. package/dist/commands/auth.js +41 -0
  28. package/dist/commands/auth.js.map +1 -0
  29. package/dist/commands/catalog.js +172 -0
  30. package/dist/commands/catalog.js.map +1 -0
  31. package/dist/commands/code.js +113 -0
  32. package/dist/commands/code.js.map +1 -0
  33. package/dist/commands/dispatch.js +148 -0
  34. package/dist/commands/dispatch.js.map +1 -0
  35. package/dist/commands/doctor.js +545 -0
  36. package/dist/commands/doctor.js.map +1 -0
  37. package/dist/commands/gc.js +25 -0
  38. package/dist/commands/gc.js.map +1 -0
  39. package/dist/commands/init-log.js +83 -0
  40. package/dist/commands/init-log.js.map +1 -0
  41. package/dist/commands/init.js +157 -0
  42. package/dist/commands/init.js.map +1 -0
  43. package/dist/commands/log.js +24 -0
  44. package/dist/commands/log.js.map +1 -0
  45. package/dist/commands/route.js +660 -0
  46. package/dist/commands/route.js.map +1 -0
  47. package/dist/commands/run.js +199 -0
  48. package/dist/commands/run.js.map +1 -0
  49. package/dist/commands/runs.js +37 -0
  50. package/dist/commands/runs.js.map +1 -0
  51. package/dist/commands/serve.js +818 -0
  52. package/dist/commands/serve.js.map +1 -0
  53. package/dist/commands/status.js +14 -0
  54. package/dist/commands/status.js.map +1 -0
  55. package/dist/commands/sync.js +258 -0
  56. package/dist/commands/sync.js.map +1 -0
  57. package/dist/commands/tail.js +229 -0
  58. package/dist/commands/tail.js.map +1 -0
  59. package/dist/commands/usage.js +85 -0
  60. package/dist/commands/usage.js.map +1 -0
  61. package/dist/commands/verify.js +69 -0
  62. package/dist/commands/verify.js.map +1 -0
  63. package/dist/commands/wait.js +38 -0
  64. package/dist/commands/wait.js.map +1 -0
  65. package/dist/config.js +588 -0
  66. package/dist/config.js.map +1 -0
  67. package/dist/detect.js +445 -0
  68. package/dist/detect.js.map +1 -0
  69. package/dist/filelock.js +83 -0
  70. package/dist/filelock.js.map +1 -0
  71. package/dist/init/apply.js +96 -0
  72. package/dist/init/apply.js.map +1 -0
  73. package/dist/init/candidates.js +115 -0
  74. package/dist/init/candidates.js.map +1 -0
  75. package/dist/init/discover.js +216 -0
  76. package/dist/init/discover.js.map +1 -0
  77. package/dist/init/helpers.js +429 -0
  78. package/dist/init/helpers.js.map +1 -0
  79. package/dist/init/interactive-state.js +128 -0
  80. package/dist/init/interactive-state.js.map +1 -0
  81. package/dist/init/plan.js +225 -0
  82. package/dist/init/plan.js.map +1 -0
  83. package/dist/init/scripted-state.js +130 -0
  84. package/dist/init/scripted-state.js.map +1 -0
  85. package/dist/init/toml.js +83 -0
  86. package/dist/init/toml.js.map +1 -0
  87. package/dist/init/validate.js +149 -0
  88. package/dist/init/validate.js.map +1 -0
  89. package/dist/ledger.js +123 -0
  90. package/dist/ledger.js.map +1 -0
  91. package/dist/mcp/protocol.js +64 -0
  92. package/dist/mcp/protocol.js.map +1 -0
  93. package/dist/mcp/server.js +96 -0
  94. package/dist/mcp/server.js.map +1 -0
  95. package/dist/mcp/tools.js +210 -0
  96. package/dist/mcp/tools.js.map +1 -0
  97. package/dist/mode.js +64 -0
  98. package/dist/mode.js.map +1 -0
  99. package/dist/native/claude-shim.js +228 -0
  100. package/dist/native/claude-shim.js.map +1 -0
  101. package/dist/native/codex-auth.js +177 -0
  102. package/dist/native/codex-auth.js.map +1 -0
  103. package/dist/native/copilot-auth.js +105 -0
  104. package/dist/native/copilot-auth.js.map +1 -0
  105. package/dist/native/credentials.js +83 -0
  106. package/dist/native/credentials.js.map +1 -0
  107. package/dist/native/hosts.js +60 -0
  108. package/dist/native/hosts.js.map +1 -0
  109. package/dist/native/litellm.js +103 -0
  110. package/dist/native/litellm.js.map +1 -0
  111. package/dist/native/models.js +96 -0
  112. package/dist/native/models.js.map +1 -0
  113. package/dist/native/oauth-login.js +112 -0
  114. package/dist/native/oauth-login.js.map +1 -0
  115. package/dist/native/router.js +469 -0
  116. package/dist/native/router.js.map +1 -0
  117. package/dist/native/tls.js +73 -0
  118. package/dist/native/tls.js.map +1 -0
  119. package/dist/native/usage.js +119 -0
  120. package/dist/native/usage.js.map +1 -0
  121. package/dist/normalize.js +98 -0
  122. package/dist/normalize.js.map +1 -0
  123. package/dist/pricing.js +86 -0
  124. package/dist/pricing.js.map +1 -0
  125. package/dist/roles.js +49 -0
  126. package/dist/roles.js.map +1 -0
  127. package/dist/sessions.js +62 -0
  128. package/dist/sessions.js.map +1 -0
  129. package/dist/settings.js +131 -0
  130. package/dist/settings.js.map +1 -0
  131. package/dist/store.js +70 -0
  132. package/dist/store.js.map +1 -0
  133. package/dist/tmux.js +89 -0
  134. package/dist/tmux.js.map +1 -0
  135. package/dist/tui-ink/app-state.js +340 -0
  136. package/dist/tui-ink/app-state.js.map +1 -0
  137. package/dist/tui-ink/app.js +156 -0
  138. package/dist/tui-ink/app.js.map +1 -0
  139. package/dist/tui-ink/components/byok-step.js +102 -0
  140. package/dist/tui-ink/components/byok-step.js.map +1 -0
  141. package/dist/tui-ink/components/login-screen.js +80 -0
  142. package/dist/tui-ink/components/login-screen.js.map +1 -0
  143. package/dist/tui-ink/components/models-step.js +92 -0
  144. package/dist/tui-ink/components/models-step.js.map +1 -0
  145. package/dist/tui-ink/components/multi-select-state.js +56 -0
  146. package/dist/tui-ink/components/multi-select-state.js.map +1 -0
  147. package/dist/tui-ink/components/multi-select.js +69 -0
  148. package/dist/tui-ink/components/multi-select.js.map +1 -0
  149. package/dist/tui-ink/components/providers-step.js +285 -0
  150. package/dist/tui-ink/components/providers-step.js.map +1 -0
  151. package/dist/tui-ink/components/ranked-select-state.js +41 -0
  152. package/dist/tui-ink/components/ranked-select-state.js.map +1 -0
  153. package/dist/tui-ink/components/ranked-select.js +61 -0
  154. package/dist/tui-ink/components/ranked-select.js.map +1 -0
  155. package/dist/tui-ink/components/search-select.js +47 -0
  156. package/dist/tui-ink/components/search-select.js.map +1 -0
  157. package/dist/tui-ink/components/text-input-state.js +42 -0
  158. package/dist/tui-ink/components/text-input-state.js.map +1 -0
  159. package/dist/tui-ink/components/text-input.js +48 -0
  160. package/dist/tui-ink/components/text-input.js.map +1 -0
  161. package/dist/tui-ink/run.js +38 -0
  162. package/dist/tui-ink/run.js.map +1 -0
  163. package/dist/tui-ink/test-compile.js +4 -0
  164. package/dist/tui-ink/test-compile.js.map +1 -0
  165. package/dist/tui-ink/types.js +2 -0
  166. package/dist/tui-ink/types.js.map +1 -0
  167. package/dist/tui.js +330 -0
  168. package/dist/tui.js.map +1 -0
  169. package/dist/types.js +2 -0
  170. package/dist/types.js.map +1 -0
  171. package/dist/watchdog.js +85 -0
  172. package/dist/watchdog.js.map +1 -0
  173. package/hooks/capture-mode.mjs +56 -0
  174. package/hooks/ensure-serve.mjs +140 -0
  175. package/hooks/hooks.json +12 -0
  176. package/hooks/route-session.mjs +47 -0
  177. package/hooks/route-subagent.mjs +54 -0
  178. package/package.json +64 -0
  179. package/roles/code.md +13 -0
  180. package/roles/explore.md +9 -0
  181. package/roles/plan.md +10 -0
  182. package/roles/review.md +11 -0
  183. package/skills/loop/SKILL.md +43 -0
package/dist/store.js ADDED
@@ -0,0 +1,70 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, appendFileSync, readdirSync, unlinkSync, } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ export function sonataDir(cwd) {
5
+ return join(cwd, '.sonata');
6
+ }
7
+ export function runDir(cwd, id) {
8
+ return join(sonataDir(cwd), 'runs', id);
9
+ }
10
+ export function newRunId() {
11
+ return randomBytes(3).toString('hex');
12
+ }
13
+ export function createRun(cwd, init) {
14
+ const id = newRunId();
15
+ const meta = { ...init, id, session: `sonata-${id}`, cwd };
16
+ mkdirSync(runDir(cwd, id), { recursive: true });
17
+ writeMeta(cwd, meta);
18
+ return meta;
19
+ }
20
+ export function writeMeta(cwd, meta) {
21
+ writeFileSync(join(runDir(cwd, meta.id), 'meta.json'), JSON.stringify(meta, null, 2));
22
+ }
23
+ export function readMeta(cwd, id) {
24
+ return JSON.parse(readFileSync(join(runDir(cwd, id), 'meta.json'), 'utf8'));
25
+ }
26
+ function readIfExists(path) {
27
+ return existsSync(path) ? readFileSync(path, 'utf8') : null;
28
+ }
29
+ export function readExit(cwd, id) {
30
+ const raw = readIfExists(join(runDir(cwd, id), 'exit'));
31
+ if (raw === null)
32
+ return null;
33
+ const n = Number.parseInt(raw.trim(), 10);
34
+ return Number.isNaN(n) ? null : n;
35
+ }
36
+ export function readReport(cwd, id) {
37
+ return readIfExists(join(runDir(cwd, id), 'report.md'));
38
+ }
39
+ export function readAnsweredPrompt(cwd, id) {
40
+ return readIfExists(join(runDir(cwd, id), 'answered-prompt'));
41
+ }
42
+ export function writeAnsweredPrompt(cwd, id, prompt) {
43
+ writeFileSync(join(runDir(cwd, id), 'answered-prompt'), prompt);
44
+ }
45
+ export function clearAnsweredPrompt(cwd, id) {
46
+ const path = join(runDir(cwd, id), 'answered-prompt');
47
+ if (existsSync(path))
48
+ unlinkSync(path);
49
+ }
50
+ export function readCursor(cwd, id) {
51
+ const raw = readIfExists(join(runDir(cwd, id), 'cursor'));
52
+ return raw === null ? 0 : Number.parseInt(raw.trim(), 10) || 0;
53
+ }
54
+ export function writeCursor(cwd, id, n) {
55
+ writeFileSync(join(runDir(cwd, id), 'cursor'), String(n));
56
+ }
57
+ export function appendEvents(cwd, id, lines) {
58
+ if (lines.length === 0)
59
+ return;
60
+ appendFileSync(join(runDir(cwd, id), 'events.jsonl'), lines.map((l) => `${l}\n`).join(''));
61
+ }
62
+ export function readEvents(cwd, id) {
63
+ const raw = readIfExists(join(runDir(cwd, id), 'events.jsonl'));
64
+ return raw === null ? [] : raw.split('\n').filter(Boolean);
65
+ }
66
+ export function listRuns(cwd) {
67
+ const dir = join(sonataDir(cwd), 'runs');
68
+ return existsSync(dir) ? readdirSync(dir).sort() : [];
69
+ }
70
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/dist/tmux.js ADDED
@@ -0,0 +1,89 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ const run = promisify(execFile);
4
+ async function tmux(args) {
5
+ const { stdout } = await run('tmux', args, { encoding: 'utf8' });
6
+ return stdout;
7
+ }
8
+ export async function tmuxVersion() {
9
+ const out = await tmux(['-V']);
10
+ return out.trim().replace(/^tmux\s+/, '');
11
+ }
12
+ /**
13
+ * Creates a detached session running a persistent shell. The harness command is
14
+ * sent separately via runScript so the pane outlives the command — without this
15
+ * the pane-tail fallback is unavailable exactly when a harness crashes.
16
+ */
17
+ export async function newSession(opts) {
18
+ await tmux([
19
+ 'new-session', '-d',
20
+ '-s', opts.session,
21
+ '-c', opts.cwd,
22
+ '-x', '200', '-y', '50',
23
+ ]);
24
+ await tmux(['set-option', '-t', opts.session, 'remain-on-exit', 'on']);
25
+ await tmux(['set-option', '-t', opts.session, 'history-limit', '10000']);
26
+ }
27
+ export async function hasSession(session) {
28
+ try {
29
+ await tmux(['has-session', '-t', session]);
30
+ return true;
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ export async function runScript(session, scriptPath) {
37
+ await tmux(['send-keys', '-t', session, `bash ${JSON.stringify(scriptPath)}`, 'Enter']);
38
+ }
39
+ export async function sendKeys(session, keys) {
40
+ await tmux(['send-keys', '-t', session, keys]);
41
+ }
42
+ export async function capturePane(session) {
43
+ return (await tryCapturePane(session)) ?? '';
44
+ }
45
+ /**
46
+ * Distinguishes a genuinely empty pane ('') from a failed capture (null). The
47
+ * tmux server rejects calls transiently under load, and treating that as an
48
+ * empty pane makes callers believe the pane was cleared.
49
+ */
50
+ export async function tryCapturePane(session) {
51
+ try {
52
+ return await tmux(['capture-pane', '-p', '-t', session]);
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
58
+ export async function listSessions() {
59
+ try {
60
+ const out = await tmux(['list-sessions', '-F', '#{session_name}']);
61
+ return out.split('\n').filter(Boolean);
62
+ }
63
+ catch {
64
+ return [];
65
+ }
66
+ }
67
+ /**
68
+ * Name of the tmux session this process is running inside, or null when not
69
+ * inside tmux. Used to stop sonata killing the pane it lives in.
70
+ */
71
+ export async function currentSession() {
72
+ if (!process.env.TMUX)
73
+ return null;
74
+ try {
75
+ return (await tmux(['display-message', '-p', '#{session_name}'])).trim() || null;
76
+ }
77
+ catch {
78
+ return null;
79
+ }
80
+ }
81
+ export async function killSession(session) {
82
+ try {
83
+ await tmux(['kill-session', '-t', session]);
84
+ }
85
+ catch {
86
+ /* already gone */
87
+ }
88
+ }
89
+ //# sourceMappingURL=tmux.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmux.js","sourceRoot":"","sources":["../src/tmux.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,340 @@
1
+ import { byokCandidateKey } from '../native/models.js';
2
+ /**
3
+ * Pseudo-harnesses: providers that come from somewhere other than a detected
4
+ * harness catalogue, and so must survive the harness filter in step 2.
5
+ *
6
+ * `config` is a gateway already named in sonata.toml; `byok` is a well-known
7
+ * provider the user can name directly. Neither belongs to a harness, so
8
+ * deselecting every harness must not hide them — which is the whole point for
9
+ * `byok`, whose case is having no harness at all.
10
+ */
11
+ export const PSEUDO_HARNESSES = ['config', 'byok'];
12
+ /** The `byok/<name>` picker key for a provider. */
13
+ export function byokProviderKey(name) {
14
+ return `byok/${name}`;
15
+ }
16
+ /** The provider name behind a `byok/<name>` picker key, or undefined. */
17
+ export function byokProviderName(key) {
18
+ return key.startsWith('byok/') ? key.slice('byok/'.length) : undefined;
19
+ }
20
+ export function reduceInit(prev, action) {
21
+ switch (action.type) {
22
+ case 'chooseCredentialSource':
23
+ return {
24
+ ...prev,
25
+ step: prev.step,
26
+ state: {
27
+ ...prev.state,
28
+ credentialSources: { ...prev.state.credentialSources, [action.gateway]: action.source },
29
+ },
30
+ };
31
+ case 'back':
32
+ return { ...prev, step: Math.max(0, prev.step - 1) };
33
+ }
34
+ }
35
+ export function applyStep(state, step, value) {
36
+ switch (step) {
37
+ case 0:
38
+ return { ...state, configScope: value };
39
+ case 1:
40
+ return { ...state, providerKeys: value };
41
+ case 2:
42
+ return { ...state, nativeKeys: value };
43
+ case 3:
44
+ return { ...state, roles: value };
45
+ case 4: {
46
+ if (typeof value === 'object' && value !== null && 'tier' in value) {
47
+ const { role, tier, ranked } = value;
48
+ return {
49
+ ...state,
50
+ tiers: {
51
+ ...state.tiers,
52
+ [role]: {
53
+ ...(state.tiers?.[role] ?? { simple: [], complex: [] }),
54
+ [tier]: ranked,
55
+ },
56
+ },
57
+ };
58
+ }
59
+ const { role, models } = value;
60
+ return {
61
+ ...state,
62
+ perRoleModels: { ...state.perRoleModels, [role]: models },
63
+ };
64
+ }
65
+ case 5: {
66
+ // A BYOK provider's chosen models. They join `nativeKeys` here rather than
67
+ // later, because step 5 offers roles a choice from `nativeKeys` — a model
68
+ // missing from it cannot be assigned to any role, so the wizard would
69
+ // appear to accept it and then write nothing.
70
+ const { provider, ids } = value;
71
+ const keys = ids.map((id) => byokCandidateKey(provider, id));
72
+ // Drop what this provider contributed last time before adding what it
73
+ // contributes now: the user can walk back into this step and deselect,
74
+ // and a key left behind would still be written to the config.
75
+ const stale = new Set((state.byokModels?.[provider] ?? []).map((id) => byokCandidateKey(provider, id)));
76
+ const kept = (state.nativeKeys ?? []).filter((key) => !stale.has(key));
77
+ return {
78
+ ...state,
79
+ byokModels: { ...state.byokModels, [provider]: ids },
80
+ nativeKeys: [...kept, ...keys.filter((key) => !kept.includes(key))],
81
+ };
82
+ }
83
+ default:
84
+ return state;
85
+ }
86
+ }
87
+ export function providersForHarnesses(providers, harnesses) {
88
+ const selected = new Set(harnesses);
89
+ return providers.filter((provider) => PSEUDO_HARNESSES.includes(provider.harness) || selected.has(provider.harness));
90
+ }
91
+ export function candidatesForProviders(candidates, providers, providerKeys) {
92
+ const selectedKeys = new Set(providerKeys);
93
+ const gateways = new Set(providers.filter((provider) => selectedKeys.has(provider.key)).map((provider) => provider.provider));
94
+ return candidates.filter((candidate) => gateways.has(candidate.gateway));
95
+ }
96
+ /**
97
+ * The hint beside a provider on the import screen.
98
+ *
99
+ * Two different "where from"s meet on this row and were easy to confuse, so
100
+ * they are labelled apart: **via** names the harness whose catalogue produced
101
+ * the provider, **from** names where its credential lives. Naming the harness
102
+ * matters because `importableProviders` dedupes by provider name — several
103
+ * harnesses can serve one provider, only the first is shown, and it is that
104
+ * one's credential the import will use.
105
+ */
106
+ export function importHint(harness, have) {
107
+ const oauth = have.codex !== null ? have.codex : have.opencode !== null ? have.opencode : null;
108
+ const credential = oauth !== null
109
+ ? (oauth.expiresInDays === null ? 'expiry unknown'
110
+ : oauth.expiresInDays < 0 ? 'expired — re-login in that tool' : `expires in ${oauth.expiresInDays}d`)
111
+ : `key from ${have.key.source}`;
112
+ return `via ${harness} · ${credential}`;
113
+ }
114
+ /**
115
+ * The ranking a tier screen opens with.
116
+ *
117
+ * An empty saved list means "not chosen yet", not "chosen to be empty":
118
+ * `applyStep` seeds a role's *other* tier as `[]` the moment either one is
119
+ * confirmed, so after ranking `simple` the saved `complex` is `[]` rather than
120
+ * absent. A plain `saved ?? proposal` therefore discards the proposal for the
121
+ * second tier of every role — and since RankedSelect refuses to submit an
122
+ * empty ranking, that screen renders with nothing ranked and cannot be
123
+ * confirmed at all. Only a config with both tiers already saved hid it, which
124
+ * is why it surfaces on a first run.
125
+ */
126
+ export function initialRankedFor(saved, proposal) {
127
+ return saved !== undefined && saved.length > 0 ? saved : proposal;
128
+ }
129
+ /**
130
+ * Fills in every role × tier ranking from `fromIndex` onward with the value
131
+ * that screen would have been seeded with, so the wizard can offer "accept all
132
+ * remaining" instead of walking the user through `roles × 2` pre-answered
133
+ * screens. Four roles on two models meant eight confirmations of the same two
134
+ * models, which is the most repetitive stretch of the wizard by a wide margin.
135
+ *
136
+ * It applies exactly `initialRankedFor(saved, proposal)` — what the screen
137
+ * itself would have shown — so accepting is indistinguishable from pressing
138
+ * enter through the rest, and a role already ranked in the config keeps that
139
+ * ranking rather than being reset to the proposal.
140
+ */
141
+ export function acceptRemainingTiers(state, roles, fromIndex, proposal, allNativeKeys = state.nativeKeys ?? []) {
142
+ let next = state;
143
+ for (let index = Math.max(0, fromIndex); index < roles.length * 2; index++) {
144
+ const role = roles[Math.floor(index / 2)];
145
+ if (role === undefined)
146
+ continue;
147
+ const tier = index % 2 === 0 ? 'simple' : 'complex';
148
+ next = applyStep(next, 4, {
149
+ role,
150
+ tier,
151
+ ranked: seededRankingFor(next.tiers?.[role]?.[tier], proposal[tier], next.nativeKeys ?? [], allNativeKeys),
152
+ });
153
+ }
154
+ return next;
155
+ }
156
+ /**
157
+ * The ranking a tier screen submits when it is opened and confirmed untouched.
158
+ *
159
+ * Seeding alone is not that answer. `tierPickerKeys` withholds a key that has a
160
+ * native route but whose provider is deselected this session, and `RankedSelect`
161
+ * drops any `initialRanked` value missing from its items — so confirming the
162
+ * screen writes the tier *without* that key. Bulk acceptance skips the
163
+ * component, so it has to reproduce the same two steps here, or `A` and enter
164
+ * write different configs from identical state.
165
+ */
166
+ export function seededRankingFor(saved, proposal, nativeKeys, allNativeKeys) {
167
+ const initial = initialRankedFor(saved, proposal);
168
+ const offered = new Set(tierPickerKeys(nativeKeys, initial, allNativeKeys));
169
+ return initial.filter((key) => offered.has(key));
170
+ }
171
+ /**
172
+ * A lookup key for one (gateway, id) pair.
173
+ *
174
+ * Both halves are free-form — an id routinely carries `/`, `-` and `.` — so
175
+ * they are JSON-encoded rather than joined by a separator, which would make
176
+ * `a` + `b/c` collide with `a/b` + `c`.
177
+ */
178
+ function gatewayIdKey(gateway, id) {
179
+ return JSON.stringify([gateway, id]);
180
+ }
181
+ /**
182
+ * Harness-derived candidates with a gateway's live `/models` answer swapped in.
183
+ *
184
+ * A harness catalogue is a snapshot: it keeps listing a model the gateway has
185
+ * since dropped, and misses one it has since added. Where the gateway itself
186
+ * answered, its list is authoritative — so a gateway present in
187
+ * `liveByGateway` has its candidates **replaced**, which is what actually
188
+ * retires a stale entry. A gateway absent from it (unreachable, no key, OAuth,
189
+ * timed out) keeps the harness list untouched, so a failed refresh degrades to
190
+ * today's behaviour rather than emptying the picker.
191
+ *
192
+ * An id the harness already listed keeps that candidate's existing key: the
193
+ * key is what `nativeKeys` and the written config are addressed by, so
194
+ * reconstructing it would silently deselect models the user had already
195
+ * chosen. Only a genuinely new id mints a key.
196
+ */
197
+ export function mergeLiveCandidates(candidates, liveByGateway) {
198
+ const refreshed = new Set(Object.keys(liveByGateway));
199
+ const existing = new Map(candidates.map((candidate) => [gatewayIdKey(candidate.gateway, candidate.id), candidate]));
200
+ const candidateFor = (gateway, id) => existing.get(gatewayIdKey(gateway, id))
201
+ ?? { key: byokCandidateKey(gateway, id), gateway, id, label: `${gateway}/${id}` };
202
+ const out = [];
203
+ const done = new Set();
204
+ // A refreshed gateway's live list is emitted where that gateway first
205
+ // appeared, so refreshing does not reshuffle the picker.
206
+ for (const candidate of candidates) {
207
+ if (!refreshed.has(candidate.gateway)) {
208
+ out.push(candidate);
209
+ continue;
210
+ }
211
+ if (done.has(candidate.gateway))
212
+ continue;
213
+ done.add(candidate.gateway);
214
+ for (const id of liveByGateway[candidate.gateway])
215
+ out.push(candidateFor(candidate.gateway, id));
216
+ }
217
+ // A gateway the harness listed nothing for still contributes what it serves.
218
+ for (const [gateway, ids] of Object.entries(liveByGateway)) {
219
+ if (done.has(gateway))
220
+ continue;
221
+ for (const id of ids)
222
+ out.push(candidateFor(gateway, id));
223
+ }
224
+ return out;
225
+ }
226
+ /**
227
+ * The keys a tier's RankedSelect screen offers, in stable order.
228
+ *
229
+ * A saved ranking can name a harness-only key that has no native route and
230
+ * is therefore absent from `nativeKeys` — RankedSelect's `initialIndices`
231
+ * silently drops any `initialRanked` value missing from `items`, so building
232
+ * items from `nativeKeys` alone would make merely confirming this screen
233
+ * rewrite the tier without that fallback. Appending the missing keys keeps
234
+ * them selectable and preserved across a no-op confirm.
235
+ *
236
+ * `allNativeKeys` is the full universe of natively-routable keys independent
237
+ * of what's currently selected: a key absent from `nativeKeys` is only
238
+ * preserved if it never had a native route at all, never when it has one but
239
+ * its provider was temporarily deselected this session.
240
+ */
241
+ export function tierPickerKeys(nativeKeys, initialRanked, allNativeKeys = nativeKeys) {
242
+ const nativeUniverse = new Set(allNativeKeys);
243
+ const fallbackKeys = initialRanked.filter((key) => !nativeKeys.includes(key) && !nativeUniverse.has(key));
244
+ return [...nativeKeys, ...fallbackKeys];
245
+ }
246
+ /**
247
+ * Providers with an actually detected credential — the bulk-import screen's
248
+ * contents. A harness's model catalogue listing a provider is not the same as
249
+ * a credential existing for it. Covers both a codex/opencode OAuth grant and a
250
+ * plain API key sitting in another harness's own store (e.g. opencode's
251
+ * `auth.json`): the latter is resolved live at request time by
252
+ * `resolveKeys`/`resolveKeyFromSource`, never copied into sonata's own store,
253
+ * so it is exactly as safe to list here as the OAuth case.
254
+ *
255
+ * Already-configured providers are NOT excluded: the screen doubles as a
256
+ * toggle — the caller pre-checks whichever of these are already configured
257
+ * and unchecking one is how a provider gets removed again.
258
+ */
259
+ export function importableProviders(providers, availability) {
260
+ const seen = new Set();
261
+ const out = [];
262
+ for (const provider of providers) {
263
+ if (seen.has(provider.provider))
264
+ continue;
265
+ const have = availability[provider.provider];
266
+ if (have === undefined || (have.codex === null && have.opencode === null && have.key === null))
267
+ continue;
268
+ seen.add(provider.provider);
269
+ out.push(provider);
270
+ }
271
+ return out;
272
+ }
273
+ /**
274
+ * The Add-provider search list: every known provider not already configured
275
+ * in this run, deduped by name (a provider can appear once per harness that
276
+ * knows it) and sorted for a stable, scannable list.
277
+ */
278
+ export function addProviderCatalog(providers, configuredGateways) {
279
+ const configured = new Set(configuredGateways);
280
+ const seen = new Set();
281
+ const out = [];
282
+ for (const provider of providers) {
283
+ if (configured.has(provider.provider) || seen.has(provider.provider))
284
+ continue;
285
+ seen.add(provider.provider);
286
+ out.push(provider);
287
+ }
288
+ return out.sort((a, b) => a.provider.localeCompare(b.provider));
289
+ }
290
+ /**
291
+ * The gateway names already configured in this run, resolved from
292
+ * `providerKeys` — a catalogued provider's key resolves through the provider
293
+ * list, a byok/custom provider's key resolves through `byokProviderName`.
294
+ */
295
+ export function configuredProviderNames(providerKeys, providers) {
296
+ const byKey = new Map(providers.map((p) => [p.key, p.provider]));
297
+ return providerKeys
298
+ .map((key) => byokProviderName(key) ?? byKey.get(key))
299
+ .filter((name) => name !== undefined);
300
+ }
301
+ /**
302
+ * Which of the "Import from other harnesses" candidates are already stored
303
+ * — by exact key, not by provider name. Two harnesses can list the same
304
+ * provider name (e.g. both opencode and Pi offering "google"); matching by
305
+ * name alone (as `configuredProviderNames` does, for other purposes where
306
+ * that's the right question) would mark every same-named row as
307
+ * already-imported regardless of which harness's key is actually stored —
308
+ * pre-ticking a harness the user never selected, every time the wizard
309
+ * runs, with no way to make it stick unticked.
310
+ */
311
+ export function alreadyImportedKeys(providerKeys, importable) {
312
+ const stored = new Set(providerKeys);
313
+ return new Set(importable.filter((provider) => stored.has(provider.key)).map((provider) => provider.key));
314
+ }
315
+ export function validateCustomProviderName(name, existingNames) {
316
+ const trimmed = name.trim();
317
+ if (trimmed === '')
318
+ return 'A name is required.';
319
+ if (existingNames.some((existing) => existing.toLowerCase() === trimmed.toLowerCase())) {
320
+ return `"${trimmed}" is already a provider — pick a different name.`;
321
+ }
322
+ return undefined;
323
+ }
324
+ export function validateProviderUrl(url) {
325
+ const trimmed = url.trim();
326
+ if (trimmed === '')
327
+ return 'A base URL is required.';
328
+ let parsed;
329
+ try {
330
+ parsed = new URL(trimmed);
331
+ }
332
+ catch {
333
+ return 'Enter a full URL, including https://.';
334
+ }
335
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
336
+ return 'The URL must start with http:// or https://.';
337
+ }
338
+ return undefined;
339
+ }
340
+ //# sourceMappingURL=app-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-state.js","sourceRoot":"","sources":["../../src/tui-ink/app-state.ts"],"names":[],"mappings":"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"}