@ai-matrx/agents 0.59.204 → 0.59.205

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,10 +1,20 @@
1
1
  # Changelog
2
2
 
3
- ## 0.59.204
3
+ ## 0.59.205
4
4
 
5
5
  UNVERIFIED: this release has no Unreleased entry and the source comparison could not be made (the caller supplied no source comparison). Whether source changed is unknown; consumer action is unknown.
6
6
  Check the package's gitHead on npm against this version's gitHead: `git diff <previous gitHead> <this gitHead> -- apps/shared/matrx-agents/src`.
7
7
 
8
+ ## 0.59.204
9
+
10
+ Automatic changed-only republish (docs/metadata drift since the last published version; verified: `git diff 5a78bc1e32 4d832f50ff -- apps/shared/matrx-agents/src`
11
+ has no shipped-source changes outside tests, fixtures and docs). No consumer action required.
12
+
13
+ ## 0.59.203
14
+
15
+ Automatic changed-only republish (docs/metadata drift since the last published version; verified: `git diff 87ac441108 5a78bc1e32 -- apps/shared/matrx-agents/src`
16
+ has no shipped-source changes outside tests, fixtures and docs). No consumer action required.
17
+
8
18
  ## 0.59.202
9
19
 
10
20
  Automatic changed-only republish (docs/metadata drift since the last published version; verified: `git diff 6085e09f65 87ac441108 -- apps/shared/matrx-agents/src`
@@ -669,6 +669,8 @@ var MANDATE_KEYS = {
669
669
  vision_interview__sounding_board: "vision_interview.sounding_board",
670
670
  vision_interview__transcript_cleaner: "vision_interview.transcript_cleaner",
671
671
  vision_interview__vision_author: "vision_interview.vision_author",
672
+ visual_maps__diagram_repair: "visual_maps.diagram_repair",
673
+ visual_maps__diagram_review: "visual_maps.diagram_review",
672
674
  voice__communicator: "voice.communicator",
673
675
  voice__gemini_live: "voice.gemini_live",
674
676
  voice__intro: "voice.intro",
@@ -703,7 +705,7 @@ var MANDATE_KEYS = {
703
705
  */
704
706
  brand_discovery__offering_roles: "brand_discovery.offering_roles",
705
707
  /**
706
- * @deprecated retiring since 0.59.204 — no longer declared in
708
+ * @deprecated retiring since 0.59.205 — no longer declared in
707
709
  * aidream. It leaves this union once no snapshot within the last
708
710
  * 3 published versions still carries it as active.
709
711
  */
@@ -646,6 +646,8 @@ var MANDATE_KEYS = {
646
646
  vision_interview__sounding_board: "vision_interview.sounding_board",
647
647
  vision_interview__transcript_cleaner: "vision_interview.transcript_cleaner",
648
648
  vision_interview__vision_author: "vision_interview.vision_author",
649
+ visual_maps__diagram_repair: "visual_maps.diagram_repair",
650
+ visual_maps__diagram_review: "visual_maps.diagram_review",
649
651
  voice__communicator: "voice.communicator",
650
652
  voice__gemini_live: "voice.gemini_live",
651
653
  voice__intro: "voice.intro",
@@ -680,7 +682,7 @@ var MANDATE_KEYS = {
680
682
  */
681
683
  brand_discovery__offering_roles: "brand_discovery.offering_roles",
682
684
  /**
683
- * @deprecated retiring since 0.59.204 — no longer declared in
685
+ * @deprecated retiring since 0.59.205 — no longer declared in
684
686
  * aidream. It leaves this union once no snapshot within the last
685
687
  * 3 published versions still carries it as active.
686
688
  */
@@ -622,6 +622,8 @@ var MANDATE_KEYS = {
622
622
  vision_interview__sounding_board: "vision_interview.sounding_board",
623
623
  vision_interview__transcript_cleaner: "vision_interview.transcript_cleaner",
624
624
  vision_interview__vision_author: "vision_interview.vision_author",
625
+ visual_maps__diagram_repair: "visual_maps.diagram_repair",
626
+ visual_maps__diagram_review: "visual_maps.diagram_review",
625
627
  voice__communicator: "voice.communicator",
626
628
  voice__gemini_live: "voice.gemini_live",
627
629
  voice__intro: "voice.intro",
@@ -656,7 +658,7 @@ var MANDATE_KEYS = {
656
658
  */
657
659
  brand_discovery__offering_roles: "brand_discovery.offering_roles",
658
660
  /**
659
- * @deprecated retiring since 0.59.204 — no longer declared in
661
+ * @deprecated retiring since 0.59.205 — no longer declared in
660
662
  * aidream. It leaves this union once no snapshot within the last
661
663
  * 3 published versions still carries it as active.
662
664
  */
@@ -594,6 +594,8 @@ var MANDATE_KEYS = {
594
594
  vision_interview__sounding_board: "vision_interview.sounding_board",
595
595
  vision_interview__transcript_cleaner: "vision_interview.transcript_cleaner",
596
596
  vision_interview__vision_author: "vision_interview.vision_author",
597
+ visual_maps__diagram_repair: "visual_maps.diagram_repair",
598
+ visual_maps__diagram_review: "visual_maps.diagram_review",
597
599
  voice__communicator: "voice.communicator",
598
600
  voice__gemini_live: "voice.gemini_live",
599
601
  voice__intro: "voice.intro",
@@ -628,7 +630,7 @@ var MANDATE_KEYS = {
628
630
  */
629
631
  brand_discovery__offering_roles: "brand_discovery.offering_roles",
630
632
  /**
631
- * @deprecated retiring since 0.59.204 — no longer declared in
633
+ * @deprecated retiring since 0.59.205 — no longer declared in
632
634
  * aidream. It leaves this union once no snapshot within the last
633
635
  * 3 published versions still carries it as active.
634
636
  */
@@ -47,9 +47,9 @@ module.exports = __toCommonJS(mandates_exports);
47
47
 
48
48
  // mandates/keys.generated.ts
49
49
  var MANDATE_KEYS_META = {
50
- aidreamRevision: "4d832f50ff335ff7d2858da508739243d30fdcc7",
50
+ aidreamRevision: "e06d9852949d2176919d289c140ceb232bca7f09",
51
51
  generatorVersion: "1.0.0",
52
- packageVersion: "0.59.204",
52
+ packageVersion: "0.59.205",
53
53
  retireWindow: 3
54
54
  };
55
55
  var MANDATE_KEYS = {
@@ -632,6 +632,8 @@ var MANDATE_KEYS = {
632
632
  vision_interview__sounding_board: "vision_interview.sounding_board",
633
633
  vision_interview__transcript_cleaner: "vision_interview.transcript_cleaner",
634
634
  vision_interview__vision_author: "vision_interview.vision_author",
635
+ visual_maps__diagram_repair: "visual_maps.diagram_repair",
636
+ visual_maps__diagram_review: "visual_maps.diagram_review",
635
637
  voice__communicator: "voice.communicator",
636
638
  voice__gemini_live: "voice.gemini_live",
637
639
  voice__intro: "voice.intro",
@@ -666,7 +668,7 @@ var MANDATE_KEYS = {
666
668
  */
667
669
  brand_discovery__offering_roles: "brand_discovery.offering_roles",
668
670
  /**
669
- * @deprecated retiring since 0.59.204 — no longer declared in
671
+ * @deprecated retiring since 0.59.205 — no longer declared in
670
672
  * aidream. It leaves this union once no snapshot within the last
671
673
  * 3 published versions still carries it as active.
672
674
  */
@@ -693,7 +695,7 @@ var MANDATE_KEYS = {
693
695
  var ALL_MANDATE_KEYS = Object.values(MANDATE_KEYS);
694
696
  var RETIRING_MANDATE_KEYS = {
695
697
  "brand_discovery.offering_roles": "0.59.0",
696
- "coding_session.managed_translation_reference": "0.59.204",
698
+ "coding_session.managed_translation_reference": "0.59.205",
697
699
  "pdf.content_cleaner": "0.59.0",
698
700
  "sms.owner_beta": "0.59.0",
699
701
  "voice.owner_beta": "0.59.0"
@@ -6,10 +6,10 @@
6
6
  * from the IN-PROCESS mandate declarations — the same `declared_mandates()` the
7
7
  * boot sync writes to the database from. There is no hand list anywhere.
8
8
  *
9
- * aidream revision: 4d832f50ff335ff7d2858da508739243d30fdcc7
9
+ * aidream revision: e06d9852949d2176919d289c140ceb232bca7f09
10
10
  * generator version: 1.0.0
11
- * package version: 0.59.204
12
- * active keys: 606
11
+ * package version: 0.59.205
12
+ * active keys: 608
13
13
  * retiring keys: 5
14
14
  *
15
15
  * THE IDENTIFIER RULE: every `.` in a key becomes `__`, any character outside
@@ -19,9 +19,9 @@
19
19
  */
20
20
  /** Where this module came from — surfaced so a report can name the exact build. */
21
21
  declare const MANDATE_KEYS_META: {
22
- readonly aidreamRevision: "4d832f50ff335ff7d2858da508739243d30fdcc7";
22
+ readonly aidreamRevision: "e06d9852949d2176919d289c140ceb232bca7f09";
23
23
  readonly generatorVersion: "1.0.0";
24
- readonly packageVersion: "0.59.204";
24
+ readonly packageVersion: "0.59.205";
25
25
  readonly retireWindow: 3;
26
26
  };
27
27
  /** Every declared mandate key, by THE IDENTIFIER RULE. */
@@ -605,6 +605,8 @@ declare const MANDATE_KEYS: {
605
605
  readonly vision_interview__sounding_board: "vision_interview.sounding_board";
606
606
  readonly vision_interview__transcript_cleaner: "vision_interview.transcript_cleaner";
607
607
  readonly vision_interview__vision_author: "vision_interview.vision_author";
608
+ readonly visual_maps__diagram_repair: "visual_maps.diagram_repair";
609
+ readonly visual_maps__diagram_review: "visual_maps.diagram_review";
608
610
  readonly voice__communicator: "voice.communicator";
609
611
  readonly voice__gemini_live: "voice.gemini_live";
610
612
  readonly voice__intro: "voice.intro";
@@ -639,7 +641,7 @@ declare const MANDATE_KEYS: {
639
641
  */
640
642
  readonly brand_discovery__offering_roles: "brand_discovery.offering_roles";
641
643
  /**
642
- * @deprecated retiring since 0.59.204 — no longer declared in
644
+ * @deprecated retiring since 0.59.205 — no longer declared in
643
645
  * aidream. It leaves this union once no snapshot within the last
644
646
  * 3 published versions still carries it as active.
645
647
  */
@@ -670,7 +672,7 @@ declare const ALL_MANDATE_KEYS: readonly MandateKey[];
670
672
  /** Keys still in the union but no longer declared (two-phase retire, phase 1). */
671
673
  declare const RETIRING_MANDATE_KEYS: {
672
674
  readonly "brand_discovery.offering_roles": "0.59.0";
673
- readonly "coding_session.managed_translation_reference": "0.59.204";
675
+ readonly "coding_session.managed_translation_reference": "0.59.205";
674
676
  readonly "pdf.content_cleaner": "0.59.0";
675
677
  readonly "sms.owner_beta": "0.59.0";
676
678
  readonly "voice.owner_beta": "0.59.0";
@@ -6,10 +6,10 @@
6
6
  * from the IN-PROCESS mandate declarations — the same `declared_mandates()` the
7
7
  * boot sync writes to the database from. There is no hand list anywhere.
8
8
  *
9
- * aidream revision: 4d832f50ff335ff7d2858da508739243d30fdcc7
9
+ * aidream revision: e06d9852949d2176919d289c140ceb232bca7f09
10
10
  * generator version: 1.0.0
11
- * package version: 0.59.204
12
- * active keys: 606
11
+ * package version: 0.59.205
12
+ * active keys: 608
13
13
  * retiring keys: 5
14
14
  *
15
15
  * THE IDENTIFIER RULE: every `.` in a key becomes `__`, any character outside
@@ -19,9 +19,9 @@
19
19
  */
20
20
  /** Where this module came from — surfaced so a report can name the exact build. */
21
21
  declare const MANDATE_KEYS_META: {
22
- readonly aidreamRevision: "4d832f50ff335ff7d2858da508739243d30fdcc7";
22
+ readonly aidreamRevision: "e06d9852949d2176919d289c140ceb232bca7f09";
23
23
  readonly generatorVersion: "1.0.0";
24
- readonly packageVersion: "0.59.204";
24
+ readonly packageVersion: "0.59.205";
25
25
  readonly retireWindow: 3;
26
26
  };
27
27
  /** Every declared mandate key, by THE IDENTIFIER RULE. */
@@ -605,6 +605,8 @@ declare const MANDATE_KEYS: {
605
605
  readonly vision_interview__sounding_board: "vision_interview.sounding_board";
606
606
  readonly vision_interview__transcript_cleaner: "vision_interview.transcript_cleaner";
607
607
  readonly vision_interview__vision_author: "vision_interview.vision_author";
608
+ readonly visual_maps__diagram_repair: "visual_maps.diagram_repair";
609
+ readonly visual_maps__diagram_review: "visual_maps.diagram_review";
608
610
  readonly voice__communicator: "voice.communicator";
609
611
  readonly voice__gemini_live: "voice.gemini_live";
610
612
  readonly voice__intro: "voice.intro";
@@ -639,7 +641,7 @@ declare const MANDATE_KEYS: {
639
641
  */
640
642
  readonly brand_discovery__offering_roles: "brand_discovery.offering_roles";
641
643
  /**
642
- * @deprecated retiring since 0.59.204 — no longer declared in
644
+ * @deprecated retiring since 0.59.205 — no longer declared in
643
645
  * aidream. It leaves this union once no snapshot within the last
644
646
  * 3 published versions still carries it as active.
645
647
  */
@@ -670,7 +672,7 @@ declare const ALL_MANDATE_KEYS: readonly MandateKey[];
670
672
  /** Keys still in the union but no longer declared (two-phase retire, phase 1). */
671
673
  declare const RETIRING_MANDATE_KEYS: {
672
674
  readonly "brand_discovery.offering_roles": "0.59.0";
673
- readonly "coding_session.managed_translation_reference": "0.59.204";
675
+ readonly "coding_session.managed_translation_reference": "0.59.205";
674
676
  readonly "pdf.content_cleaner": "0.59.0";
675
677
  readonly "sms.owner_beta": "0.59.0";
676
678
  readonly "voice.owner_beta": "0.59.0";
@@ -1,8 +1,8 @@
1
1
  // mandates/keys.generated.ts
2
2
  var MANDATE_KEYS_META = {
3
- aidreamRevision: "4d832f50ff335ff7d2858da508739243d30fdcc7",
3
+ aidreamRevision: "e06d9852949d2176919d289c140ceb232bca7f09",
4
4
  generatorVersion: "1.0.0",
5
- packageVersion: "0.59.204",
5
+ packageVersion: "0.59.205",
6
6
  retireWindow: 3
7
7
  };
8
8
  var MANDATE_KEYS = {
@@ -585,6 +585,8 @@ var MANDATE_KEYS = {
585
585
  vision_interview__sounding_board: "vision_interview.sounding_board",
586
586
  vision_interview__transcript_cleaner: "vision_interview.transcript_cleaner",
587
587
  vision_interview__vision_author: "vision_interview.vision_author",
588
+ visual_maps__diagram_repair: "visual_maps.diagram_repair",
589
+ visual_maps__diagram_review: "visual_maps.diagram_review",
588
590
  voice__communicator: "voice.communicator",
589
591
  voice__gemini_live: "voice.gemini_live",
590
592
  voice__intro: "voice.intro",
@@ -619,7 +621,7 @@ var MANDATE_KEYS = {
619
621
  */
620
622
  brand_discovery__offering_roles: "brand_discovery.offering_roles",
621
623
  /**
622
- * @deprecated retiring since 0.59.204 — no longer declared in
624
+ * @deprecated retiring since 0.59.205 — no longer declared in
623
625
  * aidream. It leaves this union once no snapshot within the last
624
626
  * 3 published versions still carries it as active.
625
627
  */
@@ -646,7 +648,7 @@ var MANDATE_KEYS = {
646
648
  var ALL_MANDATE_KEYS = Object.values(MANDATE_KEYS);
647
649
  var RETIRING_MANDATE_KEYS = {
648
650
  "brand_discovery.offering_roles": "0.59.0",
649
- "coding_session.managed_translation_reference": "0.59.204",
651
+ "coding_session.managed_translation_reference": "0.59.205",
650
652
  "pdf.content_cleaner": "0.59.0",
651
653
  "sms.owner_beta": "0.59.0",
652
654
  "voice.owner_beta": "0.59.0"
@@ -1479,16 +1479,19 @@ function ModelRow({
1479
1479
  );
1480
1480
  }
1481
1481
  function LocalModelRow({ model, selected, onSelect }) {
1482
+ const unusable = model.unusable ?? null;
1482
1483
  const dim = model.needsMoreMemory === true;
1483
1484
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1484
1485
  "div",
1485
1486
  {
1486
1487
  role: "button",
1487
- tabIndex: 0,
1488
+ tabIndex: unusable ? -1 : 0,
1489
+ "aria-disabled": unusable ? true : void 0,
1488
1490
  "data-local-model": model.id,
1489
- title: dim ? "Needs more memory than this computer has free" : void 0,
1490
- onClick: onSelect,
1491
+ title: unusable ?? (dim ? "Needs more memory than this computer has free" : void 0),
1492
+ onClick: unusable ? void 0 : onSelect,
1491
1493
  onKeyDown: (e) => {
1494
+ if (unusable) return;
1492
1495
  if (e.key === "Enter" || e.key === " ") {
1493
1496
  e.preventDefault();
1494
1497
  onSelect();
@@ -1497,22 +1500,26 @@ function LocalModelRow({ model, selected, onSelect }) {
1497
1500
  className: (0, import_design_system.cn)(
1498
1501
  "grid w-full cursor-pointer grid-cols-[16px_20px_minmax(0,1fr)_2.75rem_3rem_2.75rem] items-center gap-2 rounded px-2 py-1 transition-colors hover:bg-muted/60 focus:bg-muted/60 focus:outline-none",
1499
1502
  dim && "opacity-60",
1503
+ unusable && "cursor-default opacity-60 hover:bg-transparent focus:bg-transparent",
1500
1504
  selected && "bg-muted"
1501
1505
  ),
1502
1506
  children: [
1503
1507
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "w-4" }),
1504
1508
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "flex w-5 justify-center", title: model.maker ?? void 0, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_brand_glyphs.MakerBrandGlyph, { maker: model.maker ?? null, colored: true, className: "h-3.5 w-3.5" }) }),
1505
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { className: "flex min-w-0 items-center gap-1.5", children: [
1506
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "truncate text-xs font-medium text-foreground", children: model.name }),
1507
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1508
- "span",
1509
- {
1510
- className: "shrink-0 rounded border border-primary/40 bg-primary/10 px-1 text-[9px] font-medium text-foreground/80",
1511
- title: "Runs on this computer",
1512
- children: "local"
1513
- }
1514
- ),
1515
- dim && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "shrink-0 rounded bg-muted px-1 text-[9px] text-muted-foreground", title: "Needs more memory than this computer has free", children: "needs memory" })
1509
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { className: "flex min-w-0 flex-col", children: [
1510
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { className: "flex min-w-0 items-center gap-1.5", children: [
1511
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "truncate text-xs font-medium text-foreground", children: model.name }),
1512
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1513
+ "span",
1514
+ {
1515
+ className: "shrink-0 rounded border border-primary/40 bg-primary/10 px-1 text-[9px] font-medium text-foreground/80",
1516
+ title: "Runs on this computer",
1517
+ children: "local"
1518
+ }
1519
+ ),
1520
+ dim && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "shrink-0 rounded bg-muted px-1 text-[9px] text-muted-foreground", title: "Needs more memory than this computer has free", children: "needs memory" })
1521
+ ] }),
1522
+ unusable && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { "data-local-model-reason": true, className: "truncate text-[11px] text-muted-foreground", children: unusable })
1516
1523
  ] }),
1517
1524
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "w-11" }),
1518
1525
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "block w-12 whitespace-nowrap text-right font-mono text-[11px] tabular-nums text-foreground/80", children: model.contextWindow == null ? "\u2014" : fmtPointsCompact(model.contextWindow) }),
@@ -1623,6 +1630,8 @@ function ModelListDropdown({
1623
1630
  const q = query.trim().toLowerCase();
1624
1631
  return q ? localAll.filter((m) => [m.name, m.maker, "local"].some((f) => f?.toLowerCase().includes(q))) : localAll;
1625
1632
  }, [localEligible, tab, query, localAll]);
1633
+ const localRunnable = (0, import_react2.useMemo)(() => localRows.filter((m) => !m.unusable), [localRows]);
1634
+ const localUnusable = (0, import_react2.useMemo)(() => localRows.filter((m) => m.unusable), [localRows]);
1626
1635
  const shown = selected ?? (selectedLocal ? { name: selectedLocal.name, maker: selectedLocal.maker ?? null } : null);
1627
1636
  const makerOptions = (0, import_react2.useMemo)(
1628
1637
  () => [
@@ -2003,8 +2012,10 @@ function ModelListDropdown({
2003
2012
  }
2004
2013
  ),
2005
2014
  localRows.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
2006
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: GROUP_HEADING, children: localGroupLabel }),
2007
- localRows.map((l) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(LocalModelRow, { model: l, selected: l.id === value, onSelect: () => handleSelectLocal(l) }, l.id)),
2015
+ localRunnable.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: GROUP_HEADING, children: localGroupLabel }),
2016
+ localRunnable.map((l) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(LocalModelRow, { model: l, selected: l.id === value, onSelect: () => handleSelectLocal(l) }, l.id)),
2017
+ localUnusable.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: GROUP_HEADING, children: "Cannot run here" }),
2018
+ localUnusable.map((l) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(LocalModelRow, { model: l, selected: false, onSelect: () => void 0 }, l.id)),
2008
2019
  filtered.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: GROUP_HEADING, children: "Cloud" })
2009
2020
  ] }),
2010
2021
  filtered.length === 0 ? localRows.length > 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "p-4 text-center text-xs text-muted-foreground", children: "No models match your filters." }) : listRows.map(({ model: m, classTier }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
@@ -2033,9 +2044,9 @@ function ModelListDropdown({
2033
2044
  "Models couldn't be loaded",
2034
2045
  ports.renderErrorAction?.(String(error))
2035
2046
  ] }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
2036
- listRows.length + localRows.length,
2047
+ listRows.length + localRunnable.length,
2037
2048
  " model",
2038
- listRows.length + localRows.length === 1 ? "" : "s",
2049
+ listRows.length + localRunnable.length === 1 ? "" : "s",
2039
2050
  variant === "user" && (hiddenModelIds?.length ?? 0) > 0 ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
2040
2051
  " \xB7 ",
2041
2052
  ports.settingsHref && LinkComponent ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(LinkComponent, { href: ports.settingsHref, className: "underline hover:text-foreground", children: [
@@ -423,6 +423,11 @@ interface LocalModelEntry {
423
423
  contextWindow?: number | null;
424
424
  /** The computer cannot hold it today: the row is dimmed and says why, but stays pickable. */
425
425
  needsMoreMemory?: boolean;
426
+ /**
427
+ * On the computer but it cannot run there, and why, in one line ("Part 2 of 3 is missing"). The
428
+ * picker lists it under "Cannot run here" with this reason, dimmed and never pickable.
429
+ */
430
+ unusable?: string;
426
431
  }
427
432
  /**
428
433
  * The host's local-model source (a store: `getModels` + `subscribe`, like the catalog). The picker
@@ -423,6 +423,11 @@ interface LocalModelEntry {
423
423
  contextWindow?: number | null;
424
424
  /** The computer cannot hold it today: the row is dimmed and says why, but stays pickable. */
425
425
  needsMoreMemory?: boolean;
426
+ /**
427
+ * On the computer but it cannot run there, and why, in one line ("Part 2 of 3 is missing"). The
428
+ * picker lists it under "Cannot run here" with this reason, dimmed and never pickable.
429
+ */
430
+ unusable?: string;
426
431
  }
427
432
  /**
428
433
  * The host's local-model source (a store: `getModels` + `subscribe`, like the catalog). The picker
@@ -1461,16 +1461,19 @@ function ModelRow({
1461
1461
  );
1462
1462
  }
1463
1463
  function LocalModelRow({ model, selected, onSelect }) {
1464
+ const unusable = model.unusable ?? null;
1464
1465
  const dim = model.needsMoreMemory === true;
1465
1466
  return /* @__PURE__ */ jsxs3(
1466
1467
  "div",
1467
1468
  {
1468
1469
  role: "button",
1469
- tabIndex: 0,
1470
+ tabIndex: unusable ? -1 : 0,
1471
+ "aria-disabled": unusable ? true : void 0,
1470
1472
  "data-local-model": model.id,
1471
- title: dim ? "Needs more memory than this computer has free" : void 0,
1472
- onClick: onSelect,
1473
+ title: unusable ?? (dim ? "Needs more memory than this computer has free" : void 0),
1474
+ onClick: unusable ? void 0 : onSelect,
1473
1475
  onKeyDown: (e) => {
1476
+ if (unusable) return;
1474
1477
  if (e.key === "Enter" || e.key === " ") {
1475
1478
  e.preventDefault();
1476
1479
  onSelect();
@@ -1479,22 +1482,26 @@ function LocalModelRow({ model, selected, onSelect }) {
1479
1482
  className: cn(
1480
1483
  "grid w-full cursor-pointer grid-cols-[16px_20px_minmax(0,1fr)_2.75rem_3rem_2.75rem] items-center gap-2 rounded px-2 py-1 transition-colors hover:bg-muted/60 focus:bg-muted/60 focus:outline-none",
1481
1484
  dim && "opacity-60",
1485
+ unusable && "cursor-default opacity-60 hover:bg-transparent focus:bg-transparent",
1482
1486
  selected && "bg-muted"
1483
1487
  ),
1484
1488
  children: [
1485
1489
  /* @__PURE__ */ jsx4("span", { className: "w-4" }),
1486
1490
  /* @__PURE__ */ jsx4("span", { className: "flex w-5 justify-center", title: model.maker ?? void 0, children: /* @__PURE__ */ jsx4(MakerBrandGlyph, { maker: model.maker ?? null, colored: true, className: "h-3.5 w-3.5" }) }),
1487
- /* @__PURE__ */ jsxs3("span", { className: "flex min-w-0 items-center gap-1.5", children: [
1488
- /* @__PURE__ */ jsx4("span", { className: "truncate text-xs font-medium text-foreground", children: model.name }),
1489
- /* @__PURE__ */ jsx4(
1490
- "span",
1491
- {
1492
- className: "shrink-0 rounded border border-primary/40 bg-primary/10 px-1 text-[9px] font-medium text-foreground/80",
1493
- title: "Runs on this computer",
1494
- children: "local"
1495
- }
1496
- ),
1497
- dim && /* @__PURE__ */ jsx4("span", { className: "shrink-0 rounded bg-muted px-1 text-[9px] text-muted-foreground", title: "Needs more memory than this computer has free", children: "needs memory" })
1491
+ /* @__PURE__ */ jsxs3("span", { className: "flex min-w-0 flex-col", children: [
1492
+ /* @__PURE__ */ jsxs3("span", { className: "flex min-w-0 items-center gap-1.5", children: [
1493
+ /* @__PURE__ */ jsx4("span", { className: "truncate text-xs font-medium text-foreground", children: model.name }),
1494
+ /* @__PURE__ */ jsx4(
1495
+ "span",
1496
+ {
1497
+ className: "shrink-0 rounded border border-primary/40 bg-primary/10 px-1 text-[9px] font-medium text-foreground/80",
1498
+ title: "Runs on this computer",
1499
+ children: "local"
1500
+ }
1501
+ ),
1502
+ dim && /* @__PURE__ */ jsx4("span", { className: "shrink-0 rounded bg-muted px-1 text-[9px] text-muted-foreground", title: "Needs more memory than this computer has free", children: "needs memory" })
1503
+ ] }),
1504
+ unusable && /* @__PURE__ */ jsx4("span", { "data-local-model-reason": true, className: "truncate text-[11px] text-muted-foreground", children: unusable })
1498
1505
  ] }),
1499
1506
  /* @__PURE__ */ jsx4("span", { className: "w-11" }),
1500
1507
  /* @__PURE__ */ jsx4("span", { className: "block w-12 whitespace-nowrap text-right font-mono text-[11px] tabular-nums text-foreground/80", children: model.contextWindow == null ? "\u2014" : fmtPointsCompact(model.contextWindow) }),
@@ -1605,6 +1612,8 @@ function ModelListDropdown({
1605
1612
  const q = query.trim().toLowerCase();
1606
1613
  return q ? localAll.filter((m) => [m.name, m.maker, "local"].some((f) => f?.toLowerCase().includes(q))) : localAll;
1607
1614
  }, [localEligible, tab, query, localAll]);
1615
+ const localRunnable = useMemo2(() => localRows.filter((m) => !m.unusable), [localRows]);
1616
+ const localUnusable = useMemo2(() => localRows.filter((m) => m.unusable), [localRows]);
1608
1617
  const shown = selected ?? (selectedLocal ? { name: selectedLocal.name, maker: selectedLocal.maker ?? null } : null);
1609
1618
  const makerOptions = useMemo2(
1610
1619
  () => [
@@ -1985,8 +1994,10 @@ function ModelListDropdown({
1985
1994
  }
1986
1995
  ),
1987
1996
  localRows.length > 0 && /* @__PURE__ */ jsxs3(Fragment2, { children: [
1988
- /* @__PURE__ */ jsx4("div", { className: GROUP_HEADING, children: localGroupLabel }),
1989
- localRows.map((l) => /* @__PURE__ */ jsx4(LocalModelRow, { model: l, selected: l.id === value, onSelect: () => handleSelectLocal(l) }, l.id)),
1997
+ localRunnable.length > 0 && /* @__PURE__ */ jsx4("div", { className: GROUP_HEADING, children: localGroupLabel }),
1998
+ localRunnable.map((l) => /* @__PURE__ */ jsx4(LocalModelRow, { model: l, selected: l.id === value, onSelect: () => handleSelectLocal(l) }, l.id)),
1999
+ localUnusable.length > 0 && /* @__PURE__ */ jsx4("div", { className: GROUP_HEADING, children: "Cannot run here" }),
2000
+ localUnusable.map((l) => /* @__PURE__ */ jsx4(LocalModelRow, { model: l, selected: false, onSelect: () => void 0 }, l.id)),
1990
2001
  filtered.length > 0 && /* @__PURE__ */ jsx4("div", { className: GROUP_HEADING, children: "Cloud" })
1991
2002
  ] }),
1992
2003
  filtered.length === 0 ? localRows.length > 0 ? null : /* @__PURE__ */ jsx4("div", { className: "p-4 text-center text-xs text-muted-foreground", children: "No models match your filters." }) : listRows.map(({ model: m, classTier }) => /* @__PURE__ */ jsx4(
@@ -2015,9 +2026,9 @@ function ModelListDropdown({
2015
2026
  "Models couldn't be loaded",
2016
2027
  ports.renderErrorAction?.(String(error))
2017
2028
  ] }) : /* @__PURE__ */ jsxs3(Fragment2, { children: [
2018
- listRows.length + localRows.length,
2029
+ listRows.length + localRunnable.length,
2019
2030
  " model",
2020
- listRows.length + localRows.length === 1 ? "" : "s",
2031
+ listRows.length + localRunnable.length === 1 ? "" : "s",
2021
2032
  variant === "user" && (hiddenModelIds?.length ?? 0) > 0 ? /* @__PURE__ */ jsxs3(Fragment2, { children: [
2022
2033
  " \xB7 ",
2023
2034
  ports.settingsHref && LinkComponent ? /* @__PURE__ */ jsxs3(LinkComponent, { href: ports.settingsHref, className: "underline hover:text-foreground", children: [
@@ -561,6 +561,11 @@ interface LocalModelEntry {
561
561
  contextWindow?: number | null;
562
562
  /** The computer cannot hold it today: the row is dimmed and says why, but stays pickable. */
563
563
  needsMoreMemory?: boolean;
564
+ /**
565
+ * On the computer but it cannot run there, and why, in one line ("Part 2 of 3 is missing"). The
566
+ * picker lists it under "Cannot run here" with this reason, dimmed and never pickable.
567
+ */
568
+ unusable?: string;
564
569
  }
565
570
  /**
566
571
  * The host's local-model source (a store: `getModels` + `subscribe`, like the catalog). The picker
@@ -561,6 +561,11 @@ interface LocalModelEntry {
561
561
  contextWindow?: number | null;
562
562
  /** The computer cannot hold it today: the row is dimmed and says why, but stays pickable. */
563
563
  needsMoreMemory?: boolean;
564
+ /**
565
+ * On the computer but it cannot run there, and why, in one line ("Part 2 of 3 is missing"). The
566
+ * picker lists it under "Cannot run here" with this reason, dimmed and never pickable.
567
+ */
568
+ unusable?: string;
564
569
  }
565
570
  /**
566
571
  * The host's local-model source (a store: `getModels` + `subscribe`, like the catalog). The picker
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-matrx/agents",
3
- "version": "0.59.204",
3
+ "version": "0.59.205",
4
4
  "description": "Portable AI Matrx agent stream protocol, event projection, and safe result-presentation primitives.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -510,10 +510,10 @@
510
510
  "dependencies": {
511
511
  "@ai-matrx/alchemy": "latest",
512
512
  "@ai-matrx/api": "latest",
513
- "@ai-matrx/associations": "latest",
514
- "@ai-matrx/design-system": "latest",
515
513
  "@ai-matrx/data": "latest",
516
514
  "@ai-matrx/content-ir": "latest",
515
+ "@ai-matrx/design-system": "latest",
516
+ "@ai-matrx/associations": "latest",
517
517
  "@ai-matrx/diff": "latest",
518
518
  "@ai-matrx/icons": "latest",
519
519
  "@ai-matrx/kit": "latest"
@@ -561,5 +561,5 @@
561
561
  "verify:tarball": "node ./scripts/verify-tarball.mjs",
562
562
  "typegen:self-test": "node scripts/typegen/drop-guard.self-test.mjs && node scripts/typegen/check-api-types-fresh.mjs --self-test"
563
563
  },
564
- "gitHead": "4d832f50ff335ff7d2858da508739243d30fdcc7"
564
+ "gitHead": "e06d9852949d2176919d289c140ceb232bca7f09"
565
565
  }