@elyracode/coding-agent 0.9.18 → 0.9.20
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/CHANGELOG.md +10 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +1 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/doctor-cli.d.ts.map +1 -1
- package/dist/cli/doctor-cli.js +8 -1
- package/dist/cli/doctor-cli.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -0
- package/dist/config.js.map +1 -1
- package/dist/core/keybindings.d.ts +10 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +8 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-fallback.d.ts +17 -5
- package/dist/core/model-fallback.d.ts.map +1 -1
- package/dist/core/model-fallback.js +29 -5
- package/dist/core/model-fallback.js.map +1 -1
- package/dist/core/routing-ledger.d.ts +83 -0
- package/dist/core/routing-ledger.d.ts.map +1 -0
- package/dist/core/routing-ledger.js +238 -0
- package/dist/core/routing-ledger.js.map +1 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +36 -2
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-manager.d.ts +2 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +3 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +1 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js +1 -0
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/package-browser.d.ts +26 -0
- package/dist/modes/interactive/components/package-browser.d.ts.map +1 -0
- package/dist/modes/interactive/components/package-browser.js +137 -0
- package/dist/modes/interactive/components/package-browser.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +92 -49
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package browser: a clean, multi-select list for browsing and installing
|
|
3
|
+
* Elyra extensions. Supports windowed scrolling, checkbox selection of one or
|
|
4
|
+
* more packages, and a clear call to run /reload after installing.
|
|
5
|
+
*/
|
|
6
|
+
import { Container, getKeybindings, Spacer, Text, truncateToWidth, visibleWidth } from "@elyracode/tui";
|
|
7
|
+
import { theme } from "../theme/theme.js";
|
|
8
|
+
import { DynamicBorder } from "./dynamic-border.js";
|
|
9
|
+
import { keyHint, rawKeyHint } from "./keybinding-hints.js";
|
|
10
|
+
const MAX_VISIBLE = 12;
|
|
11
|
+
const MIN_NAME_COLUMN = 14;
|
|
12
|
+
const MAX_NAME_COLUMN = 28;
|
|
13
|
+
const NAME_GAP = 2;
|
|
14
|
+
/**
|
|
15
|
+
* Inner scrollable, windowed list with checkbox multi-select.
|
|
16
|
+
* The parent PackageBrowserComponent owns key handling and state mutation;
|
|
17
|
+
* this component is purely presentational.
|
|
18
|
+
*/
|
|
19
|
+
class PackageList {
|
|
20
|
+
constructor(items) {
|
|
21
|
+
this.items = items;
|
|
22
|
+
this.selectedIndex = 0;
|
|
23
|
+
this.checked = new Set();
|
|
24
|
+
}
|
|
25
|
+
invalidate() { }
|
|
26
|
+
nameColumnWidth() {
|
|
27
|
+
const widest = this.items.reduce((max, item) => Math.max(max, visibleWidth(item.name)), 0);
|
|
28
|
+
return Math.max(MIN_NAME_COLUMN, Math.min(MAX_NAME_COLUMN, widest));
|
|
29
|
+
}
|
|
30
|
+
render(width) {
|
|
31
|
+
if (this.items.length === 0) {
|
|
32
|
+
return [theme.fg("muted", " No extensions available")];
|
|
33
|
+
}
|
|
34
|
+
const nameColumn = this.nameColumnWidth();
|
|
35
|
+
const start = Math.max(0, Math.min(this.selectedIndex - Math.floor(MAX_VISIBLE / 2), this.items.length - MAX_VISIBLE));
|
|
36
|
+
const end = Math.min(start + MAX_VISIBLE, this.items.length);
|
|
37
|
+
const lines = [];
|
|
38
|
+
for (let i = start; i < end; i++) {
|
|
39
|
+
const item = this.items[i];
|
|
40
|
+
if (!item)
|
|
41
|
+
continue;
|
|
42
|
+
lines.push(this.renderRow(item, i === this.selectedIndex, this.checked.has(item.value), width, nameColumn));
|
|
43
|
+
}
|
|
44
|
+
if (start > 0 || end < this.items.length) {
|
|
45
|
+
lines.push(theme.fg("muted", ` (${this.selectedIndex + 1}/${this.items.length})`));
|
|
46
|
+
}
|
|
47
|
+
return lines;
|
|
48
|
+
}
|
|
49
|
+
renderRow(item, isCursor, isChecked, width, nameColumn) {
|
|
50
|
+
const cursor = isCursor ? "→ " : " ";
|
|
51
|
+
const box = isChecked ? "[x] " : "[ ] ";
|
|
52
|
+
const name = truncateToWidth(item.name, nameColumn, "…", true);
|
|
53
|
+
const used = visibleWidth(cursor) + visibleWidth(box) + nameColumn + NAME_GAP;
|
|
54
|
+
const descWidth = width - used - 1;
|
|
55
|
+
const description = descWidth > 6 ? truncateToWidth(item.description, descWidth, "…") : "";
|
|
56
|
+
const cursorPart = isCursor ? theme.fg("accent", cursor) : cursor;
|
|
57
|
+
const boxPart = isChecked ? theme.fg("success", box) : theme.fg("dim", box);
|
|
58
|
+
const namePart = isCursor ? theme.fg("accent", name) : theme.fg("text", name);
|
|
59
|
+
const descPart = description ? theme.fg("muted", `${" ".repeat(NAME_GAP)}${description}`) : "";
|
|
60
|
+
return `${cursorPart}${boxPart}${namePart}${descPart}`;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export class PackageBrowserComponent extends Container {
|
|
64
|
+
constructor(items, onConfirm, onCancel) {
|
|
65
|
+
super();
|
|
66
|
+
this.items = items;
|
|
67
|
+
this.onConfirm = onConfirm;
|
|
68
|
+
this.onCancel = onCancel;
|
|
69
|
+
this.list = new PackageList(items);
|
|
70
|
+
this.addChild(new DynamicBorder());
|
|
71
|
+
this.addChild(new Spacer(1));
|
|
72
|
+
this.titleText = new Text("", 1, 0);
|
|
73
|
+
this.addChild(this.titleText);
|
|
74
|
+
this.addChild(new Spacer(1));
|
|
75
|
+
this.addChild(this.list);
|
|
76
|
+
this.addChild(new Spacer(1));
|
|
77
|
+
this.addChild(new Text(rawKeyHint("↑↓", "navigate") +
|
|
78
|
+
" " +
|
|
79
|
+
keyHint("app.packages.toggle", "select") +
|
|
80
|
+
" " +
|
|
81
|
+
keyHint("app.packages.install", "install") +
|
|
82
|
+
" " +
|
|
83
|
+
keyHint("tui.select.cancel", "cancel"), 1, 0));
|
|
84
|
+
this.addChild(new Spacer(1));
|
|
85
|
+
this.addChild(new Text(theme.fg("dim", "Installed extensions activate after you run /reload."), 1, 0));
|
|
86
|
+
this.addChild(new Spacer(1));
|
|
87
|
+
this.addChild(new DynamicBorder());
|
|
88
|
+
this.updateTitle();
|
|
89
|
+
}
|
|
90
|
+
updateTitle() {
|
|
91
|
+
const count = this.list.checked.size;
|
|
92
|
+
const suffix = count > 0 ? theme.fg("muted", ` (${count} selected)`) : "";
|
|
93
|
+
this.titleText.setText(theme.fg("accent", theme.bold("Install Extensions")) + suffix);
|
|
94
|
+
}
|
|
95
|
+
handleInput(keyData) {
|
|
96
|
+
const kb = getKeybindings();
|
|
97
|
+
if (kb.matches(keyData, "tui.select.up")) {
|
|
98
|
+
this.list.selectedIndex = this.list.selectedIndex === 0 ? this.items.length - 1 : this.list.selectedIndex - 1;
|
|
99
|
+
}
|
|
100
|
+
else if (kb.matches(keyData, "tui.select.down")) {
|
|
101
|
+
this.list.selectedIndex = this.list.selectedIndex === this.items.length - 1 ? 0 : this.list.selectedIndex + 1;
|
|
102
|
+
}
|
|
103
|
+
else if (kb.matches(keyData, "tui.select.pageUp")) {
|
|
104
|
+
this.list.selectedIndex = Math.max(0, this.list.selectedIndex - MAX_VISIBLE);
|
|
105
|
+
}
|
|
106
|
+
else if (kb.matches(keyData, "tui.select.pageDown")) {
|
|
107
|
+
this.list.selectedIndex = Math.min(this.items.length - 1, this.list.selectedIndex + MAX_VISIBLE);
|
|
108
|
+
}
|
|
109
|
+
else if (kb.matches(keyData, "app.packages.toggle")) {
|
|
110
|
+
const item = this.items[this.list.selectedIndex];
|
|
111
|
+
if (item) {
|
|
112
|
+
if (this.list.checked.has(item.value)) {
|
|
113
|
+
this.list.checked.delete(item.value);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
this.list.checked.add(item.value);
|
|
117
|
+
}
|
|
118
|
+
this.updateTitle();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else if (kb.matches(keyData, "app.packages.install")) {
|
|
122
|
+
const selected = this.list.checked.size > 0
|
|
123
|
+
? this.items.filter((item) => this.list.checked.has(item.value)).map((item) => item.value)
|
|
124
|
+
: this.currentValue();
|
|
125
|
+
if (selected.length > 0)
|
|
126
|
+
this.onConfirm(selected);
|
|
127
|
+
}
|
|
128
|
+
else if (kb.matches(keyData, "tui.select.cancel")) {
|
|
129
|
+
this.onCancel();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
currentValue() {
|
|
133
|
+
const item = this.items[this.list.selectedIndex];
|
|
134
|
+
return item ? [item.value] : [];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=package-browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-browser.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/package-browser.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Package browser: a clean, multi-select list for browsing and installing\n * Elyra extensions. Supports windowed scrolling, checkbox selection of one or\n * more packages, and a clear call to run /reload after installing.\n */\n\nimport type { Component } from \"@elyracode/tui\";\nimport { Container, getKeybindings, Spacer, Text, truncateToWidth, visibleWidth } from \"@elyracode/tui\";\nimport { theme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\nimport { keyHint, rawKeyHint } from \"./keybinding-hints.js\";\n\nexport interface PackageBrowserItem {\n\t/** Full package name, e.g. \"@elyracode/stack-tall\". */\n\tvalue: string;\n\t/** Short display name, e.g. \"stack-tall\". */\n\tname: string;\n\t/** One-line description. */\n\tdescription: string;\n}\n\nconst MAX_VISIBLE = 12;\nconst MIN_NAME_COLUMN = 14;\nconst MAX_NAME_COLUMN = 28;\nconst NAME_GAP = 2;\n\n/**\n * Inner scrollable, windowed list with checkbox multi-select.\n * The parent PackageBrowserComponent owns key handling and state mutation;\n * this component is purely presentational.\n */\nclass PackageList implements Component {\n\tselectedIndex = 0;\n\treadonly checked = new Set<string>();\n\n\tconstructor(private readonly items: PackageBrowserItem[]) {}\n\n\tinvalidate(): void {}\n\n\tprivate nameColumnWidth(): number {\n\t\tconst widest = this.items.reduce((max, item) => Math.max(max, visibleWidth(item.name)), 0);\n\t\treturn Math.max(MIN_NAME_COLUMN, Math.min(MAX_NAME_COLUMN, widest));\n\t}\n\n\trender(width: number): string[] {\n\t\tif (this.items.length === 0) {\n\t\t\treturn [theme.fg(\"muted\", \" No extensions available\")];\n\t\t}\n\n\t\tconst nameColumn = this.nameColumnWidth();\n\t\tconst start = Math.max(\n\t\t\t0,\n\t\t\tMath.min(this.selectedIndex - Math.floor(MAX_VISIBLE / 2), this.items.length - MAX_VISIBLE),\n\t\t);\n\t\tconst end = Math.min(start + MAX_VISIBLE, this.items.length);\n\n\t\tconst lines: string[] = [];\n\t\tfor (let i = start; i < end; i++) {\n\t\t\tconst item = this.items[i];\n\t\t\tif (!item) continue;\n\t\t\tlines.push(this.renderRow(item, i === this.selectedIndex, this.checked.has(item.value), width, nameColumn));\n\t\t}\n\n\t\tif (start > 0 || end < this.items.length) {\n\t\t\tlines.push(theme.fg(\"muted\", ` (${this.selectedIndex + 1}/${this.items.length})`));\n\t\t}\n\n\t\treturn lines;\n\t}\n\n\tprivate renderRow(\n\t\titem: PackageBrowserItem,\n\t\tisCursor: boolean,\n\t\tisChecked: boolean,\n\t\twidth: number,\n\t\tnameColumn: number,\n\t): string {\n\t\tconst cursor = isCursor ? \"→ \" : \" \";\n\t\tconst box = isChecked ? \"[x] \" : \"[ ] \";\n\t\tconst name = truncateToWidth(item.name, nameColumn, \"…\", true);\n\n\t\tconst used = visibleWidth(cursor) + visibleWidth(box) + nameColumn + NAME_GAP;\n\t\tconst descWidth = width - used - 1;\n\t\tconst description = descWidth > 6 ? truncateToWidth(item.description, descWidth, \"…\") : \"\";\n\n\t\tconst cursorPart = isCursor ? theme.fg(\"accent\", cursor) : cursor;\n\t\tconst boxPart = isChecked ? theme.fg(\"success\", box) : theme.fg(\"dim\", box);\n\t\tconst namePart = isCursor ? theme.fg(\"accent\", name) : theme.fg(\"text\", name);\n\t\tconst descPart = description ? theme.fg(\"muted\", `${\" \".repeat(NAME_GAP)}${description}`) : \"\";\n\n\t\treturn `${cursorPart}${boxPart}${namePart}${descPart}`;\n\t}\n}\n\nexport class PackageBrowserComponent extends Container {\n\tprivate readonly list: PackageList;\n\tprivate readonly titleText: Text;\n\n\tconstructor(\n\t\tprivate readonly items: PackageBrowserItem[],\n\t\tprivate readonly onConfirm: (values: string[]) => void,\n\t\tprivate readonly onCancel: () => void,\n\t) {\n\t\tsuper();\n\n\t\tthis.list = new PackageList(items);\n\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.titleText = new Text(\"\", 1, 0);\n\t\tthis.addChild(this.titleText);\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.addChild(this.list);\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.addChild(\n\t\t\tnew Text(\n\t\t\t\trawKeyHint(\"↑↓\", \"navigate\") +\n\t\t\t\t\t\" \" +\n\t\t\t\t\tkeyHint(\"app.packages.toggle\", \"select\") +\n\t\t\t\t\t\" \" +\n\t\t\t\t\tkeyHint(\"app.packages.install\", \"install\") +\n\t\t\t\t\t\" \" +\n\t\t\t\t\tkeyHint(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"dim\", \"Installed extensions activate after you run /reload.\"), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new DynamicBorder());\n\n\t\tthis.updateTitle();\n\t}\n\n\tprivate updateTitle(): void {\n\t\tconst count = this.list.checked.size;\n\t\tconst suffix = count > 0 ? theme.fg(\"muted\", ` (${count} selected)`) : \"\";\n\t\tthis.titleText.setText(theme.fg(\"accent\", theme.bold(\"Install Extensions\")) + suffix);\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\n\t\tif (kb.matches(keyData, \"tui.select.up\")) {\n\t\t\tthis.list.selectedIndex = this.list.selectedIndex === 0 ? this.items.length - 1 : this.list.selectedIndex - 1;\n\t\t} else if (kb.matches(keyData, \"tui.select.down\")) {\n\t\t\tthis.list.selectedIndex = this.list.selectedIndex === this.items.length - 1 ? 0 : this.list.selectedIndex + 1;\n\t\t} else if (kb.matches(keyData, \"tui.select.pageUp\")) {\n\t\t\tthis.list.selectedIndex = Math.max(0, this.list.selectedIndex - MAX_VISIBLE);\n\t\t} else if (kb.matches(keyData, \"tui.select.pageDown\")) {\n\t\t\tthis.list.selectedIndex = Math.min(this.items.length - 1, this.list.selectedIndex + MAX_VISIBLE);\n\t\t} else if (kb.matches(keyData, \"app.packages.toggle\")) {\n\t\t\tconst item = this.items[this.list.selectedIndex];\n\t\t\tif (item) {\n\t\t\t\tif (this.list.checked.has(item.value)) {\n\t\t\t\t\tthis.list.checked.delete(item.value);\n\t\t\t\t} else {\n\t\t\t\t\tthis.list.checked.add(item.value);\n\t\t\t\t}\n\t\t\t\tthis.updateTitle();\n\t\t\t}\n\t\t} else if (kb.matches(keyData, \"app.packages.install\")) {\n\t\t\tconst selected =\n\t\t\t\tthis.list.checked.size > 0\n\t\t\t\t\t? this.items.filter((item) => this.list.checked.has(item.value)).map((item) => item.value)\n\t\t\t\t\t: this.currentValue();\n\t\t\tif (selected.length > 0) this.onConfirm(selected);\n\t\t} else if (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancel();\n\t\t}\n\t}\n\n\tprivate currentValue(): string[] {\n\t\tconst item = this.items[this.list.selectedIndex];\n\t\treturn item ? [item.value] : [];\n\t}\n}\n"]}
|
|
@@ -321,6 +321,7 @@ export declare class InteractiveMode {
|
|
|
321
321
|
private handleInAppUpdate;
|
|
322
322
|
private handleGoalCommand;
|
|
323
323
|
private handleRouteCommand;
|
|
324
|
+
private handleRoutingStatsCommand;
|
|
324
325
|
private getLastUserMessageText;
|
|
325
326
|
private handleReplayCommand;
|
|
326
327
|
private handleLearnCommand;
|
|
@@ -385,6 +386,7 @@ export declare class InteractiveMode {
|
|
|
385
386
|
private showOAuthLoginSelect;
|
|
386
387
|
private showLoginDialog;
|
|
387
388
|
private handlePackageBrowser;
|
|
389
|
+
private installPackages;
|
|
388
390
|
private handleReloadCommand;
|
|
389
391
|
private handleExportCommand;
|
|
390
392
|
private getPathCommandArgument;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-mode.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAKN,KAAK,YAAY,EAKjB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"interactive-mode.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ import * as path from "node:path";
|
|
|
9
9
|
import { completeSimple, getProviders, } from "@elyracode/ai";
|
|
10
10
|
import { CombinedAutocompleteProvider, Container, fuzzyFilter, Loader, Markdown, matchesKey, ProcessTerminal, Spacer, setKeybindings, Text, TruncatedText, TUI, visibleWidth, } from "@elyracode/tui";
|
|
11
11
|
import { spawn, spawnSync } from "child_process";
|
|
12
|
-
import { APP_NAME, APP_TITLE, getAgentDir, getAuthPath, getBlueprintsDir, getDebugLogPath, getDocsPath, getProjectBlueprintsDir, getProjectSnippetsDir, getSelfUpdateCommand, getShareViewerUrl, getSnippetsDir, PACKAGE_NAME, VERSION, } from "../../config.js";
|
|
12
|
+
import { APP_NAME, APP_TITLE, getAgentDir, getAuthPath, getBlueprintsDir, getDebugLogPath, getDocsPath, getProjectBlueprintsDir, getProjectSnippetsDir, getRoutingLedgerPath, getSelfUpdateCommand, getShareViewerUrl, getSnippetsDir, PACKAGE_NAME, VERSION, } from "../../config.js";
|
|
13
13
|
import { parseSkillBlock } from "../../core/agent-session.js";
|
|
14
14
|
import { SessionImportFileNotFoundError } from "../../core/agent-session-runtime.js";
|
|
15
15
|
import { FooterDataProvider } from "../../core/footer-data-provider.js";
|
|
@@ -20,6 +20,7 @@ import { selectDiverseModels } from "../../core/model-panel.js";
|
|
|
20
20
|
import { defaultModelPerProvider, findExactModelReferenceMatch, resolveModelScope } from "../../core/model-resolver.js";
|
|
21
21
|
import { DefaultPackageManager } from "../../core/package-manager.js";
|
|
22
22
|
import { BUILT_IN_PROVIDER_DISPLAY_NAMES } from "../../core/provider-display-names.js";
|
|
23
|
+
import { formatStatsReport, loadStats } from "../../core/routing-ledger.js";
|
|
23
24
|
import { formatMissingSessionCwdPrompt, MissingSessionCwdError } from "../../core/session-cwd.js";
|
|
24
25
|
import { SessionManager } from "../../core/session-manager.js";
|
|
25
26
|
import { extractSkillFromSession } from "../../core/skill-extraction.js";
|
|
@@ -53,6 +54,7 @@ import { formatKeyText, keyDisplayText, keyHint, keyText, rawKeyHint } from "./c
|
|
|
53
54
|
import { LoginDialogComponent } from "./components/login-dialog.js";
|
|
54
55
|
import { ModelSelectorComponent } from "./components/model-selector.js";
|
|
55
56
|
import { OAuthSelectorComponent } from "./components/oauth-selector.js";
|
|
57
|
+
import { PackageBrowserComponent } from "./components/package-browser.js";
|
|
56
58
|
import { RewindSelectorComponent } from "./components/rewind-selector.js";
|
|
57
59
|
import { ScopedModelsSelectorComponent } from "./components/scoped-models-selector.js";
|
|
58
60
|
import { SessionSelectorComponent } from "./components/session-selector.js";
|
|
@@ -2252,6 +2254,11 @@ export class InteractiveMode {
|
|
|
2252
2254
|
await this.handleRouteCommand();
|
|
2253
2255
|
return;
|
|
2254
2256
|
}
|
|
2257
|
+
if (text === "/routing-stats") {
|
|
2258
|
+
this.editor.setText("");
|
|
2259
|
+
this.handleRoutingStatsCommand();
|
|
2260
|
+
return;
|
|
2261
|
+
}
|
|
2255
2262
|
// Handle bash command (! for normal, !! for excluded from context)
|
|
2256
2263
|
if (text.startsWith("!")) {
|
|
2257
2264
|
const isExcluded = text.startsWith("!!");
|
|
@@ -3765,6 +3772,19 @@ export class InteractiveMode {
|
|
|
3765
3772
|
this.chatContainer.addChild(new Text(lines.join("\n"), 1, 0));
|
|
3766
3773
|
this.ui.requestRender();
|
|
3767
3774
|
}
|
|
3775
|
+
handleRoutingStatsCommand() {
|
|
3776
|
+
let report;
|
|
3777
|
+
try {
|
|
3778
|
+
report = formatStatsReport(loadStats(getRoutingLedgerPath(), "main"));
|
|
3779
|
+
}
|
|
3780
|
+
catch (err) {
|
|
3781
|
+
report = `Could not read the routing ledger: ${err instanceof Error ? err.message : String(err)}`;
|
|
3782
|
+
}
|
|
3783
|
+
const lines = [theme.bold("Routing Stats"), "", report];
|
|
3784
|
+
this.chatContainer.addChild(new Spacer(1));
|
|
3785
|
+
this.chatContainer.addChild(new Text(lines.join("\n"), 1, 0));
|
|
3786
|
+
this.ui.requestRender();
|
|
3787
|
+
}
|
|
3768
3788
|
getLastUserMessageText() {
|
|
3769
3789
|
const messages = this.session.state.messages;
|
|
3770
3790
|
for (let i = messages.length - 1; i >= 0; i--) {
|
|
@@ -5501,60 +5521,83 @@ export class InteractiveMode {
|
|
|
5501
5521
|
// Command handlers
|
|
5502
5522
|
// =========================================================================
|
|
5503
5523
|
handlePackageBrowser() {
|
|
5504
|
-
const
|
|
5505
|
-
|
|
5506
|
-
|
|
5507
|
-
|
|
5508
|
-
|
|
5509
|
-
|
|
5510
|
-
"
|
|
5511
|
-
"
|
|
5512
|
-
"
|
|
5513
|
-
"
|
|
5514
|
-
"
|
|
5515
|
-
"
|
|
5516
|
-
"
|
|
5517
|
-
"
|
|
5518
|
-
"
|
|
5519
|
-
"
|
|
5520
|
-
"
|
|
5521
|
-
"
|
|
5522
|
-
"
|
|
5523
|
-
"
|
|
5524
|
-
"
|
|
5525
|
-
"
|
|
5526
|
-
"
|
|
5527
|
-
"
|
|
5528
|
-
"
|
|
5529
|
-
"
|
|
5530
|
-
"
|
|
5531
|
-
"
|
|
5532
|
-
"
|
|
5533
|
-
"
|
|
5534
|
-
"
|
|
5535
|
-
"
|
|
5536
|
-
"
|
|
5524
|
+
const mk = (name, description) => ({
|
|
5525
|
+
value: `@elyracode/${name}`,
|
|
5526
|
+
name,
|
|
5527
|
+
description,
|
|
5528
|
+
});
|
|
5529
|
+
const items = [
|
|
5530
|
+
mk("stack-tall", "TALL: Livewire 4, Flux UI, Alpine.js, Tailwind"),
|
|
5531
|
+
mk("stack-vilt", "VILT: Vue 3, Inertia.js, Laravel, Tailwind"),
|
|
5532
|
+
mk("stack-rilt", "RILT: React 19, Inertia.js 2, Laravel, shadcn/ui"),
|
|
5533
|
+
mk("stack-silt", "SILT: Svelte 5, Inertia.js, Laravel, Tailwind CSS"),
|
|
5534
|
+
mk("stack-elyra-framework", "Elyra Framework: Rust + Svelte 5 desktop apps"),
|
|
5535
|
+
mk("stack-primevue", "PrimeVue 4: 80+ UI components for Vue 3"),
|
|
5536
|
+
mk("stack-filament", "Filament v5: admin panels, CRUD, tables, forms"),
|
|
5537
|
+
mk("stack-laravel-ai", "Laravel AI SDK: agents, sub-agents, embeddings"),
|
|
5538
|
+
mk("lsp-typescript", "TypeScript LSP: go-to-definition, find-references, diagnostics, hover"),
|
|
5539
|
+
mk("lsp-php", "PHP LSP: go-to-definition, find-references, diagnostics, hover (Intelephense)"),
|
|
5540
|
+
mk("lsp-rust", "Rust LSP: go-to-definition, find-references, diagnostics, hover (rust-analyzer)"),
|
|
5541
|
+
mk("db-tools", "Database: MySQL, ClickHouse, SQLite, schema discovery"),
|
|
5542
|
+
mk("laravel", "Deep Laravel understanding: models, routes, architecture analysis"),
|
|
5543
|
+
mk("laravel-starters", "Laravel starter kits from GitHub"),
|
|
5544
|
+
mk("flux-ui", "Flux UI: component index, Blade converter, page gen"),
|
|
5545
|
+
mk("doctor", "Project health: audit, deps, code debt, auto-heal"),
|
|
5546
|
+
mk("http-tools", "HTTP: API testing, docs fetching, OpenAPI parsing"),
|
|
5547
|
+
mk("design-tools", "Design: browser preview, screenshots, Tailwind QA"),
|
|
5548
|
+
mk("design-lookup", "Design extraction: colors, typography, spacing, components from any URL"),
|
|
5549
|
+
mk("subagents", "Subagents: scout, reviewer, planner, worker, oracle"),
|
|
5550
|
+
mk("git-intel", "Git: session briefings, commit messages, PR descriptions"),
|
|
5551
|
+
mk("test-gen", "Testing: Pest for Laravel, Vitest for TypeScript"),
|
|
5552
|
+
mk("perf-tools", "Performance: N+1 queries, slow queries, indexes"),
|
|
5553
|
+
mk("i18n-tools", "Localization: hardcoded strings, missing translations"),
|
|
5554
|
+
mk("herd", "Laravel Herd: services, logs, PHP version, .env sync"),
|
|
5555
|
+
mk("anna", "Presentations: Anna.js slides, terminal demos, diagrams"),
|
|
5556
|
+
mk("swarm", "Swarm: automated build, review, and refactor pipelines"),
|
|
5557
|
+
mk("docker", "Docker: container exec, logs, compose, env sync"),
|
|
5558
|
+
mk("seo", "SEO and LLM optimization: audit, structured data, llms.txt, meta tags"),
|
|
5559
|
+
mk("workflows", "Code-orchestrated workflows: multi-step pipelines in JSON"),
|
|
5560
|
+
mk("btw", "Side conversations: ask questions in parallel without affecting the main session"),
|
|
5561
|
+
mk("youtrack", "YouTrack: issues, comments, tags, links, projects, time tracking"),
|
|
5562
|
+
mk("semantic-index", "Semantic code search: find code by meaning via local embeddings"),
|
|
5537
5563
|
];
|
|
5538
5564
|
this.showSelector((done) => {
|
|
5539
|
-
const
|
|
5565
|
+
const browser = new PackageBrowserComponent(items, (values) => {
|
|
5540
5566
|
done();
|
|
5541
|
-
|
|
5542
|
-
this.showStatus(`Installing ${pkgName}...`);
|
|
5543
|
-
try {
|
|
5544
|
-
spawnSync("elyra", ["install", `npm:${pkgName}`], {
|
|
5545
|
-
cwd: process.cwd(),
|
|
5546
|
-
timeout: 60000,
|
|
5547
|
-
stdio: "pipe",
|
|
5548
|
-
});
|
|
5549
|
-
this.showStatus(`Installed ${pkgName}. Run /reload to activate.`);
|
|
5550
|
-
}
|
|
5551
|
-
catch {
|
|
5552
|
-
this.showError(`Failed to install ${pkgName}`);
|
|
5553
|
-
}
|
|
5567
|
+
this.installPackages(values);
|
|
5554
5568
|
}, () => done());
|
|
5555
|
-
return { component:
|
|
5569
|
+
return { component: browser, focus: browser };
|
|
5556
5570
|
});
|
|
5557
5571
|
}
|
|
5572
|
+
installPackages(values) {
|
|
5573
|
+
const installed = [];
|
|
5574
|
+
const failed = [];
|
|
5575
|
+
for (const pkgName of values) {
|
|
5576
|
+
this.showStatus(`Installing ${pkgName}...`);
|
|
5577
|
+
try {
|
|
5578
|
+
const result = spawnSync("elyra", ["install", `npm:${pkgName}`], {
|
|
5579
|
+
cwd: process.cwd(),
|
|
5580
|
+
timeout: 60000,
|
|
5581
|
+
stdio: "pipe",
|
|
5582
|
+
});
|
|
5583
|
+
if (result.status === 0) {
|
|
5584
|
+
installed.push(pkgName);
|
|
5585
|
+
}
|
|
5586
|
+
else {
|
|
5587
|
+
failed.push(pkgName);
|
|
5588
|
+
}
|
|
5589
|
+
}
|
|
5590
|
+
catch {
|
|
5591
|
+
failed.push(pkgName);
|
|
5592
|
+
}
|
|
5593
|
+
}
|
|
5594
|
+
if (installed.length > 0) {
|
|
5595
|
+
this.showStatus(`Installed ${installed.join(", ")}. Run /reload to activate.`);
|
|
5596
|
+
}
|
|
5597
|
+
if (failed.length > 0) {
|
|
5598
|
+
this.showError(`Failed to install ${failed.join(", ")}`);
|
|
5599
|
+
}
|
|
5600
|
+
}
|
|
5558
5601
|
async handleReloadCommand() {
|
|
5559
5602
|
if (this.session.isStreaming) {
|
|
5560
5603
|
this.showWarning("Wait for the current response to finish before reloading.");
|