@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.
Files changed (53) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/cli/args.d.ts.map +1 -1
  3. package/dist/cli/args.js +1 -0
  4. package/dist/cli/args.js.map +1 -1
  5. package/dist/cli/doctor-cli.d.ts.map +1 -1
  6. package/dist/cli/doctor-cli.js +8 -1
  7. package/dist/cli/doctor-cli.js.map +1 -1
  8. package/dist/config.d.ts +2 -0
  9. package/dist/config.d.ts.map +1 -1
  10. package/dist/config.js +4 -0
  11. package/dist/config.js.map +1 -1
  12. package/dist/core/keybindings.d.ts +10 -0
  13. package/dist/core/keybindings.d.ts.map +1 -1
  14. package/dist/core/keybindings.js +8 -0
  15. package/dist/core/keybindings.js.map +1 -1
  16. package/dist/core/model-fallback.d.ts +17 -5
  17. package/dist/core/model-fallback.d.ts.map +1 -1
  18. package/dist/core/model-fallback.js +29 -5
  19. package/dist/core/model-fallback.js.map +1 -1
  20. package/dist/core/routing-ledger.d.ts +83 -0
  21. package/dist/core/routing-ledger.d.ts.map +1 -0
  22. package/dist/core/routing-ledger.js +238 -0
  23. package/dist/core/routing-ledger.js.map +1 -0
  24. package/dist/core/sdk.d.ts.map +1 -1
  25. package/dist/core/sdk.js +36 -2
  26. package/dist/core/sdk.js.map +1 -1
  27. package/dist/core/settings-manager.d.ts +2 -0
  28. package/dist/core/settings-manager.d.ts.map +1 -1
  29. package/dist/core/settings-manager.js +3 -0
  30. package/dist/core/settings-manager.js.map +1 -1
  31. package/dist/core/slash-commands.d.ts.map +1 -1
  32. package/dist/core/slash-commands.js +1 -0
  33. package/dist/core/slash-commands.js.map +1 -1
  34. package/dist/modes/interactive/components/index.d.ts +1 -0
  35. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  36. package/dist/modes/interactive/components/index.js +1 -0
  37. package/dist/modes/interactive/components/index.js.map +1 -1
  38. package/dist/modes/interactive/components/package-browser.d.ts +26 -0
  39. package/dist/modes/interactive/components/package-browser.d.ts.map +1 -0
  40. package/dist/modes/interactive/components/package-browser.js +137 -0
  41. package/dist/modes/interactive/components/package-browser.js.map +1 -0
  42. package/dist/modes/interactive/interactive-mode.d.ts +2 -0
  43. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  44. package/dist/modes/interactive/interactive-mode.js +92 -49
  45. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  46. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  47. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  48. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  49. package/examples/extensions/sandbox/package-lock.json +2 -2
  50. package/examples/extensions/sandbox/package.json +1 -1
  51. package/examples/extensions/with-deps/package-lock.json +2 -2
  52. package/examples/extensions/with-deps/package.json +1 -1
  53. 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":"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"}
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 packages = [
5505
- "@elyracode/stack-tall -- TALL: Livewire 4, Flux UI, Alpine.js, Tailwind",
5506
- "@elyracode/stack-vilt -- VILT: Vue 3, Inertia.js, Laravel, Tailwind",
5507
- "@elyracode/stack-rilt -- RILT: React 19, Inertia.js 2, Laravel, shadcn/ui",
5508
- "@elyracode/stack-primevue -- PrimeVue 4: 80+ UI components for Vue 3",
5509
- "@elyracode/stack-filament -- Filament v5: admin panels, CRUD, tables, forms",
5510
- "@elyracode/stack-laravel-ai -- Laravel AI SDK: agents, sub-agents, embeddings",
5511
- "@elyracode/db-tools -- Database: MySQL, ClickHouse, SQLite, schema discovery",
5512
- "@elyracode/laravel-starters -- Laravel starter kits from GitHub",
5513
- "@elyracode/flux-ui -- Flux UI: component index, Blade converter, page gen",
5514
- "@elyracode/doctor -- Project health: audit, deps, code debt, auto-heal",
5515
- "@elyracode/http-tools -- HTTP: API testing, docs fetching, OpenAPI parsing",
5516
- "@elyracode/design-tools -- Design: browser preview, screenshots, Tailwind QA",
5517
- "@elyracode/subagents -- Subagents: scout, reviewer, planner, worker, oracle",
5518
- "@elyracode/git-intel -- Git: session briefings, commit messages, PR descriptions",
5519
- "@elyracode/test-gen -- Testing: Pest for Laravel, Vitest for TypeScript",
5520
- "@elyracode/perf-tools -- Performance: N+1 queries, slow queries, indexes",
5521
- "@elyracode/i18n-tools -- Localization: hardcoded strings, missing translations",
5522
- "@elyracode/herd -- Laravel Herd: services, logs, PHP version, .env sync",
5523
- "@elyracode/anna -- Presentations: Anna.js slides, terminal demos, diagrams",
5524
- "@elyracode/swarm -- Swarm: automated build, review, and refactor pipelines",
5525
- "@elyracode/docker -- Docker: container exec, logs, compose, env sync",
5526
- "@elyracode/design-lookup -- Design extraction: colors, typography, spacing, components from any URL",
5527
- "@elyracode/lsp-typescript -- TypeScript LSP: go-to-definition, find-references, diagnostics, hover",
5528
- "@elyracode/lsp-php -- PHP LSP: go-to-definition, find-references, diagnostics, hover (Intelephense)",
5529
- "@elyracode/lsp-rust -- Rust LSP: go-to-definition, find-references, diagnostics, hover (rust-analyzer)",
5530
- "@elyracode/stack-silt -- SILT: Svelte 5, Inertia.js, Laravel, Tailwind CSS",
5531
- "@elyracode/seo -- SEO and LLM optimization: audit, structured data, llms.txt, meta tags",
5532
- "@elyracode/workflows -- Code-orchestrated workflows: multi-step pipelines in JSON",
5533
- "@elyracode/laravel -- Deep Laravel understanding: models, routes, architecture analysis",
5534
- "@elyracode/btw -- Side conversations: ask questions in parallel without affecting the main session",
5535
- "@elyracode/youtrack -- YouTrack: issues, comments, tags, links, projects, time tracking",
5536
- "@elyracode/semantic-index -- Semantic code search: find code by meaning via local embeddings",
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 selector = new ExtensionSelectorComponent("Install Extension", packages, (selected) => {
5565
+ const browser = new PackageBrowserComponent(items, (values) => {
5540
5566
  done();
5541
- const pkgName = selected.split(" -- ")[0];
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: selector, focus: selector };
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.");