opencode-matrixx 2.6.4 → 2.6.6
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/agents/oracle/behavioral-summary.d.ts +1 -1
- package/dist/agents/oracle/high-accuracy-mode.d.ts +1 -1
- package/dist/agents/oracle/interview-mode.d.ts +1 -1
- package/dist/agents/oracle/plan-generation.d.ts +1 -1
- package/dist/agents/oracle/plan-template.d.ts +1 -1
- package/dist/agents/oracle/system-prompt.d.ts +1 -1
- package/dist/cli/setup/index.d.ts +1 -0
- package/dist/cli/setup/preset-wizard.d.ts +36 -0
- package/dist/cli/setup/types.d.ts +5 -0
- package/dist/cli.js +499 -64
- package/dist/config/index.d.ts +0 -1
- package/dist/config/migrations/model-migration.d.ts +1 -2
- package/dist/config/preset-applier.d.ts +17 -0
- package/dist/config/schema/agent-overrides.d.ts +0 -133
- package/dist/config/schema/categories.d.ts +0 -14
- package/dist/config/schema/commands.d.ts +1 -1
- package/dist/config/schema/hooks.d.ts +1 -0
- package/dist/config/schema/matrixx-config.d.ts +29 -144
- package/dist/config/schema/model-config.d.ts +0 -22
- package/dist/config/schema/model-presets.d.ts +40 -0
- package/dist/config/schema/task.d.ts +6 -0
- package/dist/config/schema/tasks.d.ts +25 -0
- package/dist/config/schema.d.ts +3 -0
- package/dist/create-hooks.d.ts +1 -0
- package/dist/features/background-agent/handle-index.d.ts +63 -0
- package/dist/features/background-agent/handle-index.test.d.ts +1 -0
- package/dist/features/background-agent/index.d.ts +1 -0
- package/dist/features/background-agent/manager-handles.test.d.ts +1 -0
- package/dist/features/background-agent/manager.d.ts +12 -0
- package/dist/features/builtin-commands/templates/preset.d.ts +1 -0
- package/dist/features/builtin-commands/types.d.ts +1 -1
- package/dist/features/preset-state/index.d.ts +1 -0
- package/dist/features/preset-state/manager.d.ts +5 -0
- package/dist/features/session-state/state.d.ts +6 -0
- package/dist/features/task-storage/types.d.ts +2 -0
- package/dist/hooks/background-task-blocker/hook.d.ts +10 -0
- package/dist/hooks/background-task-blocker/index.d.ts +1 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/json-error-recovery/hook.d.ts +1 -1
- package/dist/hooks/task-continuation-enforcer/continuation-injection.test.d.ts +1 -0
- package/dist/hooks/task-continuation-enforcer/staleness.d.ts +7 -1
- package/dist/hooks/task-continuation-enforcer/todo.d.ts +8 -0
- package/dist/hooks/task-continuation-enforcer/todo.test.d.ts +1 -0
- package/dist/hooks/tasks-todowrite-disabler/constants.d.ts +1 -1
- package/dist/index.js +923 -624
- package/dist/matrixx.schema.json +114 -244
- package/dist/mcp/types.d.ts +1 -1
- package/dist/mcp/{grep-app.d.ts → white-rabbit.d.ts} +1 -1
- package/dist/plugin/hooks/create-core-hooks.d.ts +1 -0
- package/dist/plugin/hooks/create-tool-guard-hooks.d.ts +2 -1
- package/dist/shared/config-errors.d.ts +3 -0
- package/dist/shared/context-mode-prompt.d.ts +12 -0
- package/dist/shared/context-mode-prompt.test.d.ts +1 -0
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/merge-categories.d.ts +1 -16
- package/dist/shared/task-system-gating.d.ts +10 -0
- package/dist/tools/background-task/constants.d.ts +0 -1
- package/dist/tools/background-task/index.d.ts +1 -1
- package/dist/tools/background-task/tools.d.ts +0 -1
- package/dist/tools/background-task/types.d.ts +0 -5
- package/dist/tools/delegate-task/categories.d.ts +3 -18
- package/dist/tools/delegate-task/complexity-constants.d.ts +2 -7
- package/dist/tools/delegate-task/executor-types.d.ts +7 -2
- package/dist/tools/delegate-task/sync-task.test.d.ts +1 -0
- package/dist/tools/delegate-task/timing.d.ts +5 -0
- package/dist/tools/delegate-task/timing.test.d.ts +1 -0
- package/dist/tools/delegate-task/types.d.ts +5 -2
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/preset/index.d.ts +1 -0
- package/dist/tools/preset/tools.d.ts +7 -0
- package/dist/tools/task/constants.d.ts +1 -0
- package/package.json +1 -1
- package/dist/config/presets.d.ts +0 -4
- package/dist/config/resolve-tiers.d.ts +0 -32
- package/dist/features/builtin-commands/templates/profile.d.ts +0 -1
- package/dist/shared/model-tiers.d.ts +0 -44
- package/dist/shared/tier-resolver.d.ts +0 -26
- package/dist/tools/background-task/create-background-task.d.ts +0 -3
package/dist/cli.js
CHANGED
|
@@ -107,8 +107,8 @@ var require_src = __commonJS(function(exports, module) {
|
|
|
107
107
|
});
|
|
108
108
|
|
|
109
109
|
// src/cli/index.ts
|
|
110
|
-
import { readFileSync as
|
|
111
|
-
import { dirname as dirname3, join as
|
|
110
|
+
import { readFileSync as readFileSync16 } from "fs";
|
|
111
|
+
import { dirname as dirname3, join as join18 } from "path";
|
|
112
112
|
import { fileURLToPath } from "url";
|
|
113
113
|
|
|
114
114
|
// src/cli/doctor/checks/auth.ts
|
|
@@ -15635,7 +15635,7 @@ function date4(params) {
|
|
|
15635
15635
|
// node_modules/zod/v4/classic/external.js
|
|
15636
15636
|
config(en_default());
|
|
15637
15637
|
// src/mcp/types.ts
|
|
15638
|
-
var McpNameSchema = exports_external.enum(["websearch", "context7", "
|
|
15638
|
+
var McpNameSchema = exports_external.enum(["websearch", "context7", "white_rabbit", "document_reader"]);
|
|
15639
15639
|
var AnyMcpNameSchema = exports_external.string().min(1);
|
|
15640
15640
|
|
|
15641
15641
|
// src/config/schema/agent-definitions.ts
|
|
@@ -15715,10 +15715,8 @@ var AgentPermissionSchema = exports_external.object({
|
|
|
15715
15715
|
});
|
|
15716
15716
|
|
|
15717
15717
|
// src/config/schema/agent-overrides.ts
|
|
15718
|
-
var TierNameSchema = exports_external.enum(["free", "fast", "standard", "premium", "frontier"]);
|
|
15719
15718
|
var AgentOverrideConfigSchema = exports_external.object({
|
|
15720
15719
|
model: exports_external.string().optional(),
|
|
15721
|
-
tier: TierNameSchema.optional(),
|
|
15722
15720
|
variant: exports_external.string().optional(),
|
|
15723
15721
|
category: exports_external.string().optional(),
|
|
15724
15722
|
skills: exports_external.array(exports_external.string()).optional(),
|
|
@@ -15814,7 +15812,6 @@ var BrowserAutomationConfigSchema = exports_external.object({
|
|
|
15814
15812
|
var CategoryConfigSchema = exports_external.object({
|
|
15815
15813
|
description: exports_external.string().optional(),
|
|
15816
15814
|
model: exports_external.string().optional(),
|
|
15817
|
-
tier: TierNameSchema.optional(),
|
|
15818
15815
|
variant: exports_external.string().optional(),
|
|
15819
15816
|
temperature: exports_external.number().min(0).max(2).optional(),
|
|
15820
15817
|
top_p: exports_external.number().min(0).max(1).optional(),
|
|
@@ -15853,7 +15850,7 @@ var BuiltinCommandNameSchema = exports_external.enum([
|
|
|
15853
15850
|
"refactor",
|
|
15854
15851
|
"start-work",
|
|
15855
15852
|
"stop-continuation",
|
|
15856
|
-
"
|
|
15853
|
+
"preset",
|
|
15857
15854
|
"end-ultrawork",
|
|
15858
15855
|
"handoff",
|
|
15859
15856
|
"research",
|
|
@@ -16162,6 +16159,7 @@ var HookNameEnum = exports_external.enum([
|
|
|
16162
16159
|
"preemptive-compaction",
|
|
16163
16160
|
"rules-injector",
|
|
16164
16161
|
"background-notification",
|
|
16162
|
+
"background-task-blocker",
|
|
16165
16163
|
"auto-update-checker",
|
|
16166
16164
|
"startup-toast",
|
|
16167
16165
|
"keyword-detector",
|
|
@@ -16235,31 +16233,16 @@ var ModelFallbackEntrySchema = exports_external.object({
|
|
|
16235
16233
|
model: exports_external.string().min(1),
|
|
16236
16234
|
variant: exports_external.string().optional()
|
|
16237
16235
|
});
|
|
16238
|
-
var TierSpecSchema = exports_external.object({
|
|
16239
|
-
providerPriority: exports_external.array(exports_external.string()),
|
|
16240
|
-
modelPattern: exports_external.string().refine((s) => {
|
|
16241
|
-
try {
|
|
16242
|
-
new RegExp(s);
|
|
16243
|
-
return true;
|
|
16244
|
-
} catch {
|
|
16245
|
-
return false;
|
|
16246
|
-
}
|
|
16247
|
-
}, { message: "Invalid regex pattern" }),
|
|
16248
|
-
fallbackTier: exports_external.string().optional(),
|
|
16249
|
-
fallback: exports_external.array(ModelFallbackEntrySchema).optional()
|
|
16250
|
-
});
|
|
16251
|
-
var TiersSchema = exports_external.record(exports_external.string(), TierSpecSchema);
|
|
16252
16236
|
var complexityDowngradeValueSchema = exports_external.string().refine((s) => {
|
|
16253
|
-
if (s.
|
|
16254
|
-
|
|
16255
|
-
|
|
16256
|
-
|
|
16257
|
-
if (s.includes("
|
|
16258
|
-
|
|
16259
|
-
|
|
16260
|
-
|
|
16261
|
-
|
|
16262
|
-
}, { message: "Must be tier:<name> or <provider>/<model>" });
|
|
16237
|
+
if (!s.includes("/"))
|
|
16238
|
+
return false;
|
|
16239
|
+
if (s.startsWith("/") || s.endsWith("/"))
|
|
16240
|
+
return false;
|
|
16241
|
+
if (s.includes("//"))
|
|
16242
|
+
return false;
|
|
16243
|
+
const parts = s.split("/");
|
|
16244
|
+
return parts.length >= 2 && parts.every((p) => p.length > 0);
|
|
16245
|
+
}, { message: "Must be <provider>/<model>" });
|
|
16263
16246
|
var ComplexityDowngradesSchema = exports_external.record(exports_external.string(), exports_external.record(exports_external.string(), complexityDowngradeValueSchema));
|
|
16264
16247
|
var AgentModelRequirementsSchema = exports_external.object({
|
|
16265
16248
|
fallbackChain: exports_external.array(ModelFallbackEntrySchema),
|
|
@@ -16280,6 +16263,29 @@ var ModelRequirementsSchema = exports_external.object({
|
|
|
16280
16263
|
categories: exports_external.record(exports_external.string(), CategoryModelRequirementsSchema).optional()
|
|
16281
16264
|
});
|
|
16282
16265
|
|
|
16266
|
+
// src/config/schema/model-presets.ts
|
|
16267
|
+
var providerModelSchema = exports_external.string().refine((s) => {
|
|
16268
|
+
if (!s.includes("/"))
|
|
16269
|
+
return false;
|
|
16270
|
+
if (s.startsWith("/") || s.endsWith("/"))
|
|
16271
|
+
return false;
|
|
16272
|
+
if (s.includes("//"))
|
|
16273
|
+
return false;
|
|
16274
|
+
const parts = s.split("/");
|
|
16275
|
+
return parts.length >= 2 && parts.every((p) => p.length > 0);
|
|
16276
|
+
}, { message: "Must be <provider>/<model>" });
|
|
16277
|
+
var ModelPresetEntrySchema = exports_external.object({
|
|
16278
|
+
model: providerModelSchema,
|
|
16279
|
+
variant: exports_external.string().optional()
|
|
16280
|
+
});
|
|
16281
|
+
var ModelPresetSchema = exports_external.object({
|
|
16282
|
+
default_model: providerModelSchema.optional(),
|
|
16283
|
+
agents: exports_external.record(exports_external.string(), ModelPresetEntrySchema).optional(),
|
|
16284
|
+
categories: exports_external.record(exports_external.string(), ModelPresetEntrySchema).optional()
|
|
16285
|
+
});
|
|
16286
|
+
var ModelPresetsSchema = exports_external.record(exports_external.string(), ModelPresetSchema);
|
|
16287
|
+
var ActivePresetSchema = exports_external.string().min(1);
|
|
16288
|
+
|
|
16283
16289
|
// src/config/schema/morpheus.ts
|
|
16284
16290
|
var MorpheusTasksConfigSchema = exports_external.object({
|
|
16285
16291
|
storage_path: exports_external.string().optional(),
|
|
@@ -16406,6 +16412,22 @@ var SkillsConfigSchema = exports_external.union([
|
|
|
16406
16412
|
}).catchall(SkillEntrySchema)
|
|
16407
16413
|
]);
|
|
16408
16414
|
|
|
16415
|
+
// src/config/schema/task.ts
|
|
16416
|
+
var TaskConfigSchema = exports_external.object({
|
|
16417
|
+
pollTimeoutMs: exports_external.number().min(60000).optional()
|
|
16418
|
+
});
|
|
16419
|
+
|
|
16420
|
+
// src/config/schema/tasks.ts
|
|
16421
|
+
var TasksConfigSchema = exports_external.object({
|
|
16422
|
+
enabled: exports_external.boolean().optional().default(true),
|
|
16423
|
+
scope: exports_external.enum(["global", "project"]).default("project").optional().describe("Task storage scope: project \u2192 .matrixx/tasks per project (default), global \u2192 <opencode-config>/tasks/{listId}"),
|
|
16424
|
+
storage_path: exports_external.string().optional(),
|
|
16425
|
+
task_list_id: exports_external.string().optional(),
|
|
16426
|
+
stale_after_hours: exports_external.number().int().min(1).optional().describe("Pending tasks with no file activity for this many hours are considered stale (default: 24). Stale tasks are excluded from task-continuation directives."),
|
|
16427
|
+
session_scoped: exports_external.boolean().default(true).optional().describe("When true, the task-continuation-enforcer only considers tasks created by the current session (or its subagent sessions). When false, all project tasks are considered regardless of session origin."),
|
|
16428
|
+
pollTimeoutMs: exports_external.number().min(60000).optional()
|
|
16429
|
+
});
|
|
16430
|
+
|
|
16409
16431
|
// src/config/schema/tdd-enforcer.ts
|
|
16410
16432
|
var TddEnforcerConfigSchema = exports_external.object({
|
|
16411
16433
|
enabled: exports_external.boolean().default(false)
|
|
@@ -16437,7 +16459,8 @@ var WebsearchConfigSchema = exports_external.object({
|
|
|
16437
16459
|
var MatrixxConfigSchema = exports_external.object({
|
|
16438
16460
|
$schema: exports_external.string().optional(),
|
|
16439
16461
|
global_model: exports_external.string().optional(),
|
|
16440
|
-
|
|
16462
|
+
model_presets: ModelPresetsSchema.optional(),
|
|
16463
|
+
active_preset: ActivePresetSchema.optional(),
|
|
16441
16464
|
new_task_system_enabled: exports_external.boolean().optional(),
|
|
16442
16465
|
default_run_agent: exports_external.string().optional(),
|
|
16443
16466
|
disabled_mcps: exports_external.array(AnyMcpNameSchema).optional(),
|
|
@@ -16459,6 +16482,8 @@ var MatrixxConfigSchema = exports_external.object({
|
|
|
16459
16482
|
background_task: BackgroundTaskConfigSchema.optional(),
|
|
16460
16483
|
notification: NotificationConfigSchema.optional(),
|
|
16461
16484
|
babysitting: BabysittingConfigSchema.optional(),
|
|
16485
|
+
tasks: TasksConfigSchema.optional(),
|
|
16486
|
+
task: TaskConfigSchema.optional(),
|
|
16462
16487
|
tdd_enforcer: TddEnforcerConfigSchema.optional(),
|
|
16463
16488
|
browser_automation_engine: BrowserAutomationConfigSchema.optional(),
|
|
16464
16489
|
websearch: WebsearchConfigSchema.optional(),
|
|
@@ -16474,7 +16499,6 @@ var MatrixxConfigSchema = exports_external.object({
|
|
|
16474
16499
|
rtk: RtkConfigSchema.optional(),
|
|
16475
16500
|
evolution: EvolutionConfigSchema.optional(),
|
|
16476
16501
|
_migrations: exports_external.array(exports_external.string()).optional(),
|
|
16477
|
-
tiers: TiersSchema.optional(),
|
|
16478
16502
|
modelRequirements: ModelRequirementsSchema.optional(),
|
|
16479
16503
|
complexityDowngrades: ComplexityDowngradesSchema.optional()
|
|
16480
16504
|
});
|
|
@@ -18112,6 +18136,12 @@ function wrapAnsi(string4, columns, options) {
|
|
|
18112
18136
|
|
|
18113
18137
|
// node_modules/@clack/core/dist/index.mjs
|
|
18114
18138
|
var import_sisteransi = __toESM(require_src(), 1);
|
|
18139
|
+
function findCursor(s, o, l) {
|
|
18140
|
+
if (!l.some((r) => !r.disabled))
|
|
18141
|
+
return s;
|
|
18142
|
+
const t = s + o, n = Math.max(l.length - 1, 0), e = t < 0 ? n : t > n ? 0 : t;
|
|
18143
|
+
return l[e]?.disabled ? findCursor(e, o < 0 ? -1 : 1, l) : e;
|
|
18144
|
+
}
|
|
18115
18145
|
var a$1 = ["up", "down", "left", "right", "space", "enter", "cancel"];
|
|
18116
18146
|
var t = [
|
|
18117
18147
|
"January",
|
|
@@ -18365,7 +18395,35 @@ class r extends V {
|
|
|
18365
18395
|
});
|
|
18366
18396
|
}
|
|
18367
18397
|
}
|
|
18368
|
-
class n extends V {
|
|
18398
|
+
var n$1 = class n extends V {
|
|
18399
|
+
options;
|
|
18400
|
+
cursor = 0;
|
|
18401
|
+
get _selectedValue() {
|
|
18402
|
+
return this.options[this.cursor];
|
|
18403
|
+
}
|
|
18404
|
+
changeValue() {
|
|
18405
|
+
const e = this._selectedValue;
|
|
18406
|
+
this.value = e === undefined ? undefined : e.value;
|
|
18407
|
+
}
|
|
18408
|
+
constructor(e) {
|
|
18409
|
+
super(e, false), this.options = e.options;
|
|
18410
|
+
const o = this.options.findIndex(({ value: s }) => s === e.initialValue), t2 = o === -1 ? 0 : o;
|
|
18411
|
+
this.cursor = this.options[t2]?.disabled ? findCursor(t2, 1, this.options) : t2, this.changeValue(), this.on("cursor", (s) => {
|
|
18412
|
+
switch (s) {
|
|
18413
|
+
case "left":
|
|
18414
|
+
case "up":
|
|
18415
|
+
this.cursor = findCursor(this.cursor, -1, this.options);
|
|
18416
|
+
break;
|
|
18417
|
+
case "down":
|
|
18418
|
+
case "right":
|
|
18419
|
+
this.cursor = findCursor(this.cursor, 1, this.options);
|
|
18420
|
+
break;
|
|
18421
|
+
}
|
|
18422
|
+
this.changeValue();
|
|
18423
|
+
});
|
|
18424
|
+
}
|
|
18425
|
+
};
|
|
18426
|
+
class n2 extends V {
|
|
18369
18427
|
get userInputWithCursor() {
|
|
18370
18428
|
if (this.state === "submit")
|
|
18371
18429
|
return this.userInput;
|
|
@@ -18440,6 +18498,78 @@ var symbol2 = (o) => {
|
|
|
18440
18498
|
return styleText2("green", S_STEP_SUBMIT);
|
|
18441
18499
|
}
|
|
18442
18500
|
};
|
|
18501
|
+
var symbolBar = (o) => {
|
|
18502
|
+
switch (o) {
|
|
18503
|
+
case "initial":
|
|
18504
|
+
case "active":
|
|
18505
|
+
return styleText2("cyan", S_BAR);
|
|
18506
|
+
case "cancel":
|
|
18507
|
+
return styleText2("red", S_BAR);
|
|
18508
|
+
case "error":
|
|
18509
|
+
return styleText2("yellow", S_BAR);
|
|
18510
|
+
case "submit":
|
|
18511
|
+
return styleText2("green", S_BAR);
|
|
18512
|
+
}
|
|
18513
|
+
};
|
|
18514
|
+
function formatInstructionFooter(o, e) {
|
|
18515
|
+
const r2 = [`${e ? `${styleText2("cyan", S_BAR)} ` : ""}${o.join(" \u2022 ")}`];
|
|
18516
|
+
return e && r2.push(styleText2("cyan", S_BAR_END)), r2;
|
|
18517
|
+
}
|
|
18518
|
+
var I = (l, e, w, p, b, C = false) => {
|
|
18519
|
+
let r2 = e, O = 0;
|
|
18520
|
+
if (C)
|
|
18521
|
+
for (let i = p - 1;i >= w; i--) {
|
|
18522
|
+
const m = l[i];
|
|
18523
|
+
if (m && (r2 -= m.length), O++, r2 <= b)
|
|
18524
|
+
break;
|
|
18525
|
+
}
|
|
18526
|
+
else
|
|
18527
|
+
for (let i = w;i < p; i++) {
|
|
18528
|
+
const m = l[i];
|
|
18529
|
+
if (m && (r2 -= m.length), O++, r2 <= b)
|
|
18530
|
+
break;
|
|
18531
|
+
}
|
|
18532
|
+
return { lineCount: r2, removals: O };
|
|
18533
|
+
};
|
|
18534
|
+
var limitOptions = ({
|
|
18535
|
+
cursor: l,
|
|
18536
|
+
options: e,
|
|
18537
|
+
style: w,
|
|
18538
|
+
output: p = process.stdout,
|
|
18539
|
+
maxItems: b = Number.POSITIVE_INFINITY,
|
|
18540
|
+
columnPadding: C = 0,
|
|
18541
|
+
rowPadding: r2 = 4
|
|
18542
|
+
}) => {
|
|
18543
|
+
const i = getColumns(p) - C, m = getRows(p), M = styleText2("dim", "..."), v = Math.max(m - r2, 0), a2 = Math.max(Math.min(b, v), 5);
|
|
18544
|
+
let f = 0;
|
|
18545
|
+
l >= a2 - 3 && (f = Math.max(Math.min(l - a2 + 3, e.length - a2), 0));
|
|
18546
|
+
let d = a2 < e.length && f > 0, c = a2 < e.length && f + a2 < e.length;
|
|
18547
|
+
const W = Math.min(f + a2, e.length), s = [];
|
|
18548
|
+
let g = 0;
|
|
18549
|
+
d && g++, c && g++;
|
|
18550
|
+
const T = f + (d ? 1 : 0), y = W - (c ? 1 : 0);
|
|
18551
|
+
for (let t2 = T;t2 < y; t2++) {
|
|
18552
|
+
const n3 = e[t2], o = n3 ? w(n3, t2 === l) : "", h2 = wrapAnsi(o, i, {
|
|
18553
|
+
hard: true,
|
|
18554
|
+
trim: false
|
|
18555
|
+
}).split(`
|
|
18556
|
+
`);
|
|
18557
|
+
s.push(h2), g += h2.length;
|
|
18558
|
+
}
|
|
18559
|
+
if (g > v) {
|
|
18560
|
+
let t2 = 0, n3 = 0, o = g;
|
|
18561
|
+
const h2 = l - T;
|
|
18562
|
+
let u2 = v;
|
|
18563
|
+
const L = () => I(s, o, 0, h2, u2), E = () => I(s, o, h2 + 1, s.length, u2, true);
|
|
18564
|
+
d ? ({ lineCount: o, removals: t2 } = L(), o > u2 && (c || (u2 -= 1), { lineCount: o, removals: n3 } = E())) : (c || (u2 -= 1), { lineCount: o, removals: n3 } = E(), o > u2 && (u2 -= 1, { lineCount: o, removals: t2 } = L())), t2 > 0 && (d = true, s.splice(0, t2)), n3 > 0 && (c = true, s.splice(s.length - n3, n3));
|
|
18565
|
+
}
|
|
18566
|
+
const x = [];
|
|
18567
|
+
d && x.push(M);
|
|
18568
|
+
for (const t2 of s)
|
|
18569
|
+
for (const n3 of t2)
|
|
18570
|
+
x.push(n3);
|
|
18571
|
+
return c && x.push(M), x;
|
|
18572
|
+
};
|
|
18443
18573
|
var confirm = (i) => {
|
|
18444
18574
|
const a2 = i.active ?? "Yes", s = i.inactive ?? "No";
|
|
18445
18575
|
return new r({
|
|
@@ -18504,18 +18634,18 @@ var C = (o, e, s) => {
|
|
|
18504
18634
|
hard: true,
|
|
18505
18635
|
trim: false
|
|
18506
18636
|
}, i = wrapAnsi(o, e, a2).split(`
|
|
18507
|
-
`), c = i.reduce((
|
|
18637
|
+
`), c = i.reduce((n3, t2) => Math.max(dist_default2(t2), n3), 0), u2 = i.map(s).reduce((n3, t2) => Math.max(dist_default2(t2), n3), 0), g = e - (u2 - c);
|
|
18508
18638
|
return wrapAnsi(o, g, a2);
|
|
18509
18639
|
};
|
|
18510
18640
|
var note = (o = "", e = "", s) => {
|
|
18511
18641
|
const a2 = s?.output ?? process$1.stdout, i = s?.withGuide ?? settings.withGuide, c = s?.format ?? W$1, g = ["", ...C(o, getColumns(a2) - 6, c).split(`
|
|
18512
|
-
`).map(c), ""],
|
|
18642
|
+
`).map(c), ""], n3 = dist_default2(e), t2 = Math.max(g.reduce((m, F) => {
|
|
18513
18643
|
const O = dist_default2(F);
|
|
18514
18644
|
return O > m ? O : m;
|
|
18515
|
-
}, 0),
|
|
18645
|
+
}, 0), n3) + 2, h2 = g.map((m) => `${styleText2("gray", S_BAR)} ${m}${" ".repeat(t2 - dist_default2(m))}${styleText2("gray", S_BAR)}`).join(`
|
|
18516
18646
|
`), T = i ? `${styleText2("gray", S_BAR)}
|
|
18517
18647
|
` : "", l$1 = i ? S_CONNECT_LEFT : S_CORNER_BOTTOM_LEFT;
|
|
18518
|
-
a2.write(`${T}${styleText2("green", S_STEP_SUBMIT)} ${styleText2("reset", e)} ${styleText2("gray", S_BAR_H.repeat(Math.max(t2 -
|
|
18648
|
+
a2.write(`${T}${styleText2("green", S_STEP_SUBMIT)} ${styleText2("reset", e)} ${styleText2("gray", S_BAR_H.repeat(Math.max(t2 - n3 - 1, 1)) + S_CORNER_TOP_RIGHT)}
|
|
18519
18649
|
${h2}
|
|
18520
18650
|
${styleText2("gray", l$1 + S_BAR_H.repeat(t2 + 2) + S_CORNER_BOTTOM_RIGHT)}
|
|
18521
18651
|
`);
|
|
@@ -18529,8 +18659,71 @@ var SELECT_INSTRUCTIONS = [
|
|
|
18529
18659
|
`${styleText2("dim", "\u2191/\u2193")} to navigate`,
|
|
18530
18660
|
`${styleText2("dim", "Enter:")} confirm`
|
|
18531
18661
|
];
|
|
18662
|
+
var c = (t2, o) => t2.includes(`
|
|
18663
|
+
`) ? t2.split(`
|
|
18664
|
+
`).map((d) => o(d)).join(`
|
|
18665
|
+
`) : o(t2);
|
|
18666
|
+
var select = (t2) => {
|
|
18667
|
+
const o = (n3, m) => {
|
|
18668
|
+
if (n3 === undefined)
|
|
18669
|
+
return "";
|
|
18670
|
+
const s = n3.label ?? String(n3.value);
|
|
18671
|
+
switch (m) {
|
|
18672
|
+
case "disabled":
|
|
18673
|
+
return `${styleText2("gray", S_RADIO_INACTIVE)} ${c(s, (i) => styleText2("gray", i))}${n3.hint ? ` ${styleText2("dim", `(${n3.hint ?? "disabled"})`)}` : ""}`;
|
|
18674
|
+
case "selected":
|
|
18675
|
+
return `${c(s, (i) => styleText2("dim", i))}`;
|
|
18676
|
+
case "active":
|
|
18677
|
+
return `${styleText2("green", S_RADIO_ACTIVE)} ${s}${n3.hint ? ` ${styleText2("dim", `(${n3.hint})`)}` : ""}`;
|
|
18678
|
+
case "cancelled":
|
|
18679
|
+
return `${c(s, (i) => styleText2(["strikethrough", "dim"], i))}`;
|
|
18680
|
+
default:
|
|
18681
|
+
return `${styleText2("dim", S_RADIO_INACTIVE)} ${c(s, (i) => styleText2("dim", i))}`;
|
|
18682
|
+
}
|
|
18683
|
+
}, d = t2.showInstructions ?? true;
|
|
18684
|
+
return new n$1({
|
|
18685
|
+
options: t2.options,
|
|
18686
|
+
signal: t2.signal,
|
|
18687
|
+
input: t2.input,
|
|
18688
|
+
output: t2.output,
|
|
18689
|
+
initialValue: t2.initialValue,
|
|
18690
|
+
render() {
|
|
18691
|
+
const n3 = t2.withGuide ?? settings.withGuide, m = `${symbol2(this.state)} `, s = `${symbolBar(this.state)} `, i = wrapTextWithPrefix(t2.output, t2.message, s, m), u3 = `${n3 ? `${styleText2("gray", S_BAR)}
|
|
18692
|
+
` : ""}${i}
|
|
18693
|
+
`;
|
|
18694
|
+
switch (this.state) {
|
|
18695
|
+
case "submit": {
|
|
18696
|
+
const r2 = n3 ? `${styleText2("gray", S_BAR)} ` : "", a2 = wrapTextWithPrefix(t2.output, o(this.options[this.cursor], "selected"), r2);
|
|
18697
|
+
return `${u3}${a2}`;
|
|
18698
|
+
}
|
|
18699
|
+
case "cancel": {
|
|
18700
|
+
const r2 = n3 ? `${styleText2("gray", S_BAR)} ` : "", a2 = wrapTextWithPrefix(t2.output, o(this.options[this.cursor], "cancelled"), r2);
|
|
18701
|
+
return `${u3}${a2}${n3 ? `
|
|
18702
|
+
${styleText2("gray", S_BAR)}` : ""}`;
|
|
18703
|
+
}
|
|
18704
|
+
default: {
|
|
18705
|
+
const r2 = n3 ? `${styleText2("cyan", S_BAR)} ` : "", a2 = u3.split(`
|
|
18706
|
+
`).length, p = d ? formatInstructionFooter(SELECT_INSTRUCTIONS, n3) : n3 ? [styleText2("cyan", S_BAR_END)] : [], b = p.join(`
|
|
18707
|
+
`), f = p.length + 1;
|
|
18708
|
+
return `${u3}${r2}${limitOptions({
|
|
18709
|
+
output: t2.output,
|
|
18710
|
+
cursor: this.cursor,
|
|
18711
|
+
options: this.options,
|
|
18712
|
+
maxItems: t2.maxItems,
|
|
18713
|
+
columnPadding: r2.length,
|
|
18714
|
+
rowPadding: a2 + f,
|
|
18715
|
+
style: (g, x) => o(g, g.disabled ? "disabled" : x ? "active" : "inactive")
|
|
18716
|
+
}).join(`
|
|
18717
|
+
${r2}`)}
|
|
18718
|
+
${b}
|
|
18719
|
+
`;
|
|
18720
|
+
}
|
|
18721
|
+
}
|
|
18722
|
+
}
|
|
18723
|
+
}).prompt();
|
|
18724
|
+
};
|
|
18532
18725
|
var i = `${styleText2("gray", S_BAR)} `;
|
|
18533
|
-
var text = (e) => new
|
|
18726
|
+
var text = (e) => new n2({
|
|
18534
18727
|
validate: e.validate,
|
|
18535
18728
|
placeholder: e.placeholder,
|
|
18536
18729
|
defaultValue: e.defaultValue,
|
|
@@ -18541,27 +18734,27 @@ var text = (e) => new n({
|
|
|
18541
18734
|
render() {
|
|
18542
18735
|
const i2 = e?.withGuide ?? settings.withGuide, s = `${`${i2 ? `${styleText2("gray", S_BAR)}
|
|
18543
18736
|
` : ""}${symbol2(this.state)} `}${e.message}
|
|
18544
|
-
`,
|
|
18737
|
+
`, c2 = e.placeholder && e.placeholder.length > 0 ? styleText2("inverse", e.placeholder[0]) + styleText2("dim", e.placeholder.slice(1)) : styleText2(["inverse", "hidden"], "_"), o = this.userInput ? this.userInputWithCursor : c2, l = this.value ?? "";
|
|
18545
18738
|
switch (this.state) {
|
|
18546
18739
|
case "error": {
|
|
18547
|
-
const
|
|
18740
|
+
const n3 = this.error ? ` ${styleText2("yellow", this.error)}` : "", r2 = i2 ? `${styleText2("yellow", S_BAR)} ` : "", d = i2 ? styleText2("yellow", S_BAR_END) : "";
|
|
18548
18741
|
return `${s.trim()}
|
|
18549
18742
|
${r2}${o}
|
|
18550
|
-
${d}${
|
|
18743
|
+
${d}${n3}
|
|
18551
18744
|
`;
|
|
18552
18745
|
}
|
|
18553
18746
|
case "submit": {
|
|
18554
|
-
const
|
|
18555
|
-
return `${s}${r2}${
|
|
18747
|
+
const n3 = l ? ` ${styleText2("dim", l)}` : "", r2 = i2 ? styleText2("gray", S_BAR) : "";
|
|
18748
|
+
return `${s}${r2}${n3}`;
|
|
18556
18749
|
}
|
|
18557
18750
|
case "cancel": {
|
|
18558
|
-
const
|
|
18559
|
-
return `${s}${r2}${
|
|
18751
|
+
const n3 = l ? ` ${styleText2(["strikethrough", "dim"], l)}` : "", r2 = i2 ? styleText2("gray", S_BAR) : "";
|
|
18752
|
+
return `${s}${r2}${n3}${l.trim() ? `
|
|
18560
18753
|
${r2}` : ""}`;
|
|
18561
18754
|
}
|
|
18562
18755
|
default: {
|
|
18563
|
-
const
|
|
18564
|
-
return `${s}${
|
|
18756
|
+
const n3 = i2 ? `${styleText2("cyan", S_BAR)} ` : "", r2 = i2 ? styleText2("cyan", S_BAR_END) : "";
|
|
18757
|
+
return `${s}${n3}${o}
|
|
18565
18758
|
${r2}
|
|
18566
18759
|
`;
|
|
18567
18760
|
}
|
|
@@ -18597,7 +18790,7 @@ async function runSetupPrompts(deps, opts) {
|
|
|
18597
18790
|
}
|
|
18598
18791
|
}
|
|
18599
18792
|
const taskSystemAns = await confirm({
|
|
18600
|
-
message: "Enable
|
|
18793
|
+
message: "Enable task system (tasks.enabled)?",
|
|
18601
18794
|
initialValue: true
|
|
18602
18795
|
});
|
|
18603
18796
|
if (isCancel(taskSystemAns)) {
|
|
@@ -18698,7 +18891,7 @@ async function runSetupPrompts(deps, opts) {
|
|
|
18698
18891
|
}
|
|
18699
18892
|
|
|
18700
18893
|
// src/cli/setup/index.ts
|
|
18701
|
-
import { existsSync as
|
|
18894
|
+
import { existsSync as existsSync17, readFileSync as readFileSync15 } from "fs";
|
|
18702
18895
|
|
|
18703
18896
|
// src/cli/setup/config-writer.ts
|
|
18704
18897
|
import { existsSync as existsSync14, mkdirSync as mkdirSync3, readFileSync as readFileSync12, writeFileSync as writeFileSync3 } from "fs";
|
|
@@ -18743,9 +18936,9 @@ function resolveMatrixxConfigPath() {
|
|
|
18743
18936
|
}
|
|
18744
18937
|
function buildMatrixxConfig(state, existing) {
|
|
18745
18938
|
const next = { ...existing ?? {} };
|
|
18746
|
-
next.
|
|
18747
|
-
...existing?.
|
|
18748
|
-
|
|
18939
|
+
next.tasks = {
|
|
18940
|
+
...existing?.tasks ?? {},
|
|
18941
|
+
enabled: state.taskSystem
|
|
18749
18942
|
};
|
|
18750
18943
|
next.headroom = {
|
|
18751
18944
|
enabled: state.headroom.enabled,
|
|
@@ -18761,6 +18954,13 @@ function buildMatrixxConfig(state, existing) {
|
|
|
18761
18954
|
...existing?.dcp ?? {},
|
|
18762
18955
|
enabled: state.dcp.enabled
|
|
18763
18956
|
};
|
|
18957
|
+
if (state.preset) {
|
|
18958
|
+
next.model_presets = {
|
|
18959
|
+
...existing?.model_presets ?? {},
|
|
18960
|
+
[state.preset.name]: state.preset.preset
|
|
18961
|
+
};
|
|
18962
|
+
next.active_preset = state.preset.name;
|
|
18963
|
+
}
|
|
18764
18964
|
const parsed = MatrixxConfigSchema.safeParse(next);
|
|
18765
18965
|
if (parsed.success)
|
|
18766
18966
|
return parsed.data;
|
|
@@ -18861,8 +19061,8 @@ async function syncOpencodePlugins(state, opts) {
|
|
|
18861
19061
|
} else {
|
|
18862
19062
|
const fallback = join16(dir, "opencode.jsonc");
|
|
18863
19063
|
if (existsSync15(fallback)) {
|
|
18864
|
-
const
|
|
18865
|
-
const p = parseJsoncSafe(
|
|
19064
|
+
const c2 = readFileSync13(fallback, "utf-8");
|
|
19065
|
+
const p = parseJsoncSafe(c2);
|
|
18866
19066
|
if (p.data)
|
|
18867
19067
|
raw = p.data;
|
|
18868
19068
|
}
|
|
@@ -18887,6 +19087,229 @@ async function syncOpencodePlugins(state, opts) {
|
|
|
18887
19087
|
`);
|
|
18888
19088
|
}
|
|
18889
19089
|
|
|
19090
|
+
// src/shared/model-availability.ts
|
|
19091
|
+
import { existsSync as existsSync16, readFileSync as readFileSync14 } from "fs";
|
|
19092
|
+
import { join as join17 } from "path";
|
|
19093
|
+
|
|
19094
|
+
// src/shared/normalize-sdk-response.ts
|
|
19095
|
+
function normalizeSDKResponse(response, fallback, options) {
|
|
19096
|
+
if (response === null || response === undefined) {
|
|
19097
|
+
return fallback;
|
|
19098
|
+
}
|
|
19099
|
+
if (Array.isArray(response)) {
|
|
19100
|
+
return response;
|
|
19101
|
+
}
|
|
19102
|
+
if (typeof response === "object" && "data" in response) {
|
|
19103
|
+
const data = response.data;
|
|
19104
|
+
if (data !== null && data !== undefined) {
|
|
19105
|
+
return data;
|
|
19106
|
+
}
|
|
19107
|
+
if (options?.preferResponseOnMissingData === true) {
|
|
19108
|
+
return response;
|
|
19109
|
+
}
|
|
19110
|
+
return fallback;
|
|
19111
|
+
}
|
|
19112
|
+
if (options?.preferResponseOnMissingData === true) {
|
|
19113
|
+
return response;
|
|
19114
|
+
}
|
|
19115
|
+
return fallback;
|
|
19116
|
+
}
|
|
19117
|
+
|
|
19118
|
+
// src/shared/model-availability.ts
|
|
19119
|
+
async function getConnectedProviders(client) {
|
|
19120
|
+
if (!client?.provider?.list) {
|
|
19121
|
+
log("[getConnectedProviders] client.provider.list not available");
|
|
19122
|
+
return [];
|
|
19123
|
+
}
|
|
19124
|
+
try {
|
|
19125
|
+
const result = await client.provider.list();
|
|
19126
|
+
const connected = result.data?.connected ?? [];
|
|
19127
|
+
log("[getConnectedProviders] connected providers", { count: connected.length, providers: connected });
|
|
19128
|
+
return connected;
|
|
19129
|
+
} catch (err) {
|
|
19130
|
+
log("[getConnectedProviders] SDK error", { error: String(err) });
|
|
19131
|
+
return [];
|
|
19132
|
+
}
|
|
19133
|
+
}
|
|
19134
|
+
async function fetchAvailableModels(client, options) {
|
|
19135
|
+
let connectedProviders = options?.connectedProviders ?? null;
|
|
19136
|
+
let connectedProvidersUnknown = connectedProviders === null;
|
|
19137
|
+
log("[fetchAvailableModels] CALLED", {
|
|
19138
|
+
connectedProvidersUnknown,
|
|
19139
|
+
connectedProviders: options?.connectedProviders
|
|
19140
|
+
});
|
|
19141
|
+
if (connectedProvidersUnknown && client) {
|
|
19142
|
+
const liveConnected = await getConnectedProviders(client);
|
|
19143
|
+
if (liveConnected.length > 0) {
|
|
19144
|
+
connectedProviders = liveConnected;
|
|
19145
|
+
connectedProvidersUnknown = false;
|
|
19146
|
+
log("[fetchAvailableModels] connected providers fetched from client", { count: liveConnected.length });
|
|
19147
|
+
}
|
|
19148
|
+
}
|
|
19149
|
+
if (connectedProvidersUnknown) {
|
|
19150
|
+
if (client?.model?.list) {
|
|
19151
|
+
const modelSet2 = new Set;
|
|
19152
|
+
try {
|
|
19153
|
+
const modelsResult = await client.model.list();
|
|
19154
|
+
const models = normalizeSDKResponse(modelsResult, []);
|
|
19155
|
+
for (const model of models) {
|
|
19156
|
+
if (model?.provider && model?.id) {
|
|
19157
|
+
modelSet2.add(`${model.provider}/${model.id}`);
|
|
19158
|
+
}
|
|
19159
|
+
}
|
|
19160
|
+
log("[fetchAvailableModels] fetched models from client without provider filter", {
|
|
19161
|
+
count: modelSet2.size
|
|
19162
|
+
});
|
|
19163
|
+
return modelSet2;
|
|
19164
|
+
} catch (err) {
|
|
19165
|
+
log("[fetchAvailableModels] client.model.list error", { error: String(err) });
|
|
19166
|
+
}
|
|
19167
|
+
}
|
|
19168
|
+
log("[fetchAvailableModels] connected providers unknown, returning empty set for fallback resolution");
|
|
19169
|
+
return new Set;
|
|
19170
|
+
}
|
|
19171
|
+
const connectedProvidersList = connectedProviders ?? [];
|
|
19172
|
+
const connectedSet = new Set(connectedProvidersList);
|
|
19173
|
+
const modelSet = new Set;
|
|
19174
|
+
const providerModelsCache = readProviderModelsCache();
|
|
19175
|
+
if (providerModelsCache) {
|
|
19176
|
+
const providerCount = Object.keys(providerModelsCache.models).length;
|
|
19177
|
+
if (providerCount === 0) {
|
|
19178
|
+
log("[fetchAvailableModels] provider-models cache empty, falling back to models.json");
|
|
19179
|
+
} else {
|
|
19180
|
+
log("[fetchAvailableModels] using provider-models cache (whitelist-filtered)");
|
|
19181
|
+
const modelsByProvider = providerModelsCache.models;
|
|
19182
|
+
for (const [providerId, modelIds] of Object.entries(modelsByProvider)) {
|
|
19183
|
+
if (!connectedSet.has(providerId)) {
|
|
19184
|
+
continue;
|
|
19185
|
+
}
|
|
19186
|
+
for (const modelItem of modelIds) {
|
|
19187
|
+
const modelId = typeof modelItem === "string" ? modelItem : modelItem?.id;
|
|
19188
|
+
if (modelId) {
|
|
19189
|
+
modelSet.add(`${providerId}/${modelId}`);
|
|
19190
|
+
}
|
|
19191
|
+
}
|
|
19192
|
+
}
|
|
19193
|
+
log("[fetchAvailableModels] parsed from provider-models cache", {
|
|
19194
|
+
count: modelSet.size,
|
|
19195
|
+
connectedProviders: connectedProvidersList.slice(0, 5)
|
|
19196
|
+
});
|
|
19197
|
+
if (modelSet.size > 0) {
|
|
19198
|
+
return modelSet;
|
|
19199
|
+
}
|
|
19200
|
+
log("[fetchAvailableModels] provider-models cache produced no models for connected providers, falling back to models.json");
|
|
19201
|
+
}
|
|
19202
|
+
}
|
|
19203
|
+
log("[fetchAvailableModels] provider-models cache not found, falling back to models.json");
|
|
19204
|
+
const cacheFile = join17(getOpenCodeCacheDir(), "models.json");
|
|
19205
|
+
if (!existsSync16(cacheFile)) {
|
|
19206
|
+
log("[fetchAvailableModels] models.json cache file not found, falling back to client");
|
|
19207
|
+
} else {
|
|
19208
|
+
try {
|
|
19209
|
+
const content = readFileSync14(cacheFile, "utf-8");
|
|
19210
|
+
const data = JSON.parse(content);
|
|
19211
|
+
const providerIds = Object.keys(data);
|
|
19212
|
+
log("[fetchAvailableModels] providers found in models.json", { count: providerIds.length, providers: providerIds.slice(0, 10) });
|
|
19213
|
+
for (const providerId of providerIds) {
|
|
19214
|
+
if (!connectedSet.has(providerId)) {
|
|
19215
|
+
continue;
|
|
19216
|
+
}
|
|
19217
|
+
const provider = data[providerId];
|
|
19218
|
+
const models = provider?.models;
|
|
19219
|
+
if (!models || typeof models !== "object")
|
|
19220
|
+
continue;
|
|
19221
|
+
for (const modelKey of Object.keys(models)) {
|
|
19222
|
+
modelSet.add(`${providerId}/${modelKey}`);
|
|
19223
|
+
}
|
|
19224
|
+
}
|
|
19225
|
+
log("[fetchAvailableModels] parsed models from models.json (NO whitelist filtering)", {
|
|
19226
|
+
count: modelSet.size,
|
|
19227
|
+
connectedProviders: connectedProvidersList.slice(0, 5)
|
|
19228
|
+
});
|
|
19229
|
+
if (modelSet.size > 0) {
|
|
19230
|
+
return modelSet;
|
|
19231
|
+
}
|
|
19232
|
+
} catch (err) {
|
|
19233
|
+
log("[fetchAvailableModels] error", { error: String(err) });
|
|
19234
|
+
}
|
|
19235
|
+
}
|
|
19236
|
+
if (client?.model?.list) {
|
|
19237
|
+
try {
|
|
19238
|
+
const modelsResult = await client.model.list();
|
|
19239
|
+
const models = normalizeSDKResponse(modelsResult, []);
|
|
19240
|
+
for (const model of models) {
|
|
19241
|
+
if (!model?.provider || !model?.id)
|
|
19242
|
+
continue;
|
|
19243
|
+
if (connectedSet.has(model.provider)) {
|
|
19244
|
+
modelSet.add(`${model.provider}/${model.id}`);
|
|
19245
|
+
}
|
|
19246
|
+
}
|
|
19247
|
+
log("[fetchAvailableModels] fetched models from client (filtered)", {
|
|
19248
|
+
count: modelSet.size,
|
|
19249
|
+
connectedProviders: connectedProvidersList.slice(0, 5)
|
|
19250
|
+
});
|
|
19251
|
+
} catch (err) {
|
|
19252
|
+
log("[fetchAvailableModels] client.model.list error", { error: String(err) });
|
|
19253
|
+
}
|
|
19254
|
+
}
|
|
19255
|
+
return modelSet;
|
|
19256
|
+
}
|
|
19257
|
+
|
|
19258
|
+
// src/cli/setup/preset-wizard.ts
|
|
19259
|
+
var NO_CONNECTED_PROVIDERS_ERROR = "No connected providers detected. Configure at least one provider in OpenCode (opencode auth login), then re-run: bunx opencode-matrixx setup";
|
|
19260
|
+
function buildDefaultPreset(model, agentNames, categoryNames) {
|
|
19261
|
+
return {
|
|
19262
|
+
default_model: model,
|
|
19263
|
+
agents: Object.fromEntries(agentNames.map((name) => [name, { model }])),
|
|
19264
|
+
categories: Object.fromEntries(categoryNames.map((name) => [name, { model }]))
|
|
19265
|
+
};
|
|
19266
|
+
}
|
|
19267
|
+
async function detectAvailableModels() {
|
|
19268
|
+
const connected = readConnectedProvidersCache();
|
|
19269
|
+
return fetchAvailableModels(undefined, {
|
|
19270
|
+
connectedProviders: connected && connected.length > 0 ? connected : undefined
|
|
19271
|
+
});
|
|
19272
|
+
}
|
|
19273
|
+
async function runPresetWizard(opts) {
|
|
19274
|
+
if (opts.skip)
|
|
19275
|
+
return { status: "skipped" };
|
|
19276
|
+
const models = await detectAvailableModels();
|
|
19277
|
+
if (models.size === 0) {
|
|
19278
|
+
return { status: "no-providers", error: NO_CONNECTED_PROVIDERS_ERROR };
|
|
19279
|
+
}
|
|
19280
|
+
const generate = await confirm({
|
|
19281
|
+
message: "Generate a default model preset from your connected providers?",
|
|
19282
|
+
initialValue: true
|
|
19283
|
+
});
|
|
19284
|
+
if (isCancel(generate)) {
|
|
19285
|
+
cancel("Cancelled");
|
|
19286
|
+
process.exit(130);
|
|
19287
|
+
}
|
|
19288
|
+
if (!generate)
|
|
19289
|
+
return { status: "skipped" };
|
|
19290
|
+
const nameAns = await text({
|
|
19291
|
+
message: "Preset name?",
|
|
19292
|
+
initialValue: "default"
|
|
19293
|
+
});
|
|
19294
|
+
if (isCancel(nameAns)) {
|
|
19295
|
+
cancel("Cancelled");
|
|
19296
|
+
process.exit(130);
|
|
19297
|
+
}
|
|
19298
|
+
const name = nameAns.trim() || "default";
|
|
19299
|
+
const modelOptions = [...models].sort().map((model) => ({ value: model, label: model }));
|
|
19300
|
+
const modelAns = await select({
|
|
19301
|
+
message: "Default model for all agents and categories?",
|
|
19302
|
+
options: modelOptions,
|
|
19303
|
+
initialValue: modelOptions[0]?.value
|
|
19304
|
+
});
|
|
19305
|
+
if (isCancel(modelAns)) {
|
|
19306
|
+
cancel("Cancelled");
|
|
19307
|
+
process.exit(130);
|
|
19308
|
+
}
|
|
19309
|
+
const preset = buildDefaultPreset(modelAns, BuiltinAgentNameSchema.options, BuiltinCategoryNameSchema.options);
|
|
19310
|
+
return { status: "generated", name, preset };
|
|
19311
|
+
}
|
|
19312
|
+
|
|
18890
19313
|
// src/cli/setup/index.ts
|
|
18891
19314
|
async function executeSetup(opts) {
|
|
18892
19315
|
const required2 = checkRequiredDeps();
|
|
@@ -18909,14 +19332,21 @@ Install them and re-run: bunx opencode-matrixx setup`;
|
|
|
18909
19332
|
} catch {}
|
|
18910
19333
|
if (!existing) {
|
|
18911
19334
|
try {
|
|
18912
|
-
const raw =
|
|
19335
|
+
const raw = readFileSync15(matrixxPath, "utf-8");
|
|
18913
19336
|
if (raw.trim())
|
|
18914
19337
|
existing = JSON.parse(raw);
|
|
18915
19338
|
} catch {}
|
|
18916
19339
|
}
|
|
18917
|
-
const
|
|
18918
|
-
|
|
18919
|
-
|
|
19340
|
+
const presetResult = await runPresetWizard({
|
|
19341
|
+
skip: (opts.skipPresets ?? false) || opts.yes || Boolean(existing?.model_presets)
|
|
19342
|
+
});
|
|
19343
|
+
if (presetResult.status === "no-providers") {
|
|
19344
|
+
return presetResult.error;
|
|
19345
|
+
}
|
|
19346
|
+
const stateWithPreset = presetResult.status === "generated" ? { ...state, preset: { name: presetResult.name, preset: presetResult.preset } } : state;
|
|
19347
|
+
const nextConfig = buildMatrixxConfig(stateWithPreset, existing);
|
|
19348
|
+
if (existing && !opts.yes && !opts.dryRun && existsSync17(matrixxPath)) {
|
|
19349
|
+
const existingContent = readFileSync15(matrixxPath, "utf-8");
|
|
18920
19350
|
const nextContent = `${JSON.stringify(nextConfig, null, 2)}
|
|
18921
19351
|
`;
|
|
18922
19352
|
note(previewDiff(existingContent, nextContent).slice(0, 2000), "Diff preview (existing \u2192 new)");
|
|
@@ -18943,7 +19373,8 @@ Run with --yes to overwrite without prompt.`;
|
|
|
18943
19373
|
report,
|
|
18944
19374
|
"",
|
|
18945
19375
|
`\u2713 matrixx.jsonc \u2192 ${matrixxPath}${opts.dryRun ? " (preview)" : ""}`,
|
|
18946
|
-
`
|
|
19376
|
+
` tasks.enabled: ${state.taskSystem}, headroom: ${state.headroom.enabled}, rtk: ${state.rtk.enabled}, dcp: ${state.dcp.enabled}, context-mode: ${state.contextMode}`,
|
|
19377
|
+
stateWithPreset.preset ? ` model preset: ${stateWithPreset.preset.name} (active_preset)` : "",
|
|
18947
19378
|
"",
|
|
18948
19379
|
"Next steps:",
|
|
18949
19380
|
" 1. Restart OpenCode to load new config",
|
|
@@ -18961,13 +19392,13 @@ function getVersion() {
|
|
|
18961
19392
|
try {
|
|
18962
19393
|
const thisDir = dirname3(fileURLToPath(import.meta.url));
|
|
18963
19394
|
const candidates = [
|
|
18964
|
-
|
|
18965
|
-
|
|
19395
|
+
join18(thisDir, "../../package.json"),
|
|
19396
|
+
join18(thisDir, "../package.json"),
|
|
18966
19397
|
"package.json"
|
|
18967
19398
|
];
|
|
18968
19399
|
for (const p of candidates) {
|
|
18969
19400
|
try {
|
|
18970
|
-
const raw =
|
|
19401
|
+
const raw = readFileSync16(p, "utf-8");
|
|
18971
19402
|
const pkg = JSON.parse(raw);
|
|
18972
19403
|
if (pkg.version && typeof pkg.version === "string")
|
|
18973
19404
|
return pkg.version;
|
|
@@ -18999,6 +19430,7 @@ Options:
|
|
|
18999
19430
|
--verbose (install) Display detailed logs
|
|
19000
19431
|
--yes, -y (setup) Non-interactive defaults (no prompts)
|
|
19001
19432
|
--dry-run (setup) Preview changes without writing
|
|
19433
|
+
--skip-presets (setup) Skip model preset generation (headless/CI)
|
|
19002
19434
|
|
|
19003
19435
|
Doctor categories:
|
|
19004
19436
|
installation Plugin registration and OpenCode version
|
|
@@ -19026,6 +19458,7 @@ function parseArgs(argv) {
|
|
|
19026
19458
|
local: false,
|
|
19027
19459
|
yes: false,
|
|
19028
19460
|
dryRun: false,
|
|
19461
|
+
skipPresets: false,
|
|
19029
19462
|
extra: []
|
|
19030
19463
|
};
|
|
19031
19464
|
let args = argv.slice(2);
|
|
@@ -19045,6 +19478,8 @@ function parseArgs(argv) {
|
|
|
19045
19478
|
result.yes = true;
|
|
19046
19479
|
} else if (a2 === "--dry-run") {
|
|
19047
19480
|
result.dryRun = true;
|
|
19481
|
+
} else if (a2 === "--skip-presets") {
|
|
19482
|
+
result.skipPresets = true;
|
|
19048
19483
|
} else if (a2 === "--no-tui") {
|
|
19049
19484
|
result.noTui = true;
|
|
19050
19485
|
} else if (a2 === "--local") {
|
|
@@ -19119,7 +19554,7 @@ async function main() {
|
|
|
19119
19554
|
return;
|
|
19120
19555
|
}
|
|
19121
19556
|
if (args.command === "setup") {
|
|
19122
|
-
const output = await executeSetup({ dryRun: args.dryRun, yes: args.yes });
|
|
19557
|
+
const output = await executeSetup({ dryRun: args.dryRun, yes: args.yes, skipPresets: args.skipPresets });
|
|
19123
19558
|
console.log(output);
|
|
19124
19559
|
return;
|
|
19125
19560
|
}
|