@wrongstack/cli 1.0.33 → 1.0.36
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/dist/{acp-EDGUWU7N.js → acp-QLU7T5WX.js} +470 -466
- package/dist/{auth-SUHKFFO4.js → auth-AED7RW7D.js} +7 -7
- package/dist/auth-menu/openai-codex-oauth.d.ts +1 -1
- package/dist/auth-menu/panel-provider-edits.d.ts +15 -0
- package/dist/auth-menu/panel-service.d.ts +1 -1
- package/dist/{automation-MCDFCIMV.js → automation-3E3AUPBF.js} +19 -4
- package/dist/boot/governance-evidence-candidate.d.ts +1 -2
- package/dist/boot/system-prompt-builder.d.ts +1 -1
- package/dist/boot/tui-project-spawn.d.ts +0 -1
- package/dist/boot/tui-session-resume-contracts.d.ts +95 -0
- package/dist/boot/tui-session-resume.d.ts +2 -88
- package/dist/boot/tui-settings-read.d.ts +3 -0
- package/dist/{boot-auto-thin-K2DHHYIW.js → boot-auto-thin-AGJ6TAWY.js} +3 -3
- package/dist/boot-launch-choices.d.ts +22 -0
- package/dist/boot-provider-gate.d.ts +28 -0
- package/dist/boot-subcommand-dispatch.d.ts +24 -0
- package/dist/boot.d.ts +1 -1
- package/dist/chimera-cascade-evidence.d.ts +1 -1
- package/dist/{chunk-TI7KLHYX.js → chunk-2CMMWRQH.js} +81 -80
- package/dist/{chunk-4BX2YDTQ.js → chunk-4JMAWKLA.js} +45 -4
- package/dist/{chunk-TWSQTQKR.js → chunk-4R6TVMYA.js} +2 -2
- package/dist/{chunk-HHRYIDOW.js → chunk-ACW64W4M.js} +34 -7
- package/dist/{chunk-5EA6OTLJ.js → chunk-AFOH6CHO.js} +2 -2
- package/dist/{chunk-WHEYHDIE.js → chunk-AKESWZH5.js} +2 -1
- package/dist/{chunk-JHUJUIOH.js → chunk-AT2A7RJZ.js} +4 -16
- package/dist/{chunk-LKFKO4JW.js → chunk-B6EHK772.js} +2 -2
- package/dist/{chunk-U3SS4NRH.js → chunk-BHXAKTBE.js} +1 -1
- package/dist/{chunk-4UWCMBPG.js → chunk-BJH44J7G.js} +3 -3
- package/dist/{chunk-MPQCHBDJ.js → chunk-CJSHS2K7.js} +5 -1
- package/dist/{chunk-RQ4UBKYH.js → chunk-GF7LUWQS.js} +5 -11
- package/dist/{chunk-TXAFIERF.js → chunk-L5NWFP5R.js} +2 -2
- package/dist/{chunk-24C6VVLM.js → chunk-LPGZ3NUF.js} +23 -23
- package/dist/{chunk-UQUYBDMG.js → chunk-M4G5FO7F.js} +1 -1
- package/dist/{chunk-P3GRLV47.js → chunk-NEWXDNF2.js} +212 -145
- package/dist/{chunk-3LEFXLAW.js → chunk-NOZJIN46.js} +36 -37
- package/dist/{chunk-4MDRHMX4.js → chunk-RE73FP2X.js} +4 -27
- package/dist/{chunk-5UZBUV2H.js → chunk-RKU66D2O.js} +6 -4
- package/dist/{chunk-SWOPJHXI.js → chunk-RYTSPBNM.js} +4 -4
- package/dist/{chunk-WTJDSTYD.js → chunk-T5KR6SNO.js} +2 -2
- package/dist/chunk-TGSPCFBT.js +1 -0
- package/dist/{chunk-ZYACRPLN.js → chunk-ULYAI7CP.js} +6 -3
- package/dist/{chunk-HLSHFXTO.js → chunk-WY74MMDB.js} +2 -2
- package/dist/{chunk-PGNERAZL.js → chunk-ZWBI7ORM.js} +3 -3
- package/dist/{cli-context-7HK67B2Z.js → cli-context-I6HJCVCV.js} +1607 -1495
- package/dist/cli-initial-tools.d.ts +54 -0
- package/dist/{cli-main-TQGLKB6D.js → cli-main-X7KD7IOC.js} +38223 -37136
- package/dist/cli-main-boot.d.ts +133 -0
- package/dist/cli-main-orchestration.d.ts +170 -0
- package/dist/cli-main-state.d.ts +19 -0
- package/dist/config-doctor.d.ts +1 -1
- package/dist/{config-transfer-UE37X4B5.js → config-transfer-YPD7HYXH.js} +7 -5
- package/dist/{execution-C2IECWF7.js → execution-M7D4KNBB.js} +171 -132
- package/dist/fleet/host-director-setup.d.ts +41 -0
- package/dist/fleet/host-spawn-types.d.ts +17 -0
- package/dist/fleet/host.d.ts +2 -1
- package/dist/goal-host-prompts.d.ts +5 -0
- package/dist/goal-host-types.d.ts +94 -0
- package/dist/goal-host.d.ts +2 -91
- package/dist/{hq-KBFDKTDD.js → hq-BBLGEEUH.js} +5 -6
- package/dist/hq-server/handle-types.d.ts +1 -1
- package/dist/hq-server/routes/auth-handlers.d.ts +1 -1
- package/dist/hq-server/routes.d.ts +1 -13
- package/dist/hq-server/utils.d.ts +1 -1
- package/dist/{hq-server-AVNKZ2PV.js → hq-server-5TR6NBGS.js} +3 -3
- package/dist/{hq-service-FGB7BY2D.js → hq-service-4Q64WFNT.js} +3 -3
- package/dist/{import-claude-code-AYG24RG2.js → import-claude-code-GHIS2F7Y.js} +3 -3
- package/dist/index.js +5 -5
- package/dist/live-settings-input.d.ts +2 -0
- package/dist/mailbox-bridge-bootstrap.d.ts +1 -4
- package/dist/{mailbox-serve-S536N66F.js → mailbox-serve-DRWJVMYU.js} +2 -2
- package/dist/{modeldiag-NEPTLFZW.js → modeldiag-F3LUF4VJ.js} +3 -3
- package/dist/picker-effort.d.ts +32 -0
- package/dist/picker-model-picker.d.ts +13 -2
- package/dist/picker-provider-list.d.ts +66 -0
- package/dist/picker.d.ts +12 -12
- package/dist/plugin-config.d.ts +6 -0
- package/dist/{plugin-usage-3TZGROK7.js → plugin-usage-EM752WHG.js} +3 -3
- package/dist/{plugins-ITH4SLO6.js → plugins-U6HQFJ7N.js} +4 -4
- package/dist/{providers-models-O75MKLN2.js → providers-models-S3S6VXME.js} +249 -239
- package/dist/repl-suggestions.d.ts +0 -5
- package/dist/{sage-FFKUOCQL.js → sage-BMRDJCDI.js} +9 -5
- package/dist/{sage-sync-ZMTHB477.js → sage-sync-PCWCNEUK.js} +2 -2
- package/dist/{sdd-runtime-PTOSPYI4.js → sdd-runtime-PF72WHLO.js} +3 -20
- package/dist/services/sdd/task-manager.d.ts +1 -12
- package/dist/services/sdd-runtime.d.ts +3 -4
- package/dist/services/statusline-config.d.ts +0 -2
- package/dist/{sessions-config-VE26SB56.js → sessions-config-RQRQDW5Q.js} +2 -2
- package/dist/settings-behavior-sections.d.ts +0 -1
- package/dist/short-circuit-flags-IEV3FEOT.js +10 -0
- package/dist/{skill-suggest-L2EVWB6R.js → skill-suggest-THANK3LV.js} +1 -1
- package/dist/slash-commands/command-context.d.ts +2 -0
- package/dist/slash-commands/doctor.d.ts +0 -9
- package/dist/slash-commands/fallback-chain-view.d.ts +3 -0
- package/dist/slash-commands/fallback-ref-validation.d.ts +34 -0
- package/dist/slash-commands/goal-refiner.d.ts +10 -2
- package/dist/slash-commands/goals.d.ts +6 -0
- package/dist/slash-commands/kanban-task-completion.d.ts +17 -0
- package/dist/slash-commands/mcp.d.ts +0 -1
- package/dist/slash-commands/memory-purge-domain-terms.d.ts +5 -0
- package/dist/slash-commands/nextsteps-mode.d.ts +13 -0
- package/dist/slash-commands/session-live-status.d.ts +21 -0
- package/dist/slash-commands/session.d.ts +1 -1
- package/dist/slash-commands/settings-feature-ui-mutations.d.ts +8 -0
- package/dist/slash-commands/settings-hq-autonomy-mutations.d.ts +8 -0
- package/dist/slash-commands/settings-persist-deps.d.ts +10 -0
- package/dist/slash-commands/settings-runtime-mutations.d.ts +12 -0
- package/dist/slash-commands/shadow.d.ts +0 -1
- package/dist/slash-commands/tool-auto-thin-commands.d.ts +15 -0
- package/dist/{standalone-auto-update-VQC4GYCM.js → standalone-auto-update-QUXOZ4B5.js} +13 -2
- package/dist/subcommands/handlers/acp-agents.d.ts +9 -0
- package/dist/subcommands/handlers/acp-server.d.ts +7 -0
- package/dist/subcommands/handlers/hq.d.ts +0 -1
- package/dist/subcommands/handlers/providers-models-custom.d.ts +33 -0
- package/dist/subcommands/handlers/providers-models-visibility.d.ts +29 -0
- package/dist/subcommands/handlers/skill-suggest.d.ts +0 -2
- package/dist/{subcommands-CLI6QTLU.js → subcommands-75IB23LS.js} +2 -2
- package/dist/{typesafe-NHC322W5.js → typesafe-KW2XHOG3.js} +2 -2
- package/dist/{update-J5WHAFPE.js → update-LHCWAWEZ.js} +3 -3
- package/dist/utils/win32-cmd.d.ts +1 -1
- package/dist/{version-help-ATOKGMTK.js → version-help-JQGRPDJW.js} +2 -2
- package/dist/webui-server/credential-watcher.d.ts +3 -1
- package/dist/webui-server/host-settings.d.ts +17 -0
- package/dist/webui-server/http-bridge.d.ts +32 -0
- package/dist/webui-server/instance-registration.d.ts +19 -0
- package/dist/webui-server/kanban-services.d.ts +9 -0
- package/dist/webui-server/message-router.d.ts +14 -0
- package/dist/webui-server/prefs-seeding.d.ts +1 -2
- package/dist/webui-server/provider-config.d.ts +0 -1
- package/dist/webui-server/provider-plane.d.ts +14 -0
- package/dist/webui-server/session-agents.d.ts +18 -0
- package/dist/webui-server/session-start-live.d.ts +11 -0
- package/dist/webui-server/stream-coalescer.d.ts +1 -1
- package/dist/webui-server/transport.d.ts +12 -0
- package/dist/{webui-server-GQOVLQS3.js → webui-server-CUIFA25W.js} +1472 -1335
- package/dist/webui-session-maintenance.d.ts +16 -0
- package/dist/wiring/brain-and-orchestration.d.ts +1 -1
- package/dist/wiring/cli-slash-commands-setup.d.ts +1 -0
- package/dist/wiring/command-host-state.d.ts +11 -2
- package/dist/wiring/dep-watcher-bridge.d.ts +8 -1
- package/dist/wiring/management-tools.d.ts +9 -1
- package/dist/wiring/session-command-handlers.d.ts +2 -1
- package/dist/worktree-command-host.d.ts +31 -0
- package/package.json +31 -31
- package/dist/chunk-WHOIR577.js +0 -1
- package/dist/short-circuit-flags-D6VAG47Y.js +0 -10
|
@@ -7,10 +7,10 @@ import {
|
|
|
7
7
|
pluginNameFromSpec,
|
|
8
8
|
setupPlugins,
|
|
9
9
|
warnIfDeprecatedPluginName
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-B6EHK772.js";
|
|
11
11
|
import "./chunk-EWKESL4L.js";
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-ACW64W4M.js";
|
|
13
|
+
import "./chunk-4JMAWKLA.js";
|
|
14
14
|
export {
|
|
15
15
|
BUILTIN_PLUGIN_FACTORIES,
|
|
16
16
|
BUILTIN_PLUGIN_NAME_HINTS,
|
|
@@ -21,4 +21,4 @@ export {
|
|
|
21
21
|
setupPlugins,
|
|
22
22
|
warnIfDeprecatedPluginName
|
|
23
23
|
};
|
|
24
|
-
//# sourceMappingURL=plugins-
|
|
24
|
+
//# sourceMappingURL=plugins-U6HQFJ7N.js.map
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import {
|
|
2
2
|
visibleModelIds
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-RKU66D2O.js";
|
|
4
4
|
import {
|
|
5
5
|
mutateConfigProviders
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-ULYAI7CP.js";
|
|
7
7
|
import {
|
|
8
8
|
activeProfileConfigPath
|
|
9
9
|
} from "./chunk-YMXXOOFN.js";
|
|
10
10
|
|
|
11
11
|
// src/subcommands/handlers/providers-models.ts
|
|
12
|
+
import { color as color3 } from "@wrongstack/core/utils";
|
|
13
|
+
|
|
14
|
+
// src/subcommands/handlers/providers-models-custom.ts
|
|
12
15
|
import * as fs from "node:fs/promises";
|
|
13
16
|
import { decryptConfigSecretsForRewrite, encryptConfigSecrets } from "@wrongstack/core/security";
|
|
14
17
|
import {
|
|
@@ -17,229 +20,13 @@ import {
|
|
|
17
20
|
import {
|
|
18
21
|
atomicWrite,
|
|
19
22
|
backupConfigFile,
|
|
20
|
-
color,
|
|
23
|
+
color as color2,
|
|
21
24
|
expectDefined,
|
|
22
25
|
withFileLock
|
|
23
26
|
} from "@wrongstack/core/utils";
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const showUnsupported = providerFlags["unsupported"] === true || providerFlags["unsupported"] === "true";
|
|
28
|
-
try {
|
|
29
|
-
const all = await deps.modelsRegistry.listProviders();
|
|
30
|
-
const byFamily = {
|
|
31
|
-
anthropic: [],
|
|
32
|
-
"anthropic-oauth": [],
|
|
33
|
-
openai: [],
|
|
34
|
-
"openai-compatible": [],
|
|
35
|
-
"openai-codex": [],
|
|
36
|
-
"github-copilot": [],
|
|
37
|
-
google: [],
|
|
38
|
-
"google-antigravity": [],
|
|
39
|
-
unsupported: []
|
|
40
|
-
};
|
|
41
|
-
for (const p of all) byFamily[p.family].push(p);
|
|
42
|
-
const families = showUnsupported ? ["unsupported"] : showAll ? ["anthropic", "openai", "google", "openai-compatible", "unsupported"] : ["anthropic", "openai", "google", "openai-compatible"];
|
|
43
|
-
for (const family of families) {
|
|
44
|
-
const list = byFamily[family];
|
|
45
|
-
if (list.length === 0) continue;
|
|
46
|
-
deps.renderer.write(`
|
|
47
|
-
${color.bold(family)} (${list.length}):
|
|
48
|
-
`);
|
|
49
|
-
for (const p of list) {
|
|
50
|
-
const envFound = p.envVars.some((v) => process.env[v]);
|
|
51
|
-
const marker = envFound ? color.green("\u25CF") : color.dim("\u25CB");
|
|
52
|
-
const envHint = p.envVars[0] ? color.dim(`[${p.envVars[0]}]`) : "";
|
|
53
|
-
const note = family === "unsupported" ? color.dim("(needs plugin)") : "";
|
|
54
|
-
deps.renderer.write(
|
|
55
|
-
` ${marker} ${p.id.padEnd(20)} ${p.name.padEnd(28)} ${envHint} ${note}
|
|
56
|
-
`
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
deps.renderer.write(
|
|
61
|
-
`
|
|
62
|
-
${color.dim(`Current: ${deps.config.provider ?? "<unset>"} / ${deps.config.model ?? "<unset>"}. Use --all to include unsupported families.`)}
|
|
63
|
-
`
|
|
64
|
-
);
|
|
65
|
-
return 0;
|
|
66
|
-
} catch (err) {
|
|
67
|
-
deps.renderer.writeError(
|
|
68
|
-
`Failed to list providers: ${err instanceof Error ? err.message : err}`
|
|
69
|
-
);
|
|
70
|
-
return 1;
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
function parseFlags(args) {
|
|
74
|
-
const flags = {};
|
|
75
|
-
for (let i = 0; i < args.length; i++) {
|
|
76
|
-
const a = expectDefined(args[i]);
|
|
77
|
-
if (a.startsWith("--")) {
|
|
78
|
-
const eq = a.indexOf("=");
|
|
79
|
-
if (eq !== -1) {
|
|
80
|
-
flags[a.slice(2, eq)] = a.slice(eq + 1);
|
|
81
|
-
} else {
|
|
82
|
-
const name = a.slice(2);
|
|
83
|
-
if (i + 1 < args.length && !args[i + 1]?.startsWith("--")) {
|
|
84
|
-
flags[name] = args[++i] ?? "";
|
|
85
|
-
} else {
|
|
86
|
-
flags[name] = true;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
return flags;
|
|
92
|
-
}
|
|
93
|
-
function positionals(args) {
|
|
94
|
-
const out = [];
|
|
95
|
-
for (let i = 0; i < args.length; i++) {
|
|
96
|
-
const a = expectDefined(args[i]);
|
|
97
|
-
if (a.startsWith("--")) {
|
|
98
|
-
const eq = a.indexOf("=");
|
|
99
|
-
if (eq === -1) {
|
|
100
|
-
if (i + 1 < args.length && !args[i + 1]?.startsWith("--")) {
|
|
101
|
-
i++;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
continue;
|
|
105
|
-
}
|
|
106
|
-
out.push(a);
|
|
107
|
-
}
|
|
108
|
-
return out;
|
|
109
|
-
}
|
|
110
|
-
var DEFAULT_PER_PAGE = 15;
|
|
111
|
-
function fmtPrice(usdPer1M) {
|
|
112
|
-
if (usdPer1M === void 0) return color.dim("?");
|
|
113
|
-
const value = usdPer1M >= 10 ? usdPer1M.toFixed(1) : usdPer1M.toFixed(2);
|
|
114
|
-
return "$" + value;
|
|
115
|
-
}
|
|
116
|
-
var modelsCmd = async (args, deps) => {
|
|
117
|
-
const sub = args[0];
|
|
118
|
-
if (sub === "hide") return modelsHide(args.slice(1), deps);
|
|
119
|
-
if (sub === "show") return modelsShow(args.slice(1), deps);
|
|
120
|
-
if (sub === "hidden") return modelsHidden(args.slice(1), deps);
|
|
121
|
-
if (sub === "reset") return modelsReset(args.slice(1), deps);
|
|
122
|
-
if (sub === "add") return modelsAdd(args.slice(1), deps);
|
|
123
|
-
if (sub === "remove") return modelsRemove(args.slice(1), deps);
|
|
124
|
-
if (sub === "list") return modelsList(args.slice(1), deps);
|
|
125
|
-
if (sub === "caps" || sub === "capabilities") return modelsCaps(args.slice(1), deps);
|
|
126
|
-
if (sub === "refresh") {
|
|
127
|
-
deps.renderer.writeInfo("Refreshing models.dev cache\u2026");
|
|
128
|
-
try {
|
|
129
|
-
const payload = await deps.modelsRegistry.refresh();
|
|
130
|
-
deps.renderer.writeInfo(
|
|
131
|
-
`Cached ${Object.keys(payload).length} providers to ${deps.paths.modelsCache}`
|
|
132
|
-
);
|
|
133
|
-
return 0;
|
|
134
|
-
} catch (err) {
|
|
135
|
-
deps.renderer.writeError(`Refresh failed: ${err instanceof Error ? err.message : err}`);
|
|
136
|
-
return 1;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
const flags = subcommandFlags(args, deps);
|
|
140
|
-
const search = typeof flags["search"] === "string" ? flags["search"].toLowerCase() : "";
|
|
141
|
-
const perPage = Number(flags["per-page"]) > 0 ? Number(flags["per-page"]) : DEFAULT_PER_PAGE;
|
|
142
|
-
const page = Math.max(1, Number(flags["page"]) || 1);
|
|
143
|
-
const providerId = sub ?? deps.config.provider ?? "";
|
|
144
|
-
if (!providerId) {
|
|
145
|
-
deps.renderer.writeError(
|
|
146
|
-
"Usage: wstack models <provider> [--search <term>] [--page N] [--per-page N]"
|
|
147
|
-
);
|
|
148
|
-
return 1;
|
|
149
|
-
}
|
|
150
|
-
const { providerId: lookupId, provider } = await getCatalogProviderForConfigProvider(
|
|
151
|
-
providerId,
|
|
152
|
-
deps
|
|
153
|
-
);
|
|
154
|
-
if (!provider) {
|
|
155
|
-
deps.renderer.writeError(
|
|
156
|
-
lookupId !== providerId ? `Alias "${providerId}" points at catalog id "${lookupId}" which is not in the cache.` : `Provider "${providerId}" not in catalog.`
|
|
157
|
-
);
|
|
158
|
-
return 1;
|
|
159
|
-
}
|
|
160
|
-
if (lookupId !== providerId)
|
|
161
|
-
deps.renderer.write(
|
|
162
|
-
color.dim(`(showing catalog models for "${lookupId}" via alias "${providerId}")
|
|
163
|
-
`)
|
|
164
|
-
);
|
|
165
|
-
deps.renderer.write(`${color.bold(provider.name)} ${color.dim(`(${provider.id})`)}
|
|
166
|
-
`);
|
|
167
|
-
if (provider.doc) deps.renderer.write(color.dim(`Docs: ${provider.doc}
|
|
168
|
-
`));
|
|
169
|
-
const savedProvider = deps.config.providers?.[providerId];
|
|
170
|
-
const userModels = savedProvider?.models;
|
|
171
|
-
const catalogById = new Map(provider.models.map((m) => [m.id, m]));
|
|
172
|
-
const allKnownSorted = [...provider.models].sort(
|
|
173
|
-
(a, b) => (b.release_date ?? "").localeCompare(a.release_date ?? "")
|
|
174
|
-
);
|
|
175
|
-
const visibleIds = visibleModelIds(
|
|
176
|
-
providerId,
|
|
177
|
-
deps.config,
|
|
178
|
-
allKnownSorted.map((m) => m.id),
|
|
179
|
-
savedProvider
|
|
180
|
-
);
|
|
181
|
-
const allSorted = visibleIds.map((id) => catalogById.get(id) ?? { id, name: id });
|
|
182
|
-
if (userModels !== void 0) {
|
|
183
|
-
const hiddenCount = Math.max(0, allKnownSorted.length - visibleIds.length);
|
|
184
|
-
const restoredCount = Math.max(0, visibleIds.length - userModels.length);
|
|
185
|
-
deps.renderer.write(
|
|
186
|
-
color.dim(
|
|
187
|
-
`(${visibleIds.length} visible model(s)${restoredCount > 0 ? `, ${restoredCount} from providers.json/catalog fallback` : " from your saved config"}${hiddenCount > 0 ? `, ${hiddenCount} hidden` : ""})
|
|
188
|
-
`
|
|
189
|
-
)
|
|
190
|
-
);
|
|
191
|
-
}
|
|
192
|
-
const filtered = search ? allSorted.filter((m) => m.id.toLowerCase().includes(search)) : allSorted;
|
|
193
|
-
const total = filtered.length;
|
|
194
|
-
const totalPages = Math.max(1, Math.ceil(total / perPage));
|
|
195
|
-
const actualPage = Math.min(page, totalPages);
|
|
196
|
-
const start = (actualPage - 1) * perPage;
|
|
197
|
-
const pageItems = filtered.slice(start, start + perPage);
|
|
198
|
-
const end = Math.min(start + pageItems.length, total);
|
|
199
|
-
const pageHint = totalPages > 1 ? color.cyan(`[page ${actualPage}/${totalPages}]`) : "";
|
|
200
|
-
const searchHint = search ? color.yellow(` (filtered: "${search}" \u2014 ${total} match${total === 1 ? "" : "es"})`) : color.dim(` (${total} model${total === 1 ? "" : "s"})`);
|
|
201
|
-
deps.renderer.write(`${pageHint}${searchHint}
|
|
202
|
-
`);
|
|
203
|
-
if (pageItems.length === 0) {
|
|
204
|
-
deps.renderer.write(color.dim("(no models match)\n"));
|
|
205
|
-
} else {
|
|
206
|
-
if (start > 0)
|
|
207
|
-
deps.renderer.write(color.dim(` ${String.fromCharCode(8593)} ${start} above
|
|
208
|
-
`));
|
|
209
|
-
for (const m of pageItems) {
|
|
210
|
-
const caps = [];
|
|
211
|
-
if ("tool_call" in m && m.tool_call) caps.push("tools");
|
|
212
|
-
if ("reasoning" in m && m.reasoning) caps.push("reasoning");
|
|
213
|
-
if ("modalities" in m && m.modalities?.input?.includes("image")) caps.push("vision");
|
|
214
|
-
const ctx = "limit" in m && m.limit?.context ? `${(m.limit.context / 1e3).toFixed(0)}k` : "?";
|
|
215
|
-
const cost = "cost" in m && m.cost?.input !== void 0 ? `${m.cost.input}/${m.cost.output ?? "?"}` : "";
|
|
216
|
-
deps.renderer.write(
|
|
217
|
-
` ${m.id.padEnd(40)} ${color.dim(ctx.padStart(6))} ${color.dim(cost.padEnd(14))} ${color.dim(caps.join(","))}
|
|
218
|
-
`
|
|
219
|
-
);
|
|
220
|
-
}
|
|
221
|
-
if (end < total)
|
|
222
|
-
deps.renderer.write(color.dim(` ${String.fromCharCode(8595)} ${total - end} below
|
|
223
|
-
`));
|
|
224
|
-
}
|
|
225
|
-
const navLines = [];
|
|
226
|
-
if (totalPages > 1) {
|
|
227
|
-
if (actualPage > 1) navLines.push(`--page ${actualPage - 1} (prev)`);
|
|
228
|
-
if (actualPage < totalPages) navLines.push(`--page ${actualPage + 1} (next)`);
|
|
229
|
-
}
|
|
230
|
-
navLines.push("--search <term> (filter)");
|
|
231
|
-
deps.renderer.write(color.dim(`
|
|
232
|
-
${navLines.join(" \xB7 ")}
|
|
233
|
-
`));
|
|
234
|
-
const age = await deps.modelsRegistry.ageSeconds();
|
|
235
|
-
deps.renderer.write(
|
|
236
|
-
color.dim(
|
|
237
|
-
`Cache age: ${isFinite(age) ? `${Math.round(age / 60)}m` : "never fetched"}. Run \`wstack models refresh\` to update.
|
|
238
|
-
`
|
|
239
|
-
)
|
|
240
|
-
);
|
|
241
|
-
return 0;
|
|
242
|
-
};
|
|
27
|
+
|
|
28
|
+
// src/subcommands/handlers/providers-models-visibility.ts
|
|
29
|
+
import { color } from "@wrongstack/core/utils";
|
|
243
30
|
function aliasProviderId(configProviderId, cfg) {
|
|
244
31
|
return cfg?.type && cfg.type !== configProviderId ? cfg.type : configProviderId;
|
|
245
32
|
}
|
|
@@ -423,6 +210,50 @@ function publishProviderConfig(deps, providerId, next) {
|
|
|
423
210
|
providers: { ...deps.config.providers ?? {}, [providerId]: next }
|
|
424
211
|
};
|
|
425
212
|
}
|
|
213
|
+
|
|
214
|
+
// src/subcommands/handlers/providers-models-custom.ts
|
|
215
|
+
function parseFlags(args) {
|
|
216
|
+
const flags = {};
|
|
217
|
+
for (let i = 0; i < args.length; i++) {
|
|
218
|
+
const a = expectDefined(args[i]);
|
|
219
|
+
if (a.startsWith("--")) {
|
|
220
|
+
const eq = a.indexOf("=");
|
|
221
|
+
if (eq !== -1) {
|
|
222
|
+
flags[a.slice(2, eq)] = a.slice(eq + 1);
|
|
223
|
+
} else {
|
|
224
|
+
const name = a.slice(2);
|
|
225
|
+
if (i + 1 < args.length && !args[i + 1]?.startsWith("--")) {
|
|
226
|
+
flags[name] = args[++i] ?? "";
|
|
227
|
+
} else {
|
|
228
|
+
flags[name] = true;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return flags;
|
|
234
|
+
}
|
|
235
|
+
function positionals(args) {
|
|
236
|
+
const out = [];
|
|
237
|
+
for (let i = 0; i < args.length; i++) {
|
|
238
|
+
const a = expectDefined(args[i]);
|
|
239
|
+
if (a.startsWith("--")) {
|
|
240
|
+
const eq = a.indexOf("=");
|
|
241
|
+
if (eq === -1) {
|
|
242
|
+
if (i + 1 < args.length && !args[i + 1]?.startsWith("--")) {
|
|
243
|
+
i++;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
out.push(a);
|
|
249
|
+
}
|
|
250
|
+
return out;
|
|
251
|
+
}
|
|
252
|
+
function fmtPrice(usdPer1M) {
|
|
253
|
+
if (usdPer1M === void 0) return color2.dim("?");
|
|
254
|
+
const value = usdPer1M >= 10 ? usdPer1M.toFixed(1) : usdPer1M.toFixed(2);
|
|
255
|
+
return "$" + value;
|
|
256
|
+
}
|
|
426
257
|
async function modelsResetCustomModel(providerId, modelId, saved, deps) {
|
|
427
258
|
if (!saved.customModels || !Object.hasOwn(saved.customModels, modelId)) {
|
|
428
259
|
deps.renderer.writeInfo(`${providerId}/${modelId} has no custom definition; nothing to reset.`);
|
|
@@ -485,7 +316,7 @@ async function modelsCaps(args, deps) {
|
|
|
485
316
|
const modelId = args[1] ?? deps.config.model;
|
|
486
317
|
if (!providerId || !modelId) {
|
|
487
318
|
deps.renderer.writeError("Usage: wstack models caps [provider] [model]");
|
|
488
|
-
deps.renderer.write(
|
|
319
|
+
deps.renderer.write(color2.dim("Defaults to current configured provider/model when omitted.\n"));
|
|
489
320
|
return 1;
|
|
490
321
|
}
|
|
491
322
|
if (usesAccountCatalog(deps.config.providers?.[providerId])) {
|
|
@@ -495,7 +326,7 @@ async function modelsCaps(args, deps) {
|
|
|
495
326
|
if (!resolved) {
|
|
496
327
|
deps.renderer.writeError("Model not found in catalog: " + providerId + "/" + modelId);
|
|
497
328
|
deps.renderer.write(
|
|
498
|
-
|
|
329
|
+
color2.dim("Run `wstack models refresh` or add a custom model if this is expected.\n")
|
|
499
330
|
);
|
|
500
331
|
return 1;
|
|
501
332
|
}
|
|
@@ -508,17 +339,17 @@ async function modelsCaps(args, deps) {
|
|
|
508
339
|
const rc = caps.reasoningConfig;
|
|
509
340
|
const cost = resolved.cost;
|
|
510
341
|
deps.renderer.write(
|
|
511
|
-
|
|
342
|
+
color2.bold("Model capabilities") + " " + color2.dim(providerId + "/" + modelId) + "\n"
|
|
512
343
|
);
|
|
513
344
|
deps.renderer.write(
|
|
514
|
-
" context: " + (caps.maxContext ?
|
|
345
|
+
" context: " + (caps.maxContext ? color2.yellow(String(caps.maxContext)) : color2.dim("?")) + "\n"
|
|
515
346
|
);
|
|
516
347
|
if (caps.maxOutput !== void 0) {
|
|
517
|
-
deps.renderer.write(" max output: " +
|
|
348
|
+
deps.renderer.write(" max output: " + color2.yellow(String(caps.maxOutput)) + "\n");
|
|
518
349
|
}
|
|
519
350
|
if (caps.knowledge) deps.renderer.write(" knowledge: " + caps.knowledge + "\n");
|
|
520
351
|
deps.renderer.write(
|
|
521
|
-
" flags: " + (flags.length > 0 ? flags.join(", ") :
|
|
352
|
+
" flags: " + (flags.length > 0 ? flags.join(", ") : color2.dim("(none)")) + "\n"
|
|
522
353
|
);
|
|
523
354
|
deps.renderer.write(
|
|
524
355
|
" pricing/1M: input " + fmtPrice(cost?.input) + " output " + fmtPrice(cost?.output) + " cacheR " + fmtPrice(cost?.cache_read) + "\n"
|
|
@@ -541,7 +372,7 @@ async function modelsCaps(args, deps) {
|
|
|
541
372
|
deps.renderer.write(" preserve: " + rc.preserveThinking + "\n");
|
|
542
373
|
} else if (caps.reasoning) {
|
|
543
374
|
deps.renderer.write(
|
|
544
|
-
|
|
375
|
+
color2.dim(" reasoning: supported, but no detailed config in catalog\n")
|
|
545
376
|
);
|
|
546
377
|
}
|
|
547
378
|
return 0;
|
|
@@ -561,7 +392,7 @@ async function mutateModelsConfig(deps, mutator) {
|
|
|
561
392
|
}
|
|
562
393
|
let parsed;
|
|
563
394
|
try {
|
|
564
|
-
parsed = JSON.parse(raw);
|
|
395
|
+
parsed = JSON.parse(raw.replace(/^\uFEFF/, ""));
|
|
565
396
|
} catch (err) {
|
|
566
397
|
if (fileExists) {
|
|
567
398
|
throw new ConfigError({
|
|
@@ -650,7 +481,7 @@ async function modelsAdd(args, deps) {
|
|
|
650
481
|
}
|
|
651
482
|
if (def.maxOutput !== void 0) capLines.push(` maxOutput: ${def.maxOutput}`);
|
|
652
483
|
if (capLines.length > 0) {
|
|
653
|
-
deps.renderer.write(
|
|
484
|
+
deps.renderer.write(color2.dim(capLines.join("\n") + "\n"));
|
|
654
485
|
}
|
|
655
486
|
return 0;
|
|
656
487
|
}
|
|
@@ -675,33 +506,212 @@ async function modelsList(_args, deps) {
|
|
|
675
506
|
const models = deps.config.models ?? {};
|
|
676
507
|
const entries = Object.entries(models);
|
|
677
508
|
if (entries.length === 0) {
|
|
678
|
-
deps.renderer.write(
|
|
509
|
+
deps.renderer.write(color2.dim("No custom models defined.\n"));
|
|
679
510
|
deps.renderer.write(
|
|
680
|
-
|
|
511
|
+
color2.dim("Use `wstack models add <modelId> --max-context 128k --tools`\n")
|
|
681
512
|
);
|
|
682
513
|
return 0;
|
|
683
514
|
}
|
|
684
|
-
deps.renderer.write(
|
|
515
|
+
deps.renderer.write(color2.bold("Custom models\n"));
|
|
685
516
|
for (const [id, def] of entries.sort(([a], [b]) => a.localeCompare(b))) {
|
|
686
517
|
const label = def.name ?? id;
|
|
687
|
-
const provider = def.provider ? ` ${
|
|
688
|
-
deps.renderer.write(` ${
|
|
518
|
+
const provider = def.provider ? ` ${color2.dim(`(${def.provider})`)}` : "";
|
|
519
|
+
deps.renderer.write(` ${color2.bold(label)}${provider}
|
|
689
520
|
`);
|
|
690
521
|
if (def.capabilities) {
|
|
691
522
|
for (const [k, v] of Object.entries(def.capabilities)) {
|
|
692
|
-
deps.renderer.write(` ${
|
|
523
|
+
deps.renderer.write(` ${color2.dim(`${k}:`)} ${v}
|
|
693
524
|
`);
|
|
694
525
|
}
|
|
695
526
|
}
|
|
696
527
|
if (def.maxOutput !== void 0) {
|
|
697
|
-
deps.renderer.write(` ${
|
|
528
|
+
deps.renderer.write(` ${color2.dim("maxOutput:")} ${def.maxOutput}
|
|
698
529
|
`);
|
|
699
530
|
}
|
|
700
531
|
}
|
|
701
532
|
return 0;
|
|
702
533
|
}
|
|
534
|
+
|
|
535
|
+
// src/subcommands/handlers/providers-models.ts
|
|
536
|
+
var providersCmd = async (args, deps) => {
|
|
537
|
+
const providerFlags = subcommandFlags(args, deps);
|
|
538
|
+
const showAll = providerFlags["all"] === true || providerFlags["all"] === "true";
|
|
539
|
+
const showUnsupported = providerFlags["unsupported"] === true || providerFlags["unsupported"] === "true";
|
|
540
|
+
try {
|
|
541
|
+
const all = await deps.modelsRegistry.listProviders();
|
|
542
|
+
const byFamily = {
|
|
543
|
+
anthropic: [],
|
|
544
|
+
"anthropic-oauth": [],
|
|
545
|
+
openai: [],
|
|
546
|
+
"openai-compatible": [],
|
|
547
|
+
"openai-codex": [],
|
|
548
|
+
"github-copilot": [],
|
|
549
|
+
google: [],
|
|
550
|
+
"google-antigravity": [],
|
|
551
|
+
unsupported: []
|
|
552
|
+
};
|
|
553
|
+
for (const p of all) byFamily[p.family].push(p);
|
|
554
|
+
const families = showUnsupported ? ["unsupported"] : showAll ? ["anthropic", "openai", "google", "openai-compatible", "unsupported"] : ["anthropic", "openai", "google", "openai-compatible"];
|
|
555
|
+
for (const family of families) {
|
|
556
|
+
const list = byFamily[family];
|
|
557
|
+
if (list.length === 0) continue;
|
|
558
|
+
deps.renderer.write(`
|
|
559
|
+
${color3.bold(family)} (${list.length}):
|
|
560
|
+
`);
|
|
561
|
+
for (const p of list) {
|
|
562
|
+
const envFound = p.envVars.some((v) => process.env[v]);
|
|
563
|
+
const marker = envFound ? color3.green("\u25CF") : color3.dim("\u25CB");
|
|
564
|
+
const envHint = p.envVars[0] ? color3.dim(`[${p.envVars[0]}]`) : "";
|
|
565
|
+
const note = family === "unsupported" ? color3.dim("(needs plugin)") : "";
|
|
566
|
+
deps.renderer.write(
|
|
567
|
+
` ${marker} ${p.id.padEnd(20)} ${p.name.padEnd(28)} ${envHint} ${note}
|
|
568
|
+
`
|
|
569
|
+
);
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
deps.renderer.write(
|
|
573
|
+
`
|
|
574
|
+
${color3.dim(`Current: ${deps.config.provider ?? "<unset>"} / ${deps.config.model ?? "<unset>"}. Use --all to include unsupported families.`)}
|
|
575
|
+
`
|
|
576
|
+
);
|
|
577
|
+
return 0;
|
|
578
|
+
} catch (err) {
|
|
579
|
+
deps.renderer.writeError(
|
|
580
|
+
`Failed to list providers: ${err instanceof Error ? err.message : err}`
|
|
581
|
+
);
|
|
582
|
+
return 1;
|
|
583
|
+
}
|
|
584
|
+
};
|
|
585
|
+
var DEFAULT_PER_PAGE = 15;
|
|
586
|
+
var modelsCmd = async (args, deps) => {
|
|
587
|
+
const sub = args[0];
|
|
588
|
+
if (sub === "hide") return modelsHide(args.slice(1), deps);
|
|
589
|
+
if (sub === "show") return modelsShow(args.slice(1), deps);
|
|
590
|
+
if (sub === "hidden") return modelsHidden(args.slice(1), deps);
|
|
591
|
+
if (sub === "reset") return modelsReset(args.slice(1), deps);
|
|
592
|
+
if (sub === "add") return modelsAdd(args.slice(1), deps);
|
|
593
|
+
if (sub === "remove") return modelsRemove(args.slice(1), deps);
|
|
594
|
+
if (sub === "list") return modelsList(args.slice(1), deps);
|
|
595
|
+
if (sub === "caps" || sub === "capabilities") return modelsCaps(args.slice(1), deps);
|
|
596
|
+
if (sub === "refresh") {
|
|
597
|
+
deps.renderer.writeInfo("Refreshing models.dev cache\u2026");
|
|
598
|
+
try {
|
|
599
|
+
const payload = await deps.modelsRegistry.refresh();
|
|
600
|
+
deps.renderer.writeInfo(
|
|
601
|
+
`Cached ${Object.keys(payload).length} providers to ${deps.paths.modelsCache}`
|
|
602
|
+
);
|
|
603
|
+
return 0;
|
|
604
|
+
} catch (err) {
|
|
605
|
+
deps.renderer.writeError(`Refresh failed: ${err instanceof Error ? err.message : err}`);
|
|
606
|
+
return 1;
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
const flags = subcommandFlags(args, deps);
|
|
610
|
+
const search = typeof flags["search"] === "string" ? flags["search"].toLowerCase() : "";
|
|
611
|
+
const perPage = Number(flags["per-page"]) > 0 ? Number(flags["per-page"]) : DEFAULT_PER_PAGE;
|
|
612
|
+
const page = Math.max(1, Number(flags["page"]) || 1);
|
|
613
|
+
const providerId = sub ?? deps.config.provider ?? "";
|
|
614
|
+
if (!providerId) {
|
|
615
|
+
deps.renderer.writeError(
|
|
616
|
+
"Usage: wstack models <provider> [--search <term>] [--page N] [--per-page N]"
|
|
617
|
+
);
|
|
618
|
+
return 1;
|
|
619
|
+
}
|
|
620
|
+
const { providerId: lookupId, provider } = await getCatalogProviderForConfigProvider(
|
|
621
|
+
providerId,
|
|
622
|
+
deps
|
|
623
|
+
);
|
|
624
|
+
if (!provider) {
|
|
625
|
+
deps.renderer.writeError(
|
|
626
|
+
lookupId !== providerId ? `Alias "${providerId}" points at catalog id "${lookupId}" which is not in the cache.` : `Provider "${providerId}" not in catalog.`
|
|
627
|
+
);
|
|
628
|
+
return 1;
|
|
629
|
+
}
|
|
630
|
+
if (lookupId !== providerId)
|
|
631
|
+
deps.renderer.write(
|
|
632
|
+
color3.dim(`(showing catalog models for "${lookupId}" via alias "${providerId}")
|
|
633
|
+
`)
|
|
634
|
+
);
|
|
635
|
+
deps.renderer.write(`${color3.bold(provider.name)} ${color3.dim(`(${provider.id})`)}
|
|
636
|
+
`);
|
|
637
|
+
if (provider.doc) deps.renderer.write(color3.dim(`Docs: ${provider.doc}
|
|
638
|
+
`));
|
|
639
|
+
const savedProvider = deps.config.providers?.[providerId];
|
|
640
|
+
const userModels = savedProvider?.models;
|
|
641
|
+
const catalogById = new Map(provider.models.map((m) => [m.id, m]));
|
|
642
|
+
const allKnownSorted = [...provider.models].sort(
|
|
643
|
+
(a, b) => (b.release_date ?? "").localeCompare(a.release_date ?? "")
|
|
644
|
+
);
|
|
645
|
+
const visibleIds = visibleModelIds(
|
|
646
|
+
providerId,
|
|
647
|
+
deps.config,
|
|
648
|
+
allKnownSorted.map((m) => m.id),
|
|
649
|
+
savedProvider
|
|
650
|
+
);
|
|
651
|
+
const allSorted = visibleIds.map((id) => catalogById.get(id) ?? { id, name: id });
|
|
652
|
+
if (userModels !== void 0) {
|
|
653
|
+
const hiddenCount = Math.max(0, allKnownSorted.length - visibleIds.length);
|
|
654
|
+
const restoredCount = Math.max(0, visibleIds.length - userModels.length);
|
|
655
|
+
deps.renderer.write(
|
|
656
|
+
color3.dim(
|
|
657
|
+
`(${visibleIds.length} visible model(s)${restoredCount > 0 ? `, ${restoredCount} from providers.json/catalog fallback` : " from your saved config"}${hiddenCount > 0 ? `, ${hiddenCount} hidden` : ""})
|
|
658
|
+
`
|
|
659
|
+
)
|
|
660
|
+
);
|
|
661
|
+
}
|
|
662
|
+
const filtered = search ? allSorted.filter((m) => m.id.toLowerCase().includes(search)) : allSorted;
|
|
663
|
+
const total = filtered.length;
|
|
664
|
+
const totalPages = Math.max(1, Math.ceil(total / perPage));
|
|
665
|
+
const actualPage = Math.min(page, totalPages);
|
|
666
|
+
const start = (actualPage - 1) * perPage;
|
|
667
|
+
const pageItems = filtered.slice(start, start + perPage);
|
|
668
|
+
const end = Math.min(start + pageItems.length, total);
|
|
669
|
+
const pageHint = totalPages > 1 ? color3.cyan(`[page ${actualPage}/${totalPages}]`) : "";
|
|
670
|
+
const searchHint = search ? color3.yellow(` (filtered: "${search}" \u2014 ${total} match${total === 1 ? "" : "es"})`) : color3.dim(` (${total} model${total === 1 ? "" : "s"})`);
|
|
671
|
+
deps.renderer.write(`${pageHint}${searchHint}
|
|
672
|
+
`);
|
|
673
|
+
if (pageItems.length === 0) {
|
|
674
|
+
deps.renderer.write(color3.dim("(no models match)\n"));
|
|
675
|
+
} else {
|
|
676
|
+
if (start > 0)
|
|
677
|
+
deps.renderer.write(color3.dim(` ${String.fromCharCode(8593)} ${start} above
|
|
678
|
+
`));
|
|
679
|
+
for (const m of pageItems) {
|
|
680
|
+
const caps = [];
|
|
681
|
+
if ("tool_call" in m && m.tool_call) caps.push("tools");
|
|
682
|
+
if ("reasoning" in m && m.reasoning) caps.push("reasoning");
|
|
683
|
+
if ("modalities" in m && m.modalities?.input?.includes("image")) caps.push("vision");
|
|
684
|
+
const ctx = "limit" in m && m.limit?.context ? `${(m.limit.context / 1e3).toFixed(0)}k` : "?";
|
|
685
|
+
const cost = "cost" in m && m.cost?.input !== void 0 ? `${m.cost.input}/${m.cost.output ?? "?"}` : "";
|
|
686
|
+
deps.renderer.write(
|
|
687
|
+
` ${m.id.padEnd(40)} ${color3.dim(ctx.padStart(6))} ${color3.dim(cost.padEnd(14))} ${color3.dim(caps.join(","))}
|
|
688
|
+
`
|
|
689
|
+
);
|
|
690
|
+
}
|
|
691
|
+
if (end < total)
|
|
692
|
+
deps.renderer.write(color3.dim(` ${String.fromCharCode(8595)} ${total - end} below
|
|
693
|
+
`));
|
|
694
|
+
}
|
|
695
|
+
const navLines = [];
|
|
696
|
+
if (totalPages > 1) {
|
|
697
|
+
if (actualPage > 1) navLines.push(`--page ${actualPage - 1} (prev)`);
|
|
698
|
+
if (actualPage < totalPages) navLines.push(`--page ${actualPage + 1} (next)`);
|
|
699
|
+
}
|
|
700
|
+
navLines.push("--search <term> (filter)");
|
|
701
|
+
deps.renderer.write(color3.dim(`
|
|
702
|
+
${navLines.join(" \xB7 ")}
|
|
703
|
+
`));
|
|
704
|
+
const age = await deps.modelsRegistry.ageSeconds();
|
|
705
|
+
deps.renderer.write(
|
|
706
|
+
color3.dim(
|
|
707
|
+
`Cache age: ${isFinite(age) ? `${Math.round(age / 60)}m` : "never fetched"}. Run \`wstack models refresh\` to update.
|
|
708
|
+
`
|
|
709
|
+
)
|
|
710
|
+
);
|
|
711
|
+
return 0;
|
|
712
|
+
};
|
|
703
713
|
export {
|
|
704
714
|
modelsCmd,
|
|
705
715
|
providersCmd
|
|
706
716
|
};
|
|
707
|
-
//# sourceMappingURL=providers-models-
|
|
717
|
+
//# sourceMappingURL=providers-models-S3S6VXME.js.map
|
|
@@ -13,9 +13,4 @@ import type { TodoItem } from '@wrongstack/core/agent';
|
|
|
13
13
|
* on the next turn once everything is `completed`.
|
|
14
14
|
*/
|
|
15
15
|
export declare function parseSuggestionsFromOutput(finalText: string, todos?: readonly TodoItem[] | null): string[] | null;
|
|
16
|
-
/**
|
|
17
|
-
* Extract only the auto="true" items from next_steps output.
|
|
18
|
-
* Used by YOLO+auto autonomy mode.
|
|
19
|
-
*/
|
|
20
|
-
export declare function parseAutoSuggestionsFromOutput(finalText: string): string[] | null;
|
|
21
16
|
//# sourceMappingURL=repl-suggestions.d.ts.map
|
|
@@ -152,7 +152,7 @@ function isSageConnected(target, opts) {
|
|
|
152
152
|
return content.split(/\r?\n/).some((line) => isOwnedTomlHeader(line, opts.guide.serverName));
|
|
153
153
|
}
|
|
154
154
|
try {
|
|
155
|
-
const servers = JSON.parse(content).mcpServers;
|
|
155
|
+
const servers = JSON.parse(stripJsonBom(content)).mcpServers;
|
|
156
156
|
return typeof servers === "object" && servers !== null && opts.guide.serverName in servers;
|
|
157
157
|
} catch {
|
|
158
158
|
return false;
|
|
@@ -161,11 +161,14 @@ function isSageConnected(target, opts) {
|
|
|
161
161
|
function jsonEntry(target, launch) {
|
|
162
162
|
return target === "claude-code" ? { type: "stdio", command: launch.command, args: launch.args } : { command: launch.command, args: launch.args };
|
|
163
163
|
}
|
|
164
|
+
function stripJsonBom(content) {
|
|
165
|
+
return content.replace(/^\uFEFF/, "");
|
|
166
|
+
}
|
|
164
167
|
function parseJsonObject(content, absPath) {
|
|
165
168
|
if (content === void 0 || content.trim() === "") return {};
|
|
166
169
|
let parsed;
|
|
167
170
|
try {
|
|
168
|
-
parsed = JSON.parse(content);
|
|
171
|
+
parsed = JSON.parse(stripJsonBom(content));
|
|
169
172
|
} catch (error) {
|
|
170
173
|
throw new Error(
|
|
171
174
|
`${absPath} is not valid JSON (${toErrorMessage(error)}); fix it by hand, nothing was changed.`
|
|
@@ -325,7 +328,8 @@ function findExecutableOnPath(cmd) {
|
|
|
325
328
|
};
|
|
326
329
|
if (cmd.includes("/") || cmd.includes("\\")) return exists(cmd) ? path2.resolve(cmd) : null;
|
|
327
330
|
const suffixes = process.platform === "win32" && path2.extname(cmd) === "" ? (process.env["PATHEXT"] ?? ".COM;.EXE;.BAT;.CMD").split(";").filter(Boolean) : [""];
|
|
328
|
-
for (const
|
|
331
|
+
for (const rawDir of (process.env["PATH"] ?? "").split(path2.delimiter)) {
|
|
332
|
+
const dir = process.platform === "win32" ? rawDir.trim().replace(/^"|"$/g, "") : rawDir;
|
|
329
333
|
if (!dir) continue;
|
|
330
334
|
for (const suffix of suffixes) {
|
|
331
335
|
const candidate = path2.join(dir, cmd + suffix);
|
|
@@ -383,7 +387,7 @@ var sageCmd = async (rawArgs, deps) => {
|
|
|
383
387
|
const out = (line) => deps.renderer.write(`${line}
|
|
384
388
|
`);
|
|
385
389
|
if (sub === "sync") {
|
|
386
|
-
const { runSageHqSyncCommand } = await import("./sage-sync-
|
|
390
|
+
const { runSageHqSyncCommand } = await import("./sage-sync-PCWCNEUK.js");
|
|
387
391
|
return runSageHqSyncCommand(deps, args.includes("--restart-service"));
|
|
388
392
|
}
|
|
389
393
|
if (sub === "mcp") {
|
|
@@ -472,4 +476,4 @@ export {
|
|
|
472
476
|
findExecutableOnPath,
|
|
473
477
|
sageCmd
|
|
474
478
|
};
|
|
475
|
-
//# sourceMappingURL=sage-
|
|
479
|
+
//# sourceMappingURL=sage-BMRDJCDI.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
startCliHqConnection
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-BJH44J7G.js";
|
|
4
4
|
import "./chunk-F5DCFAKI.js";
|
|
5
5
|
|
|
6
6
|
// src/subcommands/handlers/sage-sync.ts
|
|
@@ -66,4 +66,4 @@ async function runSageHqSyncCommand(deps, restartService, signal) {
|
|
|
66
66
|
export {
|
|
67
67
|
runSageHqSyncCommand
|
|
68
68
|
};
|
|
69
|
-
//# sourceMappingURL=sage-sync-
|
|
69
|
+
//# sourceMappingURL=sage-sync-PCWCNEUK.js.map
|