@wrongstack/cli 1.0.19 → 1.0.26
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/data/providers.json +44 -0
- package/dist/{acp-INCNOH42.js → acp-LI665LO2.js} +18 -7
- package/dist/arg-parser.d.ts +1 -0
- package/dist/ascii-mode-SG4PRNLP.js +7 -0
- package/dist/{auth-YXK3EDUL.js → auth-TE55JF4Z.js} +68 -22
- package/dist/auth-menu/direct.d.ts +1 -0
- package/dist/auth-menu/local.d.ts +2 -0
- package/dist/auth-menu/oauth-menu.d.ts +3 -1
- package/dist/auth-menu/panel-service.d.ts +20 -0
- package/dist/{bench-YBU6BVQP.js → bench-GTLPM22B.js} +2 -2
- package/dist/boot/append-system-prompt.d.ts +10 -0
- package/dist/boot/ascii-mode.d.ts +12 -0
- package/dist/boot/config-backup-recovery.d.ts +2 -1
- package/dist/boot/container-wiring.d.ts +4 -2
- package/dist/boot/dispatch-singleshot.d.ts +4 -1
- package/dist/boot/dispatch-webui.d.ts +11 -0
- package/dist/boot/mcp-config-flag.d.ts +22 -0
- package/dist/boot/piped-stdin.d.ts +40 -0
- package/dist/boot/restricted-mode.d.ts +15 -0
- package/dist/boot/safe-mode.d.ts +30 -0
- package/dist/boot/short-circuit-desktop.d.ts +1 -0
- package/dist/boot/single-shot-budget.d.ts +30 -0
- package/dist/boot/stream-json.d.ts +36 -0
- package/dist/boot/structured-output.d.ts +16 -0
- package/dist/boot/system-prompt-builder.d.ts +2 -0
- package/dist/boot/tool-restriction-flags.d.ts +36 -0
- package/dist/boot/tui-project-picker-callback.d.ts +1 -1
- package/dist/boot/tui-settings-adapter.d.ts +15 -2
- package/dist/boot/worktree-sessions.d.ts +21 -0
- package/dist/{boot-auto-thin-MANHOYHE.js → boot-auto-thin-6Q56FY3F.js} +3 -2
- package/dist/boot-provider-selection.d.ts +67 -0
- package/dist/boot.d.ts +1 -38
- package/dist/{chunk-JY52HWL6.js → chunk-2EBVTYJR.js} +2 -2
- package/dist/{chunk-RDHFXOJM.js → chunk-2ERX3RPN.js} +112 -65
- package/dist/chunk-4TVYGG6G.js +62 -0
- package/dist/chunk-5JYDKG5B.js +154 -0
- package/dist/{chunk-KEPABQYT.js → chunk-5SEYGOCH.js} +8 -82
- package/dist/{chunk-3VXYY5JC.js → chunk-5UZBUV2H.js} +3 -19
- package/dist/chunk-BBHWW6LR.js +549 -0
- package/dist/chunk-BEHGRNOQ.js +58 -0
- package/dist/chunk-CZTXF6HY.js +140 -0
- package/dist/{chunk-JX6KL7OF.js → chunk-EPR42SWM.js} +39 -8
- package/dist/chunk-F5DCFAKI.js +36 -0
- package/dist/chunk-HLSHFXTO.js +97 -0
- package/dist/{chunk-CJTBLTS4.js → chunk-KJS5543T.js} +4 -3
- package/dist/{chunk-DE7BZDNK.js → chunk-KOEO4CJG.js} +27 -4
- package/dist/{chunk-SIS37L3W.js → chunk-L2RVEQWO.js} +211 -193
- package/dist/chunk-LBPLTTZ6.js +105 -0
- package/dist/chunk-LDCGZJTC.js +46 -0
- package/dist/chunk-LKPEBZBE.js +143 -0
- package/dist/chunk-LUMETJFO.js +171 -0
- package/dist/{chunk-KK2LB3ZS.js → chunk-OAVBM55Q.js} +9 -5
- package/dist/chunk-PZQBGUVZ.js +18 -0
- package/dist/{chunk-C3Z4N6A6.js → chunk-Q4INH2DG.js} +51 -3
- package/dist/chunk-R4QGL6GB.js +10 -0
- package/dist/{chunk-YLQEGYV4.js → chunk-RZ4ZDRYA.js} +14 -4
- package/dist/chunk-S4FFHDJG.js +93 -0
- package/dist/chunk-SFBFYIOW.js +271 -0
- package/dist/{chunk-RMQNCHGO.js → chunk-TI7KLHYX.js} +136 -11
- package/dist/{chunk-2ENZU66X.js → chunk-WQV2NP57.js} +5 -5
- package/dist/{chunk-B4JLSXZB.js → chunk-WSTVGC2C.js} +73 -45
- package/dist/chunk-X756ZS72.js +329 -0
- package/dist/{chunk-XJ7K67PP.js → chunk-YHYINL47.js} +63 -24
- package/dist/{chunk-2VMJ3E5Z.js → chunk-YTEOAWOJ.js} +6 -2
- package/dist/{chunk-GPPRNAKW.js → chunk-ZMX5HRLI.js} +2 -2
- package/dist/{cli-context-33F74CSZ.js → cli-context-UVGAN3NO.js} +496 -384
- package/dist/cli-entry-point.d.ts +2 -0
- package/dist/{cli-main-FNGMKPBA.js → cli-main-TN3KZ2P6.js} +3561 -2724
- package/dist/cli-update-notice.d.ts +2 -1
- package/dist/config-doctor.d.ts +10 -2
- package/dist/{config-transfer-2YF3CRTN.js → config-transfer-RUWLDCNK.js} +34 -13
- package/dist/{diag-doctor-ANPRUYFM.js → diag-doctor-BIZAFIAT.js} +2 -2
- package/dist/execute-deps.d.ts +2 -1
- package/dist/{execution-A6WJLSOC.js → execution-7QIP6GRY.js} +2384 -2055
- package/dist/fleet/host-types.d.ts +3 -1
- package/dist/goal-commands.d.ts +47 -0
- package/dist/goal-host.d.ts +1 -14
- package/dist/{hq-XQWQTRDA.js → hq-GLZ7QESM.js} +277 -261
- package/dist/hq-command-controller.d.ts +1 -1
- package/dist/{hq-server-IIBZQZU4.js → hq-server-YTKDVQPY.js} +2 -2
- package/dist/{hq-service-L5INQFM4.js → hq-service-BMMJAHRT.js} +11 -4
- package/dist/import-claude-code-32PCSIQI.js +236 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +19 -10
- package/dist/kanban-supervisor-67ECABTD.js +7 -0
- package/dist/live-settings-input.d.ts +7 -0
- package/dist/{mailbox-serve-3GFOK2I7.js → mailbox-serve-NW5VZG7R.js} +3 -3
- package/dist/{mcp-DC5WSBOO.js → mcp-LBS45HWZ.js} +4 -4
- package/dist/modeldiag-36VODVIH.js +828 -0
- package/dist/{per-subcommand-help-DHTYU524.js → per-subcommand-help-QDAQASPZ.js} +3 -3
- package/dist/permission-prompt-mirror.d.ts +1 -1
- package/dist/permission-prompt.d.ts +16 -2
- package/dist/permission-rules-view.d.ts +18 -0
- package/dist/{permissions-CFDLXETM.js → permissions-PL27UHYD.js} +67 -45
- package/dist/plugin-config.d.ts +12 -0
- package/dist/plugin-management-types.d.ts +31 -0
- package/dist/plugin-management.d.ts +2 -30
- package/dist/plugin-package-install.d.ts +3 -0
- package/dist/{plugin-usage-M6KET4OZ.js → plugin-usage-CIGOOTX3.js} +6 -5
- package/dist/{plugins-WJLW6ULV.js → plugins-HQTXUD6A.js} +6 -3
- package/dist/preflight.d.ts +1 -1
- package/dist/{projects-LMNAGGEU.js → projects-T4CZCA25.js} +3 -6
- package/dist/provider-config-utils.d.ts +1 -6
- package/dist/provider-helpers.d.ts +7 -11
- package/dist/{providers-models-LFNZ5WI7.js → providers-models-5Z2PJTEW.js} +44 -34
- package/dist/release-asset-download.d.ts +13 -0
- package/dist/release-attestation.d.ts +28 -0
- package/dist/remote/remote-session.d.ts +64 -0
- package/dist/remote/remote-target.d.ts +69 -0
- package/dist/remote-O5WXHLWV.js +561 -0
- package/dist/{replay-Z3FTJEMM.js → replay-DEI566CW.js} +2 -2
- package/dist/services/commit-message.d.ts +2 -1
- package/dist/services/dispatch-classifier.d.ts +39 -5
- package/dist/session-move-P2EC2COA.js +44 -0
- package/dist/session-move.d.ts +20 -0
- package/dist/session-stats.d.ts +10 -0
- package/dist/{sessions-config-UL45XKX7.js → sessions-config-SXTTLNXA.js} +47 -9
- package/dist/settings-menu.d.ts +2 -0
- package/dist/short-circuit-flags-74Y5N6CF.js +10 -0
- package/dist/{simpleui-dist-CXSIDAXZ.js → simpleui-dist-7BQISSEP.js} +7 -3
- package/dist/skill-suggest-L2EVWB6R.js +290 -0
- package/dist/slash-commands/command-context.d.ts +15 -5
- package/dist/slash-commands/effort.d.ts +1 -1
- package/dist/slash-commands/fallback.d.ts +1 -1
- package/dist/slash-commands/gitid.d.ts +1 -1
- package/dist/slash-commands/goal-refiner.d.ts +4 -49
- package/dist/slash-commands/jev.d.ts +4 -0
- package/dist/slash-commands/mcp.d.ts +2 -1
- package/dist/slash-commands/openai-quota.d.ts +15 -0
- package/dist/slash-commands/permissions.d.ts +4 -0
- package/dist/slash-commands/sdd-task-mutations.d.ts +4 -0
- package/dist/slash-commands/settings-context-mutations.d.ts +5 -0
- package/dist/slash-commands/settings-keys.d.ts +2 -0
- package/dist/slash-commands/settings-limits-mutations.d.ts +12 -0
- package/dist/slash-commands/settings-reset.d.ts +6 -0
- package/dist/standalone-auto-update-TOTRGCSA.js +249 -0
- package/dist/standalone-auto-update.d.ts +65 -0
- package/dist/standalone-update-LZO3MNLH.js +24 -0
- package/dist/standalone-update.d.ts +55 -0
- package/dist/subcommands/handlers/hq-alerts.d.ts +3 -0
- package/dist/subcommands/handlers/hq-audit.d.ts +46 -0
- package/dist/subcommands/handlers/hq-data-dir.d.ts +13 -0
- package/dist/subcommands/handlers/import-claude-code.d.ts +42 -0
- package/dist/subcommands/handlers/permissions.d.ts +9 -3
- package/dist/subcommands/handlers/remote.d.ts +6 -0
- package/dist/subcommands/handlers/skill-suggest.d.ts +21 -0
- package/dist/subcommands/handlers/typesafe-brain-replay.d.ts +26 -0
- package/dist/subcommands/handlers/typesafe-judgment-check.d.ts +3 -0
- package/dist/subcommands/handlers/typesafe-topic-replay.d.ts +19 -0
- package/dist/subcommands/handlers/typesafe-triage-replay.d.ts +18 -0
- package/dist/subcommands/handlers/typesafe.d.ts +23 -0
- package/dist/subcommands/handlers/version-help.d.ts +5 -0
- package/dist/{subcommands-XSLXMIDP.js → subcommands-Q6ORSB2E.js} +2 -2
- package/dist/tui-resume-callback.d.ts +18 -0
- package/dist/typesafe-U7YB2RRV.js +316 -0
- package/dist/typesafe-brain-replay-C5276FVR.js +222 -0
- package/dist/typesafe-judgment-check-GGYYV5UF.js +29 -0
- package/dist/typesafe-topic-replay-ZILIU3WS.js +234 -0
- package/dist/typesafe-triage-replay-FGAW7QM7.js +215 -0
- package/dist/{update-5DPB4YD4.js → update-TDZX4IL2.js} +4 -3
- package/dist/{update-check-BS3DHTSI.js → update-check-J5ZVKS73.js} +3 -2
- package/dist/update-check.d.ts +1 -1
- package/dist/version-JB2UAV2A.js +11 -0
- package/dist/version-help-XJJQ7YSH.js +10 -0
- package/dist/version.d.ts +3 -2
- package/dist/webui-client-observability.d.ts +7 -0
- package/dist/webui-server/route-contexts.d.ts +1 -1
- package/dist/webui-server/session-start-payload.d.ts +5 -1
- package/dist/{webui-server-MRPGTTKL.js → webui-server-YTHLRFD2.js} +577 -370
- package/dist/webui-server-lifecycle.d.ts +57 -0
- package/dist/webui-server-options.d.ts +11 -0
- package/dist/webui-server.d.ts +1 -1
- package/dist/wiring/brain-and-orchestration.d.ts +3 -1
- package/dist/wiring/cli-prompt-and-tools-setup.d.ts +9 -0
- package/dist/wiring/cli-slash-commands-setup.d.ts +1 -0
- package/dist/wiring/domain-glossary.d.ts +5 -4
- package/dist/wiring/lifecycle-plugins.d.ts +4 -2
- package/dist/wiring/metrics.d.ts +9 -1
- package/dist/wiring/pipeline.d.ts +2 -7
- package/dist/wiring/plugins.d.ts +4 -1
- package/dist/wiring/provider-persisters.d.ts +24 -0
- package/dist/wiring/provider-runtime.d.ts +9 -1
- package/dist/wiring/provider-status.d.ts +1 -0
- package/dist/wiring/provider-utility-tools.d.ts +3 -1
- package/dist/wiring/runtime-dispatch-state.d.ts +3 -1
- package/package.json +28 -28
- package/dist/chunk-2CZEORLV.js +0 -54
- package/dist/chunk-672UXYL3.js +0 -65
- package/dist/chunk-6WRKAACA.js +0 -96
- package/dist/chunk-DR2OXU46.js +0 -174
- package/dist/chunk-JACOMTIH.js +0 -275
- package/dist/chunk-XJXDOF63.js +0 -28
- package/dist/modeldiag-CJSFHZ3J.js +0 -1356
- package/dist/short-circuit-flags-7GQIGMVD.js +0 -10
- package/dist/version-help-WXI42PZ3.js +0 -10
package/dist/chunk-DR2OXU46.js
DELETED
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
// src/provider-config-utils.ts
|
|
3
|
-
import { FsError } from "@wrongstack/core/types";
|
|
4
|
-
import { expectDefined } from "@wrongstack/core/utils";
|
|
5
|
-
import * as fs from "node:fs/promises";
|
|
6
|
-
import { decryptConfigSecrets, encryptConfigSecrets } from "@wrongstack/core/security";
|
|
7
|
-
import { atomicWrite, color } from "@wrongstack/core/utils";
|
|
8
|
-
import { isSetupProvider as isSetupProviderId } from "@wrongstack/providers";
|
|
9
|
-
import { nowIso } from "@wrongstack/primitives";
|
|
10
|
-
function normalizeKeys(cfg) {
|
|
11
|
-
if (Array.isArray(cfg.apiKeys) && cfg.apiKeys.length > 0) {
|
|
12
|
-
return cfg.apiKeys.map((k) => ({ ...k }));
|
|
13
|
-
}
|
|
14
|
-
if (typeof cfg.apiKey === "string" && cfg.apiKey.length > 0) {
|
|
15
|
-
return [{ label: "default", apiKey: cfg.apiKey, createdAt: "" }];
|
|
16
|
-
}
|
|
17
|
-
return [];
|
|
18
|
-
}
|
|
19
|
-
function writeKeysBack(cfg, keys) {
|
|
20
|
-
if (keys.length === 0) {
|
|
21
|
-
delete cfg.apiKeys;
|
|
22
|
-
delete cfg.apiKey;
|
|
23
|
-
delete cfg.activeKey;
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
cfg.apiKeys = keys;
|
|
27
|
-
const active = keys.find((k) => k.label === cfg.activeKey) ?? expectDefined(keys[0]);
|
|
28
|
-
delete cfg.apiKey;
|
|
29
|
-
if (!cfg.activeKey || !keys.some((k) => k.label === cfg.activeKey)) {
|
|
30
|
-
cfg.activeKey = active.label;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
function resolveActiveApiKey(cfg) {
|
|
34
|
-
if (Array.isArray(cfg.apiKeys) && cfg.apiKeys.length > 0) {
|
|
35
|
-
const active = cfg.activeKey ? cfg.apiKeys.find((k) => k.label === cfg.activeKey) : void 0;
|
|
36
|
-
return (active ?? cfg.apiKeys[0])?.apiKey;
|
|
37
|
-
}
|
|
38
|
-
return cfg.apiKey && cfg.apiKey.length > 0 ? cfg.apiKey : void 0;
|
|
39
|
-
}
|
|
40
|
-
function isLoopbackBaseUrl(baseUrl) {
|
|
41
|
-
if (!baseUrl) return false;
|
|
42
|
-
try {
|
|
43
|
-
let host = new URL(baseUrl).hostname.toLowerCase();
|
|
44
|
-
host = host.replace(/^\[|\]$/g, "");
|
|
45
|
-
return host === "localhost" || host === "::1" || host === "0.0.0.0" || /^127\./.test(host);
|
|
46
|
-
} catch {
|
|
47
|
-
return false;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
function providerCanRunWithoutSavedKey(cfg) {
|
|
51
|
-
return isLoopbackBaseUrl(cfg.baseUrl) && (!cfg.envVars || cfg.envVars.length === 0);
|
|
52
|
-
}
|
|
53
|
-
function hasUsableSavedProvider(cfg) {
|
|
54
|
-
return resolveActiveApiKey(cfg) !== void 0 || providerCanRunWithoutSavedKey(cfg);
|
|
55
|
-
}
|
|
56
|
-
function clearStaleProviderDefaults(config) {
|
|
57
|
-
const providerId = typeof config["provider"] === "string" ? config["provider"] : void 0;
|
|
58
|
-
if (!providerId) return;
|
|
59
|
-
const providers = config["providers"];
|
|
60
|
-
if (isSetupProviderId(providerId)) {
|
|
61
|
-
delete config["provider"];
|
|
62
|
-
delete config["model"];
|
|
63
|
-
if (providers) delete providers[providerId];
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
const provider = providers?.[providerId];
|
|
67
|
-
if (!provider || !hasUsableSavedProvider(provider)) {
|
|
68
|
-
delete config["provider"];
|
|
69
|
-
delete config["model"];
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
const modelId = typeof config["model"] === "string" ? config["model"] : void 0;
|
|
73
|
-
if (modelId && Array.isArray(provider.models) && provider.models.length > 0 && !provider.models.includes(modelId)) {
|
|
74
|
-
delete config["model"];
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
function activeLabel(cfg, keys) {
|
|
78
|
-
if (cfg.activeKey && keys.some((k) => k.label === cfg.activeKey)) return cfg.activeKey;
|
|
79
|
-
return keys[0]?.label;
|
|
80
|
-
}
|
|
81
|
-
function maskedKey(key) {
|
|
82
|
-
if (!key) return color.dim("\u2014");
|
|
83
|
-
if (key.length <= 8) return color.dim("\u2022".repeat(key.length));
|
|
84
|
-
const head = key.slice(0, 4);
|
|
85
|
-
const tail = key.slice(-4);
|
|
86
|
-
return `${color.dim(head + "\u2026")}${tail}`;
|
|
87
|
-
}
|
|
88
|
-
async function loadConfigProviders(configPath, vault, opts) {
|
|
89
|
-
const warn = opts?.warn;
|
|
90
|
-
const targetPath = opts?.profileConfigPath ?? configPath;
|
|
91
|
-
let raw;
|
|
92
|
-
try {
|
|
93
|
-
raw = await fs.readFile(targetPath, "utf8");
|
|
94
|
-
} catch (err) {
|
|
95
|
-
if (err.code !== "ENOENT") {
|
|
96
|
-
warn?.(`Could not read ${targetPath}: ${err.message}. Treating as empty.`);
|
|
97
|
-
}
|
|
98
|
-
return {};
|
|
99
|
-
}
|
|
100
|
-
let parsed;
|
|
101
|
-
try {
|
|
102
|
-
parsed = JSON.parse(raw);
|
|
103
|
-
} catch (err) {
|
|
104
|
-
warn?.(`Config at ${targetPath} is not valid JSON: ${err.message}`);
|
|
105
|
-
return {};
|
|
106
|
-
}
|
|
107
|
-
const decrypted = decryptConfigSecrets(parsed, vault);
|
|
108
|
-
return decrypted.providers ?? {};
|
|
109
|
-
}
|
|
110
|
-
var configMutationChain = Promise.resolve();
|
|
111
|
-
function queueConfigMutation(mutate) {
|
|
112
|
-
const run = configMutationChain.then(mutate, mutate);
|
|
113
|
-
configMutationChain = run.then(
|
|
114
|
-
() => void 0,
|
|
115
|
-
() => void 0
|
|
116
|
-
);
|
|
117
|
-
return run;
|
|
118
|
-
}
|
|
119
|
-
async function mutateConfigProviders(configPath, vault, mutator, profileConfigPath) {
|
|
120
|
-
await queueConfigMutation(async () => {
|
|
121
|
-
const targetPath = profileConfigPath ?? configPath;
|
|
122
|
-
let raw;
|
|
123
|
-
let fileExists = true;
|
|
124
|
-
try {
|
|
125
|
-
raw = await fs.readFile(targetPath, "utf8");
|
|
126
|
-
} catch (err) {
|
|
127
|
-
if (err.code !== "ENOENT") {
|
|
128
|
-
throw new FsError({
|
|
129
|
-
message: `Refusing to mutate ${configPath}: ${err.message}`,
|
|
130
|
-
code: "FS_READ_FAILED",
|
|
131
|
-
path: targetPath,
|
|
132
|
-
context: { operation: "mutateConfigProviders", phase: "read" },
|
|
133
|
-
cause: err
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
fileExists = false;
|
|
137
|
-
raw = "{}";
|
|
138
|
-
}
|
|
139
|
-
let parsed;
|
|
140
|
-
try {
|
|
141
|
-
parsed = JSON.parse(raw);
|
|
142
|
-
} catch (err) {
|
|
143
|
-
if (fileExists) {
|
|
144
|
-
throw new FsError({
|
|
145
|
-
message: `Refusing to overwrite corrupt config at ${targetPath} (${err.message}). Fix or move the file aside before retrying.`,
|
|
146
|
-
code: "FS_READ_FAILED",
|
|
147
|
-
path: targetPath,
|
|
148
|
-
context: { operation: "mutateConfigProviders", phase: "parse" },
|
|
149
|
-
cause: err
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
parsed = {};
|
|
153
|
-
}
|
|
154
|
-
const decrypted = decryptConfigSecrets(parsed, vault);
|
|
155
|
-
const providers = decrypted.providers ?? {};
|
|
156
|
-
mutator(providers, decrypted);
|
|
157
|
-
decrypted.providers = providers;
|
|
158
|
-
clearStaleProviderDefaults(decrypted);
|
|
159
|
-
const encrypted = encryptConfigSecrets(decrypted, vault);
|
|
160
|
-
await atomicWrite(targetPath, JSON.stringify(encrypted, null, 2), { mode: 384 });
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
export {
|
|
165
|
-
normalizeKeys,
|
|
166
|
-
writeKeysBack,
|
|
167
|
-
resolveActiveApiKey,
|
|
168
|
-
activeLabel,
|
|
169
|
-
maskedKey,
|
|
170
|
-
loadConfigProviders,
|
|
171
|
-
mutateConfigProviders,
|
|
172
|
-
nowIso
|
|
173
|
-
};
|
|
174
|
-
//# sourceMappingURL=chunk-DR2OXU46.js.map
|
package/dist/chunk-JACOMTIH.js
DELETED
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
// src/settings-menu.ts
|
|
3
|
-
import * as fs from "node:fs/promises";
|
|
4
|
-
import * as path from "node:path";
|
|
5
|
-
import { decryptConfigSecrets, encryptConfigSecrets } from "@wrongstack/core/security";
|
|
6
|
-
import { ConfigError, ERROR_CODES, FsError } from "@wrongstack/core/types";
|
|
7
|
-
import { atomicWrite, deepMerge } from "@wrongstack/core/utils";
|
|
8
|
-
function resolvePersistPath(deps) {
|
|
9
|
-
if (deps.forceGlobal) return deps.profileConfigPath;
|
|
10
|
-
const scope = deps.configStore.get().configScope;
|
|
11
|
-
if (scope === "project" && deps.inProjectConfigPath) {
|
|
12
|
-
return deps.inProjectConfigPath;
|
|
13
|
-
}
|
|
14
|
-
return deps.profileConfigPath;
|
|
15
|
-
}
|
|
16
|
-
function resolveActualTarget(deps, decrypted, fallbackPath) {
|
|
17
|
-
if (deps.forceGlobal) return deps.profileConfigPath;
|
|
18
|
-
const newScope = decrypted.configScope;
|
|
19
|
-
const newProfileName = decrypted.activeProfile;
|
|
20
|
-
const effectiveProfilePath = newProfileName && deps.resolveProfilePath ? deps.resolveProfilePath(newProfileName) : deps.profileConfigPath;
|
|
21
|
-
if (newScope === "project" && deps.inProjectConfigPath) {
|
|
22
|
-
return deps.inProjectConfigPath;
|
|
23
|
-
}
|
|
24
|
-
if (newScope === "global") {
|
|
25
|
-
return effectiveProfilePath;
|
|
26
|
-
}
|
|
27
|
-
return fallbackPath;
|
|
28
|
-
}
|
|
29
|
-
function isProfileOrGlobalTarget(actualTarget, deps) {
|
|
30
|
-
return actualTarget === deps.profileConfigPath;
|
|
31
|
-
}
|
|
32
|
-
async function ensureProjectDir(filePath) {
|
|
33
|
-
const dir = path.dirname(filePath);
|
|
34
|
-
try {
|
|
35
|
-
await fs.mkdir(dir, { recursive: true });
|
|
36
|
-
} catch {
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
async function mergeWithDestinationIfExists(destPath, source, vault) {
|
|
40
|
-
let destRaw;
|
|
41
|
-
try {
|
|
42
|
-
destRaw = await fs.readFile(destPath, "utf8");
|
|
43
|
-
} catch (err) {
|
|
44
|
-
if (err.code === "ENOENT") {
|
|
45
|
-
return source;
|
|
46
|
-
}
|
|
47
|
-
throw err;
|
|
48
|
-
}
|
|
49
|
-
let destParsed;
|
|
50
|
-
try {
|
|
51
|
-
destParsed = JSON.parse(destRaw);
|
|
52
|
-
} catch (err) {
|
|
53
|
-
process.stderr.write(
|
|
54
|
-
JSON.stringify({
|
|
55
|
-
level: "warn",
|
|
56
|
-
event: "settings_menu_merge_skipped",
|
|
57
|
-
message: `Skipping merge into corrupt destination file: ${destPath}`,
|
|
58
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
59
|
-
}) + "\n"
|
|
60
|
-
);
|
|
61
|
-
void err;
|
|
62
|
-
return source;
|
|
63
|
-
}
|
|
64
|
-
const destDecrypted = decryptConfigSecrets(destParsed, vault);
|
|
65
|
-
return deepMerge(destDecrypted, source);
|
|
66
|
-
}
|
|
67
|
-
var PROJECT_SAFE_FIELDS = /* @__PURE__ */ new Set([
|
|
68
|
-
"provider",
|
|
69
|
-
"model",
|
|
70
|
-
"fallbackModels",
|
|
71
|
-
"fallbackBridge",
|
|
72
|
-
// Kept in sync with core's IN_PROJECT_ALLOWED_KEYS (config-loader.ts): these
|
|
73
|
-
// model-routing prefs are explicitly safe to READ from a per-project config,
|
|
74
|
-
// so the writer must not strip them — otherwise a scope=project /fallback
|
|
75
|
-
// profile/fav write (or a TUI full-config write under project scope) would be
|
|
76
|
-
// silently dropped while the loader would happily accept them on next boot.
|
|
77
|
-
"fallbackProfiles",
|
|
78
|
-
"favoriteModels",
|
|
79
|
-
"favoriteModelsOnly",
|
|
80
|
-
"modelAvailabilitySchedule",
|
|
81
|
-
"fallbackAuto",
|
|
82
|
-
"models",
|
|
83
|
-
"modelMatrix",
|
|
84
|
-
"maxConcurrent",
|
|
85
|
-
"autonomy",
|
|
86
|
-
"hints",
|
|
87
|
-
"nextPrediction",
|
|
88
|
-
"debugStream",
|
|
89
|
-
"configScope",
|
|
90
|
-
"yolo",
|
|
91
|
-
"features",
|
|
92
|
-
"context",
|
|
93
|
-
"log",
|
|
94
|
-
"session",
|
|
95
|
-
"indexing",
|
|
96
|
-
"tools",
|
|
97
|
-
"launch",
|
|
98
|
-
"circuitBreaker",
|
|
99
|
-
"adaptiveConcurrency",
|
|
100
|
-
"modelRuntime",
|
|
101
|
-
"Sage"
|
|
102
|
-
]);
|
|
103
|
-
function filterSafeForProject(cfg) {
|
|
104
|
-
const out = {};
|
|
105
|
-
for (const [key, value] of Object.entries(cfg)) {
|
|
106
|
-
if (PROJECT_SAFE_FIELDS.has(key)) {
|
|
107
|
-
out[key] = value;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
return out;
|
|
111
|
-
}
|
|
112
|
-
async function persistAutonomySetting(deps, mutator) {
|
|
113
|
-
const targetPath = resolvePersistPath(deps);
|
|
114
|
-
await ensureProjectDir(targetPath);
|
|
115
|
-
let raw;
|
|
116
|
-
let fileExists = true;
|
|
117
|
-
try {
|
|
118
|
-
raw = await fs.readFile(targetPath, "utf8");
|
|
119
|
-
} catch (err) {
|
|
120
|
-
if (err.code !== "ENOENT") {
|
|
121
|
-
throw new FsError({
|
|
122
|
-
message: `Could not read ${targetPath}`,
|
|
123
|
-
code: ERROR_CODES.FS_READ_FAILED,
|
|
124
|
-
path: targetPath,
|
|
125
|
-
cause: err
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
fileExists = false;
|
|
129
|
-
raw = "{}";
|
|
130
|
-
}
|
|
131
|
-
let parsed;
|
|
132
|
-
try {
|
|
133
|
-
parsed = JSON.parse(raw);
|
|
134
|
-
} catch (err) {
|
|
135
|
-
if (fileExists) {
|
|
136
|
-
throw new ConfigError({
|
|
137
|
-
message: `Config at ${targetPath} is not valid JSON`,
|
|
138
|
-
code: ERROR_CODES.CONFIG_PARSE_FAILED,
|
|
139
|
-
context: { path: targetPath },
|
|
140
|
-
cause: err
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
parsed = {};
|
|
144
|
-
}
|
|
145
|
-
const decrypted = decryptConfigSecrets(parsed, deps.vault);
|
|
146
|
-
const autonomy = decrypted.autonomy ?? {};
|
|
147
|
-
mutator(
|
|
148
|
-
autonomy
|
|
149
|
-
);
|
|
150
|
-
decrypted.autonomy = autonomy;
|
|
151
|
-
const actualTarget = resolveActualTarget(deps, decrypted, targetPath);
|
|
152
|
-
if (actualTarget !== targetPath) {
|
|
153
|
-
await ensureProjectDir(actualTarget);
|
|
154
|
-
}
|
|
155
|
-
const effectiveConfig = actualTarget !== targetPath ? await mergeWithDestinationIfExists(actualTarget, decrypted, deps.vault) : decrypted;
|
|
156
|
-
const toWrite = isProfileOrGlobalTarget(actualTarget, deps) ? effectiveConfig : filterSafeForProject(effectiveConfig);
|
|
157
|
-
const encrypted = encryptConfigSecrets(toWrite, deps.vault);
|
|
158
|
-
await atomicWrite(actualTarget, JSON.stringify(encrypted, null, 2), { mode: 384 });
|
|
159
|
-
deps.configStore.update({
|
|
160
|
-
autonomy: decrypted.autonomy
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
async function persistConfigSetting(deps, mutator) {
|
|
164
|
-
const targetPath = resolvePersistPath(deps);
|
|
165
|
-
await ensureProjectDir(targetPath);
|
|
166
|
-
let raw;
|
|
167
|
-
let fileExists = true;
|
|
168
|
-
try {
|
|
169
|
-
raw = await fs.readFile(targetPath, "utf8");
|
|
170
|
-
} catch (err) {
|
|
171
|
-
if (err.code !== "ENOENT") {
|
|
172
|
-
throw new FsError({
|
|
173
|
-
message: `Could not read ${targetPath}`,
|
|
174
|
-
code: ERROR_CODES.FS_READ_FAILED,
|
|
175
|
-
path: targetPath,
|
|
176
|
-
cause: err
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
fileExists = false;
|
|
180
|
-
raw = "{}";
|
|
181
|
-
}
|
|
182
|
-
let parsed;
|
|
183
|
-
try {
|
|
184
|
-
parsed = JSON.parse(raw);
|
|
185
|
-
} catch (err) {
|
|
186
|
-
if (fileExists) {
|
|
187
|
-
throw new ConfigError({
|
|
188
|
-
message: `Config at ${targetPath} is not valid JSON`,
|
|
189
|
-
code: ERROR_CODES.CONFIG_PARSE_FAILED,
|
|
190
|
-
context: { path: targetPath },
|
|
191
|
-
cause: err
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
parsed = {};
|
|
195
|
-
}
|
|
196
|
-
const decrypted = decryptConfigSecrets(parsed, deps.vault);
|
|
197
|
-
mutator(decrypted);
|
|
198
|
-
const actualTarget = resolveActualTarget(deps, decrypted, targetPath);
|
|
199
|
-
if (actualTarget !== targetPath) {
|
|
200
|
-
await ensureProjectDir(actualTarget);
|
|
201
|
-
}
|
|
202
|
-
const effectiveConfig = actualTarget !== targetPath ? await mergeWithDestinationIfExists(actualTarget, decrypted, deps.vault) : decrypted;
|
|
203
|
-
const toWrite = isProfileOrGlobalTarget(actualTarget, deps) ? effectiveConfig : filterSafeForProject(effectiveConfig);
|
|
204
|
-
const encrypted = encryptConfigSecrets(toWrite, deps.vault);
|
|
205
|
-
await atomicWrite(actualTarget, JSON.stringify(encrypted, null, 2), { mode: 384 });
|
|
206
|
-
deps.configStore.update(decrypted);
|
|
207
|
-
}
|
|
208
|
-
async function persistTelegramConfig(deps, mutator) {
|
|
209
|
-
const targetPath = deps.profileConfigPath;
|
|
210
|
-
let raw;
|
|
211
|
-
let fileExists = true;
|
|
212
|
-
try {
|
|
213
|
-
raw = await fs.readFile(targetPath, "utf8");
|
|
214
|
-
} catch (err) {
|
|
215
|
-
if (err.code !== "ENOENT") {
|
|
216
|
-
throw new FsError({
|
|
217
|
-
message: `Could not read ${targetPath}: ${err.message}`,
|
|
218
|
-
code: "FS_READ_FAILED",
|
|
219
|
-
path: targetPath,
|
|
220
|
-
context: { operation: "readGlobalConfig", phase: "read" },
|
|
221
|
-
cause: err
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
fileExists = false;
|
|
225
|
-
raw = "{}";
|
|
226
|
-
}
|
|
227
|
-
let parsed;
|
|
228
|
-
try {
|
|
229
|
-
parsed = JSON.parse(raw);
|
|
230
|
-
} catch (err) {
|
|
231
|
-
if (fileExists) {
|
|
232
|
-
throw new ConfigError({
|
|
233
|
-
message: `Config at ${targetPath} is not valid JSON: ${err.message}`,
|
|
234
|
-
code: "CONFIG_PARSE_FAILED",
|
|
235
|
-
context: { filePath: targetPath, operation: "readProfileConfig" },
|
|
236
|
-
cause: err
|
|
237
|
-
});
|
|
238
|
-
}
|
|
239
|
-
parsed = {};
|
|
240
|
-
}
|
|
241
|
-
const decrypted = decryptConfigSecrets(parsed, deps.vault);
|
|
242
|
-
const extensions = decrypted.extensions ?? {};
|
|
243
|
-
const telegram = extensions.telegram ?? {};
|
|
244
|
-
mutator(telegram);
|
|
245
|
-
extensions.telegram = telegram;
|
|
246
|
-
decrypted.extensions = extensions;
|
|
247
|
-
const encrypted = encryptConfigSecrets(decrypted, deps.vault);
|
|
248
|
-
await atomicWrite(targetPath, JSON.stringify(encrypted, null, 2), { mode: 384 });
|
|
249
|
-
await deps.vault.flushHardening?.();
|
|
250
|
-
deps.configStore.update({
|
|
251
|
-
extensions
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
|
-
function deriveFsAccessPair(input) {
|
|
255
|
-
if (input.allowOutsideProjectRoot !== void 0) {
|
|
256
|
-
const allow = input.allowOutsideProjectRoot;
|
|
257
|
-
return { allowOutsideProjectRoot: allow, restrictToProjectRoot: !allow };
|
|
258
|
-
}
|
|
259
|
-
if (input.restrictFsToRoot !== void 0) {
|
|
260
|
-
const restrict = input.restrictFsToRoot;
|
|
261
|
-
return { allowOutsideProjectRoot: !restrict, restrictToProjectRoot: restrict };
|
|
262
|
-
}
|
|
263
|
-
return void 0;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
export {
|
|
267
|
-
resolvePersistPath,
|
|
268
|
-
resolveActualTarget,
|
|
269
|
-
filterSafeForProject,
|
|
270
|
-
persistAutonomySetting,
|
|
271
|
-
persistConfigSetting,
|
|
272
|
-
persistTelegramConfig,
|
|
273
|
-
deriveFsAccessPair
|
|
274
|
-
};
|
|
275
|
-
//# sourceMappingURL=chunk-JACOMTIH.js.map
|
package/dist/chunk-XJXDOF63.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
// src/version.ts
|
|
3
|
-
import { createRequire } from "node:module";
|
|
4
|
-
var req = createRequire(import.meta.url);
|
|
5
|
-
function readOwnVersion() {
|
|
6
|
-
const candidates = ["../package.json", "../../package.json"];
|
|
7
|
-
for (const rel of candidates) {
|
|
8
|
-
try {
|
|
9
|
-
const pkg = req(rel);
|
|
10
|
-
if (typeof pkg.version === "string" && pkg.version.length > 0) return pkg.version;
|
|
11
|
-
} catch {
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
return "dev";
|
|
15
|
-
}
|
|
16
|
-
var CLI_VERSION = readOwnVersion();
|
|
17
|
-
var API_VERSION = "0.0.0";
|
|
18
|
-
try {
|
|
19
|
-
const corePkg = req("@wrongstack/core/package.json");
|
|
20
|
-
if (corePkg.wrongstackApiVersion) API_VERSION = corePkg.wrongstackApiVersion;
|
|
21
|
-
} catch {
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export {
|
|
25
|
-
CLI_VERSION,
|
|
26
|
-
API_VERSION
|
|
27
|
-
};
|
|
28
|
-
//# sourceMappingURL=chunk-XJXDOF63.js.map
|