codealmanac 0.2.5 → 0.2.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/COMMERCIAL.md +9 -0
- package/LICENSE +133 -21
- package/README.md +11 -11
- package/dist/{agents-RVTQYE6A.js → agents-HYRWRHRX.js} +4 -4
- package/dist/{chunk-TT6ZP4GS.js → chunk-2BNDNGUR.js} +8 -4
- package/dist/{chunk-TT6ZP4GS.js.map → chunk-2BNDNGUR.js.map} +1 -1
- package/dist/{chunk-P5WGG4FJ.js → chunk-3E7JNMTZ.js} +28 -3
- package/dist/chunk-3E7JNMTZ.js.map +1 -0
- package/dist/{chunk-SMIK2YLU.js → chunk-DW32TL5W.js} +117 -83
- package/dist/chunk-DW32TL5W.js.map +1 -0
- package/dist/{chunk-6BJUYZ43.js → chunk-GPFVEF6V.js} +28 -18
- package/dist/chunk-GPFVEF6V.js.map +1 -0
- package/dist/{chunk-TILAKDN6.js → chunk-HJ3WREGP.js} +2 -2
- package/dist/{chunk-BGUID5BS.js → chunk-J7DNV2DH.js} +219 -26
- package/dist/chunk-J7DNV2DH.js.map +1 -0
- package/dist/{chunk-DL5BXZCX.js → chunk-K2JBCB7R.js} +40 -54
- package/dist/chunk-K2JBCB7R.js.map +1 -0
- package/dist/{chunk-MRRX4UQB.js → chunk-ODJAAJGZ.js} +2 -2
- package/dist/{chunk-447U3GQJ.js → chunk-PDFS5VFE.js} +17 -5
- package/dist/chunk-PDFS5VFE.js.map +1 -0
- package/dist/{chunk-GFUB57IT.js → chunk-VXDPUOQ5.js} +384 -207
- package/dist/chunk-VXDPUOQ5.js.map +1 -0
- package/dist/{cli-CL4ID7EO.js → cli-MKXCNEMW.js} +14 -14
- package/dist/codealmanac.js +1 -1
- package/dist/{config-ML2RCR7J.js → config-F7FKEQ7F.js} +3 -3
- package/dist/doctor-37UH3HT5.js +17 -0
- package/dist/{hook-2NP3UE7U.js → hook-4SVX446M.js} +4 -2
- package/dist/{register-commands-FBJ6XQ3L.js → register-commands-2F6SXLDI.js} +30 -21
- package/dist/register-commands-2F6SXLDI.js.map +1 -0
- package/dist/uninstall-C62ZOK32.js +17 -0
- package/dist/{update-P2IPG7RO.js → update-2UGOFN5C.js} +3 -3
- package/guides/mini.md +3 -3
- package/guides/reference.md +7 -7
- package/package.json +4 -3
- package/dist/chunk-447U3GQJ.js.map +0 -1
- package/dist/chunk-6BJUYZ43.js.map +0 -1
- package/dist/chunk-BGUID5BS.js.map +0 -1
- package/dist/chunk-DL5BXZCX.js.map +0 -1
- package/dist/chunk-GFUB57IT.js.map +0 -1
- package/dist/chunk-P5WGG4FJ.js.map +0 -1
- package/dist/chunk-SMIK2YLU.js.map +0 -1
- package/dist/doctor-DOLJRGS4.js +0 -17
- package/dist/register-commands-FBJ6XQ3L.js.map +0 -1
- package/dist/uninstall-DX6LFKMX.js +0 -15
- /package/dist/{agents-RVTQYE6A.js.map → agents-HYRWRHRX.js.map} +0 -0
- /package/dist/{chunk-TILAKDN6.js.map → chunk-HJ3WREGP.js.map} +0 -0
- /package/dist/{chunk-MRRX4UQB.js.map → chunk-ODJAAJGZ.js.map} +0 -0
- /package/dist/{cli-CL4ID7EO.js.map → cli-MKXCNEMW.js.map} +0 -0
- /package/dist/{config-ML2RCR7J.js.map → config-F7FKEQ7F.js.map} +0 -0
- /package/dist/{doctor-DOLJRGS4.js.map → doctor-37UH3HT5.js.map} +0 -0
- /package/dist/{hook-2NP3UE7U.js.map → hook-4SVX446M.js.map} +0 -0
- /package/dist/{uninstall-DX6LFKMX.js.map → uninstall-C62ZOK32.js.map} +0 -0
- /package/dist/{update-P2IPG7RO.js.map → update-2UGOFN5C.js.map} +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
-
|
|
3
|
+
getEnabledAgentProviderIds,
|
|
4
4
|
isAgentProviderId,
|
|
5
5
|
readConfig
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-3E7JNMTZ.js";
|
|
7
7
|
|
|
8
8
|
// src/agent/providers/claude/index.ts
|
|
9
9
|
import { query } from "@anthropic-ai/claude-agent-sdk";
|
|
@@ -147,8 +147,52 @@ var claudeProvider = {
|
|
|
147
147
|
metadata,
|
|
148
148
|
checkStatus,
|
|
149
149
|
assertReady,
|
|
150
|
-
run
|
|
150
|
+
run,
|
|
151
|
+
modelChoices
|
|
151
152
|
};
|
|
153
|
+
var CLAUDE_MODELS = [
|
|
154
|
+
{
|
|
155
|
+
value: "claude-opus-4-7",
|
|
156
|
+
label: "Opus 4.7",
|
|
157
|
+
recommended: false
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
value: "claude-sonnet-4-6",
|
|
161
|
+
label: "Sonnet 4.6",
|
|
162
|
+
recommended: true
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
value: "claude-haiku-4-5-20251001",
|
|
166
|
+
label: "Haiku 4.5",
|
|
167
|
+
recommended: false
|
|
168
|
+
}
|
|
169
|
+
];
|
|
170
|
+
function modelChoices(args) {
|
|
171
|
+
const choices = [];
|
|
172
|
+
if (args.configuredModel !== null && !CLAUDE_MODELS.some((model) => model.value === args.configuredModel)) {
|
|
173
|
+
choices.push({
|
|
174
|
+
value: args.configuredModel,
|
|
175
|
+
label: args.configuredModel,
|
|
176
|
+
recommended: false,
|
|
177
|
+
source: "configured"
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
for (const model of CLAUDE_MODELS) {
|
|
181
|
+
choices.push({
|
|
182
|
+
value: model.value,
|
|
183
|
+
label: model.label,
|
|
184
|
+
recommended: model.recommended,
|
|
185
|
+
source: "catalog"
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
choices.push({
|
|
189
|
+
value: "__custom__",
|
|
190
|
+
label: "Enter a model name",
|
|
191
|
+
recommended: false,
|
|
192
|
+
source: "custom"
|
|
193
|
+
});
|
|
194
|
+
return choices;
|
|
195
|
+
}
|
|
152
196
|
async function run(opts) {
|
|
153
197
|
const claudeExecutable = resolveClaudeExecutable();
|
|
154
198
|
const q = query({
|
|
@@ -277,6 +321,47 @@ ${stderr}`.trim();
|
|
|
277
321
|
});
|
|
278
322
|
});
|
|
279
323
|
}
|
|
324
|
+
function runInjectedStatusCommand(spawnCli, args) {
|
|
325
|
+
return new Promise((resolve) => {
|
|
326
|
+
let stdout = "";
|
|
327
|
+
let stderr = "";
|
|
328
|
+
let settled = false;
|
|
329
|
+
const settle = (value) => {
|
|
330
|
+
if (settled) return;
|
|
331
|
+
settled = true;
|
|
332
|
+
resolve(value);
|
|
333
|
+
};
|
|
334
|
+
try {
|
|
335
|
+
const child = spawnCli(args);
|
|
336
|
+
child.stdout.on("data", (chunk) => {
|
|
337
|
+
stdout += chunk.toString();
|
|
338
|
+
});
|
|
339
|
+
child.stderr.on("data", (chunk) => {
|
|
340
|
+
stderr += chunk.toString();
|
|
341
|
+
});
|
|
342
|
+
child.on("error", (err) => {
|
|
343
|
+
settle({
|
|
344
|
+
ok: false,
|
|
345
|
+
detail: err instanceof Error ? err.message : String(err)
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
child.on("close", (codeOrError) => {
|
|
349
|
+
const code = typeof codeOrError === "number" ? codeOrError : 1;
|
|
350
|
+
const text = `${stdout}
|
|
351
|
+
${stderr}`.trim();
|
|
352
|
+
settle({
|
|
353
|
+
ok: code === 0,
|
|
354
|
+
detail: text.split("\n").find((line) => line.trim().length > 0)?.trim() ?? (code === 0 ? "ready" : `${args[0] ?? "command"} exited ${code}`)
|
|
355
|
+
});
|
|
356
|
+
});
|
|
357
|
+
} catch (err) {
|
|
358
|
+
settle({
|
|
359
|
+
ok: false,
|
|
360
|
+
detail: err instanceof Error ? err.message : String(err)
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
});
|
|
364
|
+
}
|
|
280
365
|
|
|
281
366
|
// src/agent/providers/jsonl-cli.ts
|
|
282
367
|
import { spawn as spawn3 } from "child_process";
|
|
@@ -428,8 +513,100 @@ var codexProvider = {
|
|
|
428
513
|
metadata: metadata2,
|
|
429
514
|
checkStatus: checkStatus2,
|
|
430
515
|
assertReady: assertReady2,
|
|
431
|
-
run: run2
|
|
516
|
+
run: run2,
|
|
517
|
+
modelChoices: modelChoices2
|
|
432
518
|
};
|
|
519
|
+
var CODEX_MODEL_ORDER = [
|
|
520
|
+
"gpt-5.5",
|
|
521
|
+
"gpt-5.4",
|
|
522
|
+
"gpt-5.4-mini",
|
|
523
|
+
"gpt-5.3-codex"
|
|
524
|
+
];
|
|
525
|
+
var CODEX_MODEL_LABELS = {
|
|
526
|
+
"gpt-5.5": "GPT-5.5",
|
|
527
|
+
"gpt-5.4": "GPT-5.4",
|
|
528
|
+
"gpt-5.4-mini": "GPT-5.4 Mini",
|
|
529
|
+
"gpt-5.3-codex": "GPT-5.3 Codex"
|
|
530
|
+
};
|
|
531
|
+
async function modelChoices2(args) {
|
|
532
|
+
const catalog = await readCodexModelCatalog(args.spawnCli);
|
|
533
|
+
const choices = [];
|
|
534
|
+
if (args.configuredModel !== null) {
|
|
535
|
+
choices.push({
|
|
536
|
+
value: args.configuredModel,
|
|
537
|
+
label: modelLabel(args.configuredModel, catalog),
|
|
538
|
+
recommended: false,
|
|
539
|
+
source: "configured"
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
for (const slug of CODEX_MODEL_ORDER) {
|
|
543
|
+
if (choices.some((choice) => choice.value === slug)) continue;
|
|
544
|
+
if (catalog !== void 0 && !catalog.some((model) => model.slug === slug)) {
|
|
545
|
+
continue;
|
|
546
|
+
}
|
|
547
|
+
choices.push({
|
|
548
|
+
value: slug,
|
|
549
|
+
label: modelLabel(slug, catalog),
|
|
550
|
+
recommended: slug === "gpt-5.4",
|
|
551
|
+
source: "catalog"
|
|
552
|
+
});
|
|
553
|
+
}
|
|
554
|
+
choices.push({
|
|
555
|
+
value: "__custom__",
|
|
556
|
+
label: "Enter a model name",
|
|
557
|
+
recommended: false,
|
|
558
|
+
source: "custom"
|
|
559
|
+
});
|
|
560
|
+
return choices;
|
|
561
|
+
}
|
|
562
|
+
async function readCodexModelCatalog(spawnCli) {
|
|
563
|
+
if (spawnCli === void 0) return void 0;
|
|
564
|
+
try {
|
|
565
|
+
const result = await collectSpawn(spawnCli(["codex", "debug", "models"]));
|
|
566
|
+
if (result.code !== 0) return void 0;
|
|
567
|
+
const parsed = JSON.parse(result.stdout);
|
|
568
|
+
if (parsed === null || typeof parsed !== "object") return void 0;
|
|
569
|
+
const models = parsed.models;
|
|
570
|
+
if (!Array.isArray(models)) return void 0;
|
|
571
|
+
const out = [];
|
|
572
|
+
for (const model of models) {
|
|
573
|
+
if (model === null || typeof model !== "object") continue;
|
|
574
|
+
const record = model;
|
|
575
|
+
if (record.visibility !== "list") continue;
|
|
576
|
+
if (typeof record.slug !== "string") continue;
|
|
577
|
+
out.push({
|
|
578
|
+
slug: record.slug,
|
|
579
|
+
displayName: typeof record.display_name === "string" ? record.display_name : record.slug
|
|
580
|
+
});
|
|
581
|
+
}
|
|
582
|
+
return out;
|
|
583
|
+
} catch {
|
|
584
|
+
return void 0;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
function collectSpawn(child) {
|
|
588
|
+
return new Promise((resolve) => {
|
|
589
|
+
let stdout = "";
|
|
590
|
+
let settled = false;
|
|
591
|
+
const settle = (code) => {
|
|
592
|
+
if (settled) return;
|
|
593
|
+
settled = true;
|
|
594
|
+
resolve({ stdout, code });
|
|
595
|
+
};
|
|
596
|
+
child.stdout.on("data", (chunk) => {
|
|
597
|
+
stdout += chunk.toString();
|
|
598
|
+
});
|
|
599
|
+
child.on("error", () => {
|
|
600
|
+
settle(1);
|
|
601
|
+
});
|
|
602
|
+
child.on("close", (codeOrError) => {
|
|
603
|
+
settle(typeof codeOrError === "number" ? codeOrError ?? 1 : 1);
|
|
604
|
+
});
|
|
605
|
+
});
|
|
606
|
+
}
|
|
607
|
+
function modelLabel(slug, catalog) {
|
|
608
|
+
return CODEX_MODEL_LABELS[slug] ?? catalog?.find((model) => model.slug === slug)?.displayName ?? slug;
|
|
609
|
+
}
|
|
433
610
|
async function run2(opts) {
|
|
434
611
|
const args = [
|
|
435
612
|
"exec",
|
|
@@ -453,8 +630,8 @@ async function run2(opts) {
|
|
|
453
630
|
parseFinal: parseCodexFinal
|
|
454
631
|
});
|
|
455
632
|
}
|
|
456
|
-
async function checkStatus2() {
|
|
457
|
-
if (!commandExists(metadata2.executable)) {
|
|
633
|
+
async function checkStatus2(spawnCli) {
|
|
634
|
+
if (spawnCli === void 0 && !commandExists(metadata2.executable)) {
|
|
458
635
|
return {
|
|
459
636
|
id: metadata2.id,
|
|
460
637
|
installed: false,
|
|
@@ -462,7 +639,11 @@ async function checkStatus2() {
|
|
|
462
639
|
detail: `${metadata2.executable} not found on PATH`
|
|
463
640
|
};
|
|
464
641
|
}
|
|
465
|
-
const auth = await
|
|
642
|
+
const auth = spawnCli !== void 0 ? await runInjectedStatusCommand(spawnCli, [
|
|
643
|
+
metadata2.executable,
|
|
644
|
+
"login",
|
|
645
|
+
"status"
|
|
646
|
+
]) : await runStatusCommand(metadata2.executable, ["login", "status"]);
|
|
466
647
|
return {
|
|
467
648
|
id: metadata2.id,
|
|
468
649
|
installed: true,
|
|
@@ -470,8 +651,8 @@ async function checkStatus2() {
|
|
|
470
651
|
detail: auth.detail
|
|
471
652
|
};
|
|
472
653
|
}
|
|
473
|
-
async function assertReady2() {
|
|
474
|
-
const status = await checkStatus2();
|
|
654
|
+
async function assertReady2(spawnCli) {
|
|
655
|
+
const status = await checkStatus2(spawnCli);
|
|
475
656
|
if (!status.installed || !status.authenticated) {
|
|
476
657
|
const err = new Error(`${status.id} not ready: ${status.detail}`);
|
|
477
658
|
err.code = "AGENT_AUTH_MISSING";
|
|
@@ -549,8 +730,8 @@ async function run3(opts) {
|
|
|
549
730
|
parseFinal: parseCursorFinal
|
|
550
731
|
});
|
|
551
732
|
}
|
|
552
|
-
async function checkStatus3() {
|
|
553
|
-
if (!commandExists(metadata3.executable)) {
|
|
733
|
+
async function checkStatus3(spawnCli) {
|
|
734
|
+
if (spawnCli === void 0 && !commandExists(metadata3.executable)) {
|
|
554
735
|
return {
|
|
555
736
|
id: metadata3.id,
|
|
556
737
|
installed: false,
|
|
@@ -558,7 +739,10 @@ async function checkStatus3() {
|
|
|
558
739
|
detail: `${metadata3.executable} not found on PATH`
|
|
559
740
|
};
|
|
560
741
|
}
|
|
561
|
-
const auth = await
|
|
742
|
+
const auth = spawnCli !== void 0 ? await runInjectedStatusCommand(spawnCli, [
|
|
743
|
+
metadata3.executable,
|
|
744
|
+
"status"
|
|
745
|
+
]) : await runStatusCommand(metadata3.executable, ["status"]);
|
|
562
746
|
return {
|
|
563
747
|
id: metadata3.id,
|
|
564
748
|
installed: true,
|
|
@@ -566,8 +750,8 @@ async function checkStatus3() {
|
|
|
566
750
|
detail: auth.detail
|
|
567
751
|
};
|
|
568
752
|
}
|
|
569
|
-
async function assertReady3() {
|
|
570
|
-
const status = await checkStatus3();
|
|
753
|
+
async function assertReady3(spawnCli) {
|
|
754
|
+
const status = await checkStatus3(spawnCli);
|
|
571
755
|
if (!status.installed || !status.authenticated) {
|
|
572
756
|
const err = new Error(`${status.id} not ready: ${status.detail}`);
|
|
573
757
|
err.code = "AGENT_AUTH_MISSING";
|
|
@@ -593,7 +777,7 @@ async function assertAgentAuth(args) {
|
|
|
593
777
|
}
|
|
594
778
|
async function listProviderStatuses(spawnCli) {
|
|
595
779
|
const out = [];
|
|
596
|
-
for (const id of
|
|
780
|
+
for (const id of getEnabledAgentProviderIds()) {
|
|
597
781
|
out.push(await getAgentProvider(id).checkStatus(spawnCli));
|
|
598
782
|
}
|
|
599
783
|
return out;
|
|
@@ -636,13 +820,14 @@ async function buildProviderSetupView(opts = {}) {
|
|
|
636
820
|
const statuses = opts.statuses ?? await listProviderStatuses(opts.spawnCli);
|
|
637
821
|
const statusById = new Map(statuses.map((status) => [status.id, status]));
|
|
638
822
|
const recommendedProvider = chooseRecommendedProvider(statuses);
|
|
639
|
-
const choices =
|
|
823
|
+
const choices = [];
|
|
824
|
+
for (const id of getEnabledAgentProviderIds()) {
|
|
640
825
|
const status = statusById.get(id) ?? missingStatus(id);
|
|
641
826
|
const readiness = getReadiness(status);
|
|
642
827
|
const configuredModel = normalizeModel(config.agent.models[id]);
|
|
643
828
|
const providerDefaultModel = getProviderDefaultModel(id);
|
|
644
829
|
const effectiveModel = configuredModel ?? providerDefaultModel;
|
|
645
|
-
|
|
830
|
+
choices.push({
|
|
646
831
|
id,
|
|
647
832
|
label: getProviderLabel(id),
|
|
648
833
|
selected: id === config.agent.default,
|
|
@@ -657,16 +842,22 @@ async function buildProviderSetupView(opts = {}) {
|
|
|
657
842
|
account: status.authenticated ? accountFromDetail(status.detail) : null,
|
|
658
843
|
detail: status.detail,
|
|
659
844
|
fixCommand: fixFor(id, readiness),
|
|
660
|
-
modelChoices: buildProviderModelChoices(id, configuredModel
|
|
661
|
-
|
|
662
|
-
|
|
845
|
+
modelChoices: await buildProviderModelChoices(id, configuredModel, {
|
|
846
|
+
spawnCli: opts.spawnCli
|
|
847
|
+
})
|
|
848
|
+
});
|
|
849
|
+
}
|
|
663
850
|
return {
|
|
664
851
|
defaultProvider: config.agent.default,
|
|
665
852
|
recommendedProvider,
|
|
666
853
|
choices
|
|
667
854
|
};
|
|
668
855
|
}
|
|
669
|
-
function buildProviderModelChoices(id, configuredModel = null) {
|
|
856
|
+
function buildProviderModelChoices(id, configuredModel = null, opts = {}) {
|
|
857
|
+
const provider = getAgentProvider(id);
|
|
858
|
+
if (provider.modelChoices !== void 0) {
|
|
859
|
+
return provider.modelChoices({ configuredModel, spawnCli: opts.spawnCli });
|
|
860
|
+
}
|
|
670
861
|
const choices = [];
|
|
671
862
|
if (configuredModel !== null) {
|
|
672
863
|
choices.push({
|
|
@@ -698,16 +889,16 @@ function buildProviderModelChoices(id, configuredModel = null) {
|
|
|
698
889
|
}
|
|
699
890
|
choices.push({
|
|
700
891
|
value: "__custom__",
|
|
701
|
-
label: "
|
|
892
|
+
label: "Enter a model name",
|
|
702
893
|
recommended: false,
|
|
703
894
|
source: "custom"
|
|
704
895
|
});
|
|
705
896
|
return choices;
|
|
706
897
|
}
|
|
707
898
|
function chooseRecommendedProvider(statuses) {
|
|
708
|
-
const ready = statuses.filter((status) => status
|
|
899
|
+
const ready = statuses.filter((status) => getReadiness(status) === "ready").map((status) => status.id);
|
|
709
900
|
if (ready.includes("claude")) return "claude";
|
|
710
|
-
for (const id of
|
|
901
|
+
for (const id of getEnabledAgentProviderIds()) {
|
|
711
902
|
if (ready.includes(id)) return id;
|
|
712
903
|
}
|
|
713
904
|
return "claude";
|
|
@@ -725,6 +916,9 @@ function parseAgentSelection(value) {
|
|
|
725
916
|
}
|
|
726
917
|
function getReadiness(status) {
|
|
727
918
|
if (!status.installed) return "missing";
|
|
919
|
+
if (/not (logged|signed) in|not authenticated/i.test(status.detail)) {
|
|
920
|
+
return "not-authenticated";
|
|
921
|
+
}
|
|
728
922
|
if (!status.authenticated) return "not-authenticated";
|
|
729
923
|
return "ready";
|
|
730
924
|
}
|
|
@@ -757,10 +951,9 @@ export {
|
|
|
757
951
|
DEFAULT_AGENT_MODEL,
|
|
758
952
|
assertAgentAuth,
|
|
759
953
|
getAgentProvider,
|
|
760
|
-
getProviderLabel,
|
|
761
954
|
getProviderDefaultModel,
|
|
762
955
|
buildProviderSetupView,
|
|
763
956
|
buildProviderModelChoices,
|
|
764
957
|
parseAgentSelection
|
|
765
958
|
};
|
|
766
|
-
//# sourceMappingURL=chunk-
|
|
959
|
+
//# sourceMappingURL=chunk-J7DNV2DH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/agent/providers/claude/index.ts","../src/agent/providers/claude/auth.ts","../src/agent/providers/cli-status.ts","../src/agent/providers/jsonl-cli.ts","../src/agent/providers/prompt.ts","../src/agent/providers/codex-cli.ts","../src/agent/providers/cursor-cli.ts","../src/agent/providers/status.ts","../src/agent/providers/index.ts","../src/agent/provider-view.ts"],"sourcesContent":["import { query } from \"@anthropic-ai/claude-agent-sdk\";\n\nimport type {\n AgentProvider,\n AgentProviderMetadata,\n AgentResult,\n ProviderModelChoice,\n ProviderStatus,\n RunAgentOptions,\n SpawnCliFn,\n} from \"../../types.js\";\nimport {\n assertClaudeAuth,\n checkClaudeAuth,\n resolveClaudeExecutable,\n UNAUTHENTICATED_MESSAGE,\n type ClaudeAuthStatus,\n} from \"./auth.js\";\n\nexport const DEFAULT_AGENT_MODEL = \"claude-sonnet-4-6\";\n\nconst metadata: AgentProviderMetadata = {\n id: \"claude\",\n displayName: \"Claude\",\n defaultModel: DEFAULT_AGENT_MODEL,\n executable: \"claude\",\n capabilities: {\n transport: \"sdk\",\n writesFiles: true,\n supportsModelOverride: true,\n supportsStreaming: true,\n supportsSessionId: true,\n supportsUsage: false,\n supportsCost: true,\n supportsProviderReportedTurns: true,\n supportsProgrammaticSubagents: true,\n supportsStrictToolAllowlist: false,\n },\n};\n\nexport const claudeProvider: AgentProvider = {\n metadata,\n checkStatus,\n assertReady,\n run,\n modelChoices,\n};\n\nconst CLAUDE_MODELS = [\n {\n value: \"claude-opus-4-7\",\n label: \"Opus 4.7\",\n recommended: false,\n },\n {\n value: \"claude-sonnet-4-6\",\n label: \"Sonnet 4.6\",\n recommended: true,\n },\n {\n value: \"claude-haiku-4-5-20251001\",\n label: \"Haiku 4.5\",\n recommended: false,\n },\n] as const;\n\nfunction modelChoices(args: {\n configuredModel: string | null;\n}): ProviderModelChoice[] {\n const choices: ProviderModelChoice[] = [];\n if (\n args.configuredModel !== null &&\n !CLAUDE_MODELS.some((model) => model.value === args.configuredModel)\n ) {\n choices.push({\n value: args.configuredModel,\n label: args.configuredModel,\n recommended: false,\n source: \"configured\",\n });\n }\n for (const model of CLAUDE_MODELS) {\n choices.push({\n value: model.value,\n label: model.label,\n recommended: model.recommended,\n source: \"catalog\",\n });\n }\n choices.push({\n value: \"__custom__\",\n label: \"Enter a model name\",\n recommended: false,\n source: \"custom\",\n });\n return choices;\n}\n\nasync function run(opts: RunAgentOptions): Promise<AgentResult> {\n const claudeExecutable = resolveClaudeExecutable();\n\n const q = query({\n prompt: opts.prompt,\n options: {\n systemPrompt: opts.systemPrompt,\n allowedTools: opts.allowedTools,\n agents: opts.agents ?? {},\n cwd: opts.cwd,\n model: opts.model ?? metadata.defaultModel ?? undefined,\n maxTurns: opts.maxTurns ?? 100,\n ...(claudeExecutable !== undefined\n ? { pathToClaudeCodeExecutable: claudeExecutable }\n : {}),\n env: {\n ...process.env,\n CODEALMANAC_INTERNAL_SESSION: \"1\",\n },\n includePartialMessages: true,\n },\n });\n\n let cost = 0;\n let turns = 0;\n let result = \"\";\n let sessionId: string | undefined;\n let success = false;\n let errorMsg: string | undefined;\n\n try {\n for await (const msg of q) {\n opts.onMessage?.(msg);\n\n if (\n sessionId === undefined &&\n typeof (msg as { session_id?: unknown }).session_id === \"string\"\n ) {\n sessionId = (msg as { session_id: string }).session_id;\n }\n\n if (msg.type === \"result\") {\n cost = msg.total_cost_usd;\n turns = msg.num_turns;\n if (msg.subtype === \"success\") {\n success = true;\n result = msg.result;\n } else {\n success = false;\n errorMsg =\n (msg.errors?.join(\"; \") ?? \"\") || `agent error: ${msg.subtype}`;\n }\n }\n }\n } catch (err: unknown) {\n errorMsg = err instanceof Error ? err.message : String(err);\n success = false;\n }\n\n return { success, cost, turns, result, sessionId, error: errorMsg };\n}\n\nasync function checkStatus(spawnCli?: SpawnCliFn): Promise<ProviderStatus> {\n let auth: ClaudeAuthStatus = { loggedIn: false };\n try {\n auth = await checkClaudeAuth(spawnCli);\n } catch {\n auth = { loggedIn: false };\n }\n const hasApiKey =\n process.env.ANTHROPIC_API_KEY !== undefined &&\n process.env.ANTHROPIC_API_KEY.length > 0;\n const installed = resolveClaudeExecutable() !== undefined;\n const authenticated = auth.loggedIn || hasApiKey;\n const detail = authenticated\n ? auth.email ?? (hasApiKey ? \"ANTHROPIC_API_KEY set\" : \"logged in\")\n : installed\n ? \"not logged in\"\n : `${metadata.executable} not found on PATH`;\n return { id: metadata.id, installed, authenticated, detail };\n}\n\nasync function assertReady(spawnCli?: SpawnCliFn): Promise<void> {\n await assertClaudeAuth(spawnCli);\n}\n\nexport { assertClaudeAuth, checkClaudeAuth, UNAUTHENTICATED_MESSAGE };\nexport type { ClaudeAuthStatus } from \"./auth.js\";\nexport type { SpawnCliFn, SpawnedProcess } from \"../../types.js\";\n","import { spawn, spawnSync, type ChildProcess } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\n\nimport type { SpawnCliFn, SpawnedProcess } from \"../../types.js\";\n\n/**\n * Claude auth gate — accepts either an active Claude subscription login\n * OR an `ANTHROPIC_API_KEY` environment variable.\n *\n * Claude Code owns subscription OAuth credentials. Users who are logged in\n * via `claude auth login --claudeai` should be able to run bootstrap/capture\n * without exporting an API key. Conversely, users on pay-per-token API keys\n * shouldn't be required to go through the OAuth flow.\n *\n * Current Claude Agent SDK packages no longer ship the old private\n * `cli.js` entrypoint, so the primary probe is the public Claude Code CLI:\n * `claude auth status --json`. We keep the SDK `cli.js` probe as a legacy\n * fallback for older SDK layouts.\n */\n\nexport interface ClaudeAuthStatus {\n loggedIn: boolean;\n email?: string;\n subscriptionType?: string;\n authMethod?: string;\n}\n\nconst AUTH_TIMEOUT_MS = 10_000;\n\n/**\n * Resolve the installed Claude Code executable from PATH. The Agent SDK can\n * accept this path via `pathToClaudeCodeExecutable`, and the auth probe uses\n * the same binary so CodeAlmanac agrees with `claude auth status`.\n */\nexport function resolveClaudeExecutable(): string | undefined {\n const result = spawnSync(\"sh\", [\"-lc\", \"command -v claude\"], {\n encoding: \"utf8\",\n });\n if (result.status !== 0) return undefined;\n const found = result.stdout.trim().split(\"\\n\")[0]?.trim();\n return found !== undefined && found.length > 0 ? found : undefined;\n}\n\n/**\n * Resolve legacy `cli.js` from older `@anthropic-ai/claude-agent-sdk`\n * installs. SDK 0.2.129+ no longer ships this file; callers must treat\n * failure as expected and fall back to the public `claude` binary.\n */\nfunction resolveCliJsPath(): string {\n const require = createRequire(import.meta.url);\n const entry = require.resolve(\"@anthropic-ai/claude-agent-sdk\");\n return join(dirname(entry), \"cli.js\");\n}\n\n/**\n * Default subprocess spawner for production use — invokes the installed\n * Claude Code CLI.\n */\nexport const defaultSpawnCli: SpawnCliFn = (args: string[]) => {\n const command = resolveClaudeExecutable() ?? \"claude\";\n const child = spawn(command, args, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n return child as unknown as SpawnedProcess;\n};\n\nexport const legacySdkSpawnCli: SpawnCliFn = (args: string[]) => {\n const cliPath = resolveCliJsPath();\n const child = spawn(process.execPath, [cliPath, ...args], {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n return child as unknown as SpawnedProcess;\n};\n\n/**\n * Check whether the user is authenticated via Claude subscription OAuth.\n *\n * Spawns `claude auth status --json`, falling back to the legacy SDK CLI\n * layout when available. On any failure (spawn error, non-JSON stdout,\n * non-zero exit, timeout) we return `{ loggedIn: false }` rather than\n * propagating the error — the caller will fall back to the\n * `ANTHROPIC_API_KEY` path and, if that's also missing, produce a clean\n * two-option error message.\n *\n * The 10s timeout guards against the CLI hanging on a broken network or\n * keychain prompt. In practice `auth status` is a cheap local read.\n */\nexport async function checkClaudeAuth(\n spawnCli: SpawnCliFn = defaultSpawnCli,\n): Promise<ClaudeAuthStatus> {\n if (spawnCli === defaultSpawnCli) {\n const status = await checkClaudeAuthWith(defaultSpawnCli);\n if (status.loggedIn) return status;\n return await checkClaudeAuthWith(legacySdkSpawnCli);\n }\n return await checkClaudeAuthWith(spawnCli);\n}\n\nasync function checkClaudeAuthWith(\n spawnCli: SpawnCliFn,\n): Promise<ClaudeAuthStatus> {\n let child: SpawnedProcess;\n try {\n child = spawnCli([\"auth\", \"status\", \"--json\"]);\n } catch {\n return { loggedIn: false };\n }\n\n return new Promise<ClaudeAuthStatus>((resolve) => {\n let stdout = \"\";\n let stderr = \"\";\n let settled = false;\n\n const settle = (value: ClaudeAuthStatus): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve(value);\n };\n\n const timer = setTimeout(() => {\n try {\n child.kill(\"SIGTERM\");\n } catch {\n // Kill can fail if the process already exited; nothing we can do.\n }\n settle({ loggedIn: false });\n }, AUTH_TIMEOUT_MS);\n\n child.stdout.on(\"data\", (data) => {\n stdout += data.toString();\n });\n child.stderr.on(\"data\", (data) => {\n stderr += data.toString();\n });\n\n child.on(\"error\", () => {\n settle({ loggedIn: false });\n });\n\n child.on(\"close\", (code) => {\n // The SDK writes `{\"loggedIn\": false, ...}` to stdout with a zero\n // exit code when the user isn't signed in, so we only reject on\n // non-zero + empty stdout. An empty stdout with zero exit (shouldn't\n // happen in practice) also fails safely to `loggedIn: false`.\n if (code !== 0 && stdout.trim().length === 0) {\n // `stderr` isn't surfaced to the user here — the caller's error\n // message covers both auth paths — but it would be captured by\n // `stderr` if we ever wanted to log it for debugging.\n void stderr;\n settle({ loggedIn: false });\n return;\n }\n try {\n settle(parseClaudeAuthStatus(stdout.trim()));\n } catch {\n settle({ loggedIn: false });\n }\n });\n });\n}\n\nfunction parseClaudeAuthStatus(raw: string): ClaudeAuthStatus {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const loggedIn = parsed.loggedIn === true;\n const out: ClaudeAuthStatus = { loggedIn };\n if (typeof parsed.email === \"string\") out.email = parsed.email;\n if (typeof parsed.subscriptionType === \"string\") {\n out.subscriptionType = parsed.subscriptionType;\n }\n if (typeof parsed.authMethod === \"string\") {\n out.authMethod = parsed.authMethod;\n }\n return out;\n}\n\n/**\n * Human-readable error when neither auth path is available. The text is\n * deliberately verbose — users hitting this wall for the first time\n * deserve both options in front of them, not a terse hint.\n */\nexport const UNAUTHENTICATED_MESSAGE =\n \"not authenticated to Claude.\\n\\n\" +\n \"Option 1 — use your Claude subscription (Pro/Max):\\n\" +\n \" claude auth login --claudeai\\n\\n\" +\n \"Option 2 — use a pay-per-token API key:\\n\" +\n \" Get one at https://console.anthropic.com\\n\" +\n \" export ANTHROPIC_API_KEY=sk-ant-...\\n\\n\" +\n \"Verify with: claude auth status\";\n\n/**\n * Assert that at least one auth path is satisfied. Prefers subscription\n * auth (fewer surprises for Claude Pro/Max users) but accepts\n * `ANTHROPIC_API_KEY` as a fallback. On failure throws with\n * `code = \"CLAUDE_AUTH_MISSING\"` so callers can distinguish this from\n * other errors if they ever want to.\n *\n * Returns the resolved auth status so callers that want to display the\n * logged-in email in a preamble can do so without a second subprocess.\n */\nexport async function assertClaudeAuth(\n spawnCli: SpawnCliFn = defaultSpawnCli,\n): Promise<ClaudeAuthStatus> {\n const status = await checkClaudeAuth(spawnCli);\n if (status.loggedIn) {\n return status;\n }\n const apiKey = process.env.ANTHROPIC_API_KEY;\n if (apiKey !== undefined && apiKey.length > 0) {\n // Signal to callers that we're on the API-key path. Not \"loggedIn\"\n // in the OAuth sense, but the SDK will pick up the env var and\n // succeed — so we return a status that tells bootstrap/capture the\n // gate is open.\n return { loggedIn: true, authMethod: \"apiKey\" };\n }\n const err = new Error(UNAUTHENTICATED_MESSAGE);\n (err as { code?: string }).code = \"CLAUDE_AUTH_MISSING\";\n throw err;\n}\n\n// Internal re-export — helps keep the public type surface minimal while\n// still letting tests import the `ChildProcess` shape when needed.\nexport type { ChildProcess };\nexport type { SpawnCliFn, SpawnedProcess };\n","import { spawn, spawnSync, type ChildProcess } from \"node:child_process\";\n\nimport type { SpawnCliFn } from \"../types.js\";\n\nconst STATUS_TIMEOUT_MS = 3_000;\n\nexport function commandExists(command: string): boolean {\n const result = spawnSync(\"sh\", [\"-lc\", `command -v ${command}`], {\n encoding: \"utf8\",\n });\n return result.status === 0 && result.stdout.trim().length > 0;\n}\n\nexport function runStatusCommand(\n command: string,\n args: string[],\n): Promise<{ ok: boolean; detail: string }> {\n return new Promise((resolve) => {\n let stdout = \"\";\n let stderr = \"\";\n let child: ChildProcess;\n let settled = false;\n const settle = (value: { ok: boolean; detail: string }): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve(value);\n };\n try {\n child = spawn(command, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n resolve({ ok: false, detail: msg });\n return;\n }\n const timer = setTimeout(() => {\n try {\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n if (child.exitCode === null && child.signalCode === null) {\n try {\n child.kill(\"SIGKILL\");\n } catch {\n // already exited\n }\n }\n }, 500).unref();\n } catch {\n // already exited\n }\n settle({ ok: false, detail: `${command} status timed out` });\n }, STATUS_TIMEOUT_MS);\n child.stdout?.on(\"data\", (chunk) => {\n stdout += chunk.toString(\"utf8\");\n });\n child.stderr?.on(\"data\", (chunk) => {\n stderr += chunk.toString(\"utf8\");\n });\n child.on(\"error\", (err) => {\n settle({ ok: false, detail: err.message });\n });\n child.on(\"close\", (code) => {\n const text = `${stdout}\\n${stderr}`.trim();\n settle({\n ok: code === 0,\n detail:\n text\n .split(\"\\n\")\n .find((line) => line.trim().length > 0)\n ?.trim() ?? (code === 0 ? \"ready\" : `${command} exited ${code ?? 1}`),\n });\n });\n });\n}\n\nexport function runInjectedStatusCommand(\n spawnCli: SpawnCliFn,\n args: string[],\n): Promise<{ ok: boolean; detail: string }> {\n return new Promise((resolve) => {\n let stdout = \"\";\n let stderr = \"\";\n let settled = false;\n const settle = (value: { ok: boolean; detail: string }): void => {\n if (settled) return;\n settled = true;\n resolve(value);\n };\n try {\n const child = spawnCli(args);\n child.stdout.on(\"data\", (chunk) => {\n stdout += chunk.toString();\n });\n child.stderr.on(\"data\", (chunk) => {\n stderr += chunk.toString();\n });\n child.on(\"error\", (err) => {\n settle({\n ok: false,\n detail: err instanceof Error ? err.message : String(err),\n });\n });\n child.on(\"close\", (codeOrError) => {\n const code = typeof codeOrError === \"number\" ? codeOrError : 1;\n const text = `${stdout}\\n${stderr}`.trim();\n settle({\n ok: code === 0,\n detail:\n text\n .split(\"\\n\")\n .find((line) => line.trim().length > 0)\n ?.trim() ?? (code === 0 ? \"ready\" : `${args[0] ?? \"command\"} exited ${code}`),\n });\n });\n } catch (err: unknown) {\n settle({\n ok: false,\n detail: err instanceof Error ? err.message : String(err),\n });\n }\n });\n}\n","import { spawn } from \"node:child_process\";\n\nimport type {\n AgentResult,\n AgentStreamMessage,\n AgentUsage,\n} from \"../types.js\";\n\nexport interface JsonlCliOptions {\n command: string;\n args: string[];\n cwd: string;\n env: NodeJS.ProcessEnv;\n onMessage?: (msg: AgentStreamMessage) => void;\n parseFinal: (msg: Record<string, unknown>) => Partial<AgentResult> | null;\n}\n\nexport function runJsonlCli(opts: JsonlCliOptions): Promise<AgentResult> {\n return new Promise((resolve) => {\n const child = spawn(opts.command, opts.args, {\n cwd: opts.cwd,\n env: opts.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdoutBuf = \"\";\n let stderr = \"\";\n let cost = 0;\n let turns = 0;\n let result = \"\";\n let sessionId: string | undefined;\n let usage: AgentUsage | undefined;\n let success = false;\n let finalSeen = false;\n let error: string | undefined;\n\n const observe = (msg: Record<string, unknown>): void => {\n opts.onMessage?.(msg);\n if (\n sessionId === undefined &&\n typeof msg.session_id === \"string\" &&\n msg.session_id.length > 0\n ) {\n sessionId = msg.session_id;\n }\n if (\n sessionId === undefined &&\n typeof msg.thread_id === \"string\" &&\n msg.thread_id.length > 0\n ) {\n sessionId = msg.thread_id;\n }\n const final = opts.parseFinal(msg);\n if (final === null) return;\n finalSeen = true;\n if (final.cost !== undefined) cost = final.cost;\n if (final.turns !== undefined) turns = final.turns;\n if (final.result !== undefined) result = final.result;\n if (final.sessionId !== undefined) sessionId = final.sessionId;\n if (final.usage !== undefined) usage = final.usage;\n if (final.success !== undefined) success = final.success;\n if (final.error !== undefined) error = final.error;\n };\n\n const flushLines = (): void => {\n let idx = stdoutBuf.indexOf(\"\\n\");\n while (idx !== -1) {\n const rawLine = stdoutBuf.slice(0, idx);\n stdoutBuf = stdoutBuf.slice(idx + 1);\n const line = rawLine.trim();\n if (line.length > 0) {\n try {\n observe(JSON.parse(line) as Record<string, unknown>);\n } catch {\n // Ignore non-JSON chatter; stderr is captured for failures.\n }\n }\n idx = stdoutBuf.indexOf(\"\\n\");\n }\n };\n\n child.stdout.on(\"data\", (chunk) => {\n stdoutBuf += chunk.toString(\"utf8\");\n flushLines();\n });\n child.stderr.on(\"data\", (chunk) => {\n stderr += chunk.toString(\"utf8\");\n });\n child.on(\"error\", (err: NodeJS.ErrnoException) => {\n resolve({\n success: false,\n cost,\n turns,\n result,\n sessionId,\n usage,\n error:\n err.code === \"ENOENT\"\n ? `${opts.command} not found on PATH`\n : err.message,\n });\n });\n child.on(\"close\", (code) => {\n flushLines();\n if (stdoutBuf.trim().length > 0) {\n try {\n observe(JSON.parse(stdoutBuf.trim()) as Record<string, unknown>);\n } catch {\n // Ignore trailing non-JSON.\n }\n }\n\n if (code === 0 && finalSeen && success) {\n resolve({ success, cost, turns, result, sessionId, usage });\n return;\n }\n\n const firstStderr = stderr.trim().split(\"\\n\")[0];\n resolve({\n success: false,\n cost,\n turns,\n result,\n sessionId,\n usage,\n error:\n error ??\n (firstStderr !== undefined && firstStderr.length > 0\n ? firstStderr\n : `${opts.command} exited ${code ?? 1}`),\n });\n });\n });\n}\n\nexport function parseUsage(value: unknown): AgentUsage | undefined {\n if (value === null || typeof value !== \"object\") return undefined;\n const obj = value as Record<string, unknown>;\n return {\n inputTokens: numberField(obj, \"input_tokens\") ?? numberField(obj, \"inputTokens\"),\n cachedInputTokens:\n numberField(obj, \"cached_input_tokens\") ??\n numberField(obj, \"cachedInputTokens\") ??\n numberField(obj, \"cacheReadTokens\"),\n outputTokens:\n numberField(obj, \"output_tokens\") ?? numberField(obj, \"outputTokens\"),\n reasoningOutputTokens:\n numberField(obj, \"reasoning_output_tokens\") ??\n numberField(obj, \"reasoningOutputTokens\"),\n };\n}\n\nfunction numberField(\n input: Record<string, unknown>,\n key: string,\n): number | undefined {\n const value = input[key];\n return typeof value === \"number\" ? value : undefined;\n}\n","import type { AgentProviderMetadata, RunAgentOptions } from \"../types.js\";\n\nexport function combinedPrompt(\n opts: RunAgentOptions,\n metadata: AgentProviderMetadata,\n): string {\n const reviewerFallback = buildReviewerFallback(opts, metadata);\n return `${opts.systemPrompt}${reviewerFallback}\\n\\n---\\n\\n${opts.prompt}`;\n}\n\nfunction buildReviewerFallback(\n opts: RunAgentOptions,\n metadata: AgentProviderMetadata,\n): string {\n if (metadata.capabilities.supportsProgrammaticSubagents) return \"\";\n\n const reviewer = opts.agents?.reviewer;\n if (reviewer === undefined) return \"\";\n return (\n \"\\n\\nNon-Claude provider note: this runtime does not receive Claude's \" +\n \"nested Agent tool contract. When the writer prompt asks you to invoke \" +\n \"the reviewer subagent, perform that review pass yourself before final \" +\n \"wiki edits. Treat this reviewer prompt as read-only review guidance:\\n\\n\" +\n reviewer.prompt\n );\n}\n","import type {\n AgentProvider,\n AgentProviderMetadata,\n AgentResult,\n ProviderModelChoice,\n ProviderStatus,\n RunAgentOptions,\n SpawnCliFn,\n} from \"../types.js\";\nimport {\n commandExists,\n runInjectedStatusCommand,\n runStatusCommand,\n} from \"./cli-status.js\";\nimport { parseUsage, runJsonlCli } from \"./jsonl-cli.js\";\nimport { combinedPrompt } from \"./prompt.js\";\n\nconst metadata: AgentProviderMetadata = {\n id: \"codex\",\n displayName: \"Codex\",\n defaultModel: null,\n executable: \"codex\",\n capabilities: {\n transport: \"cli-jsonl\",\n writesFiles: true,\n supportsModelOverride: true,\n supportsStreaming: true,\n supportsSessionId: false,\n supportsUsage: true,\n supportsCost: false,\n supportsProviderReportedTurns: false,\n supportsProgrammaticSubagents: false,\n supportsStrictToolAllowlist: false,\n },\n};\n\nexport const codexProvider: AgentProvider = {\n metadata,\n checkStatus,\n assertReady,\n run,\n modelChoices,\n};\n\ninterface CodexCatalogModel {\n slug: string;\n displayName: string;\n}\n\nconst CODEX_MODEL_ORDER = [\n \"gpt-5.5\",\n \"gpt-5.4\",\n \"gpt-5.4-mini\",\n \"gpt-5.3-codex\",\n] as const;\n\nconst CODEX_MODEL_LABELS: Record<string, string> = {\n \"gpt-5.5\": \"GPT-5.5\",\n \"gpt-5.4\": \"GPT-5.4\",\n \"gpt-5.4-mini\": \"GPT-5.4 Mini\",\n \"gpt-5.3-codex\": \"GPT-5.3 Codex\",\n};\n\nasync function modelChoices(args: {\n configuredModel: string | null;\n spawnCli?: SpawnCliFn;\n}): Promise<ProviderModelChoice[]> {\n const catalog = await readCodexModelCatalog(args.spawnCli);\n const choices: ProviderModelChoice[] = [];\n if (args.configuredModel !== null) {\n choices.push({\n value: args.configuredModel,\n label: modelLabel(args.configuredModel, catalog),\n recommended: false,\n source: \"configured\",\n });\n }\n for (const slug of CODEX_MODEL_ORDER) {\n if (choices.some((choice) => choice.value === slug)) continue;\n if (catalog !== undefined && !catalog.some((model) => model.slug === slug)) {\n continue;\n }\n choices.push({\n value: slug,\n label: modelLabel(slug, catalog),\n recommended: slug === \"gpt-5.4\",\n source: \"catalog\",\n });\n }\n choices.push({\n value: \"__custom__\",\n label: \"Enter a model name\",\n recommended: false,\n source: \"custom\",\n });\n return choices;\n}\n\nasync function readCodexModelCatalog(\n spawnCli?: SpawnCliFn,\n): Promise<CodexCatalogModel[] | undefined> {\n if (spawnCli === undefined) return undefined;\n try {\n const result = await collectSpawn(spawnCli([\"codex\", \"debug\", \"models\"]));\n if (result.code !== 0) return undefined;\n const parsed = JSON.parse(result.stdout) as unknown;\n if (parsed === null || typeof parsed !== \"object\") return undefined;\n const models = (parsed as { models?: unknown }).models;\n if (!Array.isArray(models)) return undefined;\n const out: CodexCatalogModel[] = [];\n for (const model of models) {\n if (model === null || typeof model !== \"object\") continue;\n const record = model as Record<string, unknown>;\n if (record.visibility !== \"list\") continue;\n if (typeof record.slug !== \"string\") continue;\n out.push({\n slug: record.slug,\n displayName: typeof record.display_name === \"string\"\n ? record.display_name\n : record.slug,\n });\n }\n return out;\n } catch {\n return undefined;\n }\n}\n\nfunction collectSpawn(\n child: ReturnType<SpawnCliFn>,\n): Promise<{ stdout: string; code: number }> {\n return new Promise((resolve) => {\n let stdout = \"\";\n let settled = false;\n const settle = (code: number): void => {\n if (settled) return;\n settled = true;\n resolve({ stdout, code });\n };\n child.stdout.on(\"data\", (chunk) => {\n stdout += chunk.toString();\n });\n child.on(\"error\", () => {\n settle(1);\n });\n child.on(\"close\", (codeOrError) => {\n settle(typeof codeOrError === \"number\" ? codeOrError ?? 1 : 1);\n });\n });\n}\n\nfunction modelLabel(\n slug: string,\n catalog: CodexCatalogModel[] | undefined,\n): string {\n return CODEX_MODEL_LABELS[slug] ??\n catalog?.find((model) => model.slug === slug)?.displayName ??\n slug;\n}\n\nasync function run(opts: RunAgentOptions): Promise<AgentResult> {\n const args = [\n \"exec\",\n \"--json\",\n \"--sandbox\",\n \"workspace-write\",\n \"--skip-git-repo-check\",\n \"-C\",\n opts.cwd,\n ];\n if (opts.model !== undefined && opts.model.length > 0) {\n args.push(\"--model\", opts.model);\n }\n args.push(combinedPrompt({ ...opts, provider: \"codex\" }, metadata));\n\n return await runJsonlCli({\n command: metadata.executable,\n args,\n cwd: opts.cwd,\n env: { ...process.env, CODEALMANAC_INTERNAL_SESSION: \"1\" },\n onMessage: opts.onMessage,\n parseFinal: parseCodexFinal,\n });\n}\n\nasync function checkStatus(spawnCli?: SpawnCliFn): Promise<ProviderStatus> {\n if (spawnCli === undefined && !commandExists(metadata.executable)) {\n return {\n id: metadata.id,\n installed: false,\n authenticated: false,\n detail: `${metadata.executable} not found on PATH`,\n };\n }\n\n const auth = spawnCli !== undefined\n ? await runInjectedStatusCommand(spawnCli, [\n metadata.executable,\n \"login\",\n \"status\",\n ])\n : await runStatusCommand(metadata.executable, [\"login\", \"status\"]);\n return {\n id: metadata.id,\n installed: true,\n authenticated: auth.ok,\n detail: auth.detail,\n };\n}\n\nasync function assertReady(spawnCli?: SpawnCliFn): Promise<void> {\n const status = await checkStatus(spawnCli);\n if (!status.installed || !status.authenticated) {\n const err = new Error(`${status.id} not ready: ${status.detail}`);\n (err as { code?: string }).code = \"AGENT_AUTH_MISSING\";\n throw err;\n }\n}\n\nfunction parseCodexFinal(\n msg: Record<string, unknown>,\n): Partial<AgentResult> | null {\n if (msg.type === \"item.completed\") {\n const item = msg.item;\n if (item !== null && typeof item === \"object\") {\n const obj = item as Record<string, unknown>;\n if (obj.type === \"agent_message\" && typeof obj.text === \"string\") {\n return { result: obj.text };\n }\n }\n return null;\n }\n if (msg.type === \"turn.completed\") {\n return { success: true, turns: 1, usage: parseUsage(msg.usage) };\n }\n if (msg.type === \"turn.failed\" || msg.type === \"error\") {\n return {\n success: false,\n error:\n typeof msg.message === \"string\"\n ? msg.message\n : typeof msg.error === \"string\"\n ? msg.error\n : \"codex turn failed\",\n };\n }\n return null;\n}\n","import type {\n AgentProvider,\n AgentProviderMetadata,\n AgentResult,\n ProviderStatus,\n RunAgentOptions,\n SpawnCliFn,\n} from \"../types.js\";\nimport {\n commandExists,\n runInjectedStatusCommand,\n runStatusCommand,\n} from \"./cli-status.js\";\nimport { parseUsage, runJsonlCli } from \"./jsonl-cli.js\";\nimport { combinedPrompt } from \"./prompt.js\";\n\nconst metadata: AgentProviderMetadata = {\n id: \"cursor\",\n displayName: \"Cursor\",\n defaultModel: null,\n executable: \"cursor-agent\",\n capabilities: {\n transport: \"cli-jsonl\",\n writesFiles: true,\n supportsModelOverride: true,\n supportsStreaming: true,\n supportsSessionId: true,\n supportsUsage: true,\n supportsCost: false,\n supportsProviderReportedTurns: false,\n supportsProgrammaticSubagents: false,\n supportsStrictToolAllowlist: false,\n },\n};\n\nexport const cursorProvider: AgentProvider = {\n metadata,\n checkStatus,\n assertReady,\n run,\n};\n\nasync function run(opts: RunAgentOptions): Promise<AgentResult> {\n const args = [\n \"--print\",\n \"--output-format\",\n \"stream-json\",\n \"--stream-partial-output\",\n \"--trust\",\n \"--workspace\",\n opts.cwd,\n ];\n if (opts.model !== undefined && opts.model.length > 0) {\n args.push(\"--model\", opts.model);\n }\n args.push(combinedPrompt({ ...opts, provider: \"cursor\" }, metadata));\n\n return await runJsonlCli({\n command: metadata.executable,\n args,\n cwd: opts.cwd,\n env: { ...process.env, CODEALMANAC_INTERNAL_SESSION: \"1\" },\n onMessage: opts.onMessage,\n parseFinal: parseCursorFinal,\n });\n}\n\nasync function checkStatus(spawnCli?: SpawnCliFn): Promise<ProviderStatus> {\n if (spawnCli === undefined && !commandExists(metadata.executable)) {\n return {\n id: metadata.id,\n installed: false,\n authenticated: false,\n detail: `${metadata.executable} not found on PATH`,\n };\n }\n\n const auth = spawnCli !== undefined\n ? await runInjectedStatusCommand(spawnCli, [\n metadata.executable,\n \"status\",\n ])\n : await runStatusCommand(metadata.executable, [\"status\"]);\n return {\n id: metadata.id,\n installed: true,\n authenticated: auth.ok,\n detail: auth.detail,\n };\n}\n\nasync function assertReady(spawnCli?: SpawnCliFn): Promise<void> {\n const status = await checkStatus(spawnCli);\n if (!status.installed || !status.authenticated) {\n const err = new Error(`${status.id} not ready: ${status.detail}`);\n (err as { code?: string }).code = \"AGENT_AUTH_MISSING\";\n throw err;\n }\n}\n\nfunction parseCursorFinal(\n msg: Record<string, unknown>,\n): Partial<AgentResult> | null {\n if (msg.type !== \"result\") return null;\n const isError = msg.is_error === true || msg.subtype !== \"success\";\n return {\n success: !isError,\n turns: 1,\n result: typeof msg.result === \"string\" ? msg.result : \"\",\n sessionId:\n typeof msg.session_id === \"string\" ? msg.session_id : undefined,\n usage: parseUsage(msg.usage),\n error: isError\n ? typeof msg.result === \"string\"\n ? msg.result\n : `cursor result: ${String(msg.subtype ?? \"error\")}`\n : undefined,\n };\n}\n","import {\n getEnabledAgentProviderIds,\n type AgentProviderId,\n} from \"../../update/config.js\";\nimport type { ProviderStatus, SpawnCliFn } from \"../types.js\";\nimport { getAgentProvider } from \"./index.js\";\n\nexport async function assertAgentAuth(args: {\n provider: AgentProviderId;\n spawnCli?: SpawnCliFn;\n}): Promise<void> {\n await getAgentProvider(args.provider).assertReady(args.spawnCli);\n}\n\nexport async function listProviderStatuses(\n spawnCli?: SpawnCliFn,\n): Promise<ProviderStatus[]> {\n const out: ProviderStatus[] = [];\n for (const id of getEnabledAgentProviderIds()) {\n out.push(await getAgentProvider(id).checkStatus(spawnCli));\n }\n return out;\n}\n","import type { AgentProvider } from \"../types.js\";\nimport { claudeProvider, DEFAULT_AGENT_MODEL } from \"./claude/index.js\";\nimport { codexProvider } from \"./codex-cli.js\";\nimport { cursorProvider } from \"./cursor-cli.js\";\n\nconst AGENT_PROVIDERS = {\n claude: claudeProvider,\n codex: codexProvider,\n cursor: cursorProvider,\n} satisfies Record<string, AgentProvider>;\n\nexport function getAgentProvider(id: keyof typeof AGENT_PROVIDERS): AgentProvider {\n return AGENT_PROVIDERS[id];\n}\n\nexport const AGENT_PROVIDER_METADATA = {\n claude: claudeProvider.metadata,\n codex: codexProvider.metadata,\n cursor: cursorProvider.metadata,\n};\nexport { DEFAULT_AGENT_MODEL };\nexport { assertAgentAuth, listProviderStatuses } from \"./status.js\";\n","import {\n AGENT_PROVIDER_METADATA,\n getAgentProvider,\n listProviderStatuses,\n} from \"./providers.js\";\nimport type {\n ProviderModelChoice,\n ProviderStatus,\n SpawnCliFn,\n} from \"./types.js\";\nimport {\n formatEnabledAgentProviderList,\n getEnabledAgentProviderIds,\n isAgentProviderId,\n readConfig,\n type AgentProviderId,\n type GlobalConfig,\n} from \"../update/config.js\";\n\nexport type ProviderReadiness = \"ready\" | \"not-authenticated\" | \"missing\";\n\nexport interface ProviderSetupChoice {\n id: AgentProviderId;\n label: string;\n selected: boolean;\n recommended: boolean;\n readiness: ProviderReadiness;\n ready: boolean;\n installed: boolean;\n authenticated: boolean;\n effectiveModel: string | null;\n providerDefaultModel: string | null;\n configuredModel: string | null;\n account: string | null;\n detail: string;\n fixCommand: string | null;\n modelChoices: ProviderModelChoice[];\n}\n\nexport interface ProviderSetupView {\n defaultProvider: AgentProviderId;\n recommendedProvider: AgentProviderId;\n choices: ProviderSetupChoice[];\n}\n\nexport interface ProviderViewOptions {\n config?: GlobalConfig;\n statuses?: ProviderStatus[];\n spawnCli?: SpawnCliFn;\n}\n\nconst LOGIN_FIXES: Record<AgentProviderId, string> = {\n claude: \"run: claude auth login --claudeai\",\n codex: \"run: codex login\",\n cursor: \"run: cursor-agent login\",\n};\n\nconst INSTALL_FIXES: Record<AgentProviderId, string> = {\n claude: \"install Claude Code, then run: claude auth login --claudeai\",\n codex: \"install Codex CLI, then run: codex login\",\n cursor: \"install cursor-agent, then run: cursor-agent login\",\n};\n\nexport function getProviderLabel(id: AgentProviderId): string {\n return AGENT_PROVIDER_METADATA[id].displayName;\n}\n\nexport function getProviderDefaultModel(id: AgentProviderId): string | null {\n return AGENT_PROVIDER_METADATA[id].defaultModel;\n}\n\nexport async function buildProviderSetupView(\n opts: ProviderViewOptions = {},\n): Promise<ProviderSetupView> {\n const config = opts.config ?? await readConfig();\n const statuses = opts.statuses ?? await listProviderStatuses(opts.spawnCli);\n const statusById = new Map(statuses.map((status) => [status.id, status]));\n const recommendedProvider = chooseRecommendedProvider(statuses);\n const choices: ProviderSetupChoice[] = [];\n for (const id of getEnabledAgentProviderIds()) {\n const status = statusById.get(id) ?? missingStatus(id);\n const readiness = getReadiness(status);\n const configuredModel = normalizeModel(config.agent.models[id]);\n const providerDefaultModel = getProviderDefaultModel(id);\n const effectiveModel = configuredModel ?? providerDefaultModel;\n choices.push({\n id,\n label: getProviderLabel(id),\n selected: id === config.agent.default,\n recommended: id === recommendedProvider,\n readiness,\n ready: readiness === \"ready\",\n installed: status.installed,\n authenticated: status.authenticated,\n effectiveModel,\n providerDefaultModel,\n configuredModel,\n account: status.authenticated ? accountFromDetail(status.detail) : null,\n detail: status.detail,\n fixCommand: fixFor(id, readiness),\n modelChoices: await buildProviderModelChoices(id, configuredModel, {\n spawnCli: opts.spawnCli,\n }),\n });\n }\n return {\n defaultProvider: config.agent.default,\n recommendedProvider,\n choices,\n };\n}\n\nexport function buildProviderModelChoices(\n id: AgentProviderId,\n configuredModel: string | null = null,\n opts: { spawnCli?: SpawnCliFn } = {},\n): Promise<ProviderModelChoice[]> | ProviderModelChoice[] {\n const provider = getAgentProvider(id);\n if (provider.modelChoices !== undefined) {\n return provider.modelChoices({ configuredModel, spawnCli: opts.spawnCli });\n }\n const choices: ProviderModelChoice[] = [];\n if (configuredModel !== null) {\n choices.push({\n value: configuredModel,\n label: configuredModel,\n recommended: false,\n source: \"configured\",\n });\n }\n\n const providerDefault = getProviderDefaultModel(id);\n if (providerDefault !== null) {\n if (!choices.some((choice) => choice.value === providerDefault)) {\n choices.push({\n value: providerDefault,\n label: providerDefault,\n recommended: true,\n source: \"provider-default\",\n });\n } else {\n choices[0] = { ...choices[0]!, recommended: true };\n }\n } else {\n choices.push({\n value: null,\n label: \"provider default\",\n recommended: true,\n source: \"provider-default\",\n });\n }\n\n choices.push({\n value: \"__custom__\",\n label: \"Enter a model name\",\n recommended: false,\n source: \"custom\",\n });\n return choices;\n}\n\nexport function chooseRecommendedProvider(\n statuses: ProviderStatus[],\n): AgentProviderId {\n const ready = statuses\n .filter((status) => getReadiness(status) === \"ready\")\n .map((status) => status.id);\n if (ready.includes(\"claude\")) return \"claude\";\n for (const id of getEnabledAgentProviderIds()) {\n if (ready.includes(id)) return id;\n }\n return \"claude\";\n}\n\nexport function parseAgentSelection(value: string): {\n provider: AgentProviderId | null;\n model?: string;\n} {\n const [rawProvider, ...modelParts] = value.split(\"/\");\n if (rawProvider === undefined || !isAgentProviderId(rawProvider)) {\n return { provider: null };\n }\n const model = modelParts.join(\"/\");\n return {\n provider: rawProvider,\n model: model.length > 0 ? model : undefined,\n };\n}\n\nfunction getReadiness(status: ProviderStatus): ProviderReadiness {\n if (!status.installed) return \"missing\";\n if (/not (logged|signed) in|not authenticated/i.test(status.detail)) {\n return \"not-authenticated\";\n }\n if (!status.authenticated) return \"not-authenticated\";\n return \"ready\";\n}\n\nfunction fixFor(\n id: AgentProviderId,\n readiness: ProviderReadiness,\n): string | null {\n if (readiness === \"ready\") return null;\n if (readiness === \"missing\") return INSTALL_FIXES[id];\n return LOGIN_FIXES[id];\n}\n\nfunction accountFromDetail(detail: string): string | null {\n const clean = detail.trim();\n if (\n clean.length === 0 ||\n clean === \"ready\" ||\n clean === \"logged in\" ||\n clean === \"ANTHROPIC_API_KEY set\"\n ) {\n return null;\n }\n return clean;\n}\n\nfunction normalizeModel(value: string | null | undefined): string | null {\n return typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\nfunction missingStatus(id: AgentProviderId): ProviderStatus {\n return {\n id,\n installed: false,\n authenticated: false,\n detail: \"provider status unavailable\",\n };\n}\n\nexport function enabledProviderListForMessage(): string {\n return formatEnabledAgentProviderList();\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,aAAa;;;ACAtB,SAAS,OAAO,iBAAoC;AACpD,SAAS,qBAAqB;AAC9B,SAAS,SAAS,YAAY;AA0B9B,IAAM,kBAAkB;AAOjB,SAAS,0BAA8C;AAC5D,QAAM,SAAS,UAAU,MAAM,CAAC,OAAO,mBAAmB,GAAG;AAAA,IAC3D,UAAU;AAAA,EACZ,CAAC;AACD,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAM,QAAQ,OAAO,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,GAAG,KAAK;AACxD,SAAO,UAAU,UAAa,MAAM,SAAS,IAAI,QAAQ;AAC3D;AAOA,SAAS,mBAA2B;AAClC,QAAMA,WAAU,cAAc,YAAY,GAAG;AAC7C,QAAM,QAAQA,SAAQ,QAAQ,gCAAgC;AAC9D,SAAO,KAAK,QAAQ,KAAK,GAAG,QAAQ;AACtC;AAMO,IAAM,kBAA8B,CAAC,SAAmB;AAC7D,QAAM,UAAU,wBAAwB,KAAK;AAC7C,QAAM,QAAQ,MAAM,SAAS,MAAM;AAAA,IACjC,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,EAClC,CAAC;AACD,SAAO;AACT;AAEO,IAAM,oBAAgC,CAAC,SAAmB;AAC/D,QAAM,UAAU,iBAAiB;AACjC,QAAM,QAAQ,MAAM,QAAQ,UAAU,CAAC,SAAS,GAAG,IAAI,GAAG;AAAA,IACxD,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,EAClC,CAAC;AACD,SAAO;AACT;AAeA,eAAsB,gBACpB,WAAuB,iBACI;AAC3B,MAAI,aAAa,iBAAiB;AAChC,UAAM,SAAS,MAAM,oBAAoB,eAAe;AACxD,QAAI,OAAO,SAAU,QAAO;AAC5B,WAAO,MAAM,oBAAoB,iBAAiB;AAAA,EACpD;AACA,SAAO,MAAM,oBAAoB,QAAQ;AAC3C;AAEA,eAAe,oBACb,UAC2B;AAC3B,MAAI;AACJ,MAAI;AACF,YAAQ,SAAS,CAAC,QAAQ,UAAU,QAAQ,CAAC;AAAA,EAC/C,QAAQ;AACN,WAAO,EAAE,UAAU,MAAM;AAAA,EAC3B;AAEA,SAAO,IAAI,QAA0B,CAAC,YAAY;AAChD,QAAI,SAAS;AACb,QAAI,SAAS;AACb,QAAI,UAAU;AAEd,UAAM,SAAS,CAAC,UAAkC;AAChD,UAAI,QAAS;AACb,gBAAU;AACV,mBAAa,KAAK;AAClB,cAAQ,KAAK;AAAA,IACf;AAEA,UAAM,QAAQ,WAAW,MAAM;AAC7B,UAAI;AACF,cAAM,KAAK,SAAS;AAAA,MACtB,QAAQ;AAAA,MAER;AACA,aAAO,EAAE,UAAU,MAAM,CAAC;AAAA,IAC5B,GAAG,eAAe;AAElB,UAAM,OAAO,GAAG,QAAQ,CAAC,SAAS;AAChC,gBAAU,KAAK,SAAS;AAAA,IAC1B,CAAC;AACD,UAAM,OAAO,GAAG,QAAQ,CAAC,SAAS;AAChC,gBAAU,KAAK,SAAS;AAAA,IAC1B,CAAC;AAED,UAAM,GAAG,SAAS,MAAM;AACtB,aAAO,EAAE,UAAU,MAAM,CAAC;AAAA,IAC5B,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,SAAS;AAK1B,UAAI,SAAS,KAAK,OAAO,KAAK,EAAE,WAAW,GAAG;AAI5C,aAAK;AACL,eAAO,EAAE,UAAU,MAAM,CAAC;AAC1B;AAAA,MACF;AACA,UAAI;AACF,eAAO,sBAAsB,OAAO,KAAK,CAAC,CAAC;AAAA,MAC7C,QAAQ;AACN,eAAO,EAAE,UAAU,MAAM,CAAC;AAAA,MAC5B;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,sBAAsB,KAA+B;AAC5D,QAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAM,WAAW,OAAO,aAAa;AACrC,QAAM,MAAwB,EAAE,SAAS;AACzC,MAAI,OAAO,OAAO,UAAU,SAAU,KAAI,QAAQ,OAAO;AACzD,MAAI,OAAO,OAAO,qBAAqB,UAAU;AAC/C,QAAI,mBAAmB,OAAO;AAAA,EAChC;AACA,MAAI,OAAO,OAAO,eAAe,UAAU;AACzC,QAAI,aAAa,OAAO;AAAA,EAC1B;AACA,SAAO;AACT;AAOO,IAAM,0BACX;AAkBF,eAAsB,iBACpB,WAAuB,iBACI;AAC3B,QAAM,SAAS,MAAM,gBAAgB,QAAQ;AAC7C,MAAI,OAAO,UAAU;AACnB,WAAO;AAAA,EACT;AACA,QAAM,SAAS,QAAQ,IAAI;AAC3B,MAAI,WAAW,UAAa,OAAO,SAAS,GAAG;AAK7C,WAAO,EAAE,UAAU,MAAM,YAAY,SAAS;AAAA,EAChD;AACA,QAAM,MAAM,IAAI,MAAM,uBAAuB;AAC7C,EAAC,IAA0B,OAAO;AAClC,QAAM;AACR;;;ADxMO,IAAM,sBAAsB;AAEnC,IAAM,WAAkC;AAAA,EACtC,IAAI;AAAA,EACJ,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,cAAc;AAAA,IACZ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,uBAAuB;AAAA,IACvB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,cAAc;AAAA,IACd,+BAA+B;AAAA,IAC/B,+BAA+B;AAAA,IAC/B,6BAA6B;AAAA,EAC/B;AACF;AAEO,IAAM,iBAAgC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,gBAAgB;AAAA,EACpB;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AACF;AAEA,SAAS,aAAa,MAEI;AACxB,QAAM,UAAiC,CAAC;AACxC,MACE,KAAK,oBAAoB,QACzB,CAAC,cAAc,KAAK,CAAC,UAAU,MAAM,UAAU,KAAK,eAAe,GACnE;AACA,YAAQ,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,aAAa;AAAA,MACb,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACA,aAAW,SAAS,eAAe;AACjC,YAAQ,KAAK;AAAA,MACX,OAAO,MAAM;AAAA,MACb,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACA,UAAQ,KAAK;AAAA,IACX,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,EACV,CAAC;AACD,SAAO;AACT;AAEA,eAAe,IAAI,MAA6C;AAC9D,QAAM,mBAAmB,wBAAwB;AAEjD,QAAM,IAAI,MAAM;AAAA,IACd,QAAQ,KAAK;AAAA,IACb,SAAS;AAAA,MACP,cAAc,KAAK;AAAA,MACnB,cAAc,KAAK;AAAA,MACnB,QAAQ,KAAK,UAAU,CAAC;AAAA,MACxB,KAAK,KAAK;AAAA,MACV,OAAO,KAAK,SAAS,SAAS,gBAAgB;AAAA,MAC9C,UAAU,KAAK,YAAY;AAAA,MAC3B,GAAI,qBAAqB,SACrB,EAAE,4BAA4B,iBAAiB,IAC/C,CAAC;AAAA,MACL,KAAK;AAAA,QACH,GAAG,QAAQ;AAAA,QACX,8BAA8B;AAAA,MAChC;AAAA,MACA,wBAAwB;AAAA,IAC1B;AAAA,EACF,CAAC;AAED,MAAI,OAAO;AACX,MAAI,QAAQ;AACZ,MAAI,SAAS;AACb,MAAI;AACJ,MAAI,UAAU;AACd,MAAI;AAEJ,MAAI;AACF,qBAAiB,OAAO,GAAG;AACzB,WAAK,YAAY,GAAG;AAEpB,UACE,cAAc,UACd,OAAQ,IAAiC,eAAe,UACxD;AACA,oBAAa,IAA+B;AAAA,MAC9C;AAEA,UAAI,IAAI,SAAS,UAAU;AACzB,eAAO,IAAI;AACX,gBAAQ,IAAI;AACZ,YAAI,IAAI,YAAY,WAAW;AAC7B,oBAAU;AACV,mBAAS,IAAI;AAAA,QACf,OAAO;AACL,oBAAU;AACV,sBACG,IAAI,QAAQ,KAAK,IAAI,KAAK,OAAO,gBAAgB,IAAI,OAAO;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,KAAc;AACrB,eAAW,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC1D,cAAU;AAAA,EACZ;AAEA,SAAO,EAAE,SAAS,MAAM,OAAO,QAAQ,WAAW,OAAO,SAAS;AACpE;AAEA,eAAe,YAAY,UAAgD;AACzE,MAAI,OAAyB,EAAE,UAAU,MAAM;AAC/C,MAAI;AACF,WAAO,MAAM,gBAAgB,QAAQ;AAAA,EACvC,QAAQ;AACN,WAAO,EAAE,UAAU,MAAM;AAAA,EAC3B;AACA,QAAM,YACJ,QAAQ,IAAI,sBAAsB,UAClC,QAAQ,IAAI,kBAAkB,SAAS;AACzC,QAAM,YAAY,wBAAwB,MAAM;AAChD,QAAM,gBAAgB,KAAK,YAAY;AACvC,QAAM,SAAS,gBACX,KAAK,UAAU,YAAY,0BAA0B,eACrD,YACE,kBACA,GAAG,SAAS,UAAU;AAC5B,SAAO,EAAE,IAAI,SAAS,IAAI,WAAW,eAAe,OAAO;AAC7D;AAEA,eAAe,YAAY,UAAsC;AAC/D,QAAM,iBAAiB,QAAQ;AACjC;;;AEtLA,SAAS,SAAAC,QAAO,aAAAC,kBAAoC;AAIpD,IAAM,oBAAoB;AAEnB,SAAS,cAAc,SAA0B;AACtD,QAAM,SAASA,WAAU,MAAM,CAAC,OAAO,cAAc,OAAO,EAAE,GAAG;AAAA,IAC/D,UAAU;AAAA,EACZ,CAAC;AACD,SAAO,OAAO,WAAW,KAAK,OAAO,OAAO,KAAK,EAAE,SAAS;AAC9D;AAEO,SAAS,iBACd,SACA,MAC0C;AAC1C,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,QAAI,SAAS;AACb,QAAI,SAAS;AACb,QAAI;AACJ,QAAI,UAAU;AACd,UAAM,SAAS,CAAC,UAAiD;AAC/D,UAAI,QAAS;AACb,gBAAU;AACV,mBAAa,KAAK;AAClB,cAAQ,KAAK;AAAA,IACf;AACA,QAAI;AACF,cAAQD,OAAM,SAAS,MAAM,EAAE,OAAO,CAAC,UAAU,QAAQ,MAAM,EAAE,CAAC;AAAA,IACpE,SAAS,KAAc;AACrB,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,cAAQ,EAAE,IAAI,OAAO,QAAQ,IAAI,CAAC;AAClC;AAAA,IACF;AACA,UAAM,QAAQ,WAAW,MAAM;AAC7B,UAAI;AACF,cAAM,KAAK,SAAS;AACpB,mBAAW,MAAM;AACf,cAAI,MAAM,aAAa,QAAQ,MAAM,eAAe,MAAM;AACxD,gBAAI;AACF,oBAAM,KAAK,SAAS;AAAA,YACtB,QAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF,GAAG,GAAG,EAAE,MAAM;AAAA,MAChB,QAAQ;AAAA,MAER;AACA,aAAO,EAAE,IAAI,OAAO,QAAQ,GAAG,OAAO,oBAAoB,CAAC;AAAA,IAC7D,GAAG,iBAAiB;AACpB,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU;AAClC,gBAAU,MAAM,SAAS,MAAM;AAAA,IACjC,CAAC;AACD,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU;AAClC,gBAAU,MAAM,SAAS,MAAM;AAAA,IACjC,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,QAAQ;AACzB,aAAO,EAAE,IAAI,OAAO,QAAQ,IAAI,QAAQ,CAAC;AAAA,IAC3C,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,YAAM,OAAO,GAAG,MAAM;AAAA,EAAK,MAAM,GAAG,KAAK;AACzC,aAAO;AAAA,QACL,IAAI,SAAS;AAAA,QACb,QACE,KACG,MAAM,IAAI,EACV,KAAK,CAAC,SAAS,KAAK,KAAK,EAAE,SAAS,CAAC,GACpC,KAAK,MAAM,SAAS,IAAI,UAAU,GAAG,OAAO,WAAW,QAAQ,CAAC;AAAA,MACxE,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,yBACd,UACA,MAC0C;AAC1C,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,QAAI,SAAS;AACb,QAAI,SAAS;AACb,QAAI,UAAU;AACd,UAAM,SAAS,CAAC,UAAiD;AAC/D,UAAI,QAAS;AACb,gBAAU;AACV,cAAQ,KAAK;AAAA,IACf;AACA,QAAI;AACF,YAAM,QAAQ,SAAS,IAAI;AAC3B,YAAM,OAAO,GAAG,QAAQ,CAAC,UAAU;AACjC,kBAAU,MAAM,SAAS;AAAA,MAC3B,CAAC;AACD,YAAM,OAAO,GAAG,QAAQ,CAAC,UAAU;AACjC,kBAAU,MAAM,SAAS;AAAA,MAC3B,CAAC;AACD,YAAM,GAAG,SAAS,CAAC,QAAQ;AACzB,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACzD,CAAC;AAAA,MACH,CAAC;AACD,YAAM,GAAG,SAAS,CAAC,gBAAgB;AACjC,cAAM,OAAO,OAAO,gBAAgB,WAAW,cAAc;AAC7D,cAAM,OAAO,GAAG,MAAM;AAAA,EAAK,MAAM,GAAG,KAAK;AACzC,eAAO;AAAA,UACL,IAAI,SAAS;AAAA,UACb,QACE,KACG,MAAM,IAAI,EACV,KAAK,CAAC,SAAS,KAAK,KAAK,EAAE,SAAS,CAAC,GACpC,KAAK,MAAM,SAAS,IAAI,UAAU,GAAG,KAAK,CAAC,KAAK,SAAS,WAAW,IAAI;AAAA,QAChF,CAAC;AAAA,MACH,CAAC;AAAA,IACH,SAAS,KAAc;AACrB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACzD,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;;;ACzHA,SAAS,SAAAE,cAAa;AAiBf,SAAS,YAAY,MAA6C;AACvE,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,QAAQA,OAAM,KAAK,SAAS,KAAK,MAAM;AAAA,MAC3C,KAAK,KAAK;AAAA,MACV,KAAK,KAAK;AAAA,MACV,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAClC,CAAC;AAED,QAAI,YAAY;AAChB,QAAI,SAAS;AACb,QAAI,OAAO;AACX,QAAI,QAAQ;AACZ,QAAI,SAAS;AACb,QAAI;AACJ,QAAI;AACJ,QAAI,UAAU;AACd,QAAI,YAAY;AAChB,QAAI;AAEJ,UAAM,UAAU,CAAC,QAAuC;AACtD,WAAK,YAAY,GAAG;AACpB,UACE,cAAc,UACd,OAAO,IAAI,eAAe,YAC1B,IAAI,WAAW,SAAS,GACxB;AACA,oBAAY,IAAI;AAAA,MAClB;AACA,UACE,cAAc,UACd,OAAO,IAAI,cAAc,YACzB,IAAI,UAAU,SAAS,GACvB;AACA,oBAAY,IAAI;AAAA,MAClB;AACA,YAAM,QAAQ,KAAK,WAAW,GAAG;AACjC,UAAI,UAAU,KAAM;AACpB,kBAAY;AACZ,UAAI,MAAM,SAAS,OAAW,QAAO,MAAM;AAC3C,UAAI,MAAM,UAAU,OAAW,SAAQ,MAAM;AAC7C,UAAI,MAAM,WAAW,OAAW,UAAS,MAAM;AAC/C,UAAI,MAAM,cAAc,OAAW,aAAY,MAAM;AACrD,UAAI,MAAM,UAAU,OAAW,SAAQ,MAAM;AAC7C,UAAI,MAAM,YAAY,OAAW,WAAU,MAAM;AACjD,UAAI,MAAM,UAAU,OAAW,SAAQ,MAAM;AAAA,IAC/C;AAEA,UAAM,aAAa,MAAY;AAC7B,UAAI,MAAM,UAAU,QAAQ,IAAI;AAChC,aAAO,QAAQ,IAAI;AACjB,cAAM,UAAU,UAAU,MAAM,GAAG,GAAG;AACtC,oBAAY,UAAU,MAAM,MAAM,CAAC;AACnC,cAAM,OAAO,QAAQ,KAAK;AAC1B,YAAI,KAAK,SAAS,GAAG;AACnB,cAAI;AACF,oBAAQ,KAAK,MAAM,IAAI,CAA4B;AAAA,UACrD,QAAQ;AAAA,UAER;AAAA,QACF;AACA,cAAM,UAAU,QAAQ,IAAI;AAAA,MAC9B;AAAA,IACF;AAEA,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAU;AACjC,mBAAa,MAAM,SAAS,MAAM;AAClC,iBAAW;AAAA,IACb,CAAC;AACD,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAU;AACjC,gBAAU,MAAM,SAAS,MAAM;AAAA,IACjC,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,QAA+B;AAChD,cAAQ;AAAA,QACN,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OACE,IAAI,SAAS,WACT,GAAG,KAAK,OAAO,uBACf,IAAI;AAAA,MACZ,CAAC;AAAA,IACH,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,iBAAW;AACX,UAAI,UAAU,KAAK,EAAE,SAAS,GAAG;AAC/B,YAAI;AACF,kBAAQ,KAAK,MAAM,UAAU,KAAK,CAAC,CAA4B;AAAA,QACjE,QAAQ;AAAA,QAER;AAAA,MACF;AAEA,UAAI,SAAS,KAAK,aAAa,SAAS;AACtC,gBAAQ,EAAE,SAAS,MAAM,OAAO,QAAQ,WAAW,MAAM,CAAC;AAC1D;AAAA,MACF;AAEA,YAAM,cAAc,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC;AAC/C,cAAQ;AAAA,QACN,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OACE,UACC,gBAAgB,UAAa,YAAY,SAAS,IAC/C,cACA,GAAG,KAAK,OAAO,WAAW,QAAQ,CAAC;AAAA,MAC3C,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,WAAW,OAAwC;AACjE,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AACxD,QAAM,MAAM;AACZ,SAAO;AAAA,IACL,aAAa,YAAY,KAAK,cAAc,KAAK,YAAY,KAAK,aAAa;AAAA,IAC/E,mBACE,YAAY,KAAK,qBAAqB,KACtC,YAAY,KAAK,mBAAmB,KACpC,YAAY,KAAK,iBAAiB;AAAA,IACpC,cACE,YAAY,KAAK,eAAe,KAAK,YAAY,KAAK,cAAc;AAAA,IACtE,uBACE,YAAY,KAAK,yBAAyB,KAC1C,YAAY,KAAK,uBAAuB;AAAA,EAC5C;AACF;AAEA,SAAS,YACP,OACA,KACoB;AACpB,QAAM,QAAQ,MAAM,GAAG;AACvB,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;;;AC5JO,SAAS,eACd,MACAC,WACQ;AACR,QAAM,mBAAmB,sBAAsB,MAAMA,SAAQ;AAC7D,SAAO,GAAG,KAAK,YAAY,GAAG,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAAc,KAAK,MAAM;AACzE;AAEA,SAAS,sBACP,MACAA,WACQ;AACR,MAAIA,UAAS,aAAa,8BAA+B,QAAO;AAEhE,QAAM,WAAW,KAAK,QAAQ;AAC9B,MAAI,aAAa,OAAW,QAAO;AACnC,SACE,8RAIA,SAAS;AAEb;;;ACRA,IAAMC,YAAkC;AAAA,EACtC,IAAI;AAAA,EACJ,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,cAAc;AAAA,IACZ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,uBAAuB;AAAA,IACvB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,cAAc;AAAA,IACd,+BAA+B;AAAA,IAC/B,+BAA+B;AAAA,IAC/B,6BAA6B;AAAA,EAC/B;AACF;AAEO,IAAM,gBAA+B;AAAA,EAC1C,UAAAA;AAAA,EACA,aAAAC;AAAA,EACA,aAAAC;AAAA,EACA,KAAAC;AAAA,EACA,cAAAC;AACF;AAOA,IAAM,oBAAoB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,qBAA6C;AAAA,EACjD,WAAW;AAAA,EACX,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,iBAAiB;AACnB;AAEA,eAAeA,cAAa,MAGO;AACjC,QAAM,UAAU,MAAM,sBAAsB,KAAK,QAAQ;AACzD,QAAM,UAAiC,CAAC;AACxC,MAAI,KAAK,oBAAoB,MAAM;AACjC,YAAQ,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,OAAO,WAAW,KAAK,iBAAiB,OAAO;AAAA,MAC/C,aAAa;AAAA,MACb,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACA,aAAW,QAAQ,mBAAmB;AACpC,QAAI,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,IAAI,EAAG;AACrD,QAAI,YAAY,UAAa,CAAC,QAAQ,KAAK,CAAC,UAAU,MAAM,SAAS,IAAI,GAAG;AAC1E;AAAA,IACF;AACA,YAAQ,KAAK;AAAA,MACX,OAAO;AAAA,MACP,OAAO,WAAW,MAAM,OAAO;AAAA,MAC/B,aAAa,SAAS;AAAA,MACtB,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACA,UAAQ,KAAK;AAAA,IACX,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,EACV,CAAC;AACD,SAAO;AACT;AAEA,eAAe,sBACb,UAC0C;AAC1C,MAAI,aAAa,OAAW,QAAO;AACnC,MAAI;AACF,UAAM,SAAS,MAAM,aAAa,SAAS,CAAC,SAAS,SAAS,QAAQ,CAAC,CAAC;AACxE,QAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,UAAM,SAAS,KAAK,MAAM,OAAO,MAAM;AACvC,QAAI,WAAW,QAAQ,OAAO,WAAW,SAAU,QAAO;AAC1D,UAAM,SAAU,OAAgC;AAChD,QAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO;AACnC,UAAM,MAA2B,CAAC;AAClC,eAAW,SAAS,QAAQ;AAC1B,UAAI,UAAU,QAAQ,OAAO,UAAU,SAAU;AACjD,YAAM,SAAS;AACf,UAAI,OAAO,eAAe,OAAQ;AAClC,UAAI,OAAO,OAAO,SAAS,SAAU;AACrC,UAAI,KAAK;AAAA,QACP,MAAM,OAAO;AAAA,QACb,aAAa,OAAO,OAAO,iBAAiB,WACxC,OAAO,eACP,OAAO;AAAA,MACb,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,aACP,OAC2C;AAC3C,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,QAAI,SAAS;AACb,QAAI,UAAU;AACd,UAAM,SAAS,CAAC,SAAuB;AACrC,UAAI,QAAS;AACb,gBAAU;AACV,cAAQ,EAAE,QAAQ,KAAK,CAAC;AAAA,IAC1B;AACA,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAU;AACjC,gBAAU,MAAM,SAAS;AAAA,IAC3B,CAAC;AACD,UAAM,GAAG,SAAS,MAAM;AACtB,aAAO,CAAC;AAAA,IACV,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,gBAAgB;AACjC,aAAO,OAAO,gBAAgB,WAAW,eAAe,IAAI,CAAC;AAAA,IAC/D,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,WACP,MACA,SACQ;AACR,SAAO,mBAAmB,IAAI,KAC5B,SAAS,KAAK,CAAC,UAAU,MAAM,SAAS,IAAI,GAAG,eAC/C;AACJ;AAEA,eAAeD,KAAI,MAA6C;AAC9D,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,EACP;AACA,MAAI,KAAK,UAAU,UAAa,KAAK,MAAM,SAAS,GAAG;AACrD,SAAK,KAAK,WAAW,KAAK,KAAK;AAAA,EACjC;AACA,OAAK,KAAK,eAAe,EAAE,GAAG,MAAM,UAAU,QAAQ,GAAGH,SAAQ,CAAC;AAElE,SAAO,MAAM,YAAY;AAAA,IACvB,SAASA,UAAS;AAAA,IAClB;AAAA,IACA,KAAK,KAAK;AAAA,IACV,KAAK,EAAE,GAAG,QAAQ,KAAK,8BAA8B,IAAI;AAAA,IACzD,WAAW,KAAK;AAAA,IAChB,YAAY;AAAA,EACd,CAAC;AACH;AAEA,eAAeC,aAAY,UAAgD;AACzE,MAAI,aAAa,UAAa,CAAC,cAAcD,UAAS,UAAU,GAAG;AACjE,WAAO;AAAA,MACL,IAAIA,UAAS;AAAA,MACb,WAAW;AAAA,MACX,eAAe;AAAA,MACf,QAAQ,GAAGA,UAAS,UAAU;AAAA,IAChC;AAAA,EACF;AAEA,QAAM,OAAO,aAAa,SACtB,MAAM,yBAAyB,UAAU;AAAA,IACzCA,UAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF,CAAC,IACC,MAAM,iBAAiBA,UAAS,YAAY,CAAC,SAAS,QAAQ,CAAC;AACnE,SAAO;AAAA,IACL,IAAIA,UAAS;AAAA,IACb,WAAW;AAAA,IACX,eAAe,KAAK;AAAA,IACpB,QAAQ,KAAK;AAAA,EACf;AACF;AAEA,eAAeE,aAAY,UAAsC;AAC/D,QAAM,SAAS,MAAMD,aAAY,QAAQ;AACzC,MAAI,CAAC,OAAO,aAAa,CAAC,OAAO,eAAe;AAC9C,UAAM,MAAM,IAAI,MAAM,GAAG,OAAO,EAAE,eAAe,OAAO,MAAM,EAAE;AAChE,IAAC,IAA0B,OAAO;AAClC,UAAM;AAAA,EACR;AACF;AAEA,SAAS,gBACP,KAC6B;AAC7B,MAAI,IAAI,SAAS,kBAAkB;AACjC,UAAM,OAAO,IAAI;AACjB,QAAI,SAAS,QAAQ,OAAO,SAAS,UAAU;AAC7C,YAAM,MAAM;AACZ,UAAI,IAAI,SAAS,mBAAmB,OAAO,IAAI,SAAS,UAAU;AAChE,eAAO,EAAE,QAAQ,IAAI,KAAK;AAAA,MAC5B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,MAAI,IAAI,SAAS,kBAAkB;AACjC,WAAO,EAAE,SAAS,MAAM,OAAO,GAAG,OAAO,WAAW,IAAI,KAAK,EAAE;AAAA,EACjE;AACA,MAAI,IAAI,SAAS,iBAAiB,IAAI,SAAS,SAAS;AACtD,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OACE,OAAO,IAAI,YAAY,WACnB,IAAI,UACJ,OAAO,IAAI,UAAU,WACnB,IAAI,QACJ;AAAA,IACV;AAAA,EACF;AACA,SAAO;AACT;;;ACvOA,IAAMI,YAAkC;AAAA,EACtC,IAAI;AAAA,EACJ,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,cAAc;AAAA,IACZ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,uBAAuB;AAAA,IACvB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,cAAc;AAAA,IACd,+BAA+B;AAAA,IAC/B,+BAA+B;AAAA,IAC/B,6BAA6B;AAAA,EAC/B;AACF;AAEO,IAAM,iBAAgC;AAAA,EAC3C,UAAAA;AAAA,EACA,aAAAC;AAAA,EACA,aAAAC;AAAA,EACA,KAAAC;AACF;AAEA,eAAeA,KAAI,MAA6C;AAC9D,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,EACP;AACA,MAAI,KAAK,UAAU,UAAa,KAAK,MAAM,SAAS,GAAG;AACrD,SAAK,KAAK,WAAW,KAAK,KAAK;AAAA,EACjC;AACA,OAAK,KAAK,eAAe,EAAE,GAAG,MAAM,UAAU,SAAS,GAAGH,SAAQ,CAAC;AAEnE,SAAO,MAAM,YAAY;AAAA,IACvB,SAASA,UAAS;AAAA,IAClB;AAAA,IACA,KAAK,KAAK;AAAA,IACV,KAAK,EAAE,GAAG,QAAQ,KAAK,8BAA8B,IAAI;AAAA,IACzD,WAAW,KAAK;AAAA,IAChB,YAAY;AAAA,EACd,CAAC;AACH;AAEA,eAAeC,aAAY,UAAgD;AACzE,MAAI,aAAa,UAAa,CAAC,cAAcD,UAAS,UAAU,GAAG;AACjE,WAAO;AAAA,MACL,IAAIA,UAAS;AAAA,MACb,WAAW;AAAA,MACX,eAAe;AAAA,MACf,QAAQ,GAAGA,UAAS,UAAU;AAAA,IAChC;AAAA,EACF;AAEA,QAAM,OAAO,aAAa,SACtB,MAAM,yBAAyB,UAAU;AAAA,IACzCA,UAAS;AAAA,IACT;AAAA,EACF,CAAC,IACC,MAAM,iBAAiBA,UAAS,YAAY,CAAC,QAAQ,CAAC;AAC1D,SAAO;AAAA,IACL,IAAIA,UAAS;AAAA,IACb,WAAW;AAAA,IACX,eAAe,KAAK;AAAA,IACpB,QAAQ,KAAK;AAAA,EACf;AACF;AAEA,eAAeE,aAAY,UAAsC;AAC/D,QAAM,SAAS,MAAMD,aAAY,QAAQ;AACzC,MAAI,CAAC,OAAO,aAAa,CAAC,OAAO,eAAe;AAC9C,UAAM,MAAM,IAAI,MAAM,GAAG,OAAO,EAAE,eAAe,OAAO,MAAM,EAAE;AAChE,IAAC,IAA0B,OAAO;AAClC,UAAM;AAAA,EACR;AACF;AAEA,SAAS,iBACP,KAC6B;AAC7B,MAAI,IAAI,SAAS,SAAU,QAAO;AAClC,QAAM,UAAU,IAAI,aAAa,QAAQ,IAAI,YAAY;AACzD,SAAO;AAAA,IACL,SAAS,CAAC;AAAA,IACV,OAAO;AAAA,IACP,QAAQ,OAAO,IAAI,WAAW,WAAW,IAAI,SAAS;AAAA,IACtD,WACE,OAAO,IAAI,eAAe,WAAW,IAAI,aAAa;AAAA,IACxD,OAAO,WAAW,IAAI,KAAK;AAAA,IAC3B,OAAO,UACH,OAAO,IAAI,WAAW,WACpB,IAAI,SACJ,kBAAkB,OAAO,IAAI,WAAW,OAAO,CAAC,KAClD;AAAA,EACN;AACF;;;AC/GA,eAAsB,gBAAgB,MAGpB;AAChB,QAAM,iBAAiB,KAAK,QAAQ,EAAE,YAAY,KAAK,QAAQ;AACjE;AAEA,eAAsB,qBACpB,UAC2B;AAC3B,QAAM,MAAwB,CAAC;AAC/B,aAAW,MAAM,2BAA2B,GAAG;AAC7C,QAAI,KAAK,MAAM,iBAAiB,EAAE,EAAE,YAAY,QAAQ,CAAC;AAAA,EAC3D;AACA,SAAO;AACT;;;ACjBA,IAAM,kBAAkB;AAAA,EACtB,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AACV;AAEO,SAAS,iBAAiB,IAAiD;AAChF,SAAO,gBAAgB,EAAE;AAC3B;AAEO,IAAM,0BAA0B;AAAA,EACrC,QAAQ,eAAe;AAAA,EACvB,OAAO,cAAc;AAAA,EACrB,QAAQ,eAAe;AACzB;;;ACgCA,IAAM,cAA+C;AAAA,EACnD,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AACV;AAEA,IAAM,gBAAiD;AAAA,EACrD,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AACV;AAEO,SAAS,iBAAiB,IAA6B;AAC5D,SAAO,wBAAwB,EAAE,EAAE;AACrC;AAEO,SAAS,wBAAwB,IAAoC;AAC1E,SAAO,wBAAwB,EAAE,EAAE;AACrC;AAEA,eAAsB,uBACpB,OAA4B,CAAC,GACD;AAC5B,QAAM,SAAS,KAAK,UAAU,MAAM,WAAW;AAC/C,QAAM,WAAW,KAAK,YAAY,MAAM,qBAAqB,KAAK,QAAQ;AAC1E,QAAM,aAAa,IAAI,IAAI,SAAS,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;AACxE,QAAM,sBAAsB,0BAA0B,QAAQ;AAC9D,QAAM,UAAiC,CAAC;AACxC,aAAW,MAAM,2BAA2B,GAAG;AAC7C,UAAM,SAAS,WAAW,IAAI,EAAE,KAAK,cAAc,EAAE;AACrD,UAAM,YAAY,aAAa,MAAM;AACrC,UAAM,kBAAkB,eAAe,OAAO,MAAM,OAAO,EAAE,CAAC;AAC9D,UAAM,uBAAuB,wBAAwB,EAAE;AACvD,UAAM,iBAAiB,mBAAmB;AAC1C,YAAQ,KAAK;AAAA,MACX;AAAA,MACA,OAAO,iBAAiB,EAAE;AAAA,MAC1B,UAAU,OAAO,OAAO,MAAM;AAAA,MAC9B,aAAa,OAAO;AAAA,MACpB;AAAA,MACA,OAAO,cAAc;AAAA,MACrB,WAAW,OAAO;AAAA,MAClB,eAAe,OAAO;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,OAAO,gBAAgB,kBAAkB,OAAO,MAAM,IAAI;AAAA,MACnE,QAAQ,OAAO;AAAA,MACf,YAAY,OAAO,IAAI,SAAS;AAAA,MAChC,cAAc,MAAM,0BAA0B,IAAI,iBAAiB;AAAA,QACjE,UAAU,KAAK;AAAA,MACjB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL,iBAAiB,OAAO,MAAM;AAAA,IAC9B;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,0BACd,IACA,kBAAiC,MACjC,OAAkC,CAAC,GACqB;AACxD,QAAM,WAAW,iBAAiB,EAAE;AACpC,MAAI,SAAS,iBAAiB,QAAW;AACvC,WAAO,SAAS,aAAa,EAAE,iBAAiB,UAAU,KAAK,SAAS,CAAC;AAAA,EAC3E;AACA,QAAM,UAAiC,CAAC;AACxC,MAAI,oBAAoB,MAAM;AAC5B,YAAQ,KAAK;AAAA,MACX,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aAAa;AAAA,MACb,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,QAAM,kBAAkB,wBAAwB,EAAE;AAClD,MAAI,oBAAoB,MAAM;AAC5B,QAAI,CAAC,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,eAAe,GAAG;AAC/D,cAAQ,KAAK;AAAA,QACX,OAAO;AAAA,QACP,OAAO;AAAA,QACP,aAAa;AAAA,QACb,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,GAAI,aAAa,KAAK;AAAA,IACnD;AAAA,EACF,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aAAa;AAAA,MACb,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,UAAQ,KAAK;AAAA,IACX,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,EACV,CAAC;AACD,SAAO;AACT;AAEO,SAAS,0BACd,UACiB;AACjB,QAAM,QAAQ,SACX,OAAO,CAAC,WAAW,aAAa,MAAM,MAAM,OAAO,EACnD,IAAI,CAAC,WAAW,OAAO,EAAE;AAC5B,MAAI,MAAM,SAAS,QAAQ,EAAG,QAAO;AACrC,aAAW,MAAM,2BAA2B,GAAG;AAC7C,QAAI,MAAM,SAAS,EAAE,EAAG,QAAO;AAAA,EACjC;AACA,SAAO;AACT;AAEO,SAAS,oBAAoB,OAGlC;AACA,QAAM,CAAC,aAAa,GAAG,UAAU,IAAI,MAAM,MAAM,GAAG;AACpD,MAAI,gBAAgB,UAAa,CAAC,kBAAkB,WAAW,GAAG;AAChE,WAAO,EAAE,UAAU,KAAK;AAAA,EAC1B;AACA,QAAM,QAAQ,WAAW,KAAK,GAAG;AACjC,SAAO;AAAA,IACL,UAAU;AAAA,IACV,OAAO,MAAM,SAAS,IAAI,QAAQ;AAAA,EACpC;AACF;AAEA,SAAS,aAAa,QAA2C;AAC/D,MAAI,CAAC,OAAO,UAAW,QAAO;AAC9B,MAAI,4CAA4C,KAAK,OAAO,MAAM,GAAG;AACnE,WAAO;AAAA,EACT;AACA,MAAI,CAAC,OAAO,cAAe,QAAO;AAClC,SAAO;AACT;AAEA,SAAS,OACP,IACA,WACe;AACf,MAAI,cAAc,QAAS,QAAO;AAClC,MAAI,cAAc,UAAW,QAAO,cAAc,EAAE;AACpD,SAAO,YAAY,EAAE;AACvB;AAEA,SAAS,kBAAkB,QAA+B;AACxD,QAAM,QAAQ,OAAO,KAAK;AAC1B,MACE,MAAM,WAAW,KACjB,UAAU,WACV,UAAU,eACV,UAAU,yBACV;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,eAAe,OAAiD;AACvE,SAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;AAEA,SAAS,cAAc,IAAqC;AAC1D,SAAO;AAAA,IACL;AAAA,IACA,WAAW;AAAA,IACX,eAAe;AAAA,IACf,QAAQ;AAAA,EACV;AACF;","names":["require","spawn","spawnSync","spawn","metadata","metadata","checkStatus","assertReady","run","modelChoices","metadata","checkStatus","assertReady","run"]}
|