@poolzin/pool-bot 2026.4.39 → 2026.4.41

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.
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2026.4.39",
3
- "commit": "2ad61e6591b10f1337044aba4b549dc434af2593",
4
- "builtAt": "2026-04-07T18:45:57.845Z"
2
+ "version": "2026.4.41",
3
+ "commit": "258285674de27bd59e66926b547cb27a311ff6a4",
4
+ "builtAt": "2026-04-08T01:55:26.000Z"
5
5
  }
@@ -1 +1 @@
1
- {"version":3,"file":"models-cli.d.ts","sourceRoot":"","sources":["../../src/cli/models-cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqCzC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,QAgYjD"}
1
+ {"version":3,"file":"models-cli.d.ts","sourceRoot":"","sources":["../../src/cli/models-cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6CzC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,QAwdjD"}
@@ -1,4 +1,4 @@
1
- import { githubCopilotLoginCommand, modelsAliasesAddCommand, modelsAliasesListCommand, modelsAliasesRemoveCommand, modelsAuthAddCommand, modelsAuthLoginCommand, modelsAuthOrderClearCommand, modelsAuthOrderGetCommand, modelsAuthOrderSetCommand, modelsAuthPasteTokenCommand, modelsAuthSetupTokenCommand, modelsFallbacksAddCommand, modelsFallbacksClearCommand, modelsFallbacksListCommand, modelsFallbacksRemoveCommand, modelsImageFallbacksAddCommand, modelsImageFallbacksClearCommand, modelsImageFallbacksListCommand, modelsImageFallbacksRemoveCommand, modelsListCommand, modelsScanCommand, modelsSetCommand, modelsSetImageCommand, modelsStatusCommand, } from "../commands/models.js";
1
+ import { githubCopilotLoginCommand, modelsAliasesAddCommand, modelsAliasesListCommand, modelsAliasesRemoveCommand, modelsAuthAddCommand, modelsAuthLoginCommand, modelsAuthOrderClearCommand, modelsAuthOrderGetCommand, modelsAuthOrderSetCommand, modelsAuthPasteTokenCommand, modelsAuthSetupTokenCommand, modelsFallbacksAddCommand, modelsFallbacksClearCommand, modelsFallbacksListCommand, modelsFallbacksRemoveCommand, modelsImageFallbacksAddCommand, modelsImageFallbacksClearCommand, modelsImageFallbacksListCommand, modelsImageFallbacksRemoveCommand, modelsListCommand, modelsMusicFallbacksAddCommand, modelsMusicFallbacksClearCommand, modelsMusicFallbacksListCommand, modelsMusicFallbacksRemoveCommand, modelsScanCommand, modelsSetCommand, modelsSetImageCommand, modelsStatusCommand, modelsVideoFallbacksAddCommand, modelsVideoFallbacksClearCommand, modelsVideoFallbacksListCommand, modelsVideoFallbacksRemoveCommand, } from "../commands/models.js";
2
2
  import { defaultRuntime } from "../runtime.js";
3
3
  import { formatDocsLink } from "../terminal/links.js";
4
4
  import { theme } from "../terminal/theme.js";
@@ -181,6 +181,84 @@ export function registerModelsCli(program) {
181
181
  await modelsImageFallbacksClearCommand(defaultRuntime);
182
182
  });
183
183
  });
184
+ const videoFallbacks = models
185
+ .command("video-fallbacks")
186
+ .description("Manage video generation model fallback list");
187
+ videoFallbacks
188
+ .command("list")
189
+ .description("List video fallback models")
190
+ .option("--json", "Output JSON", false)
191
+ .option("--plain", "Plain output", false)
192
+ .action(async (opts) => {
193
+ await runModelsCommand(async () => {
194
+ await modelsVideoFallbacksListCommand(opts, defaultRuntime);
195
+ });
196
+ });
197
+ videoFallbacks
198
+ .command("add")
199
+ .description("Add a video fallback model")
200
+ .argument("<model>", "Model id or alias")
201
+ .action(async (model) => {
202
+ await runModelsCommand(async () => {
203
+ await modelsVideoFallbacksAddCommand(model, defaultRuntime);
204
+ });
205
+ });
206
+ videoFallbacks
207
+ .command("remove")
208
+ .description("Remove a video fallback model")
209
+ .argument("<model>", "Model id or alias")
210
+ .action(async (model) => {
211
+ await runModelsCommand(async () => {
212
+ await modelsVideoFallbacksRemoveCommand(model, defaultRuntime);
213
+ });
214
+ });
215
+ videoFallbacks
216
+ .command("clear")
217
+ .description("Clear all video fallback models")
218
+ .action(async () => {
219
+ await runModelsCommand(async () => {
220
+ await modelsVideoFallbacksClearCommand(defaultRuntime);
221
+ });
222
+ });
223
+ const musicFallbacks = models
224
+ .command("music-fallbacks")
225
+ .description("Manage music generation model fallback list");
226
+ musicFallbacks
227
+ .command("list")
228
+ .description("List music fallback models")
229
+ .option("--json", "Output JSON", false)
230
+ .option("--plain", "Plain output", false)
231
+ .action(async (opts) => {
232
+ await runModelsCommand(async () => {
233
+ await modelsMusicFallbacksListCommand(opts, defaultRuntime);
234
+ });
235
+ });
236
+ musicFallbacks
237
+ .command("add")
238
+ .description("Add a music fallback model")
239
+ .argument("<model>", "Model id or alias")
240
+ .action(async (model) => {
241
+ await runModelsCommand(async () => {
242
+ await modelsMusicFallbacksAddCommand(model, defaultRuntime);
243
+ });
244
+ });
245
+ musicFallbacks
246
+ .command("remove")
247
+ .description("Remove a music fallback model")
248
+ .argument("<model>", "Model id or alias")
249
+ .action(async (model) => {
250
+ await runModelsCommand(async () => {
251
+ await modelsMusicFallbacksRemoveCommand(model, defaultRuntime);
252
+ });
253
+ });
254
+ musicFallbacks
255
+ .command("clear")
256
+ .description("Clear all music fallback models")
257
+ .action(async () => {
258
+ await runModelsCommand(async () => {
259
+ await modelsMusicFallbacksClearCommand(defaultRuntime);
260
+ });
261
+ });
184
262
  models
185
263
  .command("scan")
186
264
  .description("Scan OpenRouter free models for tools + images")
@@ -1 +1 @@
1
- {"version":3,"file":"register.subclis.d.ts","sourceRoot":"","sources":["../../../src/cli/program/register.subclis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,KAAK,eAAe,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAElE,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,eAAe,CAAC;CAC3B,CAAC;AAuSF,wBAAgB,gBAAgB,IAAI,WAAW,EAAE,CAEhD;AAED,wBAAgB,gCAAgC,IAAI,MAAM,EAAE,CAE3D;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ3F;AAaD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,GAAE,MAAM,EAAiB,QAkBrF"}
1
+ {"version":3,"file":"register.subclis.d.ts","sourceRoot":"","sources":["../../../src/cli/program/register.subclis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,KAAK,eAAe,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAElE,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,eAAe,CAAC;CAC3B,CAAC;AAgTF,wBAAgB,gBAAgB,IAAI,WAAW,EAAE,CAEhD;AAED,wBAAgB,gCAAgC,IAAI,MAAM,EAAE,CAE3D;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ3F;AAaD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,GAAE,MAAM,EAAiB,QAkBrF"}
@@ -272,6 +272,15 @@ const entries = [
272
272
  mod.registerMCPCli(program);
273
273
  },
274
274
  },
275
+ {
276
+ name: "secret",
277
+ description: "Manage secrets and credentials securely",
278
+ hasSubcommands: true,
279
+ register: async (program) => {
280
+ const mod = await import("../secret-cli.js");
281
+ mod.registerSecretCli(program);
282
+ },
283
+ },
275
284
  {
276
285
  name: "completion",
277
286
  description: "Generate shell completion script",
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Secret Management CLI
3
+ *
4
+ * Securely manage API keys, tokens, and credentials.
5
+ * Integrates with 1Password skill for secure storage.
6
+ *
7
+ * Usage:
8
+ * poolbot secret get <name> # Get a secret (masked)
9
+ * poolbot secret set <name> # Set a secret (interactive)
10
+ * poolbot secret rotate <name> # Rotate a secret
11
+ * poolbot secret validate <name> # Validate a secret format
12
+ * poolbot secret list # List all stored secrets
13
+ */
14
+ import type { Command } from "commander";
15
+ export declare function registerSecretCli(program: Command): void;
16
+ //# sourceMappingURL=secret-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-cli.d.ts","sourceRoot":"","sources":["../../src/cli/secret-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsFzC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,QAwVjD"}
@@ -0,0 +1,378 @@
1
+ /**
2
+ * Secret Management CLI
3
+ *
4
+ * Securely manage API keys, tokens, and credentials.
5
+ * Integrates with 1Password skill for secure storage.
6
+ *
7
+ * Usage:
8
+ * poolbot secret get <name> # Get a secret (masked)
9
+ * poolbot secret set <name> # Set a secret (interactive)
10
+ * poolbot secret rotate <name> # Rotate a secret
11
+ * poolbot secret validate <name> # Validate a secret format
12
+ * poolbot secret list # List all stored secrets
13
+ */
14
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
15
+ import { join, dirname } from "node:path";
16
+ import { createHash } from "node:crypto";
17
+ import { defaultRuntime } from "../runtime.js";
18
+ import { theme } from "../terminal/theme.js";
19
+ import { danger, info, success } from "../globals.js";
20
+ import { CONFIG_DIR } from "../utils.js";
21
+ const SECRET_STORE_VERSION = 1;
22
+ const SECRET_STORE_PATH = join(CONFIG_DIR, "secrets.json");
23
+ function getSecretStorePath() {
24
+ return process.env.POOLBOT_SECRET_STORE ?? SECRET_STORE_PATH;
25
+ }
26
+ function loadSecretStore() {
27
+ const path = getSecretStorePath();
28
+ if (!existsSync(path)) {
29
+ return { version: SECRET_STORE_VERSION, secrets: {} };
30
+ }
31
+ try {
32
+ const content = readFileSync(path, "utf-8");
33
+ return JSON.parse(content);
34
+ }
35
+ catch {
36
+ return { version: SECRET_STORE_VERSION, secrets: {} };
37
+ }
38
+ }
39
+ function saveSecretStore(store) {
40
+ const path = getSecretStorePath();
41
+ const dir = dirname(path);
42
+ if (!existsSync(dir)) {
43
+ mkdirSync(dir, { recursive: true });
44
+ }
45
+ writeFileSync(path, JSON.stringify(store, null, 2) + "\n", { mode: 0o600 });
46
+ }
47
+ function hashSecret(value) {
48
+ return createHash("sha256").update(value).digest("hex");
49
+ }
50
+ function maskSecret(value) {
51
+ if (value.length <= 4)
52
+ return "****";
53
+ const visible = Math.max(2, Math.floor(value.length * 0.2));
54
+ return value.substring(0, visible) + "…";
55
+ }
56
+ function validateSecretName(name) {
57
+ if (!name || name.trim().length === 0) {
58
+ return "Secret name cannot be empty";
59
+ }
60
+ if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(name)) {
61
+ return "Secret name must start with a letter and contain only letters, numbers, underscores, or hyphens";
62
+ }
63
+ if (name.length > 64) {
64
+ return "Secret name must be 64 characters or less";
65
+ }
66
+ return null;
67
+ }
68
+ function validateSecretValue(value, _type) {
69
+ if (!value || value.trim().length === 0) {
70
+ return "Secret value cannot be empty";
71
+ }
72
+ if (value.length < 8) {
73
+ return "Secret value must be at least 8 characters";
74
+ }
75
+ return null;
76
+ }
77
+ export function registerSecretCli(program) {
78
+ const secret = program
79
+ .command("secret")
80
+ .description("Manage secrets and credentials securely")
81
+ .addHelpText("after", () => `\n${theme.muted("Security:")} Secrets are stored locally with SHA-256 hashes.\n` +
82
+ `${theme.muted("Tip:")} Use 1Password skill for production: ${theme.heading("poolbot skill use 1password")}\n`);
83
+ // secret list
84
+ secret
85
+ .command("list")
86
+ .description("List all stored secrets (names only, values masked)")
87
+ .option("--json", "Output JSON", false)
88
+ .action(async (opts) => {
89
+ const store = loadSecretStore();
90
+ const entries = Object.values(store.secrets);
91
+ if (opts.json) {
92
+ const output = entries.map((e) => ({
93
+ name: e.name,
94
+ type: e.type,
95
+ provider: e.provider,
96
+ createdAt: new Date(e.createdAt).toISOString(),
97
+ updatedAt: new Date(e.updatedAt).toISOString(),
98
+ expiresAt: e.expiresAt ? new Date(e.expiresAt).toISOString() : null,
99
+ }));
100
+ defaultRuntime.log(JSON.stringify(output, null, 2));
101
+ return;
102
+ }
103
+ defaultRuntime.log("");
104
+ defaultRuntime.log(theme.heading("Stored Secrets"));
105
+ defaultRuntime.log(theme.muted("─────────────────────────────────────────"));
106
+ if (entries.length === 0) {
107
+ defaultRuntime.log(info("No secrets stored. Use 'poolbot secret set <name>' to add one."));
108
+ }
109
+ else {
110
+ for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
111
+ const expires = entry.expiresAt
112
+ ? new Date(entry.expiresAt).toISOString().split("T")[0]
113
+ : "never";
114
+ defaultRuntime.log(` ${theme.success("●")} ${entry.name} (${entry.type})${entry.provider ? ` [${entry.provider}]` : ""} - expires: ${expires}`);
115
+ }
116
+ }
117
+ defaultRuntime.log("");
118
+ defaultRuntime.log(theme.muted(`Total: ${entries.length} secrets`));
119
+ });
120
+ // secret get
121
+ secret
122
+ .command("get <name>")
123
+ .description("Get a secret value (masked by default)")
124
+ .option("--reveal", "Show full value (use with caution)", false)
125
+ .option("--json", "Output JSON", false)
126
+ .action(async (name, opts) => {
127
+ const validationError = validateSecretName(name);
128
+ if (validationError) {
129
+ defaultRuntime.log(danger(validationError));
130
+ defaultRuntime.exit(1);
131
+ return;
132
+ }
133
+ const store = loadSecretStore();
134
+ const entry = store.secrets[name];
135
+ if (!entry) {
136
+ defaultRuntime.log(danger(`Secret "${name}" not found.`));
137
+ defaultRuntime.log(info("Use 'poolbot secret list' to see available secrets."));
138
+ defaultRuntime.exit(1);
139
+ return;
140
+ }
141
+ if (opts.json) {
142
+ defaultRuntime.log(JSON.stringify({
143
+ name: entry.name,
144
+ type: entry.type,
145
+ provider: entry.provider,
146
+ masked: !opts.reveal,
147
+ value: opts.reveal ? "REVEALED" : maskSecret("dummy"),
148
+ createdAt: new Date(entry.createdAt).toISOString(),
149
+ updatedAt: new Date(entry.updatedAt).toISOString(),
150
+ expiresAt: entry.expiresAt ? new Date(entry.expiresAt).toISOString() : null,
151
+ }, null, 2));
152
+ return;
153
+ }
154
+ defaultRuntime.log("");
155
+ defaultRuntime.log(theme.heading(`Secret: ${entry.name}`));
156
+ defaultRuntime.log(theme.muted("─────────────────────────────────────────"));
157
+ defaultRuntime.log(` Type: ${entry.type}`);
158
+ if (entry.provider) {
159
+ defaultRuntime.log(` Provider: ${entry.provider}`);
160
+ }
161
+ defaultRuntime.log(` Value: ${opts.reveal ? theme.error("REVEALED (should be in env var)") : maskSecret("dummy")}`);
162
+ defaultRuntime.log(` Created: ${new Date(entry.createdAt).toLocaleDateString()}`);
163
+ defaultRuntime.log(` Updated: ${new Date(entry.updatedAt).toLocaleDateString()}`);
164
+ if (entry.expiresAt) {
165
+ const isExpired = entry.expiresAt < Date.now();
166
+ defaultRuntime.log(` Expires: ${isExpired ? theme.error("EXPIRED") : new Date(entry.expiresAt).toLocaleDateString()}`);
167
+ }
168
+ defaultRuntime.log("");
169
+ if (!opts.reveal) {
170
+ defaultRuntime.log(info("To use this secret, set it as an environment variable:\n" +
171
+ ` export ${name.toUpperCase()}="<value>"`));
172
+ }
173
+ else {
174
+ defaultRuntime.log(danger("⚠️ Secret revealed! Make sure you're in a secure environment."));
175
+ }
176
+ });
177
+ // secret set
178
+ secret
179
+ .command("set <name>")
180
+ .description("Set or update a secret (interactive)")
181
+ .option("--type <type>", "Secret type (api_key, token, password, other)", "api_key")
182
+ .option("--provider <name>", "Provider name (e.g., anthropic, openai)")
183
+ .option("--expires-in <duration>", "Expiry duration (e.g., 365d, 12h)")
184
+ .option("--value <value>", "Secret value (non-interactive; use with caution)")
185
+ .action(async (name, opts) => {
186
+ const validationError = validateSecretName(name);
187
+ if (validationError) {
188
+ defaultRuntime.log(danger(validationError));
189
+ defaultRuntime.exit(1);
190
+ return;
191
+ }
192
+ const type = opts.type;
193
+ const validTypes = ["api_key", "token", "password", "other"];
194
+ if (!validTypes.includes(type)) {
195
+ defaultRuntime.log(danger(`Invalid type: ${type}. Must be one of: ${validTypes.join(", ")}`));
196
+ defaultRuntime.exit(1);
197
+ return;
198
+ }
199
+ let value = opts.value;
200
+ if (!value) {
201
+ // Interactive mode - use prompt
202
+ defaultRuntime.log("");
203
+ defaultRuntime.log(theme.heading(`Setting secret: ${name}`));
204
+ defaultRuntime.log(theme.muted("─────────────────────────────────────────"));
205
+ // Note: In real implementation, use @clack/prompts for secure input
206
+ defaultRuntime.log(info("Enter secret value (will be hidden):"));
207
+ defaultRuntime.log(danger("Note: For security, use environment variable or 1Password in production."));
208
+ defaultRuntime.exit(1);
209
+ return;
210
+ }
211
+ const valueError = validateSecretValue(value, type);
212
+ if (valueError) {
213
+ defaultRuntime.log(danger(valueError));
214
+ defaultRuntime.exit(1);
215
+ return;
216
+ }
217
+ const store = loadSecretStore();
218
+ const now = Date.now();
219
+ const expiresAt = opts.expiresIn ? parseDuration(opts.expiresIn, now) : undefined;
220
+ const entry = {
221
+ name,
222
+ hash: hashSecret(value),
223
+ createdAt: store.secrets[name]?.createdAt || now,
224
+ updatedAt: now,
225
+ expiresAt,
226
+ provider: opts.provider,
227
+ type,
228
+ };
229
+ store.secrets[name] = entry;
230
+ saveSecretStore(store);
231
+ defaultRuntime.log("");
232
+ defaultRuntime.log(success(`Secret "${name}" saved successfully.`));
233
+ defaultRuntime.log(info("Store the value in your environment:"));
234
+ defaultRuntime.log(` export ${name.toUpperCase()}="<value>"`);
235
+ if (expiresAt) {
236
+ defaultRuntime.log(info(`Expires: ${new Date(expiresAt).toLocaleDateString()}`));
237
+ }
238
+ defaultRuntime.log("");
239
+ });
240
+ // secret rotate
241
+ secret
242
+ .command("rotate <name>")
243
+ .description("Rotate a secret (mark for rotation)")
244
+ .option("--value <value>", "New secret value")
245
+ .action(async (name, opts) => {
246
+ const validationError = validateSecretName(name);
247
+ if (validationError) {
248
+ defaultRuntime.log(danger(validationError));
249
+ defaultRuntime.exit(1);
250
+ return;
251
+ }
252
+ const store = loadSecretStore();
253
+ const entry = store.secrets[name];
254
+ if (!entry) {
255
+ defaultRuntime.log(danger(`Secret "${name}" not found.`));
256
+ defaultRuntime.exit(1);
257
+ return;
258
+ }
259
+ if (!opts.value) {
260
+ defaultRuntime.log("");
261
+ defaultRuntime.log(theme.heading(`Rotating secret: ${name}`));
262
+ defaultRuntime.log(theme.muted("─────────────────────────────────────────"));
263
+ defaultRuntime.log(info("To rotate, provide new value:"));
264
+ defaultRuntime.log(` poolbot secret rotate ${name} --value "<new-value>"`);
265
+ defaultRuntime.log("");
266
+ defaultRuntime.log(danger("⚠️ Make sure to update all services using this secret."));
267
+ defaultRuntime.exit(0);
268
+ return;
269
+ }
270
+ const valueError = validateSecretValue(opts.value, entry.type);
271
+ if (valueError) {
272
+ defaultRuntime.log(danger(valueError));
273
+ defaultRuntime.exit(1);
274
+ return;
275
+ }
276
+ entry.hash = hashSecret(opts.value);
277
+ entry.updatedAt = Date.now();
278
+ store.secrets[name] = entry;
279
+ saveSecretStore(store);
280
+ defaultRuntime.log("");
281
+ defaultRuntime.log(success(`Secret "${name}" rotated successfully.`));
282
+ defaultRuntime.log(danger("⚠️ Update all services using this secret immediately."));
283
+ defaultRuntime.log("");
284
+ });
285
+ // secret validate
286
+ secret
287
+ .command("validate <name>")
288
+ .description("Validate a secret format without revealing it")
289
+ .action(async (name) => {
290
+ const validationError = validateSecretName(name);
291
+ if (validationError) {
292
+ defaultRuntime.log(danger(validationError));
293
+ defaultRuntime.exit(1);
294
+ return;
295
+ }
296
+ const store = loadSecretStore();
297
+ const entry = store.secrets[name];
298
+ if (!entry) {
299
+ defaultRuntime.log(danger(`Secret "${name}" not found.`));
300
+ defaultRuntime.exit(1);
301
+ return;
302
+ }
303
+ defaultRuntime.log("");
304
+ defaultRuntime.log(theme.heading(`Validating secret: ${name}`));
305
+ defaultRuntime.log(theme.muted("─────────────────────────────────────────"));
306
+ const checks = [
307
+ { name: "Name format", pass: !validateSecretName(entry.name) },
308
+ { name: "Hash present", pass: entry.hash.length === 64 },
309
+ { name: "Created timestamp", pass: entry.createdAt > 0 },
310
+ { name: "Updated timestamp", pass: entry.updatedAt > 0 },
311
+ ];
312
+ if (entry.expiresAt) {
313
+ checks.push({ name: "Not expired", pass: entry.expiresAt > Date.now() });
314
+ }
315
+ let allPass = true;
316
+ for (const check of checks) {
317
+ const icon = check.pass ? theme.success("✓") : theme.error("✗");
318
+ defaultRuntime.log(` ${icon} ${check.name}`);
319
+ if (!check.pass)
320
+ allPass = false;
321
+ }
322
+ defaultRuntime.log("");
323
+ if (allPass) {
324
+ defaultRuntime.log(success("All validation checks passed."));
325
+ }
326
+ else {
327
+ defaultRuntime.log(danger("Some validation checks failed."));
328
+ defaultRuntime.exit(1);
329
+ }
330
+ });
331
+ // secret delete
332
+ secret
333
+ .command("delete <name>")
334
+ .description("Delete a secret permanently")
335
+ .option("--yes", "Skip confirmation", false)
336
+ .action(async (name, opts) => {
337
+ const validationError = validateSecretName(name);
338
+ if (validationError) {
339
+ defaultRuntime.log(danger(validationError));
340
+ defaultRuntime.exit(1);
341
+ return;
342
+ }
343
+ const store = loadSecretStore();
344
+ if (!store.secrets[name]) {
345
+ defaultRuntime.log(danger(`Secret "${name}" not found.`));
346
+ defaultRuntime.exit(1);
347
+ return;
348
+ }
349
+ if (!opts.yes) {
350
+ defaultRuntime.log("");
351
+ defaultRuntime.log(danger(`⚠️ This will permanently delete secret "${name}"`));
352
+ defaultRuntime.log("This action cannot be undone.");
353
+ defaultRuntime.log("");
354
+ defaultRuntime.log(info("Use --yes to skip this confirmation."));
355
+ defaultRuntime.exit(1);
356
+ return;
357
+ }
358
+ delete store.secrets[name];
359
+ saveSecretStore(store);
360
+ defaultRuntime.log("");
361
+ defaultRuntime.log(success(`Secret "${name}" deleted successfully.`));
362
+ defaultRuntime.log("");
363
+ });
364
+ }
365
+ function parseDuration(duration, fromMs) {
366
+ const match = duration.match(/^(\d+)([smhdw])$/);
367
+ if (!match)
368
+ return undefined;
369
+ const value = parseInt(match[1], 10);
370
+ const unit = match[2];
371
+ const seconds = unit === "s" ? value :
372
+ unit === "m" ? value * 60 :
373
+ unit === "h" ? value * 3600 :
374
+ unit === "d" ? value * 86400 :
375
+ unit === "w" ? value * 604800 :
376
+ 0;
377
+ return fromMs + (seconds * 1000);
378
+ }
@@ -0,0 +1,9 @@
1
+ import type { RuntimeEnv } from "../../runtime.js";
2
+ export declare function modelsMusicFallbacksListCommand(opts: {
3
+ json?: boolean;
4
+ plain?: boolean;
5
+ }, runtime: RuntimeEnv): Promise<void>;
6
+ export declare function modelsMusicFallbacksAddCommand(modelRaw: string, runtime: RuntimeEnv): Promise<void>;
7
+ export declare function modelsMusicFallbacksRemoveCommand(modelRaw: string, runtime: RuntimeEnv): Promise<void>;
8
+ export declare function modelsMusicFallbacksClearCommand(runtime: RuntimeEnv): Promise<void>;
9
+ //# sourceMappingURL=music-fallbacks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"music-fallbacks.d.ts","sourceRoot":"","sources":["../../../src/commands/models/music-fallbacks.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AASnD,wBAAsB,+BAA+B,CACnD,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,EACzC,OAAO,EAAE,UAAU,iBAqBpB;AAED,wBAAsB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,iBAgDzF;AAED,wBAAsB,iCAAiC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,iBA8C5F;AAED,wBAAsB,gCAAgC,CAAC,OAAO,EAAE,UAAU,iBAsBzE"}
@@ -0,0 +1,126 @@
1
+ import { buildModelAliasIndex, resolveModelRefFromString } from "../../agents/model-selection.js";
2
+ import { loadConfig } from "../../config/config.js";
3
+ import { logConfigUpdated } from "../../config/logging.js";
4
+ import { DEFAULT_PROVIDER, ensureFlagCompatibility, modelKey, resolveModelTarget, updateConfig, } from "./shared.js";
5
+ export async function modelsMusicFallbacksListCommand(opts, runtime) {
6
+ ensureFlagCompatibility(opts);
7
+ const cfg = loadConfig();
8
+ const fallbacks = cfg.agents?.defaults?.musicGenerationModel?.fallbacks ?? [];
9
+ if (opts.json) {
10
+ runtime.log(JSON.stringify({ fallbacks }, null, 2));
11
+ return;
12
+ }
13
+ if (opts.plain) {
14
+ for (const entry of fallbacks)
15
+ runtime.log(entry);
16
+ return;
17
+ }
18
+ runtime.log(`Music fallbacks (${fallbacks.length}):`);
19
+ if (fallbacks.length === 0) {
20
+ runtime.log("- none");
21
+ return;
22
+ }
23
+ for (const entry of fallbacks)
24
+ runtime.log(`- ${entry}`);
25
+ }
26
+ export async function modelsMusicFallbacksAddCommand(modelRaw, runtime) {
27
+ const updated = await updateConfig((cfg) => {
28
+ const resolved = resolveModelTarget({ raw: modelRaw, cfg });
29
+ const targetKey = modelKey(resolved.provider, resolved.model);
30
+ const nextModels = { ...cfg.agents?.defaults?.models };
31
+ if (!nextModels[targetKey])
32
+ nextModels[targetKey] = {};
33
+ const aliasIndex = buildModelAliasIndex({
34
+ cfg,
35
+ defaultProvider: DEFAULT_PROVIDER,
36
+ });
37
+ const existing = cfg.agents?.defaults?.musicGenerationModel?.fallbacks ?? [];
38
+ const existingKeys = existing
39
+ .map((entry) => resolveModelRefFromString({
40
+ raw: String(entry ?? ""),
41
+ defaultProvider: DEFAULT_PROVIDER,
42
+ aliasIndex,
43
+ }))
44
+ .filter((entry) => Boolean(entry))
45
+ .map((entry) => modelKey(entry.ref.provider, entry.ref.model));
46
+ if (existingKeys.includes(targetKey))
47
+ return cfg;
48
+ const existingModel = cfg.agents?.defaults?.musicGenerationModel;
49
+ return {
50
+ ...cfg,
51
+ agents: {
52
+ ...cfg.agents,
53
+ defaults: {
54
+ ...cfg.agents?.defaults,
55
+ musicGenerationModel: {
56
+ ...(existingModel?.primary ? { primary: existingModel.primary } : undefined),
57
+ fallbacks: [...existing, targetKey],
58
+ },
59
+ models: nextModels,
60
+ },
61
+ },
62
+ };
63
+ });
64
+ logConfigUpdated(runtime);
65
+ runtime.log(`Music fallbacks: ${(updated.agents?.defaults?.musicGenerationModel?.fallbacks ?? []).join(", ")}`);
66
+ }
67
+ export async function modelsMusicFallbacksRemoveCommand(modelRaw, runtime) {
68
+ const updated = await updateConfig((cfg) => {
69
+ const resolved = resolveModelTarget({ raw: modelRaw, cfg });
70
+ const targetKey = modelKey(resolved.provider, resolved.model);
71
+ const aliasIndex = buildModelAliasIndex({
72
+ cfg,
73
+ defaultProvider: DEFAULT_PROVIDER,
74
+ });
75
+ const existing = cfg.agents?.defaults?.musicGenerationModel?.fallbacks ?? [];
76
+ const filtered = existing.filter((entry) => {
77
+ const resolvedEntry = resolveModelRefFromString({
78
+ raw: String(entry ?? ""),
79
+ defaultProvider: DEFAULT_PROVIDER,
80
+ aliasIndex,
81
+ });
82
+ if (!resolvedEntry)
83
+ return true;
84
+ return modelKey(resolvedEntry.ref.provider, resolvedEntry.ref.model) !== targetKey;
85
+ });
86
+ if (filtered.length === existing.length) {
87
+ throw new Error(`Music fallback not found: ${targetKey}`);
88
+ }
89
+ const existingModel = cfg.agents?.defaults?.musicGenerationModel;
90
+ return {
91
+ ...cfg,
92
+ agents: {
93
+ ...cfg.agents,
94
+ defaults: {
95
+ ...cfg.agents?.defaults,
96
+ musicGenerationModel: {
97
+ ...(existingModel?.primary ? { primary: existingModel.primary } : undefined),
98
+ fallbacks: filtered,
99
+ },
100
+ },
101
+ },
102
+ };
103
+ });
104
+ logConfigUpdated(runtime);
105
+ runtime.log(`Music fallbacks: ${(updated.agents?.defaults?.musicGenerationModel?.fallbacks ?? []).join(", ")}`);
106
+ }
107
+ export async function modelsMusicFallbacksClearCommand(runtime) {
108
+ await updateConfig((cfg) => {
109
+ const existingModel = cfg.agents?.defaults?.musicGenerationModel;
110
+ return {
111
+ ...cfg,
112
+ agents: {
113
+ ...cfg.agents,
114
+ defaults: {
115
+ ...cfg.agents?.defaults,
116
+ musicGenerationModel: {
117
+ ...(existingModel?.primary ? { primary: existingModel.primary } : undefined),
118
+ fallbacks: [],
119
+ },
120
+ },
121
+ },
122
+ };
123
+ });
124
+ logConfigUpdated(runtime);
125
+ runtime.log("Music fallback list cleared.");
126
+ }
@@ -0,0 +1,9 @@
1
+ import type { RuntimeEnv } from "../../runtime.js";
2
+ export declare function modelsVideoFallbacksListCommand(opts: {
3
+ json?: boolean;
4
+ plain?: boolean;
5
+ }, runtime: RuntimeEnv): Promise<void>;
6
+ export declare function modelsVideoFallbacksAddCommand(modelRaw: string, runtime: RuntimeEnv): Promise<void>;
7
+ export declare function modelsVideoFallbacksRemoveCommand(modelRaw: string, runtime: RuntimeEnv): Promise<void>;
8
+ export declare function modelsVideoFallbacksClearCommand(runtime: RuntimeEnv): Promise<void>;
9
+ //# sourceMappingURL=video-fallbacks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-fallbacks.d.ts","sourceRoot":"","sources":["../../../src/commands/models/video-fallbacks.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AASnD,wBAAsB,+BAA+B,CACnD,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,EACzC,OAAO,EAAE,UAAU,iBAqBpB;AAED,wBAAsB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,iBAgDzF;AAED,wBAAsB,iCAAiC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,iBA8C5F;AAED,wBAAsB,gCAAgC,CAAC,OAAO,EAAE,UAAU,iBAsBzE"}
@@ -0,0 +1,126 @@
1
+ import { buildModelAliasIndex, resolveModelRefFromString } from "../../agents/model-selection.js";
2
+ import { loadConfig } from "../../config/config.js";
3
+ import { logConfigUpdated } from "../../config/logging.js";
4
+ import { DEFAULT_PROVIDER, ensureFlagCompatibility, modelKey, resolveModelTarget, updateConfig, } from "./shared.js";
5
+ export async function modelsVideoFallbacksListCommand(opts, runtime) {
6
+ ensureFlagCompatibility(opts);
7
+ const cfg = loadConfig();
8
+ const fallbacks = cfg.agents?.defaults?.videoGenerationModel?.fallbacks ?? [];
9
+ if (opts.json) {
10
+ runtime.log(JSON.stringify({ fallbacks }, null, 2));
11
+ return;
12
+ }
13
+ if (opts.plain) {
14
+ for (const entry of fallbacks)
15
+ runtime.log(entry);
16
+ return;
17
+ }
18
+ runtime.log(`Video fallbacks (${fallbacks.length}):`);
19
+ if (fallbacks.length === 0) {
20
+ runtime.log("- none");
21
+ return;
22
+ }
23
+ for (const entry of fallbacks)
24
+ runtime.log(`- ${entry}`);
25
+ }
26
+ export async function modelsVideoFallbacksAddCommand(modelRaw, runtime) {
27
+ const updated = await updateConfig((cfg) => {
28
+ const resolved = resolveModelTarget({ raw: modelRaw, cfg });
29
+ const targetKey = modelKey(resolved.provider, resolved.model);
30
+ const nextModels = { ...cfg.agents?.defaults?.models };
31
+ if (!nextModels[targetKey])
32
+ nextModels[targetKey] = {};
33
+ const aliasIndex = buildModelAliasIndex({
34
+ cfg,
35
+ defaultProvider: DEFAULT_PROVIDER,
36
+ });
37
+ const existing = cfg.agents?.defaults?.videoGenerationModel?.fallbacks ?? [];
38
+ const existingKeys = existing
39
+ .map((entry) => resolveModelRefFromString({
40
+ raw: String(entry ?? ""),
41
+ defaultProvider: DEFAULT_PROVIDER,
42
+ aliasIndex,
43
+ }))
44
+ .filter((entry) => Boolean(entry))
45
+ .map((entry) => modelKey(entry.ref.provider, entry.ref.model));
46
+ if (existingKeys.includes(targetKey))
47
+ return cfg;
48
+ const existingModel = cfg.agents?.defaults?.videoGenerationModel;
49
+ return {
50
+ ...cfg,
51
+ agents: {
52
+ ...cfg.agents,
53
+ defaults: {
54
+ ...cfg.agents?.defaults,
55
+ videoGenerationModel: {
56
+ ...(existingModel?.primary ? { primary: existingModel.primary } : undefined),
57
+ fallbacks: [...existing, targetKey],
58
+ },
59
+ models: nextModels,
60
+ },
61
+ },
62
+ };
63
+ });
64
+ logConfigUpdated(runtime);
65
+ runtime.log(`Video fallbacks: ${(updated.agents?.defaults?.videoGenerationModel?.fallbacks ?? []).join(", ")}`);
66
+ }
67
+ export async function modelsVideoFallbacksRemoveCommand(modelRaw, runtime) {
68
+ const updated = await updateConfig((cfg) => {
69
+ const resolved = resolveModelTarget({ raw: modelRaw, cfg });
70
+ const targetKey = modelKey(resolved.provider, resolved.model);
71
+ const aliasIndex = buildModelAliasIndex({
72
+ cfg,
73
+ defaultProvider: DEFAULT_PROVIDER,
74
+ });
75
+ const existing = cfg.agents?.defaults?.videoGenerationModel?.fallbacks ?? [];
76
+ const filtered = existing.filter((entry) => {
77
+ const resolvedEntry = resolveModelRefFromString({
78
+ raw: String(entry ?? ""),
79
+ defaultProvider: DEFAULT_PROVIDER,
80
+ aliasIndex,
81
+ });
82
+ if (!resolvedEntry)
83
+ return true;
84
+ return modelKey(resolvedEntry.ref.provider, resolvedEntry.ref.model) !== targetKey;
85
+ });
86
+ if (filtered.length === existing.length) {
87
+ throw new Error(`Video fallback not found: ${targetKey}`);
88
+ }
89
+ const existingModel = cfg.agents?.defaults?.videoGenerationModel;
90
+ return {
91
+ ...cfg,
92
+ agents: {
93
+ ...cfg.agents,
94
+ defaults: {
95
+ ...cfg.agents?.defaults,
96
+ videoGenerationModel: {
97
+ ...(existingModel?.primary ? { primary: existingModel.primary } : undefined),
98
+ fallbacks: filtered,
99
+ },
100
+ },
101
+ },
102
+ };
103
+ });
104
+ logConfigUpdated(runtime);
105
+ runtime.log(`Video fallbacks: ${(updated.agents?.defaults?.videoGenerationModel?.fallbacks ?? []).join(", ")}`);
106
+ }
107
+ export async function modelsVideoFallbacksClearCommand(runtime) {
108
+ await updateConfig((cfg) => {
109
+ const existingModel = cfg.agents?.defaults?.videoGenerationModel;
110
+ return {
111
+ ...cfg,
112
+ agents: {
113
+ ...cfg.agents,
114
+ defaults: {
115
+ ...cfg.agents?.defaults,
116
+ videoGenerationModel: {
117
+ ...(existingModel?.primary ? { primary: existingModel.primary } : undefined),
118
+ fallbacks: [],
119
+ },
120
+ },
121
+ },
122
+ };
123
+ });
124
+ logConfigUpdated(runtime);
125
+ runtime.log("Video fallback list cleared.");
126
+ }
@@ -4,6 +4,8 @@ export { modelsAuthAddCommand, modelsAuthLoginCommand, modelsAuthPasteTokenComma
4
4
  export { modelsAuthOrderClearCommand, modelsAuthOrderGetCommand, modelsAuthOrderSetCommand, } from "./models/auth-order.js";
5
5
  export { modelsFallbacksAddCommand, modelsFallbacksClearCommand, modelsFallbacksListCommand, modelsFallbacksRemoveCommand, } from "./models/fallbacks.js";
6
6
  export { modelsImageFallbacksAddCommand, modelsImageFallbacksClearCommand, modelsImageFallbacksListCommand, modelsImageFallbacksRemoveCommand, } from "./models/image-fallbacks.js";
7
+ export { modelsVideoFallbacksAddCommand, modelsVideoFallbacksClearCommand, modelsVideoFallbacksListCommand, modelsVideoFallbacksRemoveCommand, } from "./models/video-fallbacks.js";
8
+ export { modelsMusicFallbacksAddCommand, modelsMusicFallbacksClearCommand, modelsMusicFallbacksListCommand, modelsMusicFallbacksRemoveCommand, } from "./models/music-fallbacks.js";
7
9
  export { modelsListCommand, modelsStatusCommand } from "./models/list.js";
8
10
  export { modelsScanCommand } from "./models/scan.js";
9
11
  export { modelsSetCommand } from "./models/set.js";
@@ -1 +1 @@
1
- {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,8BAA8B,EAC9B,gCAAgC,EAChC,+BAA+B,EAC/B,iCAAiC,GAClC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,8BAA8B,EAC9B,gCAAgC,EAChC,+BAA+B,EAC/B,iCAAiC,GAClC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,8BAA8B,EAC9B,gCAAgC,EAChC,+BAA+B,EAC/B,iCAAiC,GAClC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,8BAA8B,EAC9B,gCAAgC,EAChC,+BAA+B,EAC/B,iCAAiC,GAClC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -4,6 +4,8 @@ export { modelsAuthAddCommand, modelsAuthLoginCommand, modelsAuthPasteTokenComma
4
4
  export { modelsAuthOrderClearCommand, modelsAuthOrderGetCommand, modelsAuthOrderSetCommand, } from "./models/auth-order.js";
5
5
  export { modelsFallbacksAddCommand, modelsFallbacksClearCommand, modelsFallbacksListCommand, modelsFallbacksRemoveCommand, } from "./models/fallbacks.js";
6
6
  export { modelsImageFallbacksAddCommand, modelsImageFallbacksClearCommand, modelsImageFallbacksListCommand, modelsImageFallbacksRemoveCommand, } from "./models/image-fallbacks.js";
7
+ export { modelsVideoFallbacksAddCommand, modelsVideoFallbacksClearCommand, modelsVideoFallbacksListCommand, modelsVideoFallbacksRemoveCommand, } from "./models/video-fallbacks.js";
8
+ export { modelsMusicFallbacksAddCommand, modelsMusicFallbacksClearCommand, modelsMusicFallbacksListCommand, modelsMusicFallbacksRemoveCommand, } from "./models/music-fallbacks.js";
7
9
  export { modelsListCommand, modelsStatusCommand } from "./models/list.js";
8
10
  export { modelsScanCommand } from "./models/scan.js";
9
11
  export { modelsSetCommand } from "./models/set.js";
@@ -118,6 +118,10 @@ export type AgentDefaultsConfig = {
118
118
  imageModel?: AgentModelListConfig;
119
119
  /** Optional PDF-capable model and fallbacks (provider/model). */
120
120
  pdfModel?: AgentModelListConfig;
121
+ /** Optional video generation model and fallbacks (provider/model). */
122
+ videoGenerationModel?: AgentModelListConfig;
123
+ /** Optional music generation model and fallbacks (provider/model). */
124
+ musicGenerationModel?: AgentModelListConfig;
121
125
  /** Model catalog with optional aliases (full provider/model keys). */
122
126
  models?: Record<string, AgentModelEntryConfig>;
123
127
  /** Agent working directory (preferred). Used as the default cwd for agent runs. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.agent-defaults.d.ts","sourceRoot":"","sources":["../../src/config/types.agent-defaults.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.agent-defaults.d.ts","sourceRoot":"","sources":["../../src/config/types.agent-defaults.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,9 @@
4
4
  "NODE_PATH",
5
5
  "PYTHONHOME",
6
6
  "PYTHONPATH",
7
+ "PYTHONSTARTUP",
8
+ "PYTHONUSERBASE",
9
+ "PIP_CONFIG_FILE",
7
10
  "PERL5LIB",
8
11
  "PERL5OPT",
9
12
  "RUBYLIB",
@@ -11,9 +14,42 @@
11
14
  "BASH_ENV",
12
15
  "ENV",
13
16
  "SHELL",
17
+ "VISUAL",
18
+ "EDITOR",
14
19
  "GCONV_PATH",
15
20
  "IFS",
16
- "SSLKEYLOGFILE"
21
+ "SSLKEYLOGFILE",
22
+ "JAVA_OPTS",
23
+ "JVM_OPTS",
24
+ "MAVEN_OPTS",
25
+ "GRADLE_OPTS",
26
+ "RUSTFLAGS",
27
+ "CARGO_HOME",
28
+ "CARGO_TARGET_DIR",
29
+ "CARGO_INCREMENTAL",
30
+ "CC",
31
+ "CXX",
32
+ "KUBECONFIG",
33
+ "AWS_SHARED_CREDENTIALS_FILE",
34
+ "AWS_CONFIG_FILE",
35
+ "GOOGLE_APPLICATION_CREDENTIALS",
36
+ "AZURE_CONFIG_DIR",
37
+ "HELM_HOME",
38
+ "GIT_DIR",
39
+ "GIT_WORK_TREE",
40
+ "GIT_COMMON_DIR",
41
+ "GIT_INDEX_FILE",
42
+ "GIT_OBJECT_DIRECTORY",
43
+ "GIT_ALTERNATE_OBJECT_DIRECTORIES",
44
+ "GIT_NAMESPACE",
45
+ "GIT_SSH",
46
+ "GIT_SSH_COMMAND",
47
+ "GIT_ASKPASS",
48
+ "HOMEBREW_PREFIX",
49
+ "HOMEBREW_REPOSITORY",
50
+ "LINUXBREW_PREFIX",
51
+ "NPM_CONFIG_PREFIX",
52
+ "YARN_GLOBAL_FOLDER"
17
53
  ],
18
- "blockedPrefixes": ["DYLD_", "LD_", "BASH_FUNC_"]
54
+ "blockedPrefixes": ["DYLD_", "LD_", "BASH_FUNC_", "CARGO_"]
19
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-guard.d.ts","sourceRoot":"","sources":["../../../src/infra/net/fetch-guard.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGtD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,yCAAyC;IACzC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,wBAAwB;IACxB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wBAAwB;IACxB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,qCAAqC;IACrC,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,CAAC;AAEF,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,kBAAkB,GAAG,gBAAgB,GAAG,SAAS,CAAC;gBAGhF,IAAI,EAAE,cAAc,GAAG,kBAAkB,GAAG,gBAAgB,GAAG,SAAS,EACxE,OAAO,EAAE,MAAM;CAMlB;AAMD,6CAA6C;AAC7C,eAAO,MAAM,kBAAkB;;;CAGrB,CAAC;AAEX,gCAAgC;AAChC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,qCAAqC;AACrC,MAAM,MAAM,yBAAyB,GAAG;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,OAAO,kBAAkB,CAAC,CAAC;IACpE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AA0DF;;GAEG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,GAAG,GAAG,EACjB,IAAI,CAAC,EAAE,WAAW,EAClB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,QAAQ,CAAC,CA4DnB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,iBAAsB,IACxD,KAAK,MAAM,GAAG,GAAG,EAAE,OAAO,WAAW,uBAC9C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAO7F;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,kBAAkB,CAAC,CAiF7B;AAGD,eAAO,MAAM,YAAY,WACf,WAAW,GAAG,GAAG,SAAS,WAAW;qBAK1B,GAAG;uBACK,MAAM,GAAG,GAAG;CAExC,CAAC"}
1
+ {"version":3,"file":"fetch-guard.d.ts","sourceRoot":"","sources":["../../../src/infra/net/fetch-guard.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGtD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,yCAAyC;IACzC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,wBAAwB;IACxB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wBAAwB;IACxB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,qCAAqC;IACrC,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,CAAC;AAEF,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,kBAAkB,GAAG,gBAAgB,GAAG,SAAS,CAAC;gBAGhF,IAAI,EAAE,cAAc,GAAG,kBAAkB,GAAG,gBAAgB,GAAG,SAAS,EACxE,OAAO,EAAE,MAAM;CAMlB;AAwCD,6CAA6C;AAC7C,eAAO,MAAM,kBAAkB;;;CAGrB,CAAC;AAEX,gCAAgC;AAChC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,qCAAqC;AACrC,MAAM,MAAM,yBAAyB,GAAG;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,OAAO,kBAAkB,CAAC,CAAC;IACpE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AA0DF;;GAEG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,GAAG,GAAG,EACjB,IAAI,CAAC,EAAE,WAAW,EAClB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,QAAQ,CAAC,CA0EnB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,iBAAsB,IACxD,KAAK,MAAM,GAAG,GAAG,EAAE,OAAO,WAAW,uBAC9C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAO7F;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,kBAAkB,CAAC,CAiF7B;AAGD,eAAO,MAAM,YAAY,WACf,WAAW,GAAG,GAAG,SAAS,WAAW;qBAK1B,GAAG;uBACK,MAAM,GAAG,GAAG;CAExC,CAAC"}
@@ -18,6 +18,33 @@ export class FetchGuardError extends Error {
18
18
  const DEFAULT_ALLOWED_PROTOCOLS = ["https:", "http:"];
19
19
  const DEFAULT_MAX_REDIRECTS = 5;
20
20
  const DEFAULT_TIMEOUT_MS = 30000;
21
+ /**
22
+ * Strip body-describing headers for redirect safety.
23
+ * Removes Content-Type, Content-Length, etc. to prevent body leakage on redirects.
24
+ */
25
+ function stripBodyHeaders(headers) {
26
+ if (!headers) {
27
+ return undefined;
28
+ }
29
+ const blockedHeaders = new Set([
30
+ "content-type",
31
+ "content-length",
32
+ "content-encoding",
33
+ "content-language",
34
+ "content-md5",
35
+ "content-disposition",
36
+ "content-range",
37
+ "transfer-encoding",
38
+ ]);
39
+ const result = {};
40
+ const headerEntries = headers instanceof Headers ? Array.from(headers.entries()) : Object.entries(headers);
41
+ for (const [key, value] of headerEntries) {
42
+ if (!blockedHeaders.has(key.toLowerCase())) {
43
+ result[key] = value;
44
+ }
45
+ }
46
+ return Object.keys(result).length > 0 ? result : undefined;
47
+ }
21
48
  /** Guarded fetch modes for proxy handling */
22
49
  export const GUARDED_FETCH_MODE = {
23
50
  STRICT: "strict",
@@ -105,6 +132,19 @@ export async function fetchWithGuard(url, init, options = {}) {
105
132
  currentUrl = new URL(location, currentUrl);
106
133
  // Validate redirect URL
107
134
  validateURL(currentUrl, options);
135
+ // Security: drop request bodies on 307/308 redirects to prevent
136
+ // attacker-controlled redirect hops from receiving secret-bearing POST payloads
137
+ // (OpenClaw #62357). Only preserve body for same-origin redirects.
138
+ const isCrossOrigin = currentUrl.origin !== new URL(url).origin;
139
+ if (isCrossOrigin && [307, 308].includes(response.status)) {
140
+ // Strip body and body-describing headers for cross-origin permanent redirects
141
+ init = {
142
+ ...init,
143
+ body: undefined,
144
+ method: "GET",
145
+ headers: stripBodyHeaders(init?.headers),
146
+ };
147
+ }
108
148
  continue;
109
149
  }
110
150
  return response;
@@ -1 +1 @@
1
- {"version":3,"file":"npm-integrity.d.ts","sourceRoot":"","sources":["../../src/infra/npm-integrity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAEtF,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,iBAAiB,CAAC;CAC/B,CAAC;AAEF,KAAK,8BAA8B,CAAC,QAAQ,IAAI;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,aAAa,EAAE,CAAC,MAAM,EAAE;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,iBAAiB,EAAE,MAAM,CAAC;QAC1B,eAAe,EAAE,MAAM,CAAC;QACxB,UAAU,EAAE,iBAAiB,CAAC;KAC/B,KAAK,QAAQ,CAAC;IACf,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,8BAA8B,CAAC,QAAQ,IAAI;IACrD,cAAc,CAAC,EAAE,iBAAiB,CAAC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,QAAQ,CAAC;CACpB,CAAC;AAEF,wBAAsB,wBAAwB,CAAC,QAAQ,EACrD,MAAM,EAAE,8BAA8B,CAAC,QAAQ,CAAC,GAC/C,OAAO,CAAC,8BAA8B,CAAC,QAAQ,CAAC,CAAC,CA2BnD;AAED,KAAK,gDAAgD,GAAG;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,wBAAwB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC,CAAC;AAEF,wBAAsB,0CAA0C,CAC9D,MAAM,EAAE,gDAAgD,GACvD,OAAO,CAAC;IAAE,cAAc,CAAC,EAAE,iBAAiB,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAsBjE"}
1
+ {"version":3,"file":"npm-integrity.d.ts","sourceRoot":"","sources":["../../src/infra/npm-integrity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAEtF,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,iBAAiB,CAAC;CAC/B,CAAC;AAEF,KAAK,8BAA8B,CAAC,QAAQ,IAAI;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,aAAa,EAAE,CAAC,MAAM,EAAE;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,iBAAiB,EAAE,MAAM,CAAC;QAC1B,eAAe,EAAE,MAAM,CAAC;QACxB,UAAU,EAAE,iBAAiB,CAAC;KAC/B,KAAK,QAAQ,CAAC;IACf,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,8BAA8B,CAAC,QAAQ,IAAI;IACrD,cAAc,CAAC,EAAE,iBAAiB,CAAC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,QAAQ,CAAC;CACpB,CAAC;AAEF,wBAAsB,wBAAwB,CAAC,QAAQ,EACrD,MAAM,EAAE,8BAA8B,CAAC,QAAQ,CAAC,GAC/C,OAAO,CAAC,8BAA8B,CAAC,QAAQ,CAAC,CAAC,CAiCnD;AAED,KAAK,gDAAgD,GAAG;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,wBAAwB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC,CAAC;AAEF,wBAAsB,0CAA0C,CAC9D,MAAM,EAAE,gDAAgD,GACvD,OAAO,CAAC;IAAE,cAAc,CAAC,EAAE,iBAAiB,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAsBjE"}
@@ -1,6 +1,12 @@
1
1
  export async function resolveNpmIntegrityDrift(params) {
2
- if (!params.expectedIntegrity || !params.resolution.integrity) {
3
- return { proceed: true };
2
+ // Fail closed: require integrity metadata for all npm packages
3
+ if (!params.expectedIntegrity) {
4
+ // Missing expected integrity - fail closed
5
+ return { proceed: false };
6
+ }
7
+ if (!params.resolution.integrity) {
8
+ // Missing actual integrity - fail closed (possible tampering)
9
+ return { proceed: false };
4
10
  }
5
11
  if (params.expectedIntegrity === params.resolution.integrity) {
6
12
  return { proceed: true };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@poolzin/pool-bot",
3
- "version": "2026.4.39",
3
+ "version": "2026.4.41",
4
4
  "description": "🎱 Pool Bot - AI assistant with PLCODE integrations",
5
5
  "keywords": [],
6
6
  "license": "MIT",