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