@ai-matrx/context-menu 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/builder.cjs CHANGED
@@ -204,6 +204,27 @@ function slotOptions(fills, placed) {
204
204
  var import_react = require("react");
205
205
 
206
206
  // src/design/model.ts
207
+ var MENU_TONES = [
208
+ "default",
209
+ "primary",
210
+ "success",
211
+ "warning",
212
+ "info",
213
+ "destructive",
214
+ "sky",
215
+ "blue",
216
+ "indigo",
217
+ "violet",
218
+ "fuchsia",
219
+ "rose",
220
+ "orange",
221
+ "amber",
222
+ "lime",
223
+ "emerald",
224
+ "teal",
225
+ "cyan",
226
+ "slate"
227
+ ];
207
228
  var MENU_SURFACES = [
208
229
  "text-selection",
209
230
  "editable-field",
@@ -356,52 +377,90 @@ function serializeDesign(design2) {
356
377
 
357
378
  // src/design/MenuPreview.tsx
358
379
  var import_jsx_runtime = require("react/jsx-runtime");
359
- function matches(node, q) {
360
- if (!q) return true;
361
- if (node.kind === "divider") return false;
362
- if (node.kind === "item" || node.kind === "slot") return node.label.toLowerCase().includes(q);
363
- return node.label.toLowerCase().includes(q) || node.children.some((c) => matches(c, q));
380
+ function searchable(node) {
381
+ if (node.kind === "divider" || node.kind === "search") return "";
382
+ const hint = node.kind === "item" || node.kind === "submenu" ? node.hint ?? "" : "";
383
+ return [node.label, hint, ...node.keywords ?? []].join(" ").toLowerCase();
364
384
  }
365
- function flatten(nodes, q, out = []) {
385
+ function searchMenu(nodes, q, trail = [], out = []) {
386
+ const words = q.split(/\s+/).filter(Boolean);
366
387
  for (const n of nodes) {
367
- if (n.kind === "item" && matches(n, q)) out.push(n);
368
- else if (isContainer(n)) flatten(n.children, q, out);
388
+ if (n.kind === "item") {
389
+ const text = `${searchable(n)} ${trail.join(" ").toLowerCase()}`;
390
+ if (words.every((w) => text.includes(w))) out.push({ node: n, path: trail.join(" \u203A ") });
391
+ } else if (isContainer(n)) {
392
+ searchMenu(n.children, q, n.kind === "submenu" ? [...trail, n.label] : n.label ? [...trail, n.label] : trail, out);
393
+ }
369
394
  }
370
395
  return out;
371
396
  }
372
- function MenuPreview({ design: design2, renderIcon, highlightId, onSelectNode, onPick, className, style }) {
397
+ function MenuPreview({ design: design2, renderIcon, highlightId, onSelectNode, onPick, availability = "available", className, style }) {
373
398
  const [query, setQuery] = (0, import_react.useState)("");
374
399
  const q = query.trim().toLowerCase();
375
400
  const { look } = design2;
376
- const results = (0, import_react.useMemo)(() => q ? flatten(design2.nodes, q) : null, [design2.nodes, q]);
377
401
  const placed = (0, import_react.useMemo)(() => placedCatalogIds(design2.nodes), [design2.nodes]);
378
- const ctx = { design: design2, renderIcon, highlightId, onSelectNode, onPick, placed };
379
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
380
- "div",
381
- {
382
- role: "menu",
383
- "data-density": look.density,
384
- className: `cm-menu ${className ?? ""}`,
385
- style: { width: look.width, ...style },
386
- children: [
387
- look.search && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "cm-search", children: [
388
- renderIcon("Search", "cm-icon"),
389
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { value: query, onChange: (e) => setQuery(e.target.value), placeholder: "Type to filter\u2026", "aria-label": "Filter menu" })
390
- ] }),
391
- results ? results.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "cm-empty", children: "No matches" }) : results.map((n) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Item, { node: n, ctx }, n.id)) : design2.nodes.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "cm-empty", children: "Empty menu \u2014 drag options in" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Nodes, { nodes: design2.nodes, ctx })
392
- ]
393
- }
394
- );
402
+ const ctx = { design: design2, renderIcon, highlightId, onSelectNode, onPick, placed, availability, query, setQuery };
403
+ const searchAt = design2.nodes.findIndex((n) => n.kind === "search");
404
+ const topSearch = searchAt < 0 && look.search ? { id: "look-search", kind: "search", placeholder: "Type to filter\u2026", autofocus: true } : null;
405
+ const hits = (0, import_react.useMemo)(() => q ? searchMenu(design2.nodes, q) : null, [design2.nodes, q]);
406
+ const above = searchAt >= 0 ? design2.nodes.slice(0, searchAt) : [];
407
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { role: "menu", "data-density": look.density, className: `cm-menu ${className ?? ""}`, style: { width: look.width, ...style }, children: [
408
+ topSearch && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SearchBox, { node: topSearch, ctx }),
409
+ design2.nodes.length === 0 && !topSearch ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "cm-empty", children: "Empty menu \u2014 drag options in" }) : hits ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
410
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Nodes, { nodes: above, ctx }),
411
+ searchAt >= 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SearchBox, { node: design2.nodes[searchAt], ctx }),
412
+ hits.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "cm-empty", children: "No matches" }) : hits.map((h) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Item, { node: h.node, ctx, path: h.path }, h.node.id))
413
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Nodes, { nodes: design2.nodes, ctx })
414
+ ] });
415
+ }
416
+ function SearchBox({ node, ctx }) {
417
+ const ref = (0, import_react.useRef)(null);
418
+ (0, import_react.useEffect)(() => {
419
+ if (node.autofocus) ref.current?.focus({ preventScroll: true });
420
+ }, [node.autofocus]);
421
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: `cm-search ${ctx.highlightId === node.id ? "cm-hl" : ""}`, onClick: () => ctx.onSelectNode?.(node.id), children: [
422
+ ctx.renderIcon("Search", "cm-icon"),
423
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
424
+ "input",
425
+ {
426
+ ref,
427
+ value: ctx.query,
428
+ onChange: (e) => ctx.setQuery(e.target.value),
429
+ onKeyDown: (e) => {
430
+ if (e.key === "Escape" && ctx.query) {
431
+ e.stopPropagation();
432
+ ctx.setQuery("");
433
+ }
434
+ },
435
+ placeholder: node.placeholder || "Type to filter\u2026",
436
+ "aria-label": "Filter menu"
437
+ }
438
+ )
439
+ ] });
440
+ }
441
+ function shown(node, ctx) {
442
+ if (ctx.availability === "available" || !node.unavailableWhen) {
443
+ return { hidden: false, greyed: node.kind === "item" && Boolean(node.disabled) };
444
+ }
445
+ const mode = node.unavailable ?? "disable";
446
+ if (mode === "hide") return { hidden: true, greyed: false };
447
+ if (mode === "required") return { hidden: false, greyed: false };
448
+ return { hidden: false, greyed: true };
395
449
  }
396
450
  function Nodes({ nodes, ctx }) {
397
451
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: nodes.map((n) => {
452
+ if (shown(n, ctx).hidden) return null;
398
453
  if (n.kind === "divider") return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { role: "separator", className: "cm-divider" }, n.id);
399
454
  if (n.kind === "item") return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Item, { node: n, ctx }, n.id);
400
455
  if (n.kind === "submenu") return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Submenu, { node: n, ctx }, n.id);
401
- if (n.kind === "slot") return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Slot, { node: n, ctx }, n.id);
456
+ if (n.kind === "slot") return n.shape === "feature" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FeatureSlot, { node: n, ctx }, n.id) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Slot, { node: n, ctx }, n.id);
457
+ if (n.kind === "search") return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SearchBox, { node: n, ctx }, n.id);
402
458
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Section, { node: n, ctx }, n.id);
403
459
  }) });
404
460
  }
461
+ function toneAttrs(tone, toneLabel) {
462
+ return tone && tone !== "default" ? { "data-tone": tone, ...toneLabel ? { "data-tone-label": "" } : {} } : {};
463
+ }
405
464
  function Section({ node, ctx }) {
406
465
  const [open, setOpen] = (0, import_react.useState)(!node.collapsible);
407
466
  const layout = node.layout ?? "list";
@@ -423,11 +482,12 @@ function Section({ node, ctx }) {
423
482
  }
424
483
  ),
425
484
  open && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "cm-section-body", children: layout === "list" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Nodes, { nodes: node.children, ctx }) : node.children.map(
426
- (c) => c.kind === "item" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Tile, { node: c, ctx }, c.id) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Nodes, { nodes: [c], ctx }, c.id)
485
+ (c) => shown(c, ctx).hidden ? null : c.kind === "item" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Tile, { node: c, ctx }, c.id) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Nodes, { nodes: [c], ctx }, c.id)
427
486
  ) })
428
487
  ] });
429
488
  }
430
489
  function Tile({ node, ctx }) {
490
+ const { greyed } = shown(node, ctx);
431
491
  return (
432
492
  // ui-exception: a menu row of the menu component itself
433
493
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
@@ -436,7 +496,8 @@ function Tile({ node, ctx }) {
436
496
  type: "button",
437
497
  role: "menuitem",
438
498
  title: node.label + (node.shortcut ? ` ${node.shortcut}` : ""),
439
- disabled: node.disabled,
499
+ disabled: greyed,
500
+ ...toneAttrs(node.tone, node.toneLabel),
440
501
  className: `cm-tile ${node.danger ? "cm-danger" : ""} ${node.ai ? "cm-ai" : ""} ${ctx.highlightId === node.id ? "cm-hl" : ""}`,
441
502
  onClick: () => {
442
503
  ctx.onSelectNode?.(node.id);
@@ -447,31 +508,37 @@ function Tile({ node, ctx }) {
447
508
  )
448
509
  );
449
510
  }
450
- function Item({ node, ctx }) {
511
+ function Item({ node, ctx, path }) {
451
512
  const { look } = ctx.design;
452
- const [checked, setChecked] = (0, import_react.useState)(false);
513
+ const [checked, setChecked] = (0, import_react.useState)(Boolean(node.defaultOn));
514
+ (0, import_react.useEffect)(() => setChecked(Boolean(node.defaultOn)), [node.defaultOn]);
515
+ const { greyed } = shown(node, ctx);
516
+ const settable = node.toggle || node.switch;
517
+ const hint = path || (look.showHints ? node.hint : void 0);
453
518
  return (
454
519
  // ui-exception: a menu row of the menu component itself
455
520
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
456
521
  "button",
457
522
  {
458
523
  type: "button",
459
- role: node.toggle ? "menuitemcheckbox" : "menuitem",
460
- "aria-checked": node.toggle ? checked : void 0,
461
- disabled: node.disabled,
524
+ role: settable ? "menuitemcheckbox" : "menuitem",
525
+ "aria-checked": settable ? checked : void 0,
526
+ disabled: greyed,
527
+ ...toneAttrs(node.tone, node.toneLabel),
462
528
  className: `cm-item ${node.danger ? "cm-danger" : ""} ${node.ai ? "cm-ai" : ""} ${ctx.highlightId === node.id ? "cm-hl" : ""}`,
463
529
  onClick: () => {
464
530
  ctx.onSelectNode?.(node.id);
465
- if (node.toggle) setChecked((c) => !c);
531
+ if (settable) setChecked((c) => !c);
466
532
  ctx.onPick?.(node);
467
533
  },
468
534
  children: [
469
535
  look.showIcons && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "cm-icon-slot", children: node.toggle ? checked ? ctx.renderIcon("Check", "cm-icon") : null : node.icon ? ctx.renderIcon(node.icon, "cm-icon") : null }),
470
536
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "cm-text", children: [
471
537
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "cm-label", children: node.label }),
472
- look.showHints && node.hint && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "cm-hint", children: node.hint })
538
+ hint && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "cm-hint", children: hint })
473
539
  ] }),
474
- look.showShortcuts && node.shortcut && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("kbd", { className: "cm-shortcut", children: node.shortcut })
540
+ look.showShortcuts && node.shortcut && !node.switch && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("kbd", { className: "cm-shortcut", children: node.shortcut }),
541
+ node.switch && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "cm-switch", "data-on": checked ? "" : void 0, "aria-hidden": "true" })
475
542
  ]
476
543
  }
477
544
  )
@@ -481,35 +548,46 @@ function Submenu({ node, ctx }) {
481
548
  const { look } = ctx.design;
482
549
  const [open, setOpen] = (0, import_react.useState)(false);
483
550
  const [side, setSide] = (0, import_react.useState)("right");
484
- const show = (el) => {
485
- setSide(flyoutSide(el, look.width));
486
- setOpen(true);
487
- };
488
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "cm-sub", onMouseEnter: (e) => show(e.currentTarget), onMouseLeave: () => setOpen(false), children: [
489
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
490
- "button",
491
- {
492
- type: "button",
493
- role: "menuitem",
494
- "aria-haspopup": "menu",
495
- "aria-expanded": open,
496
- className: `cm-item ${ctx.highlightId === node.id ? "cm-hl" : ""}`,
497
- onClick: () => {
498
- ctx.onSelectNode?.(node.id);
499
- setOpen(true);
500
- },
501
- children: [
502
- look.showIcons && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "cm-icon-slot", children: node.icon ? ctx.renderIcon(node.icon, "cm-icon") : null }),
503
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "cm-text", children: [
504
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "cm-label", children: node.label }),
505
- look.showHints && node.hint && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "cm-hint", children: node.hint })
506
- ] }),
507
- ctx.renderIcon("ChevronRight", "cm-icon cm-chev")
508
- ]
509
- }
510
- ),
511
- open && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { role: "menu", className: "cm-menu cm-flyout", "data-side": side, "data-density": look.density, style: { width: look.width }, children: node.children.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "cm-empty", children: "Empty submenu" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Nodes, { nodes: node.children, ctx }) })
512
- ] });
551
+ const { greyed } = shown(node, ctx);
552
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
553
+ "div",
554
+ {
555
+ className: "cm-sub",
556
+ onMouseEnter: (e) => {
557
+ if (greyed) return;
558
+ setSide(flyoutSide(e.currentTarget, look.width));
559
+ setOpen(true);
560
+ },
561
+ onMouseLeave: () => setOpen(false),
562
+ children: [
563
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
564
+ "button",
565
+ {
566
+ type: "button",
567
+ role: "menuitem",
568
+ "aria-haspopup": "menu",
569
+ "aria-expanded": open,
570
+ disabled: greyed,
571
+ ...toneAttrs(node.tone, node.toneLabel),
572
+ className: `cm-item ${ctx.highlightId === node.id ? "cm-hl" : ""}`,
573
+ onClick: () => {
574
+ ctx.onSelectNode?.(node.id);
575
+ setOpen(true);
576
+ },
577
+ children: [
578
+ look.showIcons && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "cm-icon-slot", children: node.icon ? ctx.renderIcon(node.icon, "cm-icon") : null }),
579
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "cm-text", children: [
580
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "cm-label", children: node.label }),
581
+ look.showHints && node.hint && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "cm-hint", children: node.hint })
582
+ ] }),
583
+ ctx.renderIcon("ChevronRight", "cm-icon cm-chev")
584
+ ]
585
+ }
586
+ ),
587
+ open && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { role: "menu", className: "cm-menu cm-flyout", "data-side": side, "data-density": look.density, style: { width: look.width }, children: node.children.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "cm-empty", children: "Empty submenu" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Nodes, { nodes: node.children, ctx }) })
588
+ ]
589
+ }
590
+ );
513
591
  }
514
592
  function flyoutSide(row, width) {
515
593
  const r = row.getBoundingClientRect();
@@ -518,37 +596,42 @@ function flyoutSide(row, width) {
518
596
  if (r.left - width - 8 >= bounds.left) return "left";
519
597
  return "below";
520
598
  }
521
- function Slot({ node, ctx }) {
599
+ function SlotRow({ node, ctx, label, icon, count, more, onOpen }) {
522
600
  const { look } = ctx.design;
523
601
  const source = slotSource(node.fills);
524
- const options = slotOptions(node.fills, ctx.placed);
525
- const [open, setOpen] = (0, import_react.useState)(false);
526
- const [side, setSide] = (0, import_react.useState)("right");
527
- const count = source?.runtime ? "live" : String(options.length);
528
- const row = (
602
+ return (
529
603
  // ui-exception: a menu row of the menu component itself
530
604
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
531
605
  "button",
532
606
  {
533
607
  type: "button",
534
608
  role: "menuitem",
535
- "aria-haspopup": node.shape === "submenu" ? "menu" : void 0,
609
+ "aria-haspopup": more ? "menu" : void 0,
536
610
  title: source ? `Placeholder: ${source.label}` : "Placeholder",
537
611
  className: `cm-item cm-slot ${ctx.highlightId === node.id ? "cm-hl" : ""}`,
538
612
  onClick: () => {
539
613
  ctx.onSelectNode?.(node.id);
540
- if (node.shape === "submenu") setOpen(true);
614
+ onOpen?.();
541
615
  },
542
616
  children: [
543
- look.showIcons && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "cm-icon-slot", children: ctx.renderIcon(node.icon ?? source?.icon ?? "Ellipsis", "cm-icon") }),
544
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "cm-text", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "cm-label", children: node.label }) }),
545
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "cm-count", children: count }),
546
- node.shape === "submenu" && ctx.renderIcon("ChevronRight", "cm-icon cm-chev")
617
+ look.showIcons && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "cm-icon-slot", children: ctx.renderIcon(icon, "cm-icon") }),
618
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "cm-text", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "cm-label", children: label }) }),
619
+ count && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "cm-count", children: count }),
620
+ more && ctx.renderIcon("ChevronRight", "cm-icon cm-chev")
547
621
  ]
548
622
  }
549
623
  )
550
624
  );
551
- if (node.shape === "items") return row;
625
+ }
626
+ function Slot({ node, ctx }) {
627
+ const { look } = ctx.design;
628
+ const source = slotSource(node.fills);
629
+ const options = slotOptions(node.fills, ctx.placed);
630
+ const [open, setOpen] = (0, import_react.useState)(false);
631
+ const [side, setSide] = (0, import_react.useState)("right");
632
+ const icon = node.icon ?? source?.icon ?? "Ellipsis";
633
+ const count = source?.runtime ? "live" : String(options.length);
634
+ if (node.shape === "items") return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SlotRow, { node, ctx, label: node.label, icon, count });
552
635
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
553
636
  "div",
554
637
  {
@@ -559,15 +642,49 @@ function Slot({ node, ctx }) {
559
642
  },
560
643
  onMouseLeave: () => setOpen(false),
561
644
  children: [
562
- row,
645
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SlotRow, { node, ctx, label: node.label, icon, count, more: true, onOpen: () => setOpen(true) }),
563
646
  open && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { role: "menu", className: "cm-menu cm-flyout", "data-side": side, "data-density": look.density, style: { width: look.width }, children: source?.runtime ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "cm-runtime", children: [
564
647
  "Filled at runtime: ",
565
648
  source.label
566
- ] }) : options.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "cm-empty", children: "Nothing left \u2014 every option of this kind is placed" }) : options.map((o2) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Item, { node: { id: `slot-${node.id}-${o2.id}`, kind: "item", label: o2.label, icon: o2.icon, catalogId: o2.id, ...o2.shortcut ? { shortcut: o2.shortcut } : {}, ...o2.ai ? { ai: true } : {}, ...o2.danger ? { danger: true } : {} }, ctx }, o2.id)) })
649
+ ] }) : options.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "cm-empty", children: "Nothing left \u2014 every option of this kind is placed" }) : options.map((o2) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
650
+ Item,
651
+ {
652
+ node: { id: `slot-${node.id}-${o2.id}`, kind: "item", label: o2.label, icon: o2.icon, catalogId: o2.id, ...o2.shortcut ? { shortcut: o2.shortcut } : {}, ...o2.ai ? { ai: true } : {}, ...o2.danger ? { danger: true } : {} },
653
+ ctx
654
+ },
655
+ o2.id
656
+ )) })
567
657
  ]
568
658
  }
569
659
  );
570
660
  }
661
+ function FeatureSlot({ node, ctx }) {
662
+ const { look } = ctx.design;
663
+ const n = Math.max(0, Math.min(12, node.featureItems ?? 4));
664
+ const [open, setOpen] = (0, import_react.useState)(false);
665
+ const [side, setSide] = (0, import_react.useState)("right");
666
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: `cm-section ${ctx.highlightId === node.id ? "cm-hl" : ""}`, "data-layout": "list", children: [
667
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "cm-section-label cm-slot-label", onClick: () => ctx.onSelectNode?.(node.id), children: node.label || "This feature" }),
668
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "cm-section-body", children: [
669
+ Array.from({ length: n }, (_, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SlotRow, { node, ctx, label: `Feature option ${i + 1}`, icon: "Circle" }, i)),
670
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
671
+ "div",
672
+ {
673
+ className: "cm-sub",
674
+ onMouseEnter: (e) => {
675
+ setSide(flyoutSide(e.currentTarget, look.width));
676
+ setOpen(true);
677
+ },
678
+ onMouseLeave: () => setOpen(false),
679
+ children: [
680
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SlotRow, { node, ctx, label: "More", icon: "Ellipsis", more: true, onOpen: () => setOpen(true) }),
681
+ open && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { role: "menu", className: "cm-menu cm-flyout", "data-side": side, "data-density": look.density, style: { width: look.width }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "cm-runtime", children: "The rest of this feature's options, filled at runtime" }) })
682
+ ]
683
+ }
684
+ )
685
+ ] })
686
+ ] });
687
+ }
571
688
 
572
689
  // src/design/starters.ts
573
690
  function maker(slug) {
@@ -1051,6 +1168,3789 @@ var STARTER_DESIGNS = [
1051
1168
  { id: "proposal-layout-command", group: "Proposal", source: "/demos/context-menu/layouts \u2014 command", design: layoutCommand() }
1052
1169
  ];
1053
1170
 
1171
+ // src/design/audit.ts
1172
+ var AUDIT_FINDINGS = [
1173
+ {
1174
+ "id": "audit:1",
1175
+ "label": "Add to knowledge base",
1176
+ "feature": "Add to knowledge base / see if the note is indexed (label flips to Knowledge base once ingested, opens the knowledge panel)",
1177
+ "surface": "note tab ..., note row menu, right-click, phone More sheet, bulk bar",
1178
+ "source": "features/notes/components/note-actions/noteActionSet.ts:62",
1179
+ "coverage": "missing",
1180
+ "home": "main menu",
1181
+ "importance": "core",
1182
+ "area": "notes"
1183
+ },
1184
+ {
1185
+ "id": "audit:2",
1186
+ "label": "Restore a note from Trash",
1187
+ "feature": "Restore a note from Trash (and see the Trash list with deleted dates)",
1188
+ "surface": "notes sidebar Trash section, delete undo toast",
1189
+ "source": "features/notes/components/NoteSidebar.tsx:1764",
1190
+ "coverage": "partial",
1191
+ "home": "main menu",
1192
+ "importance": "core",
1193
+ "area": "notes",
1194
+ "closest": "Archive (icon strip) covers sending to trash only; there is no Restore or Unarchive entry"
1195
+ },
1196
+ {
1197
+ "id": "audit:3",
1198
+ "label": "About this note",
1199
+ "feature": "About this note: info panel with word, character, line, paragraph counts and read time, Public chip, linked records, custom fields",
1200
+ "surface": "note tab ... and right-click, phone More sheet",
1201
+ "source": "features/notes/components/note-actions/noteActionSet.ts:76",
1202
+ "coverage": "missing",
1203
+ "home": "feature section",
1204
+ "importance": "useful",
1205
+ "area": "notes"
1206
+ },
1207
+ {
1208
+ "id": "audit:4",
1209
+ "label": "Switch note view mode",
1210
+ "feature": "Switch note view mode: Write, Split, Plain, Read (phone has Write and Plain only)",
1211
+ "surface": "notes header mode capsule",
1212
+ "source": "features/notes/components/NoteViewControls.tsx:28",
1213
+ "coverage": "missing",
1214
+ "home": "feature section",
1215
+ "importance": "core",
1216
+ "area": "notes"
1217
+ },
1218
+ {
1219
+ "id": "audit:5",
1220
+ "label": "Tab management",
1221
+ "feature": "Tab management: Pin tab or Unpin tab, Move tab left, Move tab right",
1222
+ "surface": "note tab ... and right-click on tab",
1223
+ "source": "features/notes/components/NoteTabItem.tsx:396",
1224
+ "coverage": "partial",
1225
+ "home": "feature section",
1226
+ "importance": "useful",
1227
+ "area": "notes",
1228
+ "closest": "Organize > Pin (pins the note, not the tab; no reorder)"
1229
+ },
1230
+ {
1231
+ "id": "audit:6",
1232
+ "label": "Close tab, Close other tabs, Close all tabs",
1233
+ "feature": "Close tab, Close other tabs, Close all tabs (also Ctrl/Cmd+W)",
1234
+ "surface": "note tab ... , editor right-click Tabs submenu",
1235
+ "source": "features/notes/agent-context/notesEditorExtraSections.ts:130",
1236
+ "coverage": "missing",
1237
+ "home": "feature section",
1238
+ "importance": "core",
1239
+ "area": "notes"
1240
+ },
1241
+ {
1242
+ "id": "audit:7",
1243
+ "label": "New note tab, and pick the organization for\u2026",
1244
+ "feature": "New note tab, and pick the organization for a new note",
1245
+ "surface": "tab bar plus button and org chooser",
1246
+ "source": "features/notes/components/NoteTabBar.tsx:294",
1247
+ "coverage": "missing",
1248
+ "home": "feature section",
1249
+ "importance": "useful",
1250
+ "area": "notes"
1251
+ },
1252
+ {
1253
+ "id": "audit:8",
1254
+ "label": "Choose or change the note's organization",
1255
+ "feature": "Choose or change the note's organization / scopes (organization, project, task) and the organization's custom fields on the note",
1256
+ "surface": "info panel, metadata bar, phone Scopes dock, note context section",
1257
+ "source": "features/notes/components/NoteInfoPanel.tsx:322",
1258
+ "coverage": "partial",
1259
+ "home": "feature section",
1260
+ "importance": "core",
1261
+ "area": "notes",
1262
+ "closest": "Organize > Set as context and Attach to... do not cover assigning the note's own scopes or org"
1263
+ },
1264
+ {
1265
+ "id": "audit:9",
1266
+ "label": "Folder tools",
1267
+ "feature": "Folder tools: New folder, Choose folder, create-folder-and-move in one step",
1268
+ "surface": "Move to folder submenu, bulk bar, info panel",
1269
+ "source": "features/notes/agent-context/notesEditorExtraSections.ts:97",
1270
+ "coverage": "partial",
1271
+ "home": "main menu",
1272
+ "importance": "useful",
1273
+ "area": "notes",
1274
+ "closest": "Organize > Move to folder... (no inline New folder entry listed)"
1275
+ },
1276
+ {
1277
+ "id": "audit:10",
1278
+ "label": "Folder header actions",
1279
+ "feature": "Folder header actions: New Note in this folder, Rename Folder, Move all notes to Trash",
1280
+ "surface": "right-click on a folder header in the sidebar",
1281
+ "source": "features/notes/components/NoteSidebar.tsx:771",
1282
+ "coverage": "missing",
1283
+ "home": "feature section",
1284
+ "importance": "core",
1285
+ "area": "notes"
1286
+ },
1287
+ {
1288
+ "id": "audit:11",
1289
+ "label": "Open the print studio",
1290
+ "feature": "Open the print studio (pages, cover, table of contents, header and footer, PDF/Word/EPUB/HTML) for the note",
1291
+ "surface": "note actions Print or export as document",
1292
+ "source": "features/notes/components/note-actions/noteMenuRegistry.tsx:318",
1293
+ "coverage": "partial",
1294
+ "home": "window",
1295
+ "importance": "useful",
1296
+ "area": "notes",
1297
+ "closest": "Export & Download > Print / PDF / Word / HTML (no EPUB, no page-layout studio)"
1298
+ },
1299
+ {
1300
+ "id": "audit:12",
1301
+ "label": "Version history as a side panel, with a full\u2026",
1302
+ "feature": "Version history as a side panel, with a full diff page between versions",
1303
+ "surface": "record tools, note actions, phone More",
1304
+ "source": "features/notes/components/NoteRecordTools.tsx:40",
1305
+ "coverage": "partial",
1306
+ "home": "window",
1307
+ "importance": "useful",
1308
+ "area": "notes",
1309
+ "closest": "Content > View history and Compare"
1310
+ },
1311
+ {
1312
+ "id": "audit:13",
1313
+ "label": "Document outline panel toggle",
1314
+ "feature": "Document outline panel toggle (jump to headings)",
1315
+ "surface": "record tools, header overflow",
1316
+ "source": "features/notes/components/NoteRecordTools.tsx:35",
1317
+ "coverage": "partial",
1318
+ "home": "feature section",
1319
+ "importance": "useful",
1320
+ "area": "notes",
1321
+ "closest": "Content > Outline"
1322
+ },
1323
+ {
1324
+ "id": "audit:14",
1325
+ "label": "Clean up options",
1326
+ "feature": "Clean up options: per-operation switches grouped by type, protected-region operations on JSON/code blocks, live change counts, reset to defaults, review dialog and debug inspector",
1327
+ "surface": "cleanup button popover",
1328
+ "source": "features/notes/components/cleanup/CleanupOptionsPopover.tsx:181",
1329
+ "coverage": "partial",
1330
+ "home": "window",
1331
+ "importance": "useful",
1332
+ "area": "notes",
1333
+ "closest": "Content > Cleanup (single entry, no options)"
1334
+ },
1335
+ {
1336
+ "id": "audit:15",
1337
+ "label": "Find & replace options",
1338
+ "feature": "Find & replace options: match case, whole word, regex, find everywhere across all notes (include/exclude), replace one, replace all, next/previous match (F3, Cmd+G)",
1339
+ "surface": "find bar and keyboard shortcuts",
1340
+ "source": "features/notes/components/FindReplaceBar.tsx:207",
1341
+ "coverage": "partial",
1342
+ "home": "window",
1343
+ "importance": "useful",
1344
+ "area": "notes",
1345
+ "closest": "Find & Replace (icon strip and Content)"
1346
+ },
1347
+ {
1348
+ "id": "audit:16",
1349
+ "label": "Copy as a rich note record for AI",
1350
+ "feature": "Copy as a rich note record for AI: Note with body vs Metadata only (folder, tags, context, unsaved state, save error)",
1351
+ "surface": "metadata bar copy split",
1352
+ "source": "features/notes/components/NoteMetadataBar.tsx:380",
1353
+ "coverage": "partial",
1354
+ "home": "main menu",
1355
+ "importance": "useful",
1356
+ "area": "notes",
1357
+ "closest": "Copy > For AI: Structured / With Context"
1358
+ },
1359
+ {
1360
+ "id": "audit:17",
1361
+ "label": "Copy a reference to this note for pasting in\u2026",
1362
+ "feature": "Copy a reference to this note for pasting into an agent chat",
1363
+ "surface": "note actions, phone More",
1364
+ "source": "features/notes/components/note-actions/noteActionSet.ts:75",
1365
+ "coverage": "partial",
1366
+ "home": "main menu",
1367
+ "importance": "useful",
1368
+ "area": "notes",
1369
+ "closest": "Share & Publish > Insert / Copy reference..."
1370
+ },
1371
+ {
1372
+ "id": "audit:18",
1373
+ "label": "Tags",
1374
+ "feature": "Tags: add and remove tags on a note",
1375
+ "surface": "metadata bar, phone folder and tags sheet",
1376
+ "source": "features/notes/components/NoteMetadataBar.tsx:295",
1377
+ "coverage": "partial",
1378
+ "home": "main menu",
1379
+ "importance": "rare",
1380
+ "area": "notes",
1381
+ "closest": "Organize > Tags..."
1382
+ },
1383
+ {
1384
+ "id": "audit:19",
1385
+ "label": "Sidebar list view controls",
1386
+ "feature": "Sidebar list view controls: group by Default / Folder / Recent, sort by Modified / Name / Created, ascending or descending, expand or collapse all folders",
1387
+ "surface": "notes sidebar toolbar",
1388
+ "source": "features/notes/components/NoteSidebar.tsx:159",
1389
+ "coverage": "missing",
1390
+ "home": "feature section",
1391
+ "importance": "useful",
1392
+ "area": "notes"
1393
+ },
1394
+ {
1395
+ "id": "audit:20",
1396
+ "label": "Selection mode and bulk actions on notes",
1397
+ "feature": "Selection mode and bulk actions on notes: select all, move to folder, add to knowledge base, export as Markdown, share (one note), move to Trash",
1398
+ "surface": "sidebar bulk bar",
1399
+ "source": "features/notes/components/NoteSidebarBulkBar.tsx:265",
1400
+ "coverage": "missing",
1401
+ "home": "feature section",
1402
+ "importance": "core",
1403
+ "area": "notes"
1404
+ },
1405
+ {
1406
+ "id": "audit:21",
1407
+ "label": "Copy or export the whole notes list",
1408
+ "feature": "Copy or export the whole notes list: for AI (this view or all notes), JSON, CSV (this view or all)",
1409
+ "surface": "sidebar toolbar copy and export buttons",
1410
+ "source": "features/notes/components/NoteSidebar.tsx:1497",
1411
+ "coverage": "missing",
1412
+ "home": "window",
1413
+ "importance": "useful",
1414
+ "area": "notes"
1415
+ },
1416
+ {
1417
+ "id": "audit:22",
1418
+ "label": "Refresh notes list and open tabs",
1419
+ "feature": "Refresh notes list and open tabs",
1420
+ "surface": "notes header and overflow",
1421
+ "source": "features/notes/components/NotesView.tsx:192",
1422
+ "coverage": "partial",
1423
+ "home": "feature section",
1424
+ "importance": "useful",
1425
+ "area": "notes",
1426
+ "closest": "Content > Refresh (note only, not the list or tabs)"
1427
+ },
1428
+ {
1429
+ "id": "audit:23",
1430
+ "label": "Split view",
1431
+ "feature": "Split view: open a second note beside the first, close split",
1432
+ "surface": "split note picker in header",
1433
+ "source": "features/notes/components/SplitNotePicker.tsx:77",
1434
+ "coverage": "missing",
1435
+ "home": "feature section",
1436
+ "importance": "useful",
1437
+ "area": "notes"
1438
+ },
1439
+ {
1440
+ "id": "audit:24",
1441
+ "label": "Open a note in its own floating window",
1442
+ "feature": "Open a note in its own floating window",
1443
+ "surface": "notes actions hook",
1444
+ "source": "features/notes/actions/useOpenNoteInWindow.ts",
1445
+ "coverage": "missing",
1446
+ "home": "feature section",
1447
+ "importance": "useful",
1448
+ "area": "notes"
1449
+ },
1450
+ {
1451
+ "id": "audit:25",
1452
+ "label": "Notes agents door",
1453
+ "feature": "Notes agents door (open the agents attached to the Notes feature)",
1454
+ "surface": "notes header",
1455
+ "source": "features/notes/components/NotesView.tsx:173",
1456
+ "coverage": "partial",
1457
+ "home": "feature section",
1458
+ "importance": "rare",
1459
+ "area": "notes",
1460
+ "closest": "Intelligence > Agents"
1461
+ },
1462
+ {
1463
+ "id": "audit:26",
1464
+ "label": "Recovery actions when a save fails or a conf\u2026",
1465
+ "feature": "Recovery actions when a save fails or a conflict appears: Retry save, Copy my text, Download my text, Reload; Keep mine / Take theirs / Merge; recovered draft: View, Restore, Copy, Discard, Recover as new note",
1466
+ "surface": "save failure banner, working copy alert, draft recovery banner and list",
1467
+ "source": "features/notes/components/NoteSaveFailureBanner.tsx:134",
1468
+ "coverage": "missing",
1469
+ "home": "feature section",
1470
+ "importance": "core",
1471
+ "area": "notes"
1472
+ },
1473
+ {
1474
+ "id": "audit:27",
1475
+ "label": "Read-only note",
1476
+ "feature": "Read-only note: Duplicate to edit (create own editable copy)",
1477
+ "surface": "read-only banner in editor",
1478
+ "source": "features/notes/components/NoteContentEditor.tsx:746",
1479
+ "coverage": "partial",
1480
+ "home": "feature section",
1481
+ "importance": "useful",
1482
+ "area": "notes",
1483
+ "closest": "Content > Duplicate"
1484
+ },
1485
+ {
1486
+ "id": "audit:28",
1487
+ "label": "Quick capture",
1488
+ "feature": "Quick capture: save selected text or scratch text to a new note, quick notes sheet, browse and import notes from a category",
1489
+ "surface": "save selection, save to scratch, quick note save popover, category notes modal",
1490
+ "source": "features/notes/actions/SaveSelectionButton.tsx:56",
1491
+ "coverage": "partial",
1492
+ "home": "main menu",
1493
+ "importance": "useful",
1494
+ "area": "notes",
1495
+ "closest": "Send & Convert > Notes"
1496
+ },
1497
+ {
1498
+ "id": "audit:29",
1499
+ "label": "Phone filter sheet",
1500
+ "feature": "Phone filter sheet: sort presets, filter by folder, by tags, shared-only, reset",
1501
+ "surface": "mobile notes filter sheet",
1502
+ "source": "features/notes/components/mobile/NotesFilterSheet.tsx:43",
1503
+ "coverage": "missing",
1504
+ "home": "feature section",
1505
+ "importance": "useful",
1506
+ "area": "notes"
1507
+ },
1508
+ {
1509
+ "id": "audit:30",
1510
+ "label": "Per-format content actions in the phone More\u2026",
1511
+ "feature": "Per-format content actions in the phone More sheet: Plain, PDF, Word, HTML, Markdown file, Text file, Print, Transform (opens export palette)",
1512
+ "surface": "phone More sheet",
1513
+ "source": "features/notes/components/mobile/NoteEditorDock.tsx:490",
1514
+ "coverage": "partial",
1515
+ "home": "window",
1516
+ "importance": "useful",
1517
+ "area": "notes",
1518
+ "closest": "Export & Download and Send & Convert > Convert to..."
1519
+ },
1520
+ {
1521
+ "id": "audit:31",
1522
+ "label": "Keyboard-only",
1523
+ "feature": "Keyboard-only: Ctrl/Cmd+Shift+F find everywhere, Ctrl+H or Cmd+Alt+F find and replace, F3 or Cmd+G next match, Ctrl/Cmd+W close tab",
1524
+ "surface": "note shortcuts",
1525
+ "source": "features/notes/utils/noteShortcuts.ts:60",
1526
+ "coverage": "partial",
1527
+ "home": "feature section",
1528
+ "importance": "rare",
1529
+ "area": "notes",
1530
+ "closest": "Find & Replace \u2318F and Save \u2318S only show hints"
1531
+ },
1532
+ {
1533
+ "id": "audit:32",
1534
+ "label": "Preview the file",
1535
+ "feature": "Preview the file (open the viewer)",
1536
+ "surface": "file row menu, right-click, grid/table row",
1537
+ "source": "matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:546",
1538
+ "coverage": "missing",
1539
+ "home": "feature section",
1540
+ "importance": "core",
1541
+ "area": "files"
1542
+ },
1543
+ {
1544
+ "id": "audit:33",
1545
+ "label": "Open",
1546
+ "feature": "Open (enter) a folder",
1547
+ "surface": "folder row menu / right-click",
1548
+ "source": "matrx-frontend/features/files/components/core/FolderContextMenu/FolderContextMenu.tsx:198",
1549
+ "coverage": "missing",
1550
+ "home": "feature section",
1551
+ "importance": "core",
1552
+ "area": "files"
1553
+ },
1554
+ {
1555
+ "id": "audit:34",
1556
+ "label": "Download the original file as-is",
1557
+ "feature": "Download the original file as-is (one click, no format choice)",
1558
+ "surface": "file menu, preview toolbar, image/video options, single-file header",
1559
+ "source": "matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:552",
1560
+ "coverage": "partial",
1561
+ "home": "feature section",
1562
+ "importance": "core",
1563
+ "area": "files",
1564
+ "closest": "Export & Download"
1565
+ },
1566
+ {
1567
+ "id": "audit:35",
1568
+ "label": "Open in new tab",
1569
+ "feature": "Open in new tab / Open full view (dedicated page for the file)",
1570
+ "surface": "single-file header, preview toolbar overflow, image/video options",
1571
+ "source": "matrx-frontend/features/files/components/surfaces/single-file/SingleFileActions.tsx:140",
1572
+ "coverage": "missing",
1573
+ "home": "feature section",
1574
+ "importance": "useful",
1575
+ "area": "files"
1576
+ },
1577
+ {
1578
+ "id": "audit:36",
1579
+ "label": "View full size",
1580
+ "feature": "View full size / lightbox for images and video",
1581
+ "surface": "image and video block options menu",
1582
+ "source": "matrx-frontend/features/files/blocks/image/UnifiedImageBlockRenderer.tsx:724",
1583
+ "coverage": "missing",
1584
+ "home": "feature section",
1585
+ "importance": "useful",
1586
+ "area": "files"
1587
+ },
1588
+ {
1589
+ "id": "audit:37",
1590
+ "label": "View original",
1591
+ "feature": "View original (un-processed source of an image/video)",
1592
+ "surface": "image and video block options menu",
1593
+ "source": "matrx-frontend/features/files/blocks/image/UnifiedImageBlockRenderer.tsx:811",
1594
+ "coverage": "missing",
1595
+ "home": "feature section",
1596
+ "importance": "rare",
1597
+ "area": "files"
1598
+ },
1599
+ {
1600
+ "id": "audit:38",
1601
+ "label": "Copy image to clipboard",
1602
+ "feature": "Copy image to clipboard (pixels, not link)",
1603
+ "surface": "image block options menu",
1604
+ "source": "matrx-frontend/features/files/blocks/image/UnifiedImageBlockRenderer.tsx:796",
1605
+ "coverage": "partial",
1606
+ "home": "feature section",
1607
+ "importance": "useful",
1608
+ "area": "files",
1609
+ "closest": "Copy submenu (text only)"
1610
+ },
1611
+ {
1612
+ "id": "audit:39",
1613
+ "label": "Download image as another format",
1614
+ "feature": "Download image as another format (JPEG, PNG, WebP, AVIF) with descriptions",
1615
+ "surface": "image block options menu, Download as submenu",
1616
+ "source": "matrx-frontend/features/files/blocks/image/UnifiedImageBlockRenderer.tsx:112",
1617
+ "coverage": "missing",
1618
+ "home": "window",
1619
+ "importance": "useful",
1620
+ "area": "files"
1621
+ },
1622
+ {
1623
+ "id": "audit:40",
1624
+ "label": "Resize and download image",
1625
+ "feature": "Resize and download image (Large 2048, Medium 1024, Small 512, Thumbnail 256) via server-side variant render",
1626
+ "surface": "image block options menu, Resize and download submenu",
1627
+ "source": "matrx-frontend/features/files/blocks/image/UnifiedImageBlockRenderer.tsx:140",
1628
+ "coverage": "missing",
1629
+ "home": "window",
1630
+ "importance": "useful",
1631
+ "area": "files"
1632
+ },
1633
+ {
1634
+ "id": "audit:41",
1635
+ "label": "Print an image directly",
1636
+ "feature": "Print an image directly",
1637
+ "surface": "image block options menu",
1638
+ "source": "matrx-frontend/features/files/blocks/image/UnifiedImageBlockRenderer.tsx:804",
1639
+ "coverage": "partial",
1640
+ "home": "main menu",
1641
+ "importance": "rare",
1642
+ "area": "files",
1643
+ "closest": "Print (text-oriented)"
1644
+ },
1645
+ {
1646
+ "id": "audit:42",
1647
+ "label": "Copy link to the file or folder",
1648
+ "feature": "Copy link to the file or folder (Cmd+L)",
1649
+ "surface": "file menu, folder menu, row hover buttons, preview toolbar",
1650
+ "source": "matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:556",
1651
+ "coverage": "partial",
1652
+ "home": "main menu",
1653
+ "importance": "core",
1654
+ "area": "files",
1655
+ "closest": "Share & Publish > Copy share link"
1656
+ },
1657
+ {
1658
+ "id": "audit:43",
1659
+ "label": "Copy page reference for a specific PDF page",
1660
+ "feature": "Copy page reference for a specific PDF page (submenu of pages)",
1661
+ "surface": "PDF file menu",
1662
+ "source": "matrx-frontend/features/files/components/core/FileContextMenu/FilePageReferenceMenuSub.tsx:40",
1663
+ "coverage": "partial",
1664
+ "home": "feature section",
1665
+ "importance": "useful",
1666
+ "area": "files",
1667
+ "closest": "Insert / Copy reference\u2026"
1668
+ },
1669
+ {
1670
+ "id": "audit:44",
1671
+ "label": "Set file visibility",
1672
+ "feature": "Set file visibility: Private / Shared (link) / Public",
1673
+ "surface": "file menu Visibility submenu, bulk bar, right-click",
1674
+ "source": "matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:737",
1675
+ "coverage": "partial",
1676
+ "home": "feature section",
1677
+ "importance": "core",
1678
+ "area": "files",
1679
+ "closest": "Share & Publish"
1680
+ },
1681
+ {
1682
+ "id": "audit:45",
1683
+ "label": "Set folder visibility",
1684
+ "feature": "Set folder visibility: Private / Organization / Anyone with the link / Public",
1685
+ "surface": "folder menu Visibility submenu",
1686
+ "source": "matrx-frontend/features/files/components/core/FolderContextMenu/FolderContextMenu.tsx:300",
1687
+ "coverage": "partial",
1688
+ "home": "feature section",
1689
+ "importance": "core",
1690
+ "area": "files",
1691
+ "closest": "Share & Publish"
1692
+ },
1693
+ {
1694
+ "id": "audit:46",
1695
+ "label": "Share links manager",
1696
+ "feature": "Share links manager: custom expiry, permissions, revoke; per-user/group grants (read/write/admin) with optional expiry; Who can see this; Copy public link (never expires); Copy external link",
1697
+ "surface": "file share tab and media share popover",
1698
+ "source": "aidream/apps/shared/media/src/share/media-share-popover.tsx:201",
1699
+ "coverage": "partial",
1700
+ "home": "window",
1701
+ "importance": "core",
1702
+ "area": "files",
1703
+ "closest": "Share & Publish > Share\u2026"
1704
+ },
1705
+ {
1706
+ "id": "audit:47",
1707
+ "label": "Share a folder",
1708
+ "feature": "Share a folder (share dialog) and Share folder button in folder header",
1709
+ "surface": "folder menu, folder content header",
1710
+ "source": "matrx-frontend/features/files/components/core/FolderContextMenu/FolderContextMenu.tsx:210",
1711
+ "coverage": "partial",
1712
+ "home": "feature section",
1713
+ "importance": "useful",
1714
+ "area": "files",
1715
+ "closest": "Share & Publish > Share\u2026"
1716
+ },
1717
+ {
1718
+ "id": "audit:48",
1719
+ "label": "Folder settings and permissions",
1720
+ "feature": "Folder settings and permissions",
1721
+ "surface": "folder content header",
1722
+ "source": "matrx-frontend/features/files/components/surfaces/desktop/ContentHeader.tsx:191",
1723
+ "coverage": "missing",
1724
+ "home": "feature section",
1725
+ "importance": "useful",
1726
+ "area": "files"
1727
+ },
1728
+ {
1729
+ "id": "audit:49",
1730
+ "label": "Open app",
1731
+ "feature": "Open app (open the app tied to this folder)",
1732
+ "surface": "folder content header",
1733
+ "source": "matrx-frontend/features/files/components/surfaces/desktop/ContentHeader.tsx:209",
1734
+ "coverage": "missing",
1735
+ "home": "feature section",
1736
+ "importance": "rare",
1737
+ "area": "files"
1738
+ },
1739
+ {
1740
+ "id": "audit:50",
1741
+ "label": "New folder inside this folder",
1742
+ "feature": "New folder inside this folder",
1743
+ "surface": "folder menu and New menu",
1744
+ "source": "matrx-frontend/features/files/components/core/FolderContextMenu/FolderContextMenu.tsx:261",
1745
+ "coverage": "missing",
1746
+ "home": "feature section",
1747
+ "importance": "core",
1748
+ "area": "files"
1749
+ },
1750
+ {
1751
+ "id": "audit:51",
1752
+ "label": "Folder info",
1753
+ "feature": "Folder info",
1754
+ "surface": "folder menu",
1755
+ "source": "matrx-frontend/features/files/components/core/FolderContextMenu/FolderContextMenu.tsx:282",
1756
+ "coverage": "missing",
1757
+ "home": "feature section",
1758
+ "importance": "useful",
1759
+ "area": "files"
1760
+ },
1761
+ {
1762
+ "id": "audit:52",
1763
+ "label": "Up to parent folder",
1764
+ "feature": "Up to parent folder",
1765
+ "surface": "folder content header",
1766
+ "source": "matrx-frontend/features/files/components/surfaces/desktop/ContentHeader.tsx:157",
1767
+ "coverage": "missing",
1768
+ "home": "feature section",
1769
+ "importance": "rare",
1770
+ "area": "files"
1771
+ },
1772
+ {
1773
+ "id": "audit:53",
1774
+ "label": "Show details",
1775
+ "feature": "Show details (details tab) and Info dialog (Cmd+I) for a file",
1776
+ "surface": "file menu",
1777
+ "source": "matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:655",
1778
+ "coverage": "missing",
1779
+ "home": "feature section",
1780
+ "importance": "core",
1781
+ "area": "files"
1782
+ },
1783
+ {
1784
+ "id": "audit:54",
1785
+ "label": "Show versions",
1786
+ "feature": "Show versions (version list, restore older version)",
1787
+ "surface": "file menu, Versions tab",
1788
+ "source": "matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:664",
1789
+ "coverage": "partial",
1790
+ "home": "feature section",
1791
+ "importance": "core",
1792
+ "area": "files",
1793
+ "closest": "Content > View history"
1794
+ },
1795
+ {
1796
+ "id": "audit:55",
1797
+ "label": "File context",
1798
+ "feature": "File context (what the file is for, used by agents)",
1799
+ "surface": "file menu",
1800
+ "source": "matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:633",
1801
+ "coverage": "partial",
1802
+ "home": "feature section",
1803
+ "importance": "useful",
1804
+ "area": "files",
1805
+ "closest": "Organize > Set as context"
1806
+ },
1807
+ {
1808
+ "id": "audit:56",
1809
+ "label": "Open in PDF surfaces",
1810
+ "feature": "Open in PDF surfaces (PDF Studio, reader and other registry surfaces), one entry per surface",
1811
+ "surface": "PDF file menu and right-click Open in\u2026 submenu",
1812
+ "source": "matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:573",
1813
+ "coverage": "missing",
1814
+ "home": "feature section",
1815
+ "importance": "core",
1816
+ "area": "files"
1817
+ },
1818
+ {
1819
+ "id": "audit:57",
1820
+ "label": "Edit PDF",
1821
+ "feature": "Edit PDF / Open in Studio",
1822
+ "surface": "PDF edit tab",
1823
+ "source": "matrx-frontend/features/files/components/surfaces/single-file/PdfEditTab.tsx:194",
1824
+ "coverage": "missing",
1825
+ "home": "feature section",
1826
+ "importance": "useful",
1827
+ "area": "files"
1828
+ },
1829
+ {
1830
+ "id": "audit:58",
1831
+ "label": "Extract text from a PDF",
1832
+ "feature": "Extract text from a PDF",
1833
+ "surface": "preview toolbar",
1834
+ "source": "matrx-frontend/features/files/components/core/FilePreview/preview-actions.ts:90",
1835
+ "coverage": "missing",
1836
+ "home": "window",
1837
+ "importance": "useful",
1838
+ "area": "files"
1839
+ },
1840
+ {
1841
+ "id": "audit:59",
1842
+ "label": "Convert Office document to PDF",
1843
+ "feature": "Convert Office document to PDF",
1844
+ "surface": "preview toolbar",
1845
+ "source": "matrx-frontend/features/files/components/core/FilePreview/preview-actions.ts:129",
1846
+ "coverage": "partial",
1847
+ "home": "window",
1848
+ "importance": "useful",
1849
+ "area": "files",
1850
+ "closest": "Send & Convert > Convert to\u2026"
1851
+ },
1852
+ {
1853
+ "id": "audit:60",
1854
+ "label": "Edit file in place",
1855
+ "feature": "Edit file in place (text, code, markdown, data, PDF hand-off)",
1856
+ "surface": "preview toolbar and Edit tab",
1857
+ "source": "matrx-frontend/features/files/components/core/FilePreview/preview-actions.ts:115",
1858
+ "coverage": "missing",
1859
+ "home": "feature section",
1860
+ "importance": "core",
1861
+ "area": "files"
1862
+ },
1863
+ {
1864
+ "id": "audit:61",
1865
+ "label": "Office preview mode switch",
1866
+ "feature": "Office preview mode switch (rendered vs extracted markdown), copy extracted markdown, jump to a slide",
1867
+ "surface": "Office previewer",
1868
+ "source": "matrx-frontend/features/files/components/core/FilePreview/previewers/OfficePreview.tsx:424",
1869
+ "coverage": "missing",
1870
+ "home": "window",
1871
+ "importance": "rare",
1872
+ "area": "files"
1873
+ },
1874
+ {
1875
+ "id": "audit:62",
1876
+ "label": "Open document view",
1877
+ "feature": "Open document view (pages, cleaned text, chunks, lineage)",
1878
+ "surface": "file menu and right-click",
1879
+ "source": "matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:707",
1880
+ "coverage": "missing",
1881
+ "home": "feature section",
1882
+ "importance": "core",
1883
+ "area": "files"
1884
+ },
1885
+ {
1886
+ "id": "audit:63",
1887
+ "label": "Advanced Knowledge viewer",
1888
+ "feature": "Advanced Knowledge viewer",
1889
+ "surface": "file menu",
1890
+ "source": "matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:711",
1891
+ "coverage": "missing",
1892
+ "home": "window",
1893
+ "importance": "useful",
1894
+ "area": "files"
1895
+ },
1896
+ {
1897
+ "id": "audit:64",
1898
+ "label": "Reprocess for Knowledge",
1899
+ "feature": "Reprocess for Knowledge (single and bulk; skips images, audio, video, virtual)",
1900
+ "surface": "file menu, right-click, bulk bar",
1901
+ "source": "matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:715",
1902
+ "coverage": "missing",
1903
+ "home": "feature section",
1904
+ "importance": "core",
1905
+ "area": "files"
1906
+ },
1907
+ {
1908
+ "id": "audit:65",
1909
+ "label": "Knowledge assets",
1910
+ "feature": "Knowledge assets (derived assets for this file)",
1911
+ "surface": "file menu",
1912
+ "source": "matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:719",
1913
+ "coverage": "missing",
1914
+ "home": "feature section",
1915
+ "importance": "useful",
1916
+ "area": "files"
1917
+ },
1918
+ {
1919
+ "id": "audit:66",
1920
+ "label": "Knowledge search",
1921
+ "feature": "Knowledge search (opens search page)",
1922
+ "surface": "file menu",
1923
+ "source": "matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:725",
1924
+ "coverage": "missing",
1925
+ "home": "feature section",
1926
+ "importance": "useful",
1927
+ "area": "files"
1928
+ },
1929
+ {
1930
+ "id": "audit:67",
1931
+ "label": "Process for Knowledge immediately",
1932
+ "feature": "Process for Knowledge immediately (upload-time toggle)",
1933
+ "surface": "New/upload menu",
1934
+ "source": "matrx-frontend/features/files/components/surfaces/desktop/NewMenu.tsx:232",
1935
+ "coverage": "missing",
1936
+ "home": "feature section",
1937
+ "importance": "useful",
1938
+ "area": "files"
1939
+ },
1940
+ {
1941
+ "id": "audit:68",
1942
+ "label": "Restore from Trash",
1943
+ "feature": "Restore from Trash (trash-mode only action)",
1944
+ "surface": "file menu, row menus when file is deleted",
1945
+ "source": "matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:494",
1946
+ "coverage": "partial",
1947
+ "home": "main menu",
1948
+ "importance": "core",
1949
+ "area": "files",
1950
+ "closest": "Archive (icon strip)"
1951
+ },
1952
+ {
1953
+ "id": "audit:69",
1954
+ "label": "Move to Trash with confirm",
1955
+ "feature": "Move to Trash with confirm; Backspace/Delete key, single and batch",
1956
+ "surface": "file menu, bulk bar, shortcuts",
1957
+ "source": "matrx-frontend/features/files/components/surfaces/useFileShortcuts.ts:423",
1958
+ "coverage": "partial",
1959
+ "home": "main menu",
1960
+ "importance": "core",
1961
+ "area": "files",
1962
+ "closest": "Content > Delete"
1963
+ },
1964
+ {
1965
+ "id": "audit:70",
1966
+ "label": "Batch actions on a multi-selection",
1967
+ "feature": "Batch actions on a multi-selection: N selected header, Download N, Move N, Reprocess N, Trash N, Visibility for all",
1968
+ "surface": "file menu in multi-select and bulk actions bar",
1969
+ "source": "matrx-frontend/features/files/components/surfaces/desktop/BulkActionsBar.tsx:326",
1970
+ "coverage": "missing",
1971
+ "home": "main menu",
1972
+ "importance": "core",
1973
+ "area": "files"
1974
+ },
1975
+ {
1976
+ "id": "audit:71",
1977
+ "label": "Select all",
1978
+ "feature": "Select all (Cmd+A) in the file list",
1979
+ "surface": "keyboard shortcut",
1980
+ "source": "matrx-frontend/features/files/components/surfaces/useFileShortcuts.ts:379",
1981
+ "coverage": "partial",
1982
+ "home": "main menu",
1983
+ "importance": "useful",
1984
+ "area": "files",
1985
+ "closest": "Copy > Select All"
1986
+ },
1987
+ {
1988
+ "id": "audit:72",
1989
+ "label": "Paste cut/copied files or folders into the c\u2026",
1990
+ "feature": "Paste cut/copied files or folders into the current folder (Cmd+V file clipboard)",
1991
+ "surface": "file shortcuts and folder background",
1992
+ "source": "matrx-frontend/features/files/components/surfaces/useFileShortcuts.ts:286",
1993
+ "coverage": "partial",
1994
+ "home": "feature section",
1995
+ "importance": "core",
1996
+ "area": "files",
1997
+ "closest": "Paste (text)"
1998
+ },
1999
+ {
2000
+ "id": "audit:73",
2001
+ "label": "Upload files",
2002
+ "feature": "Upload files",
2003
+ "surface": "New menu and acquisition actions",
2004
+ "source": "matrx-frontend/features/files/components/core/FileAcquisition/FileAcquisitionActions.tsx:285",
2005
+ "coverage": "missing",
2006
+ "home": "feature section",
2007
+ "importance": "core",
2008
+ "area": "files"
2009
+ },
2010
+ {
2011
+ "id": "audit:74",
2012
+ "label": "Upload a whole folder",
2013
+ "feature": "Upload a whole folder",
2014
+ "surface": "New menu and acquisition actions",
2015
+ "source": "matrx-frontend/features/files/components/core/FileAcquisition/FileAcquisitionActions.tsx:292",
2016
+ "coverage": "missing",
2017
+ "home": "feature section",
2018
+ "importance": "core",
2019
+ "area": "files"
2020
+ },
2021
+ {
2022
+ "id": "audit:75",
2023
+ "label": "Choose from existing Files",
2024
+ "feature": "Choose from existing Files (picker)",
2025
+ "surface": "acquisition actions",
2026
+ "source": "matrx-frontend/features/files/components/core/FileAcquisition/FileAcquisitionActions.tsx:299",
2027
+ "coverage": "partial",
2028
+ "home": "feature section",
2029
+ "importance": "useful",
2030
+ "area": "files",
2031
+ "closest": "Organize > Attach to\u2026"
2032
+ },
2033
+ {
2034
+ "id": "audit:76",
2035
+ "label": "Connect or Import from Google Drive",
2036
+ "feature": "Connect or Import from Google Drive",
2037
+ "surface": "acquisition actions",
2038
+ "source": "matrx-frontend/features/files/components/core/FileAcquisition/FileAcquisitionActions.tsx:244",
2039
+ "coverage": "partial",
2040
+ "home": "feature section",
2041
+ "importance": "useful",
2042
+ "area": "files",
2043
+ "closest": "Send & Convert > Google Connections"
2044
+ },
2045
+ {
2046
+ "id": "audit:77",
2047
+ "label": "Import from OneDrive, Dropbox or Box",
2048
+ "feature": "Import from OneDrive, Dropbox or Box",
2049
+ "surface": "acquisition actions",
2050
+ "source": "matrx-frontend/features/files/components/core/FileAcquisition/FileAcquisitionActions.tsx:383",
2051
+ "coverage": "missing",
2052
+ "home": "feature section",
2053
+ "importance": "useful",
2054
+ "area": "files"
2055
+ },
2056
+ {
2057
+ "id": "audit:78",
2058
+ "label": "Create new Word, PowerPoint or Excel documen\u2026",
2059
+ "feature": "Create new Word, PowerPoint or Excel document with AI (AI document submenu)",
2060
+ "surface": "New menu",
2061
+ "source": "matrx-frontend/features/files/components/surfaces/desktop/NewMenu.tsx:72",
2062
+ "coverage": "partial",
2063
+ "home": "feature section",
2064
+ "importance": "useful",
2065
+ "area": "files",
2066
+ "closest": "Intelligence > Send to agent\u2026"
2067
+ },
2068
+ {
2069
+ "id": "audit:79",
2070
+ "label": "Switch file viewer tab",
2071
+ "feature": "Switch file viewer tab: Preview, Edit, Knowledge, Analysis, Share, Info, Versions",
2072
+ "surface": "file tabs radio menu",
2073
+ "source": "matrx-frontend/features/files/components/surfaces/FileTabsBody.tsx:104",
2074
+ "coverage": "missing",
2075
+ "home": "feature section",
2076
+ "importance": "core",
2077
+ "area": "files"
2078
+ },
2079
+ {
2080
+ "id": "audit:80",
2081
+ "label": "Analysis tab for a file",
2082
+ "feature": "Analysis tab for a file",
2083
+ "surface": "file tabs",
2084
+ "source": "matrx-frontend/features/files/components/surfaces/FileTabsBody.tsx:114",
2085
+ "coverage": "missing",
2086
+ "home": "window",
2087
+ "importance": "useful",
2088
+ "area": "files"
2089
+ },
2090
+ {
2091
+ "id": "audit:81",
2092
+ "label": "View mode toggle",
2093
+ "feature": "View mode toggle (List / Grid), Show filter (Both / Folders / Files), sidebar view (Flat folders / Folder tree)",
2094
+ "surface": "files toolbar toggles",
2095
+ "source": "matrx-frontend/features/files/components/surfaces/desktop/ViewModeToggle.tsx:23",
2096
+ "coverage": "missing",
2097
+ "home": "feature section",
2098
+ "importance": "useful",
2099
+ "area": "files"
2100
+ },
2101
+ {
2102
+ "id": "audit:82",
2103
+ "label": "Storage usage popover",
2104
+ "feature": "Storage usage popover: storage, file count, today's uploads, max file size",
2105
+ "surface": "storage quota chip",
2106
+ "source": "matrx-frontend/features/files/components/surfaces/desktop/StorageQuotaChip.tsx:237",
2107
+ "coverage": "missing",
2108
+ "home": "feature section",
2109
+ "importance": "useful",
2110
+ "area": "files"
2111
+ },
2112
+ {
2113
+ "id": "audit:83",
2114
+ "label": "Device folder sync",
2115
+ "feature": "Device folder sync: change direction (radio), use files for knowledge toggle, Stop syncing this folder (with consequence confirm)",
2116
+ "surface": "device sync mapping row menu",
2117
+ "source": "matrx-frontend/features/files/devices/components/MappingRow.tsx:254",
2118
+ "coverage": "missing",
2119
+ "home": "feature section",
2120
+ "importance": "useful",
2121
+ "area": "files"
2122
+ },
2123
+ {
2124
+ "id": "audit:84",
2125
+ "label": "Remote device files panel",
2126
+ "feature": "Remote device files panel: New folder, Upload, Refresh, Show hidden toggle, Undo, Move to Trash",
2127
+ "surface": "device console files panel folder actions menu",
2128
+ "source": "matrx-frontend/features/files/devices/console/FilesPanel.tsx:305",
2129
+ "coverage": "missing",
2130
+ "home": "feature section",
2131
+ "importance": "useful",
2132
+ "area": "files"
2133
+ },
2134
+ {
2135
+ "id": "audit:85",
2136
+ "label": "Fleet sync health",
2137
+ "feature": "Fleet sync health (accounts over quota, mappings stopped or degraded, devices behind)",
2138
+ "surface": "sync fleet admin page",
2139
+ "source": "matrx-frontend/features/files/devices/admin/SyncFleetClient.tsx:300",
2140
+ "coverage": "missing",
2141
+ "home": "main menu",
2142
+ "importance": "rare",
2143
+ "area": "files"
2144
+ },
2145
+ {
2146
+ "id": "audit:86",
2147
+ "label": "Audio player controls",
2148
+ "feature": "Audio player controls: skip back/forward 10s, mute, volume, loop",
2149
+ "surface": "audio previewer",
2150
+ "source": "matrx-frontend/features/files/components/core/FilePreview/previewers/AudioPreview.tsx:370",
2151
+ "coverage": "missing",
2152
+ "home": "feature section",
2153
+ "importance": "rare",
2154
+ "area": "files"
2155
+ },
2156
+ {
2157
+ "id": "audit:87",
2158
+ "label": "Media lightbox actions",
2159
+ "feature": "Media lightbox actions: Share, Download, Copy, Open in the shared media toolbar",
2160
+ "surface": "shared media action toolbar and lightbox",
2161
+ "source": "aidream/apps/shared/media/src/react/media-action-toolbar.tsx:36",
2162
+ "coverage": "partial",
2163
+ "home": "feature section",
2164
+ "importance": "useful",
2165
+ "area": "files",
2166
+ "closest": "Share & Publish / Export & Download"
2167
+ },
2168
+ {
2169
+ "id": "audit:88",
2170
+ "label": "Linked to",
2171
+ "feature": "Linked to: attach and detach this file to other records (search to attach, detach edge)",
2172
+ "surface": "media share popover",
2173
+ "source": "aidream/apps/shared/media/src/share/media-share-popover.tsx:492",
2174
+ "coverage": "partial",
2175
+ "home": "main menu",
2176
+ "importance": "useful",
2177
+ "area": "files",
2178
+ "closest": "Organize > Attach to\u2026"
2179
+ },
2180
+ {
2181
+ "id": "audit:89",
2182
+ "label": "Markup Rendered vs Source toggle in shared v\u2026",
2183
+ "feature": "Markup Rendered vs Source toggle in shared viewers",
2184
+ "surface": "shared media viewers chrome",
2185
+ "source": "aidream/apps/shared/media/src/viewers/markup-chrome.tsx:58",
2186
+ "coverage": "missing",
2187
+ "home": "feature section",
2188
+ "importance": "rare",
2189
+ "area": "files"
2190
+ },
2191
+ {
2192
+ "id": "audit:90",
2193
+ "label": "Remove file from a chip or attachment",
2194
+ "feature": "Remove file from a chip or attachment",
2195
+ "surface": "file resource chip in chat/attachments",
2196
+ "source": "matrx-frontend/features/files/components/preview/FileResourceChip.tsx:176",
2197
+ "coverage": "missing",
2198
+ "home": "feature section",
2199
+ "importance": "useful",
2200
+ "area": "files"
2201
+ },
2202
+ {
2203
+ "id": "audit:91",
2204
+ "label": "Import selected Google Drive file into Files\u2026",
2205
+ "feature": "Import selected Google Drive file into Files with chosen destination path; search Drive by name or link",
2206
+ "surface": "Google Drive library page",
2207
+ "source": "matrx-frontend/features/files/google-drive/GoogleDriveLibrary.tsx:605",
2208
+ "coverage": "missing",
2209
+ "home": "window",
2210
+ "importance": "useful",
2211
+ "area": "files"
2212
+ },
2213
+ {
2214
+ "id": "audit:92",
2215
+ "label": "Star a file or folder",
2216
+ "feature": "Star a file or folder (currently disabled, Coming soon)",
2217
+ "surface": "row and grid hover buttons",
2218
+ "source": "matrx-frontend/features/files/components/surfaces/desktop/FileTableRow.tsx:486",
2219
+ "coverage": "partial",
2220
+ "home": "main menu",
2221
+ "importance": "rare",
2222
+ "area": "files",
2223
+ "closest": "Organize > Pin"
2224
+ },
2225
+ {
2226
+ "id": "audit:93",
2227
+ "label": "Virtual-source",
2228
+ "feature": "Virtual-source (Drive/library) items: reduced menu where Copy, Duplicate, Share, Visibility are hidden but Cut and Move remain",
2229
+ "surface": "all file and folder menus for virtual sources",
2230
+ "source": "matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:549",
2231
+ "coverage": "missing",
2232
+ "home": "feature section",
2233
+ "importance": "useful",
2234
+ "area": "files"
2235
+ },
2236
+ {
2237
+ "id": "audit:94",
2238
+ "label": "Camera capture",
2239
+ "feature": "Camera capture / hold-to-record shutter for adding photos or video",
2240
+ "surface": "capture package HoldShutter",
2241
+ "source": "aidream/apps/shared/capture/src/components/HoldShutter.tsx",
2242
+ "coverage": "missing",
2243
+ "home": "feature section",
2244
+ "importance": "rare",
2245
+ "area": "files"
2246
+ },
2247
+ {
2248
+ "id": "audit:95",
2249
+ "label": "Format Document",
2250
+ "feature": "Format Document (and Format Selection when text is selected) in the code editor",
2251
+ "surface": "code editor right-click (Editor section)",
2252
+ "source": "matrx-frontend/features/code/agent-context/codeEditorExtraSections.ts:75-90",
2253
+ "coverage": "missing",
2254
+ "home": "feature section",
2255
+ "importance": "core",
2256
+ "area": "documents"
2257
+ },
2258
+ {
2259
+ "id": "audit:96",
2260
+ "label": "Go to Line\u2026",
2261
+ "feature": "Go to Line\u2026",
2262
+ "surface": "code editor right-click (Editor section)",
2263
+ "source": "matrx-frontend/features/code/agent-context/codeEditorExtraSections.ts:102",
2264
+ "coverage": "missing",
2265
+ "home": "feature section",
2266
+ "importance": "useful",
2267
+ "area": "documents"
2268
+ },
2269
+ {
2270
+ "id": "audit:97",
2271
+ "label": "Toggle Word Wrap",
2272
+ "feature": "Toggle Word Wrap (a toggle in the menu)",
2273
+ "surface": "code editor right-click; also a toggle in the diff viewer toolbar",
2274
+ "source": "matrx-frontend/features/code/agent-context/codeEditorExtraSections.ts:110; aidream/apps/shared/diff/src/react/TextDiff.tsx:420",
2275
+ "coverage": "missing",
2276
+ "home": "feature section",
2277
+ "importance": "useful",
2278
+ "area": "documents"
2279
+ },
2280
+ {
2281
+ "id": "audit:98",
2282
+ "label": "Command Palette\u2026",
2283
+ "feature": "Command Palette\u2026 (F1)",
2284
+ "surface": "code editor right-click",
2285
+ "source": "matrx-frontend/features/code/agent-context/codeEditorExtraSections.ts:120",
2286
+ "coverage": "missing",
2287
+ "home": "feature section",
2288
+ "importance": "useful",
2289
+ "area": "documents"
2290
+ },
2291
+ {
2292
+ "id": "audit:99",
2293
+ "label": "Attach file to chat",
2294
+ "feature": "Attach file to chat / Attach selection to chat (selection one only enabled when text is selected), plus the Cmd+Shift+L send-selection shortcut",
2295
+ "surface": "code editor right-click (Chat context section)",
2296
+ "source": "matrx-frontend/features/code/agent-context/codeEditorExtraSections.ts:46-62; features/code/editor/MonacoEditor.tsx:217",
2297
+ "coverage": "partial",
2298
+ "home": "feature section",
2299
+ "importance": "core",
2300
+ "area": "chat",
2301
+ "closest": "Intelligence > Chat about this / Send to agent (no way to attach just the selection or the whole file as chat context)"
2302
+ },
2303
+ {
2304
+ "id": "audit:100",
2305
+ "label": "Save and open in the code editor",
2306
+ "feature": "Save and open in the code editor: Save to Code, and from a chat code block 'Open in code editor'",
2307
+ "surface": "rich-document actions (Save submenu; code block actions)",
2308
+ "source": "matrx-frontend/features/rich-document/actions/handlers/save.ts:228; handlers/answer-tools.ts:160",
2309
+ "coverage": "partial",
2310
+ "home": "main menu",
2311
+ "importance": "core",
2312
+ "area": "documents",
2313
+ "closest": "Send & Convert (Notes, Task, Project, Custom data) has no code destination"
2314
+ },
2315
+ {
2316
+ "id": "audit:101",
2317
+ "label": "Code block",
2318
+ "feature": "Code block: Apply to the open file (with an Undo toast), Run the code, Chart this data",
2319
+ "surface": "code block menu inside rendered content",
2320
+ "source": "matrx-frontend/features/rich-document/actions/handlers/answer-tools.ts:204,249,283",
2321
+ "coverage": "missing",
2322
+ "home": "feature section",
2323
+ "importance": "core",
2324
+ "area": "documents"
2325
+ },
2326
+ {
2327
+ "id": "audit:102",
2328
+ "label": "Save code to Scratch",
2329
+ "feature": "Save code to Scratch (only when the content is code)",
2330
+ "surface": "rich-document Save submenu",
2331
+ "source": "matrx-frontend/features/rich-document/actions/handlers/save.ts:173",
2332
+ "coverage": "missing",
2333
+ "home": "feature section",
2334
+ "importance": "useful",
2335
+ "area": "documents"
2336
+ },
2337
+ {
2338
+ "id": "audit:103",
2339
+ "label": "Replace",
2340
+ "feature": "Replace (selection) and Insert below: write an AI answer back into the text it came from; Apply to source",
2341
+ "surface": "rich-document write-back actions (chat answer / agent window)",
2342
+ "source": "matrx-frontend/features/rich-document/actions/handlers/write-back.ts:50,62; handlers/ai.ts:121",
2343
+ "coverage": "missing",
2344
+ "home": "feature section",
2345
+ "importance": "core",
2346
+ "area": "chat"
2347
+ },
2348
+ {
2349
+ "id": "audit:104",
2350
+ "label": "Save an agent run as a shortcut",
2351
+ "feature": "Save an agent run as a shortcut; Bind a run to this page",
2352
+ "surface": "rich-document AI group",
2353
+ "source": "matrx-frontend/features/rich-document/actions/handlers/ai.ts:167,192",
2354
+ "coverage": "missing",
2355
+ "home": "feature section",
2356
+ "importance": "useful",
2357
+ "area": "documents"
2358
+ },
2359
+ {
2360
+ "id": "audit:105",
2361
+ "label": "Clean up",
2362
+ "feature": "Clean up / Help with this\u2026 / Custom agent\u2026 (text-field AI powers, shown only when the host supports text agents)",
2363
+ "surface": "rich-document AI group; text field menus",
2364
+ "source": "matrx-frontend/features/rich-document/actions/handlers/ai.ts:39-83",
2365
+ "coverage": "partial",
2366
+ "home": "main menu",
2367
+ "importance": "core",
2368
+ "area": "documents",
2369
+ "closest": "Content > Cleanup; Help me with this; Send to agent\u2026 (no free-form Custom agent run with review and apply)"
2370
+ },
2371
+ {
2372
+ "id": "audit:106",
2373
+ "label": "Open in full-screen editor",
2374
+ "feature": "Open in full-screen editor",
2375
+ "surface": "rich-document Edit submenu",
2376
+ "source": "matrx-frontend/features/rich-document/actions/handlers/fullscreen-editor.ts:18",
2377
+ "coverage": "missing",
2378
+ "home": "main menu",
2379
+ "importance": "core",
2380
+ "area": "documents"
2381
+ },
2382
+ {
2383
+ "id": "audit:107",
2384
+ "label": "Edit this content in place",
2385
+ "feature": "Edit this content in place (edit) and Edit history",
2386
+ "surface": "rich-document Edit submenu",
2387
+ "source": "matrx-frontend/features/rich-document/actions/handlers/edit.ts:37,182",
2388
+ "coverage": "partial",
2389
+ "home": "main menu",
2390
+ "importance": "core",
2391
+ "area": "documents",
2392
+ "closest": "Content > View history (history only, no edit entry, no per-message edit history)"
2393
+ },
2394
+ {
2395
+ "id": "audit:108",
2396
+ "label": "Compare with base",
2397
+ "feature": "Compare with base (the third compare verb: run the diff against the saved base)",
2398
+ "surface": "rich-document Compare submenu",
2399
+ "source": "matrx-frontend/features/rich-document/actions/handlers/compare.ts:113",
2400
+ "coverage": "partial",
2401
+ "home": "window",
2402
+ "importance": "useful",
2403
+ "area": "documents",
2404
+ "closest": "Compare: Set as compare base, Compare with clipboard, Open Compare Window"
2405
+ },
2406
+ {
2407
+ "id": "audit:109",
2408
+ "label": "Alchemy palette",
2409
+ "feature": "Alchemy palette (formatted, JSON, every format, send-to) opened from the overflow menu as 'Alchemy\u2026'",
2410
+ "surface": "rich-document overflow menu where a bar is mounted",
2411
+ "source": "aidream/apps/shared/rich-content/src/rich-document/actions/export-palette-action.ts:19",
2412
+ "coverage": "missing",
2413
+ "home": "window",
2414
+ "importance": "core",
2415
+ "area": "documents"
2416
+ },
2417
+ {
2418
+ "id": "audit:110",
2419
+ "label": "Publish HTML",
2420
+ "feature": "Publish HTML (html-preview) and Copy HTML page / Copy HTML source / Download as HTML page",
2421
+ "surface": "rich-document Export and Copy as submenus",
2422
+ "source": "matrx-frontend/features/rich-document/actions/handlers/export.ts:20,103; handlers/transfer.ts:82,201",
2423
+ "coverage": "partial",
2424
+ "home": "window",
2425
+ "importance": "useful",
2426
+ "area": "documents",
2427
+ "closest": "Copy > As HTML page; Export > HTML; Publish as web page (no copy of raw HTML source, no HTML preview)"
2428
+ },
2429
+ {
2430
+ "id": "audit:111",
2431
+ "label": "Send to Google Doc",
2432
+ "feature": "Send to Google Doc; Email to me",
2433
+ "surface": "rich-document Export submenu",
2434
+ "source": "matrx-frontend/features/rich-document/actions/handlers/share.ts:81; handlers/export.ts:136",
2435
+ "coverage": "partial",
2436
+ "home": "main menu",
2437
+ "importance": "useful",
2438
+ "area": "documents",
2439
+ "closest": "Send & Convert > Email, Google Connections"
2440
+ },
2441
+ {
2442
+ "id": "audit:112",
2443
+ "label": "Full print",
2444
+ "feature": "Full print (print with options) in addition to plain Print / Save PDF",
2445
+ "surface": "rich-document Export submenu",
2446
+ "source": "matrx-frontend/features/rich-document/actions/handlers/print.ts:15,42",
2447
+ "coverage": "partial",
2448
+ "home": "window",
2449
+ "importance": "rare",
2450
+ "area": "documents",
2451
+ "closest": "Export & Download > Print"
2452
+ },
2453
+ {
2454
+ "id": "audit:113",
2455
+ "label": "Save as PDF document into Files",
2456
+ "feature": "Save as PDF document into Files; Save to Files; Save to Document; Save to Scratch",
2457
+ "surface": "rich-document Save submenu",
2458
+ "source": "matrx-frontend/features/rich-document/actions/handlers/capture.ts:174,221; handlers/save.ts:99,289",
2459
+ "coverage": "partial",
2460
+ "home": "main menu",
2461
+ "importance": "core",
2462
+ "area": "files",
2463
+ "closest": "Send & Convert > Notes, Task, Project, Custom data (no Files, Document or Scratch destinations)"
2464
+ },
2465
+ {
2466
+ "id": "audit:114",
2467
+ "label": "Add to Rulebook",
2468
+ "feature": "Add to Rulebook; Set Context Value; Save as Message Template; Save to my Shapes (when the content holds a kind block); Save as contact (when it looks like a contact)",
2469
+ "surface": "rich-document Save/capture rows",
2470
+ "source": "matrx-frontend/features/rich-document/actions/handlers/capture.ts:75,113,142,282; handlers/contact.ts:28",
2471
+ "coverage": "partial",
2472
+ "home": "main menu",
2473
+ "importance": "useful",
2474
+ "area": "files",
2475
+ "closest": "Organize > Set as context; Intelligence > AI Resources (Content blocks, Kind Shapes)"
2476
+ },
2477
+ {
2478
+ "id": "audit:115",
2479
+ "label": "Convert to flashcards",
2480
+ "feature": "Convert to flashcards / quiz; Save as flashcard",
2481
+ "surface": "rich-document Save submenu",
2482
+ "source": "matrx-frontend/features/rich-document/actions/handlers/capture.ts:378,408",
2483
+ "coverage": "partial",
2484
+ "home": "window",
2485
+ "importance": "useful",
2486
+ "area": "files",
2487
+ "closest": "Send & Convert > Convert to\u2026"
2488
+ },
2489
+ {
2490
+ "id": "audit:116",
2491
+ "label": "Summarize & listen",
2492
+ "feature": "Summarize & listen; Summarize without playing",
2493
+ "surface": "rich-document promoted rows",
2494
+ "source": "matrx-frontend/features/rich-document/actions/handlers/listen.ts:74,87",
2495
+ "coverage": "partial",
2496
+ "home": "main menu",
2497
+ "importance": "useful",
2498
+ "area": "documents",
2499
+ "closest": "Listen & Speak > Condense & Read"
2500
+ },
2501
+ {
2502
+ "id": "audit:117",
2503
+ "label": "Helpful",
2504
+ "feature": "Helpful / Not helpful thumbs (with undo of the verdict), shown on chat messages, notes, artifacts, working documents",
2505
+ "surface": "rich-document primary actions",
2506
+ "source": "matrx-frontend/features/rich-document/actions/handlers/feedback.ts:80,95",
2507
+ "coverage": "missing",
2508
+ "home": "feature section",
2509
+ "importance": "core",
2510
+ "area": "documents"
2511
+ },
2512
+ {
2513
+ "id": "audit:118",
2514
+ "label": "Attach artifact to chat",
2515
+ "feature": "Attach artifact to chat",
2516
+ "surface": "rich-document, artifact sources only",
2517
+ "source": "matrx-frontend/features/rich-document/actions/handlers/attach-to-chat.ts:16",
2518
+ "coverage": "partial",
2519
+ "home": "feature section",
2520
+ "importance": "useful",
2521
+ "area": "chat",
2522
+ "closest": "Organize > Attach to\u2026"
2523
+ },
2524
+ {
2525
+ "id": "audit:119",
2526
+ "label": "Copy table as CSV or TSV for a spreadsheet",
2527
+ "feature": "Copy table as CSV or TSV for a spreadsheet; Save table to a table / workbook / Google Sheet (Save to menu on a rendered table)",
2528
+ "surface": "rich-document Copy as submenu; rendered-table 'Save this table to\u2026' menu",
2529
+ "source": "matrx-frontend/features/rich-document/actions/handlers/transfer.ts:101,119,167; aidream/apps/shared/rich-content/src/display/tables/TableSaveToMenu.tsx:98-115",
2530
+ "coverage": "partial",
2531
+ "home": "feature section",
2532
+ "importance": "core",
2533
+ "area": "documents",
2534
+ "closest": "Copy > Data: Copy as JSON; Send & Convert > Custom data"
2535
+ },
2536
+ {
2537
+ "id": "audit:120",
2538
+ "label": "Rendered table Export menu",
2539
+ "feature": "Rendered table Export menu: Copy as Text, Copy as Markdown, Copy as JSON, Download CSV, Download Markdown",
2540
+ "surface": "table 'Export' dropdown (MarkdownTable, TableWithSeparatedControls, StreamingTableRenderer)",
2541
+ "source": "aidream/apps/shared/rich-content/src/display/tables/MarkdownTable.tsx:160-200",
2542
+ "coverage": "partial",
2543
+ "home": "feature section",
2544
+ "importance": "core",
2545
+ "area": "documents",
2546
+ "closest": "Copy > Copy as JSON; Export & Download (no CSV)"
2547
+ },
2548
+ {
2549
+ "id": "audit:121",
2550
+ "label": "Table row and column editing",
2551
+ "feature": "Table row and column editing: insert above/below/left/right, duplicate row/column, clear row/column, delete row/column",
2552
+ "surface": "row and column action menus on editable rendered tables",
2553
+ "source": "aidream/apps/shared/rich-content/src/display/tables/editing/RowActionsMenu.tsx:60-83; ColumnActionsMenu.tsx:60-83",
2554
+ "coverage": "missing",
2555
+ "home": "feature section",
2556
+ "importance": "core",
2557
+ "area": "documents"
2558
+ },
2559
+ {
2560
+ "id": "audit:122",
2561
+ "label": "Table",
2562
+ "feature": "Table: choose visible columns (hide/show), 'show all' on hidden columns",
2563
+ "surface": "streaming table toolbar",
2564
+ "source": "aidream/apps/shared/rich-content/src/display/blocks/table/StreamingTableRenderer.tsx:986-1023",
2565
+ "coverage": "missing",
2566
+ "home": "feature section",
2567
+ "importance": "useful",
2568
+ "area": "documents"
2569
+ },
2570
+ {
2571
+ "id": "audit:123",
2572
+ "label": "Rich editor table menu",
2573
+ "feature": "Rich editor table menu: add row above/below, add column left/right, toggle header row, delete row, delete column, delete table; align column left/center/right",
2574
+ "surface": "rich editor table handle and bubble",
2575
+ "source": "aidream/apps/shared/rich-editor/src/visual/table-menu.ts:23-30; visual/format-actions.ts:145-147",
2576
+ "coverage": "missing",
2577
+ "home": "feature section",
2578
+ "importance": "core",
2579
+ "area": "documents"
2580
+ },
2581
+ {
2582
+ "id": "audit:124",
2583
+ "label": "Rich editor block handle",
2584
+ "feature": "Rich editor block handle: Move up, Move down, Turn into text/heading 1/heading 2/bulleted list/numbered list/checklist/quote, Delete block (drag to reorder)",
2585
+ "surface": "rich editor block grip menu (desktop)",
2586
+ "source": "aidream/apps/shared/rich-editor/src/visual/BlockHandle.tsx:139-179",
2587
+ "coverage": "missing",
2588
+ "home": "feature section",
2589
+ "importance": "core",
2590
+ "area": "documents"
2591
+ },
2592
+ {
2593
+ "id": "audit:125",
2594
+ "label": "Rich editor formatting",
2595
+ "feature": "Rich editor formatting: Bold, Italic, Strikethrough, Inline code, lists, Checklist, Quote, Link, Code block, Table, Horizontal rule, Image, Text style (Normal/H1/H2/H3)",
2596
+ "surface": "formatting toolbar and its More menu",
2597
+ "source": "aidream/apps/shared/rich-editor/src/format/FormatButtons.tsx:84-106",
2598
+ "coverage": "missing",
2599
+ "home": "feature section",
2600
+ "importance": "core",
2601
+ "area": "documents"
2602
+ },
2603
+ {
2604
+ "id": "audit:126",
2605
+ "label": "Prompt Insert menu",
2606
+ "feature": "Prompt Insert menu: insert a {{variable}}, a section tag, an example, a kind block, a context-item reference; add variable / add context item",
2607
+ "surface": "prompt editor Insert menu",
2608
+ "source": "aidream/apps/shared/rich-editor/src/format/PromptInsertMenu.tsx:105-210",
2609
+ "coverage": "partial",
2610
+ "home": "feature section",
2611
+ "importance": "core",
2612
+ "area": "documents",
2613
+ "closest": "Intelligence > AI Resources (Content blocks, Kind Shapes)"
2614
+ },
2615
+ {
2616
+ "id": "audit:127",
2617
+ "label": "Rich editor tools",
2618
+ "feature": "Rich editor tools: switch view (Visual, Split, Source, Preview), Focus mode, show protected blocks as source, Keyboard shortcuts, word count",
2619
+ "surface": "rich editor toolbar and its More tools menu",
2620
+ "source": "aidream/apps/shared/rich-editor/src/editor/RichEditorImpl.tsx:717-723,865-912",
2621
+ "coverage": "partial",
2622
+ "home": "feature section",
2623
+ "importance": "core",
2624
+ "area": "documents",
2625
+ "closest": "Content > Outline; Listen & Speak > Dictate (view switching, focus mode, shortcuts help not present)"
2626
+ },
2627
+ {
2628
+ "id": "audit:128",
2629
+ "label": "Mermaid diagram",
2630
+ "feature": "Mermaid diagram: choose theme, style (Classic/Hand-drawn), layout; Save as my default style",
2631
+ "surface": "diagram style dropdown",
2632
+ "source": "aidream/apps/shared/rich-content/src/display/blocks/mermaid/MermaidBlock.tsx:346-400",
2633
+ "coverage": "missing",
2634
+ "home": "window",
2635
+ "importance": "useful",
2636
+ "area": "documents"
2637
+ },
2638
+ {
2639
+ "id": "audit:129",
2640
+ "label": "Mermaid diagram",
2641
+ "feature": "Mermaid diagram: Download SVG, Download PNG, Download source (.mmd), Save to my files, Copy source, Show/Hide source, View fullscreen, Open in canvas",
2642
+ "surface": "diagram toolbar",
2643
+ "source": "aidream/apps/shared/rich-content/src/display/blocks/mermaid/MermaidBlock.tsx:407-470",
2644
+ "coverage": "partial",
2645
+ "home": "window",
2646
+ "importance": "useful",
2647
+ "area": "documents",
2648
+ "closest": "Export & Download (Markdown/Word/HTML/PDF only); Custom Export"
2649
+ },
2650
+ {
2651
+ "id": "audit:130",
2652
+ "label": "Interactive diagram editor",
2653
+ "feature": "Interactive diagram editor: Add box, Add section, line style (solid/dashed/dotted), edit nodes",
2654
+ "surface": "interactive diagram block toolbar",
2655
+ "source": "aidream/apps/shared/rich-content/src/display/blocks/diagram/InteractiveDiagramBlock.tsx:1982-2034",
2656
+ "coverage": "missing",
2657
+ "home": "window",
2658
+ "importance": "useful",
2659
+ "area": "documents"
2660
+ },
2661
+ {
2662
+ "id": "audit:131",
2663
+ "label": "Diff review",
2664
+ "feature": "Diff review: Previous change, Next change, Accept all, Reject all, Reset, per-change Accept / Reject / Undo, expand hidden unchanged lines, Apply, Cancel",
2665
+ "surface": "diff review toolbar and hunk buttons",
2666
+ "source": "aidream/apps/shared/diff/src/react/DiffReview.tsx:382-431,514,561-623",
2667
+ "coverage": "missing",
2668
+ "home": "window",
2669
+ "importance": "core",
2670
+ "area": "documents"
2671
+ },
2672
+ {
2673
+ "id": "audit:132",
2674
+ "label": "Diff viewer",
2675
+ "feature": "Diff viewer: view mode (Highlight/Split/Inline), Swap sides, toggle line numbers, toggle collapsing of unchanged lines",
2676
+ "surface": "text diff toolbar",
2677
+ "source": "aidream/apps/shared/diff/src/react/TextDiff.tsx:333-446",
2678
+ "coverage": "missing",
2679
+ "home": "window",
2680
+ "importance": "useful",
2681
+ "area": "documents"
2682
+ },
2683
+ {
2684
+ "id": "audit:133",
2685
+ "label": "Code workspace diff",
2686
+ "feature": "Code workspace diff: Accept / Reject this edit, previous/next file with pending changes, Monaco per-hunk mode",
2687
+ "surface": "editor tab diff banner",
2688
+ "source": "matrx-frontend/features/code/editor/TabDiffView.tsx:465-545,658",
2689
+ "coverage": "missing",
2690
+ "home": "window",
2691
+ "importance": "core",
2692
+ "area": "documents"
2693
+ },
2694
+ {
2695
+ "id": "audit:134",
2696
+ "label": "Code tab conflict and safety prompts",
2697
+ "feature": "Code tab conflict and safety prompts: Reload / Overwrite on external change, copy to connected sandbox, discard unsaved changes, open live preview",
2698
+ "surface": "code editor tabs",
2699
+ "source": "matrx-frontend/features/code/editor/EditorArea.tsx:346-364,558; EditorTab.tsx:80",
2700
+ "coverage": "missing",
2701
+ "home": "feature section",
2702
+ "importance": "useful",
2703
+ "area": "documents"
2704
+ },
2705
+ {
2706
+ "id": "audit:135",
2707
+ "label": "Code file tree menu",
2708
+ "feature": "Code file tree menu: Open, Properties\u2026, New file, New folder, Download, Rename (F2), Delete, Copy path, Refresh; and Copy tab id / Refresh source for library entries",
2709
+ "surface": "code explorer and Code Library right-click",
2710
+ "source": "matrx-frontend/features/code/views/explorer/FileTreeNode.tsx:436-499; features/code-files/file-menu.tsx:80-136; features/code/views/library/SourceEntryNode.tsx:160-190",
2711
+ "coverage": "partial",
2712
+ "home": "feature section",
2713
+ "importance": "core",
2714
+ "area": "files",
2715
+ "closest": "Content > Rename, Delete, Duplicate, Refresh; Copy"
2716
+ },
2717
+ {
2718
+ "id": "audit:136",
2719
+ "label": "Sandbox row menu",
2720
+ "feature": "Sandbox row menu: Open sandbox details, Extend 1 hour, Stop, Rebuild container, Delete sandbox",
2721
+ "surface": "code workspace Sandboxes panel '\u2026' menu",
2722
+ "source": "matrx-frontend/features/code/views/sandboxes/SandboxesPanel.tsx:1132-1155",
2723
+ "coverage": "missing",
2724
+ "home": "feature section",
2725
+ "importance": "useful",
2726
+ "area": "documents"
2727
+ },
2728
+ {
2729
+ "id": "audit:137",
2730
+ "label": "Conversation section on a chat answer",
2731
+ "feature": "Conversation section on a chat answer: Find in conversation, Pinned only, Share conversation, Copy conversation link, Rename, Duplicate",
2732
+ "surface": "rich-document Conversation submenu",
2733
+ "source": "matrx-frontend/features/rich-document/actions/handlers/conversation-section.ts:70-183",
2734
+ "coverage": "partial",
2735
+ "home": "feature section",
2736
+ "importance": "core",
2737
+ "area": "chat",
2738
+ "closest": "Share & Publish; Content > Rename, Duplicate (these act on the clicked content, not the whole conversation)"
2739
+ },
2740
+ {
2741
+ "id": "audit:138",
2742
+ "label": "Chat answer actions",
2743
+ "feature": "Chat answer actions: Continue in chat mode, Regenerate answer, Pin message, Ask a follow-up about this, Quote into chat, Edit and resubmit, Fork at this message, Fork and regenerate, Delete message, Copy with thinking",
2744
+ "surface": "rich-document chat message rows",
2745
+ "source": "matrx-frontend/features/rich-document/actions/handlers/chat.ts:33; answer-tools.ts:47,119; ask.ts:69,88; edit.ts:209,284,308,381; copy.ts:34",
2746
+ "coverage": "partial",
2747
+ "home": "feature section",
2748
+ "importance": "core",
2749
+ "area": "chat",
2750
+ "closest": "Intelligence > Chat about this; Organize > Pin; Content > Delete"
2751
+ },
2752
+ {
2753
+ "id": "audit:139",
2754
+ "label": "Creator and admin tools",
2755
+ "feature": "Creator and admin tools: Analyze response, Debug stream, and the server-API admin family (fork at/before, hide from model, move to Trash this or this-and-after, dry run, replace with summary, restore compaction)",
2756
+ "surface": "rich-document Creator tools submenu",
2757
+ "source": "matrx-frontend/features/rich-document/actions/handlers/creator.ts:12,43; handlers/server-api.ts:45-366",
2758
+ "coverage": "partial",
2759
+ "home": "feature section",
2760
+ "importance": "useful",
2761
+ "area": "documents",
2762
+ "closest": "ADMIN ACTIONS: Creator Options / Org Admin / Super Admin (no named rows)"
2763
+ },
2764
+ {
2765
+ "id": "audit:140",
2766
+ "label": "Host extras",
2767
+ "feature": "Host extras: Clear (empty a transcript pad) and host-supplied copy variants joining more than one piece of content",
2768
+ "surface": "actions.extra host actions on a bar",
2769
+ "source": "aidream/apps/shared/rich-content/src/rich-document/actions/hostActions.ts:14-45",
2770
+ "coverage": "partial",
2771
+ "home": "feature section",
2772
+ "importance": "rare",
2773
+ "area": "documents",
2774
+ "closest": "Content > Delete; Copy"
2775
+ },
2776
+ {
2777
+ "id": "audit:141",
2778
+ "label": "Insert row above",
2779
+ "feature": "Insert row above / Insert row below (place a new record next to this one)",
2780
+ "surface": "table row and cell right-click menu",
2781
+ "source": "aidream/apps/shared/records-ui/src/gridMenus.ts:363",
2782
+ "coverage": "missing",
2783
+ "home": "feature section",
2784
+ "importance": "core",
2785
+ "area": "tables"
2786
+ },
2787
+ {
2788
+ "id": "audit:142",
2789
+ "label": "New record",
2790
+ "feature": "New record (add a row to the table)",
2791
+ "surface": "table right-click menu, toolbar Add button, board/gallery column add",
2792
+ "source": "aidream/apps/shared/records-ui/src/gridMenus.ts:413",
2793
+ "coverage": "missing",
2794
+ "home": "feature section",
2795
+ "importance": "core",
2796
+ "area": "tables"
2797
+ },
2798
+ {
2799
+ "id": "audit:143",
2800
+ "label": "Open record",
2801
+ "feature": "Open record (side panel / full record)",
2802
+ "surface": "table row menu and record card menu",
2803
+ "source": "aidream/apps/shared/records-ui/src/gridMenus.ts:320",
2804
+ "coverage": "missing",
2805
+ "home": "main menu",
2806
+ "importance": "core",
2807
+ "area": "tables"
2808
+ },
2809
+ {
2810
+ "id": "audit:144",
2811
+ "label": "Open in new tab and Copy link",
2812
+ "feature": "Open in new tab and Copy link (to a table or record)",
2813
+ "surface": "table menu, record card menu, data home rows",
2814
+ "source": "aidream/apps/shared/records-ui/src/objectActions.ts:377",
2815
+ "coverage": "partial",
2816
+ "home": "main menu",
2817
+ "importance": "core",
2818
+ "area": "tables"
2819
+ },
2820
+ {
2821
+ "id": "audit:145",
2822
+ "label": "Add to favorites",
2823
+ "feature": "Add to favorites / Remove from favorites (star a table)",
2824
+ "surface": "table menu and data home row menu",
2825
+ "source": "aidream/apps/shared/records-ui/src/objectActions.ts:393",
2826
+ "coverage": "partial",
2827
+ "home": "main menu",
2828
+ "importance": "useful",
2829
+ "area": "tables"
2830
+ },
2831
+ {
2832
+ "id": "audit:146",
2833
+ "label": "Merge with another record",
2834
+ "feature": "Merge with another record",
2835
+ "surface": "table row menu, record card menu",
2836
+ "source": "aidream/apps/shared/records-ui/src/gridMenus.ts:350",
2837
+ "coverage": "missing",
2838
+ "home": "feature section",
2839
+ "importance": "useful",
2840
+ "area": "tables"
2841
+ },
2842
+ {
2843
+ "id": "audit:147",
2844
+ "label": "Link a record",
2845
+ "feature": "Link a record (connect this row to a record in another table)",
2846
+ "surface": "table row menu, record card menu",
2847
+ "source": "aidream/apps/shared/records-ui/src/gridMenus.ts:357",
2848
+ "coverage": "missing",
2849
+ "home": "feature section",
2850
+ "importance": "useful",
2851
+ "area": "tables"
2852
+ },
2853
+ {
2854
+ "id": "audit:148",
2855
+ "label": "Save row as template",
2856
+ "feature": "Save row as template",
2857
+ "surface": "table row menu",
2858
+ "source": "aidream/apps/shared/records-ui/src/gridMenus.ts:346",
2859
+ "coverage": "missing",
2860
+ "home": "feature section",
2861
+ "importance": "useful",
2862
+ "area": "tables"
2863
+ },
2864
+ {
2865
+ "id": "audit:149",
2866
+ "label": "Run a row action",
2867
+ "feature": "Run a row action (Run: action name / Ask: agent action) on this row",
2868
+ "surface": "table row menu, built from the table's Row actions",
2869
+ "source": "aidream/apps/shared/records-ui/src/gridActions.tsx:431",
2870
+ "coverage": "partial",
2871
+ "home": "feature section",
2872
+ "importance": "core",
2873
+ "area": "tables"
2874
+ },
2875
+ {
2876
+ "id": "audit:150",
2877
+ "label": "Copy record reference",
2878
+ "feature": "Copy record reference (reference chip for AI / other tools) and Copy reference to a cell or table",
2879
+ "surface": "table row and cell menu, Get reference\u2026 in table menu",
2880
+ "source": "aidream/apps/shared/records-ui/src/gridAssist.tsx:240",
2881
+ "coverage": "partial",
2882
+ "home": "main menu",
2883
+ "importance": "useful",
2884
+ "area": "tables"
2885
+ },
2886
+ {
2887
+ "id": "audit:151",
2888
+ "label": "Who changed this?",
2889
+ "feature": "Who changed this? (cell history, shortcut Alt+Shift+H) and Row history",
2890
+ "surface": "table cell and row menu",
2891
+ "source": "aidream/apps/shared/records-ui/src/gridMenus.ts:300",
2892
+ "coverage": "partial",
2893
+ "home": "feature section",
2894
+ "importance": "useful",
2895
+ "area": "tables"
2896
+ },
2897
+ {
2898
+ "id": "audit:152",
2899
+ "label": "Cut cell, Copy cell, Paste into cell, Clear\u2026",
2900
+ "feature": "Cut cell, Copy cell, Paste into cell, Clear cell (and Cut / Copy / Paste over / Clear for a multi-cell selection)",
2901
+ "surface": "table cell and selection menu",
2902
+ "source": "aidream/apps/shared/records-ui/src/gridMenus.ts:285",
2903
+ "coverage": "partial",
2904
+ "home": "feature section",
2905
+ "importance": "core",
2906
+ "area": "tables"
2907
+ },
2908
+ {
2909
+ "id": "audit:153",
2910
+ "label": "Fill down",
2911
+ "feature": "Fill down (Cmd+D) across a selected range, and drag-to-fill handle",
2912
+ "surface": "table selection menu",
2913
+ "source": "aidream/apps/shared/records-ui/src/gridMenus.ts:505",
2914
+ "coverage": "missing",
2915
+ "home": "feature section",
2916
+ "importance": "core",
2917
+ "area": "tables"
2918
+ },
2919
+ {
2920
+ "id": "audit:154",
2921
+ "label": "Show rows with this value",
2922
+ "feature": "Show rows with this value / Show rows where this is empty (filter by the cell)",
2923
+ "surface": "table cell menu",
2924
+ "source": "aidream/apps/shared/records-ui/src/gridMenus.ts:304",
2925
+ "coverage": "missing",
2926
+ "home": "feature section",
2927
+ "importance": "useful",
2928
+ "area": "tables"
2929
+ },
2930
+ {
2931
+ "id": "audit:155",
2932
+ "label": "Edit whole text\u2026",
2933
+ "feature": "Edit whole text\u2026 (Shift+Enter) for a long text cell, and Clean HTML",
2934
+ "surface": "table cell menu",
2935
+ "source": "aidream/apps/shared/records-ui/src/gridAssist.tsx:200",
2936
+ "coverage": "missing",
2937
+ "home": "feature section",
2938
+ "importance": "useful",
2939
+ "area": "tables"
2940
+ },
2941
+ {
2942
+ "id": "audit:156",
2943
+ "label": "Highlight cell",
2944
+ "feature": "Highlight cell / row / selected cells, No colour (colour picker with scope: this view or the table for everyone)",
2945
+ "surface": "table cell, row, selection menus",
2946
+ "source": "aidream/apps/shared/records-ui/src/gridColors.tsx:408",
2947
+ "coverage": "missing",
2948
+ "home": "feature section",
2949
+ "importance": "useful",
2950
+ "area": "tables"
2951
+ },
2952
+ {
2953
+ "id": "audit:157",
2954
+ "label": "Colour rows by this column, Colour only this\u2026",
2955
+ "feature": "Colour rows by this column, Colour only this column, Colour by\u2026, Colour rules\u2026, Stop colouring by",
2956
+ "surface": "table column header menu",
2957
+ "source": "aidream/apps/shared/records-ui/src/gridColors.tsx:357",
2958
+ "coverage": "missing",
2959
+ "home": "feature section",
2960
+ "importance": "useful",
2961
+ "area": "tables"
2962
+ },
2963
+ {
2964
+ "id": "audit:158",
2965
+ "label": "Sort ascending/descending",
2966
+ "feature": "Sort ascending/descending (words adapt to type) and Clear sort",
2967
+ "surface": "column header menu",
2968
+ "source": "aidream/apps/shared/records-ui/src/gridMenus.ts:402",
2969
+ "coverage": "missing",
2970
+ "home": "feature section",
2971
+ "importance": "core",
2972
+ "area": "tables"
2973
+ },
2974
+ {
2975
+ "id": "audit:159",
2976
+ "label": "Column filters",
2977
+ "feature": "Column filters: text contains, value list with counts and exclude, number compare/between, date range presets (last hour to this year, older than), blank checks, Clear this filter, Clear all filters",
2978
+ "surface": "column header menu and toolbar eraser",
2979
+ "source": "aidream/apps/shared/design-system/src/data-table/ColumnHeaderCell.tsx:1152",
2980
+ "coverage": "missing",
2981
+ "home": "feature section",
2982
+ "importance": "core",
2983
+ "area": "tables"
2984
+ },
2985
+ {
2986
+ "id": "audit:160",
2987
+ "label": "Rename column, Column settings\u2026, Change type\u2026",
2988
+ "feature": "Rename column, Column settings\u2026, Change type\u2026, Clean column\u2026 (across every row), Duplicate property, Insert column left / right, Use as row label, Hide column, Delete column",
2989
+ "surface": "column header menu",
2990
+ "source": "aidream/apps/shared/records-ui/src/gridMenus.ts:223",
2991
+ "coverage": "missing",
2992
+ "home": "feature section",
2993
+ "importance": "core",
2994
+ "area": "tables"
2995
+ },
2996
+ {
2997
+ "id": "audit:161",
2998
+ "label": "Wrap column",
2999
+ "feature": "Wrap column / Unwrap column; Summary (Count, Sum, Average, etc.) in the column footer",
3000
+ "surface": "column header menu",
3001
+ "source": "aidream/apps/shared/records-ui/src/gridControls.tsx:470",
3002
+ "coverage": "missing",
3003
+ "home": "feature section",
3004
+ "importance": "useful",
3005
+ "area": "tables"
3006
+ },
3007
+ {
3008
+ "id": "audit:162",
3009
+ "label": "Add column\u2026",
3010
+ "feature": "Add column\u2026 (table-level) and What names each record\u2026",
3011
+ "surface": "table right-click menu",
3012
+ "source": "aidream/apps/shared/records-ui/src/gridControls.tsx:519",
3013
+ "coverage": "missing",
3014
+ "home": "feature section",
3015
+ "importance": "useful",
3016
+ "area": "tables"
3017
+ },
3018
+ {
3019
+ "id": "audit:163",
3020
+ "label": "Row actions\u2026",
3021
+ "feature": "Row actions\u2026 (set up the table's row buttons)",
3022
+ "surface": "table right-click menu",
3023
+ "source": "aidream/apps/shared/records-ui/src/gridControls.tsx:529",
3024
+ "coverage": "missing",
3025
+ "home": "feature section",
3026
+ "importance": "rare",
3027
+ "area": "tables"
3028
+ },
3029
+ {
3030
+ "id": "audit:164",
3031
+ "label": "Choose and reorder columns",
3032
+ "feature": "Choose and reorder columns (Columns dialog: show/hide, move earlier/later, reset to default)",
3033
+ "surface": "table toolbar",
3034
+ "source": "aidream/apps/shared/design-system/src/data-table/ColumnManager.tsx:118",
3035
+ "coverage": "missing",
3036
+ "home": "feature section",
3037
+ "importance": "core",
3038
+ "area": "tables"
3039
+ },
3040
+ {
3041
+ "id": "audit:165",
3042
+ "label": "Row height",
3043
+ "feature": "Row height (Compact/Normal/Tall), Wrap long text, Fit to width, Freeze first column",
3044
+ "surface": "table layout menu",
3045
+ "source": "aidream/apps/shared/records-ui/src/GridLayoutMenu.tsx:92",
3046
+ "coverage": "missing",
3047
+ "home": "feature section",
3048
+ "importance": "useful",
3049
+ "area": "tables"
3050
+ },
3051
+ {
3052
+ "id": "audit:166",
3053
+ "label": "Group rows by a column",
3054
+ "feature": "Group rows by a column / No groups (with group header rows)",
3055
+ "surface": "table toolbar",
3056
+ "source": "aidream/apps/shared/design-system/src/data-table/MatrxDataTable.tsx:5777",
3057
+ "coverage": "missing",
3058
+ "home": "feature section",
3059
+ "importance": "useful",
3060
+ "area": "tables"
3061
+ },
3062
+ {
3063
+ "id": "audit:167",
3064
+ "label": "Drill-down analytics",
3065
+ "feature": "Drill-down analytics: Group by, Then by, Across the top, measures, Compare with, time window, drill trail, break-out, open-in-tab and Preview of a drilled item",
3066
+ "surface": "table toolbar (drill tables)",
3067
+ "source": "aidream/apps/shared/design-system/src/data-table/DrillControls.tsx:186",
3068
+ "coverage": "missing",
3069
+ "home": "window",
3070
+ "importance": "useful",
3071
+ "area": "tables"
3072
+ },
3073
+ {
3074
+ "id": "audit:168",
3075
+ "label": "Saved views",
3076
+ "feature": "Saved views: Save current view, Update, Delete, Reload, switch view; view tabs (new, rename); Unlock a locked view; Make this the default layout",
3077
+ "surface": "table toolbar, view bar, table menu",
3078
+ "source": "aidream/apps/shared/design-system/src/data-table/SavedViewsControl.tsx:164",
3079
+ "coverage": "missing",
3080
+ "home": "feature section",
3081
+ "importance": "core",
3082
+ "area": "tables"
3083
+ },
3084
+ {
3085
+ "id": "audit:169",
3086
+ "label": "Layout switcher",
3087
+ "feature": "Layout switcher (Grid, Kanban board, Calendar, Gallery, Timeline, Sheet, Chart) plus board options (lanes, card size, card preview, hide empty groups, calculate) and calendar subscribe",
3088
+ "surface": "view bar and layout menu",
3089
+ "source": "aidream/apps/shared/records-ui/src/BoardOptions.tsx:72",
3090
+ "coverage": "missing",
3091
+ "home": "feature section",
3092
+ "importance": "core",
3093
+ "area": "tables"
3094
+ },
3095
+ {
3096
+ "id": "audit:170",
3097
+ "label": "Filter builder",
3098
+ "feature": "Filter builder (layered filters, Filter \xB7 N) and Match any of\u2026 search, search match mode (contains / whole words), intelligent search scopes",
3099
+ "surface": "table toolbar",
3100
+ "source": "aidream/apps/shared/records-ui/src/ViewFilter.tsx:91",
3101
+ "coverage": "missing",
3102
+ "home": "feature section",
3103
+ "importance": "core",
3104
+ "area": "tables"
3105
+ },
3106
+ {
3107
+ "id": "audit:171",
3108
+ "label": "Select all N matching, Clear selection, bulk\u2026",
3109
+ "feature": "Select all N matching, Clear selection, bulk bar with Copy / export of only the selected rows",
3110
+ "surface": "table selection bar",
3111
+ "source": "aidream/apps/shared/design-system/src/data-table/MatrxDataTable.tsx:7143",
3112
+ "coverage": "partial",
3113
+ "home": "feature section",
3114
+ "importance": "core",
3115
+ "area": "tables"
3116
+ },
3117
+ {
3118
+ "id": "audit:172",
3119
+ "label": "Copy table or rows in more formats",
3120
+ "feature": "Copy table or rows in more formats: CSV, Google Sheets paste (TSV), Compact JSON, Copy formatted, Excel workbook, EPUB book, Copy including thinking, Filter and sort before copying (rows subset window)",
3121
+ "surface": "Alchemy copy and export menu",
3122
+ "source": "aidream/apps/shared/alchemy/src/operate/formats.ts:107",
3123
+ "coverage": "partial",
3124
+ "home": "window",
3125
+ "importance": "core",
3126
+ "area": "tables"
3127
+ },
3128
+ {
3129
+ "id": "audit:173",
3130
+ "label": "Send rows to a Google Sheet",
3131
+ "feature": "Send rows to a Google Sheet",
3132
+ "surface": "Alchemy export menu",
3133
+ "source": "aidream/apps/shared/alchemy/src/react/workspace/matrx-copy.tsx:531",
3134
+ "coverage": "partial",
3135
+ "home": "main menu",
3136
+ "importance": "useful",
3137
+ "area": "tables"
3138
+ },
3139
+ {
3140
+ "id": "audit:174",
3141
+ "label": "Copy for AI controls",
3142
+ "feature": "Copy for AI controls: Full AI context, With Prompt, detail level (Everything, Balanced, Minimal, Custom), per-section Keep / Stub / limit lengths, Customize source, Customize sections, Edit and prepare workspace",
3143
+ "surface": "Alchemy copy menu and preparation workspace",
3144
+ "source": "aidream/apps/shared/alchemy/src/react/workspace/workspace-tree.tsx:56",
3145
+ "coverage": "partial",
3146
+ "home": "window",
3147
+ "importance": "useful",
3148
+ "area": "tables"
3149
+ },
3150
+ {
3151
+ "id": "audit:175",
3152
+ "label": "Save this content to Notes, as a Document, a\u2026",
3153
+ "feature": "Save this content to Notes, as a Document, as a Workbook, to Code, or open a Task from it; Attach to context; Open in chat or an agent window; Email draft with review",
3154
+ "surface": "Alchemy send-to destinations",
3155
+ "source": "matrx-frontend/components/agent-copy/alchemy-destinations.ts:44",
3156
+ "coverage": "partial",
3157
+ "home": "main menu",
3158
+ "importance": "useful",
3159
+ "area": "tables"
3160
+ },
3161
+ {
3162
+ "id": "audit:176",
3163
+ "label": "Import\u2026",
3164
+ "feature": "Import\u2026 (CSV / XLSX) and Import from Notion\u2026",
3165
+ "surface": "table menu (Share group)",
3166
+ "source": "aidream/apps/shared/records-ui/src/objectActions.ts:405",
3167
+ "coverage": "missing",
3168
+ "home": "window",
3169
+ "importance": "useful",
3170
+ "area": "tables"
3171
+ },
3172
+ {
3173
+ "id": "audit:177",
3174
+ "label": "Table Settings, Rename table, Move table to\u2026\u2026",
3175
+ "feature": "Table Settings, Rename table, Move table to\u2026, Duplicate table (Copy this table), Table details, Access level",
3176
+ "surface": "table menu",
3177
+ "source": "aidream/apps/shared/records-ui/src/objectActions.ts:388",
3178
+ "coverage": "partial",
3179
+ "home": "feature section",
3180
+ "importance": "core",
3181
+ "area": "tables"
3182
+ },
3183
+ {
3184
+ "id": "audit:178",
3185
+ "label": "Built on this table",
3186
+ "feature": "Built on this table: Forms, Dashboards, Bookings, Checklists, Notifications, Portals, Inbox, Archived records, Workflows, Automations, When a row changes run an agent",
3187
+ "surface": "table menu Built on it submenu",
3188
+ "source": "aidream/apps/shared/records-ui/src/objectActions.ts:266",
3189
+ "coverage": "missing",
3190
+ "home": "feature section",
3191
+ "importance": "core",
3192
+ "area": "tables"
3193
+ },
3194
+ {
3195
+ "id": "audit:179",
3196
+ "label": "Questions",
3197
+ "feature": "Questions (ask about the table), Turn on / off sub-items, Get reference\u2026",
3198
+ "surface": "table menu",
3199
+ "source": "aidream/apps/shared/records-ui/src/TablePage.tsx:1667",
3200
+ "coverage": "missing",
3201
+ "home": "feature section",
3202
+ "importance": "useful",
3203
+ "area": "tables"
3204
+ },
3205
+ {
3206
+ "id": "audit:180",
3207
+ "label": "Archive table",
3208
+ "feature": "Archive table; Archive record; Restore from its table (archived items); Archived records view",
3209
+ "surface": "table menu, row menu, data home",
3210
+ "source": "aidream/apps/shared/records-ui/src/objectActions.ts:425",
3211
+ "coverage": "partial",
3212
+ "home": "main menu",
3213
+ "importance": "core",
3214
+ "area": "tables"
3215
+ },
3216
+ {
3217
+ "id": "audit:181",
3218
+ "label": "Open public link",
3219
+ "feature": "Open public link (for a published table or form)",
3220
+ "surface": "data home row menu",
3221
+ "source": "matrx-frontend/features/unified-data/home/useDataHomeRowMenus.tsx:318",
3222
+ "coverage": "missing",
3223
+ "home": "feature section",
3224
+ "importance": "useful",
3225
+ "area": "tables"
3226
+ },
3227
+ {
3228
+ "id": "audit:182",
3229
+ "label": "Copy table ID",
3230
+ "feature": "Copy table ID (admin) and the table's keyboard chords (Alt+Shift+L/R/D/M/F/S/E/I/H/Backspace, comma for settings)",
3231
+ "surface": "table menu shortcuts, admin item",
3232
+ "source": "matrx-frontend/features/data-tables/dataset-table-actions.tsx:79",
3233
+ "coverage": "partial",
3234
+ "home": "main menu",
3235
+ "importance": "rare",
3236
+ "area": "tables"
3237
+ },
3238
+ {
3239
+ "id": "audit:183",
3240
+ "label": "Undo the last cell edit or column delete",
3241
+ "feature": "Undo the last cell edit or column delete (cell undo, deleted column is one undo step), Undo after Archive",
3242
+ "surface": "table, record card toast",
3243
+ "source": "aidream/apps/shared/design-system/src/data-table/cell-undo.ts",
3244
+ "coverage": "partial",
3245
+ "home": "main menu",
3246
+ "importance": "useful",
3247
+ "area": "tables"
3248
+ },
3249
+ {
3250
+ "id": "audit:184",
3251
+ "label": "Open a row in a window or side panel",
3252
+ "feature": "Open a row in a window or side panel (View / Edit tabs), JSON value viewer for JSON cells",
3253
+ "surface": "table row and cell",
3254
+ "source": "aidream/apps/shared/design-system/src/data-table/DataRowWindow.tsx:111",
3255
+ "coverage": "missing",
3256
+ "home": "window",
3257
+ "importance": "useful",
3258
+ "area": "tables"
3259
+ },
3260
+ {
3261
+ "id": "audit:185",
3262
+ "label": "Table toolbar overflow",
3263
+ "feature": "Table toolbar overflow (the ... button and phone Tools sheet), Refresh, Clear search and filters, Scroll left/right",
3264
+ "surface": "table toolbar",
3265
+ "source": "aidream/apps/shared/design-system/src/data-table/ToolbarOverflow.tsx:44",
3266
+ "coverage": "partial",
3267
+ "home": "feature section",
3268
+ "importance": "useful",
3269
+ "area": "tables"
3270
+ },
3271
+ {
3272
+ "id": "audit:186",
3273
+ "label": "Web page-style table cards",
3274
+ "feature": "Web page-style table cards: Show more / Rows per load and Source info (source coverage)",
3275
+ "surface": "table footer",
3276
+ "source": "aidream/apps/shared/design-system/src/data-table/MatrxDataTable.tsx:6953",
3277
+ "coverage": "missing",
3278
+ "home": "feature section",
3279
+ "importance": "rare",
3280
+ "area": "tables"
3281
+ },
3282
+ {
3283
+ "id": "audit:187",
3284
+ "label": "Thumbs up",
3285
+ "feature": "Thumbs up / thumbs down (Helpful, Not helpful) on an answer, saved with the message",
3286
+ "surface": "chat assistant message bar and options menu",
3287
+ "source": "matrx-frontend/features/rich-document/actions/handlers/feedback.ts:80",
3288
+ "coverage": "missing",
3289
+ "home": "feature section",
3290
+ "importance": "core",
3291
+ "area": "chat"
3292
+ },
3293
+ {
3294
+ "id": "audit:188",
3295
+ "label": "Regenerate answer",
3296
+ "feature": "Regenerate answer (with confirm)",
3297
+ "surface": "chat assistant message menu",
3298
+ "source": "matrx-frontend/features/rich-document/actions/handlers/answer-tools.ts:119",
3299
+ "coverage": "missing",
3300
+ "home": "feature section",
3301
+ "importance": "core",
3302
+ "area": "chat"
3303
+ },
3304
+ {
3305
+ "id": "audit:189",
3306
+ "label": "Edit and resubmit a user message",
3307
+ "feature": "Edit and resubmit a user message (overwrites the turn and discards everything after it)",
3308
+ "surface": "chat user message bar and menu",
3309
+ "source": "matrx-frontend/features/rich-document/actions/handlers/edit.ts:308",
3310
+ "coverage": "missing",
3311
+ "home": "feature section",
3312
+ "importance": "core",
3313
+ "area": "chat"
3314
+ },
3315
+ {
3316
+ "id": "audit:190",
3317
+ "label": "Fork the conversation at this message",
3318
+ "feature": "Fork the conversation at this message (stay here or go to the new branch)",
3319
+ "surface": "chat message menu",
3320
+ "source": "matrx-frontend/features/rich-document/actions/handlers/edit.ts:209",
3321
+ "coverage": "missing",
3322
+ "home": "feature section",
3323
+ "importance": "core",
3324
+ "area": "chat"
3325
+ },
3326
+ {
3327
+ "id": "audit:191",
3328
+ "label": "Fork and regenerate from here",
3329
+ "feature": "Fork and regenerate from here (user messages)",
3330
+ "surface": "chat user message menu",
3331
+ "source": "matrx-frontend/features/rich-document/actions/handlers/edit.ts:381",
3332
+ "coverage": "missing",
3333
+ "home": "feature section",
3334
+ "importance": "useful",
3335
+ "area": "chat"
3336
+ },
3337
+ {
3338
+ "id": "audit:192",
3339
+ "label": "Continue in chat mode",
3340
+ "feature": "Continue in chat mode (opens the full /chat page for this conversation in a new tab)",
3341
+ "surface": "chat assistant message bar",
3342
+ "source": "matrx-frontend/features/rich-document/actions/handlers/chat.ts:34",
3343
+ "coverage": "missing",
3344
+ "home": "feature section",
3345
+ "importance": "useful",
3346
+ "area": "chat"
3347
+ },
3348
+ {
3349
+ "id": "audit:193",
3350
+ "label": "Edit history of a message",
3351
+ "feature": "Edit history of a message: see earlier versions, compare each with current, restore a version",
3352
+ "surface": "chat message menu and Edit history dialog",
3353
+ "source": "matrx-frontend/features/rich-document/actions/handlers/edit.ts:182",
3354
+ "coverage": "partial",
3355
+ "home": "feature section",
3356
+ "importance": "useful",
3357
+ "area": "chat",
3358
+ "closest": "Content > View history (does not say it is per message, nor include compare and restore of archived versions)"
3359
+ },
3360
+ {
3361
+ "id": "audit:194",
3362
+ "label": "Pin or unpin a single message",
3363
+ "feature": "Pin or unpin a single message",
3364
+ "surface": "chat message menu",
3365
+ "source": "matrx-frontend/features/rich-document/actions/handlers/answer-tools.ts:47",
3366
+ "coverage": "partial",
3367
+ "home": "feature section",
3368
+ "importance": "core",
3369
+ "area": "chat",
3370
+ "closest": "Organize > Pin (could mean pin the item, but a message pin is a separate saved flag used by Pinned-only filter)"
3371
+ },
3372
+ {
3373
+ "id": "audit:195",
3374
+ "label": "Show only pinned messages in this conversation",
3375
+ "feature": "Show only pinned messages in this conversation (filter toggle with count)",
3376
+ "surface": "conversation header menu",
3377
+ "source": "matrx-frontend/features/rich-document/actions/handlers/conversation-section.ts:87",
3378
+ "coverage": "missing",
3379
+ "home": "feature section",
3380
+ "importance": "useful",
3381
+ "area": "chat"
3382
+ },
3383
+ {
3384
+ "id": "audit:196",
3385
+ "label": "Find in conversation",
3386
+ "feature": "Find in conversation (search bar over the whole transcript, next/previous)",
3387
+ "surface": "conversation header menu",
3388
+ "source": "aidream/apps/shared/chat/src/agents/components/chat/ConversationPageMenu.tsx:129",
3389
+ "coverage": "partial",
3390
+ "home": "feature section",
3391
+ "importance": "useful",
3392
+ "area": "chat",
3393
+ "closest": "Find & Replace (searches the focused text, not the whole conversation)"
3394
+ },
3395
+ {
3396
+ "id": "audit:197",
3397
+ "label": "Rename conversation",
3398
+ "feature": "Rename conversation (inline in sidebar row and from header/panel title)",
3399
+ "surface": "sidebar row menu, header menu, chat panel title menu",
3400
+ "source": "aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:185",
3401
+ "coverage": "partial",
3402
+ "home": "main menu",
3403
+ "importance": "core",
3404
+ "area": "chat",
3405
+ "closest": "Content > Rename"
3406
+ },
3407
+ {
3408
+ "id": "audit:198",
3409
+ "label": "Open conversation in a new tab",
3410
+ "feature": "Open conversation in a new tab / open its agent",
3411
+ "surface": "sidebar conversation row menu",
3412
+ "source": "aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:219",
3413
+ "coverage": "missing",
3414
+ "home": "feature section",
3415
+ "importance": "useful",
3416
+ "area": "chat"
3417
+ },
3418
+ {
3419
+ "id": "audit:199",
3420
+ "label": "Make an agent from this chat",
3421
+ "feature": "Make an agent from this chat (Agent Studio window, single agent or Masterwork)",
3422
+ "surface": "sidebar conversation row menu",
3423
+ "source": "aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:287",
3424
+ "coverage": "missing",
3425
+ "home": "window",
3426
+ "importance": "core",
3427
+ "area": "chat"
3428
+ },
3429
+ {
3430
+ "id": "audit:200",
3431
+ "label": "Exclude or include this conversation in the\u2026",
3432
+ "feature": "Exclude or include this conversation in the knowledge graph",
3433
+ "surface": "sidebar conversation row menu",
3434
+ "source": "aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:342",
3435
+ "coverage": "missing",
3436
+ "home": "feature section",
3437
+ "importance": "useful",
3438
+ "area": "chat"
3439
+ },
3440
+ {
3441
+ "id": "audit:201",
3442
+ "label": "Remove from this list",
3443
+ "feature": "Remove from this list (context-specific, e.g. a project's chat list)",
3444
+ "surface": "sidebar conversation row menu",
3445
+ "source": "aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:260",
3446
+ "coverage": "partial",
3447
+ "home": "feature section",
3448
+ "importance": "useful",
3449
+ "area": "chat",
3450
+ "closest": "Organize > Move to folder / Attach to"
3451
+ },
3452
+ {
3453
+ "id": "audit:202",
3454
+ "label": "Show only",
3455
+ "feature": "Show only / hide conversations from one source feature (source filter)",
3456
+ "surface": "sidebar conversation row menu",
3457
+ "source": "aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:150",
3458
+ "coverage": "missing",
3459
+ "home": "feature section",
3460
+ "importance": "rare",
3461
+ "area": "chat"
3462
+ },
3463
+ {
3464
+ "id": "audit:203",
3465
+ "label": "Add conversation to a project",
3466
+ "feature": "Add conversation to a project",
3467
+ "surface": "sidebar conversation row menu",
3468
+ "source": "aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:253",
3469
+ "coverage": "partial",
3470
+ "home": "main menu",
3471
+ "importance": "useful",
3472
+ "area": "chat",
3473
+ "closest": "Send & Convert > Project"
3474
+ },
3475
+ {
3476
+ "id": "audit:204",
3477
+ "label": "Download whole conversation as JSON or EPUB",
3478
+ "feature": "Download whole conversation as JSON or EPUB (also text, markdown, web page, PDF, Word)",
3479
+ "surface": "conversation header menu",
3480
+ "source": "aidream/apps/shared/chat/src/agents/conversation-export/conversation-transfer-rows.ts:57",
3481
+ "coverage": "partial",
3482
+ "home": "window",
3483
+ "importance": "useful",
3484
+ "area": "chat",
3485
+ "closest": "Export & Download (has Markdown, Word, HTML, PDF but no plain text, JSON or EPUB)"
3486
+ },
3487
+ {
3488
+ "id": "audit:205",
3489
+ "label": "Copy whole conversation as plain text, Markd\u2026",
3490
+ "feature": "Copy whole conversation as plain text, Markdown, formatted, or prepared for AI",
3491
+ "surface": "conversation header menu",
3492
+ "source": "aidream/apps/shared/chat/src/agents/conversation-export/conversation-transfer-rows.ts:53",
3493
+ "coverage": "partial",
3494
+ "home": "feature section",
3495
+ "importance": "useful",
3496
+ "area": "chat",
3497
+ "closest": "Copy submenu (same formats, but nothing says it applies to the whole conversation)"
3498
+ },
3499
+ {
3500
+ "id": "audit:206",
3501
+ "label": "Open conversation in a new chat",
3502
+ "feature": "Open conversation in a new chat",
3503
+ "surface": "conversation header menu",
3504
+ "source": "aidream/apps/shared/chat/src/agents/conversation-export/conversation-transfer-rows.ts:67",
3505
+ "coverage": "missing",
3506
+ "home": "feature section",
3507
+ "importance": "rare",
3508
+ "area": "chat"
3509
+ },
3510
+ {
3511
+ "id": "audit:207",
3512
+ "label": "Send email to each person in the conversation",
3513
+ "feature": "Send email to each person in the conversation (Gmail compose)",
3514
+ "surface": "conversation header menu (only when the chat has people)",
3515
+ "source": "aidream/apps/shared/chat/src/agents/components/chat/ConversationPageMenu.tsx:197",
3516
+ "coverage": "partial",
3517
+ "home": "feature section",
3518
+ "importance": "rare",
3519
+ "area": "chat",
3520
+ "closest": "Send & Convert > Email"
3521
+ },
3522
+ {
3523
+ "id": "audit:208",
3524
+ "label": "Open chat in full chat page",
3525
+ "feature": "Open chat in full chat page; New chat (from the docked/floating chat panel title menu)",
3526
+ "surface": "chat panel title menu",
3527
+ "source": "aidream/apps/shared/chat/src/canvas/workspace/ChatPanelTitleMenu.tsx:88",
3528
+ "coverage": "missing",
3529
+ "home": "feature section",
3530
+ "importance": "useful",
3531
+ "area": "chat"
3532
+ },
3533
+ {
3534
+ "id": "audit:209",
3535
+ "label": "Open in full-screen editor",
3536
+ "feature": "Open in full-screen editor (assistant or user message)",
3537
+ "surface": "chat message menu",
3538
+ "source": "matrx-frontend/features/rich-document/actions/handlers/fullscreen-editor.ts:19",
3539
+ "coverage": "missing",
3540
+ "home": "window",
3541
+ "importance": "useful",
3542
+ "area": "chat"
3543
+ },
3544
+ {
3545
+ "id": "audit:210",
3546
+ "label": "Copy with thinking",
3547
+ "feature": "Copy with thinking / reasoning included",
3548
+ "surface": "chat assistant message menu and public chat menu",
3549
+ "source": "matrx-frontend/features/rich-document/actions/handlers/copy.ts:35",
3550
+ "coverage": "missing",
3551
+ "home": "feature section",
3552
+ "importance": "useful",
3553
+ "area": "chat"
3554
+ },
3555
+ {
3556
+ "id": "audit:211",
3557
+ "label": "Copy HTML source",
3558
+ "feature": "Copy HTML source; copy table as CSV; copy table for a spreadsheet (TSV)",
3559
+ "surface": "chat message menu (tables in answers)",
3560
+ "source": "matrx-frontend/features/rich-document/actions/handlers/transfer.ts:83",
3561
+ "coverage": "partial",
3562
+ "home": "feature section",
3563
+ "importance": "useful",
3564
+ "area": "chat",
3565
+ "closest": "Copy > Data: Copy as JSON (no CSV or TSV)"
3566
+ },
3567
+ {
3568
+ "id": "audit:212",
3569
+ "label": "Save table to a data table",
3570
+ "feature": "Save table to a data table",
3571
+ "surface": "chat message menu and text-selection toolbar",
3572
+ "source": "matrx-frontend/features/rich-document/actions/handlers/transfer.ts:168",
3573
+ "coverage": "partial",
3574
+ "home": "main menu",
3575
+ "importance": "useful",
3576
+ "area": "chat",
3577
+ "closest": "Send & Convert > Custom data"
3578
+ },
3579
+ {
3580
+ "id": "audit:213",
3581
+ "label": "Chart this data",
3582
+ "feature": "Chart this data (only shown when the answer contains chartable data)",
3583
+ "surface": "chat message menu",
3584
+ "source": "matrx-frontend/features/rich-document/actions/handlers/answer-tools.ts:283",
3585
+ "coverage": "partial",
3586
+ "home": "main menu",
3587
+ "importance": "useful",
3588
+ "area": "chat",
3589
+ "closest": "Intelligence > AI Actions > Make a chart"
3590
+ },
3591
+ {
3592
+ "id": "audit:214",
3593
+ "label": "Ask a follow-up about the selected passage",
3594
+ "feature": "Ask a follow-up about the selected passage; Quote passage into chat",
3595
+ "surface": "chat message menu and selection",
3596
+ "source": "matrx-frontend/features/rich-document/actions/handlers/ask.ts:69",
3597
+ "coverage": "partial",
3598
+ "home": "feature section",
3599
+ "importance": "core",
3600
+ "area": "chat",
3601
+ "closest": "Intelligence > Chat about this"
3602
+ },
3603
+ {
3604
+ "id": "audit:215",
3605
+ "label": "Code block",
3606
+ "feature": "Code block: Open in code editor; Save to Code files; Save and open in editor; Save code to Scratch",
3607
+ "surface": "code block kebab menu and message menu",
3608
+ "source": "aidream/apps/shared/rich-content/src/code-block/CodeBlockHeader.tsx:469",
3609
+ "coverage": "missing",
3610
+ "home": "feature section",
3611
+ "importance": "core",
3612
+ "area": "chat"
3613
+ },
3614
+ {
3615
+ "id": "audit:216",
3616
+ "label": "Code block",
3617
+ "feature": "Code block: Apply to the open file (with Undo) and Run in sandbox",
3618
+ "surface": "code block in chat answers",
3619
+ "source": "matrx-frontend/features/rich-document/actions/handlers/answer-tools.ts:204",
3620
+ "coverage": "missing",
3621
+ "home": "feature section",
3622
+ "importance": "core",
3623
+ "area": "chat"
3624
+ },
3625
+ {
3626
+ "id": "audit:217",
3627
+ "label": "Code block",
3628
+ "feature": "Code block: Copy with line numbers; Download as code file",
3629
+ "surface": "code block kebab menu",
3630
+ "source": "aidream/apps/shared/rich-content/src/code-block/CodeBlockHeader.tsx:435",
3631
+ "coverage": "partial",
3632
+ "home": "feature section",
3633
+ "importance": "useful",
3634
+ "area": "documents",
3635
+ "closest": "Copy submenu and Export & Download (no line numbers, no per-code-file download)"
3636
+ },
3637
+ {
3638
+ "id": "audit:218",
3639
+ "label": "Code block",
3640
+ "feature": "Code block: View options (word wrap, minimap, fullscreen, collapse/expand code)",
3641
+ "surface": "code block header and kebab",
3642
+ "source": "aidream/apps/shared/rich-content/src/code-block/CodeBlockHeader.tsx:360",
3643
+ "coverage": "missing",
3644
+ "home": "feature section",
3645
+ "importance": "useful",
3646
+ "area": "documents"
3647
+ },
3648
+ {
3649
+ "id": "audit:219",
3650
+ "label": "Code block",
3651
+ "feature": "Code block: inline edit, Format code, Reset to original, and the code-editor AI jobs",
3652
+ "surface": "code block kebab menu",
3653
+ "source": "aidream/apps/shared/rich-content/src/code-block/CodeBlockHeader.tsx:410",
3654
+ "coverage": "partial",
3655
+ "home": "feature section",
3656
+ "importance": "useful",
3657
+ "area": "documents",
3658
+ "closest": "Content > Cleanup / Intelligence > AI Actions"
3659
+ },
3660
+ {
3661
+ "id": "audit:220",
3662
+ "label": "Code block",
3663
+ "feature": "Code block: Open HTML preview for a complete HTML page",
3664
+ "surface": "code block kebab menu (only complete HTML)",
3665
+ "source": "aidream/apps/shared/rich-content/src/code-block/CodeBlockHeader.tsx:452",
3666
+ "coverage": "missing",
3667
+ "home": "feature section",
3668
+ "importance": "useful",
3669
+ "area": "documents"
3670
+ },
3671
+ {
3672
+ "id": "audit:221",
3673
+ "label": "Write back to source",
3674
+ "feature": "Write back to source: Replace and Insert below, Apply to source",
3675
+ "surface": "chat message menu (when message came from selected text)",
3676
+ "source": "matrx-frontend/features/rich-document/actions/handlers/write-back.ts:51",
3677
+ "coverage": "missing",
3678
+ "home": "feature section",
3679
+ "importance": "core",
3680
+ "area": "chat"
3681
+ },
3682
+ {
3683
+ "id": "audit:222",
3684
+ "label": "Save as shortcut",
3685
+ "feature": "Save as shortcut; Bind this run to the page it came from",
3686
+ "surface": "agent run result menu",
3687
+ "source": "matrx-frontend/features/rich-document/actions/handlers/ai.ts:167",
3688
+ "coverage": "missing",
3689
+ "home": "feature section",
3690
+ "importance": "useful",
3691
+ "area": "documents"
3692
+ },
3693
+ {
3694
+ "id": "audit:223",
3695
+ "label": "Save as contact",
3696
+ "feature": "Save as contact (when the text looks like a contact)",
3697
+ "surface": "chat message menu, conditional",
3698
+ "source": "matrx-frontend/features/rich-document/actions/handlers/contact.ts:28",
3699
+ "coverage": "missing",
3700
+ "home": "feature section",
3701
+ "importance": "rare",
3702
+ "area": "chat"
3703
+ },
3704
+ {
3705
+ "id": "audit:224",
3706
+ "label": "Add to Rulebook",
3707
+ "feature": "Add to Rulebook; Set Context Value; Save as Message Template; Save to my Shapes",
3708
+ "surface": "chat message menu",
3709
+ "source": "matrx-frontend/features/rich-document/actions/handlers/capture.ts:76",
3710
+ "coverage": "partial",
3711
+ "home": "window",
3712
+ "importance": "useful",
3713
+ "area": "files",
3714
+ "closest": "Send & Convert > Add to Active Context / Custom data"
3715
+ },
3716
+ {
3717
+ "id": "audit:225",
3718
+ "label": "Save to Files",
3719
+ "feature": "Save to Files; Save as PDF document (into cloud files)",
3720
+ "surface": "chat message menu",
3721
+ "source": "matrx-frontend/features/rich-document/actions/handlers/capture.ts:175",
3722
+ "coverage": "partial",
3723
+ "home": "main menu",
3724
+ "importance": "useful",
3725
+ "area": "files",
3726
+ "closest": "Export & Download > PDF (downloads, does not save into the files area)"
3727
+ },
3728
+ {
3729
+ "id": "audit:226",
3730
+ "label": "Save as flashcard",
3731
+ "feature": "Save as flashcard; Convert to flashcards or quiz",
3732
+ "surface": "chat message menu",
3733
+ "source": "matrx-frontend/features/rich-document/actions/handlers/capture.ts:379",
3734
+ "coverage": "partial",
3735
+ "home": "window",
3736
+ "importance": "useful",
3737
+ "area": "files",
3738
+ "closest": "Send & Convert > Convert to\u2026"
3739
+ },
3740
+ {
3741
+ "id": "audit:227",
3742
+ "label": "Summarize and listen",
3743
+ "feature": "Summarize and listen / Summarize without playing; Pause or resume reading; selection-aware read aloud",
3744
+ "surface": "chat message menu",
3745
+ "source": "matrx-frontend/features/rich-document/actions/handlers/listen.ts:74",
3746
+ "coverage": "partial",
3747
+ "home": "main menu",
3748
+ "importance": "useful",
3749
+ "area": "chat",
3750
+ "closest": "Listen & Speak > Condense & Read (no summarize-without-playing; no pause/resume state)"
3751
+ },
3752
+ {
3753
+ "id": "audit:228",
3754
+ "label": "Full Print of all blocks including tool and\u2026",
3755
+ "feature": "Full Print of all blocks including tool and media blocks (and Print / Save PDF)",
3756
+ "surface": "chat assistant message menu",
3757
+ "source": "matrx-frontend/features/rich-document/actions/handlers/print.ts:42",
3758
+ "coverage": "partial",
3759
+ "home": "window",
3760
+ "importance": "rare",
3761
+ "area": "chat",
3762
+ "closest": "Export & Download > Print / PDF"
3763
+ },
3764
+ {
3765
+ "id": "audit:229",
3766
+ "label": "Send to Google Doc",
3767
+ "feature": "Send to Google Doc (with Connect prompt)",
3768
+ "surface": "chat message menu",
3769
+ "source": "matrx-frontend/features/rich-document/actions/handlers/share.ts:82",
3770
+ "coverage": "partial",
3771
+ "home": "main menu",
3772
+ "importance": "useful",
3773
+ "area": "chat",
3774
+ "closest": "Send & Convert > Google Connections"
3775
+ },
3776
+ {
3777
+ "id": "audit:230",
3778
+ "label": "Analyze response",
3779
+ "feature": "Analyze response; Debug stream (agent owner only)",
3780
+ "surface": "chat assistant message menu, Creator section",
3781
+ "source": "matrx-frontend/features/rich-document/actions/handlers/creator.ts:13",
3782
+ "coverage": "partial",
3783
+ "home": "window",
3784
+ "importance": "useful",
3785
+ "area": "chat",
3786
+ "closest": "ADMIN ACTIONS > Creator Options (section named, items not listed)"
3787
+ },
3788
+ {
3789
+ "id": "audit:231",
3790
+ "label": "Server API test tools",
3791
+ "feature": "Server API test tools: fork before this message, hide from model, move this and everything after to Trash, dry-run delete, replace with a summary, restore compaction (super admin)",
3792
+ "surface": "chat assistant message menu, Server API section",
3793
+ "source": "matrx-frontend/features/rich-document/actions/handlers/server-api.ts:46",
3794
+ "coverage": "partial",
3795
+ "home": "window",
3796
+ "importance": "rare",
3797
+ "area": "chat",
3798
+ "closest": "ADMIN ACTIONS > Super Admin (section named, items not listed)"
3799
+ },
3800
+ {
3801
+ "id": "audit:232",
3802
+ "label": "Retry a failed turn",
3803
+ "feature": "Retry a failed turn; Retry now / Cancel on a provider-busy card",
3804
+ "surface": "chat error and provider retry cards",
3805
+ "source": "aidream/apps/shared/chat/src/agents/components/messages-display/assistant/ASSISTANT_MESSAGE_ACTIONS_REVIEW.md (Related table)",
3806
+ "coverage": "missing",
3807
+ "home": "feature section",
3808
+ "importance": "core",
3809
+ "area": "chat"
3810
+ },
3811
+ {
3812
+ "id": "audit:233",
3813
+ "label": "Revert code edits listed on a message",
3814
+ "feature": "Revert code edits listed on a message (message file strip)",
3815
+ "surface": "chat message file strip",
3816
+ "source": "aidream/apps/shared/chat/src/agents/components/messages-display/assistant/ASSISTANT_MESSAGE_ACTIONS_REVIEW.md (Related table)",
3817
+ "coverage": "missing",
3818
+ "home": "feature section",
3819
+ "importance": "useful",
3820
+ "area": "chat"
3821
+ },
3822
+ {
3823
+ "id": "audit:234",
3824
+ "label": "Announcements and Preferences shortcuts in t\u2026",
3825
+ "feature": "Announcements and Preferences shortcuts in the message menu",
3826
+ "surface": "chat message menu, App section",
3827
+ "source": "matrx-frontend/features/rich-document/actions/handlers/app.ts:11",
3828
+ "coverage": "partial",
3829
+ "home": "main menu",
3830
+ "importance": "rare",
3831
+ "area": "chat",
3832
+ "closest": "Help > I found a bug / Request a feature (no announcements or preferences)"
3833
+ },
3834
+ {
3835
+ "id": "audit:235",
3836
+ "label": "Copy conversation",
3837
+ "feature": "Copy conversation / message link",
3838
+ "surface": "sidebar row and conversation menu",
3839
+ "source": "aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:240",
3840
+ "coverage": "partial",
3841
+ "home": "main menu",
3842
+ "importance": "useful",
3843
+ "area": "chat",
3844
+ "closest": "Share & Publish > Copy share link (a share link vs a plain open-in-app link are different things)"
3845
+ },
3846
+ {
3847
+ "id": "audit:236",
3848
+ "label": "Artifact bar Open menu",
3849
+ "feature": "Artifact bar Open menu: open in Canvas, Edit, Window Panel, Tool Admin",
3850
+ "surface": "artifact result bar in chat",
3851
+ "source": "aidream/apps/shared/chat/src/tool-call-visualization/components/ArtifactResultBar.tsx:187",
3852
+ "coverage": "partial",
3853
+ "home": "feature section",
3854
+ "importance": "core",
3855
+ "area": "chat",
3856
+ "closest": "Intelligence > AI Resources > Artifacts (finding artifacts, not opening this one in Canvas or a window)"
3857
+ },
3858
+ {
3859
+ "id": "audit:237",
3860
+ "label": "Attach an artifact to the chat",
3861
+ "feature": "Attach an artifact to the chat",
3862
+ "surface": "artifact action",
3863
+ "source": "matrx-frontend/features/rich-document/actions/handlers/attach-to-chat.ts:16",
3864
+ "coverage": "partial",
3865
+ "home": "main menu",
3866
+ "importance": "useful",
3867
+ "area": "chat",
3868
+ "closest": "Organize > Attach to\u2026"
3869
+ },
3870
+ {
3871
+ "id": "audit:238",
3872
+ "label": "Composer + menu",
3873
+ "feature": "Composer + menu: Add files or photos; Add a link; From your workspace (attach from AI Matrx); Search your knowledge",
3874
+ "surface": "composer + attach menu",
3875
+ "source": "aidream/apps/shared/chat/src/agents/components/inputs/smart-input/composer/ComposerPlusMenu.tsx:264",
3876
+ "coverage": "partial",
3877
+ "home": "feature section",
3878
+ "importance": "core",
3879
+ "area": "chat",
3880
+ "closest": "Organize > Attach to\u2026 ; Intelligence > AI Resources"
3881
+ },
3882
+ {
3883
+ "id": "audit:239",
3884
+ "label": "Composer + menu",
3885
+ "feature": "Composer + menu: Tools, Skills, Connections (including Google Workspace files)",
3886
+ "surface": "composer + attach menu",
3887
+ "source": "aidream/apps/shared/chat/src/agents/components/inputs/smart-input/composer/ComposerPlusMenu.tsx:310",
3888
+ "coverage": "partial",
3889
+ "home": "feature section",
3890
+ "importance": "core",
3891
+ "area": "chat",
3892
+ "closest": "Send & Convert > Google Connections / My connections"
3893
+ },
3894
+ {
3895
+ "id": "audit:240",
3896
+ "label": "Composer + menu",
3897
+ "feature": "Composer + menu: Environment (run on Cloud, your computers, sandboxes, persistent browser, add a sandbox or computer)",
3898
+ "surface": "composer + attach menu",
3899
+ "source": "aidream/apps/shared/chat/src/agents/components/inputs/smart-input/composer/ComposerPlusMenu.tsx:613",
3900
+ "coverage": "missing",
3901
+ "home": "feature section",
3902
+ "importance": "core",
3903
+ "area": "chat"
3904
+ },
3905
+ {
3906
+ "id": "audit:241",
3907
+ "label": "Composer + menu",
3908
+ "feature": "Composer + menu: Model and overrides (model and per-run settings); All options (Chat Options window)",
3909
+ "surface": "composer + attach menu",
3910
+ "source": "aidream/apps/shared/chat/src/agents/components/inputs/smart-input/composer/ComposerPlusMenu.tsx:372",
3911
+ "coverage": "missing",
3912
+ "home": "window",
3913
+ "importance": "core",
3914
+ "area": "chat"
3915
+ },
3916
+ {
3917
+ "id": "audit:242",
3918
+ "label": "Composer toggles",
3919
+ "feature": "Composer toggles: Preview context, Memory, Enter sends, Working doc, Scratchpad, Auto-clear, Live audio",
3920
+ "surface": "composer + attach menu",
3921
+ "source": "aidream/apps/shared/chat/src/agents/components/inputs/smart-input/composer/ComposerPlusMenu.tsx:386",
3922
+ "coverage": "missing",
3923
+ "home": "feature section",
3924
+ "importance": "core",
3925
+ "area": "chat"
3926
+ },
3927
+ {
3928
+ "id": "audit:243",
3929
+ "label": "Composer + menu",
3930
+ "feature": "Composer + menu: Message templates (insert template into draft)",
3931
+ "surface": "composer + attach menu",
3932
+ "source": "aidream/apps/shared/chat/src/agents/components/inputs/smart-input/composer/ComposerPlusMenu.tsx:395",
3933
+ "coverage": "partial",
3934
+ "home": "feature section",
3935
+ "importance": "useful",
3936
+ "area": "chat",
3937
+ "closest": "Intelligence > AI Resources > Content blocks"
3938
+ },
3939
+ {
3940
+ "id": "audit:244",
3941
+ "label": "Composer",
3942
+ "feature": "Composer: Creator panel toggle (agent creator or admin only)",
3943
+ "surface": "composer + menu, conditional",
3944
+ "source": "aidream/apps/shared/chat/src/agents/components/inputs/smart-input/composer/ComposerPlusMenu.tsx:460",
3945
+ "coverage": "partial",
3946
+ "home": "feature section",
3947
+ "importance": "useful",
3948
+ "area": "chat",
3949
+ "closest": "ADMIN ACTIONS > Creator Options"
3950
+ },
3951
+ {
3952
+ "id": "audit:245",
3953
+ "label": "Composer agent pill menu",
3954
+ "feature": "Composer agent pill menu: starred chat agents, Custom, All agents, model for this chat; mode switch Chat / Work / Advanced; effort pill",
3955
+ "surface": "composer toolbar",
3956
+ "source": "aidream/apps/shared/chat/src/agents/components/inputs/smart-input/composer/ComposerAgentPill.tsx",
3957
+ "coverage": "partial",
3958
+ "home": "feature section",
3959
+ "importance": "core",
3960
+ "area": "chat",
3961
+ "closest": "Intelligence > Agents / My Intelligence"
3962
+ },
3963
+ {
3964
+ "id": "audit:246",
3965
+ "label": "Context rail chips",
3966
+ "feature": "Context rail chips: open Working document, Scratchpad, Tasks and todos, Cloud browser, artifacts; overflow list",
3967
+ "surface": "chat context rail above composer",
3968
+ "source": "aidream/apps/shared/chat/src/agents/components/inputs/smart-input/ConversationContextRail.tsx:400",
3969
+ "coverage": "missing",
3970
+ "home": "feature section",
3971
+ "importance": "useful",
3972
+ "area": "chat"
3973
+ },
3974
+ {
3975
+ "id": "audit:247",
3976
+ "label": "Working document view modes",
3977
+ "feature": "Working document view modes (Edit, Split, Write, Source, Preview) and Version history; scratchpad switcher with delete",
3978
+ "surface": "working document header",
3979
+ "source": "aidream/apps/shared/chat/src/agents/components/working-document/WorkingDocumentViewControls.tsx:33",
3980
+ "coverage": "partial",
3981
+ "home": "feature section",
3982
+ "importance": "useful",
3983
+ "area": "chat",
3984
+ "closest": "Content > View history"
3985
+ },
3986
+ {
3987
+ "id": "audit:248",
3988
+ "label": "Agent memory list",
3989
+ "feature": "Agent memory list: sort mode, per-memory options, delete memory",
3990
+ "surface": "chat agent memory sidebar and window",
3991
+ "source": "aidream/apps/shared/chat/src/agents/components/memory/components/AgentMemorySidebar.tsx:101",
3992
+ "coverage": "missing",
3993
+ "home": "window",
3994
+ "importance": "useful",
3995
+ "area": "chat"
3996
+ },
3997
+ {
3998
+ "id": "audit:249",
3999
+ "label": "Agent menu",
4000
+ "feature": "Agent menu: Copy agent ID, Copy agent name, Open in builder, Refresh agent data",
4001
+ "surface": "agent section of the context menu",
4002
+ "source": "aidream/apps/shared/chat/src/agents/menu/agent-actions.tsx:79",
4003
+ "coverage": "partial",
4004
+ "home": "feature section",
4005
+ "importance": "useful",
4006
+ "area": "chat",
4007
+ "closest": "Intelligence > Agents, Insert / Copy reference"
4008
+ },
4009
+ {
4010
+ "id": "audit:250",
4011
+ "label": "Agent options menu",
4012
+ "feature": "Agent options menu: Edit Agent Info, View Run History, Advanced Settings, View All Versions, Open Run Modal, Optimizer, Find Usages, Drift Report, Refresh Server Cache, Create Shortcut, Duplicate, Linked Agent Sync, Convert to Template, Create App, Add Data Storage Support, Save as Template, Import Agent",
4013
+ "surface": "agent builder and agent cards",
4014
+ "source": "matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:100",
4015
+ "coverage": "partial",
4016
+ "home": "feature section",
4017
+ "importance": "core",
4018
+ "area": "agents",
4019
+ "closest": "Content > Duplicate; Content > View history"
4020
+ },
4021
+ {
4022
+ "id": "audit:251",
4023
+ "label": "Agent card actions",
4024
+ "feature": "Agent card actions: Open in Chat, View Agent, Build Agent, Run Agent, View Versions, Find Usages (Admin)",
4025
+ "surface": "agent card and list row menus",
4026
+ "source": "matrx-frontend/features/agents/components/agent-listings/AgentCard.tsx",
4027
+ "coverage": "missing",
4028
+ "home": "feature section",
4029
+ "importance": "core",
4030
+ "area": "tables"
4031
+ },
4032
+ {
4033
+ "id": "audit:252",
4034
+ "label": "Agent mode tabs",
4035
+ "feature": "Agent mode tabs: View, Build, Run, Shortcuts, Apps, Surfaces, Review, Runs, Versions, Widgets, New",
4036
+ "surface": "agent page header controller",
4037
+ "source": "aidream/apps/shared/chat/src/agents/components/shared/AgentModeController.tsx:55",
4038
+ "coverage": "missing",
4039
+ "home": "feature section",
4040
+ "importance": "useful",
4041
+ "area": "chat"
4042
+ },
4043
+ {
4044
+ "id": "audit:253",
4045
+ "label": "Public chat",
4046
+ "feature": "Public chat: View in Canvas, Add to Tasks, Share as HTML",
4047
+ "surface": "public chat message menu",
4048
+ "source": "aidream/apps/shared/chat/src/public-chat/components/PublicMessageOptionsMenu.tsx:463",
4049
+ "coverage": "partial",
4050
+ "home": "feature section",
4051
+ "importance": "useful",
4052
+ "area": "chat",
4053
+ "closest": "Send & Convert > Task; Share & Publish > Publish as web page"
4054
+ },
4055
+ {
4056
+ "id": "audit:254",
4057
+ "label": "Messenger menu",
4058
+ "feature": "Messenger menu: switch account or workspace entries with a checkmark; thread header and contact list actions",
4059
+ "surface": "messenger",
4060
+ "source": "aidream/apps/shared/chat/src/messenger/MessengerMenu.tsx:52",
4061
+ "coverage": "missing",
4062
+ "home": "feature section",
4063
+ "importance": "useful",
4064
+ "area": "chat"
4065
+ },
4066
+ {
4067
+ "id": "audit:255",
4068
+ "label": "Follow-up suggestion chips under an answer",
4069
+ "feature": "Follow-up suggestion chips under an answer",
4070
+ "surface": "chat transcript",
4071
+ "source": "aidream/apps/shared/chat/src/agents/components/messages-display/conversation-tools/FollowUpSuggestions.tsx:67",
4072
+ "coverage": "missing",
4073
+ "home": "feature section",
4074
+ "importance": "useful",
4075
+ "area": "chat"
4076
+ },
4077
+ {
4078
+ "id": "audit:256",
4079
+ "label": "Window-panel history actions",
4080
+ "feature": "Window-panel history actions: chat history window, run history, live run, run controls, message analysis, markdown debug",
4081
+ "surface": "chat window panels",
4082
+ "source": "aidream/apps/shared/chat/src/window-panels/windows/agents/ChatHistoryWindow.tsx",
4083
+ "coverage": "missing",
4084
+ "home": "window",
4085
+ "importance": "useful",
4086
+ "area": "chat"
4087
+ },
4088
+ {
4089
+ "id": "audit:257",
4090
+ "label": "Quick Chat window",
4091
+ "feature": "Quick Chat window (small floating chat, separate from 'Chat about this')",
4092
+ "surface": "engine Quick Actions submenu",
4093
+ "source": "aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:935",
4094
+ "coverage": "partial",
4095
+ "home": "main menu",
4096
+ "importance": "useful",
4097
+ "area": "agents",
4098
+ "closest": "Intelligence > Chat about this"
4099
+ },
4100
+ {
4101
+ "id": "audit:258",
4102
+ "label": "Quick Data window",
4103
+ "feature": "Quick Data window (open data quick-sheet)",
4104
+ "surface": "engine Quick Actions submenu",
4105
+ "source": "aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:936",
4106
+ "coverage": "missing",
4107
+ "home": "window",
4108
+ "importance": "useful",
4109
+ "area": "agents"
4110
+ },
4111
+ {
4112
+ "id": "audit:259",
4113
+ "label": "Quick Files window",
4114
+ "feature": "Quick Files window (open files quick-sheet)",
4115
+ "surface": "engine Quick Actions submenu",
4116
+ "source": "aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:937",
4117
+ "coverage": "missing",
4118
+ "home": "window",
4119
+ "importance": "useful",
4120
+ "area": "agents"
4121
+ },
4122
+ {
4123
+ "id": "audit:260",
4124
+ "label": "Voice Input pad",
4125
+ "feature": "Voice Input pad (voice pad)",
4126
+ "surface": "engine Quick Actions submenu",
4127
+ "source": "aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:938",
4128
+ "coverage": "partial",
4129
+ "home": "main menu",
4130
+ "importance": "useful",
4131
+ "area": "agents",
4132
+ "closest": "Listen & Speak > Dictate"
4133
+ },
4134
+ {
4135
+ "id": "audit:261",
4136
+ "label": "Quick Notes and Quick Tasks capture windows",
4137
+ "feature": "Quick Notes and Quick Tasks capture windows (open the quick window, not 'send this to a note')",
4138
+ "surface": "engine Quick Actions submenu",
4139
+ "source": "aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:933",
4140
+ "coverage": "partial",
4141
+ "home": "main menu",
4142
+ "importance": "useful",
4143
+ "area": "agents",
4144
+ "closest": "Send & Convert > Notes / Task"
4145
+ },
4146
+ {
4147
+ "id": "audit:262",
4148
+ "label": "Link a record\u2026",
4149
+ "feature": "Link a record\u2026 (link this item to another record)",
4150
+ "surface": "engine share group",
4151
+ "source": "aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:885",
4152
+ "coverage": "partial",
4153
+ "home": "main menu",
4154
+ "importance": "core",
4155
+ "area": "agents",
4156
+ "closest": "Organize > Attach to\u2026"
4157
+ },
4158
+ {
4159
+ "id": "audit:263",
4160
+ "label": "Compare with base",
4161
+ "feature": "Compare with base (second half of the compare pair, appears once a base is set)",
4162
+ "surface": "engine compare submenu",
4163
+ "source": "aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:836",
4164
+ "coverage": "partial",
4165
+ "home": "main menu",
4166
+ "importance": "useful",
4167
+ "area": "agents",
4168
+ "closest": "Content > Compare (Set as compare base / Compare with clipboard / Open Compare Window)"
4169
+ },
4170
+ {
4171
+ "id": "audit:264",
4172
+ "label": "Summarize without playing",
4173
+ "feature": "Summarize without playing / Summarize & listen (spoken summary of selection or content)",
4174
+ "surface": "engine Listen submenu (read-only content)",
4175
+ "source": "aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:669",
4176
+ "coverage": "partial",
4177
+ "home": "main menu",
4178
+ "importance": "useful",
4179
+ "area": "agents",
4180
+ "closest": "Listen & Speak > Condense & Read"
4181
+ },
4182
+ {
4183
+ "id": "audit:265",
4184
+ "label": "JSON tools on JSON text",
4185
+ "feature": "JSON tools on JSON text: prettify/format, minify, copy minified, 'Invalid JSON' honest row with parse error",
4186
+ "surface": "engine JSON submenu",
4187
+ "source": "aidream/apps/shared/context-menu/src/engine/utils/json-menu-actions.ts:110-181",
4188
+ "coverage": "partial",
4189
+ "home": "feature section",
4190
+ "importance": "useful",
4191
+ "area": "agents",
4192
+ "closest": "Copy > Data > Copy as JSON"
4193
+ },
4194
+ {
4195
+ "id": "audit:266",
4196
+ "label": "Bind an agent to this page\u2026",
4197
+ "feature": "Bind an agent to this page\u2026 (attach an agent to the current screen)",
4198
+ "surface": "engine surface submenu",
4199
+ "source": "aidream/apps/shared/context-menu/src/engine/hooks/useContextMenuActions.ts:1076",
4200
+ "coverage": "partial",
4201
+ "home": "main menu",
4202
+ "importance": "core",
4203
+ "area": "agents",
4204
+ "closest": "My Intelligence > Customize"
4205
+ },
4206
+ {
4207
+ "id": "audit:267",
4208
+ "label": "Agents on this page",
4209
+ "feature": "Agents on this page (list of agents bound to this surface, grouped by scope/organization)",
4210
+ "surface": "engine surface submenu",
4211
+ "source": "aidream/apps/shared/context-menu/src/engine/hooks/useContextMenuActions.ts:1149",
4212
+ "coverage": "partial",
4213
+ "home": "main menu",
4214
+ "importance": "core",
4215
+ "area": "agents",
4216
+ "closest": "Intelligence > Agents"
4217
+ },
4218
+ {
4219
+ "id": "audit:268",
4220
+ "label": "Surface Context",
4221
+ "feature": "Surface Context (view the live page values the menu and agents can see)",
4222
+ "surface": "engine surface submenu",
4223
+ "source": "aidream/apps/shared/context-menu/src/engine/hooks/useContextMenuActions.ts:1114",
4224
+ "coverage": "missing",
4225
+ "home": "window",
4226
+ "importance": "useful",
4227
+ "area": "agents"
4228
+ },
4229
+ {
4230
+ "id": "audit:269",
4231
+ "label": "Surface Context Admin",
4232
+ "feature": "Surface Context Admin (contract, provenance and settings editor)",
4233
+ "surface": "engine surface submenu, admin power only",
4234
+ "source": "aidream/apps/shared/context-menu/src/engine/hooks/useContextMenuActions.ts:1132",
4235
+ "coverage": "partial",
4236
+ "home": "window",
4237
+ "importance": "useful",
4238
+ "area": "agents",
4239
+ "closest": "Admin Actions > Super Admin"
4240
+ },
4241
+ {
4242
+ "id": "audit:270",
4243
+ "label": "Related surfaces",
4244
+ "feature": "Related surfaces (parent and child pages of this surface, open their context)",
4245
+ "surface": "engine surface submenu",
4246
+ "source": "aidream/apps/shared/context-menu/src/engine/hooks/useContextMenuActions.ts:1158",
4247
+ "coverage": "missing",
4248
+ "home": "window",
4249
+ "importance": "rare",
4250
+ "area": "agents"
4251
+ },
4252
+ {
4253
+ "id": "audit:271",
4254
+ "label": "Copy surface location key",
4255
+ "feature": "Copy surface location key (click to copy the screen's internal name) and menu revision (v3.N / V#)",
4256
+ "surface": "engine surface submenu, admin debugger only",
4257
+ "source": "aidream/apps/shared/context-menu/src/engine/hooks/useContextMenuActions.ts:1103,1170",
4258
+ "coverage": "partial",
4259
+ "home": "main menu",
4260
+ "importance": "rare",
4261
+ "area": "agents",
4262
+ "closest": "Admin Actions > Super Admin"
4263
+ },
4264
+ {
4265
+ "id": "audit:272",
4266
+ "label": "Enable/Disable Debug Mode toggle",
4267
+ "feature": "Enable/Disable Debug Mode toggle",
4268
+ "surface": "engine Admin Tools",
4269
+ "source": "aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:978",
4270
+ "coverage": "partial",
4271
+ "home": "main menu",
4272
+ "importance": "useful",
4273
+ "area": "agents",
4274
+ "closest": "Admin Actions > Super Admin"
4275
+ },
4276
+ {
4277
+ "id": "audit:273",
4278
+ "label": "Context Values inspector",
4279
+ "feature": "Context Values inspector (what values this page/menu resolves)",
4280
+ "surface": "engine Admin Tools",
4281
+ "source": "aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:986",
4282
+ "coverage": "partial",
4283
+ "home": "window",
4284
+ "importance": "useful",
4285
+ "area": "agents",
4286
+ "closest": "Admin Actions > Super Admin"
4287
+ },
4288
+ {
4289
+ "id": "audit:274",
4290
+ "label": "Redux State viewer",
4291
+ "feature": "Redux State viewer (only while debug mode is on)",
4292
+ "surface": "engine Admin Tools",
4293
+ "source": "aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:996",
4294
+ "coverage": "partial",
4295
+ "home": "window",
4296
+ "importance": "rare",
4297
+ "area": "agents",
4298
+ "closest": "Admin Actions > Super Admin"
4299
+ },
4300
+ {
4301
+ "id": "audit:275",
4302
+ "label": "Show/Hide Admin Indicator toggle",
4303
+ "feature": "Show/Hide Admin Indicator toggle",
4304
+ "surface": "engine Admin Tools",
4305
+ "source": "aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:1007",
4306
+ "coverage": "partial",
4307
+ "home": "main menu",
4308
+ "importance": "rare",
4309
+ "area": "agents",
4310
+ "closest": "Admin Actions > Super Admin"
4311
+ },
4312
+ {
4313
+ "id": "audit:276",
4314
+ "label": "Insert",
4315
+ "feature": "Insert / Copy reference\u2026 for a record or text (insert a link/reference into an editor)",
4316
+ "surface": "engine Edit group (cm:insert-reference)",
4317
+ "source": "aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:764",
4318
+ "coverage": "partial",
4319
+ "home": "main menu",
4320
+ "importance": "useful",
4321
+ "area": "agents",
4322
+ "closest": "Share & Publish > Insert / Copy reference\u2026"
4323
+ },
4324
+ {
4325
+ "id": "audit:277",
4326
+ "label": "Copy variants shown only when relevant",
4327
+ "feature": "Copy variants shown only when relevant: 'Copy as' registry entries per document type (e.g. rich document copy variants)",
4328
+ "surface": "engine Copy as submenu",
4329
+ "source": "aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:696",
4330
+ "coverage": "partial",
4331
+ "home": "feature section",
4332
+ "importance": "useful",
4333
+ "area": "agents",
4334
+ "closest": "Copy submenu (Text / For AI / Data)"
4335
+ },
4336
+ {
4337
+ "id": "audit:278",
4338
+ "label": "Page-own rows that merge into groups",
4339
+ "feature": "Page-own rows that merge into groups (custom per-pane rows, 'primary' clicked-target section first)",
4340
+ "surface": "engine extraSections / regroup",
4341
+ "source": "aidream/apps/shared/context-menu/src/engine/regroup/proposed-grouping.ts",
4342
+ "coverage": "partial",
4343
+ "home": "feature section",
4344
+ "importance": "core",
4345
+ "area": "agents",
4346
+ "closest": "THIS FEATURE NAME placeholder"
4347
+ },
4348
+ {
4349
+ "id": "audit:279",
4350
+ "label": "Source filter on a conversation row",
4351
+ "feature": "Source filter on a conversation row: Show only <source> / Hide <source>",
4352
+ "surface": "conversation row menu (history/sidebars)",
4353
+ "source": "aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:150-170",
4354
+ "coverage": "missing",
4355
+ "home": "feature section",
4356
+ "importance": "useful",
4357
+ "area": "chat"
4358
+ },
4359
+ {
4360
+ "id": "audit:280",
4361
+ "label": "Open agent for this conversation",
4362
+ "feature": "Open agent for this conversation / Open in new tab",
4363
+ "surface": "conversation row menu",
4364
+ "source": "aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:219-240",
4365
+ "coverage": "missing",
4366
+ "home": "feature section",
4367
+ "importance": "core",
4368
+ "area": "chat"
4369
+ },
4370
+ {
4371
+ "id": "audit:281",
4372
+ "label": "Add to project\u2026",
4373
+ "feature": "Add to project\u2026",
4374
+ "surface": "conversation row menu",
4375
+ "source": "aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:253",
4376
+ "coverage": "partial",
4377
+ "home": "main menu",
4378
+ "importance": "useful",
4379
+ "area": "chat",
4380
+ "closest": "Send & Convert > Project / Organize > Attach to\u2026"
4381
+ },
4382
+ {
4383
+ "id": "audit:282",
4384
+ "label": "Remove from this list",
4385
+ "feature": "Remove from this list (host-labelled, e.g. remove from project)",
4386
+ "surface": "conversation row menu",
4387
+ "source": "aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:261",
4388
+ "coverage": "missing",
4389
+ "home": "feature section",
4390
+ "importance": "useful",
4391
+ "area": "chat"
4392
+ },
4393
+ {
4394
+ "id": "audit:283",
4395
+ "label": "Make an agent from this conversation\u2026",
4396
+ "feature": "Make an agent from this conversation\u2026",
4397
+ "surface": "conversation row menu",
4398
+ "source": "aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:287",
4399
+ "coverage": "missing",
4400
+ "home": "feature section",
4401
+ "importance": "core",
4402
+ "area": "chat"
4403
+ },
4404
+ {
4405
+ "id": "audit:284",
4406
+ "label": "Exclude from",
4407
+ "feature": "Exclude from / include in knowledge graph toggle",
4408
+ "surface": "conversation row menu",
4409
+ "source": "aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:342",
4410
+ "coverage": "missing",
4411
+ "home": "feature section",
4412
+ "importance": "core",
4413
+ "area": "chat"
4414
+ },
4415
+ {
4416
+ "id": "audit:285",
4417
+ "label": "Archive/Unarchive with Undo toast",
4418
+ "feature": "Archive/Unarchive with Undo toast (archive is a toggle with a way back)",
4419
+ "surface": "conversation and agent rows",
4420
+ "source": "aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:294-340",
4421
+ "coverage": "partial",
4422
+ "home": "main menu",
4423
+ "importance": "core",
4424
+ "area": "chat",
4425
+ "closest": "icon strip > Archive"
4426
+ },
4427
+ {
4428
+ "id": "audit:286",
4429
+ "label": "Agent",
4430
+ "feature": "Agent: Run",
4431
+ "surface": "agent row/card menu",
4432
+ "source": "matrx-frontend/features/agents/browse/agentActionRegistry.tsx:120",
4433
+ "coverage": "partial",
4434
+ "home": "feature section",
4435
+ "importance": "core",
4436
+ "area": "tables",
4437
+ "closest": "Intelligence > Send to agent\u2026"
4438
+ },
4439
+ {
4440
+ "id": "audit:287",
4441
+ "label": "Agent",
4442
+ "feature": "Agent: Edit / Build, View, Quick look (sneak peek), Open in new tab",
4443
+ "surface": "agent row/card menu",
4444
+ "source": "matrx-frontend/features/agents/browse/agentActionRegistry.tsx:123-134",
4445
+ "coverage": "missing",
4446
+ "home": "feature section",
4447
+ "importance": "core",
4448
+ "area": "tables"
4449
+ },
4450
+ {
4451
+ "id": "audit:288",
4452
+ "label": "Agent",
4453
+ "feature": "Agent: Edit details (name/description/category quick edit)",
4454
+ "surface": "agent row/card menu",
4455
+ "source": "matrx-frontend/features/agents/browse/agentActionRegistry.tsx:156",
4456
+ "coverage": "partial",
4457
+ "home": "feature section",
4458
+ "importance": "useful",
4459
+ "area": "tables",
4460
+ "closest": "Content > Rename"
4461
+ },
4462
+ {
4463
+ "id": "audit:289",
4464
+ "label": "Agent",
4465
+ "feature": "Agent: Add/Remove favorite",
4466
+ "surface": "agent row/card menu",
4467
+ "source": "matrx-frontend/features/agents/browse/agentActionRegistry.tsx:164",
4468
+ "coverage": "partial",
4469
+ "home": "main menu",
4470
+ "importance": "useful",
4471
+ "area": "tables",
4472
+ "closest": "Organize > Pin"
4473
+ },
4474
+ {
4475
+ "id": "audit:290",
4476
+ "label": "Agent",
4477
+ "feature": "Agent: Version history, View all versions, Declare input/output/both break and Clear declaration (version contract breaks)",
4478
+ "surface": "agent row menu + version timeline",
4479
+ "source": "matrx-frontend/features/agents/browse/agentActionRegistry.tsx:182 ; features/agents/components/diff/VersionHistoryTimeline.tsx:351",
4480
+ "coverage": "partial",
4481
+ "home": "feature section",
4482
+ "importance": "core",
4483
+ "area": "documents",
4484
+ "closest": "Content > View history"
4485
+ },
4486
+ {
4487
+ "id": "audit:291",
4488
+ "label": "Agent",
4489
+ "feature": "Agent: Duplicate a specific past version as a new agent",
4490
+ "surface": "version history timeline",
4491
+ "source": "matrx-frontend/features/agents/components/diff/VersionHistoryTimeline.tsx:427,522",
4492
+ "coverage": "partial",
4493
+ "home": "feature section",
4494
+ "importance": "useful",
4495
+ "area": "documents",
4496
+ "closest": "Content > Duplicate"
4497
+ },
4498
+ {
4499
+ "id": "audit:292",
4500
+ "label": "Agent",
4501
+ "feature": "Agent: Add to set / Add to Orchestra (existing orchestra, New Orchestra with this agent, Browse all Orchestras)",
4502
+ "surface": "agent row menu + AddToOrchestraMenu",
4503
+ "source": "matrx-frontend/features/agents/browse/agentActionRegistry.tsx:201 ; features/agents/orchestras/components/AddToOrchestraMenu.tsx:78-118",
4504
+ "coverage": "missing",
4505
+ "home": "feature section",
4506
+ "importance": "core",
4507
+ "area": "tables"
4508
+ },
4509
+ {
4510
+ "id": "audit:293",
4511
+ "label": "Agent",
4512
+ "feature": "Agent: Open source agent (for a copy/fork)",
4513
+ "surface": "agent row menu, conditional on source_agent_id",
4514
+ "source": "matrx-frontend/features/agents/browse/agentActionRegistry.tsx:212",
4515
+ "coverage": "missing",
4516
+ "home": "feature section",
4517
+ "importance": "useful",
4518
+ "area": "tables"
4519
+ },
4520
+ {
4521
+ "id": "audit:294",
4522
+ "label": "Agent",
4523
+ "feature": "Agent: Shortcuts and Surfaces pages for this agent",
4524
+ "surface": "agent row menu",
4525
+ "source": "matrx-frontend/features/agents/browse/agentActionRegistry.tsx:221-228",
4526
+ "coverage": "missing",
4527
+ "home": "feature section",
4528
+ "importance": "core",
4529
+ "area": "tables"
4530
+ },
4531
+ {
4532
+ "id": "audit:295",
4533
+ "label": "Agent",
4534
+ "feature": "Agent: Create app from agent",
4535
+ "surface": "agent card, list item, builder menu",
4536
+ "source": "matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:123",
4537
+ "coverage": "missing",
4538
+ "home": "window",
4539
+ "importance": "core",
4540
+ "area": "agents"
4541
+ },
4542
+ {
4543
+ "id": "audit:296",
4544
+ "label": "Agent",
4545
+ "feature": "Agent: Save as template / Convert to Template / Share as organization template (with the tables its variables read)",
4546
+ "surface": "agent card and builder menus",
4547
+ "source": "matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:122,128",
4548
+ "coverage": "missing",
4549
+ "home": "window",
4550
+ "importance": "core",
4551
+ "area": "agents"
4552
+ },
4553
+ {
4554
+ "id": "audit:297",
4555
+ "label": "Agent",
4556
+ "feature": "Agent: Linked Agent Sync (create/open personal copy, pull system updates, push to system, convert to system agent)",
4557
+ "surface": "agent builder menu",
4558
+ "source": "matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:121",
4559
+ "coverage": "missing",
4560
+ "home": "window",
4561
+ "importance": "core",
4562
+ "area": "agents"
4563
+ },
4564
+ {
4565
+ "id": "audit:298",
4566
+ "label": "Agent",
4567
+ "feature": "Agent: Create Shortcut from this agent",
4568
+ "surface": "agent builder menu",
4569
+ "source": "matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:115",
4570
+ "coverage": "missing",
4571
+ "home": "feature section",
4572
+ "importance": "core",
4573
+ "area": "agents"
4574
+ },
4575
+ {
4576
+ "id": "audit:299",
4577
+ "label": "Agent",
4578
+ "feature": "Agent: Add Data Storage Support",
4579
+ "surface": "agent builder menu",
4580
+ "source": "matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:124",
4581
+ "coverage": "missing",
4582
+ "home": "feature section",
4583
+ "importance": "useful",
4584
+ "area": "agents"
4585
+ },
4586
+ {
4587
+ "id": "audit:300",
4588
+ "label": "Agent",
4589
+ "feature": "Agent: Import Agent (from file/JSON)",
4590
+ "surface": "agent builder menu (global item)",
4591
+ "source": "matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:133",
4592
+ "coverage": "missing",
4593
+ "home": "window",
4594
+ "importance": "useful",
4595
+ "area": "agents"
4596
+ },
4597
+ {
4598
+ "id": "audit:301",
4599
+ "label": "Agent",
4600
+ "feature": "Agent: Export agent (listed as coming soon)",
4601
+ "surface": "agent row menu",
4602
+ "source": "matrx-frontend/features/agents/browse/agentActionRegistry.tsx:244",
4603
+ "coverage": "partial",
4604
+ "home": "window",
4605
+ "importance": "useful",
4606
+ "area": "tables",
4607
+ "closest": "Export & Download"
4608
+ },
4609
+ {
4610
+ "id": "audit:302",
4611
+ "label": "Agent",
4612
+ "feature": "Agent: Edit Agent Info, View Run History, Advanced Settings View, Open Run Modal, Full Screen Editor (coming soon)",
4613
+ "surface": "agent builder menu",
4614
+ "source": "matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:100-106",
4615
+ "coverage": "missing",
4616
+ "home": "feature section",
4617
+ "importance": "core",
4618
+ "area": "agents"
4619
+ },
4620
+ {
4621
+ "id": "audit:303",
4622
+ "label": "Agent",
4623
+ "feature": "Agent: Matrx Agent Optimizer",
4624
+ "surface": "agent builder menu",
4625
+ "source": "matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:107",
4626
+ "coverage": "partial",
4627
+ "home": "window",
4628
+ "importance": "useful",
4629
+ "area": "agents",
4630
+ "closest": "Intelligence > AI Actions (Improve writing)"
4631
+ },
4632
+ {
4633
+ "id": "audit:304",
4634
+ "label": "Agent",
4635
+ "feature": "Agent: Find Usages (and Find Usages Admin), Drift Report",
4636
+ "surface": "agent builder menu",
4637
+ "source": "matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:108-109,172",
4638
+ "coverage": "missing",
4639
+ "home": "window",
4640
+ "importance": "useful",
4641
+ "area": "agents"
4642
+ },
4643
+ {
4644
+ "id": "audit:305",
4645
+ "label": "Agent",
4646
+ "feature": "Agent: Refresh Server Cache / Refresh agent data",
4647
+ "surface": "agent builder menu + agent section",
4648
+ "source": "matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:110 ; chat/src/agents/menu/agent-actions.tsx:107",
4649
+ "coverage": "partial",
4650
+ "home": "feature section",
4651
+ "importance": "useful",
4652
+ "area": "chat",
4653
+ "closest": "Content > Refresh"
4654
+ },
4655
+ {
4656
+ "id": "audit:306",
4657
+ "label": "Agent",
4658
+ "feature": "Agent: Open in Chat / View Agent / Build Agent / Run Agent / View Versions in new tab",
4659
+ "surface": "agent builder menu (new-tab links)",
4660
+ "source": "matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:139-168",
4661
+ "coverage": "missing",
4662
+ "home": "feature section",
4663
+ "importance": "useful",
4664
+ "area": "agents"
4665
+ },
4666
+ {
4667
+ "id": "audit:307",
4668
+ "label": "Agent",
4669
+ "feature": "Agent: Copy agent ID, Copy agent name, Copy link, Copy for AI (agent definition)",
4670
+ "surface": "agent section and registry",
4671
+ "source": "chat/src/agents/menu/agent-actions.tsx:79-96 ; agentActionRegistry.tsx:240-243",
4672
+ "coverage": "partial",
4673
+ "home": "feature section",
4674
+ "importance": "useful",
4675
+ "area": "chat",
4676
+ "closest": "Copy submenu"
4677
+ },
4678
+ {
4679
+ "id": "audit:308",
4680
+ "label": "Agent Sneak Peek copy variants",
4681
+ "feature": "Agent Sneak Peek copy variants: Complete agent definition, id/name/variables/slots, Full JSON with messages truncated",
4682
+ "surface": "agent sneak peek modal copy menu",
4683
+ "source": "matrx-frontend/features/agents/components/agent-listings/AgentSneakPeekModal.tsx:788-806",
4684
+ "coverage": "partial",
4685
+ "home": "feature section",
4686
+ "importance": "useful",
4687
+ "area": "agents",
4688
+ "closest": "Copy > For AI / Copy as JSON"
4689
+ },
4690
+ {
4691
+ "id": "audit:309",
4692
+ "label": "Agent tool list copy formats",
4693
+ "feature": "Agent tool list copy formats: full, compact, minimal, XML",
4694
+ "surface": "agent tools manager and modal",
4695
+ "source": "matrx-frontend/features/agents/components/tools-management/AgentToolsManager.tsx:1039-1088",
4696
+ "coverage": "partial",
4697
+ "home": "feature section",
4698
+ "importance": "rare",
4699
+ "area": "agents",
4700
+ "closest": "Copy > For AI"
4701
+ },
4702
+ {
4703
+ "id": "audit:310",
4704
+ "label": "Agent admin",
4705
+ "feature": "Agent admin: Make global built-in, Move to organization (super admin; coming soon)",
4706
+ "surface": "agent row menu admin submenu",
4707
+ "source": "matrx-frontend/features/agents/browse/agentActionRegistry.tsx:258-280",
4708
+ "coverage": "partial",
4709
+ "home": "feature section",
4710
+ "importance": "useful",
4711
+ "area": "tables",
4712
+ "closest": "Admin Actions > Super Admin"
4713
+ },
4714
+ {
4715
+ "id": "audit:311",
4716
+ "label": "Agent",
4717
+ "feature": "Agent: delete disabled with read-only reason for non-owners",
4718
+ "surface": "agent row menu",
4719
+ "source": "matrx-frontend/features/agents/browse/agentActionRegistry.tsx:287",
4720
+ "coverage": "partial",
4721
+ "home": "main menu",
4722
+ "importance": "useful",
4723
+ "area": "tables",
4724
+ "closest": "Content > Delete / Creator Options"
4725
+ },
4726
+ {
4727
+ "id": "audit:312",
4728
+ "label": "Agent builder message",
4729
+ "feature": "Agent builder message: View mode picker (Plain / Write / Split / Read)",
4730
+ "surface": "agent builder message toolbar",
4731
+ "source": "matrx-frontend/features/agents/components/builder/message-builders/MessageViewModeMenu.tsx:55-70",
4732
+ "coverage": "missing",
4733
+ "home": "feature section",
4734
+ "importance": "useful",
4735
+ "area": "chat"
4736
+ },
4737
+ {
4738
+ "id": "audit:313",
4739
+ "label": "Agent builder",
4740
+ "feature": "Agent builder: Add block menu (Text, Image, Audio, Video, YouTube, Questions, Speech script, Document) with edit-block",
4741
+ "surface": "agent builder message AddBlockButton",
4742
+ "source": "matrx-frontend/features/agents/components/builder/message-builders/AddBlockButton.tsx:118-203",
4743
+ "coverage": "partial",
4744
+ "home": "feature section",
4745
+ "importance": "core",
4746
+ "area": "chat",
4747
+ "closest": "Intelligence > AI Resources > Content blocks"
4748
+ },
4749
+ {
4750
+ "id": "audit:314",
4751
+ "label": "Agent widget tester",
4752
+ "feature": "Agent widget tester: Pick a Display Mode (open widget with each display type, test-mode badge)",
4753
+ "surface": "agent widgets page",
4754
+ "source": "matrx-frontend/features/agents/components/widgets/AgentWidgetsPage.tsx:536-560",
4755
+ "coverage": "missing",
4756
+ "home": "window",
4757
+ "importance": "useful",
4758
+ "area": "agents"
4759
+ },
4760
+ {
4761
+ "id": "audit:315",
4762
+ "label": "Agent org chart card menu",
4763
+ "feature": "Agent org chart card menu: Open / Open Orchestra, Branch view, Copy link, Position actions (Open its job / Build its agent, Define, Rename, Fill with a person, Clear), multi-select: Make an Orchestra, Delete, drag-drop 'Place under / Add to Orchestra / hands off to' choices, health views",
4764
+ "surface": "agent org chart",
4765
+ "source": "matrx-frontend/features/agents/org-chart/components/AgentOrgChartView.tsx:671-780,556-626,879",
4766
+ "coverage": "missing",
4767
+ "home": "feature section",
4768
+ "importance": "useful",
4769
+ "area": "agents"
4770
+ },
4771
+ {
4772
+ "id": "audit:316",
4773
+ "label": "Shortcut directory row",
4774
+ "feature": "Shortcut directory row: Open shortcut, Open in a new tab, Copy ID, Open its agent",
4775
+ "surface": "shortcut directory row menu",
4776
+ "source": "matrx-frontend/features/agent-shortcuts/components/ShortcutDirectory.tsx:330-356",
4777
+ "coverage": "missing",
4778
+ "home": "feature section",
4779
+ "importance": "core",
4780
+ "area": "tables"
4781
+ },
4782
+ {
4783
+ "id": "audit:317",
4784
+ "label": "Shortcut",
4785
+ "feature": "Shortcut: Duplicate, Promote to global, Link agent to shortcut, Import shortcuts, Move shortcut to Trash",
4786
+ "surface": "shortcut form/list modals",
4787
+ "source": "matrx-frontend/features/agent-shortcuts/components/DuplicateShortcutModal.tsx ; PromoteToGlobalModal.tsx ; LinkAgentToShortcutModal.tsx ; ImportShortcutsBrowserModal.tsx ; ShortcutForm.tsx:1066",
4788
+ "coverage": "partial",
4789
+ "home": "feature section",
4790
+ "importance": "core",
4791
+ "area": "tables",
4792
+ "closest": "Content > Duplicate / Delete; Admin Actions"
4793
+ },
4794
+ {
4795
+ "id": "audit:318",
4796
+ "label": "Shortcut category row",
4797
+ "feature": "Shortcut category row: Add subcategory, Edit, Duplicate, Activate/Deactivate, Delete",
4798
+ "surface": "shortcut category tree row buttons",
4799
+ "source": "matrx-frontend/features/agent-shortcuts/components/CategoryTree.tsx:232-286",
4800
+ "coverage": "missing",
4801
+ "home": "feature section",
4802
+ "importance": "core",
4803
+ "area": "tables"
4804
+ },
4805
+ {
4806
+ "id": "audit:319",
4807
+ "label": "Shortcut batch editor",
4808
+ "feature": "Shortcut batch editor: Customize fields, Grid vs surfaces view, Surfaces & shortcuts selector",
4809
+ "surface": "batch shortcuts editor toolbar",
4810
+ "source": "matrx-frontend/features/agent-shortcuts/components/batch/BatchShortcutsEditor.tsx:650-720",
4811
+ "coverage": "missing",
4812
+ "home": "window",
4813
+ "importance": "useful",
4814
+ "area": "agents"
4815
+ },
4816
+ {
4817
+ "id": "audit:320",
4818
+ "label": "Workflow run",
4819
+ "feature": "Workflow run: Open run, Open workflow",
4820
+ "surface": "workflow run row/readout menu",
4821
+ "source": "matrx-frontend/features/workflow-runtime/run-actions.tsx:93,104",
4822
+ "coverage": "missing",
4823
+ "home": "feature section",
4824
+ "importance": "core",
4825
+ "area": "tables"
4826
+ },
4827
+ {
4828
+ "id": "audit:321",
4829
+ "label": "Workflow sneak peek copy",
4830
+ "feature": "Workflow sneak peek copy: Graph JSON (nodes+edges), Execution core (what a caller feeds it), Workflow id",
4831
+ "surface": "workflow sneak peek copy menu",
4832
+ "source": "matrx-frontend/features/workflow-runtime/listings/core/WorkflowSneakPeek.tsx:259-297",
4833
+ "coverage": "partial",
4834
+ "home": "feature section",
4835
+ "importance": "useful",
4836
+ "area": "agents",
4837
+ "closest": "Copy > Data > Copy as JSON"
4838
+ },
4839
+ {
4840
+ "id": "audit:322",
4841
+ "label": "Canvas pane",
4842
+ "feature": "Canvas pane: New tab",
4843
+ "surface": "canvas pane menu",
4844
+ "source": "aidream/apps/shared/canvas/src/react/CanvasPane.tsx:306",
4845
+ "coverage": "missing",
4846
+ "home": "feature section",
4847
+ "importance": "useful",
4848
+ "area": "agents"
4849
+ },
4850
+ {
4851
+ "id": "audit:323",
4852
+ "label": "Canvas pane",
4853
+ "feature": "Canvas pane: Expand / Restore (fullscreen)",
4854
+ "surface": "canvas pane menu",
4855
+ "source": "aidream/apps/shared/canvas/src/react/CanvasPane.tsx:307",
4856
+ "coverage": "missing",
4857
+ "home": "feature section",
4858
+ "importance": "useful",
4859
+ "area": "agents"
4860
+ },
4861
+ {
4862
+ "id": "audit:324",
4863
+ "label": "Canvas pane",
4864
+ "feature": "Canvas pane: Split right / Split down",
4865
+ "surface": "canvas pane menu",
4866
+ "source": "aidream/apps/shared/canvas/src/react/CanvasPane.tsx:866-869",
4867
+ "coverage": "missing",
4868
+ "home": "feature section",
4869
+ "importance": "useful",
4870
+ "area": "agents"
4871
+ },
4872
+ {
4873
+ "id": "audit:325",
4874
+ "label": "Canvas pane",
4875
+ "feature": "Canvas pane: Pop out / Dock back",
4876
+ "surface": "canvas pane menu",
4877
+ "source": "aidream/apps/shared/canvas/src/react/CanvasPane.tsx:871-874",
4878
+ "coverage": "missing",
4879
+ "home": "feature section",
4880
+ "importance": "useful",
4881
+ "area": "agents"
4882
+ },
4883
+ {
4884
+ "id": "audit:326",
4885
+ "label": "Canvas pane",
4886
+ "feature": "Canvas pane: Close tab, Close other tabs, Close pane",
4887
+ "surface": "canvas pane menu",
4888
+ "source": "aidream/apps/shared/canvas/src/react/CanvasPane.tsx:879-880,308",
4889
+ "coverage": "missing",
4890
+ "home": "feature section",
4891
+ "importance": "useful",
4892
+ "area": "agents"
4893
+ },
4894
+ {
4895
+ "id": "audit:327",
4896
+ "label": "Canvas",
4897
+ "feature": "Canvas: All tabs list (overflow tab picker) and Move tab to another pane",
4898
+ "surface": "canvas tab strip overflow",
4899
+ "source": "aidream/apps/shared/canvas/src/react/CanvasPane.tsx:682-716,837",
4900
+ "coverage": "missing",
4901
+ "home": "feature section",
4902
+ "importance": "rare",
4903
+ "area": "agents"
4904
+ },
4905
+ {
4906
+ "id": "audit:328",
4907
+ "label": "Canvas output",
4908
+ "feature": "Canvas output: Print, Save as PDF, Copy image (each shown disabled with the reason when unavailable)",
4909
+ "surface": "canvas pane menu (output items)",
4910
+ "source": "aidream/apps/shared/canvas/src/react/output.ts:190-201",
4911
+ "coverage": "partial",
4912
+ "home": "main menu",
4913
+ "importance": "core",
4914
+ "area": "agents",
4915
+ "closest": "Export & Download > PDF / Print"
4916
+ },
4917
+ {
4918
+ "id": "audit:329",
4919
+ "label": "Canvas",
4920
+ "feature": "Canvas: per-kind menu items and body-contributed items (useCanvasMenuItems) and host item actions merged into the pane menu",
4921
+ "surface": "canvas pane menu",
4922
+ "source": "aidream/apps/shared/canvas/src/react/menuItems.ts ; CanvasPane.tsx:843-846",
4923
+ "coverage": "partial",
4924
+ "home": "feature section",
4925
+ "importance": "core",
4926
+ "area": "agents",
4927
+ "closest": "THIS FEATURE NAME placeholder"
4928
+ },
4929
+ {
4930
+ "id": "audit:330",
4931
+ "label": "Canvas keyboard shortcuts shown in menus",
4932
+ "feature": "Canvas keyboard shortcuts shown in menus: toggle canvas, expand, split, back/forward, next/previous tab, close tab",
4933
+ "surface": "canvas commands",
4934
+ "source": "aidream/apps/shared/canvas/src/core/commands.ts:44-54",
4935
+ "coverage": "missing",
4936
+ "home": "feature section",
4937
+ "importance": "rare",
4938
+ "area": "agents"
4939
+ },
4940
+ {
4941
+ "id": "audit:331",
4942
+ "label": "Terminal",
4943
+ "feature": "Terminal: Copy selection button and Paste key (long-press word select), keyboard accessory keys",
4944
+ "surface": "terminal touch UI",
4945
+ "source": "aidream/apps/shared/terminal/src/react/Terminal.tsx:591 ; core/keys.ts:58",
4946
+ "coverage": "partial",
4947
+ "home": "feature section",
4948
+ "importance": "rare",
4949
+ "area": "agents",
4950
+ "closest": "icon strip Copy / Paste"
4951
+ }
4952
+ ];
4953
+
1054
4954
  // src/builder/MenuBuilder.tsx
1055
4955
  var import_controls = require("@ai-matrx/design-system/controls");
1056
4956
 
@@ -1148,6 +5048,18 @@ function nodeFromPayload(p) {
1148
5048
  ...c.ai ? { ai: true } : {}
1149
5049
  };
1150
5050
  }
5051
+ if (p.type === "audit") {
5052
+ const f = AUDIT_FINDINGS.find((a) => a.id === p.id);
5053
+ if (!f) return null;
5054
+ return {
5055
+ id: newId("i"),
5056
+ kind: "item",
5057
+ catalogId: f.id,
5058
+ label: f.label,
5059
+ icon: "CircleDashed",
5060
+ note: `From the audit (${f.importance}, ${f.coverage}): ${f.feature} \u2014 today: ${f.surface} (${f.source})`
5061
+ };
5062
+ }
1151
5063
  if (p.type === "template") return TEMPLATES.find((t) => t.id === p.id)?.build() ?? null;
1152
5064
  if (p.type === "new") {
1153
5065
  if (p.kind === "section") return { id: newId("s"), kind: "section", label: "New section", children: [] };
@@ -1155,6 +5067,8 @@ function nodeFromPayload(p) {
1155
5067
  if (p.kind === "divider") return { id: newId("d"), kind: "divider" };
1156
5068
  if (p.kind === "slot-items") return { id: newId("p"), kind: "slot", shape: "items", fills: "any", label: "Everything else" };
1157
5069
  if (p.kind === "slot-menu") return { id: newId("p"), kind: "slot", shape: "submenu", fills: "any", label: "More", icon: "Ellipsis" };
5070
+ if (p.kind === "slot-feature") return { id: newId("p"), kind: "slot", shape: "feature", fills: "page-rows", label: "THIS FEATURE NAME", featureItems: 4 };
5071
+ if (p.kind === "search") return { id: newId("q"), kind: "search", placeholder: "Search this menu\u2026", autofocus: true };
1158
5072
  return { id: newId("i"), kind: "item", label: "New option", icon: "Circle" };
1159
5073
  }
1160
5074
  return null;
@@ -1445,7 +5359,7 @@ function Panel({ title, children, right }) {
1445
5359
  function Palette({ onAdd, startDrag, click }) {
1446
5360
  const [q, setQ] = (0, import_react2.useState)("");
1447
5361
  const query = q.trim().toLowerCase();
1448
- const shown = (c) => !query || c.label.toLowerCase().includes(query) || c.id.toLowerCase().includes(query) || c.group.toLowerCase().includes(query);
5362
+ const shown2 = (c) => !query || c.label.toLowerCase().includes(query) || c.id.toLowerCase().includes(query) || c.group.toLowerCase().includes(query);
1449
5363
  const add = (p) => {
1450
5364
  const n = nodeFromPayload(p);
1451
5365
  if (n) onAdd(n);
@@ -1475,12 +5389,15 @@ function Palette({ onAdd, startDrag, click }) {
1475
5389
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Option, { p: { type: "new", kind: "divider" }, icon: "Minus", label: "Divider" }),
1476
5390
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Option, { p: { type: "new", kind: "item" }, icon: "Plus", label: "Custom option" }),
1477
5391
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Option, { p: { type: "new", kind: "slot-items" }, icon: "ListPlus", label: "Placeholder \u2014 items" }),
1478
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Option, { p: { type: "new", kind: "slot-menu" }, icon: "FolderPlus", label: "Placeholder \u2014 submenu" })
5392
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Option, { p: { type: "new", kind: "slot-menu" }, icon: "FolderPlus", label: "Placeholder \u2014 submenu" }),
5393
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Option, { p: { type: "new", kind: "slot-feature" }, icon: "PanelTop", label: "Feature section" }),
5394
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Option, { p: { type: "new", kind: "search" }, icon: "Search", label: "Search box" })
1479
5395
  ] }),
1480
5396
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.RowGroup, { title: "Ready-made", children: TEMPLATES.map((t) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Option, { p: { type: "template", id: t.id }, icon: t.icon, label: t.label }, t.id)) })
1481
5397
  ] }),
5398
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(AuditPalette, { query, uses, Option }),
1482
5399
  CATALOG_GROUPS.map((g) => {
1483
- const matching = CATALOG.filter((c) => c.group === g && shown(c));
5400
+ const matching = CATALOG.filter((c) => c.group === g && shown2(c));
1484
5401
  const items = [...matching.filter((c) => !uses.has(c.id)), ...matching.filter((c) => uses.has(c.id))];
1485
5402
  if (items.length === 0) return null;
1486
5403
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.RowGroup, { title: g, children: items.map((c) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
@@ -1498,6 +5415,50 @@ function Palette({ onAdd, startDrag, click }) {
1498
5415
  ] })
1499
5416
  ] });
1500
5417
  }
5418
+ var AUDIT_HOMES = [
5419
+ { value: "main menu", label: "Main menu" },
5420
+ { value: "feature section", label: "Feature" },
5421
+ { value: "window", label: "Window" }
5422
+ ];
5423
+ var AUDIT_AREAS = {
5424
+ notes: "Notes",
5425
+ files: "Files & media",
5426
+ chat: "Chat",
5427
+ documents: "Code & documents",
5428
+ tables: "Tables & records",
5429
+ agents: "Agents, workflows & the engine"
5430
+ };
5431
+ var IMPORTANCE_ORDER = { core: 0, useful: 1, rare: 2 };
5432
+ function AuditPalette({ query, uses, Option }) {
5433
+ const [home, setHome] = (0, import_react2.useState)("main menu");
5434
+ const [openArea, setOpenArea] = (0, import_react2.useState)(null);
5435
+ const matches = (f) => !query || `${f.label} ${f.feature} ${f.surface}`.toLowerCase().includes(query);
5436
+ const pool = AUDIT_FINDINGS.filter((f) => query ? matches(f) : f.home === home);
5437
+ const placed = pool.filter((f) => uses.has(f.id)).length;
5438
+ const areas = Object.keys(AUDIT_AREAS).filter((a) => pool.some((f) => f.area === a));
5439
+ if (query && pool.length === 0) return null;
5440
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_controls.RowGroup, { title: `From the audit \u2014 ${pool.length - placed} not placed`, children: [
5441
+ !query && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.SegmentedControl, { "aria-label": "Where it belongs", value: home, data: AUDIT_HOMES, onValueChange: setHome, fill: true }),
5442
+ areas.map((a) => {
5443
+ const rows = pool.filter((f) => f.area === a).sort((x, y) => Number(uses.has(x.id)) - Number(uses.has(y.id)) || IMPORTANCE_ORDER[x.importance] - IMPORTANCE_ORDER[y.importance]);
5444
+ const open = Boolean(query) || openArea === a;
5445
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { children: [
5446
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.DisclosureHeader, { open, onClick: () => setOpenArea(open ? null : a), title: AUDIT_AREAS[a] ?? a, meta: String(rows.length) }),
5447
+ open && rows.map((f) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
5448
+ Option,
5449
+ {
5450
+ p: { type: "audit", id: f.id },
5451
+ icon: f.importance === "core" ? "CircleAlert" : "CircleDashed",
5452
+ label: f.label,
5453
+ dimmed: uses.has(f.id),
5454
+ end: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.Badge, { children: uses.has(f.id) ? "used" : f.importance })
5455
+ },
5456
+ f.id
5457
+ ))
5458
+ ] }, a);
5459
+ })
5460
+ ] });
5461
+ }
1501
5462
  function Structure(props) {
1502
5463
  const rootOver = props.over !== null && props.over.id === null;
1503
5464
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("main", { className: "flex min-h-0 flex-col overflow-hidden", children: [
@@ -1524,8 +5485,8 @@ function Rows(props) {
1524
5485
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_jsx_runtime3.Fragment, { children: list.map((node) => {
1525
5486
  const container = isContainer(node);
1526
5487
  const isOver = over?.id === node.id;
1527
- const label = node.kind === "divider" ? "\u2500\u2500\u2500\u2500 divider \u2500\u2500\u2500\u2500" : node.label || (node.kind === "section" ? "(unlabelled section)" : "(no label)");
1528
- const icon = node.kind === "item" || node.kind === "submenu" ? node.icon : node.kind === "slot" ? node.icon ?? slotSource(node.fills)?.icon ?? "Ellipsis" : node.kind === "section" ? "Rows3" : "Minus";
5488
+ const label = node.kind === "divider" ? "\u2500\u2500\u2500\u2500 divider \u2500\u2500\u2500\u2500" : node.kind === "search" ? `Search box \u2014 \u201C${node.placeholder}\u201D` : node.label || (node.kind === "section" ? "(unlabelled section)" : "(no label)");
5489
+ const icon = node.kind === "item" || node.kind === "submenu" ? node.icon : node.kind === "search" ? "Search" : node.kind === "slot" ? node.icon ?? slotSource(node.fills)?.icon ?? "Ellipsis" : node.kind === "section" ? "Rows3" : "Minus";
1529
5490
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { children: [
1530
5491
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1531
5492
  "div",
@@ -1551,7 +5512,8 @@ function Rows(props) {
1551
5512
  icon && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "text-muted-foreground", children: renderLucide(icon, "size-4") }),
1552
5513
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: `min-w-0 flex-1 truncate ${node.kind === "divider" ? "text-xs text-muted-foreground" : ""}`, children: label }),
1553
5514
  node.kind === "submenu" && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "text-[10px] text-muted-foreground", children: "submenu" }),
1554
- node.kind === "slot" && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.Badge, { children: node.shape === "submenu" ? "placeholder submenu" : "placeholder" }),
5515
+ node.kind === "slot" && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.Badge, { children: node.shape === "submenu" ? "placeholder submenu" : node.shape === "feature" ? "feature section" : "placeholder" }),
5516
+ node.unavailableWhen && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.Badge, { children: node.unavailable === "hide" ? "hides" : node.unavailable === "required" ? "required" : "disables" }),
1555
5517
  node.kind === "section" && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "text-[10px] text-muted-foreground", children: node.layout && node.layout !== "list" ? `${node.layout} section` : "section" }),
1556
5518
  node.kind === "item" && node.shortcut && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("kbd", { className: "text-[10px] text-muted-foreground", children: node.shortcut }),
1557
5519
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { className: "hidden items-center gap-0.5 group-hover:flex", children: [
@@ -1638,43 +5600,58 @@ function Versions({
1638
5600
  ] })
1639
5601
  ] });
1640
5602
  }
5603
+ var AVAILABILITY_OPTIONS = [
5604
+ { value: "available", label: "All available" },
5605
+ { value: "unavailable", label: "Some unavailable" }
5606
+ ];
1641
5607
  function Stage({ design: design2, selected, onSelect }) {
1642
5608
  const [at, setAt] = (0, import_react2.useState)(null);
5609
+ const [availability, setAvailability] = (0, import_react2.useState)("available");
1643
5610
  const [picked, setPicked] = (0, import_react2.useState)(null);
1644
5611
  const ref = (0, import_react2.useRef)(null);
1645
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Panel, { title: "Live menu", right: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "text-[11px] text-muted-foreground", children: "Right-click the grey area to open it there" }), children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1646
- "div",
5612
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
5613
+ Panel,
1647
5614
  {
1648
- ref,
1649
- onContextMenu: (e) => {
1650
- e.preventDefault();
1651
- const r = ref.current?.getBoundingClientRect();
1652
- if (r) setAt({ x: Math.max(8, Math.min(e.clientX - r.left, r.width - design2.look.width - 8)), y: Math.max(8, Math.min(e.clientY - r.top, r.height - (ref.current?.querySelector(".cm-menu")?.getBoundingClientRect().height ?? 160) - 8)) });
1653
- },
1654
- onClick: (e) => {
1655
- if (e.target === e.currentTarget) setAt(null);
1656
- },
1657
- "data-menu-bounds": "",
1658
- className: "relative min-h-[300px] overflow-visible rounded-lg bg-muted/60 p-4",
1659
- children: [
1660
- at ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1661
- MenuPreview,
1662
- {
1663
- design: design2,
1664
- renderIcon: renderLucide,
1665
- highlightId: selected,
1666
- onSelectNode: onSelect,
1667
- onPick: (i) => setPicked(i.label),
1668
- style: { position: "absolute", left: at.x, top: at.y, zIndex: 20 }
1669
- }
1670
- ) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(MenuPreview, { design: design2, renderIcon: renderLucide, highlightId: selected, onSelectNode: onSelect, onPick: (i) => setPicked(i.label) }),
1671
- picked && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "absolute right-3 bottom-2 text-xs text-muted-foreground", children: [
1672
- "Picked: ",
1673
- picked
1674
- ] })
1675
- ]
5615
+ title: "Live menu",
5616
+ right: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.SegmentedControl, { "aria-label": "Preview availability", value: availability, data: AVAILABILITY_OPTIONS, onValueChange: setAvailability }),
5617
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
5618
+ "div",
5619
+ {
5620
+ ref,
5621
+ onContextMenu: (e) => {
5622
+ e.preventDefault();
5623
+ const r = ref.current?.getBoundingClientRect();
5624
+ if (r) setAt({ x: Math.max(8, Math.min(e.clientX - r.left, r.width - design2.look.width - 8)), y: Math.max(8, Math.min(e.clientY - r.top, r.height - (ref.current?.querySelector(".cm-menu")?.getBoundingClientRect().height ?? 160) - 8)) });
5625
+ },
5626
+ onClick: (e) => {
5627
+ if (e.target === e.currentTarget) setAt(null);
5628
+ },
5629
+ "data-menu-bounds": "",
5630
+ className: "relative min-h-[300px] overflow-visible rounded-lg bg-muted/60 p-4",
5631
+ children: [
5632
+ at ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
5633
+ MenuPreview,
5634
+ {
5635
+ design: design2,
5636
+ renderIcon: renderLucide,
5637
+ highlightId: selected,
5638
+ onSelectNode: onSelect,
5639
+ onPick: (i) => setPicked(i.label),
5640
+ availability,
5641
+ style: { position: "absolute", left: at.x, top: at.y, zIndex: 20 }
5642
+ }
5643
+ ) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(MenuPreview, { design: design2, renderIcon: renderLucide, highlightId: selected, onSelectNode: onSelect, onPick: (i) => setPicked(i.label), availability }),
5644
+ picked && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "type-meta absolute right-3 bottom-2", children: [
5645
+ "Picked: ",
5646
+ picked,
5647
+ " \xB7 right-click the grey area to open the menu there"
5648
+ ] }),
5649
+ !picked && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "type-meta absolute right-3 bottom-2", children: "Right-click the grey area to open the menu there" })
5650
+ ]
5651
+ }
5652
+ )
1676
5653
  }
1677
- ) });
5654
+ );
1678
5655
  }
1679
5656
  var DENSITY_OPTIONS = [
1680
5657
  { value: "comfortable", label: "Comfortable" },
@@ -1703,31 +5680,108 @@ var FLAGS = [
1703
5680
  ["toggle", "Checkbox"],
1704
5681
  ["disabled", "Disabled"]
1705
5682
  ];
5683
+ var ROW_KINDS = [
5684
+ { value: "action", label: "Action" },
5685
+ { value: "checkbox", label: "Checkbox" },
5686
+ { value: "switch", label: "Switch" }
5687
+ ];
5688
+ var TONE_LABELS = {
5689
+ default: "Default",
5690
+ primary: "Primary",
5691
+ success: "Success (green)",
5692
+ warning: "Warning (amber)",
5693
+ info: "Info (blue)",
5694
+ destructive: "Destructive (red)",
5695
+ sky: "Sky",
5696
+ blue: "Blue",
5697
+ indigo: "Indigo",
5698
+ violet: "Violet",
5699
+ fuchsia: "Fuchsia",
5700
+ rose: "Rose",
5701
+ orange: "Orange",
5702
+ amber: "Amber",
5703
+ lime: "Lime",
5704
+ emerald: "Emerald",
5705
+ teal: "Teal",
5706
+ cyan: "Cyan",
5707
+ slate: "Slate"
5708
+ };
5709
+ var TONE_OPTIONS = MENU_TONES.map((value) => ({ value, label: TONE_LABELS[value] }));
5710
+ var UNAVAILABLE_OPTIONS = [
5711
+ { value: "disable", label: "Disable" },
5712
+ { value: "hide", label: "Hide" },
5713
+ { value: "required", label: "Required" }
5714
+ ];
5715
+ function keywordsText(k) {
5716
+ return (k ?? []).join(", ");
5717
+ }
5718
+ function keywordsFrom(text) {
5719
+ return text.split(",").map((w) => w.trim()).filter(Boolean);
5720
+ }
1706
5721
  function Inspector({ node, onChange }) {
1707
5722
  const catalog = node.catalogId ? catalogOption(node.catalogId) : void 0;
1708
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Panel, { title: `Selected ${node.kind === "slot" ? "placeholder" : node.kind}`, right: catalog ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.Badge, { children: catalog.id }) : void 0, children: [
1709
- node.kind === "divider" ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "type-secondary", children: "A divider has no settings." }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
1710
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Labelled, { label: "Label", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.Field, { "aria-label": "Label", value: node.label, onChange: (e) => onChange({ label: e.target.value }) }) }),
5723
+ const kindName = node.kind === "slot" ? node.shape === "feature" ? "feature section" : "placeholder" : node.kind === "search" ? "search box" : node.kind;
5724
+ const [keywordDraft, setKeywordDraft] = (0, import_react2.useState)(keywordsText(node.keywords));
5725
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Panel, { title: `Selected ${kindName}`, right: catalog ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.Badge, { children: catalog.id }) : void 0, children: [
5726
+ node.kind === "divider" ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "type-secondary", children: "A divider has no settings." }) : node.kind === "search" ? /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
5727
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Labelled, { label: "Placeholder text", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.Field, { "aria-label": "Placeholder text", value: node.placeholder, onChange: (e) => onChange({ placeholder: e.target.value }) }) }),
5728
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.SettingRow, { label: "Takes focus when the menu opens", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.Switch, { "aria-label": "Takes focus when the menu opens", checked: node.autofocus, onCheckedChange: (v) => onChange({ autofocus: v }) }) }),
5729
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "type-secondary mt-2", children: "Filters every option in the menu by its label, hint and keywords. What sits above it stays visible while searching." })
5730
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
5731
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Labelled, { label: node.kind === "slot" && node.shape === "feature" ? "Section header" : "Label", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.Field, { "aria-label": "Label", value: node.label, onChange: (e) => onChange({ label: e.target.value }) }) }),
1711
5732
  node.kind === "slot" && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SlotSettings, { node, onChange }),
1712
5733
  (node.kind === "item" || node.kind === "submenu") && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
1713
5734
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Labelled, { label: "Icon", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(IconPicker, { value: node.icon ?? "", onChange: (icon) => onChange({ icon }) }) }),
5735
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Labelled, { label: "Colour", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.Select, { "aria-label": "Colour", value: node.tone ?? "default", options: TONE_OPTIONS, onValueChange: (tone) => onChange({ tone }) }) }),
5736
+ node.tone && node.tone !== "default" && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.SettingRow, { label: "Colour the label too", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.Switch, { "aria-label": "Colour the label too", checked: Boolean(node.toneLabel), onCheckedChange: (v) => onChange({ toneLabel: v }) }) }),
1714
5737
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Labelled, { label: "Hint", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.Field, { "aria-label": "Hint", value: node.hint ?? "", onChange: (e) => onChange({ hint: e.target.value }) }) })
1715
5738
  ] }),
1716
5739
  node.kind === "item" && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
1717
5740
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Labelled, { label: "Shortcut", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.Field, { "aria-label": "Shortcut", value: node.shortcut ?? "", placeholder: "\u2318K", onChange: (e) => onChange({ shortcut: e.target.value }) }) }),
1718
- FLAGS.map(([k, label]) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.SettingRow, { label, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.Switch, { "aria-label": label, checked: Boolean(node[k]), onCheckedChange: (v) => onChange({ [k]: v }) }) }, k))
5741
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.SettingRow, { label: "Row is", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
5742
+ import_controls.SegmentedControl,
5743
+ {
5744
+ "aria-label": "Row is",
5745
+ value: node.switch ? "switch" : node.toggle ? "checkbox" : "action",
5746
+ data: ROW_KINDS,
5747
+ onValueChange: (k) => onChange({ toggle: k === "checkbox", switch: k === "switch" })
5748
+ }
5749
+ ) }),
5750
+ (node.switch || node.toggle) && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.SettingRow, { label: "On by default", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.Switch, { "aria-label": "On by default", checked: Boolean(node.defaultOn), onCheckedChange: (v) => onChange({ defaultOn: v }) }) }),
5751
+ FLAGS.filter(([k]) => k !== "toggle").map(([k, label]) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.SettingRow, { label, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.Switch, { "aria-label": label, checked: Boolean(node[k]), onCheckedChange: (v) => onChange({ [k]: v }) }) }, k))
1719
5752
  ] }),
1720
5753
  node.kind === "section" && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
1721
5754
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.SettingRow, { label: "Layout", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.SegmentedControl, { "aria-label": "Layout", value: node.layout ?? "list", data: LAYOUT_OPTIONS, onValueChange: (layout) => onChange({ layout }) }) }),
1722
5755
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.SettingRow, { label: "Starts folded", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.Switch, { "aria-label": "Starts folded", checked: Boolean(node.collapsible), onCheckedChange: (v) => onChange({ collapsible: v }) }) })
1723
- ] })
5756
+ ] }),
5757
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Labelled, { label: "Search keywords (comma-separated)", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
5758
+ import_controls.Field,
5759
+ {
5760
+ "aria-label": "Search keywords",
5761
+ placeholder: "e.g. clipboard, duplicate",
5762
+ value: keywordDraft,
5763
+ onChange: (e) => setKeywordDraft(e.target.value),
5764
+ onBlur: () => onChange({ keywords: keywordsFrom(keywordDraft) })
5765
+ }
5766
+ ) }),
5767
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Labelled, { label: "Unavailable when", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
5768
+ import_controls.Field,
5769
+ {
5770
+ "aria-label": "Unavailable when",
5771
+ placeholder: "e.g. no editable text \xB7 not an org admin",
5772
+ value: node.unavailableWhen ?? "",
5773
+ onChange: (e) => onChange({ unavailableWhen: e.target.value })
5774
+ }
5775
+ ) }),
5776
+ node.unavailableWhen && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.SettingRow, { label: "Then", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.SegmentedControl, { "aria-label": "When unavailable", value: node.unavailable ?? "disable", data: UNAVAILABLE_OPTIONS, onValueChange: (unavailable) => onChange({ unavailable }) }) })
1724
5777
  ] }),
1725
5778
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Labelled, { label: "Note for the build", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.Textarea, { "aria-label": "Note for the build", rows: 2, autoGrow: true, value: node.note ?? "", onChange: (e) => onChange({ note: e.target.value }) }) })
1726
5779
  ] });
1727
5780
  }
1728
5781
  var SLOT_SHAPES = [
1729
5782
  { value: "items", label: "Rows here" },
1730
- { value: "submenu", label: "One submenu" }
5783
+ { value: "submenu", label: "One submenu" },
5784
+ { value: "feature", label: "Feature section" }
1731
5785
  ];
1732
5786
  var SLOT_OPTIONS = SLOT_SOURCES.map((src) => ({ value: src.id, label: src.label }));
1733
5787
  function SlotSettings({ node, onChange }) {
@@ -1746,7 +5800,10 @@ function SlotSettings({ node, onChange }) {
1746
5800
  }
1747
5801
  ) }),
1748
5802
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.SettingRow, { label: "Shows as", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.SegmentedControl, { "aria-label": "Shows as", value: node.shape, data: SLOT_SHAPES, onValueChange: (shape) => onChange({ shape }) }) }),
1749
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SlotContents, { fills: node.fills })
5803
+ node.shape === "feature" ? /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
5804
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.SettingRow, { label: "Rows before \u201CMore\u201D", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_controls.NumberStepper, { value: node.featureItems ?? 4, min: 0, max: 12, onChange: (featureItems) => onChange({ featureItems }) }) }),
5805
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "type-secondary mt-2", children: "Where the place this menu opens on puts its own options: this header, the first rows, then the rest under \u201CMore\u201D." })
5806
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SlotContents, { fills: node.fills })
1750
5807
  ] });
1751
5808
  }
1752
5809
  function SlotContents({ fills }) {
@@ -1765,7 +5822,7 @@ function Labelled({ label, children }) {
1765
5822
  function IconPicker({ value, onChange }) {
1766
5823
  const [q, setQ] = (0, import_react2.useState)("");
1767
5824
  const [open, setOpen] = (0, import_react2.useState)(false);
1768
- const shown = (0, import_react2.useMemo)(() => {
5825
+ const shown2 = (0, import_react2.useMemo)(() => {
1769
5826
  const s = q.trim().toLowerCase();
1770
5827
  return (s ? ICON_NAMES.filter((n) => n.toLowerCase().includes(s)) : ICON_NAMES).slice(0, 96);
1771
5828
  }, [q]);
@@ -1788,7 +5845,7 @@ function IconPicker({ value, onChange }) {
1788
5845
  onChange("");
1789
5846
  setOpen(false);
1790
5847
  } }),
1791
- shown.map((n) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
5848
+ shown2.map((n) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1792
5849
  import_controls.Button,
1793
5850
  {
1794
5851
  variant: "quiet",