gaunt-sloth 2.0.0-alpha.2 → 2.0.0-alpha.21
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 +55 -5
- package/cli.js +43 -10
- package/dist/cli.js +33 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/adkEvalRunner.d.ts +66 -0
- package/dist/commands/adkEvalRunner.js +69 -0
- package/dist/commands/adkEvalRunner.js.map +1 -0
- package/dist/commands/agUiEvalRunner.d.ts +73 -0
- package/dist/commands/agUiEvalRunner.js +216 -0
- package/dist/commands/agUiEvalRunner.js.map +1 -0
- package/dist/commands/askCommand.d.ts +3 -2
- package/dist/commands/askCommand.js +26 -7
- package/dist/commands/askCommand.js.map +1 -1
- package/dist/commands/batchCommand.d.ts +78 -0
- package/dist/commands/batchCommand.js +245 -0
- package/dist/commands/batchCommand.js.map +1 -0
- package/dist/commands/cliOptionParsers.d.ts +12 -0
- package/dist/commands/cliOptionParsers.js +18 -0
- package/dist/commands/cliOptionParsers.js.map +1 -0
- package/dist/commands/commandIntrospection.d.ts +6 -6
- package/dist/commands/commandIntrospection.js +12 -12
- package/dist/commands/commandIntrospection.js.map +1 -1
- package/dist/commands/commandUtils.d.ts +16 -16
- package/dist/commands/commandUtils.js +20 -20
- package/dist/commands/commandUtils.js.map +1 -1
- package/dist/commands/configCommand.d.ts +24 -0
- package/dist/commands/configCommand.js +117 -0
- package/dist/commands/configCommand.js.map +1 -0
- package/dist/commands/configSetup.d.ts +1 -1
- package/dist/commands/configSetup.js +17 -2
- package/dist/commands/configSetup.js.map +1 -1
- package/dist/commands/evalCommand.d.ts +41 -0
- package/dist/commands/evalCommand.js +483 -0
- package/dist/commands/evalCommand.js.map +1 -0
- package/dist/commands/execCommand.js +4 -1
- package/dist/commands/execCommand.js.map +1 -1
- package/dist/commands/firstRunDialog.d.ts +39 -5
- package/dist/commands/firstRunDialog.js +72 -10
- package/dist/commands/firstRunDialog.js.map +1 -1
- package/dist/commands/getCommand.js +7 -7
- package/dist/commands/getCommand.js.map +1 -1
- package/dist/commands/historyCommand.d.ts +17 -0
- package/dist/commands/historyCommand.js +102 -0
- package/dist/commands/historyCommand.js.map +1 -0
- package/dist/commands/initCommand.d.ts +3 -0
- package/dist/commands/initCommand.js +9 -4
- package/dist/commands/initCommand.js.map +1 -1
- package/dist/commands/insightsCommand.d.ts +8 -0
- package/dist/commands/insightsCommand.js +32 -0
- package/dist/commands/insightsCommand.js.map +1 -0
- package/dist/commands/modelsCommand.d.ts +25 -0
- package/dist/commands/modelsCommand.js +96 -0
- package/dist/commands/modelsCommand.js.map +1 -0
- package/dist/commands/prCommand.js +14 -15
- package/dist/commands/prCommand.js.map +1 -1
- package/dist/commands/prDiscovery.d.ts +2 -2
- package/dist/commands/prDiscovery.js +27 -29
- package/dist/commands/prDiscovery.js.map +1 -1
- package/dist/commands/reviewCommand.js +15 -10
- package/dist/commands/reviewCommand.js.map +1 -1
- package/dist/commands/workflowCommand.d.ts +19 -0
- package/dist/commands/workflowCommand.js +77 -0
- package/dist/commands/workflowCommand.js.map +1 -0
- package/dist/helpers/jira/jiraLogWork.js.map +1 -1
- package/dist/modules/startSession.js +9 -7
- package/dist/modules/startSession.js.map +1 -1
- package/dist/tools/gthJiraLogWorkTool.js +3 -3
- package/dist/tools/gthJiraLogWorkTool.js.map +1 -1
- package/dist/tui/components/App.js +321 -21
- package/dist/tui/components/App.js.map +1 -1
- package/dist/tui/components/ApprovalPrompt.d.ts +18 -0
- package/dist/tui/components/ApprovalPrompt.js +26 -0
- package/dist/tui/components/ApprovalPrompt.js.map +1 -0
- package/dist/tui/components/DebugPanel.d.ts +29 -9
- package/dist/tui/components/DebugPanel.js +46 -23
- package/dist/tui/components/DebugPanel.js.map +1 -1
- package/dist/tui/components/FetchProgress.d.ts +36 -0
- package/dist/tui/components/FetchProgress.js +39 -0
- package/dist/tui/components/FetchProgress.js.map +1 -0
- package/dist/tui/components/LiveTurn.d.ts +26 -4
- package/dist/tui/components/LiveTurn.js +104 -18
- package/dist/tui/components/LiveTurn.js.map +1 -1
- package/dist/tui/components/NoticeBar.d.ts +32 -0
- package/dist/tui/components/NoticeBar.js +39 -0
- package/dist/tui/components/NoticeBar.js.map +1 -0
- package/dist/tui/components/PromptInput.d.ts +26 -1
- package/dist/tui/components/PromptInput.js +93 -7
- package/dist/tui/components/PromptInput.js.map +1 -1
- package/dist/tui/components/Rule.js.map +1 -1
- package/dist/tui/components/SelectList.d.ts +98 -9
- package/dist/tui/components/SelectList.js +209 -26
- package/dist/tui/components/SelectList.js.map +1 -1
- package/dist/tui/components/SlashCommandMenu.d.ts +20 -0
- package/dist/tui/components/SlashCommandMenu.js +28 -0
- package/dist/tui/components/SlashCommandMenu.js.map +1 -0
- package/dist/tui/components/StatusBar.d.ts +7 -1
- package/dist/tui/components/StatusBar.js +7 -3
- package/dist/tui/components/StatusBar.js.map +1 -1
- package/dist/tui/components/Transcript.js +6 -1
- package/dist/tui/components/Transcript.js.map +1 -1
- package/dist/tui/debugRender.d.ts +41 -6
- package/dist/tui/debugRender.js +126 -12
- package/dist/tui/debugRender.js.map +1 -1
- package/dist/tui/debugSearch.d.ts +40 -0
- package/dist/tui/debugSearch.js +73 -0
- package/dist/tui/debugSearch.js.map +1 -0
- package/dist/tui/markdown.js +0 -0
- package/dist/tui/markdown.js.map +1 -1
- package/dist/tui/pasteParser.d.ts +21 -0
- package/dist/tui/pasteParser.js +24 -0
- package/dist/tui/pasteParser.js.map +1 -0
- package/dist/tui/selectCancelled.d.ts +13 -0
- package/dist/tui/selectCancelled.js +17 -0
- package/dist/tui/selectCancelled.js.map +1 -0
- package/dist/tui/slashCommands.d.ts +220 -1
- package/dist/tui/slashCommands.js +408 -1
- package/dist/tui/slashCommands.js.map +1 -1
- package/dist/tui/tuiSessionModule.js +249 -24
- package/dist/tui/tuiSessionModule.js.map +1 -1
- package/dist/tui/types.d.ts +96 -7
- package/dist/tui/viewModel.d.ts +34 -0
- package/dist/tui/viewModel.js +67 -0
- package/dist/tui/viewModel.js.map +1 -1
- package/dist/utils/stdinPolicy.d.ts +31 -0
- package/dist/utils/stdinPolicy.js +37 -0
- package/dist/utils/stdinPolicy.js.map +1 -0
- package/package.json +21 -17
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { USER_PROJECT_CONFIG_JSON } from '@gaunt-sloth/core/constants.js';
|
|
2
|
-
import { detectProviders,
|
|
2
|
+
import { buildInitConfigContent, detectProviders, discoverModelsWithProvenance, INTERACTIVE_MODEL_FETCH_TIMEOUT_MS, } from '@gaunt-sloth/core/providers/modelDiscovery.js';
|
|
3
3
|
import { getGlobalGslothConfigWritePath } from '@gaunt-sloth/core/utils/globalConfigUtils.js';
|
|
4
4
|
import { displayInfo, displaySuccess, displayWarning, } from '@gaunt-sloth/core/utils/consoleUtils.js';
|
|
5
5
|
import { createInterface, env, stdin, stdout, } from '@gaunt-sloth/core/utils/systemUtils.js';
|
|
6
|
-
import { getGslothConfigWritePath,
|
|
6
|
+
import { getGslothConfigWritePath, writeFileWithMessages, } from '@gaunt-sloth/review/utils/fileUtils.js';
|
|
7
7
|
import { ensureGslothDir, writeProjectReviewPreamble } from '#src/commands/configSetup.js';
|
|
8
|
+
import { existsSync } from 'node:fs';
|
|
8
9
|
import { shouldUseTui } from '#src/tui/shouldUseTui.js';
|
|
9
10
|
import { isInkAvailable } from '#src/tui/loadInk.js';
|
|
11
|
+
import { SelectCancelledError } from '#src/tui/selectCancelled.js';
|
|
10
12
|
/**
|
|
11
13
|
* Orders providers so usable ones (API key present / Ollama running) come first,
|
|
12
14
|
* preserving the registry order within each group (Array.prototype.sort is stable).
|
|
@@ -29,9 +31,16 @@ export function defaultModelIndex(models) {
|
|
|
29
31
|
const preferred = models.findIndex((m) => m.preferred);
|
|
30
32
|
return preferred >= 0 ? preferred : 0;
|
|
31
33
|
}
|
|
32
|
-
/**
|
|
34
|
+
/**
|
|
35
|
+
* Builds the `.gsloth.config.json` body for a chosen provider + model. Delegates to the shared
|
|
36
|
+
* {@link buildInitConfigContent} so the interactive first-run path stamps the same `$schema`
|
|
37
|
+
* pointer (GS2-1) as the per-provider template writers. Previously this local builder omitted
|
|
38
|
+
* `$schema`, so a config created through the first-run dialog got no editor autocomplete/validation.
|
|
39
|
+
* First-run always has an explicit model chosen, so it is written into the config (unlike a bare
|
|
40
|
+
* `init <provider>` template, which omits the model to track the curated fallback, CFG-14).
|
|
41
|
+
*/
|
|
33
42
|
export function buildConfigContent(providerId, model) {
|
|
34
|
-
return `${
|
|
43
|
+
return `${buildInitConfigContent(providerId, model)}\n`;
|
|
35
44
|
}
|
|
36
45
|
/** Resolves the config write path for the chosen scope (CFG-3 layering). */
|
|
37
46
|
export function resolveConfigWritePath(scope) {
|
|
@@ -77,7 +86,7 @@ async function promptMenu(ask, question, count, defaultIdx) {
|
|
|
77
86
|
}
|
|
78
87
|
function defaultWriteConfig(scope, content) {
|
|
79
88
|
const path = resolveConfigWritePath(scope);
|
|
80
|
-
|
|
89
|
+
writeFileWithMessages(path, content);
|
|
81
90
|
return path;
|
|
82
91
|
}
|
|
83
92
|
/**
|
|
@@ -120,6 +129,23 @@ function makeDefaultSelect(ask) {
|
|
|
120
129
|
return await promptMenu(ask, `\nChoice [${defaultIndex + 1}]: `, options.length, defaultIndex);
|
|
121
130
|
};
|
|
122
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* CFG-21 — the default {@link FirstRunDialogDeps.withProgress}: an Ink spinner while `run` is in
|
|
134
|
+
* flight when the environment can drive interactive Ink (the same activation policy as
|
|
135
|
+
* {@link makeDefaultSelect}), otherwise a plain printed line via {@link displayInfo} on the
|
|
136
|
+
* readline / non-TTY path. Either way the wait is visible, never silent. The Ink module is
|
|
137
|
+
* imported lazily so a readline-only run never loads React/Ink.
|
|
138
|
+
*/
|
|
139
|
+
export function makeDefaultProgress() {
|
|
140
|
+
return async (label, run) => {
|
|
141
|
+
if (await canUseInkSelect()) {
|
|
142
|
+
const { runWithInkProgress } = await import('#src/tui/components/FetchProgress.js');
|
|
143
|
+
return runWithInkProgress(label, run);
|
|
144
|
+
}
|
|
145
|
+
displayInfo(label);
|
|
146
|
+
return run();
|
|
147
|
+
};
|
|
148
|
+
}
|
|
123
149
|
/**
|
|
124
150
|
* CFG-2 — the first-run configuration dialog.
|
|
125
151
|
*
|
|
@@ -129,7 +155,7 @@ function makeDefaultSelect(ask) {
|
|
|
129
155
|
* globally (CFG-3). Writes a minimal `{ llm: { type, model } }` config and, for
|
|
130
156
|
* the project scope, scaffolds the review/guidelines preamble.
|
|
131
157
|
*/
|
|
132
|
-
export async function runFirstRunDialog(overrides = {}) {
|
|
158
|
+
export async function runFirstRunDialog(overrides = {}, force = false) {
|
|
133
159
|
// The readline interface is created LAZILY, only when a readline prompt is actually needed
|
|
134
160
|
// (the non-TTY number-menu fallback, or free-text model entry). On the Ink-select path it is
|
|
135
161
|
// never created, so readline never binds stdin/raw-mode alongside Ink — two owners on the same
|
|
@@ -142,9 +168,12 @@ export async function runFirstRunDialog(overrides = {}) {
|
|
|
142
168
|
});
|
|
143
169
|
const deps = {
|
|
144
170
|
detectProviders,
|
|
145
|
-
|
|
171
|
+
fetchModels: (providerId) => discoverModelsWithProvenance(providerId, { timeoutMs: INTERACTIVE_MODEL_FETCH_TIMEOUT_MS }),
|
|
172
|
+
withProgress: makeDefaultProgress(),
|
|
146
173
|
ensureGslothDir,
|
|
147
174
|
writeProjectReviewPreamble,
|
|
175
|
+
resolveConfigPath: resolveConfigWritePath,
|
|
176
|
+
configExists: existsSync,
|
|
148
177
|
writeConfig: defaultWriteConfig,
|
|
149
178
|
ask,
|
|
150
179
|
select: makeDefaultSelect(ask),
|
|
@@ -164,8 +193,11 @@ export async function runFirstRunDialog(overrides = {}) {
|
|
|
164
193
|
? 'complete its external authentication'
|
|
165
194
|
: 'set its API key environment variable'} before running gsloth. Writing the config so you can fill in the rest.`);
|
|
166
195
|
}
|
|
167
|
-
// 2. Model.
|
|
168
|
-
|
|
196
|
+
// 2. Model. The live fetch can take a moment for a large cloud catalog (OpenRouter ~300
|
|
197
|
+
// models), so show a visible indicator while it runs (CFG-21) instead of a silent pause,
|
|
198
|
+
// and fetch with the generous interactive timeout (baked into deps.fetchModels) so a big
|
|
199
|
+
// list is not lost to the short 2s probe race and silently replaced by a curated stub.
|
|
200
|
+
const { models, status } = await deps.withProgress(`Fetching models from ${provider.label}…`, () => deps.fetchModels(provider.id));
|
|
169
201
|
let model;
|
|
170
202
|
if (models.length === 0) {
|
|
171
203
|
displayWarning(`No models discovered for ${provider.label}.`);
|
|
@@ -176,6 +208,13 @@ export async function runFirstRunDialog(overrides = {}) {
|
|
|
176
208
|
}
|
|
177
209
|
}
|
|
178
210
|
else {
|
|
211
|
+
// CFG-21 — when a live fetch WAS attempted and fell back to the curated stub, say so, so a
|
|
212
|
+
// short curated list is never mistaken for the provider's full catalog. Fires ONLY on
|
|
213
|
+
// `status: 'fallback'` (attempted-and-failed) — never for a by-design `curated` list
|
|
214
|
+
// (`kind:'none'` provider or no API key present), and never on the empty-list path above.
|
|
215
|
+
if (status === 'fallback') {
|
|
216
|
+
displayWarning(`Couldn't reach ${provider.label}; showing a short curated list.`);
|
|
217
|
+
}
|
|
179
218
|
const fallback = defaultModelIndex(models);
|
|
180
219
|
const modelOptions = models.map((m) => `${m.preferred ? '⭐ ' : ' '}${m.id}`);
|
|
181
220
|
model =
|
|
@@ -186,7 +225,18 @@ export async function runFirstRunDialog(overrides = {}) {
|
|
|
186
225
|
const scope = (await deps.select('Where should this configuration be stored?', ['This project only (.gsloth/.gsloth-settings/)', 'Globally for all projects (~/.gsloth/)'], 0)) === 1
|
|
187
226
|
? 'global'
|
|
188
227
|
: 'project';
|
|
189
|
-
// 4.
|
|
228
|
+
// 4. Overwrite guard. If a config already exists at the chosen scope's path and the user did
|
|
229
|
+
// not pass --force, ask whether to overwrite (default No). On No we keep the existing file
|
|
230
|
+
// and print an honest line — never the misleading "Configured / Config written" on a skip.
|
|
231
|
+
const configPath = deps.resolveConfigPath(scope);
|
|
232
|
+
if (deps.configExists(configPath) && !force) {
|
|
233
|
+
const overwrite = (await deps.select(`A config already exists at ${configPath}. Overwrite it?`, ['No, keep the existing config', 'Yes, overwrite it'], 0)) === 1;
|
|
234
|
+
if (!overwrite) {
|
|
235
|
+
displayInfo(`Kept existing config at ${configPath} (not modified).`);
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// 5. Scaffold (project only) + write.
|
|
190
240
|
if (scope === 'project') {
|
|
191
241
|
deps.ensureGslothDir();
|
|
192
242
|
deps.writeProjectReviewPreamble();
|
|
@@ -201,6 +251,18 @@ export async function runFirstRunDialog(overrides = {}) {
|
|
|
201
251
|
displayInfo('Remember to set your API key environment variable before running gsloth.');
|
|
202
252
|
}
|
|
203
253
|
}
|
|
254
|
+
catch (e) {
|
|
255
|
+
// CFG-20 — a Ctrl+C (any step) or an Esc on the first step aborts the whole dialog: unwind
|
|
256
|
+
// out of whichever `select` was open and return WITHOUT writing a config and WITHOUT the false
|
|
257
|
+
// "Configured … / Config written to …" success line (mirroring CFG-19's honest-skip contract).
|
|
258
|
+
// The caller (startSession / initCommand) sees no config was written and does not launch a
|
|
259
|
+
// session. Any non-abort error still propagates.
|
|
260
|
+
if (e instanceof SelectCancelledError) {
|
|
261
|
+
displayWarning('Setup cancelled. No configuration was written.');
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
throw e;
|
|
265
|
+
}
|
|
204
266
|
finally {
|
|
205
267
|
rlHolder.current?.close();
|
|
206
268
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firstRunDialog.js","sourceRoot":"","sources":["../../src/commands/firstRunDialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EACL,eAAe,EACf,
|
|
1
|
+
{"version":3,"file":"firstRunDialog.js","sourceRoot":"","sources":["../../src/commands/firstRunDialog.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { initConfig } from '@gaunt-sloth/core/config.js';
|
|
2
|
-
import {
|
|
2
|
+
import { getCommandSourceInput, getCommandSystemPrompt, } from '#src/commands/commandIntrospection.js';
|
|
3
3
|
import { display, displayError } from '@gaunt-sloth/core/utils/consoleUtils.js';
|
|
4
4
|
import { setExitCode } from '@gaunt-sloth/core/utils/systemUtils.js';
|
|
5
5
|
const PROMPT_COMMANDS = ['ask', 'review', 'pr', 'pr-discovery', 'chat', 'code', 'exec'];
|
|
6
|
-
const
|
|
6
|
+
const SOURCE_COMMANDS = ['review', 'pr'];
|
|
7
7
|
const INPUT_TYPES = ['content', 'requirements'];
|
|
8
8
|
export function getCommand(program, commandLineConfigOverrides) {
|
|
9
9
|
program
|
|
10
10
|
.command('get')
|
|
11
|
-
.description('Print the effective prompt or
|
|
11
|
+
.description('Print the effective prompt or source-backed command input')
|
|
12
12
|
.argument('<command>', 'Command to introspect')
|
|
13
13
|
.argument('<subject>', 'Either prompt, content, or requirements')
|
|
14
|
-
.argument('[id]', '
|
|
14
|
+
.argument('[id]', 'Source-backed content identifier')
|
|
15
15
|
.action(async (command, subject, id) => {
|
|
16
16
|
try {
|
|
17
17
|
const config = await initConfig(commandLineConfigOverrides);
|
|
@@ -28,13 +28,13 @@ export function getCommand(program, commandLineConfigOverrides) {
|
|
|
28
28
|
if (!INPUT_TYPES.includes(subject)) {
|
|
29
29
|
throw new Error(`Unsupported subject: ${subject}.`);
|
|
30
30
|
}
|
|
31
|
-
if (!
|
|
32
|
-
throw new Error(`Unsupported
|
|
31
|
+
if (!SOURCE_COMMANDS.includes(command)) {
|
|
32
|
+
throw new Error(`Unsupported source-backed command: ${command}.`);
|
|
33
33
|
}
|
|
34
34
|
if (!id) {
|
|
35
35
|
throw new Error(`Subject "${subject}" requires an ID.`);
|
|
36
36
|
}
|
|
37
|
-
display(await
|
|
37
|
+
display(await getCommandSourceInput(command, subject, id, config));
|
|
38
38
|
}
|
|
39
39
|
catch (error) {
|
|
40
40
|
displayError(error instanceof Error ? error.message : String(error));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getCommand.js","sourceRoot":"","sources":["../../src/commands/getCommand.ts"],"names":[],"mappings":"AACA,OAAO,EAA8B,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"getCommand.js","sourceRoot":"","sources":["../../src/commands/getCommand.ts"],"names":[],"mappings":"AACA,OAAO,EAA8B,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAIvB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAErE,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AACjG,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAU,CAAC;AAClD,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,cAAc,CAAU,CAAC;AAEzD,MAAM,UAAU,UAAU,CACxB,OAAgB,EAChB,0BAAsD;IAEtD,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,2DAA2D,CAAC;SACxE,QAAQ,CAAC,WAAW,EAAE,uBAAuB,CAAC;SAC9C,QAAQ,CAAC,WAAW,EAAE,yCAAyC,CAAC;SAChE,QAAQ,CAAC,MAAM,EAAE,kCAAkC,CAAC;SACpD,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,OAAe,EAAE,EAAsB,EAAE,EAAE;QACzE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,0BAA0B,CAAC,CAAC;YAE5D,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACzB,IAAI,EAAE,EAAE,CAAC;oBACP,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBAC3D,CAAC;gBACD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAA4B,CAAC,EAAE,CAAC;oBAC5D,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAO,GAAG,CAAC,CAAC;gBAC7D,CAAC;gBAED,OAAO,CAAC,sBAAsB,CAAC,OAA4B,EAAE,MAAM,CAAC,CAAC,CAAC;gBACtE,OAAO;YACT,CAAC;YAED,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAA0B,CAAC,EAAE,CAAC;gBACtD,MAAM,IAAI,KAAK,CAAC,wBAAwB,OAAO,GAAG,CAAC,CAAC;YACtD,CAAC;YACD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAA4B,CAAC,EAAE,CAAC;gBAC5D,MAAM,IAAI,KAAK,CAAC,sCAAsC,OAAO,GAAG,CAAC,CAAC;YACpE,CAAC;YACD,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,MAAM,IAAI,KAAK,CAAC,YAAY,OAAO,mBAAmB,CAAC,CAAC;YAC1D,CAAC;YAED,OAAO,CACL,MAAM,qBAAqB,CACzB,OAA4B,EAC5B,OAA0B,EAC1B,EAAE,EACF,MAAM,CACP,CACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACrE,WAAW,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* GS2-7 (B20) / GS2-19 — the `gth history` command group over the local, opt-in session store.
|
|
4
|
+
*
|
|
5
|
+
* - `gth history search <query...>` — FTS5 full-text search across past turns; each hit shows the
|
|
6
|
+
* parent conversation it belongs to (GS2-19).
|
|
7
|
+
* - `gth history list` — the most recent conversations (grouped, with turn count + timespan), the
|
|
8
|
+
* top-level unit since GS2-19 (was a flat per-turn list).
|
|
9
|
+
* - `gth history show <id>` — print a whole conversation thread, all turns in order (GS2-19).
|
|
10
|
+
*
|
|
11
|
+
* All are READ-ONLY and fail-soft: they open the store with `create: false`, so a missing DB
|
|
12
|
+
* (history never enabled) simply reports "no history yet" instead of materialising an empty file.
|
|
13
|
+
* (Opening still migrates a pre-GS2-19 DB in place — see {@link HistoryStore} migrate.) The DB
|
|
14
|
+
* defaults to the global `~/.gsloth/history.db`; `--db <path>` overrides it. Local only — nothing
|
|
15
|
+
* here touches the network.
|
|
16
|
+
*/
|
|
17
|
+
export declare function historyCommand(program: Command): void;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { openHistoryStore, resolveHistoryDbPath } from '@gaunt-sloth/core/history/historyStore.js';
|
|
2
|
+
import { formatConversationList, formatConversationThread, formatSearchResults, } from '@gaunt-sloth/core/history/historyFormat.js';
|
|
3
|
+
import { display, displayInfo, displayWarning } from '@gaunt-sloth/core/utils/consoleUtils.js';
|
|
4
|
+
/**
|
|
5
|
+
* GS2-7 (B20) / GS2-19 — the `gth history` command group over the local, opt-in session store.
|
|
6
|
+
*
|
|
7
|
+
* - `gth history search <query...>` — FTS5 full-text search across past turns; each hit shows the
|
|
8
|
+
* parent conversation it belongs to (GS2-19).
|
|
9
|
+
* - `gth history list` — the most recent conversations (grouped, with turn count + timespan), the
|
|
10
|
+
* top-level unit since GS2-19 (was a flat per-turn list).
|
|
11
|
+
* - `gth history show <id>` — print a whole conversation thread, all turns in order (GS2-19).
|
|
12
|
+
*
|
|
13
|
+
* All are READ-ONLY and fail-soft: they open the store with `create: false`, so a missing DB
|
|
14
|
+
* (history never enabled) simply reports "no history yet" instead of materialising an empty file.
|
|
15
|
+
* (Opening still migrates a pre-GS2-19 DB in place — see {@link HistoryStore} migrate.) The DB
|
|
16
|
+
* defaults to the global `~/.gsloth/history.db`; `--db <path>` overrides it. Local only — nothing
|
|
17
|
+
* here touches the network.
|
|
18
|
+
*/
|
|
19
|
+
export function historyCommand(program) {
|
|
20
|
+
const history = program
|
|
21
|
+
.command('history')
|
|
22
|
+
.description('Search and list locally-recorded session history (opt-in; local only)');
|
|
23
|
+
history
|
|
24
|
+
.command('search')
|
|
25
|
+
.description('Full-text search past sessions (SQLite FTS5)')
|
|
26
|
+
.argument('<query...>', 'search terms')
|
|
27
|
+
.option('--db <path>', 'path to the history DB (defaults to ~/.gsloth/history.db)')
|
|
28
|
+
.option('--limit <n>', 'maximum results', '20')
|
|
29
|
+
.action((queryParts, options) => {
|
|
30
|
+
const store = openHistoryStore(resolveHistoryDbPath(options.db), { create: false });
|
|
31
|
+
if (!store) {
|
|
32
|
+
displayWarning('No session history found. Enable it with `history.enabled: true` in your config.');
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
const limit = clampLimit(options.limit);
|
|
37
|
+
const results = store.search(queryParts.join(' '), limit);
|
|
38
|
+
displayInfo(`History search: "${queryParts.join(' ')}"`);
|
|
39
|
+
for (const line of formatSearchResults(results))
|
|
40
|
+
display(line);
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
store.close();
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
history
|
|
47
|
+
.command('list')
|
|
48
|
+
.description('List the most recent recorded conversations')
|
|
49
|
+
.option('--db <path>', 'path to the history DB (defaults to ~/.gsloth/history.db)')
|
|
50
|
+
.option('--limit <n>', 'maximum results', '20')
|
|
51
|
+
.action((options) => {
|
|
52
|
+
const store = openHistoryStore(resolveHistoryDbPath(options.db), { create: false });
|
|
53
|
+
if (!store) {
|
|
54
|
+
displayWarning('No session history found. Enable it with `history.enabled: true` in your config.');
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const limit = clampLimit(options.limit);
|
|
59
|
+
const conversations = store.listConversations(limit);
|
|
60
|
+
displayInfo('Recent conversations:');
|
|
61
|
+
for (const line of formatConversationList(conversations))
|
|
62
|
+
display(line);
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
store.close();
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
history
|
|
69
|
+
.command('show')
|
|
70
|
+
.description('Print a whole conversation thread (all turns in order)')
|
|
71
|
+
.argument('<id>', 'conversation id (from `history list` / `history search`)')
|
|
72
|
+
.option('--db <path>', 'path to the history DB (defaults to ~/.gsloth/history.db)')
|
|
73
|
+
.action((idArg, options) => {
|
|
74
|
+
const store = openHistoryStore(resolveHistoryDbPath(options.db), { create: false });
|
|
75
|
+
if (!store) {
|
|
76
|
+
displayWarning('No session history found. Enable it with `history.enabled: true` in your config.');
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const id = Number.parseInt(idArg, 10);
|
|
81
|
+
if (!Number.isFinite(id) || id <= 0) {
|
|
82
|
+
displayWarning(`Invalid conversation id "${idArg}".`);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const turns = store.getConversationThread(id);
|
|
86
|
+
displayInfo(`Conversation #${id}:`);
|
|
87
|
+
for (const line of formatConversationThread(turns))
|
|
88
|
+
display(line);
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
store.close();
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
/** Parse and bound a `--limit` option (1..500); falls back to 20 on a bad value. */
|
|
96
|
+
function clampLimit(raw) {
|
|
97
|
+
const n = Number.parseInt(raw ?? '', 10);
|
|
98
|
+
if (!Number.isFinite(n) || n <= 0)
|
|
99
|
+
return 20;
|
|
100
|
+
return Math.min(n, 500);
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=historyCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"historyCommand.js","sourceRoot":"","sources":["../../src/commands/historyCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,9 @@ import { Command } from 'commander';
|
|
|
7
7
|
* detects usable providers, lets the user pick a provider + model and choose
|
|
8
8
|
* whether to store the config for this project or globally.
|
|
9
9
|
*
|
|
10
|
+
* `--force` overwrites an existing config: on the scriptable path it skips the
|
|
11
|
+
* warn-and-keep guard, and in the interactive dialog it skips the overwrite prompt.
|
|
12
|
+
*
|
|
10
13
|
* @param program - The commander program
|
|
11
14
|
*/
|
|
12
15
|
export declare function initCommand(program: Command): void;
|
|
@@ -10,19 +10,24 @@ import { Argument } from 'commander';
|
|
|
10
10
|
* detects usable providers, lets the user pick a provider + model and choose
|
|
11
11
|
* whether to store the config for this project or globally.
|
|
12
12
|
*
|
|
13
|
+
* `--force` overwrites an existing config: on the scriptable path it skips the
|
|
14
|
+
* warn-and-keep guard, and in the interactive dialog it skips the overwrite prompt.
|
|
15
|
+
*
|
|
13
16
|
* @param program - The commander program
|
|
14
17
|
*/
|
|
15
18
|
export function initCommand(program) {
|
|
16
19
|
program
|
|
17
20
|
.command('init')
|
|
18
|
-
.description('Initialize
|
|
21
|
+
.description('Initialize Gaunt Sloth in your project. This will write necessary config files.')
|
|
19
22
|
.addArgument(new Argument('[type]', 'Config type (optional, runs the interactive dialog if omitted)').choices(availableDefaultConfigs))
|
|
20
|
-
.
|
|
23
|
+
.option('-f, --force', 'Overwrite an existing config file')
|
|
24
|
+
.action(async (config, options) => {
|
|
25
|
+
const force = !!options.force;
|
|
21
26
|
if (config) {
|
|
22
|
-
await createProjectConfig(config);
|
|
27
|
+
await createProjectConfig(config, force);
|
|
23
28
|
}
|
|
24
29
|
else {
|
|
25
|
-
await runFirstRunDialog();
|
|
30
|
+
await runFirstRunDialog({}, force);
|
|
26
31
|
}
|
|
27
32
|
});
|
|
28
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initCommand.js","sourceRoot":"","sources":["../../src/commands/initCommand.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAW,MAAM,WAAW,CAAC;AAE9C
|
|
1
|
+
{"version":3,"file":"initCommand.js","sourceRoot":"","sources":["../../src/commands/initCommand.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAW,MAAM,WAAW,CAAC;AAE9C;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iFAAiF,CAAC;SAC9F,WAAW,CACV,IAAI,QAAQ,CACV,QAAQ,EACR,gEAAgE,CACjE,CAAC,OAAO,CAAC,uBAAuB,CAAC,CACnC;SACA,MAAM,CAAC,aAAa,EAAE,mCAAmC,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,MAA8B,EAAE,OAA4B,EAAE,EAAE;QAC7E,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QAC9B,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,MAAM,iBAAiB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* GS2-7 (B20) — `gth insights`: lightweight, LOCAL analytics over the opt-in session store
|
|
4
|
+
* (token/cost totals, a top-tool tally, and a per-command breakdown). Read-only and fail-soft:
|
|
5
|
+
* opens with `create: false`, so a missing DB just prints "no history yet" rather than creating
|
|
6
|
+
* one. Nothing leaves the machine. `--db <path>` overrides the default `~/.gsloth/history.db`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function insightsCommand(program: Command): void;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { openHistoryStore, resolveHistoryDbPath } from '@gaunt-sloth/core/history/historyStore.js';
|
|
2
|
+
import { formatInsightsSummary } from '@gaunt-sloth/core/history/historyFormat.js';
|
|
3
|
+
import { display, displayInfo, displayWarning } from '@gaunt-sloth/core/utils/consoleUtils.js';
|
|
4
|
+
/**
|
|
5
|
+
* GS2-7 (B20) — `gth insights`: lightweight, LOCAL analytics over the opt-in session store
|
|
6
|
+
* (token/cost totals, a top-tool tally, and a per-command breakdown). Read-only and fail-soft:
|
|
7
|
+
* opens with `create: false`, so a missing DB just prints "no history yet" rather than creating
|
|
8
|
+
* one. Nothing leaves the machine. `--db <path>` overrides the default `~/.gsloth/history.db`.
|
|
9
|
+
*/
|
|
10
|
+
export function insightsCommand(program) {
|
|
11
|
+
program
|
|
12
|
+
.command('insights')
|
|
13
|
+
.description('Show local analytics over recorded session history (opt-in; local only)')
|
|
14
|
+
.option('--db <path>', 'path to the history DB (defaults to ~/.gsloth/history.db)')
|
|
15
|
+
.action((options) => {
|
|
16
|
+
const store = openHistoryStore(resolveHistoryDbPath(options.db), { create: false });
|
|
17
|
+
if (!store) {
|
|
18
|
+
displayWarning('No session history found. Enable it with `history.enabled: true` in your config.');
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
const insights = store.insights();
|
|
23
|
+
displayInfo('Session insights (local only):');
|
|
24
|
+
for (const line of formatInsightsSummary(insights))
|
|
25
|
+
display(line);
|
|
26
|
+
}
|
|
27
|
+
finally {
|
|
28
|
+
store.close();
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=insightsCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insightsCommand.js","sourceRoot":"","sources":["../../src/commands/insightsCommand.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACnG,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAE/F;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,yEAAyE,CAAC;SACtF,MAAM,CAAC,aAAa,EAAE,2DAA2D,CAAC;SAClF,MAAM,CAAC,CAAC,OAAwB,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,gBAAgB,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACpF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,cAAc,CACZ,kFAAkF,CACnF,CAAC;YACF,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAClC,WAAW,CAAC,gCAAgC,CAAC,CAAC;YAC9C,KAAK,MAAM,IAAI,IAAI,qBAAqB,CAAC,QAAQ,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACpE,CAAC;gBAAS,CAAC;YACT,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { type ProviderId } from '@gaunt-sloth/core/providers/modelDiscovery.js';
|
|
3
|
+
import { type ModelCatalogEntry } from '@gaunt-sloth/core/providers/modelCatalog.js';
|
|
4
|
+
/**
|
|
5
|
+
* GS2-6 (B16) — `gth models`: list the models available on this machine, enriched with
|
|
6
|
+
* cost / context-limit / capability metadata from models.dev.
|
|
7
|
+
*
|
|
8
|
+
* `/v1/models` discovery stays authoritative for *what is callable* (`modelDiscovery.ts`);
|
|
9
|
+
* models.dev only decorates cloud model ids. A cloud model models.dev has never heard of is still
|
|
10
|
+
* listed (unenriched), and if models.dev is unreachable the whole list still prints — just without
|
|
11
|
+
* metadata. Local/self-hosted providers (ollama) get no catalog lookup at all.
|
|
12
|
+
*
|
|
13
|
+
* - `gth models` — list detected providers and their (enriched) models.
|
|
14
|
+
* - `gth models --refresh` — force a models.dev re-fetch past the cache TTL before listing.
|
|
15
|
+
* - `gth models --provider <id>` — scope the listing to a single provider.
|
|
16
|
+
*/
|
|
17
|
+
export declare function modelsCommand(program: Command): void;
|
|
18
|
+
/**
|
|
19
|
+
* Render a model's catalog metadata as a compact bracketed suffix, e.g.
|
|
20
|
+
* `[ctx 200k · out 64k · in $5/1M · out $25/1M · tools · reasoning] *`. Returns '' when there is no
|
|
21
|
+
* enrichment (the model is still listed — it is simply callable-but-unenriched). Costs are US$ per
|
|
22
|
+
* 1M tokens (models.dev's unit); the trailing `*` ties back to the attribution footer.
|
|
23
|
+
*/
|
|
24
|
+
export declare function formatEnrichment(entry: ModelCatalogEntry | undefined): string;
|
|
25
|
+
export type { ProviderId };
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { detectProviders, } from '@gaunt-sloth/core/providers/modelDiscovery.js';
|
|
2
|
+
import { enrichModels, CATALOG_ATTRIBUTION, } from '@gaunt-sloth/core/providers/modelCatalog.js';
|
|
3
|
+
import { display, displayInfo, displayWarning } from '@gaunt-sloth/core/utils/consoleUtils.js';
|
|
4
|
+
/**
|
|
5
|
+
* GS2-6 (B16) — `gth models`: list the models available on this machine, enriched with
|
|
6
|
+
* cost / context-limit / capability metadata from models.dev.
|
|
7
|
+
*
|
|
8
|
+
* `/v1/models` discovery stays authoritative for *what is callable* (`modelDiscovery.ts`);
|
|
9
|
+
* models.dev only decorates cloud model ids. A cloud model models.dev has never heard of is still
|
|
10
|
+
* listed (unenriched), and if models.dev is unreachable the whole list still prints — just without
|
|
11
|
+
* metadata. Local/self-hosted providers (ollama) get no catalog lookup at all.
|
|
12
|
+
*
|
|
13
|
+
* - `gth models` — list detected providers and their (enriched) models.
|
|
14
|
+
* - `gth models --refresh` — force a models.dev re-fetch past the cache TTL before listing.
|
|
15
|
+
* - `gth models --provider <id>` — scope the listing to a single provider.
|
|
16
|
+
*/
|
|
17
|
+
export function modelsCommand(program) {
|
|
18
|
+
program
|
|
19
|
+
.command('models')
|
|
20
|
+
.description('List available models, enriched with cost/context metadata from models.dev')
|
|
21
|
+
.option('--refresh', 'Force a models.dev catalog re-fetch past the cache TTL')
|
|
22
|
+
.option('--provider <id>', 'Only list models for a single provider (e.g. anthropic, openai)')
|
|
23
|
+
.action(async (options) => {
|
|
24
|
+
const providers = await detectProviders();
|
|
25
|
+
const filtered = options.provider
|
|
26
|
+
? providers.filter((p) => p.id === options.provider)
|
|
27
|
+
: providers;
|
|
28
|
+
if (options.provider && filtered.length === 0) {
|
|
29
|
+
displayWarning(`Unknown provider "${options.provider}". Known: ${providers.map((p) => p.id).join(', ')}.`);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
let anyEnriched = false;
|
|
33
|
+
for (const provider of filtered) {
|
|
34
|
+
const enriched = await enrichModels(provider.id, provider.models, {
|
|
35
|
+
refresh: options.refresh,
|
|
36
|
+
});
|
|
37
|
+
printProvider(provider, enriched);
|
|
38
|
+
if (enriched.some((m) => m.enrichment))
|
|
39
|
+
anyEnriched = true;
|
|
40
|
+
}
|
|
41
|
+
// Only claim attribution when we actually surfaced models.dev metadata.
|
|
42
|
+
if (anyEnriched) {
|
|
43
|
+
display('');
|
|
44
|
+
display(CATALOG_ATTRIBUTION);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/** Print one provider's header and its (enriched) model list. */
|
|
49
|
+
function printProvider(provider, models) {
|
|
50
|
+
const status = provider.available ? '' : ' (no key detected)';
|
|
51
|
+
displayInfo(`\n${provider.label} [${provider.id}]${status}`);
|
|
52
|
+
if (models.length === 0) {
|
|
53
|
+
display(' (no models discovered)');
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
for (const model of models) {
|
|
57
|
+
const star = model.preferred ? '⭐ ' : ' ';
|
|
58
|
+
const meta = formatEnrichment(model.enrichment);
|
|
59
|
+
display(` ${star}${model.id}${meta ? ` ${meta}` : ''}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Render a model's catalog metadata as a compact bracketed suffix, e.g.
|
|
64
|
+
* `[ctx 200k · out 64k · in $5/1M · out $25/1M · tools · reasoning] *`. Returns '' when there is no
|
|
65
|
+
* enrichment (the model is still listed — it is simply callable-but-unenriched). Costs are US$ per
|
|
66
|
+
* 1M tokens (models.dev's unit); the trailing `*` ties back to the attribution footer.
|
|
67
|
+
*/
|
|
68
|
+
export function formatEnrichment(entry) {
|
|
69
|
+
if (!entry)
|
|
70
|
+
return '';
|
|
71
|
+
const parts = [];
|
|
72
|
+
if (entry.limit?.context !== undefined)
|
|
73
|
+
parts.push(`ctx ${formatTokens(entry.limit.context)}`);
|
|
74
|
+
if (entry.limit?.output !== undefined)
|
|
75
|
+
parts.push(`out ${formatTokens(entry.limit.output)}`);
|
|
76
|
+
if (entry.cost?.input !== undefined)
|
|
77
|
+
parts.push(`in $${entry.cost.input}/1M`);
|
|
78
|
+
if (entry.cost?.output !== undefined)
|
|
79
|
+
parts.push(`out $${entry.cost.output}/1M`);
|
|
80
|
+
if (entry.toolCall)
|
|
81
|
+
parts.push('tools');
|
|
82
|
+
if (entry.reasoning)
|
|
83
|
+
parts.push('reasoning');
|
|
84
|
+
if (parts.length === 0)
|
|
85
|
+
return '';
|
|
86
|
+
return `[${parts.join(' · ')}] *`;
|
|
87
|
+
}
|
|
88
|
+
/** Human-friendly token count: 200000 → "200k", 1500000 → "1.5M". */
|
|
89
|
+
function formatTokens(n) {
|
|
90
|
+
if (n >= 1_000_000)
|
|
91
|
+
return `${Number((n / 1_000_000).toFixed(1))}M`;
|
|
92
|
+
if (n >= 1_000)
|
|
93
|
+
return `${Math.round(n / 1_000)}k`;
|
|
94
|
+
return String(n);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=modelsCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelsCommand.js","sourceRoot":"","sources":["../../src/commands/modelsCommand.ts"],"names":[],"mappings":"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"}
|