@qodalis/react-cli 2.4.0 → 2.4.2

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/README.md CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
  ![Help command](https://raw.githubusercontent.com/qodalis-solutions/web-cli/main/assets/help_command.gif)
22
22
 
23
- Qodalis CLI renders an [xterm.js](https://xtermjs.org/) terminal in your app with a shell-like command line, built-in commands, themes and a runtime package manager. You add commands as **modules** (`ICliModule`): the 40 official plugins, your own commands, or packages installed at runtime with `pkg add`. It can also connect to a Node.js, .NET or Python backend to run server-side commands.
23
+ Qodalis CLI renders an [xterm.js](https://xtermjs.org/) terminal in your app with a shell-like command line, built-in commands, themes and a runtime package manager. You add commands as **modules** (`ICliModule`): the 40 official plugins (34 here, 6 games in [cli-games](https://github.com/qodalis-solutions/cli-games)), your own commands, or packages installed at runtime with `pkg add`. It can also connect to a Node.js, .NET or Python backend to run server-side commands.
24
24
 
25
25
  ## Try it online
26
26
 
@@ -210,7 +210,7 @@ Install from npm and pass the module, or run `pkg add <name>` in the terminal.
210
210
  | [`@qodalis/cli-wget`](https://www.npmjs.com/package/@qodalis/cli-wget) | `wgetModule` | `wget` |
211
211
  | [`@qodalis/cli-yesno`](https://www.npmjs.com/package/@qodalis/cli-yesno) | `yesnoModule` | `yesno` |
212
212
 
213
- **Games**: [`@qodalis/cli-2048`](https://www.npmjs.com/package/@qodalis/cli-2048) (`game2048Module`), [`@qodalis/cli-minesweeper`](https://www.npmjs.com/package/@qodalis/cli-minesweeper), [`@qodalis/cli-snake`](https://www.npmjs.com/package/@qodalis/cli-snake), [`@qodalis/cli-sudoku`](https://www.npmjs.com/package/@qodalis/cli-sudoku), [`@qodalis/cli-tetris`](https://www.npmjs.com/package/@qodalis/cli-tetris), [`@qodalis/cli-wordle`](https://www.npmjs.com/package/@qodalis/cli-wordle).
213
+ **Games** ([cli-games](https://github.com/qodalis-solutions/cli-games), same `@qodalis/cli-<game>` names): [`@qodalis/cli-2048`](https://www.npmjs.com/package/@qodalis/cli-2048) (`game2048Module`), [`@qodalis/cli-minesweeper`](https://www.npmjs.com/package/@qodalis/cli-minesweeper), [`@qodalis/cli-snake`](https://www.npmjs.com/package/@qodalis/cli-snake), [`@qodalis/cli-sudoku`](https://www.npmjs.com/package/@qodalis/cli-sudoku), [`@qodalis/cli-tetris`](https://www.npmjs.com/package/@qodalis/cli-tetris), [`@qodalis/cli-wordle`](https://www.npmjs.com/package/@qodalis/cli-wordle).
214
214
 
215
215
  **Language packs**: `@qodalis/cli-lang-<code>` for `de`, `es`, `fr`, `it`, `ja`, `ko`, `pt`, `ro`, `ru`, `zh` (`langDeModule`, ...).
216
216
 
@@ -220,6 +220,7 @@ Details and examples for each plugin: [Plugins](https://cli.qodalis.com/docs/plu
220
220
 
221
221
  | Repository | What it is |
222
222
  | --- | --- |
223
+ | [cli-games](https://github.com/qodalis-solutions/cli-games) | The six game plugins (`@qodalis/cli-2048`, `-minesweeper`, `-snake`, `-sudoku`, `-tetris`, `-wordle`) |
223
224
  | [cli-server-node](https://github.com/qodalis-solutions/cli-server-node) | Node.js server (`@qodalis/cli-server-node`): server commands, shell, filesystem, data explorer, jobs, MCP |
224
225
  | [cli-server-dotnet](https://github.com/qodalis-solutions/cli-server-dotnet) | The same server for ASP.NET Core (NuGet `Qodalis.Cli`) |
225
226
  | [cli-server-python](https://github.com/qodalis-solutions/cli-server-python) | The same server for FastAPI (PyPI `qodalis-cli-server`) |
@@ -263,7 +264,7 @@ pnpm run create-plugin -- --name <name> --description "<desc>" --processor-name
263
264
  | `packages/cli` | `@qodalis/cli`: the engine and built-in commands |
264
265
  | `packages/angular-cli`, `react-cli`, `vue-cli`, `electron-cli` | Framework wrappers |
265
266
  | `packages/create-cli-plugin` | Plugin scaffolder |
266
- | `packages/plugins/*` | The 40 plugins |
267
+ | `packages/plugins/*` | The 34 plugins (the 6 games live in [cli-games](https://github.com/qodalis-solutions/cli-games)) |
267
268
  | `apps/` | Docs site and demo apps |
268
269
 
269
270
  [CONTRIBUTING.md](https://github.com/qodalis-solutions/web-cli/blob/main/CONTRIBUTING.md) covers branches and pull requests, [DEVELOPER.md](https://github.com/qodalis-solutions/web-cli/blob/main/DEVELOPER.md) the architecture and build details.
package/dist/index.js CHANGED
@@ -172,7 +172,7 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
172
172
  const config = useCliConfig();
173
173
  const options = (0, import_cli3.mergeCliOptions)(props.options, config.options);
174
174
  const { modules, services } = (0, import_cli3.resolveCliHostConfig)(props, config);
175
- const [controller] = (0, import_react5.useState)(
175
+ const [controller2] = (0, import_react5.useState)(
176
176
  () => new import_cli3.CliPanelController({
177
177
  config: options,
178
178
  controlled: {
@@ -186,11 +186,11 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
186
186
  }
187
187
  })
188
188
  );
189
- const s = (0, import_react5.useSyncExternalStore)(controller.subscribe, controller.getSnapshot, controller.getSnapshot);
189
+ const s = (0, import_react5.useSyncExternalStore)(controller2.subscribe, controller2.getSnapshot, controller2.getSnapshot);
190
190
  const brand = (0, import_cli3.panelBranding)(options);
191
191
  const [rootElement, setRootElement] = (0, import_react5.useState)(null);
192
192
  (0, import_react5.useLayoutEffect)(() => {
193
- controller.setCallbacks({
193
+ controller2.setCallbacks({
194
194
  onCollapsedChange: props.onCollapsedChange,
195
195
  onHiddenChange: props.onHiddenChange,
196
196
  onMaximizedChange: props.onMaximizedChange,
@@ -204,7 +204,7 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
204
204
  onPaneSplit: props.onPaneSplit,
205
205
  onPaneClosed: props.onPaneClosed
206
206
  });
207
- controller.setControlled({
207
+ controller2.setControlled({
208
208
  collapsed: props.collapsed,
209
209
  hidden: props.hidden,
210
210
  maximized: props.maximized,
@@ -213,11 +213,11 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
213
213
  height: props.height,
214
214
  width: props.width
215
215
  });
216
- controller.setOptions(options);
216
+ controller2.setOptions(options);
217
217
  });
218
- (0, import_react5.useEffect)(() => controller.setRootElement(rootElement), [controller, rootElement]);
219
- (0, import_react5.useEffect)(() => () => controller.destroy(), [controller]);
220
- import_react5.default.useImperativeHandle(ref, () => controller, [controller]);
218
+ (0, import_react5.useEffect)(() => controller2.setRootElement(rootElement), [controller2, rootElement]);
219
+ (0, import_react5.useEffect)(() => () => controller2.destroy(), [controller2]);
220
+ import_react5.default.useImperativeHandle(ref, () => controller2, [controller2]);
221
221
  if (!s.visible) return null;
222
222
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
223
223
  s.hidden && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
@@ -228,7 +228,7 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
228
228
  "data-hide-align": s.hideAlignment,
229
229
  style: asStyle(s.themeStyles),
230
230
  title: import_cli3.PANEL_LABELS.showCli,
231
- onClick: () => controller.unhide(),
231
+ onClick: () => controller2.unhide(),
232
232
  children: [
233
233
  brand.iconUrl ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("img", { src: brand.iconUrl, alt: "", className: "cli-panel-hide-tab-icon cli-panel-brand-icon" }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon: import_cli3.HIDE_TAB_TERMINAL_ICON, className: "cli-panel-hide-tab-icon" }),
234
234
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "cli-panel-hide-tab-label", children: brand.title }),
@@ -247,19 +247,19 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
247
247
  "data-closable": String(s.closable),
248
248
  "data-hideable": String(s.hideable),
249
249
  children: [
250
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(PanelHeader, { controller, s, brand }),
250
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(PanelHeader, { controller: controller2, s, brand }),
251
251
  s.initialized && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "cli-panel-content", style: s.collapsed ? { display: "none" } : void 0, children: [
252
252
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "cli-panel-tabs", children: [
253
253
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("ul", { className: "cli-panel-tab-list", children: s.tabs.map((tab) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
254
254
  "li",
255
255
  {
256
256
  className: (0, import_cli3.panelTabClass)(s, tab),
257
- onClick: () => controller.selectTab(tab.id),
258
- onDoubleClick: () => controller.startRename(tab.id),
257
+ onClick: () => controller2.selectTab(tab.id),
258
+ onDoubleClick: () => controller2.startRename(tab.id),
259
259
  onContextMenu: (e) => {
260
260
  e.preventDefault();
261
261
  e.stopPropagation();
262
- controller.openContextMenu(tab.id, e.clientX, e.clientY);
262
+ controller2.openContextMenu(tab.id, e.clientX, e.clientY);
263
263
  },
264
264
  children: tab.isEditing ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
265
265
  "input",
@@ -268,8 +268,8 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
268
268
  type: "text",
269
269
  defaultValue: tab.title,
270
270
  ref: focusAndSelect,
271
- onKeyDown: (e) => (0, import_cli3.handleRenameKey)(controller, tab.id, e.key, e.currentTarget.value),
272
- onBlur: (e) => controller.commitRename(tab.id, e.target.value),
271
+ onKeyDown: (e) => (0, import_cli3.handleRenameKey)(controller2, tab.id, e.key, e.currentTarget.value),
272
+ onBlur: (e) => controller2.commitRename(tab.id, e.target.value),
273
273
  onClick: (e) => e.stopPropagation(),
274
274
  onDoubleClick: (e) => e.stopPropagation()
275
275
  }
@@ -283,7 +283,7 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
283
283
  title: import_cli3.PANEL_LABELS.closeTab,
284
284
  onClick: (e) => {
285
285
  e.stopPropagation();
286
- controller.closeTab(tab.id);
286
+ controller2.closeTab(tab.id);
287
287
  },
288
288
  children: import_cli3.CLOSE_GLYPH
289
289
  }
@@ -292,7 +292,7 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
292
292
  },
293
293
  tab.id
294
294
  )) }),
295
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { className: "cli-panel-add-tab", title: import_cli3.PANEL_LABELS.newTerminal, onClick: () => controller.addTab(), children: "+" })
295
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { className: "cli-panel-add-tab", title: import_cli3.PANEL_LABELS.newTerminal, onClick: () => controller2.addTab(), children: "+" })
296
296
  ] }),
297
297
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "cli-panel-instances", children: s.tabs.map((tab) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "cli-panel-instance", style: { display: tab.id === s.activeTabId ? void 0 : "none" }, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: (0, import_cli3.panesContainerClass)(s), children: tab.panes.map((pane, i) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react5.default.Fragment, { children: [
298
298
  i > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
@@ -301,7 +301,7 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
301
301
  className: "cli-panel-pane-divider",
302
302
  onPointerDown: (e) => {
303
303
  e.preventDefault();
304
- controller.startPaneResize(tab.id, i - 1, e.clientX, (0, import_cli3.panesContainerWidth)(e.target));
304
+ controller2.startPaneResize(tab.id, i - 1, e.clientX, (0, import_cli3.panesContainerWidth)(e.target));
305
305
  },
306
306
  children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "cli-panel-pane-divider-grip" })
307
307
  }
@@ -311,7 +311,7 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
311
311
  {
312
312
  className: (0, import_cli3.paneClass)(s, tab.id, pane.id),
313
313
  style: (0, import_cli3.paneStyle)(pane.widthPercent),
314
- onClick: () => controller.activatePane(tab.id, pane.id),
314
+ onClick: () => controller2.activatePane(tab.id, pane.id),
315
315
  children: [
316
316
  tab.panes.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
317
317
  "button",
@@ -320,7 +320,7 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
320
320
  title: import_cli3.PANEL_LABELS.closePane,
321
321
  onClick: (e) => {
322
322
  e.stopPropagation();
323
- controller.closePane(pane.id);
323
+ controller2.closePane(pane.id);
324
324
  },
325
325
  children: import_cli3.CLOSE_GLYPH
326
326
  }
@@ -332,7 +332,7 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
332
332
  modules,
333
333
  services,
334
334
  snapshot: pane.snapshot,
335
- onReady: (engine) => controller.registerEngine(tab.id, pane.id, engine)
335
+ onReady: (engine) => controller2.registerEngine(tab.id, pane.id, engine)
336
336
  }
337
337
  ) })
338
338
  ]
@@ -350,7 +350,7 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
350
350
  {
351
351
  className: (0, import_cli3.joinClasses)("cli-panel-context-menu-item", item.destructive && "destructive"),
352
352
  disabled: item.disabled,
353
- onClick: () => (0, import_cli3.runContextMenuAction)(controller, item.action),
353
+ onClick: () => (0, import_cli3.runContextMenuAction)(controller2, item.action),
354
354
  children: item.label
355
355
  }
356
356
  )
@@ -372,22 +372,42 @@ function StatusDropdown({ s }) {
372
372
  dropdown.kind === "servers" ? /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "cli-panel-srv-meta", children: [
373
373
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "cli-panel-svc-status", children: row.status }),
374
374
  row.meta.map((m) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "cli-panel-svc-desc", children: m }, m))
375
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "cli-panel-svc-status", children: row.status })
375
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
376
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "cli-panel-svc-status", children: row.status }),
377
+ row.stop && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
378
+ "button",
379
+ {
380
+ type: "button",
381
+ className: "cli-panel-svc-stop",
382
+ title: row.stop.title,
383
+ onClick: () => controller.killProcess(row.stop.pid),
384
+ children: row.stop.label
385
+ }
386
+ )
387
+ ] })
376
388
  ] }, row.key)) }),
377
389
  dropdown.rows.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "cli-panel-services-dropdown-empty", children: dropdown.emptyText })
378
390
  ] });
379
391
  }
380
392
  function PanelHeader({
381
- controller,
393
+ controller: controller2,
382
394
  s,
383
395
  brand
384
396
  }) {
385
397
  const indicators = (0, import_cli3.statusIndicators)(s);
398
+ const onIndicatorClick = (e, item) => {
399
+ if (item.stop) {
400
+ e.stopPropagation();
401
+ controller2.stopCommand();
402
+ return;
403
+ }
404
+ openDropdown(e, item.dropdown);
405
+ };
386
406
  const openDropdown = (e, dropdown) => {
387
407
  if (!dropdown) return;
388
408
  e.stopPropagation();
389
- if (dropdown === "services") controller.toggleServicesDropdown(e.currentTarget);
390
- else controller.toggleServersDropdown(e.currentTarget);
409
+ if (dropdown === "services") controller2.toggleServicesDropdown(e.currentTarget);
410
+ else controller2.toggleServersDropdown(e.currentTarget);
391
411
  };
392
412
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "cli-panel-header", children: [
393
413
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
@@ -397,7 +417,7 @@ function PanelHeader({
397
417
  onPointerDown: (e) => {
398
418
  if (!s.resizable) return;
399
419
  e.preventDefault();
400
- controller.startPanelResize(e.clientX, e.clientY);
420
+ controller2.startPanelResize(e.clientX, e.clientY);
401
421
  },
402
422
  children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "cli-panel-resize-grip" })
403
423
  }
@@ -415,7 +435,20 @@ function PanelHeader({
415
435
  children: [
416
436
  item.dotClass && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: `cli-panel-status-dot ${item.dotClass}` }),
417
437
  item.icon && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: (0, import_cli3.joinClasses)("cli-panel-status-icon", item.iconClass), children: item.icon }),
418
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "cli-panel-status-label", children: item.label })
438
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "cli-panel-status-label", children: item.label }),
439
+ item.stop && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
440
+ "button",
441
+ {
442
+ type: "button",
443
+ className: "cli-panel-status-stop",
444
+ title: item.stop.title,
445
+ onClick: (e) => {
446
+ e.stopPropagation();
447
+ controller2.stopCommand();
448
+ },
449
+ children: item.stop.label
450
+ }
451
+ )
419
452
  ]
420
453
  },
421
454
  item.key
@@ -425,7 +458,7 @@ function PanelHeader({
425
458
  {
426
459
  className: (0, import_cli3.joinClasses)("cli-panel-status-compact-item", item.compactClass),
427
460
  title: item.title,
428
- onClick: item.dropdown ? (e) => openDropdown(e, item.dropdown) : void 0,
461
+ onClick: item.dropdown || item.stop ? (e) => onIndicatorClick(e, item) : void 0,
429
462
  children: [
430
463
  item.compactDotClass && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: item.compactDotClass }),
431
464
  item.dotClass && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: `cli-panel-status-dot ${item.dotClass}` }),
@@ -436,25 +469,25 @@ function PanelHeader({
436
469
  )) }),
437
470
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "cli-panel-action-buttons", children: [
438
471
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "cli-panel-btn-position-wrapper", onClick: (e) => e.stopPropagation(), children: [
439
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { className: "cli-panel-btn cli-panel-btn-position", title: import_cli3.PANEL_LABELS.movePanel, onClick: () => controller.togglePositionDropdown(), children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon: (0, import_cli3.positionIcon)(s.position) }) }),
440
- s.positionDropdownOpen && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "cli-panel-position-dropdown", children: (0, import_cli3.positionOptions)(s).map((opt) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("button", { className: opt.className, onClick: () => controller.setPosition(opt.position), children: [
472
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { className: "cli-panel-btn cli-panel-btn-position", title: import_cli3.PANEL_LABELS.movePanel, onClick: () => controller2.togglePositionDropdown(), children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon: (0, import_cli3.positionIcon)(s.position) }) }),
473
+ s.positionDropdownOpen && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "cli-panel-position-dropdown", children: (0, import_cli3.positionOptions)(s).map((opt) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("button", { className: opt.className, onClick: () => controller2.setPosition(opt.position), children: [
441
474
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon: (0, import_cli3.positionIcon)(opt.position, 16) }),
442
475
  opt.label
443
476
  ] }, opt.position)) })
444
477
  ] }),
445
- s.hideable && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { className: "cli-panel-btn cli-panel-btn-hide", title: import_cli3.PANEL_LABELS.hide, onClick: () => controller.hide(), children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon: import_cli3.HIDE_ICON }) }),
478
+ s.hideable && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { className: "cli-panel-btn cli-panel-btn-hide", title: import_cli3.PANEL_LABELS.hide, onClick: () => controller2.hide(), children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon: import_cli3.HIDE_ICON }) }),
446
479
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
447
480
  "button",
448
481
  {
449
482
  className: "cli-panel-btn",
450
483
  title: s.maximized ? import_cli3.PANEL_LABELS.restore : import_cli3.PANEL_LABELS.maximize,
451
484
  disabled: s.collapsed,
452
- onClick: () => controller.toggleMaximize(),
485
+ onClick: () => controller2.toggleMaximize(),
453
486
  children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon: s.maximized ? import_cli3.RESTORE_ICON : import_cli3.MAXIMIZE_ICON })
454
487
  }
455
488
  ),
456
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { className: "cli-panel-btn", title: s.collapsed ? import_cli3.PANEL_LABELS.expand : import_cli3.PANEL_LABELS.collapse, onClick: () => controller.toggle(), children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon: (0, import_cli3.collapseChevronIcon)(s.position, s.collapsed) }) }),
457
- s.closable && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { className: "cli-panel-btn cli-panel-btn-close", title: import_cli3.PANEL_LABELS.close, onClick: () => controller.close(), children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon: import_cli3.CLOSE_ICON }) })
489
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { className: "cli-panel-btn", title: s.collapsed ? import_cli3.PANEL_LABELS.expand : import_cli3.PANEL_LABELS.collapse, onClick: () => controller2.toggle(), children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon: (0, import_cli3.collapseChevronIcon)(s.position, s.collapsed) }) }),
490
+ s.closable && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { className: "cli-panel-btn cli-panel-btn-close", title: import_cli3.PANEL_LABELS.close, onClick: () => controller2.close(), children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon: import_cli3.CLOSE_ICON }) })
458
491
  ] })
459
492
  ] }),
460
493
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: (0, import_cli3.glowLineClass)(s) })
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.tsx","../src/Cli.tsx","../src/CliContext.tsx","../src/CliConfigContext.tsx","../src/useCliEngine.ts","../src/CliPanel.tsx","../src/CliProvider.tsx"],"sourcesContent":["export { Cli } from './Cli';\nexport type { CliProps } from './Cli';\nexport { CliPanel } from './CliPanel';\nexport type { CliPanelProps, CliPanelOptions } from './CliPanel';\nexport { CliProvider } from './CliProvider';\nexport type { CliProviderProps } from './CliProvider';\nexport { useCli, CliContext } from './CliContext';\nexport type { CliContextValue } from './CliContext';\nexport { CliConfigProvider, useCliConfig } from './CliConfigContext';\nexport type { CliConfigValue, CliConfigProviderProps } from './CliConfigContext';\nexport { useCliEngine } from './useCliEngine';\nexport type { UseCliEngineConfig } from './useCliEngine';\n\n// Re-export commonly used types from @qodalis/cli for convenience\nexport type { CliEngineOptions } from '@qodalis/cli';\nexport { CliEngine } from '@qodalis/cli';\n","import React, { useRef, useEffect } from 'react';\nimport { ICliModule, CliEngineSnapshot } from '@qodalis/cli-core';\nimport { CliEngine, CliEngineOptions, resolveCliHostConfig } from '@qodalis/cli';\nimport { useCli } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\nimport { useCliEngine } from './useCliEngine';\n\nexport interface CliProps {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n snapshot?: CliEngineSnapshot;\n onReady?: (engine: CliEngine) => void;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport function Cli({\n modules,\n options,\n services,\n snapshot,\n onReady,\n style,\n className,\n}: CliProps): React.JSX.Element {\n const ctx = useCli();\n const config = useCliConfig();\n const containerRef = useRef<HTMLDivElement>(null);\n const hasProvider = !!ctx.engine;\n\n // Always call the hook (React rules), but disable it when inside a CliProvider.\n const standaloneEngine = useCliEngine(containerRef, {\n ...resolveCliHostConfig({ modules, options, services }, config),\n snapshot,\n disabled: hasProvider,\n });\n\n const engine = ctx.engine ?? standaloneEngine;\n\n useEffect(() => {\n if (engine && onReady) {\n onReady(engine);\n }\n }, [engine, onReady]);\n\n // If inside a CliProvider, render nothing (provider has the terminal div).\n if (hasProvider) {\n return <></>;\n }\n\n return (\n <div\n ref={containerRef}\n style={{ height: '100%', ...style }}\n className={className}\n />\n );\n}\n","import { createContext, useContext } from 'react';\nimport { CliEngine } from '@qodalis/cli';\n\nexport interface CliContextValue {\n engine: CliEngine | null;\n}\n\nexport const CliContext = createContext<CliContextValue>({ engine: null });\n\nexport function useCli(): CliContextValue {\n return useContext(CliContext);\n}\n","import React, { createContext, useContext } from 'react';\nimport { ICliModule, CliOptions } from '@qodalis/cli-core';\nimport { CliEngineOptions } from '@qodalis/cli';\n\nexport interface CliConfigValue {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n}\n\nconst CliConfigCtx = createContext<CliConfigValue>({});\n\nexport function useCliConfig(): CliConfigValue {\n return useContext(CliConfigCtx);\n}\n\nexport interface CliConfigProviderProps extends CliConfigValue {\n children: React.ReactNode;\n}\n\nexport function CliConfigProvider({\n modules,\n options,\n services,\n children,\n}: CliConfigProviderProps): React.JSX.Element {\n return (\n <CliConfigCtx.Provider value={{ modules, options, services }}>\n {children}\n </CliConfigCtx.Provider>\n );\n}\n","import { useRef, useEffect, useState, RefObject } from 'react';\nimport { CliEngine, CreateCliEngineConfig, createCliEngine } from '@qodalis/cli';\n\nexport interface UseCliEngineConfig extends Omit<CreateCliEngineConfig, 'framework'> {\n disabled?: boolean;\n}\n\nexport function useCliEngine(\n containerRef: RefObject<HTMLElement | null>,\n config?: UseCliEngineConfig,\n): CliEngine | null {\n const [engine, setEngine] = useState<CliEngine | null>(null);\n const engineRef = useRef<CliEngine | null>(null);\n const initTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (config?.disabled || !containerRef.current) return;\n\n // Defer initialization slightly so that StrictMode's immediate\n // unmount (mount → unmount → remount) cancels the first attempt\n // via the cleanup function, while non-StrictMode proceeds normally.\n const container = containerRef.current;\n initTimerRef.current = setTimeout(() => {\n initTimerRef.current = null;\n if (!container) return;\n\n const e = createCliEngine(container, { ...config, framework: 'React' });\n\n engineRef.current = e;\n e.start().then(() => setEngine(e));\n }, 0);\n\n return () => {\n if (initTimerRef.current !== null) {\n clearTimeout(initTimerRef.current);\n initTimerRef.current = null;\n return;\n }\n if (engineRef.current) {\n engineRef.current.destroy();\n engineRef.current = null;\n setEngine(null);\n }\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return engine;\n}\n","import React, { useEffect, useLayoutEffect, useState, useSyncExternalStore } from 'react';\nimport { ICliModule, CliPanelConfig, CliPanelPosition, ICliPanelRef } from '@qodalis/cli-core';\nimport {\n CliEngine,\n CliEngineOptions,\n CliPanelController,\n CliPanelSnapshot,\n CLOSE_GLYPH,\n CLOSE_ICON,\n HIDE_ICON,\n HIDE_TAB_TERMINAL_ICON,\n MAXIMIZE_ICON,\n PANEL_LABELS,\n panelBranding,\n RESTORE_ICON,\n SvgIcon,\n TERMINAL_ICON,\n collapseChevronIcon,\n contextMenuItems,\n contextMenuStyle,\n glowLineClass,\n handleRenameKey,\n hideTabChevronIcon,\n joinClasses,\n mergeCliOptions,\n openStatusDropdown,\n paneClass,\n paneStyle,\n panelTabClass,\n panelTabDotClass,\n panelWrapperClass,\n panelWrapperStyle,\n panesContainerClass,\n panesContainerWidth,\n positionIcon,\n positionOptions,\n resolveCliHostConfig,\n runContextMenuAction,\n statusIndicators,\n svgAttrs,\n} from '@qodalis/cli';\nimport { Cli } from './Cli';\nimport { CliContext } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\n\nexport interface CliPanelOptions extends CliEngineOptions, CliPanelConfig {}\n\nexport interface CliPanelProps {\n options?: CliPanelOptions;\n modules?: ICliModule[];\n services?: Record<string, any>;\n onClose?: () => void;\n style?: React.CSSProperties;\n className?: string;\n\n // Bindable properties (controlled mode)\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n hidden?: boolean;\n onHiddenChange?: (hidden: boolean) => void;\n maximized?: boolean;\n onMaximizedChange?: (maximized: boolean) => void;\n activeTabId?: number;\n onActiveTabIdChange?: (tabId: number) => void;\n position?: CliPanelPosition;\n onPositionChange?: (position: CliPanelPosition) => void;\n height?: number;\n onHeightChange?: (height: number) => void;\n width?: number;\n onWidthChange?: (width: number) => void;\n\n // Structural events\n onTabAdded?: (event: { tabId: number }) => void;\n onTabClosed?: (event: { tabId: number }) => void;\n onPaneSplit?: (event: { paneId: number; tabId: number }) => void;\n onPaneClosed?: (event: { paneId: number }) => void;\n}\n\n/* ─── Icons ──────────────────────────────────────────────── */\n\n/** SVG attribute names in React's camelCase spelling. */\nfunction reactSvgProps(attrs: Record<string, string>): Record<string, string> {\n const props: Record<string, string> = {};\n for (const [key, value] of Object.entries(attrs)) {\n props[key.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())] = value;\n }\n return props;\n}\n\nfunction Icon({ icon, className }: { icon: SvgIcon; className?: string }) {\n return (\n <svg className={className} {...reactSvgProps(svgAttrs(icon))}>\n {icon.shapes.map((shape, i) => React.createElement(shape.tag, { key: i, ...reactSvgProps(shape.attrs) }))}\n </svg>\n );\n}\n\n/** Focus a freshly mounted rename input and select its text. */\nconst focusAndSelect = (input: HTMLInputElement | null) => {\n if (input && document.activeElement !== input) {\n input.focus();\n input.select();\n }\n};\n\n/** React wants camelCase style keys (`colorScheme`); custom properties keep theirs. */\nconst asStyle = (style: Record<string, string>): React.CSSProperties => {\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(style)) {\n out[key.startsWith('--') ? key : key.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())] = value;\n }\n return out as React.CSSProperties;\n};\n\n/* ─── Component ──────────────────────────────────────────── */\n\nexport const CliPanel = React.forwardRef<ICliPanelRef<CliEngine>, CliPanelProps>(function CliPanel(props, ref) {\n const config = useCliConfig();\n const options = mergeCliOptions<CliPanelOptions>(props.options, config.options);\n const { modules, services } = resolveCliHostConfig(props, config);\n\n const [controller] = useState(\n () =>\n new CliPanelController({\n config: options,\n controlled: {\n collapsed: props.collapsed,\n hidden: props.hidden,\n maximized: props.maximized,\n activeTabId: props.activeTabId,\n position: props.position,\n height: props.height,\n width: props.width,\n },\n }),\n );\n const s = useSyncExternalStore(controller.subscribe, controller.getSnapshot, controller.getSnapshot);\n const brand = panelBranding(options);\n const [rootElement, setRootElement] = useState<HTMLDivElement | null>(null);\n\n // Keep the controller in sync with props before the browser paints.\n useLayoutEffect(() => {\n controller.setCallbacks({\n onCollapsedChange: props.onCollapsedChange,\n onHiddenChange: props.onHiddenChange,\n onMaximizedChange: props.onMaximizedChange,\n onActiveTabIdChange: props.onActiveTabIdChange,\n onPositionChange: props.onPositionChange,\n onHeightChange: props.onHeightChange,\n onWidthChange: props.onWidthChange,\n onClose: props.onClose,\n onTabAdded: props.onTabAdded,\n onTabClosed: props.onTabClosed,\n onPaneSplit: props.onPaneSplit,\n onPaneClosed: props.onPaneClosed,\n });\n controller.setControlled({\n collapsed: props.collapsed,\n hidden: props.hidden,\n maximized: props.maximized,\n activeTabId: props.activeTabId,\n position: props.position,\n height: props.height,\n width: props.width,\n });\n controller.setOptions(options);\n });\n\n useEffect(() => controller.setRootElement(rootElement), [controller, rootElement]);\n useEffect(() => () => controller.destroy(), [controller]);\n React.useImperativeHandle(ref, () => controller, [controller]);\n\n if (!s.visible) return null;\n\n return (\n <>\n {s.hidden && (\n <button\n className=\"cli-panel-hide-tab\"\n data-position={s.position}\n data-hide-align={s.hideAlignment}\n style={asStyle(s.themeStyles)}\n title={PANEL_LABELS.showCli}\n onClick={() => controller.unhide()}\n >\n {brand.iconUrl ? (\n <img src={brand.iconUrl} alt=\"\" className=\"cli-panel-hide-tab-icon cli-panel-brand-icon\" />\n ) : (\n <Icon icon={HIDE_TAB_TERMINAL_ICON} className=\"cli-panel-hide-tab-icon\" />\n )}\n <span className=\"cli-panel-hide-tab-label\">{brand.title}</span>\n <Icon icon={hideTabChevronIcon(s.position)} className=\"cli-panel-hide-tab-arrow\" />\n </button>\n )}\n <div\n ref={setRootElement}\n className={panelWrapperClass(s, props.className)}\n style={{ ...asStyle(panelWrapperStyle(s)), ...props.style }}\n data-position={s.position}\n data-resizable={String(s.resizable)}\n data-closable={String(s.closable)}\n data-hideable={String(s.hideable)}\n >\n <PanelHeader controller={controller} s={s} brand={brand} />\n {s.initialized && (\n <div className=\"cli-panel-content\" style={s.collapsed ? { display: 'none' } : undefined}>\n <div className=\"cli-panel-tabs\">\n <ul className=\"cli-panel-tab-list\">\n {s.tabs.map((tab) => (\n <li\n key={tab.id}\n className={panelTabClass(s, tab)}\n onClick={() => controller.selectTab(tab.id)}\n onDoubleClick={() => controller.startRename(tab.id)}\n onContextMenu={(e) => {\n e.preventDefault();\n e.stopPropagation();\n controller.openContextMenu(tab.id, e.clientX, e.clientY);\n }}\n >\n {tab.isEditing ? (\n <input\n className=\"cli-panel-tab-rename-input\"\n type=\"text\"\n defaultValue={tab.title}\n ref={focusAndSelect}\n onKeyDown={(e) => handleRenameKey(controller, tab.id, e.key, e.currentTarget.value)}\n onBlur={(e) => controller.commitRename(tab.id, e.target.value)}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n />\n ) : (\n <>\n <span className={panelTabDotClass(s, tab)} />\n <span className=\"cli-panel-tab-title\">{tab.title}</span>\n <button\n className=\"cli-panel-tab-close-btn\"\n title={PANEL_LABELS.closeTab}\n onClick={(e) => {\n e.stopPropagation();\n controller.closeTab(tab.id);\n }}\n >\n {CLOSE_GLYPH}\n </button>\n </>\n )}\n </li>\n ))}\n </ul>\n <button className=\"cli-panel-add-tab\" title={PANEL_LABELS.newTerminal} onClick={() => controller.addTab()}>\n +\n </button>\n </div>\n\n <div className=\"cli-panel-instances\">\n {s.tabs.map((tab) => (\n <div key={tab.id} className=\"cli-panel-instance\" style={{ display: tab.id === s.activeTabId ? undefined : 'none' }}>\n <div className={panesContainerClass(s)}>\n {tab.panes.map((pane, i) => (\n <React.Fragment key={pane.id}>\n {i > 0 && (\n <div\n className=\"cli-panel-pane-divider\"\n onPointerDown={(e) => {\n e.preventDefault();\n controller.startPaneResize(tab.id, i - 1, e.clientX, panesContainerWidth(e.target));\n }}\n >\n <div className=\"cli-panel-pane-divider-grip\" />\n </div>\n )}\n <div\n className={paneClass(s, tab.id, pane.id)}\n style={paneStyle(pane.widthPercent)}\n onClick={() => controller.activatePane(tab.id, pane.id)}\n >\n {tab.panes.length > 1 && (\n <button\n className=\"cli-panel-pane-close-btn\"\n title={PANEL_LABELS.closePane}\n onClick={(e) => {\n e.stopPropagation();\n controller.closePane(pane.id);\n }}\n >\n {CLOSE_GLYPH}\n </button>\n )}\n <CliContext.Provider value={{ engine: null }}>\n <Cli\n options={options}\n modules={modules}\n services={services}\n snapshot={pane.snapshot}\n onReady={(engine) => controller.registerEngine(tab.id, pane.id, engine)}\n />\n </CliContext.Provider>\n </div>\n </React.Fragment>\n ))}\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {s.contextMenu.visible && (\n <div className=\"cli-panel-context-menu\" style={asStyle(contextMenuStyle(s))} onClick={(e) => e.stopPropagation()}>\n {contextMenuItems(s).map((item) => (\n <React.Fragment key={item.action}>\n {item.separatorBefore && <div className=\"cli-panel-context-menu-separator\" />}\n <button\n className={joinClasses('cli-panel-context-menu-item', item.destructive && 'destructive')}\n disabled={item.disabled}\n onClick={() => runContextMenuAction(controller, item.action)}\n >\n {item.label}\n </button>\n </React.Fragment>\n ))}\n </div>\n )}\n\n <StatusDropdown s={s} />\n </>\n );\n});\n\n/* ─── Services / servers dropdown ────────────────────────── */\n\nfunction StatusDropdown({ s }: { s: CliPanelSnapshot }) {\n const dropdown = openStatusDropdown(s);\n if (!dropdown) return null;\n return (\n <div className=\"cli-panel-services-dropdown\" style={asStyle(dropdown.style)} onClick={(e) => e.stopPropagation()}>\n <div className=\"cli-panel-services-dropdown-header\">{dropdown.header}</div>\n <div className=\"cli-panel-services-dropdown-list\">\n {dropdown.rows.map((row) => (\n <div key={row.key} className=\"cli-panel-services-dropdown-item\">\n <span className={row.dotClass} />\n <div className=\"cli-panel-svc-info\">\n <span className=\"cli-panel-svc-name\">{row.name}</span>\n {row.description && <span className=\"cli-panel-svc-desc\">{row.description}</span>}\n </div>\n {dropdown.kind === 'servers' ? (\n <div className=\"cli-panel-srv-meta\">\n <span className=\"cli-panel-svc-status\">{row.status}</span>\n {row.meta.map((m) => (\n <span key={m} className=\"cli-panel-svc-desc\">\n {m}\n </span>\n ))}\n </div>\n ) : (\n <span className=\"cli-panel-svc-status\">{row.status}</span>\n )}\n </div>\n ))}\n </div>\n {dropdown.rows.length === 0 && <div className=\"cli-panel-services-dropdown-empty\">{dropdown.emptyText}</div>}\n </div>\n );\n}\n\n/* ─── Header ─────────────────────────────────────────────── */\n\nfunction PanelHeader({\n controller,\n s,\n brand,\n}: {\n controller: CliPanelController;\n s: CliPanelSnapshot;\n brand: ReturnType<typeof panelBranding>;\n}) {\n const indicators = statusIndicators(s);\n const openDropdown = (e: React.MouseEvent, dropdown?: 'services' | 'servers') => {\n if (!dropdown) return;\n e.stopPropagation();\n if (dropdown === 'services') controller.toggleServicesDropdown(e.currentTarget);\n else controller.toggleServersDropdown(e.currentTarget);\n };\n\n return (\n <div className=\"cli-panel-header\">\n <div\n className=\"cli-panel-resize-bar\"\n onPointerDown={(e) => {\n if (!s.resizable) return;\n e.preventDefault();\n controller.startPanelResize(e.clientX, e.clientY);\n }}\n >\n <div className=\"cli-panel-resize-grip\" />\n </div>\n <div className=\"cli-panel-header-content\">\n <p className=\"cli-panel-title\">\n <span className=\"cli-panel-title-icon\">\n {brand.iconUrl ? <img src={brand.iconUrl} alt=\"\" className=\"cli-panel-brand-icon\" /> : <Icon icon={TERMINAL_ICON} />}\n </span>\n {brand.title}\n </p>\n\n {s.showStatusIndicators && (\n <div className=\"cli-panel-status-indicators\">\n {indicators.map((item) => (\n <span\n key={item.key}\n className={joinClasses('cli-panel-status-item', item.itemClass)}\n onClick={item.dropdown ? (e) => openDropdown(e, item.dropdown) : undefined}\n >\n {item.dotClass && <span className={`cli-panel-status-dot ${item.dotClass}`} />}\n {item.icon && <span className={joinClasses('cli-panel-status-icon', item.iconClass)}>{item.icon}</span>}\n <span className=\"cli-panel-status-label\">{item.label}</span>\n </span>\n ))}\n </div>\n )}\n\n {/* Compact indicators for left/right positions (CSS controls visibility). */}\n <div className=\"cli-panel-status-indicators-compact\">\n {indicators.map((item) => (\n <span\n key={item.key}\n className={joinClasses('cli-panel-status-compact-item', item.compactClass)}\n title={item.title}\n onClick={item.dropdown ? (e) => openDropdown(e, item.dropdown) : undefined}\n >\n {item.compactDotClass && <span className={item.compactDotClass} />}\n {item.dotClass && <span className={`cli-panel-status-dot ${item.dotClass}`} />}\n {item.icon && <span className={joinClasses('cli-panel-status-icon', item.iconClass)}>{item.icon}</span>}\n </span>\n ))}\n </div>\n\n <div className=\"cli-panel-action-buttons\">\n <div className=\"cli-panel-btn-position-wrapper\" onClick={(e) => e.stopPropagation()}>\n <button className=\"cli-panel-btn cli-panel-btn-position\" title={PANEL_LABELS.movePanel} onClick={() => controller.togglePositionDropdown()}>\n <Icon icon={positionIcon(s.position)} />\n </button>\n {s.positionDropdownOpen && (\n <div className=\"cli-panel-position-dropdown\">\n {positionOptions(s).map((opt) => (\n <button key={opt.position} className={opt.className} onClick={() => controller.setPosition(opt.position)}>\n <Icon icon={positionIcon(opt.position, 16)} />\n {opt.label}\n </button>\n ))}\n </div>\n )}\n </div>\n {s.hideable && (\n <button className=\"cli-panel-btn cli-panel-btn-hide\" title={PANEL_LABELS.hide} onClick={() => controller.hide()}>\n <Icon icon={HIDE_ICON} />\n </button>\n )}\n <button\n className=\"cli-panel-btn\"\n title={s.maximized ? PANEL_LABELS.restore : PANEL_LABELS.maximize}\n disabled={s.collapsed}\n onClick={() => controller.toggleMaximize()}\n >\n <Icon icon={s.maximized ? RESTORE_ICON : MAXIMIZE_ICON} />\n </button>\n <button className=\"cli-panel-btn\" title={s.collapsed ? PANEL_LABELS.expand : PANEL_LABELS.collapse} onClick={() => controller.toggle()}>\n <Icon icon={collapseChevronIcon(s.position, s.collapsed)} />\n </button>\n {s.closable && (\n <button className=\"cli-panel-btn cli-panel-btn-close\" title={PANEL_LABELS.close} onClick={() => controller.close()}>\n <Icon icon={CLOSE_ICON} />\n </button>\n )}\n </div>\n </div>\n <div className={glowLineClass(s)} />\n </div>\n );\n}\n","import React, { useRef } from 'react';\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliEngineOptions, resolveCliHostConfig } from '@qodalis/cli';\nimport { CliContext } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\nimport { useCliEngine } from './useCliEngine';\n\nexport interface CliProviderProps {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n children: React.ReactNode;\n style?: React.CSSProperties;\n}\n\nexport function CliProvider({\n modules,\n options,\n services,\n children,\n style,\n}: CliProviderProps): React.JSX.Element {\n const config = useCliConfig();\n const containerRef = useRef<HTMLDivElement>(null);\n const engine = useCliEngine(containerRef, resolveCliHostConfig({ modules, options, services }, config));\n\n return (\n <CliContext.Provider value={{ engine }}>\n <div ref={containerRef} style={{ height: '100%', ...style }} />\n {children}\n </CliContext.Provider>\n );\n}\n"],"mappings":"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","names":["import_react","import_cli","import_react","import_react","import_jsx_runtime","import_react","import_cli","import_jsx_runtime","React","CliPanel","import_react","import_cli","import_jsx_runtime","import_cli"]}
1
+ {"version":3,"sources":["../src/index.tsx","../src/Cli.tsx","../src/CliContext.tsx","../src/CliConfigContext.tsx","../src/useCliEngine.ts","../src/CliPanel.tsx","../src/CliProvider.tsx"],"sourcesContent":["export { Cli } from './Cli';\nexport type { CliProps } from './Cli';\nexport { CliPanel } from './CliPanel';\nexport type { CliPanelProps, CliPanelOptions } from './CliPanel';\nexport { CliProvider } from './CliProvider';\nexport type { CliProviderProps } from './CliProvider';\nexport { useCli, CliContext } from './CliContext';\nexport type { CliContextValue } from './CliContext';\nexport { CliConfigProvider, useCliConfig } from './CliConfigContext';\nexport type { CliConfigValue, CliConfigProviderProps } from './CliConfigContext';\nexport { useCliEngine } from './useCliEngine';\nexport type { UseCliEngineConfig } from './useCliEngine';\n\n// Re-export commonly used types from @qodalis/cli for convenience\nexport type { CliEngineOptions } from '@qodalis/cli';\nexport { CliEngine } from '@qodalis/cli';\n","import React, { useRef, useEffect } from 'react';\nimport { ICliModule, CliEngineSnapshot } from '@qodalis/cli-core';\nimport { CliEngine, CliEngineOptions, resolveCliHostConfig } from '@qodalis/cli';\nimport { useCli } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\nimport { useCliEngine } from './useCliEngine';\n\nexport interface CliProps {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n snapshot?: CliEngineSnapshot;\n onReady?: (engine: CliEngine) => void;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport function Cli({\n modules,\n options,\n services,\n snapshot,\n onReady,\n style,\n className,\n}: CliProps): React.JSX.Element {\n const ctx = useCli();\n const config = useCliConfig();\n const containerRef = useRef<HTMLDivElement>(null);\n const hasProvider = !!ctx.engine;\n\n // Always call the hook (React rules), but disable it when inside a CliProvider.\n const standaloneEngine = useCliEngine(containerRef, {\n ...resolveCliHostConfig({ modules, options, services }, config),\n snapshot,\n disabled: hasProvider,\n });\n\n const engine = ctx.engine ?? standaloneEngine;\n\n useEffect(() => {\n if (engine && onReady) {\n onReady(engine);\n }\n }, [engine, onReady]);\n\n // If inside a CliProvider, render nothing (provider has the terminal div).\n if (hasProvider) {\n return <></>;\n }\n\n return (\n <div\n ref={containerRef}\n style={{ height: '100%', ...style }}\n className={className}\n />\n );\n}\n","import { createContext, useContext } from 'react';\nimport { CliEngine } from '@qodalis/cli';\n\nexport interface CliContextValue {\n engine: CliEngine | null;\n}\n\nexport const CliContext = createContext<CliContextValue>({ engine: null });\n\nexport function useCli(): CliContextValue {\n return useContext(CliContext);\n}\n","import React, { createContext, useContext } from 'react';\nimport { ICliModule, CliOptions } from '@qodalis/cli-core';\nimport { CliEngineOptions } from '@qodalis/cli';\n\nexport interface CliConfigValue {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n}\n\nconst CliConfigCtx = createContext<CliConfigValue>({});\n\nexport function useCliConfig(): CliConfigValue {\n return useContext(CliConfigCtx);\n}\n\nexport interface CliConfigProviderProps extends CliConfigValue {\n children: React.ReactNode;\n}\n\nexport function CliConfigProvider({\n modules,\n options,\n services,\n children,\n}: CliConfigProviderProps): React.JSX.Element {\n return (\n <CliConfigCtx.Provider value={{ modules, options, services }}>\n {children}\n </CliConfigCtx.Provider>\n );\n}\n","import { useRef, useEffect, useState, RefObject } from 'react';\nimport { CliEngine, CreateCliEngineConfig, createCliEngine } from '@qodalis/cli';\n\nexport interface UseCliEngineConfig extends Omit<CreateCliEngineConfig, 'framework'> {\n disabled?: boolean;\n}\n\nexport function useCliEngine(\n containerRef: RefObject<HTMLElement | null>,\n config?: UseCliEngineConfig,\n): CliEngine | null {\n const [engine, setEngine] = useState<CliEngine | null>(null);\n const engineRef = useRef<CliEngine | null>(null);\n const initTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (config?.disabled || !containerRef.current) return;\n\n // Defer initialization slightly so that StrictMode's immediate\n // unmount (mount → unmount → remount) cancels the first attempt\n // via the cleanup function, while non-StrictMode proceeds normally.\n const container = containerRef.current;\n initTimerRef.current = setTimeout(() => {\n initTimerRef.current = null;\n if (!container) return;\n\n const e = createCliEngine(container, { ...config, framework: 'React' });\n\n engineRef.current = e;\n e.start().then(() => setEngine(e));\n }, 0);\n\n return () => {\n if (initTimerRef.current !== null) {\n clearTimeout(initTimerRef.current);\n initTimerRef.current = null;\n return;\n }\n if (engineRef.current) {\n engineRef.current.destroy();\n engineRef.current = null;\n setEngine(null);\n }\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return engine;\n}\n","import React, { useEffect, useLayoutEffect, useState, useSyncExternalStore } from 'react';\nimport { ICliModule, CliPanelConfig, CliPanelPosition, ICliPanelRef } from '@qodalis/cli-core';\nimport {\n CliEngine,\n CliEngineOptions,\n CliPanelController,\n CliPanelSnapshot,\n CLOSE_GLYPH,\n CLOSE_ICON,\n HIDE_ICON,\n HIDE_TAB_TERMINAL_ICON,\n MAXIMIZE_ICON,\n PANEL_LABELS,\n panelBranding,\n RESTORE_ICON,\n SvgIcon,\n TERMINAL_ICON,\n collapseChevronIcon,\n contextMenuItems,\n contextMenuStyle,\n glowLineClass,\n handleRenameKey,\n hideTabChevronIcon,\n joinClasses,\n mergeCliOptions,\n openStatusDropdown,\n paneClass,\n paneStyle,\n panelTabClass,\n panelTabDotClass,\n panelWrapperClass,\n panelWrapperStyle,\n panesContainerClass,\n panesContainerWidth,\n positionIcon,\n positionOptions,\n resolveCliHostConfig,\n runContextMenuAction,\n statusIndicators,\n svgAttrs,\n PanelStatusIndicator,\n} from '@qodalis/cli';\nimport { Cli } from './Cli';\nimport { CliContext } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\n\nexport interface CliPanelOptions extends CliEngineOptions, CliPanelConfig {}\n\nexport interface CliPanelProps {\n options?: CliPanelOptions;\n modules?: ICliModule[];\n services?: Record<string, any>;\n onClose?: () => void;\n style?: React.CSSProperties;\n className?: string;\n\n // Bindable properties (controlled mode)\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n hidden?: boolean;\n onHiddenChange?: (hidden: boolean) => void;\n maximized?: boolean;\n onMaximizedChange?: (maximized: boolean) => void;\n activeTabId?: number;\n onActiveTabIdChange?: (tabId: number) => void;\n position?: CliPanelPosition;\n onPositionChange?: (position: CliPanelPosition) => void;\n height?: number;\n onHeightChange?: (height: number) => void;\n width?: number;\n onWidthChange?: (width: number) => void;\n\n // Structural events\n onTabAdded?: (event: { tabId: number }) => void;\n onTabClosed?: (event: { tabId: number }) => void;\n onPaneSplit?: (event: { paneId: number; tabId: number }) => void;\n onPaneClosed?: (event: { paneId: number }) => void;\n}\n\n/* ─── Icons ──────────────────────────────────────────────── */\n\n/** SVG attribute names in React's camelCase spelling. */\nfunction reactSvgProps(attrs: Record<string, string>): Record<string, string> {\n const props: Record<string, string> = {};\n for (const [key, value] of Object.entries(attrs)) {\n props[key.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())] = value;\n }\n return props;\n}\n\nfunction Icon({ icon, className }: { icon: SvgIcon; className?: string }) {\n return (\n <svg className={className} {...reactSvgProps(svgAttrs(icon))}>\n {icon.shapes.map((shape, i) => React.createElement(shape.tag, { key: i, ...reactSvgProps(shape.attrs) }))}\n </svg>\n );\n}\n\n/** Focus a freshly mounted rename input and select its text. */\nconst focusAndSelect = (input: HTMLInputElement | null) => {\n if (input && document.activeElement !== input) {\n input.focus();\n input.select();\n }\n};\n\n/** React wants camelCase style keys (`colorScheme`); custom properties keep theirs. */\nconst asStyle = (style: Record<string, string>): React.CSSProperties => {\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(style)) {\n out[key.startsWith('--') ? key : key.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())] = value;\n }\n return out as React.CSSProperties;\n};\n\n/* ─── Component ──────────────────────────────────────────── */\n\nexport const CliPanel = React.forwardRef<ICliPanelRef<CliEngine>, CliPanelProps>(function CliPanel(props, ref) {\n const config = useCliConfig();\n const options = mergeCliOptions<CliPanelOptions>(props.options, config.options);\n const { modules, services } = resolveCliHostConfig(props, config);\n\n const [controller] = useState(\n () =>\n new CliPanelController({\n config: options,\n controlled: {\n collapsed: props.collapsed,\n hidden: props.hidden,\n maximized: props.maximized,\n activeTabId: props.activeTabId,\n position: props.position,\n height: props.height,\n width: props.width,\n },\n }),\n );\n const s = useSyncExternalStore(controller.subscribe, controller.getSnapshot, controller.getSnapshot);\n const brand = panelBranding(options);\n const [rootElement, setRootElement] = useState<HTMLDivElement | null>(null);\n\n // Keep the controller in sync with props before the browser paints.\n useLayoutEffect(() => {\n controller.setCallbacks({\n onCollapsedChange: props.onCollapsedChange,\n onHiddenChange: props.onHiddenChange,\n onMaximizedChange: props.onMaximizedChange,\n onActiveTabIdChange: props.onActiveTabIdChange,\n onPositionChange: props.onPositionChange,\n onHeightChange: props.onHeightChange,\n onWidthChange: props.onWidthChange,\n onClose: props.onClose,\n onTabAdded: props.onTabAdded,\n onTabClosed: props.onTabClosed,\n onPaneSplit: props.onPaneSplit,\n onPaneClosed: props.onPaneClosed,\n });\n controller.setControlled({\n collapsed: props.collapsed,\n hidden: props.hidden,\n maximized: props.maximized,\n activeTabId: props.activeTabId,\n position: props.position,\n height: props.height,\n width: props.width,\n });\n controller.setOptions(options);\n });\n\n useEffect(() => controller.setRootElement(rootElement), [controller, rootElement]);\n useEffect(() => () => controller.destroy(), [controller]);\n React.useImperativeHandle(ref, () => controller, [controller]);\n\n if (!s.visible) return null;\n\n return (\n <>\n {s.hidden && (\n <button\n className=\"cli-panel-hide-tab\"\n data-position={s.position}\n data-hide-align={s.hideAlignment}\n style={asStyle(s.themeStyles)}\n title={PANEL_LABELS.showCli}\n onClick={() => controller.unhide()}\n >\n {brand.iconUrl ? (\n <img src={brand.iconUrl} alt=\"\" className=\"cli-panel-hide-tab-icon cli-panel-brand-icon\" />\n ) : (\n <Icon icon={HIDE_TAB_TERMINAL_ICON} className=\"cli-panel-hide-tab-icon\" />\n )}\n <span className=\"cli-panel-hide-tab-label\">{brand.title}</span>\n <Icon icon={hideTabChevronIcon(s.position)} className=\"cli-panel-hide-tab-arrow\" />\n </button>\n )}\n <div\n ref={setRootElement}\n className={panelWrapperClass(s, props.className)}\n style={{ ...asStyle(panelWrapperStyle(s)), ...props.style }}\n data-position={s.position}\n data-resizable={String(s.resizable)}\n data-closable={String(s.closable)}\n data-hideable={String(s.hideable)}\n >\n <PanelHeader controller={controller} s={s} brand={brand} />\n {s.initialized && (\n <div className=\"cli-panel-content\" style={s.collapsed ? { display: 'none' } : undefined}>\n <div className=\"cli-panel-tabs\">\n <ul className=\"cli-panel-tab-list\">\n {s.tabs.map((tab) => (\n <li\n key={tab.id}\n className={panelTabClass(s, tab)}\n onClick={() => controller.selectTab(tab.id)}\n onDoubleClick={() => controller.startRename(tab.id)}\n onContextMenu={(e) => {\n e.preventDefault();\n e.stopPropagation();\n controller.openContextMenu(tab.id, e.clientX, e.clientY);\n }}\n >\n {tab.isEditing ? (\n <input\n className=\"cli-panel-tab-rename-input\"\n type=\"text\"\n defaultValue={tab.title}\n ref={focusAndSelect}\n onKeyDown={(e) => handleRenameKey(controller, tab.id, e.key, e.currentTarget.value)}\n onBlur={(e) => controller.commitRename(tab.id, e.target.value)}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n />\n ) : (\n <>\n <span className={panelTabDotClass(s, tab)} />\n <span className=\"cli-panel-tab-title\">{tab.title}</span>\n <button\n className=\"cli-panel-tab-close-btn\"\n title={PANEL_LABELS.closeTab}\n onClick={(e) => {\n e.stopPropagation();\n controller.closeTab(tab.id);\n }}\n >\n {CLOSE_GLYPH}\n </button>\n </>\n )}\n </li>\n ))}\n </ul>\n <button className=\"cli-panel-add-tab\" title={PANEL_LABELS.newTerminal} onClick={() => controller.addTab()}>\n +\n </button>\n </div>\n\n <div className=\"cli-panel-instances\">\n {s.tabs.map((tab) => (\n <div key={tab.id} className=\"cli-panel-instance\" style={{ display: tab.id === s.activeTabId ? undefined : 'none' }}>\n <div className={panesContainerClass(s)}>\n {tab.panes.map((pane, i) => (\n <React.Fragment key={pane.id}>\n {i > 0 && (\n <div\n className=\"cli-panel-pane-divider\"\n onPointerDown={(e) => {\n e.preventDefault();\n controller.startPaneResize(tab.id, i - 1, e.clientX, panesContainerWidth(e.target));\n }}\n >\n <div className=\"cli-panel-pane-divider-grip\" />\n </div>\n )}\n <div\n className={paneClass(s, tab.id, pane.id)}\n style={paneStyle(pane.widthPercent)}\n onClick={() => controller.activatePane(tab.id, pane.id)}\n >\n {tab.panes.length > 1 && (\n <button\n className=\"cli-panel-pane-close-btn\"\n title={PANEL_LABELS.closePane}\n onClick={(e) => {\n e.stopPropagation();\n controller.closePane(pane.id);\n }}\n >\n {CLOSE_GLYPH}\n </button>\n )}\n <CliContext.Provider value={{ engine: null }}>\n <Cli\n options={options}\n modules={modules}\n services={services}\n snapshot={pane.snapshot}\n onReady={(engine) => controller.registerEngine(tab.id, pane.id, engine)}\n />\n </CliContext.Provider>\n </div>\n </React.Fragment>\n ))}\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {s.contextMenu.visible && (\n <div className=\"cli-panel-context-menu\" style={asStyle(contextMenuStyle(s))} onClick={(e) => e.stopPropagation()}>\n {contextMenuItems(s).map((item) => (\n <React.Fragment key={item.action}>\n {item.separatorBefore && <div className=\"cli-panel-context-menu-separator\" />}\n <button\n className={joinClasses('cli-panel-context-menu-item', item.destructive && 'destructive')}\n disabled={item.disabled}\n onClick={() => runContextMenuAction(controller, item.action)}\n >\n {item.label}\n </button>\n </React.Fragment>\n ))}\n </div>\n )}\n\n <StatusDropdown s={s} />\n </>\n );\n});\n\n/* ─── Services / servers dropdown ────────────────────────── */\n\nfunction StatusDropdown({ s }: { s: CliPanelSnapshot }) {\n const dropdown = openStatusDropdown(s);\n if (!dropdown) return null;\n return (\n <div className=\"cli-panel-services-dropdown\" style={asStyle(dropdown.style)} onClick={(e) => e.stopPropagation()}>\n <div className=\"cli-panel-services-dropdown-header\">{dropdown.header}</div>\n <div className=\"cli-panel-services-dropdown-list\">\n {dropdown.rows.map((row) => (\n <div key={row.key} className=\"cli-panel-services-dropdown-item\">\n <span className={row.dotClass} />\n <div className=\"cli-panel-svc-info\">\n <span className=\"cli-panel-svc-name\">{row.name}</span>\n {row.description && <span className=\"cli-panel-svc-desc\">{row.description}</span>}\n </div>\n {dropdown.kind === 'servers' ? (\n <div className=\"cli-panel-srv-meta\">\n <span className=\"cli-panel-svc-status\">{row.status}</span>\n {row.meta.map((m) => (\n <span key={m} className=\"cli-panel-svc-desc\">\n {m}\n </span>\n ))}\n </div>\n ) : (\n <>\n <span className=\"cli-panel-svc-status\">{row.status}</span>\n {row.stop && (\n <button\n type=\"button\"\n className=\"cli-panel-svc-stop\"\n title={row.stop.title}\n onClick={() => controller.killProcess(row.stop!.pid)}\n >\n {row.stop.label}\n </button>\n )}\n </>\n )}\n </div>\n ))}\n </div>\n {dropdown.rows.length === 0 && <div className=\"cli-panel-services-dropdown-empty\">{dropdown.emptyText}</div>}\n </div>\n );\n}\n\n/* ─── Header ─────────────────────────────────────────────── */\n\nfunction PanelHeader({\n controller,\n s,\n brand,\n}: {\n controller: CliPanelController;\n s: CliPanelSnapshot;\n brand: ReturnType<typeof panelBranding>;\n}) {\n const indicators = statusIndicators(s);\n const onIndicatorClick = (e: React.MouseEvent, item: PanelStatusIndicator) => {\n if (item.stop) {\n // The compact item (side positions) has no room for the button\n e.stopPropagation();\n controller.stopCommand();\n return;\n }\n openDropdown(e, item.dropdown);\n };\n const openDropdown = (e: React.MouseEvent, dropdown?: 'services' | 'servers') => {\n if (!dropdown) return;\n e.stopPropagation();\n if (dropdown === 'services') controller.toggleServicesDropdown(e.currentTarget);\n else controller.toggleServersDropdown(e.currentTarget);\n };\n\n return (\n <div className=\"cli-panel-header\">\n <div\n className=\"cli-panel-resize-bar\"\n onPointerDown={(e) => {\n if (!s.resizable) return;\n e.preventDefault();\n controller.startPanelResize(e.clientX, e.clientY);\n }}\n >\n <div className=\"cli-panel-resize-grip\" />\n </div>\n <div className=\"cli-panel-header-content\">\n <p className=\"cli-panel-title\">\n <span className=\"cli-panel-title-icon\">\n {brand.iconUrl ? <img src={brand.iconUrl} alt=\"\" className=\"cli-panel-brand-icon\" /> : <Icon icon={TERMINAL_ICON} />}\n </span>\n {brand.title}\n </p>\n\n {s.showStatusIndicators && (\n <div className=\"cli-panel-status-indicators\">\n {indicators.map((item) => (\n <span\n key={item.key}\n className={joinClasses('cli-panel-status-item', item.itemClass)}\n onClick={item.dropdown ? (e) => openDropdown(e, item.dropdown) : undefined}\n >\n {item.dotClass && <span className={`cli-panel-status-dot ${item.dotClass}`} />}\n {item.icon && <span className={joinClasses('cli-panel-status-icon', item.iconClass)}>{item.icon}</span>}\n <span className=\"cli-panel-status-label\">{item.label}</span>\n {item.stop && (\n <button\n type=\"button\"\n className=\"cli-panel-status-stop\"\n title={item.stop.title}\n onClick={(e) => {\n e.stopPropagation();\n controller.stopCommand();\n }}\n >\n {item.stop.label}\n </button>\n )}\n </span>\n ))}\n </div>\n )}\n\n {/* Compact indicators for left/right positions (CSS controls visibility). */}\n <div className=\"cli-panel-status-indicators-compact\">\n {indicators.map((item) => (\n <span\n key={item.key}\n className={joinClasses('cli-panel-status-compact-item', item.compactClass)}\n title={item.title}\n onClick={item.dropdown || item.stop ? (e) => onIndicatorClick(e, item) : undefined}\n >\n {item.compactDotClass && <span className={item.compactDotClass} />}\n {item.dotClass && <span className={`cli-panel-status-dot ${item.dotClass}`} />}\n {item.icon && <span className={joinClasses('cli-panel-status-icon', item.iconClass)}>{item.icon}</span>}\n </span>\n ))}\n </div>\n\n <div className=\"cli-panel-action-buttons\">\n <div className=\"cli-panel-btn-position-wrapper\" onClick={(e) => e.stopPropagation()}>\n <button className=\"cli-panel-btn cli-panel-btn-position\" title={PANEL_LABELS.movePanel} onClick={() => controller.togglePositionDropdown()}>\n <Icon icon={positionIcon(s.position)} />\n </button>\n {s.positionDropdownOpen && (\n <div className=\"cli-panel-position-dropdown\">\n {positionOptions(s).map((opt) => (\n <button key={opt.position} className={opt.className} onClick={() => controller.setPosition(opt.position)}>\n <Icon icon={positionIcon(opt.position, 16)} />\n {opt.label}\n </button>\n ))}\n </div>\n )}\n </div>\n {s.hideable && (\n <button className=\"cli-panel-btn cli-panel-btn-hide\" title={PANEL_LABELS.hide} onClick={() => controller.hide()}>\n <Icon icon={HIDE_ICON} />\n </button>\n )}\n <button\n className=\"cli-panel-btn\"\n title={s.maximized ? PANEL_LABELS.restore : PANEL_LABELS.maximize}\n disabled={s.collapsed}\n onClick={() => controller.toggleMaximize()}\n >\n <Icon icon={s.maximized ? RESTORE_ICON : MAXIMIZE_ICON} />\n </button>\n <button className=\"cli-panel-btn\" title={s.collapsed ? PANEL_LABELS.expand : PANEL_LABELS.collapse} onClick={() => controller.toggle()}>\n <Icon icon={collapseChevronIcon(s.position, s.collapsed)} />\n </button>\n {s.closable && (\n <button className=\"cli-panel-btn cli-panel-btn-close\" title={PANEL_LABELS.close} onClick={() => controller.close()}>\n <Icon icon={CLOSE_ICON} />\n </button>\n )}\n </div>\n </div>\n <div className={glowLineClass(s)} />\n </div>\n );\n}\n","import React, { useRef } from 'react';\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliEngineOptions, resolveCliHostConfig } from '@qodalis/cli';\nimport { CliContext } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\nimport { useCliEngine } from './useCliEngine';\n\nexport interface CliProviderProps {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n children: React.ReactNode;\n style?: React.CSSProperties;\n}\n\nexport function CliProvider({\n modules,\n options,\n services,\n children,\n style,\n}: CliProviderProps): React.JSX.Element {\n const config = useCliConfig();\n const containerRef = useRef<HTMLDivElement>(null);\n const engine = useCliEngine(containerRef, resolveCliHostConfig({ modules, options, services }, config));\n\n return (\n <CliContext.Provider value={{ engine }}>\n <div ref={containerRef} style={{ height: '100%', ...style }} />\n {children}\n </CliContext.Provider>\n );\n}\n"],"mappings":"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","names":["import_react","import_cli","import_react","import_react","import_jsx_runtime","import_react","import_cli","import_jsx_runtime","React","CliPanel","controller","import_react","import_cli","import_jsx_runtime","import_cli"]}
package/dist/index.mjs CHANGED
@@ -162,7 +162,7 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
162
162
  const config = useCliConfig();
163
163
  const options = mergeCliOptions(props.options, config.options);
164
164
  const { modules, services } = resolveCliHostConfig2(props, config);
165
- const [controller] = useState2(
165
+ const [controller2] = useState2(
166
166
  () => new CliPanelController({
167
167
  config: options,
168
168
  controlled: {
@@ -176,11 +176,11 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
176
176
  }
177
177
  })
178
178
  );
179
- const s = useSyncExternalStore(controller.subscribe, controller.getSnapshot, controller.getSnapshot);
179
+ const s = useSyncExternalStore(controller2.subscribe, controller2.getSnapshot, controller2.getSnapshot);
180
180
  const brand = panelBranding(options);
181
181
  const [rootElement, setRootElement] = useState2(null);
182
182
  useLayoutEffect(() => {
183
- controller.setCallbacks({
183
+ controller2.setCallbacks({
184
184
  onCollapsedChange: props.onCollapsedChange,
185
185
  onHiddenChange: props.onHiddenChange,
186
186
  onMaximizedChange: props.onMaximizedChange,
@@ -194,7 +194,7 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
194
194
  onPaneSplit: props.onPaneSplit,
195
195
  onPaneClosed: props.onPaneClosed
196
196
  });
197
- controller.setControlled({
197
+ controller2.setControlled({
198
198
  collapsed: props.collapsed,
199
199
  hidden: props.hidden,
200
200
  maximized: props.maximized,
@@ -203,11 +203,11 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
203
203
  height: props.height,
204
204
  width: props.width
205
205
  });
206
- controller.setOptions(options);
206
+ controller2.setOptions(options);
207
207
  });
208
- useEffect3(() => controller.setRootElement(rootElement), [controller, rootElement]);
209
- useEffect3(() => () => controller.destroy(), [controller]);
210
- React3.useImperativeHandle(ref, () => controller, [controller]);
208
+ useEffect3(() => controller2.setRootElement(rootElement), [controller2, rootElement]);
209
+ useEffect3(() => () => controller2.destroy(), [controller2]);
210
+ React3.useImperativeHandle(ref, () => controller2, [controller2]);
211
211
  if (!s.visible) return null;
212
212
  return /* @__PURE__ */ jsxs(Fragment2, { children: [
213
213
  s.hidden && /* @__PURE__ */ jsxs(
@@ -218,7 +218,7 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
218
218
  "data-hide-align": s.hideAlignment,
219
219
  style: asStyle(s.themeStyles),
220
220
  title: PANEL_LABELS.showCli,
221
- onClick: () => controller.unhide(),
221
+ onClick: () => controller2.unhide(),
222
222
  children: [
223
223
  brand.iconUrl ? /* @__PURE__ */ jsx3("img", { src: brand.iconUrl, alt: "", className: "cli-panel-hide-tab-icon cli-panel-brand-icon" }) : /* @__PURE__ */ jsx3(Icon, { icon: HIDE_TAB_TERMINAL_ICON, className: "cli-panel-hide-tab-icon" }),
224
224
  /* @__PURE__ */ jsx3("span", { className: "cli-panel-hide-tab-label", children: brand.title }),
@@ -237,19 +237,19 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
237
237
  "data-closable": String(s.closable),
238
238
  "data-hideable": String(s.hideable),
239
239
  children: [
240
- /* @__PURE__ */ jsx3(PanelHeader, { controller, s, brand }),
240
+ /* @__PURE__ */ jsx3(PanelHeader, { controller: controller2, s, brand }),
241
241
  s.initialized && /* @__PURE__ */ jsxs("div", { className: "cli-panel-content", style: s.collapsed ? { display: "none" } : void 0, children: [
242
242
  /* @__PURE__ */ jsxs("div", { className: "cli-panel-tabs", children: [
243
243
  /* @__PURE__ */ jsx3("ul", { className: "cli-panel-tab-list", children: s.tabs.map((tab) => /* @__PURE__ */ jsx3(
244
244
  "li",
245
245
  {
246
246
  className: panelTabClass(s, tab),
247
- onClick: () => controller.selectTab(tab.id),
248
- onDoubleClick: () => controller.startRename(tab.id),
247
+ onClick: () => controller2.selectTab(tab.id),
248
+ onDoubleClick: () => controller2.startRename(tab.id),
249
249
  onContextMenu: (e) => {
250
250
  e.preventDefault();
251
251
  e.stopPropagation();
252
- controller.openContextMenu(tab.id, e.clientX, e.clientY);
252
+ controller2.openContextMenu(tab.id, e.clientX, e.clientY);
253
253
  },
254
254
  children: tab.isEditing ? /* @__PURE__ */ jsx3(
255
255
  "input",
@@ -258,8 +258,8 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
258
258
  type: "text",
259
259
  defaultValue: tab.title,
260
260
  ref: focusAndSelect,
261
- onKeyDown: (e) => handleRenameKey(controller, tab.id, e.key, e.currentTarget.value),
262
- onBlur: (e) => controller.commitRename(tab.id, e.target.value),
261
+ onKeyDown: (e) => handleRenameKey(controller2, tab.id, e.key, e.currentTarget.value),
262
+ onBlur: (e) => controller2.commitRename(tab.id, e.target.value),
263
263
  onClick: (e) => e.stopPropagation(),
264
264
  onDoubleClick: (e) => e.stopPropagation()
265
265
  }
@@ -273,7 +273,7 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
273
273
  title: PANEL_LABELS.closeTab,
274
274
  onClick: (e) => {
275
275
  e.stopPropagation();
276
- controller.closeTab(tab.id);
276
+ controller2.closeTab(tab.id);
277
277
  },
278
278
  children: CLOSE_GLYPH
279
279
  }
@@ -282,7 +282,7 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
282
282
  },
283
283
  tab.id
284
284
  )) }),
285
- /* @__PURE__ */ jsx3("button", { className: "cli-panel-add-tab", title: PANEL_LABELS.newTerminal, onClick: () => controller.addTab(), children: "+" })
285
+ /* @__PURE__ */ jsx3("button", { className: "cli-panel-add-tab", title: PANEL_LABELS.newTerminal, onClick: () => controller2.addTab(), children: "+" })
286
286
  ] }),
287
287
  /* @__PURE__ */ jsx3("div", { className: "cli-panel-instances", children: s.tabs.map((tab) => /* @__PURE__ */ jsx3("div", { className: "cli-panel-instance", style: { display: tab.id === s.activeTabId ? void 0 : "none" }, children: /* @__PURE__ */ jsx3("div", { className: panesContainerClass(s), children: tab.panes.map((pane, i) => /* @__PURE__ */ jsxs(React3.Fragment, { children: [
288
288
  i > 0 && /* @__PURE__ */ jsx3(
@@ -291,7 +291,7 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
291
291
  className: "cli-panel-pane-divider",
292
292
  onPointerDown: (e) => {
293
293
  e.preventDefault();
294
- controller.startPaneResize(tab.id, i - 1, e.clientX, panesContainerWidth(e.target));
294
+ controller2.startPaneResize(tab.id, i - 1, e.clientX, panesContainerWidth(e.target));
295
295
  },
296
296
  children: /* @__PURE__ */ jsx3("div", { className: "cli-panel-pane-divider-grip" })
297
297
  }
@@ -301,7 +301,7 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
301
301
  {
302
302
  className: paneClass(s, tab.id, pane.id),
303
303
  style: paneStyle(pane.widthPercent),
304
- onClick: () => controller.activatePane(tab.id, pane.id),
304
+ onClick: () => controller2.activatePane(tab.id, pane.id),
305
305
  children: [
306
306
  tab.panes.length > 1 && /* @__PURE__ */ jsx3(
307
307
  "button",
@@ -310,7 +310,7 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
310
310
  title: PANEL_LABELS.closePane,
311
311
  onClick: (e) => {
312
312
  e.stopPropagation();
313
- controller.closePane(pane.id);
313
+ controller2.closePane(pane.id);
314
314
  },
315
315
  children: CLOSE_GLYPH
316
316
  }
@@ -322,7 +322,7 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
322
322
  modules,
323
323
  services,
324
324
  snapshot: pane.snapshot,
325
- onReady: (engine) => controller.registerEngine(tab.id, pane.id, engine)
325
+ onReady: (engine) => controller2.registerEngine(tab.id, pane.id, engine)
326
326
  }
327
327
  ) })
328
328
  ]
@@ -340,7 +340,7 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
340
340
  {
341
341
  className: joinClasses("cli-panel-context-menu-item", item.destructive && "destructive"),
342
342
  disabled: item.disabled,
343
- onClick: () => runContextMenuAction(controller, item.action),
343
+ onClick: () => runContextMenuAction(controller2, item.action),
344
344
  children: item.label
345
345
  }
346
346
  )
@@ -362,22 +362,42 @@ function StatusDropdown({ s }) {
362
362
  dropdown.kind === "servers" ? /* @__PURE__ */ jsxs("div", { className: "cli-panel-srv-meta", children: [
363
363
  /* @__PURE__ */ jsx3("span", { className: "cli-panel-svc-status", children: row.status }),
364
364
  row.meta.map((m) => /* @__PURE__ */ jsx3("span", { className: "cli-panel-svc-desc", children: m }, m))
365
- ] }) : /* @__PURE__ */ jsx3("span", { className: "cli-panel-svc-status", children: row.status })
365
+ ] }) : /* @__PURE__ */ jsxs(Fragment2, { children: [
366
+ /* @__PURE__ */ jsx3("span", { className: "cli-panel-svc-status", children: row.status }),
367
+ row.stop && /* @__PURE__ */ jsx3(
368
+ "button",
369
+ {
370
+ type: "button",
371
+ className: "cli-panel-svc-stop",
372
+ title: row.stop.title,
373
+ onClick: () => controller.killProcess(row.stop.pid),
374
+ children: row.stop.label
375
+ }
376
+ )
377
+ ] })
366
378
  ] }, row.key)) }),
367
379
  dropdown.rows.length === 0 && /* @__PURE__ */ jsx3("div", { className: "cli-panel-services-dropdown-empty", children: dropdown.emptyText })
368
380
  ] });
369
381
  }
370
382
  function PanelHeader({
371
- controller,
383
+ controller: controller2,
372
384
  s,
373
385
  brand
374
386
  }) {
375
387
  const indicators = statusIndicators(s);
388
+ const onIndicatorClick = (e, item) => {
389
+ if (item.stop) {
390
+ e.stopPropagation();
391
+ controller2.stopCommand();
392
+ return;
393
+ }
394
+ openDropdown(e, item.dropdown);
395
+ };
376
396
  const openDropdown = (e, dropdown) => {
377
397
  if (!dropdown) return;
378
398
  e.stopPropagation();
379
- if (dropdown === "services") controller.toggleServicesDropdown(e.currentTarget);
380
- else controller.toggleServersDropdown(e.currentTarget);
399
+ if (dropdown === "services") controller2.toggleServicesDropdown(e.currentTarget);
400
+ else controller2.toggleServersDropdown(e.currentTarget);
381
401
  };
382
402
  return /* @__PURE__ */ jsxs("div", { className: "cli-panel-header", children: [
383
403
  /* @__PURE__ */ jsx3(
@@ -387,7 +407,7 @@ function PanelHeader({
387
407
  onPointerDown: (e) => {
388
408
  if (!s.resizable) return;
389
409
  e.preventDefault();
390
- controller.startPanelResize(e.clientX, e.clientY);
410
+ controller2.startPanelResize(e.clientX, e.clientY);
391
411
  },
392
412
  children: /* @__PURE__ */ jsx3("div", { className: "cli-panel-resize-grip" })
393
413
  }
@@ -405,7 +425,20 @@ function PanelHeader({
405
425
  children: [
406
426
  item.dotClass && /* @__PURE__ */ jsx3("span", { className: `cli-panel-status-dot ${item.dotClass}` }),
407
427
  item.icon && /* @__PURE__ */ jsx3("span", { className: joinClasses("cli-panel-status-icon", item.iconClass), children: item.icon }),
408
- /* @__PURE__ */ jsx3("span", { className: "cli-panel-status-label", children: item.label })
428
+ /* @__PURE__ */ jsx3("span", { className: "cli-panel-status-label", children: item.label }),
429
+ item.stop && /* @__PURE__ */ jsx3(
430
+ "button",
431
+ {
432
+ type: "button",
433
+ className: "cli-panel-status-stop",
434
+ title: item.stop.title,
435
+ onClick: (e) => {
436
+ e.stopPropagation();
437
+ controller2.stopCommand();
438
+ },
439
+ children: item.stop.label
440
+ }
441
+ )
409
442
  ]
410
443
  },
411
444
  item.key
@@ -415,7 +448,7 @@ function PanelHeader({
415
448
  {
416
449
  className: joinClasses("cli-panel-status-compact-item", item.compactClass),
417
450
  title: item.title,
418
- onClick: item.dropdown ? (e) => openDropdown(e, item.dropdown) : void 0,
451
+ onClick: item.dropdown || item.stop ? (e) => onIndicatorClick(e, item) : void 0,
419
452
  children: [
420
453
  item.compactDotClass && /* @__PURE__ */ jsx3("span", { className: item.compactDotClass }),
421
454
  item.dotClass && /* @__PURE__ */ jsx3("span", { className: `cli-panel-status-dot ${item.dotClass}` }),
@@ -426,25 +459,25 @@ function PanelHeader({
426
459
  )) }),
427
460
  /* @__PURE__ */ jsxs("div", { className: "cli-panel-action-buttons", children: [
428
461
  /* @__PURE__ */ jsxs("div", { className: "cli-panel-btn-position-wrapper", onClick: (e) => e.stopPropagation(), children: [
429
- /* @__PURE__ */ jsx3("button", { className: "cli-panel-btn cli-panel-btn-position", title: PANEL_LABELS.movePanel, onClick: () => controller.togglePositionDropdown(), children: /* @__PURE__ */ jsx3(Icon, { icon: positionIcon(s.position) }) }),
430
- s.positionDropdownOpen && /* @__PURE__ */ jsx3("div", { className: "cli-panel-position-dropdown", children: positionOptions(s).map((opt) => /* @__PURE__ */ jsxs("button", { className: opt.className, onClick: () => controller.setPosition(opt.position), children: [
462
+ /* @__PURE__ */ jsx3("button", { className: "cli-panel-btn cli-panel-btn-position", title: PANEL_LABELS.movePanel, onClick: () => controller2.togglePositionDropdown(), children: /* @__PURE__ */ jsx3(Icon, { icon: positionIcon(s.position) }) }),
463
+ s.positionDropdownOpen && /* @__PURE__ */ jsx3("div", { className: "cli-panel-position-dropdown", children: positionOptions(s).map((opt) => /* @__PURE__ */ jsxs("button", { className: opt.className, onClick: () => controller2.setPosition(opt.position), children: [
431
464
  /* @__PURE__ */ jsx3(Icon, { icon: positionIcon(opt.position, 16) }),
432
465
  opt.label
433
466
  ] }, opt.position)) })
434
467
  ] }),
435
- s.hideable && /* @__PURE__ */ jsx3("button", { className: "cli-panel-btn cli-panel-btn-hide", title: PANEL_LABELS.hide, onClick: () => controller.hide(), children: /* @__PURE__ */ jsx3(Icon, { icon: HIDE_ICON }) }),
468
+ s.hideable && /* @__PURE__ */ jsx3("button", { className: "cli-panel-btn cli-panel-btn-hide", title: PANEL_LABELS.hide, onClick: () => controller2.hide(), children: /* @__PURE__ */ jsx3(Icon, { icon: HIDE_ICON }) }),
436
469
  /* @__PURE__ */ jsx3(
437
470
  "button",
438
471
  {
439
472
  className: "cli-panel-btn",
440
473
  title: s.maximized ? PANEL_LABELS.restore : PANEL_LABELS.maximize,
441
474
  disabled: s.collapsed,
442
- onClick: () => controller.toggleMaximize(),
475
+ onClick: () => controller2.toggleMaximize(),
443
476
  children: /* @__PURE__ */ jsx3(Icon, { icon: s.maximized ? RESTORE_ICON : MAXIMIZE_ICON })
444
477
  }
445
478
  ),
446
- /* @__PURE__ */ jsx3("button", { className: "cli-panel-btn", title: s.collapsed ? PANEL_LABELS.expand : PANEL_LABELS.collapse, onClick: () => controller.toggle(), children: /* @__PURE__ */ jsx3(Icon, { icon: collapseChevronIcon(s.position, s.collapsed) }) }),
447
- s.closable && /* @__PURE__ */ jsx3("button", { className: "cli-panel-btn cli-panel-btn-close", title: PANEL_LABELS.close, onClick: () => controller.close(), children: /* @__PURE__ */ jsx3(Icon, { icon: CLOSE_ICON }) })
479
+ /* @__PURE__ */ jsx3("button", { className: "cli-panel-btn", title: s.collapsed ? PANEL_LABELS.expand : PANEL_LABELS.collapse, onClick: () => controller2.toggle(), children: /* @__PURE__ */ jsx3(Icon, { icon: collapseChevronIcon(s.position, s.collapsed) }) }),
480
+ s.closable && /* @__PURE__ */ jsx3("button", { className: "cli-panel-btn cli-panel-btn-close", title: PANEL_LABELS.close, onClick: () => controller2.close(), children: /* @__PURE__ */ jsx3(Icon, { icon: CLOSE_ICON }) })
448
481
  ] })
449
482
  ] }),
450
483
  /* @__PURE__ */ jsx3("div", { className: glowLineClass(s) })
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Cli.tsx","../src/CliContext.tsx","../src/CliConfigContext.tsx","../src/useCliEngine.ts","../src/CliPanel.tsx","../src/CliProvider.tsx","../src/index.tsx"],"sourcesContent":["import React, { useRef, useEffect } from 'react';\nimport { ICliModule, CliEngineSnapshot } from '@qodalis/cli-core';\nimport { CliEngine, CliEngineOptions, resolveCliHostConfig } from '@qodalis/cli';\nimport { useCli } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\nimport { useCliEngine } from './useCliEngine';\n\nexport interface CliProps {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n snapshot?: CliEngineSnapshot;\n onReady?: (engine: CliEngine) => void;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport function Cli({\n modules,\n options,\n services,\n snapshot,\n onReady,\n style,\n className,\n}: CliProps): React.JSX.Element {\n const ctx = useCli();\n const config = useCliConfig();\n const containerRef = useRef<HTMLDivElement>(null);\n const hasProvider = !!ctx.engine;\n\n // Always call the hook (React rules), but disable it when inside a CliProvider.\n const standaloneEngine = useCliEngine(containerRef, {\n ...resolveCliHostConfig({ modules, options, services }, config),\n snapshot,\n disabled: hasProvider,\n });\n\n const engine = ctx.engine ?? standaloneEngine;\n\n useEffect(() => {\n if (engine && onReady) {\n onReady(engine);\n }\n }, [engine, onReady]);\n\n // If inside a CliProvider, render nothing (provider has the terminal div).\n if (hasProvider) {\n return <></>;\n }\n\n return (\n <div\n ref={containerRef}\n style={{ height: '100%', ...style }}\n className={className}\n />\n );\n}\n","import { createContext, useContext } from 'react';\nimport { CliEngine } from '@qodalis/cli';\n\nexport interface CliContextValue {\n engine: CliEngine | null;\n}\n\nexport const CliContext = createContext<CliContextValue>({ engine: null });\n\nexport function useCli(): CliContextValue {\n return useContext(CliContext);\n}\n","import React, { createContext, useContext } from 'react';\nimport { ICliModule, CliOptions } from '@qodalis/cli-core';\nimport { CliEngineOptions } from '@qodalis/cli';\n\nexport interface CliConfigValue {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n}\n\nconst CliConfigCtx = createContext<CliConfigValue>({});\n\nexport function useCliConfig(): CliConfigValue {\n return useContext(CliConfigCtx);\n}\n\nexport interface CliConfigProviderProps extends CliConfigValue {\n children: React.ReactNode;\n}\n\nexport function CliConfigProvider({\n modules,\n options,\n services,\n children,\n}: CliConfigProviderProps): React.JSX.Element {\n return (\n <CliConfigCtx.Provider value={{ modules, options, services }}>\n {children}\n </CliConfigCtx.Provider>\n );\n}\n","import { useRef, useEffect, useState, RefObject } from 'react';\nimport { CliEngine, CreateCliEngineConfig, createCliEngine } from '@qodalis/cli';\n\nexport interface UseCliEngineConfig extends Omit<CreateCliEngineConfig, 'framework'> {\n disabled?: boolean;\n}\n\nexport function useCliEngine(\n containerRef: RefObject<HTMLElement | null>,\n config?: UseCliEngineConfig,\n): CliEngine | null {\n const [engine, setEngine] = useState<CliEngine | null>(null);\n const engineRef = useRef<CliEngine | null>(null);\n const initTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (config?.disabled || !containerRef.current) return;\n\n // Defer initialization slightly so that StrictMode's immediate\n // unmount (mount → unmount → remount) cancels the first attempt\n // via the cleanup function, while non-StrictMode proceeds normally.\n const container = containerRef.current;\n initTimerRef.current = setTimeout(() => {\n initTimerRef.current = null;\n if (!container) return;\n\n const e = createCliEngine(container, { ...config, framework: 'React' });\n\n engineRef.current = e;\n e.start().then(() => setEngine(e));\n }, 0);\n\n return () => {\n if (initTimerRef.current !== null) {\n clearTimeout(initTimerRef.current);\n initTimerRef.current = null;\n return;\n }\n if (engineRef.current) {\n engineRef.current.destroy();\n engineRef.current = null;\n setEngine(null);\n }\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return engine;\n}\n","import React, { useEffect, useLayoutEffect, useState, useSyncExternalStore } from 'react';\nimport { ICliModule, CliPanelConfig, CliPanelPosition, ICliPanelRef } from '@qodalis/cli-core';\nimport {\n CliEngine,\n CliEngineOptions,\n CliPanelController,\n CliPanelSnapshot,\n CLOSE_GLYPH,\n CLOSE_ICON,\n HIDE_ICON,\n HIDE_TAB_TERMINAL_ICON,\n MAXIMIZE_ICON,\n PANEL_LABELS,\n panelBranding,\n RESTORE_ICON,\n SvgIcon,\n TERMINAL_ICON,\n collapseChevronIcon,\n contextMenuItems,\n contextMenuStyle,\n glowLineClass,\n handleRenameKey,\n hideTabChevronIcon,\n joinClasses,\n mergeCliOptions,\n openStatusDropdown,\n paneClass,\n paneStyle,\n panelTabClass,\n panelTabDotClass,\n panelWrapperClass,\n panelWrapperStyle,\n panesContainerClass,\n panesContainerWidth,\n positionIcon,\n positionOptions,\n resolveCliHostConfig,\n runContextMenuAction,\n statusIndicators,\n svgAttrs,\n} from '@qodalis/cli';\nimport { Cli } from './Cli';\nimport { CliContext } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\n\nexport interface CliPanelOptions extends CliEngineOptions, CliPanelConfig {}\n\nexport interface CliPanelProps {\n options?: CliPanelOptions;\n modules?: ICliModule[];\n services?: Record<string, any>;\n onClose?: () => void;\n style?: React.CSSProperties;\n className?: string;\n\n // Bindable properties (controlled mode)\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n hidden?: boolean;\n onHiddenChange?: (hidden: boolean) => void;\n maximized?: boolean;\n onMaximizedChange?: (maximized: boolean) => void;\n activeTabId?: number;\n onActiveTabIdChange?: (tabId: number) => void;\n position?: CliPanelPosition;\n onPositionChange?: (position: CliPanelPosition) => void;\n height?: number;\n onHeightChange?: (height: number) => void;\n width?: number;\n onWidthChange?: (width: number) => void;\n\n // Structural events\n onTabAdded?: (event: { tabId: number }) => void;\n onTabClosed?: (event: { tabId: number }) => void;\n onPaneSplit?: (event: { paneId: number; tabId: number }) => void;\n onPaneClosed?: (event: { paneId: number }) => void;\n}\n\n/* ─── Icons ──────────────────────────────────────────────── */\n\n/** SVG attribute names in React's camelCase spelling. */\nfunction reactSvgProps(attrs: Record<string, string>): Record<string, string> {\n const props: Record<string, string> = {};\n for (const [key, value] of Object.entries(attrs)) {\n props[key.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())] = value;\n }\n return props;\n}\n\nfunction Icon({ icon, className }: { icon: SvgIcon; className?: string }) {\n return (\n <svg className={className} {...reactSvgProps(svgAttrs(icon))}>\n {icon.shapes.map((shape, i) => React.createElement(shape.tag, { key: i, ...reactSvgProps(shape.attrs) }))}\n </svg>\n );\n}\n\n/** Focus a freshly mounted rename input and select its text. */\nconst focusAndSelect = (input: HTMLInputElement | null) => {\n if (input && document.activeElement !== input) {\n input.focus();\n input.select();\n }\n};\n\n/** React wants camelCase style keys (`colorScheme`); custom properties keep theirs. */\nconst asStyle = (style: Record<string, string>): React.CSSProperties => {\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(style)) {\n out[key.startsWith('--') ? key : key.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())] = value;\n }\n return out as React.CSSProperties;\n};\n\n/* ─── Component ──────────────────────────────────────────── */\n\nexport const CliPanel = React.forwardRef<ICliPanelRef<CliEngine>, CliPanelProps>(function CliPanel(props, ref) {\n const config = useCliConfig();\n const options = mergeCliOptions<CliPanelOptions>(props.options, config.options);\n const { modules, services } = resolveCliHostConfig(props, config);\n\n const [controller] = useState(\n () =>\n new CliPanelController({\n config: options,\n controlled: {\n collapsed: props.collapsed,\n hidden: props.hidden,\n maximized: props.maximized,\n activeTabId: props.activeTabId,\n position: props.position,\n height: props.height,\n width: props.width,\n },\n }),\n );\n const s = useSyncExternalStore(controller.subscribe, controller.getSnapshot, controller.getSnapshot);\n const brand = panelBranding(options);\n const [rootElement, setRootElement] = useState<HTMLDivElement | null>(null);\n\n // Keep the controller in sync with props before the browser paints.\n useLayoutEffect(() => {\n controller.setCallbacks({\n onCollapsedChange: props.onCollapsedChange,\n onHiddenChange: props.onHiddenChange,\n onMaximizedChange: props.onMaximizedChange,\n onActiveTabIdChange: props.onActiveTabIdChange,\n onPositionChange: props.onPositionChange,\n onHeightChange: props.onHeightChange,\n onWidthChange: props.onWidthChange,\n onClose: props.onClose,\n onTabAdded: props.onTabAdded,\n onTabClosed: props.onTabClosed,\n onPaneSplit: props.onPaneSplit,\n onPaneClosed: props.onPaneClosed,\n });\n controller.setControlled({\n collapsed: props.collapsed,\n hidden: props.hidden,\n maximized: props.maximized,\n activeTabId: props.activeTabId,\n position: props.position,\n height: props.height,\n width: props.width,\n });\n controller.setOptions(options);\n });\n\n useEffect(() => controller.setRootElement(rootElement), [controller, rootElement]);\n useEffect(() => () => controller.destroy(), [controller]);\n React.useImperativeHandle(ref, () => controller, [controller]);\n\n if (!s.visible) return null;\n\n return (\n <>\n {s.hidden && (\n <button\n className=\"cli-panel-hide-tab\"\n data-position={s.position}\n data-hide-align={s.hideAlignment}\n style={asStyle(s.themeStyles)}\n title={PANEL_LABELS.showCli}\n onClick={() => controller.unhide()}\n >\n {brand.iconUrl ? (\n <img src={brand.iconUrl} alt=\"\" className=\"cli-panel-hide-tab-icon cli-panel-brand-icon\" />\n ) : (\n <Icon icon={HIDE_TAB_TERMINAL_ICON} className=\"cli-panel-hide-tab-icon\" />\n )}\n <span className=\"cli-panel-hide-tab-label\">{brand.title}</span>\n <Icon icon={hideTabChevronIcon(s.position)} className=\"cli-panel-hide-tab-arrow\" />\n </button>\n )}\n <div\n ref={setRootElement}\n className={panelWrapperClass(s, props.className)}\n style={{ ...asStyle(panelWrapperStyle(s)), ...props.style }}\n data-position={s.position}\n data-resizable={String(s.resizable)}\n data-closable={String(s.closable)}\n data-hideable={String(s.hideable)}\n >\n <PanelHeader controller={controller} s={s} brand={brand} />\n {s.initialized && (\n <div className=\"cli-panel-content\" style={s.collapsed ? { display: 'none' } : undefined}>\n <div className=\"cli-panel-tabs\">\n <ul className=\"cli-panel-tab-list\">\n {s.tabs.map((tab) => (\n <li\n key={tab.id}\n className={panelTabClass(s, tab)}\n onClick={() => controller.selectTab(tab.id)}\n onDoubleClick={() => controller.startRename(tab.id)}\n onContextMenu={(e) => {\n e.preventDefault();\n e.stopPropagation();\n controller.openContextMenu(tab.id, e.clientX, e.clientY);\n }}\n >\n {tab.isEditing ? (\n <input\n className=\"cli-panel-tab-rename-input\"\n type=\"text\"\n defaultValue={tab.title}\n ref={focusAndSelect}\n onKeyDown={(e) => handleRenameKey(controller, tab.id, e.key, e.currentTarget.value)}\n onBlur={(e) => controller.commitRename(tab.id, e.target.value)}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n />\n ) : (\n <>\n <span className={panelTabDotClass(s, tab)} />\n <span className=\"cli-panel-tab-title\">{tab.title}</span>\n <button\n className=\"cli-panel-tab-close-btn\"\n title={PANEL_LABELS.closeTab}\n onClick={(e) => {\n e.stopPropagation();\n controller.closeTab(tab.id);\n }}\n >\n {CLOSE_GLYPH}\n </button>\n </>\n )}\n </li>\n ))}\n </ul>\n <button className=\"cli-panel-add-tab\" title={PANEL_LABELS.newTerminal} onClick={() => controller.addTab()}>\n +\n </button>\n </div>\n\n <div className=\"cli-panel-instances\">\n {s.tabs.map((tab) => (\n <div key={tab.id} className=\"cli-panel-instance\" style={{ display: tab.id === s.activeTabId ? undefined : 'none' }}>\n <div className={panesContainerClass(s)}>\n {tab.panes.map((pane, i) => (\n <React.Fragment key={pane.id}>\n {i > 0 && (\n <div\n className=\"cli-panel-pane-divider\"\n onPointerDown={(e) => {\n e.preventDefault();\n controller.startPaneResize(tab.id, i - 1, e.clientX, panesContainerWidth(e.target));\n }}\n >\n <div className=\"cli-panel-pane-divider-grip\" />\n </div>\n )}\n <div\n className={paneClass(s, tab.id, pane.id)}\n style={paneStyle(pane.widthPercent)}\n onClick={() => controller.activatePane(tab.id, pane.id)}\n >\n {tab.panes.length > 1 && (\n <button\n className=\"cli-panel-pane-close-btn\"\n title={PANEL_LABELS.closePane}\n onClick={(e) => {\n e.stopPropagation();\n controller.closePane(pane.id);\n }}\n >\n {CLOSE_GLYPH}\n </button>\n )}\n <CliContext.Provider value={{ engine: null }}>\n <Cli\n options={options}\n modules={modules}\n services={services}\n snapshot={pane.snapshot}\n onReady={(engine) => controller.registerEngine(tab.id, pane.id, engine)}\n />\n </CliContext.Provider>\n </div>\n </React.Fragment>\n ))}\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {s.contextMenu.visible && (\n <div className=\"cli-panel-context-menu\" style={asStyle(contextMenuStyle(s))} onClick={(e) => e.stopPropagation()}>\n {contextMenuItems(s).map((item) => (\n <React.Fragment key={item.action}>\n {item.separatorBefore && <div className=\"cli-panel-context-menu-separator\" />}\n <button\n className={joinClasses('cli-panel-context-menu-item', item.destructive && 'destructive')}\n disabled={item.disabled}\n onClick={() => runContextMenuAction(controller, item.action)}\n >\n {item.label}\n </button>\n </React.Fragment>\n ))}\n </div>\n )}\n\n <StatusDropdown s={s} />\n </>\n );\n});\n\n/* ─── Services / servers dropdown ────────────────────────── */\n\nfunction StatusDropdown({ s }: { s: CliPanelSnapshot }) {\n const dropdown = openStatusDropdown(s);\n if (!dropdown) return null;\n return (\n <div className=\"cli-panel-services-dropdown\" style={asStyle(dropdown.style)} onClick={(e) => e.stopPropagation()}>\n <div className=\"cli-panel-services-dropdown-header\">{dropdown.header}</div>\n <div className=\"cli-panel-services-dropdown-list\">\n {dropdown.rows.map((row) => (\n <div key={row.key} className=\"cli-panel-services-dropdown-item\">\n <span className={row.dotClass} />\n <div className=\"cli-panel-svc-info\">\n <span className=\"cli-panel-svc-name\">{row.name}</span>\n {row.description && <span className=\"cli-panel-svc-desc\">{row.description}</span>}\n </div>\n {dropdown.kind === 'servers' ? (\n <div className=\"cli-panel-srv-meta\">\n <span className=\"cli-panel-svc-status\">{row.status}</span>\n {row.meta.map((m) => (\n <span key={m} className=\"cli-panel-svc-desc\">\n {m}\n </span>\n ))}\n </div>\n ) : (\n <span className=\"cli-panel-svc-status\">{row.status}</span>\n )}\n </div>\n ))}\n </div>\n {dropdown.rows.length === 0 && <div className=\"cli-panel-services-dropdown-empty\">{dropdown.emptyText}</div>}\n </div>\n );\n}\n\n/* ─── Header ─────────────────────────────────────────────── */\n\nfunction PanelHeader({\n controller,\n s,\n brand,\n}: {\n controller: CliPanelController;\n s: CliPanelSnapshot;\n brand: ReturnType<typeof panelBranding>;\n}) {\n const indicators = statusIndicators(s);\n const openDropdown = (e: React.MouseEvent, dropdown?: 'services' | 'servers') => {\n if (!dropdown) return;\n e.stopPropagation();\n if (dropdown === 'services') controller.toggleServicesDropdown(e.currentTarget);\n else controller.toggleServersDropdown(e.currentTarget);\n };\n\n return (\n <div className=\"cli-panel-header\">\n <div\n className=\"cli-panel-resize-bar\"\n onPointerDown={(e) => {\n if (!s.resizable) return;\n e.preventDefault();\n controller.startPanelResize(e.clientX, e.clientY);\n }}\n >\n <div className=\"cli-panel-resize-grip\" />\n </div>\n <div className=\"cli-panel-header-content\">\n <p className=\"cli-panel-title\">\n <span className=\"cli-panel-title-icon\">\n {brand.iconUrl ? <img src={brand.iconUrl} alt=\"\" className=\"cli-panel-brand-icon\" /> : <Icon icon={TERMINAL_ICON} />}\n </span>\n {brand.title}\n </p>\n\n {s.showStatusIndicators && (\n <div className=\"cli-panel-status-indicators\">\n {indicators.map((item) => (\n <span\n key={item.key}\n className={joinClasses('cli-panel-status-item', item.itemClass)}\n onClick={item.dropdown ? (e) => openDropdown(e, item.dropdown) : undefined}\n >\n {item.dotClass && <span className={`cli-panel-status-dot ${item.dotClass}`} />}\n {item.icon && <span className={joinClasses('cli-panel-status-icon', item.iconClass)}>{item.icon}</span>}\n <span className=\"cli-panel-status-label\">{item.label}</span>\n </span>\n ))}\n </div>\n )}\n\n {/* Compact indicators for left/right positions (CSS controls visibility). */}\n <div className=\"cli-panel-status-indicators-compact\">\n {indicators.map((item) => (\n <span\n key={item.key}\n className={joinClasses('cli-panel-status-compact-item', item.compactClass)}\n title={item.title}\n onClick={item.dropdown ? (e) => openDropdown(e, item.dropdown) : undefined}\n >\n {item.compactDotClass && <span className={item.compactDotClass} />}\n {item.dotClass && <span className={`cli-panel-status-dot ${item.dotClass}`} />}\n {item.icon && <span className={joinClasses('cli-panel-status-icon', item.iconClass)}>{item.icon}</span>}\n </span>\n ))}\n </div>\n\n <div className=\"cli-panel-action-buttons\">\n <div className=\"cli-panel-btn-position-wrapper\" onClick={(e) => e.stopPropagation()}>\n <button className=\"cli-panel-btn cli-panel-btn-position\" title={PANEL_LABELS.movePanel} onClick={() => controller.togglePositionDropdown()}>\n <Icon icon={positionIcon(s.position)} />\n </button>\n {s.positionDropdownOpen && (\n <div className=\"cli-panel-position-dropdown\">\n {positionOptions(s).map((opt) => (\n <button key={opt.position} className={opt.className} onClick={() => controller.setPosition(opt.position)}>\n <Icon icon={positionIcon(opt.position, 16)} />\n {opt.label}\n </button>\n ))}\n </div>\n )}\n </div>\n {s.hideable && (\n <button className=\"cli-panel-btn cli-panel-btn-hide\" title={PANEL_LABELS.hide} onClick={() => controller.hide()}>\n <Icon icon={HIDE_ICON} />\n </button>\n )}\n <button\n className=\"cli-panel-btn\"\n title={s.maximized ? PANEL_LABELS.restore : PANEL_LABELS.maximize}\n disabled={s.collapsed}\n onClick={() => controller.toggleMaximize()}\n >\n <Icon icon={s.maximized ? RESTORE_ICON : MAXIMIZE_ICON} />\n </button>\n <button className=\"cli-panel-btn\" title={s.collapsed ? PANEL_LABELS.expand : PANEL_LABELS.collapse} onClick={() => controller.toggle()}>\n <Icon icon={collapseChevronIcon(s.position, s.collapsed)} />\n </button>\n {s.closable && (\n <button className=\"cli-panel-btn cli-panel-btn-close\" title={PANEL_LABELS.close} onClick={() => controller.close()}>\n <Icon icon={CLOSE_ICON} />\n </button>\n )}\n </div>\n </div>\n <div className={glowLineClass(s)} />\n </div>\n );\n}\n","import React, { useRef } from 'react';\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliEngineOptions, resolveCliHostConfig } from '@qodalis/cli';\nimport { CliContext } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\nimport { useCliEngine } from './useCliEngine';\n\nexport interface CliProviderProps {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n children: React.ReactNode;\n style?: React.CSSProperties;\n}\n\nexport function CliProvider({\n modules,\n options,\n services,\n children,\n style,\n}: CliProviderProps): React.JSX.Element {\n const config = useCliConfig();\n const containerRef = useRef<HTMLDivElement>(null);\n const engine = useCliEngine(containerRef, resolveCliHostConfig({ modules, options, services }, config));\n\n return (\n <CliContext.Provider value={{ engine }}>\n <div ref={containerRef} style={{ height: '100%', ...style }} />\n {children}\n </CliContext.Provider>\n );\n}\n","export { Cli } from './Cli';\nexport type { CliProps } from './Cli';\nexport { CliPanel } from './CliPanel';\nexport type { CliPanelProps, CliPanelOptions } from './CliPanel';\nexport { CliProvider } from './CliProvider';\nexport type { CliProviderProps } from './CliProvider';\nexport { useCli, CliContext } from './CliContext';\nexport type { CliContextValue } from './CliContext';\nexport { CliConfigProvider, useCliConfig } from './CliConfigContext';\nexport type { CliConfigValue, CliConfigProviderProps } from './CliConfigContext';\nexport { useCliEngine } from './useCliEngine';\nexport type { UseCliEngineConfig } from './useCliEngine';\n\n// Re-export commonly used types from @qodalis/cli for convenience\nexport type { CliEngineOptions } from '@qodalis/cli';\nexport { CliEngine } from '@qodalis/cli';\n"],"mappings":"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","names":["useRef","useEffect","createContext","useContext","jsx","useRef","useEffect","React","useEffect","useState","resolveCliHostConfig","Fragment","jsx","React","CliPanel","resolveCliHostConfig","useState","useEffect","useRef","resolveCliHostConfig","jsx","jsxs","useRef","resolveCliHostConfig","CliEngine"]}
1
+ {"version":3,"sources":["../src/Cli.tsx","../src/CliContext.tsx","../src/CliConfigContext.tsx","../src/useCliEngine.ts","../src/CliPanel.tsx","../src/CliProvider.tsx","../src/index.tsx"],"sourcesContent":["import React, { useRef, useEffect } from 'react';\nimport { ICliModule, CliEngineSnapshot } from '@qodalis/cli-core';\nimport { CliEngine, CliEngineOptions, resolveCliHostConfig } from '@qodalis/cli';\nimport { useCli } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\nimport { useCliEngine } from './useCliEngine';\n\nexport interface CliProps {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n snapshot?: CliEngineSnapshot;\n onReady?: (engine: CliEngine) => void;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport function Cli({\n modules,\n options,\n services,\n snapshot,\n onReady,\n style,\n className,\n}: CliProps): React.JSX.Element {\n const ctx = useCli();\n const config = useCliConfig();\n const containerRef = useRef<HTMLDivElement>(null);\n const hasProvider = !!ctx.engine;\n\n // Always call the hook (React rules), but disable it when inside a CliProvider.\n const standaloneEngine = useCliEngine(containerRef, {\n ...resolveCliHostConfig({ modules, options, services }, config),\n snapshot,\n disabled: hasProvider,\n });\n\n const engine = ctx.engine ?? standaloneEngine;\n\n useEffect(() => {\n if (engine && onReady) {\n onReady(engine);\n }\n }, [engine, onReady]);\n\n // If inside a CliProvider, render nothing (provider has the terminal div).\n if (hasProvider) {\n return <></>;\n }\n\n return (\n <div\n ref={containerRef}\n style={{ height: '100%', ...style }}\n className={className}\n />\n );\n}\n","import { createContext, useContext } from 'react';\nimport { CliEngine } from '@qodalis/cli';\n\nexport interface CliContextValue {\n engine: CliEngine | null;\n}\n\nexport const CliContext = createContext<CliContextValue>({ engine: null });\n\nexport function useCli(): CliContextValue {\n return useContext(CliContext);\n}\n","import React, { createContext, useContext } from 'react';\nimport { ICliModule, CliOptions } from '@qodalis/cli-core';\nimport { CliEngineOptions } from '@qodalis/cli';\n\nexport interface CliConfigValue {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n}\n\nconst CliConfigCtx = createContext<CliConfigValue>({});\n\nexport function useCliConfig(): CliConfigValue {\n return useContext(CliConfigCtx);\n}\n\nexport interface CliConfigProviderProps extends CliConfigValue {\n children: React.ReactNode;\n}\n\nexport function CliConfigProvider({\n modules,\n options,\n services,\n children,\n}: CliConfigProviderProps): React.JSX.Element {\n return (\n <CliConfigCtx.Provider value={{ modules, options, services }}>\n {children}\n </CliConfigCtx.Provider>\n );\n}\n","import { useRef, useEffect, useState, RefObject } from 'react';\nimport { CliEngine, CreateCliEngineConfig, createCliEngine } from '@qodalis/cli';\n\nexport interface UseCliEngineConfig extends Omit<CreateCliEngineConfig, 'framework'> {\n disabled?: boolean;\n}\n\nexport function useCliEngine(\n containerRef: RefObject<HTMLElement | null>,\n config?: UseCliEngineConfig,\n): CliEngine | null {\n const [engine, setEngine] = useState<CliEngine | null>(null);\n const engineRef = useRef<CliEngine | null>(null);\n const initTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (config?.disabled || !containerRef.current) return;\n\n // Defer initialization slightly so that StrictMode's immediate\n // unmount (mount → unmount → remount) cancels the first attempt\n // via the cleanup function, while non-StrictMode proceeds normally.\n const container = containerRef.current;\n initTimerRef.current = setTimeout(() => {\n initTimerRef.current = null;\n if (!container) return;\n\n const e = createCliEngine(container, { ...config, framework: 'React' });\n\n engineRef.current = e;\n e.start().then(() => setEngine(e));\n }, 0);\n\n return () => {\n if (initTimerRef.current !== null) {\n clearTimeout(initTimerRef.current);\n initTimerRef.current = null;\n return;\n }\n if (engineRef.current) {\n engineRef.current.destroy();\n engineRef.current = null;\n setEngine(null);\n }\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return engine;\n}\n","import React, { useEffect, useLayoutEffect, useState, useSyncExternalStore } from 'react';\nimport { ICliModule, CliPanelConfig, CliPanelPosition, ICliPanelRef } from '@qodalis/cli-core';\nimport {\n CliEngine,\n CliEngineOptions,\n CliPanelController,\n CliPanelSnapshot,\n CLOSE_GLYPH,\n CLOSE_ICON,\n HIDE_ICON,\n HIDE_TAB_TERMINAL_ICON,\n MAXIMIZE_ICON,\n PANEL_LABELS,\n panelBranding,\n RESTORE_ICON,\n SvgIcon,\n TERMINAL_ICON,\n collapseChevronIcon,\n contextMenuItems,\n contextMenuStyle,\n glowLineClass,\n handleRenameKey,\n hideTabChevronIcon,\n joinClasses,\n mergeCliOptions,\n openStatusDropdown,\n paneClass,\n paneStyle,\n panelTabClass,\n panelTabDotClass,\n panelWrapperClass,\n panelWrapperStyle,\n panesContainerClass,\n panesContainerWidth,\n positionIcon,\n positionOptions,\n resolveCliHostConfig,\n runContextMenuAction,\n statusIndicators,\n svgAttrs,\n PanelStatusIndicator,\n} from '@qodalis/cli';\nimport { Cli } from './Cli';\nimport { CliContext } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\n\nexport interface CliPanelOptions extends CliEngineOptions, CliPanelConfig {}\n\nexport interface CliPanelProps {\n options?: CliPanelOptions;\n modules?: ICliModule[];\n services?: Record<string, any>;\n onClose?: () => void;\n style?: React.CSSProperties;\n className?: string;\n\n // Bindable properties (controlled mode)\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n hidden?: boolean;\n onHiddenChange?: (hidden: boolean) => void;\n maximized?: boolean;\n onMaximizedChange?: (maximized: boolean) => void;\n activeTabId?: number;\n onActiveTabIdChange?: (tabId: number) => void;\n position?: CliPanelPosition;\n onPositionChange?: (position: CliPanelPosition) => void;\n height?: number;\n onHeightChange?: (height: number) => void;\n width?: number;\n onWidthChange?: (width: number) => void;\n\n // Structural events\n onTabAdded?: (event: { tabId: number }) => void;\n onTabClosed?: (event: { tabId: number }) => void;\n onPaneSplit?: (event: { paneId: number; tabId: number }) => void;\n onPaneClosed?: (event: { paneId: number }) => void;\n}\n\n/* ─── Icons ──────────────────────────────────────────────── */\n\n/** SVG attribute names in React's camelCase spelling. */\nfunction reactSvgProps(attrs: Record<string, string>): Record<string, string> {\n const props: Record<string, string> = {};\n for (const [key, value] of Object.entries(attrs)) {\n props[key.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())] = value;\n }\n return props;\n}\n\nfunction Icon({ icon, className }: { icon: SvgIcon; className?: string }) {\n return (\n <svg className={className} {...reactSvgProps(svgAttrs(icon))}>\n {icon.shapes.map((shape, i) => React.createElement(shape.tag, { key: i, ...reactSvgProps(shape.attrs) }))}\n </svg>\n );\n}\n\n/** Focus a freshly mounted rename input and select its text. */\nconst focusAndSelect = (input: HTMLInputElement | null) => {\n if (input && document.activeElement !== input) {\n input.focus();\n input.select();\n }\n};\n\n/** React wants camelCase style keys (`colorScheme`); custom properties keep theirs. */\nconst asStyle = (style: Record<string, string>): React.CSSProperties => {\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(style)) {\n out[key.startsWith('--') ? key : key.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())] = value;\n }\n return out as React.CSSProperties;\n};\n\n/* ─── Component ──────────────────────────────────────────── */\n\nexport const CliPanel = React.forwardRef<ICliPanelRef<CliEngine>, CliPanelProps>(function CliPanel(props, ref) {\n const config = useCliConfig();\n const options = mergeCliOptions<CliPanelOptions>(props.options, config.options);\n const { modules, services } = resolveCliHostConfig(props, config);\n\n const [controller] = useState(\n () =>\n new CliPanelController({\n config: options,\n controlled: {\n collapsed: props.collapsed,\n hidden: props.hidden,\n maximized: props.maximized,\n activeTabId: props.activeTabId,\n position: props.position,\n height: props.height,\n width: props.width,\n },\n }),\n );\n const s = useSyncExternalStore(controller.subscribe, controller.getSnapshot, controller.getSnapshot);\n const brand = panelBranding(options);\n const [rootElement, setRootElement] = useState<HTMLDivElement | null>(null);\n\n // Keep the controller in sync with props before the browser paints.\n useLayoutEffect(() => {\n controller.setCallbacks({\n onCollapsedChange: props.onCollapsedChange,\n onHiddenChange: props.onHiddenChange,\n onMaximizedChange: props.onMaximizedChange,\n onActiveTabIdChange: props.onActiveTabIdChange,\n onPositionChange: props.onPositionChange,\n onHeightChange: props.onHeightChange,\n onWidthChange: props.onWidthChange,\n onClose: props.onClose,\n onTabAdded: props.onTabAdded,\n onTabClosed: props.onTabClosed,\n onPaneSplit: props.onPaneSplit,\n onPaneClosed: props.onPaneClosed,\n });\n controller.setControlled({\n collapsed: props.collapsed,\n hidden: props.hidden,\n maximized: props.maximized,\n activeTabId: props.activeTabId,\n position: props.position,\n height: props.height,\n width: props.width,\n });\n controller.setOptions(options);\n });\n\n useEffect(() => controller.setRootElement(rootElement), [controller, rootElement]);\n useEffect(() => () => controller.destroy(), [controller]);\n React.useImperativeHandle(ref, () => controller, [controller]);\n\n if (!s.visible) return null;\n\n return (\n <>\n {s.hidden && (\n <button\n className=\"cli-panel-hide-tab\"\n data-position={s.position}\n data-hide-align={s.hideAlignment}\n style={asStyle(s.themeStyles)}\n title={PANEL_LABELS.showCli}\n onClick={() => controller.unhide()}\n >\n {brand.iconUrl ? (\n <img src={brand.iconUrl} alt=\"\" className=\"cli-panel-hide-tab-icon cli-panel-brand-icon\" />\n ) : (\n <Icon icon={HIDE_TAB_TERMINAL_ICON} className=\"cli-panel-hide-tab-icon\" />\n )}\n <span className=\"cli-panel-hide-tab-label\">{brand.title}</span>\n <Icon icon={hideTabChevronIcon(s.position)} className=\"cli-panel-hide-tab-arrow\" />\n </button>\n )}\n <div\n ref={setRootElement}\n className={panelWrapperClass(s, props.className)}\n style={{ ...asStyle(panelWrapperStyle(s)), ...props.style }}\n data-position={s.position}\n data-resizable={String(s.resizable)}\n data-closable={String(s.closable)}\n data-hideable={String(s.hideable)}\n >\n <PanelHeader controller={controller} s={s} brand={brand} />\n {s.initialized && (\n <div className=\"cli-panel-content\" style={s.collapsed ? { display: 'none' } : undefined}>\n <div className=\"cli-panel-tabs\">\n <ul className=\"cli-panel-tab-list\">\n {s.tabs.map((tab) => (\n <li\n key={tab.id}\n className={panelTabClass(s, tab)}\n onClick={() => controller.selectTab(tab.id)}\n onDoubleClick={() => controller.startRename(tab.id)}\n onContextMenu={(e) => {\n e.preventDefault();\n e.stopPropagation();\n controller.openContextMenu(tab.id, e.clientX, e.clientY);\n }}\n >\n {tab.isEditing ? (\n <input\n className=\"cli-panel-tab-rename-input\"\n type=\"text\"\n defaultValue={tab.title}\n ref={focusAndSelect}\n onKeyDown={(e) => handleRenameKey(controller, tab.id, e.key, e.currentTarget.value)}\n onBlur={(e) => controller.commitRename(tab.id, e.target.value)}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n />\n ) : (\n <>\n <span className={panelTabDotClass(s, tab)} />\n <span className=\"cli-panel-tab-title\">{tab.title}</span>\n <button\n className=\"cli-panel-tab-close-btn\"\n title={PANEL_LABELS.closeTab}\n onClick={(e) => {\n e.stopPropagation();\n controller.closeTab(tab.id);\n }}\n >\n {CLOSE_GLYPH}\n </button>\n </>\n )}\n </li>\n ))}\n </ul>\n <button className=\"cli-panel-add-tab\" title={PANEL_LABELS.newTerminal} onClick={() => controller.addTab()}>\n +\n </button>\n </div>\n\n <div className=\"cli-panel-instances\">\n {s.tabs.map((tab) => (\n <div key={tab.id} className=\"cli-panel-instance\" style={{ display: tab.id === s.activeTabId ? undefined : 'none' }}>\n <div className={panesContainerClass(s)}>\n {tab.panes.map((pane, i) => (\n <React.Fragment key={pane.id}>\n {i > 0 && (\n <div\n className=\"cli-panel-pane-divider\"\n onPointerDown={(e) => {\n e.preventDefault();\n controller.startPaneResize(tab.id, i - 1, e.clientX, panesContainerWidth(e.target));\n }}\n >\n <div className=\"cli-panel-pane-divider-grip\" />\n </div>\n )}\n <div\n className={paneClass(s, tab.id, pane.id)}\n style={paneStyle(pane.widthPercent)}\n onClick={() => controller.activatePane(tab.id, pane.id)}\n >\n {tab.panes.length > 1 && (\n <button\n className=\"cli-panel-pane-close-btn\"\n title={PANEL_LABELS.closePane}\n onClick={(e) => {\n e.stopPropagation();\n controller.closePane(pane.id);\n }}\n >\n {CLOSE_GLYPH}\n </button>\n )}\n <CliContext.Provider value={{ engine: null }}>\n <Cli\n options={options}\n modules={modules}\n services={services}\n snapshot={pane.snapshot}\n onReady={(engine) => controller.registerEngine(tab.id, pane.id, engine)}\n />\n </CliContext.Provider>\n </div>\n </React.Fragment>\n ))}\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {s.contextMenu.visible && (\n <div className=\"cli-panel-context-menu\" style={asStyle(contextMenuStyle(s))} onClick={(e) => e.stopPropagation()}>\n {contextMenuItems(s).map((item) => (\n <React.Fragment key={item.action}>\n {item.separatorBefore && <div className=\"cli-panel-context-menu-separator\" />}\n <button\n className={joinClasses('cli-panel-context-menu-item', item.destructive && 'destructive')}\n disabled={item.disabled}\n onClick={() => runContextMenuAction(controller, item.action)}\n >\n {item.label}\n </button>\n </React.Fragment>\n ))}\n </div>\n )}\n\n <StatusDropdown s={s} />\n </>\n );\n});\n\n/* ─── Services / servers dropdown ────────────────────────── */\n\nfunction StatusDropdown({ s }: { s: CliPanelSnapshot }) {\n const dropdown = openStatusDropdown(s);\n if (!dropdown) return null;\n return (\n <div className=\"cli-panel-services-dropdown\" style={asStyle(dropdown.style)} onClick={(e) => e.stopPropagation()}>\n <div className=\"cli-panel-services-dropdown-header\">{dropdown.header}</div>\n <div className=\"cli-panel-services-dropdown-list\">\n {dropdown.rows.map((row) => (\n <div key={row.key} className=\"cli-panel-services-dropdown-item\">\n <span className={row.dotClass} />\n <div className=\"cli-panel-svc-info\">\n <span className=\"cli-panel-svc-name\">{row.name}</span>\n {row.description && <span className=\"cli-panel-svc-desc\">{row.description}</span>}\n </div>\n {dropdown.kind === 'servers' ? (\n <div className=\"cli-panel-srv-meta\">\n <span className=\"cli-panel-svc-status\">{row.status}</span>\n {row.meta.map((m) => (\n <span key={m} className=\"cli-panel-svc-desc\">\n {m}\n </span>\n ))}\n </div>\n ) : (\n <>\n <span className=\"cli-panel-svc-status\">{row.status}</span>\n {row.stop && (\n <button\n type=\"button\"\n className=\"cli-panel-svc-stop\"\n title={row.stop.title}\n onClick={() => controller.killProcess(row.stop!.pid)}\n >\n {row.stop.label}\n </button>\n )}\n </>\n )}\n </div>\n ))}\n </div>\n {dropdown.rows.length === 0 && <div className=\"cli-panel-services-dropdown-empty\">{dropdown.emptyText}</div>}\n </div>\n );\n}\n\n/* ─── Header ─────────────────────────────────────────────── */\n\nfunction PanelHeader({\n controller,\n s,\n brand,\n}: {\n controller: CliPanelController;\n s: CliPanelSnapshot;\n brand: ReturnType<typeof panelBranding>;\n}) {\n const indicators = statusIndicators(s);\n const onIndicatorClick = (e: React.MouseEvent, item: PanelStatusIndicator) => {\n if (item.stop) {\n // The compact item (side positions) has no room for the button\n e.stopPropagation();\n controller.stopCommand();\n return;\n }\n openDropdown(e, item.dropdown);\n };\n const openDropdown = (e: React.MouseEvent, dropdown?: 'services' | 'servers') => {\n if (!dropdown) return;\n e.stopPropagation();\n if (dropdown === 'services') controller.toggleServicesDropdown(e.currentTarget);\n else controller.toggleServersDropdown(e.currentTarget);\n };\n\n return (\n <div className=\"cli-panel-header\">\n <div\n className=\"cli-panel-resize-bar\"\n onPointerDown={(e) => {\n if (!s.resizable) return;\n e.preventDefault();\n controller.startPanelResize(e.clientX, e.clientY);\n }}\n >\n <div className=\"cli-panel-resize-grip\" />\n </div>\n <div className=\"cli-panel-header-content\">\n <p className=\"cli-panel-title\">\n <span className=\"cli-panel-title-icon\">\n {brand.iconUrl ? <img src={brand.iconUrl} alt=\"\" className=\"cli-panel-brand-icon\" /> : <Icon icon={TERMINAL_ICON} />}\n </span>\n {brand.title}\n </p>\n\n {s.showStatusIndicators && (\n <div className=\"cli-panel-status-indicators\">\n {indicators.map((item) => (\n <span\n key={item.key}\n className={joinClasses('cli-panel-status-item', item.itemClass)}\n onClick={item.dropdown ? (e) => openDropdown(e, item.dropdown) : undefined}\n >\n {item.dotClass && <span className={`cli-panel-status-dot ${item.dotClass}`} />}\n {item.icon && <span className={joinClasses('cli-panel-status-icon', item.iconClass)}>{item.icon}</span>}\n <span className=\"cli-panel-status-label\">{item.label}</span>\n {item.stop && (\n <button\n type=\"button\"\n className=\"cli-panel-status-stop\"\n title={item.stop.title}\n onClick={(e) => {\n e.stopPropagation();\n controller.stopCommand();\n }}\n >\n {item.stop.label}\n </button>\n )}\n </span>\n ))}\n </div>\n )}\n\n {/* Compact indicators for left/right positions (CSS controls visibility). */}\n <div className=\"cli-panel-status-indicators-compact\">\n {indicators.map((item) => (\n <span\n key={item.key}\n className={joinClasses('cli-panel-status-compact-item', item.compactClass)}\n title={item.title}\n onClick={item.dropdown || item.stop ? (e) => onIndicatorClick(e, item) : undefined}\n >\n {item.compactDotClass && <span className={item.compactDotClass} />}\n {item.dotClass && <span className={`cli-panel-status-dot ${item.dotClass}`} />}\n {item.icon && <span className={joinClasses('cli-panel-status-icon', item.iconClass)}>{item.icon}</span>}\n </span>\n ))}\n </div>\n\n <div className=\"cli-panel-action-buttons\">\n <div className=\"cli-panel-btn-position-wrapper\" onClick={(e) => e.stopPropagation()}>\n <button className=\"cli-panel-btn cli-panel-btn-position\" title={PANEL_LABELS.movePanel} onClick={() => controller.togglePositionDropdown()}>\n <Icon icon={positionIcon(s.position)} />\n </button>\n {s.positionDropdownOpen && (\n <div className=\"cli-panel-position-dropdown\">\n {positionOptions(s).map((opt) => (\n <button key={opt.position} className={opt.className} onClick={() => controller.setPosition(opt.position)}>\n <Icon icon={positionIcon(opt.position, 16)} />\n {opt.label}\n </button>\n ))}\n </div>\n )}\n </div>\n {s.hideable && (\n <button className=\"cli-panel-btn cli-panel-btn-hide\" title={PANEL_LABELS.hide} onClick={() => controller.hide()}>\n <Icon icon={HIDE_ICON} />\n </button>\n )}\n <button\n className=\"cli-panel-btn\"\n title={s.maximized ? PANEL_LABELS.restore : PANEL_LABELS.maximize}\n disabled={s.collapsed}\n onClick={() => controller.toggleMaximize()}\n >\n <Icon icon={s.maximized ? RESTORE_ICON : MAXIMIZE_ICON} />\n </button>\n <button className=\"cli-panel-btn\" title={s.collapsed ? PANEL_LABELS.expand : PANEL_LABELS.collapse} onClick={() => controller.toggle()}>\n <Icon icon={collapseChevronIcon(s.position, s.collapsed)} />\n </button>\n {s.closable && (\n <button className=\"cli-panel-btn cli-panel-btn-close\" title={PANEL_LABELS.close} onClick={() => controller.close()}>\n <Icon icon={CLOSE_ICON} />\n </button>\n )}\n </div>\n </div>\n <div className={glowLineClass(s)} />\n </div>\n );\n}\n","import React, { useRef } from 'react';\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliEngineOptions, resolveCliHostConfig } from '@qodalis/cli';\nimport { CliContext } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\nimport { useCliEngine } from './useCliEngine';\n\nexport interface CliProviderProps {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n children: React.ReactNode;\n style?: React.CSSProperties;\n}\n\nexport function CliProvider({\n modules,\n options,\n services,\n children,\n style,\n}: CliProviderProps): React.JSX.Element {\n const config = useCliConfig();\n const containerRef = useRef<HTMLDivElement>(null);\n const engine = useCliEngine(containerRef, resolveCliHostConfig({ modules, options, services }, config));\n\n return (\n <CliContext.Provider value={{ engine }}>\n <div ref={containerRef} style={{ height: '100%', ...style }} />\n {children}\n </CliContext.Provider>\n );\n}\n","export { Cli } from './Cli';\nexport type { CliProps } from './Cli';\nexport { CliPanel } from './CliPanel';\nexport type { CliPanelProps, CliPanelOptions } from './CliPanel';\nexport { CliProvider } from './CliProvider';\nexport type { CliProviderProps } from './CliProvider';\nexport { useCli, CliContext } from './CliContext';\nexport type { CliContextValue } from './CliContext';\nexport { CliConfigProvider, useCliConfig } from './CliConfigContext';\nexport type { CliConfigValue, CliConfigProviderProps } from './CliConfigContext';\nexport { useCliEngine } from './useCliEngine';\nexport type { UseCliEngineConfig } from './useCliEngine';\n\n// Re-export commonly used types from @qodalis/cli for convenience\nexport type { CliEngineOptions } from '@qodalis/cli';\nexport { CliEngine } from '@qodalis/cli';\n"],"mappings":"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","names":["useRef","useEffect","createContext","useContext","jsx","useRef","useEffect","React","useEffect","useState","resolveCliHostConfig","Fragment","jsx","React","CliPanel","resolveCliHostConfig","controller","useState","useEffect","useRef","resolveCliHostConfig","jsx","jsxs","useRef","resolveCliHostConfig","CliEngine"]}
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qodalis/react-cli",
3
- "version": "2.4.0",
3
+ "version": "2.4.2",
4
4
  "description": "React wrapper for the @qodalis CLI terminal engine.",
5
5
  "author": "Nicolae Lupei, Qodalis Solutions",
6
6
  "license": "MIT",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qodalis/react-cli",
3
- "version": "2.4.0",
3
+ "version": "2.4.2",
4
4
  "description": "React wrapper for the @qodalis CLI terminal engine.",
5
5
  "author": "Nicolae Lupei, Qodalis Solutions",
6
6
  "license": "MIT",
@@ -36,8 +36,8 @@
36
36
  "react-dom": "^18.0.0 || ^19.0.0"
37
37
  },
38
38
  "dependencies": {
39
- "@qodalis/cli": "2.4.0",
40
- "@qodalis/cli-core": "2.4.0"
39
+ "@qodalis/cli": "2.4.2",
40
+ "@qodalis/cli-core": "2.4.2"
41
41
  },
42
42
  "devDependencies": {
43
43
  "tsup": "^9.0.0",