@ai-matrx/chat 0.7.24 → 0.7.26

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,5 +1,17 @@
1
1
  # @ai-matrx/chat
2
2
 
3
+ ## 0.7.26
4
+
5
+ Automatic changed-only republish (docs/metadata drift since the last tag — see
6
+ `git diff npm/chat/v0.7.25..npm/chat/v0.7.26 -- apps/shared/chat`).
7
+ No source changes intended and no consumer action required.
8
+
9
+ ## 0.7.25
10
+
11
+ Automatic changed-only republish (docs/metadata drift since the last tag — see
12
+ `git diff npm/chat/v0.7.24..npm/chat/v0.7.25 -- apps/shared/chat`).
13
+ No source changes intended and no consumer action required.
14
+
3
15
  ## 0.7.24
4
16
 
5
17
  Automatic changed-only republish (docs/metadata drift since the last tag — see
@@ -51,8 +63,9 @@ No source changes intended and no consumer action required.
51
63
  `useInView` (never from a closed mobile sheet or collapsed rail), then calls the catalog's
52
64
  `ensureFavoriteRows()` — `ues_list` + `agx_get_list_full?id=in.(…)` — instead of loading the
53
65
  whole agent catalogue after page idle. It shows a loading skeleton and a retry on failure.
54
- - **The splash paints its final footprint.** The server-painted composer shell carries the
55
- composer's placeholder (no pulse), the landing no longer fades in from opacity 0, and the
66
+ - **The splash paints its final footprint.** The server-painted composer shell is a read-only
67
+ textarea carrying the composer's classes and placeholder (no pulse; a div measured narrower than
68
+ the live box on a phone's 17px zoom floor), the landing no longer fades in from opacity 0, and the
56
69
  quick-action row keeps its skeleton until the organization is set instead of vanishing. On a
57
70
  phone the textarea placeholder was the page's Largest Contentful Paint at 5.7–15 s.
58
71
 
@@ -22,13 +22,18 @@ interface NewChatGreetingProps {
22
22
  export declare function NewChatGreeting({ sourceConversationId, surfaceKey, composer, }: NewChatGreetingProps): import("react").JSX.Element;
23
23
  /**
24
24
  * The splash composer as the server paints it, before the page is live: the
25
- * real card's box and its placeholder in the real textarea's type and inset.
25
+ * real card's box and a read-only textarea carrying the real one's classes and
26
+ * placeholder.
26
27
  *
27
28
  * THE PLACEHOLDER PAINTS WITH THE PAGE (2026-10-09). It is the largest text on
28
29
  * a phone's /chat/new (larger than the greeting), so a shell without it made
29
30
  * the live textarea's placeholder the page's Largest Contentful Paint seconds
30
- * later. Same words, same size: the live box replaces it without a new paint
31
- * winning. No pulse — an opacity animation would hide the text from that count.
31
+ * later. It is a TEXTAREA, not a div: every rule that sizes the live box (the
32
+ * coarse-pointer zoom floor raises it to 17px; a div measured 191px against
33
+ * the live 217px) sizes this one identically, so the live box replaces it
34
+ * without a new paint winning. No pulse — an opacity animation would hide the
35
+ * text from that count. Read-only and out of the tab order: nothing typed here
36
+ * could survive hydration.
32
37
  */
33
38
  export declare function ChatSplashComposerShell(): import("react").JSX.Element;
34
39
  export {};
@@ -61,8 +61,18 @@ function ChatSplashComposerShell() {
61
61
  "div",
62
62
  {
63
63
  "aria-hidden": true,
64
- className: "h-[132px] w-full max-w-[760px] rounded-[22px] border border-border bg-card p-2 shadow-[0_2px_10px_rgba(0,0,0,0.05)]",
65
- children: /* @__PURE__ */ jsx("div", { className: "px-1.5 py-1 text-[15px] leading-6 text-muted-foreground/60", children: SPLASH_PLACEHOLDER })
64
+ className: "h-[132px] w-full max-w-[760px] rounded-[22px] border border-border bg-card p-2 shadow-[0_2px_10px_rgba(0,0,0,0.05)] [&_textarea]:block",
65
+ children: /* @__PURE__ */ jsx(
66
+ "textarea",
67
+ {
68
+ readOnly: true,
69
+ tabIndex: -1,
70
+ rows: 1,
71
+ placeholder: SPLASH_PLACEHOLDER,
72
+ className: "w-full bg-transparent border-none outline-none text-[15px] leading-6 px-1.5 py-1 text-foreground placeholder:text-muted-foreground/60 resize-none overflow-hidden",
73
+ style: { minHeight: 64 }
74
+ }
75
+ )
66
76
  }
67
77
  );
68
78
  }
@@ -58,9 +58,9 @@ interface InputActionButtonsProps {
58
58
  * audio) live in the + menu; Output and Effort in the agent pill's menu.
59
59
  */
60
60
  folded?: boolean;
61
- /** Scope · values: after + · mic (· live audio) in Compact's row, after + in the card's own bar. */
61
+ /** Compact's row under the card: after + · mic (· live audio). */
62
62
  leading?: React.ReactNode;
63
- /** Agent · output · effort: the right end of Compact's row, or just left of the mic in the card's own bar. */
63
+ /** Compact's row under the card: the right end (agent · output · effort). */
64
64
  trailing?: React.ReactNode;
65
65
  /**
66
66
  * Which part this instance draws. Compact mounts two: `"send"` (↵, inside
@@ -202,11 +202,9 @@ function InputActionButtons({
202
202
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-1.5", children: [
203
203
  plusMenu,
204
204
  database ? /* @__PURE__ */ jsx(DesktopPresenceIndicator, { conversationId }) : null,
205
- variablesToggle,
206
- composer.leading
205
+ variablesToggle
207
206
  ] }),
208
207
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-1.5", children: [
209
- composer.trailing,
210
208
  extraRightControls,
211
209
  micGroup,
212
210
  liveAudioButton,
@@ -20,7 +20,7 @@ import { Button } from "@ai-matrx/design-system";
20
20
  import { cn } from "@ai-matrx/design-system";
21
21
  import { composerShows } from "./composer/composer-mode-visibility.js";
22
22
  import { ComposerChipsRow } from "./composer/ComposerChipsRow.js";
23
- import { ComposerPills, ComposerScopeCluster, ComposerValueGroupChip } from "./composer/ComposerMetaRow.js";
23
+ import { ComposerMetaRow, ComposerPills, ComposerScopeCluster, ComposerValueGroupChip } from "./composer/ComposerMetaRow.js";
24
24
  import { useComposerFold } from "./composer/useComposerFold.js";
25
25
  import { useTouchOnlyDevice } from "../../../../ui/composer/useTouchOnlyDevice.js";
26
26
  function SmartAgentInputStacked({
@@ -323,12 +323,7 @@ function SmartAgentInputStacked({
323
323
  onVoiceBusyChange: setVoiceBusy,
324
324
  extraRightControls,
325
325
  onRequestInputExpand: () => setExpandRequestKey((key) => key + 1),
326
- composer: {
327
- ...composerParts,
328
- // The pills live in the card's own bar: no strip under the card (rule: existing bars).
329
- leading: composer.meta === "none" ? void 0 : /* @__PURE__ */ jsx(ComposerScopeCluster, { conversationId, composer, folded }),
330
- trailing: composer.meta === "none" ? void 0 : /* @__PURE__ */ jsx(ComposerPills, { conversationId, composer, menuSide, folded })
331
- }
326
+ composer: composerParts
332
327
  }
333
328
  )
334
329
  ] })
@@ -349,7 +344,7 @@ function SmartAgentInputStacked({
349
344
  trailing: composer.meta === "none" ? void 0 : /* @__PURE__ */ jsx(ComposerPills, { conversationId, composer, menuSide, folded })
350
345
  }
351
346
  }
352
- ) : null
347
+ ) : composer.meta === "none" ? null : /* @__PURE__ */ jsx(ComposerMetaRow, { conversationId, composer, menuSide, folded })
353
348
  ]
354
349
  }
355
350
  );
@@ -165,7 +165,7 @@ function AssistantMessageFooter(props) {
165
165
  isLatestAssistant
166
166
  } = useAssistantMessageActions(props);
167
167
  const answerActions = useTranscriptLayout().answerActions;
168
- const isHoverOnly = answerActions === "hover" || answerActions === "latest" && !isLatestAssistant || density === "compact" && !isLatestAssistant;
168
+ const isHoverOnly = answerActions === "hover" || density === "compact" && !isLatestAssistant;
169
169
  const rowRef = useRef(null);
170
170
  useEffect(() => {
171
171
  const row = rowRef.current;
@@ -183,9 +183,7 @@ function AssistantMessageFooter(props) {
183
183
  {
184
184
  className: cn(
185
185
  "transition-opacity",
186
- isHoverOnly && // Hidden by opacity, never display: the row keeps its height, so revealing it shifts
187
- // nothing. A touch screen has no hover, so it is always visible there.
188
- "opacity-0 group-hover/assistant-msg:opacity-100 focus-within:opacity-100 [@media(hover:none)]:opacity-100"
186
+ isHoverOnly && "opacity-0 group-hover/assistant-msg:opacity-100 focus-within:opacity-100"
189
187
  ),
190
188
  children: [
191
189
  /* @__PURE__ */ jsxs(
@@ -1,20 +1,19 @@
1
1
  /**
2
2
  * How a host lays the ONE conversation column out (HOST-OWNED-SOURCE-PLAN P28e look bar).
3
3
  *
4
- * Knobs, never forks: a host that says nothing gets the default look (flat compact user turn,
5
- * actions on hover). Matrx 2 (desktop) fills its pane, starts at the left edge and draws the
4
+ * Knobs, never forks: every value has today's web default, and a host that says nothing gets
5
+ * exactly the web chat. Matrx 2 (desktop) fills its pane, starts at the left edge and draws the
6
6
  * person's turn as a compact block — the look its coding screen had before the column.
7
7
  *
8
8
  * - `width`: "reading" (the canonical `max-w-3xl` reading column) | "fill" (the host's pane).
9
9
  * - `align`: "center" | "start" — where a reading-width column sits in a wider pane.
10
- * - `userMessage`: "compact" (DEFAULT: a flat tight block; only a genuinely long message
11
- * collapses) | "card" (the bordered card that collapses a long message behind a chevron) |
10
+ * - `userMessage`: "card" (DEFAULT: the bordered card that collapses a long message behind a chevron) |
11
+ * "compact" (a flat tight block; only a genuinely long message collapses) |
12
12
  * "bubble" (Messages / Xcode's coding assistant: the person's turn on the trailing side in a
13
13
  * rounded bubble as wide as its words, answers full width; collapses like "compact").
14
- * - `answerActions`: "hover" (DEFAULT: the action row is revealed on hover / keyboard focus, and
14
+ * - `answerActions`: "shown" (DEFAULT: the latest answer's action row always visible) | "hover" (the action row is revealed on hover / keyboard focus, and
15
15
  * always on touch — its height is reserved, so revealing it moves nothing; a finished answer ends
16
- * on its last word) | "latest" (the latest answer's row is always visible, older ones on hover) |
17
- * "shown" (every answer's row always visible).
16
+ * on its last word) | "latest" (the latest answer's row is always visible, older ones on hover).
18
17
  */
19
18
  import { type ReactNode } from "react";
20
19
  export interface TranscriptLayout {
@@ -6,8 +6,8 @@ import {
6
6
  const DEFAULT_TRANSCRIPT_LAYOUT = {
7
7
  width: "reading",
8
8
  align: "center",
9
- userMessage: "compact",
10
- answerActions: "hover",
9
+ userMessage: "card",
10
+ answerActions: "shown",
11
11
  timestamps: "hover"
12
12
  };
13
13
  const TranscriptLayoutContext = createContext(DEFAULT_TRANSCRIPT_LAYOUT);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-matrx/chat",
3
- "version": "0.7.24",
3
+ "version": "0.7.26",
4
4
  "description": "THE one AI Matrx person-to-agent chat system: the full chat (running agents, conversations, tool calls, streaming, context, surfaces, voice) as explicit per-module subpaths @ai-matrx/chat/<domain>/<module> (no wildcards: scripts/public-modules.json) over a host contract (/host, /host/react) whose only required value is a db. One chat, one renderer: the old kernel entries (., /external-store, /matrx, /react, /tools, styles.css, tokens.css) are retired.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -4687,19 +4687,19 @@
4687
4687
  "@ai-matrx/browser-audio": "latest",
4688
4688
  "@ai-matrx/canvas": "latest",
4689
4689
  "@ai-matrx/content-ir": "latest",
4690
- "@ai-matrx/content-ir-react": "latest",
4691
4690
  "@ai-matrx/data": "latest",
4692
4691
  "@ai-matrx/design-system": "latest",
4693
4692
  "@ai-matrx/icons": "latest",
4694
- "@ai-matrx/diff": "latest",
4695
4693
  "@ai-matrx/kit": "latest",
4696
- "@ai-matrx/media": "latest",
4694
+ "@ai-matrx/diff": "latest",
4697
4695
  "@ai-matrx/print": "latest",
4696
+ "@ai-matrx/media": "latest",
4698
4697
  "@ai-matrx/realtime": "latest",
4699
4698
  "@ai-matrx/records": "latest",
4700
4699
  "@ai-matrx/records-ui": "latest",
4701
- "@ai-matrx/rich-content": "latest",
4702
- "@ai-matrx/rich-editor": "latest"
4700
+ "@ai-matrx/rich-editor": "latest",
4701
+ "@ai-matrx/content-ir-react": "latest",
4702
+ "@ai-matrx/rich-content": "latest"
4703
4703
  },
4704
4704
  "devDependencies": {
4705
4705
  "@arethetypeswrong/cli": "^0.18.5",
@@ -4818,5 +4818,5 @@
4818
4818
  "check:side-effects": "node ../scripts/check-side-effects-listed.mjs . && node ../scripts/check-side-effects-listed.mjs --self-test",
4819
4819
  "check:public-surface": "node ./scripts/sync-public-surface.mjs --check && node ./scripts/sync-public-surface.mjs --self-test"
4820
4820
  },
4821
- "gitHead": "cab8d9bc66fa516a57684222b15e62677a35d4fa"
4821
+ "gitHead": "85239a779e29a035d5fb6c1f61d0f023d94927ca"
4822
4822
  }