@runtypelabs/persona 4.7.0 → 4.9.0

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.
Files changed (185) hide show
  1. package/README.md +1 -0
  2. package/dist/animations/glyph-cycle.cjs +2 -2
  3. package/dist/animations/glyph-cycle.d.cts +1 -1
  4. package/dist/animations/glyph-cycle.d.ts +1 -1
  5. package/dist/animations/glyph-cycle.js +2 -2
  6. package/dist/animations/{types-CSmiKRVa.d.cts → types-4ROVJ1gA.d.cts} +85 -3
  7. package/dist/animations/{types-CSmiKRVa.d.ts → types-4ROVJ1gA.d.ts} +85 -3
  8. package/dist/animations/wipe.cjs +2 -2
  9. package/dist/animations/wipe.d.cts +1 -1
  10. package/dist/animations/wipe.d.ts +1 -1
  11. package/dist/chunk-5EIIHQLQ.js +1 -0
  12. package/dist/chunk-IO5VVUKP.js +3 -0
  13. package/dist/chunk-IPVK3KOM.js +1 -0
  14. package/dist/chunk-UPO4GUFC.js +1 -0
  15. package/dist/codegen.cjs +13 -13
  16. package/dist/codegen.js +14 -14
  17. package/dist/context-mentions-7S5KVUTG.js +169 -0
  18. package/dist/context-mentions-inline-TTCN7ZM2.js +4 -0
  19. package/dist/context-mentions-inline.cjs +4 -0
  20. package/dist/context-mentions-inline.d.cts +203 -0
  21. package/dist/context-mentions-inline.d.ts +203 -0
  22. package/dist/context-mentions-inline.js +4 -0
  23. package/dist/context-mentions.cjs +295 -0
  24. package/dist/context-mentions.d.cts +7025 -0
  25. package/dist/context-mentions.d.ts +7025 -0
  26. package/dist/context-mentions.js +295 -0
  27. package/dist/index.cjs +99 -68
  28. package/dist/index.cjs.map +1 -1
  29. package/dist/index.d.cts +1507 -182
  30. package/dist/index.d.ts +1507 -182
  31. package/dist/index.global.js +88 -56
  32. package/dist/index.global.js.map +1 -1
  33. package/dist/index.js +99 -68
  34. package/dist/index.js.map +1 -1
  35. package/dist/install.global.js +1 -1
  36. package/dist/install.global.js.map +1 -1
  37. package/dist/launcher.global.js +3 -2
  38. package/dist/launcher.global.js.map +1 -1
  39. package/dist/markdown-parsers.js +24 -24
  40. package/dist/plugin-kit.cjs +1 -1
  41. package/dist/plugin-kit.d.cts +17 -0
  42. package/dist/plugin-kit.d.ts +17 -0
  43. package/dist/plugin-kit.js +1 -1
  44. package/dist/runtype-tts-entry-UJAEF7NZ.js +1 -0
  45. package/dist/runtype-tts.js +1 -1
  46. package/dist/session-reconnect-JKIJBHS5.js +1 -0
  47. package/dist/smart-dom-reader.cjs +18 -17
  48. package/dist/smart-dom-reader.d.cts +1260 -16
  49. package/dist/smart-dom-reader.d.ts +1260 -16
  50. package/dist/smart-dom-reader.js +18 -17
  51. package/dist/testing.cjs +3 -3
  52. package/dist/testing.js +3 -3
  53. package/dist/theme-editor-preview.cjs +260 -58
  54. package/dist/theme-editor-preview.d.cts +1234 -15
  55. package/dist/theme-editor-preview.d.ts +1234 -15
  56. package/dist/theme-editor-preview.js +87 -58
  57. package/dist/theme-editor.cjs +10 -10
  58. package/dist/theme-editor.d.cts +1226 -15
  59. package/dist/theme-editor.d.ts +1226 -15
  60. package/dist/theme-editor.js +10 -10
  61. package/dist/theme-reference.cjs +1 -1
  62. package/dist/theme-reference.d.cts +76 -0
  63. package/dist/theme-reference.d.ts +76 -0
  64. package/dist/theme-reference.js +1 -1
  65. package/dist/voice-worklet-player.cjs +2 -2
  66. package/dist/voice-worklet-player.js +2 -2
  67. package/dist/webmcp-polyfill.js +2 -2
  68. package/dist/widget.css +1 -1
  69. package/package.json +16 -5
  70. package/src/artifacts-session.test.ts +178 -0
  71. package/src/client.test.ts +255 -1
  72. package/src/client.ts +157 -60
  73. package/src/components/artifact-card.test.ts +333 -0
  74. package/src/components/artifact-card.ts +75 -28
  75. package/src/components/artifact-inline.test.ts +1328 -0
  76. package/src/components/artifact-inline.ts +920 -0
  77. package/src/components/artifact-pane.test.ts +1042 -0
  78. package/src/components/artifact-pane.ts +440 -131
  79. package/src/components/artifact-preview.test.ts +1155 -0
  80. package/src/components/artifact-preview.ts +994 -0
  81. package/src/components/composer-parts.ts +3 -12
  82. package/src/components/context-mention-button.test.ts +70 -0
  83. package/src/components/context-mention-button.ts +82 -0
  84. package/src/components/context-mention-chip.ts +134 -0
  85. package/src/components/context-mention-menu.test.ts +508 -0
  86. package/src/components/context-mention-menu.ts +0 -0
  87. package/src/components/message-bubble.test.ts +175 -0
  88. package/src/components/message-bubble.ts +177 -19
  89. package/src/components/panel.ts +7 -10
  90. package/src/components/pill-composer-builder.test.ts +6 -2
  91. package/src/components/pill-composer-builder.ts +6 -6
  92. package/src/components/reasoning-bubble.ts +1 -13
  93. package/src/components/registry.ts +38 -3
  94. package/src/components/tool-bubble.ts +1 -13
  95. package/src/context-mentions-bundle.test.ts +163 -0
  96. package/src/context-mentions-entry.ts +185 -0
  97. package/src/context-mentions-inline-entry.test.ts +136 -0
  98. package/src/context-mentions-inline-entry.ts +226 -0
  99. package/src/context-mentions-inline-loader.test.ts +30 -0
  100. package/src/context-mentions-inline-loader.ts +36 -0
  101. package/src/context-mentions-inline.ts +15 -0
  102. package/src/context-mentions-loader.ts +32 -0
  103. package/src/context-mentions.ts +16 -0
  104. package/src/defaults.ts +1 -0
  105. package/src/generated/runtype-openapi-contract.ts +55 -3
  106. package/src/index-core.ts +46 -1
  107. package/src/index-global.ts +51 -0
  108. package/src/index.ts +8 -0
  109. package/src/markdown-parsers-loader.test.ts +158 -0
  110. package/src/markdown-parsers-loader.ts +83 -27
  111. package/src/plugin-kit.test.ts +40 -0
  112. package/src/plugin-kit.ts +39 -5
  113. package/src/runtime/host-layout.test.ts +163 -0
  114. package/src/runtime/host-layout.ts +110 -7
  115. package/src/runtime/init.ts +18 -61
  116. package/src/session.mentions.test.ts +175 -0
  117. package/src/session.test.ts +52 -4
  118. package/src/session.ts +197 -27
  119. package/src/smart-dom-reader.test.ts +129 -2
  120. package/src/smart-dom-reader.ts +127 -1
  121. package/src/styles/context-mention-menu-css.ts +176 -0
  122. package/src/styles/widget.css +1002 -152
  123. package/src/theme-editor/preview.ts +2 -0
  124. package/src/theme-editor/sections.test.ts +26 -1
  125. package/src/theme-editor/sections.ts +13 -5
  126. package/src/theme-reference.ts +2 -2
  127. package/src/tool-call-display-defaults.test.ts +1 -0
  128. package/src/types/theme.ts +79 -0
  129. package/src/types.ts +1041 -17
  130. package/src/ui.artifact-pane-gating.test.ts +636 -0
  131. package/src/ui.component-directive.test.ts +104 -0
  132. package/src/ui.composer-bar.test.ts +60 -2
  133. package/src/ui.detached-panel.test.ts +1049 -0
  134. package/src/ui.mention-submit.test.ts +235 -0
  135. package/src/ui.tool-display.test.ts +51 -0
  136. package/src/ui.ts +998 -159
  137. package/src/utils/artifact-custom-actions.ts +128 -0
  138. package/src/utils/artifact-display.test.ts +42 -0
  139. package/src/utils/artifact-display.ts +84 -0
  140. package/src/utils/artifact-file.test.ts +116 -0
  141. package/src/utils/artifact-file.ts +117 -0
  142. package/src/utils/artifact-gate.test.ts +112 -5
  143. package/src/utils/artifact-gate.ts +39 -14
  144. package/src/utils/artifact-loading-status.ts +55 -0
  145. package/src/utils/artifact-status-label.ts +190 -0
  146. package/src/utils/buttons.ts +7 -1
  147. package/src/utils/chunk-loader.test.ts +97 -0
  148. package/src/utils/chunk-loader.ts +88 -0
  149. package/src/utils/code-highlight.test.ts +186 -0
  150. package/src/utils/code-highlight.ts +400 -0
  151. package/src/utils/composer-contenteditable.test.ts +507 -0
  152. package/src/utils/composer-contenteditable.ts +626 -0
  153. package/src/utils/composer-document.test.ts +280 -0
  154. package/src/utils/composer-document.ts +293 -0
  155. package/src/utils/composer-history.test.ts +35 -7
  156. package/src/utils/composer-history.ts +30 -20
  157. package/src/utils/composer-input.ts +159 -0
  158. package/src/utils/context-mention-controller.test.ts +1215 -0
  159. package/src/utils/context-mention-controller.ts +1186 -0
  160. package/src/utils/context-mention-manager.test.ts +422 -0
  161. package/src/utils/context-mention-manager.ts +410 -0
  162. package/src/utils/context-mention-orchestrator.test.ts +538 -0
  163. package/src/utils/context-mention-orchestrator.ts +348 -0
  164. package/src/utils/icons.ts +2 -0
  165. package/src/utils/live-region.test.ts +108 -0
  166. package/src/utils/live-region.ts +94 -0
  167. package/src/utils/mention-channels.ts +63 -0
  168. package/src/utils/mention-llm-format.test.ts +91 -0
  169. package/src/utils/mention-llm-format.ts +79 -0
  170. package/src/utils/mention-matcher.test.ts +86 -0
  171. package/src/utils/mention-matcher.ts +221 -0
  172. package/src/utils/mention-token.ts +72 -0
  173. package/src/utils/mention-trigger.test.ts +155 -0
  174. package/src/utils/mention-trigger.ts +156 -0
  175. package/src/utils/roving-tablist.test.ts +152 -0
  176. package/src/utils/roving-tablist.ts +111 -0
  177. package/src/utils/spinner.ts +45 -0
  178. package/src/utils/theme.test.ts +76 -4
  179. package/src/utils/theme.ts +7 -0
  180. package/src/utils/tokens.ts +118 -11
  181. package/src/utils/tool-loading-animation.test.ts +32 -0
  182. package/src/utils/tool-loading-animation.ts +24 -0
  183. package/dist/chunk-DFBSCFYN.js +0 -1
  184. package/dist/runtype-tts-entry-HFUV2UF7.js +0 -1
  185. package/dist/session-reconnect-U77QFUR7.js +0 -1
@@ -1,4 +1,14 @@
1
1
  import type { ComponentContext, ComponentRenderer } from "./registry";
2
+ import type { PersonaArtifactFileMeta, PersonaArtifactRecord } from "../types";
3
+ import { fileTypeLabel, basenameOf } from "../utils/artifact-file";
4
+ import {
5
+ applyArtifactStatus,
6
+ clearArtifactStatusTracking,
7
+ resolveArtifactStatusLabel
8
+ } from "../utils/artifact-status-label";
9
+ import { createLabelButton } from "../utils/buttons";
10
+ import { buildArtifactActionButton } from "../utils/artifact-custom-actions";
11
+ import type { PersonaArtifactActionContext } from "../types";
2
12
 
3
13
  /**
4
14
  * Default artifact card renderer.
@@ -6,26 +16,32 @@ import type { ComponentContext, ComponentRenderer } from "./registry";
6
16
  */
7
17
  function renderDefaultArtifactCard(
8
18
  props: Record<string, unknown>,
9
- _context: ComponentContext
19
+ context: ComponentContext
10
20
  ): HTMLElement {
11
- const title =
21
+ const file =
22
+ props.file && typeof props.file === "object" && !Array.isArray(props.file)
23
+ ? (props.file as PersonaArtifactFileMeta)
24
+ : undefined;
25
+ const rawTitle =
12
26
  typeof props.title === "string" && props.title
13
27
  ? props.title
14
28
  : "Untitled artifact";
29
+ // File artifacts show the basename (title stays the full path on the wire).
30
+ const title = file ? basenameOf(file.path) : rawTitle;
15
31
  const artifactId =
16
32
  typeof props.artifactId === "string" ? props.artifactId : "";
17
33
  const status = props.status === "streaming" ? "streaming" : "complete";
18
34
  const artifactType =
19
35
  typeof props.artifactType === "string" ? props.artifactType : "markdown";
20
- const subtitle =
21
- artifactType === "component" ? "Component" : "Document";
36
+ const subtitle = file
37
+ ? fileTypeLabel(file)
38
+ : artifactType === "component"
39
+ ? "Component"
40
+ : "Document";
22
41
 
23
42
  const root = document.createElement("div");
24
43
  root.className =
25
- "persona-flex persona-w-full persona-max-w-full persona-items-center persona-gap-3 persona-rounded-xl persona-px-4 persona-py-3";
26
- root.style.border = "1px solid var(--persona-border, #e5e7eb)";
27
- root.style.backgroundColor = "var(--persona-surface, #ffffff)";
28
- root.style.cursor = "pointer";
44
+ "persona-artifact-card persona-flex persona-w-full persona-max-w-full persona-items-center persona-gap-3 persona-px-4 persona-py-3";
29
45
  root.tabIndex = 0;
30
46
  root.setAttribute("role", "button");
31
47
  root.setAttribute("aria-label", `Open ${title} in artifact panel`);
@@ -56,35 +72,66 @@ function renderDefaultArtifactCard(
56
72
  subtitleEl.style.color = "var(--persona-muted, #9ca3af)";
57
73
 
58
74
  if (status === "streaming") {
59
- // Pulsing dot for streaming status
60
- const dot = document.createElement("span");
61
- dot.className = "persona-inline-block persona-w-1.5 persona-h-1.5 persona-rounded-full";
62
- dot.style.backgroundColor = "var(--persona-primary, #171717)";
63
- dot.style.animation = "persona-pulse 1.5s ease-in-out infinite";
64
- subtitleEl.appendChild(dot);
65
-
66
- const statusText = document.createElement("span");
67
- statusText.textContent = `Generating ${subtitle.toLowerCase()}...`;
68
- subtitleEl.appendChild(statusText);
75
+ const artifactsCfg = context?.config?.features?.artifacts;
76
+ // The card re-renders only at streaming-start and completion (deltas flow to
77
+ // the pane / inline block, not here), so live counters don't tick on the
78
+ // card; the string / label form still applies. Build a minimal record from
79
+ // the card props so the shared resolver derives the same typeLabel + ctx.
80
+ const record: PersonaArtifactRecord = {
81
+ id: artifactId,
82
+ artifactType: artifactType === "component" ? "component" : "markdown",
83
+ title: rawTitle,
84
+ status: "streaming",
85
+ ...(typeof props.markdown === "string" ? { markdown: props.markdown } : {}),
86
+ ...(file ? { file } : {})
87
+ };
88
+ const resolved = resolveArtifactStatusLabel(record, artifactsCfg, "card");
89
+ applyArtifactStatus(subtitleEl, resolved, artifactsCfg);
69
90
  } else {
91
+ if (artifactId) clearArtifactStatusTracking(artifactId);
70
92
  subtitleEl.textContent = subtitle;
71
93
  }
72
94
 
73
95
  meta.append(titleEl, subtitleEl);
74
96
  root.append(iconBox, meta);
75
97
 
76
- // Download button (visible when artifact is complete)
98
+ // Custom actions + Download button render only on complete artifacts, same
99
+ // as Download: content-dependent actions during streaming would act on
100
+ // partial content, so they wait until the artifact is fully materialized.
77
101
  if (status === "complete") {
78
- const dl = document.createElement("button");
79
- dl.type = "button";
80
- dl.textContent = "Download";
102
+ // Custom card actions carry NO direct listeners (the card re-renders during
103
+ // streaming and is morphed by idiomorph). Clicks are handled by event
104
+ // delegation in ui.ts, keyed off data-artifact-custom-action, mirroring the
105
+ // Download button's data-download-artifact delegation.
106
+ const cardActions = context?.config?.features?.artifacts?.cardActions;
107
+ if (cardActions && cardActions.length > 0) {
108
+ const ctx: PersonaArtifactActionContext = {
109
+ artifactId: artifactId || null,
110
+ title,
111
+ artifactType,
112
+ markdown:
113
+ typeof props.markdown === "string" ? props.markdown : undefined,
114
+ file,
115
+ };
116
+ for (const action of cardActions) {
117
+ try {
118
+ if (action.visible === undefined || action.visible(ctx)) {
119
+ const btn = buildArtifactActionButton(action);
120
+ btn.setAttribute("data-artifact-custom-action", action.id);
121
+ btn.className = `${btn.className} persona-flex-shrink-0`;
122
+ root.append(btn);
123
+ }
124
+ } catch {
125
+ // A single bad action must not take down the whole card.
126
+ }
127
+ }
128
+ }
129
+
130
+ const dl = createLabelButton({
131
+ label: "Download",
132
+ className: "persona-flex-shrink-0",
133
+ });
81
134
  dl.title = `Download ${title}`;
82
- dl.className =
83
- "persona-flex-shrink-0 persona-rounded-md persona-px-3 persona-py-1.5 persona-text-xs persona-font-medium";
84
- dl.style.border = "1px solid var(--persona-border, #e5e7eb)";
85
- dl.style.color = "var(--persona-text, #1f2937)";
86
- dl.style.backgroundColor = "transparent";
87
- dl.style.cursor = "pointer";
88
135
  dl.setAttribute("data-download-artifact", artifactId);
89
136
  root.append(dl);
90
137
  }