@reforma/components 0.4.1 → 0.5.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 (119) hide show
  1. package/dist/RichInput/RichInput.d.ts +1 -1
  2. package/dist/RichInput/RichInput.d.ts.map +1 -1
  3. package/dist/RichInput/RichInput.js +126 -123
  4. package/dist/RichInput/RichInput.js.map +1 -1
  5. package/dist/chat/ComposerBanner/ComposerBanner.d.ts +6 -1
  6. package/dist/chat/ComposerBanner/ComposerBanner.d.ts.map +1 -1
  7. package/dist/chat/ComposerBanner/ComposerBanner.js +60 -40
  8. package/dist/chat/ComposerBanner/ComposerBanner.js.map +1 -1
  9. package/dist/chat/ComposerBanner/ComposerBanner.module.css +1 -1
  10. package/dist/chat/ComposerBanner/ComposerBanner.module.css.js +13 -9
  11. package/dist/chat/ComposerBanner/ComposerBanner.module.css.js.map +1 -1
  12. package/dist/chat/Conversation/ConversationPendingLoader.d.ts.map +1 -1
  13. package/dist/chat/Conversation/ConversationPendingLoader.js +1 -1
  14. package/dist/chat/Conversation/ConversationPendingLoader.js.map +1 -1
  15. package/dist/chat/Message/normalize/normalizeMessageParts.d.ts +1 -1
  16. package/dist/chat/Message/normalize/normalizeMessageParts.d.ts.map +1 -1
  17. package/dist/chat/Message/normalize/normalizeMessageParts.js +1 -1
  18. package/dist/chat/Message/normalize/normalizeMessageParts.js.map +1 -1
  19. package/dist/chat/Message/parts/MessagePart.d.ts.map +1 -1
  20. package/dist/chat/Message/parts/MessagePart.js +1 -1
  21. package/dist/chat/Message/parts/MessagePart.js.map +1 -1
  22. package/dist/chat/Message/parts/backgroundResultPart.js +1 -1
  23. package/dist/chat/Message/parts/backgroundResultPart.js.map +1 -1
  24. package/dist/chat/Message/parts/collectMessageSources.d.ts +1 -1
  25. package/dist/chat/Message/parts/collectMessageSources.d.ts.map +1 -1
  26. package/dist/chat/Message/parts/collectMessageSources.js +1 -1
  27. package/dist/chat/Message/parts/collectMessageSources.js.map +1 -1
  28. package/dist/chat/Message/parts/contextCompactionPart.js +1 -1
  29. package/dist/chat/Message/parts/contextCompactionPart.js.map +1 -1
  30. package/dist/chat/Message/segments/analyzeGroupedSegment.js +5 -5
  31. package/dist/chat/Message/segments/analyzeGroupedSegment.js.map +1 -1
  32. package/dist/chat/Message/segments/recentStreamingPhaseToolGroups.js +1 -1
  33. package/dist/chat/Message/segments/recentStreamingPhaseToolGroups.js.map +1 -1
  34. package/dist/chat/Message/turn/workedCollapse.js +1 -1
  35. package/dist/chat/Message/turn/workedCollapse.js.map +1 -1
  36. package/dist/chat/Tool/Tool.js +1 -1
  37. package/dist/chat/Tool/Tool.js.map +1 -1
  38. package/dist/chat/Tool/agent/AgentTool.d.ts.map +1 -1
  39. package/dist/chat/Tool/agent/AgentTool.js +73 -73
  40. package/dist/chat/Tool/agent/AgentTool.js.map +1 -1
  41. package/dist/chat/Tool/bash/BashTool.d.ts.map +1 -1
  42. package/dist/chat/Tool/bash/BashTool.js +1 -1
  43. package/dist/chat/Tool/bash/BashTool.js.map +1 -1
  44. package/dist/chat/Tool/create-directory/CreateDirectoryTool.js +1 -1
  45. package/dist/chat/Tool/create-directory/CreateDirectoryTool.js.map +1 -1
  46. package/dist/chat/Tool/default/Default.d.ts.map +1 -1
  47. package/dist/chat/Tool/default/Default.js +1 -1
  48. package/dist/chat/Tool/default/Default.js.map +1 -1
  49. package/dist/chat/Tool/dev-server/DevServerRestartTool.js +1 -1
  50. package/dist/chat/Tool/dev-server/DevServerRestartTool.js.map +1 -1
  51. package/dist/chat/Tool/dev-server/DevServerStatusTool.js +1 -1
  52. package/dist/chat/Tool/dev-server/DevServerStatusTool.js.map +1 -1
  53. package/dist/chat/Tool/edit/EditTool.js +1 -1
  54. package/dist/chat/Tool/edit/EditTool.js.map +1 -1
  55. package/dist/chat/Tool/fetch/FetchTool.js +1 -1
  56. package/dist/chat/Tool/fetch/FetchTool.js.map +1 -1
  57. package/dist/chat/Tool/fileChangesFromToolParts.js +1 -1
  58. package/dist/chat/Tool/fileChangesFromToolParts.js.map +1 -1
  59. package/dist/chat/Tool/get-background-result/GetBackgroundResultTool.js +1 -1
  60. package/dist/chat/Tool/get-background-result/GetBackgroundResultTool.js.map +1 -1
  61. package/dist/chat/Tool/get-errors/GetErrorsTool.js +1 -1
  62. package/dist/chat/Tool/get-errors/GetErrorsTool.js.map +1 -1
  63. package/dist/chat/Tool/glob/GlobTool.js +1 -1
  64. package/dist/chat/Tool/glob/GlobTool.js.map +1 -1
  65. package/dist/chat/Tool/grep/GrepTool.js +1 -1
  66. package/dist/chat/Tool/grep/GrepTool.js.map +1 -1
  67. package/dist/chat/Tool/helpers.d.ts +1 -1
  68. package/dist/chat/Tool/helpers.d.ts.map +1 -1
  69. package/dist/chat/Tool/helpers.js +1 -1
  70. package/dist/chat/Tool/helpers.js.map +1 -1
  71. package/dist/chat/Tool/image-asset/ImageAssetTool.js +1 -1
  72. package/dist/chat/Tool/image-asset/ImageAssetTool.js.map +1 -1
  73. package/dist/chat/Tool/install-dependencies/InstallDependenciesTool.js +1 -1
  74. package/dist/chat/Tool/install-dependencies/InstallDependenciesTool.js.map +1 -1
  75. package/dist/chat/Tool/install-plugin/InstallPlugin.js +1 -1
  76. package/dist/chat/Tool/install-plugin/InstallPlugin.js.map +1 -1
  77. package/dist/chat/Tool/integration-card/IntegrationActionCard.d.ts +3 -1
  78. package/dist/chat/Tool/integration-card/IntegrationActionCard.d.ts.map +1 -1
  79. package/dist/chat/Tool/integration-card/IntegrationActionCard.js +88 -82
  80. package/dist/chat/Tool/integration-card/IntegrationActionCard.js.map +1 -1
  81. package/dist/chat/Tool/list-directory/normalizeListDirectoryTools.js +1 -1
  82. package/dist/chat/Tool/list-directory/normalizeListDirectoryTools.js.map +1 -1
  83. package/dist/chat/Tool/mcp-tools/CallDynamicTool.js +1 -1
  84. package/dist/chat/Tool/mcp-tools/CallDynamicTool.js.map +1 -1
  85. package/dist/chat/Tool/mcp-tools/GetDynamicToolsTool.js +1 -1
  86. package/dist/chat/Tool/mcp-tools/GetDynamicToolsTool.js.map +1 -1
  87. package/dist/chat/Tool/mcp-tools/GetMcpResourcesTool.js +1 -1
  88. package/dist/chat/Tool/mcp-tools/GetMcpResourcesTool.js.map +1 -1
  89. package/dist/chat/Tool/mcp-tools/McpAuth.js +1 -1
  90. package/dist/chat/Tool/mcp-tools/McpAuth.js.map +1 -1
  91. package/dist/chat/Tool/memory/MemoryTool.js +1 -1
  92. package/dist/chat/Tool/memory/MemoryTool.js.map +1 -1
  93. package/dist/chat/Tool/move-file/MoveFileTool.js +1 -1
  94. package/dist/chat/Tool/move-file/MoveFileTool.js.map +1 -1
  95. package/dist/chat/Tool/plan/CreatePlanTool.js +1 -1
  96. package/dist/chat/Tool/plan/CreatePlanTool.js.map +1 -1
  97. package/dist/chat/Tool/preamble/PreambleTool.js +1 -1
  98. package/dist/chat/Tool/preamble/PreambleTool.js.map +1 -1
  99. package/dist/chat/Tool/project-build/BuildTool.js +1 -1
  100. package/dist/chat/Tool/project-build/BuildTool.js.map +1 -1
  101. package/dist/chat/Tool/project-env/ProjectEnvTool.js +1 -1
  102. package/dist/chat/Tool/project-env/ProjectEnvTool.js.map +1 -1
  103. package/dist/chat/Tool/read/normalizeReadTools.js +1 -1
  104. package/dist/chat/Tool/read/normalizeReadTools.js.map +1 -1
  105. package/dist/chat/Tool/read-lints/ReadLintsTool.js +1 -1
  106. package/dist/chat/Tool/read-lints/ReadLintsTool.js.map +1 -1
  107. package/dist/chat/Tool/remove-file/RemoveFileTool.js +1 -1
  108. package/dist/chat/Tool/remove-file/RemoveFileTool.js.map +1 -1
  109. package/dist/chat/Tool/scaffold-project/ScaffoldProjectTool.js +1 -1
  110. package/dist/chat/Tool/scaffold-project/ScaffoldProjectTool.js.map +1 -1
  111. package/dist/chat/Tool/screenshot/CaptureScreenshotTool.js +3 -3
  112. package/dist/chat/Tool/screenshot/CaptureScreenshotTool.js.map +1 -1
  113. package/dist/chat/Tool/skill/SkillTool.js +1 -1
  114. package/dist/chat/Tool/skill/SkillTool.js.map +1 -1
  115. package/dist/chat/Tool/waiting/WaitingTool.js +1 -1
  116. package/dist/chat/Tool/waiting/WaitingTool.js.map +1 -1
  117. package/dist/chat/Tool/web-search/WebSearchTool.js +1 -1
  118. package/dist/chat/Tool/web-search/WebSearchTool.js.map +1 -1
  119. package/package.json +4 -4
@@ -1,150 +1,156 @@
1
- import { Mcp as b } from "@reforma/icons/14";
2
- import { isHttpUrl as y } from "@reforma/lib";
1
+ import { Mcp as k } from "@reforma/icons/14";
2
+ import { isHttpUrl as N } from "@reforma/lib";
3
3
  import "react";
4
- import { Box as f } from "../../../Box/Box.js";
5
- import { Button as N } from "../../../Button/Button.js";
4
+ import { Box as s } from "../../../Box/Box.js";
5
+ import { Button as b } from "../../../Button/Button.js";
6
6
  import { Card as j } from "../../../Card/Card.js";
7
- import { Image as k } from "../../../Image/Image.js";
8
- import { Show as g } from "../../../Show/Show.js";
9
- import { Text as p } from "../../../Text/Text.js";
10
- import d from "./IntegrationActionCard.module.css.js";
11
- import { jsxs as n, jsx as t } from "react/jsx-runtime";
12
- const z = 20;
13
- function A({
14
- logo: r,
15
- logoSmall: i,
7
+ import { Image as z } from "../../../Image/Image.js";
8
+ import { Show as u } from "../../../Show/Show.js";
9
+ import { Text as f } from "../../../Text/Text.js";
10
+ import m from "./IntegrationActionCard.module.css.js";
11
+ import { jsxs as e, jsx as r } from "react/jsx-runtime";
12
+ const A = 20;
13
+ function W({
14
+ logo: i,
15
+ logoSmall: n,
16
16
  brandColor: c,
17
17
  brandColorDark: o,
18
- size: e = z,
18
+ size: a = A,
19
19
  framed: l = !0
20
20
  }) {
21
- const m = !l && i && y(i) ? i : void 0, a = m ?? (r && y(r) ? r : void 0), s = !!((c || o) && !m);
22
- return /* @__PURE__ */ t("span", {
23
- className: l ? d.icon : d.compact,
21
+ const h = !l && n && N(n) ? n : void 0, t = h ?? (i && N(i) ? i : void 0), d = !!((c || o) && !h);
22
+ return /* @__PURE__ */ r("span", {
23
+ className: l ? m.icon : m.compact,
24
24
  style: {
25
25
  ...l ? {} : {
26
- "--catalog-icon-size": `${e}px`
26
+ "--catalog-icon-size": `${a}px`
27
27
  },
28
- ...s && c ? {
28
+ ...d && c ? {
29
29
  "--catalog-brand": c
30
30
  } : {},
31
- ...s && o ? {
31
+ ...d && o ? {
32
32
  "--catalog-brand-dark": o
33
33
  } : {}
34
34
  },
35
- children: /* @__PURE__ */ t(g, {
36
- when: a,
37
- fallback: /* @__PURE__ */ t(b, {
38
- size: e,
35
+ children: /* @__PURE__ */ r(u, {
36
+ when: t,
37
+ fallback: /* @__PURE__ */ r(k, {
38
+ size: a,
39
39
  "aria-hidden": !0
40
40
  }),
41
- children: (h) => /* @__PURE__ */ t(k, {
42
- src: h,
41
+ children: (p) => /* @__PURE__ */ r(z, {
42
+ src: p,
43
43
  alt: "",
44
- width: e,
45
- height: e
44
+ width: a,
45
+ height: a
46
46
  })
47
47
  })
48
48
  });
49
49
  }
50
- function D({
51
- name: r,
52
- description: i,
50
+ function F({
51
+ name: i,
52
+ description: n,
53
53
  logo: c,
54
54
  brandColor: o,
55
- brandColorDark: e,
55
+ brandColorDark: a,
56
56
  primaryLabel: l,
57
- skipLabel: m = "Skip",
58
- spacious: a = !1,
59
- icon: s,
60
- onSkip: h,
61
- onPrimary: v,
62
- isPending: u = !1,
57
+ skipLabel: h = "Skip",
58
+ spacious: t = !1,
59
+ icon: d,
60
+ badge: p,
61
+ onSkip: v,
62
+ onPrimary: w,
63
+ isPending: g = !1,
63
64
  isPrimaryDisabled: B = !1,
64
- "data-slot": w
65
+ "data-slot": x
65
66
  }) {
66
- const x = /* @__PURE__ */ t(g, {
67
- when: s,
68
- fallback: /* @__PURE__ */ t(A, {
67
+ const I = /* @__PURE__ */ r(u, {
68
+ when: d,
69
+ fallback: /* @__PURE__ */ r(W, {
69
70
  logo: c,
70
71
  brandColor: o,
71
- brandColorDark: e
72
+ brandColorDark: a
72
73
  }),
73
- children: s
74
- }), I = /* @__PURE__ */ t(g, {
75
- when: h && v,
76
- children: /* @__PURE__ */ n(f, {
74
+ children: d
75
+ }), y = /* @__PURE__ */ r(u, {
76
+ when: v && w,
77
+ children: /* @__PURE__ */ e(s, {
77
78
  direction: "row",
78
79
  gap: "sm",
79
- justify: a ? "end" : void 0,
80
- className: d.actions,
81
- children: [/* @__PURE__ */ t(N, {
82
- size: a ? "md" : "sm",
83
- variant: "ghost",
80
+ justify: t ? "end" : void 0,
81
+ className: m.actions,
82
+ children: [/* @__PURE__ */ r(b, {
83
+ size: t ? "md" : "sm",
84
+ variant: t ? "bordered" : "ghost",
84
85
  color: "secondary",
85
- isDisabled: u,
86
- onPress: h,
87
- children: m
88
- }), /* @__PURE__ */ t(N, {
89
- size: a ? "md" : "sm",
86
+ isDisabled: g,
87
+ onPress: v,
88
+ children: h
89
+ }), /* @__PURE__ */ r(b, {
90
+ size: t ? "md" : "sm",
90
91
  variant: "filled",
91
92
  color: "contrast",
92
- isPending: u,
93
- isDisabled: u || B,
94
- onPress: v,
93
+ isPending: g,
94
+ isDisabled: g || B,
95
+ onPress: w,
95
96
  children: l
96
97
  })]
97
98
  })
98
99
  });
99
- return a ? /* @__PURE__ */ n(j, {
100
+ return t ? /* @__PURE__ */ e(j, {
100
101
  variant: "filled",
101
102
  size: "lg",
102
103
  direction: "column",
103
104
  align: "stretch",
104
105
  gap: "xl",
105
106
  fullWidth: !0,
106
- className: d.root,
107
- "data-slot": w,
108
- children: [/* @__PURE__ */ n(f, {
107
+ className: m.root,
108
+ "data-slot": x,
109
+ children: [/* @__PURE__ */ e(s, {
109
110
  gap: "lg",
110
- children: [x, /* @__PURE__ */ n(f, {
111
+ children: [I, /* @__PURE__ */ e(s, {
111
112
  gap: "xs",
112
- children: [/* @__PURE__ */ t(p, {
113
- variant: "heading-4",
114
- children: r
115
- }), /* @__PURE__ */ t(p, {
113
+ children: [/* @__PURE__ */ e(s, {
114
+ direction: "row",
115
+ align: "center",
116
+ gap: "sm",
117
+ children: [/* @__PURE__ */ r(f, {
118
+ variant: "heading-4",
119
+ children: i
120
+ }), p]
121
+ }), /* @__PURE__ */ r(f, {
116
122
  variant: "md",
117
123
  color: "secondary",
118
- children: i
124
+ children: n
119
125
  })]
120
126
  })]
121
- }), I]
122
- }) : /* @__PURE__ */ n(j, {
127
+ }), y]
128
+ }) : /* @__PURE__ */ e(j, {
123
129
  variant: "filled",
124
130
  size: "sm",
125
131
  direction: "row",
126
132
  align: "center",
127
133
  gap: "md",
128
134
  fullWidth: !0,
129
- className: d.root,
130
- "data-slot": w,
131
- children: [x, /* @__PURE__ */ n(f, {
135
+ className: m.root,
136
+ "data-slot": x,
137
+ children: [I, /* @__PURE__ */ e(s, {
132
138
  grow: !0,
133
- children: [/* @__PURE__ */ t(p, {
139
+ children: [/* @__PURE__ */ r(f, {
134
140
  variant: "heading-5",
135
141
  truncate: !0,
136
- children: r
137
- }), /* @__PURE__ */ t(p, {
142
+ children: i
143
+ }), /* @__PURE__ */ r(f, {
138
144
  variant: "md",
139
145
  color: "secondary",
140
146
  truncate: !0,
141
- children: i
147
+ children: n
142
148
  })]
143
- }), I]
149
+ }), y]
144
150
  });
145
151
  }
146
152
  export {
147
- D as IntegrationActionCard,
148
- A as IntegrationActionIcon
153
+ F as IntegrationActionCard,
154
+ W as IntegrationActionIcon
149
155
  };
150
156
  //# sourceMappingURL=IntegrationActionCard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"IntegrationActionCard.js","sources":["../../../../src/chat/Tool/integration-card/IntegrationActionCard.tsx"],"sourcesContent":["import { Mcp } from '@reforma/icons/14';\nimport { isHttpUrl } from '@reforma/lib';\nimport { type CSSProperties, type ReactNode } from 'react';\n\nimport { Box } from '../../../Box';\nimport { Button } from '../../../Button';\nimport { Card } from '../../../Card';\nimport { Image } from '../../../Image';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport styles from './IntegrationActionCard.module.css';\n\nconst ICON_SIZE = 20;\n\nexport type IntegrationActionCardProps = {\n name: string;\n description: string;\n logo?: string;\n logoSmall?: string;\n brandColor?: string;\n brandColorDark?: string;\n primaryLabel?: string;\n skipLabel?: string;\n /** Taller card: wrapping copy and room for a long skip label. */\n spacious?: boolean;\n /** Replaces the catalog mark. */\n icon?: ReactNode;\n onSkip?: () => void;\n onPrimary?: () => void;\n isPending?: boolean;\n isPrimaryDisabled?: boolean;\n 'data-slot'?: string;\n};\n\nexport function IntegrationActionIcon({\n logo,\n logoSmall,\n brandColor,\n brandColorDark,\n size = ICON_SIZE,\n framed = true,\n}: Pick<IntegrationActionCardProps, 'logo' | 'logoSmall' | 'brandColor' | 'brandColorDark'> & {\n size?: number;\n framed?: boolean;\n}) {\n const small = !framed && logoSmall && isHttpUrl(logoSmall) ? logoSmall : undefined;\n const src = small ?? ((logo && isHttpUrl(logo)) ? logo : undefined);\n const plated = Boolean((brandColor || brandColorDark) && !small);\n\n return (\n <span\n className={ framed ? styles.icon : styles.compact }\n style={ {\n ...(!framed ? { '--catalog-icon-size': `${ size }px` } : {}),\n ...(plated && brandColor ? { '--catalog-brand': brandColor } : {}),\n ...(plated && brandColorDark ? { '--catalog-brand-dark': brandColorDark } : {}),\n } as CSSProperties }\n >\n <Show\n when={ src }\n fallback={ <Mcp size={ size } aria-hidden /> }\n >\n { href => (\n <Image\n src={ href }\n alt=\"\"\n width={ size }\n height={ size }\n />\n ) }\n </Show>\n </span>\n );\n}\n\n/** Filled HITL row: catalog mark + name + description + Skip / primary. */\nexport function IntegrationActionCard({\n name,\n description,\n logo,\n brandColor,\n brandColorDark,\n primaryLabel,\n skipLabel = 'Skip',\n spacious = false,\n icon,\n onSkip,\n onPrimary,\n isPending = false,\n isPrimaryDisabled = false,\n 'data-slot': dataSlot,\n}: IntegrationActionCardProps) {\n const mark = (\n <Show\n when={ icon }\n fallback={ (\n <IntegrationActionIcon\n logo={ logo }\n brandColor={ brandColor }\n brandColorDark={ brandColorDark }\n />\n ) }\n >\n { icon }\n </Show>\n );\n const actions = (\n <Show when={ onSkip && onPrimary }>\n <Box direction=\"row\" gap=\"sm\" justify={ spacious ? 'end' : undefined } className={ styles.actions }>\n <Button\n size={ spacious ? 'md' : 'sm' }\n variant=\"ghost\"\n color=\"secondary\"\n isDisabled={ isPending }\n onPress={ onSkip }\n >\n { skipLabel }\n </Button>\n <Button\n size={ spacious ? 'md' : 'sm' }\n variant=\"filled\"\n color=\"contrast\"\n isPending={ isPending }\n isDisabled={ isPending || isPrimaryDisabled }\n onPress={ onPrimary }\n >\n { primaryLabel }\n </Button>\n </Box>\n </Show>\n );\n\n if (spacious) {\n return (\n <Card\n variant=\"filled\"\n size=\"lg\"\n direction=\"column\"\n align=\"stretch\"\n gap=\"xl\"\n fullWidth\n className={ styles.root }\n data-slot={ dataSlot }\n >\n <Box gap=\"lg\">\n { mark }\n <Box gap=\"xs\">\n <Text variant=\"heading-4\">{ name }</Text>\n <Text variant=\"md\" color=\"secondary\">{ description }</Text>\n </Box>\n </Box>\n { actions }\n </Card>\n );\n }\n\n return (\n <Card\n variant=\"filled\"\n size=\"sm\"\n direction=\"row\"\n align=\"center\"\n gap=\"md\"\n fullWidth\n className={ styles.root }\n data-slot={ dataSlot }\n >\n { mark }\n <Box grow>\n <Text variant=\"heading-5\" truncate>{ name }</Text>\n <Text variant=\"md\" color=\"secondary\" truncate>{ description }</Text>\n </Box>\n { actions }\n </Card>\n );\n}\n"],"names":["ICON_SIZE","IntegrationActionIcon","logo","logoSmall","brandColor","brandColorDark","size","framed","small","isHttpUrl","src","plated","styles","Show","Mcp","href","_jsx","Image","IntegrationActionCard","name","description","primaryLabel","skipLabel","spacious","icon","onSkip","onPrimary","isPending","isPrimaryDisabled","dataSlot","mark","actions","Box","Button","Card","_jsxs","Text"],"mappings":"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"}
1
+ {"version":3,"file":"IntegrationActionCard.js","sources":["../../../../src/chat/Tool/integration-card/IntegrationActionCard.tsx"],"sourcesContent":["import { Mcp } from '@reforma/icons/14';\nimport { isHttpUrl } from '@reforma/lib';\nimport { type CSSProperties, type ReactNode } from 'react';\n\nimport { Box } from '../../../Box';\nimport { Button } from '../../../Button';\nimport { Card } from '../../../Card';\nimport { Image } from '../../../Image';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport styles from './IntegrationActionCard.module.css';\n\nconst ICON_SIZE = 20;\n\nexport type IntegrationActionCardProps = {\n name: string;\n description: string;\n logo?: string;\n logoSmall?: string;\n brandColor?: string;\n brandColorDark?: string;\n primaryLabel?: string;\n skipLabel?: string;\n /** Taller card: wrapping copy and room for a long skip label. */\n spacious?: boolean;\n /** Replaces the catalog mark. */\n icon?: ReactNode;\n /** Shown after the name in the spacious layout. */\n badge?: ReactNode;\n onSkip?: () => void;\n onPrimary?: () => void;\n isPending?: boolean;\n isPrimaryDisabled?: boolean;\n 'data-slot'?: string;\n};\n\nexport function IntegrationActionIcon({\n logo,\n logoSmall,\n brandColor,\n brandColorDark,\n size = ICON_SIZE,\n framed = true,\n}: Pick<IntegrationActionCardProps, 'logo' | 'logoSmall' | 'brandColor' | 'brandColorDark'> & {\n size?: number;\n framed?: boolean;\n}) {\n const small = !framed && logoSmall && isHttpUrl(logoSmall) ? logoSmall : undefined;\n const src = small ?? ((logo && isHttpUrl(logo)) ? logo : undefined);\n const plated = Boolean((brandColor || brandColorDark) && !small);\n\n return (\n <span\n className={ framed ? styles.icon : styles.compact }\n style={ {\n ...(!framed ? { '--catalog-icon-size': `${ size }px` } : {}),\n ...(plated && brandColor ? { '--catalog-brand': brandColor } : {}),\n ...(plated && brandColorDark ? { '--catalog-brand-dark': brandColorDark } : {}),\n } as CSSProperties }\n >\n <Show\n when={ src }\n fallback={ <Mcp size={ size } aria-hidden /> }\n >\n { href => (\n <Image\n src={ href }\n alt=\"\"\n width={ size }\n height={ size }\n />\n ) }\n </Show>\n </span>\n );\n}\n\n/** Filled HITL row: catalog mark + name + description + Skip / primary. */\nexport function IntegrationActionCard({\n name,\n description,\n logo,\n brandColor,\n brandColorDark,\n primaryLabel,\n skipLabel = 'Skip',\n spacious = false,\n icon,\n badge,\n onSkip,\n onPrimary,\n isPending = false,\n isPrimaryDisabled = false,\n 'data-slot': dataSlot,\n}: IntegrationActionCardProps) {\n const mark = (\n <Show\n when={ icon }\n fallback={ (\n <IntegrationActionIcon\n logo={ logo }\n brandColor={ brandColor }\n brandColorDark={ brandColorDark }\n />\n ) }\n >\n { icon }\n </Show>\n );\n const actions = (\n <Show when={ onSkip && onPrimary }>\n <Box direction=\"row\" gap=\"sm\" justify={ spacious ? 'end' : undefined } className={ styles.actions }>\n <Button\n size={ spacious ? 'md' : 'sm' }\n variant={ spacious ? 'bordered' : 'ghost' }\n color=\"secondary\"\n isDisabled={ isPending }\n onPress={ onSkip }\n >\n { skipLabel }\n </Button>\n <Button\n size={ spacious ? 'md' : 'sm' }\n variant=\"filled\"\n color=\"contrast\"\n isPending={ isPending }\n isDisabled={ isPending || isPrimaryDisabled }\n onPress={ onPrimary }\n >\n { primaryLabel }\n </Button>\n </Box>\n </Show>\n );\n\n if (spacious) {\n return (\n <Card\n variant=\"filled\"\n size=\"lg\"\n direction=\"column\"\n align=\"stretch\"\n gap=\"xl\"\n fullWidth\n className={ styles.root }\n data-slot={ dataSlot }\n >\n <Box gap=\"lg\">\n { mark }\n <Box gap=\"xs\">\n <Box direction=\"row\" align=\"center\" gap=\"sm\">\n <Text variant=\"heading-4\">{ name }</Text>\n { badge }\n </Box>\n <Text variant=\"md\" color=\"secondary\">{ description }</Text>\n </Box>\n </Box>\n { actions }\n </Card>\n );\n }\n\n return (\n <Card\n variant=\"filled\"\n size=\"sm\"\n direction=\"row\"\n align=\"center\"\n gap=\"md\"\n fullWidth\n className={ styles.root }\n data-slot={ dataSlot }\n >\n { mark }\n <Box grow>\n <Text variant=\"heading-5\" truncate>{ name }</Text>\n <Text variant=\"md\" color=\"secondary\" truncate>{ description }</Text>\n </Box>\n { actions }\n </Card>\n );\n}\n"],"names":["ICON_SIZE","IntegrationActionIcon","logo","logoSmall","brandColor","brandColorDark","size","framed","small","isHttpUrl","src","plated","styles","Show","Mcp","href","_jsx","Image","IntegrationActionCard","name","description","primaryLabel","skipLabel","spacious","icon","badge","onSkip","onPrimary","isPending","isPrimaryDisabled","dataSlot","mark","actions","Box","Button","Card","_jsxs","Text"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { isToolUIPart as l, getToolName as s } from "ai";
1
+ import { isToolUIPart as l, getToolName as s } from "@reforma/types";
2
2
  import { chipItemFromPath as n } from "../../Chip/helpers/chipPath.js";
3
3
  import { isToolInvocationInProgress as c, getToolFailureRowState as m } from "../helpers.js";
4
4
  import { parseListDirectoryOutput as a } from "./listDirectoryOutput.js";
@@ -1 +1 @@
1
- {"version":3,"file":"normalizeListDirectoryTools.js","sources":["../../../../src/chat/Tool/list-directory/normalizeListDirectoryTools.ts"],"sourcesContent":["import { getToolName, isToolUIPart } from 'ai';\n\nimport { chipItemFromPath, type ChipItem } from '../../Chip';\nimport { getToolFailureRowState, isToolInvocationInProgress, type ToolFailureRowState } from '../helpers';\nimport { parseListDirectoryOutput } from './listDirectoryOutput';\n\nimport type { ReformaUIMessagePart } from '../../Message/types';\nimport type { ToolRendererProps } from '../types';\n\nexport type ListDirectoryToolUIPart = Extract<ReformaUIMessagePart, { type: 'tool-ListDirectory' }>;\n\nexport function isListDirectoryToolUIPart(\n part: ToolRendererProps['part'] | ReformaUIMessagePart\n): part is ListDirectoryToolUIPart {\n return isToolUIPart(part) && getToolName(part) === 'ListDirectory';\n}\n\nexport type ListDirectoryDirectoryEntry = {\n id: string;\n chipItems: ChipItem[];\n paths: string[];\n done: boolean;\n};\n\nexport type NormalizedListDirectoryToolsView = {\n directories: ListDirectoryDirectoryEntry[];\n /** SDK state of the last merged part (message order). */\n state: ListDirectoryToolUIPart['state'];\n failure: ToolFailureRowState;\n statusDetail?: string;\n problemText?: string;\n};\n\nfunction directoryEntryFromPart(part: ListDirectoryToolUIPart): ListDirectoryDirectoryEntry {\n const input = part.input as { path?: string } | undefined;\n const item = chipItemFromPath(input?.path || './');\n const chipItems = item ? [{ ...item, type: 'folder' as const, id: part.toolCallId }] : [];\n const done = part.state === 'output-available';\n const parsed = done ? parseListDirectoryOutput(part.output) : { paths: [] as string[] };\n\n return {\n id: part.toolCallId,\n chipItems,\n paths: parsed.paths,\n done,\n };\n}\n\nfunction aggregateListDirectoryFailure(parts: readonly ListDirectoryToolUIPart[]): ToolFailureRowState {\n if (parts.some(part => isToolInvocationInProgress(part.state))) {\n return { useFailureLabel: false, tooltip: undefined, problemText: undefined };\n }\n\n if (parts.some(part => part.state === 'output-available')) {\n return { useFailureLabel: false, tooltip: undefined, problemText: undefined };\n }\n\n const failure = parts.map(part => getToolFailureRowState(part)).find(row => row.useFailureLabel);\n\n return failure ?? { useFailureLabel: false, tooltip: undefined, problemText: undefined };\n}\n\nfunction statusDetailFromParts(\n parts: readonly ListDirectoryToolUIPart[],\n failure: ToolFailureRowState\n): string | undefined {\n if (failure.useFailureLabel) {\n return failure.tooltip;\n }\n\n for (const part of parts) {\n if (part.state !== 'output-available') {\n continue;\n }\n\n const parsed = parseListDirectoryOutput(part.output);\n\n if (parsed.error) {\n return parsed.error;\n }\n }\n\n return undefined;\n}\n\nfunction problemTextFromParts(\n parts: readonly ListDirectoryToolUIPart[],\n failure: ToolFailureRowState\n): string | undefined {\n const hasExecutionError = parts.some((part) => {\n if (part.state !== 'output-available') {\n return false;\n }\n\n return parseListDirectoryOutput(part.output).error !== undefined;\n });\n\n return hasExecutionError ? undefined : failure.problemText;\n}\n\n/** Merges one or more ListDirectory tool parts into a single summary row view. */\nexport function normalizeListDirectoryToolParts(\n parts: readonly ListDirectoryToolUIPart[]\n): NormalizedListDirectoryToolsView {\n const directories = parts.map(part => directoryEntryFromPart(part));\n const failure = aggregateListDirectoryFailure(parts);\n const state = parts[parts.length - 1]?.state ?? 'output-available';\n\n return {\n directories,\n state,\n failure,\n statusDetail: statusDetailFromParts(parts, failure),\n problemText: problemTextFromParts(parts, failure),\n };\n}\n"],"names":["isListDirectoryToolUIPart","part","isToolUIPart","getToolName","directoryEntryFromPart","input","item","chipItemFromPath","chipItems","done","parsed","parseListDirectoryOutput","aggregateListDirectoryFailure","parts","isToolInvocationInProgress","getToolFailureRowState","row","statusDetailFromParts","failure","problemTextFromParts","normalizeListDirectoryToolParts","directories","state"],"mappings":";;;;AAIO,SAASA,EAA0BC,GAAM;AAC9C,SAAOC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AACrD;AACA,SAASG,EAAuBH,GAAM;AACpC,QAAMI,IAAQJ,EAAK,OACbK,IAAOC,EAAiBF,GAAO,QAAQ,IAAI,GAC3CG,IAAYF,IAAO,CAAC;AAAA,IACxB,GAAGA;AAAA,IACH,MAAM;AAAA,IACN,IAAIL,EAAK;AAAA,EAAA,CACV,IAAI,CAAA,GACCQ,IAAOR,EAAK,UAAU,oBACtBS,IAASD,IAAOE,EAAyBV,EAAK,MAAM,IAAI;AAAA,IAC5D,OAAO,CAAA;AAAA,EAAC;AAEV,SAAO;AAAA,IACL,IAAIA,EAAK;AAAA,IACT,WAAAO;AAAA,IACA,OAAOE,EAAO;AAAA,IACd,MAAAD;AAAA,EAAA;AAEJ;AACA,SAASG,EAA8BC,GAAO;AAC5C,SAAIA,EAAM,KAAK,CAAAZ,MAAQa,EAA2Bb,EAAK,KAAK,CAAC,IACpD;AAAA,IACL,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,aAAa;AAAA,EAAA,IAGbY,EAAM,KAAK,CAAAZ,MAAQA,EAAK,UAAU,kBAAkB,IAC/C;AAAA,IACL,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,aAAa;AAAA,EAAA,IAGDY,EAAM,IAAI,CAAAZ,MAAQc,EAAuBd,CAAI,CAAC,EAAE,KAAK,CAAAe,MAAOA,EAAI,eAAe,KAC7E;AAAA,IAChB,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,aAAa;AAAA,EAAA;AAEjB;AACA,SAASC,EAAsBJ,GAAOK,GAAS;AAC7C,MAAIA,EAAQ;AACV,WAAOA,EAAQ;AAEjB,aAAWjB,KAAQY,GAAO;AACxB,QAAIZ,EAAK,UAAU;AACjB;AAEF,UAAMS,IAASC,EAAyBV,EAAK,MAAM;AACnD,QAAIS,EAAO;AACT,aAAOA,EAAO;AAAA,EAElB;AAEF;AACA,SAASS,EAAqBN,GAAOK,GAAS;AAO5C,SAN0BL,EAAM,KAAK,CAAAZ,MAC/BA,EAAK,UAAU,qBACV,KAEFU,EAAyBV,EAAK,MAAM,EAAE,UAAU,MACxD,IAC0B,SAAYiB,EAAQ;AACjD;AAGO,SAASE,EAAgCP,GAAO;AACrD,QAAMQ,IAAcR,EAAM,IAAI,CAAAZ,MAAQG,EAAuBH,CAAI,CAAC,GAC5DiB,IAAUN,EAA8BC,CAAK,GAC7CS,IAAQT,EAAMA,EAAM,SAAS,CAAC,GAAG,SAAS;AAChD,SAAO;AAAA,IACL,aAAAQ;AAAA,IACA,OAAAC;AAAA,IACA,SAAAJ;AAAA,IACA,cAAcD,EAAsBJ,GAAOK,CAAO;AAAA,IAClD,aAAaC,EAAqBN,GAAOK,CAAO;AAAA,EAAA;AAEpD;"}
1
+ {"version":3,"file":"normalizeListDirectoryTools.js","sources":["../../../../src/chat/Tool/list-directory/normalizeListDirectoryTools.ts"],"sourcesContent":["import { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { chipItemFromPath, type ChipItem } from '../../Chip';\nimport { getToolFailureRowState, isToolInvocationInProgress, type ToolFailureRowState } from '../helpers';\nimport { parseListDirectoryOutput } from './listDirectoryOutput';\n\nimport type { ReformaUIMessagePart } from '../../Message/types';\nimport type { ToolRendererProps } from '../types';\n\nexport type ListDirectoryToolUIPart = Extract<ReformaUIMessagePart, { type: 'tool-ListDirectory' }>;\n\nexport function isListDirectoryToolUIPart(\n part: ToolRendererProps['part'] | ReformaUIMessagePart\n): part is ListDirectoryToolUIPart {\n return isToolUIPart(part) && getToolName(part) === 'ListDirectory';\n}\n\nexport type ListDirectoryDirectoryEntry = {\n id: string;\n chipItems: ChipItem[];\n paths: string[];\n done: boolean;\n};\n\nexport type NormalizedListDirectoryToolsView = {\n directories: ListDirectoryDirectoryEntry[];\n /** SDK state of the last merged part (message order). */\n state: ListDirectoryToolUIPart['state'];\n failure: ToolFailureRowState;\n statusDetail?: string;\n problemText?: string;\n};\n\nfunction directoryEntryFromPart(part: ListDirectoryToolUIPart): ListDirectoryDirectoryEntry {\n const input = part.input as { path?: string } | undefined;\n const item = chipItemFromPath(input?.path || './');\n const chipItems = item ? [{ ...item, type: 'folder' as const, id: part.toolCallId }] : [];\n const done = part.state === 'output-available';\n const parsed = done ? parseListDirectoryOutput(part.output) : { paths: [] as string[] };\n\n return {\n id: part.toolCallId,\n chipItems,\n paths: parsed.paths,\n done,\n };\n}\n\nfunction aggregateListDirectoryFailure(parts: readonly ListDirectoryToolUIPart[]): ToolFailureRowState {\n if (parts.some(part => isToolInvocationInProgress(part.state))) {\n return { useFailureLabel: false, tooltip: undefined, problemText: undefined };\n }\n\n if (parts.some(part => part.state === 'output-available')) {\n return { useFailureLabel: false, tooltip: undefined, problemText: undefined };\n }\n\n const failure = parts.map(part => getToolFailureRowState(part)).find(row => row.useFailureLabel);\n\n return failure ?? { useFailureLabel: false, tooltip: undefined, problemText: undefined };\n}\n\nfunction statusDetailFromParts(\n parts: readonly ListDirectoryToolUIPart[],\n failure: ToolFailureRowState\n): string | undefined {\n if (failure.useFailureLabel) {\n return failure.tooltip;\n }\n\n for (const part of parts) {\n if (part.state !== 'output-available') {\n continue;\n }\n\n const parsed = parseListDirectoryOutput(part.output);\n\n if (parsed.error) {\n return parsed.error;\n }\n }\n\n return undefined;\n}\n\nfunction problemTextFromParts(\n parts: readonly ListDirectoryToolUIPart[],\n failure: ToolFailureRowState\n): string | undefined {\n const hasExecutionError = parts.some((part) => {\n if (part.state !== 'output-available') {\n return false;\n }\n\n return parseListDirectoryOutput(part.output).error !== undefined;\n });\n\n return hasExecutionError ? undefined : failure.problemText;\n}\n\n/** Merges one or more ListDirectory tool parts into a single summary row view. */\nexport function normalizeListDirectoryToolParts(\n parts: readonly ListDirectoryToolUIPart[]\n): NormalizedListDirectoryToolsView {\n const directories = parts.map(part => directoryEntryFromPart(part));\n const failure = aggregateListDirectoryFailure(parts);\n const state = parts[parts.length - 1]?.state ?? 'output-available';\n\n return {\n directories,\n state,\n failure,\n statusDetail: statusDetailFromParts(parts, failure),\n problemText: problemTextFromParts(parts, failure),\n };\n}\n"],"names":["isListDirectoryToolUIPart","part","isToolUIPart","getToolName","directoryEntryFromPart","input","item","chipItemFromPath","chipItems","done","parsed","parseListDirectoryOutput","aggregateListDirectoryFailure","parts","isToolInvocationInProgress","getToolFailureRowState","row","statusDetailFromParts","failure","problemTextFromParts","normalizeListDirectoryToolParts","directories","state"],"mappings":";;;;AAIO,SAASA,EAA0BC,GAAM;AAC9C,SAAOC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AACrD;AACA,SAASG,EAAuBH,GAAM;AACpC,QAAMI,IAAQJ,EAAK,OACbK,IAAOC,EAAiBF,GAAO,QAAQ,IAAI,GAC3CG,IAAYF,IAAO,CAAC;AAAA,IACxB,GAAGA;AAAA,IACH,MAAM;AAAA,IACN,IAAIL,EAAK;AAAA,EAAA,CACV,IAAI,CAAA,GACCQ,IAAOR,EAAK,UAAU,oBACtBS,IAASD,IAAOE,EAAyBV,EAAK,MAAM,IAAI;AAAA,IAC5D,OAAO,CAAA;AAAA,EAAC;AAEV,SAAO;AAAA,IACL,IAAIA,EAAK;AAAA,IACT,WAAAO;AAAA,IACA,OAAOE,EAAO;AAAA,IACd,MAAAD;AAAA,EAAA;AAEJ;AACA,SAASG,EAA8BC,GAAO;AAC5C,SAAIA,EAAM,KAAK,CAAAZ,MAAQa,EAA2Bb,EAAK,KAAK,CAAC,IACpD;AAAA,IACL,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,aAAa;AAAA,EAAA,IAGbY,EAAM,KAAK,CAAAZ,MAAQA,EAAK,UAAU,kBAAkB,IAC/C;AAAA,IACL,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,aAAa;AAAA,EAAA,IAGDY,EAAM,IAAI,CAAAZ,MAAQc,EAAuBd,CAAI,CAAC,EAAE,KAAK,CAAAe,MAAOA,EAAI,eAAe,KAC7E;AAAA,IAChB,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,aAAa;AAAA,EAAA;AAEjB;AACA,SAASC,EAAsBJ,GAAOK,GAAS;AAC7C,MAAIA,EAAQ;AACV,WAAOA,EAAQ;AAEjB,aAAWjB,KAAQY,GAAO;AACxB,QAAIZ,EAAK,UAAU;AACjB;AAEF,UAAMS,IAASC,EAAyBV,EAAK,MAAM;AACnD,QAAIS,EAAO;AACT,aAAOA,EAAO;AAAA,EAElB;AAEF;AACA,SAASS,EAAqBN,GAAOK,GAAS;AAO5C,SAN0BL,EAAM,KAAK,CAAAZ,MAC/BA,EAAK,UAAU,qBACV,KAEFU,EAAyBV,EAAK,MAAM,EAAE,UAAU,MACxD,IAC0B,SAAYiB,EAAQ;AACjD;AAGO,SAASE,EAAgCP,GAAO;AACrD,QAAMQ,IAAcR,EAAM,IAAI,CAAAZ,MAAQG,EAAuBH,CAAI,CAAC,GAC5DiB,IAAUN,EAA8BC,CAAK,GAC7CS,IAAQT,EAAMA,EAAM,SAAS,CAAC,GAAG,SAAS;AAChD,SAAO;AAAA,IACL,aAAAQ;AAAA,IACA,OAAAC;AAAA,IACA,SAAAJ;AAAA,IACA,cAAcD,EAAsBJ,GAAOK,CAAO;AAAA,IAClD,aAAaC,EAAqBN,GAAOK,CAAO;AAAA,EAAA;AAEpD;"}
@@ -1,6 +1,6 @@
1
1
  import { Mcp as p } from "@reforma/icons/14";
2
2
  import { humanizeString as u } from "@reforma/lib";
3
- import { isToolUIPart as s, getToolName as f } from "ai";
3
+ import { isToolUIPart as s, getToolName as f } from "@reforma/types";
4
4
  import { DefaultTool as T } from "../default/Default.js";
5
5
  import { parsePrefixedMcpToolName as d, parseCallDynamicToolInput as C } from "./parseCallDynamicToolInput.js";
6
6
  import { jsx as i } from "react/jsx-runtime";
@@ -1 +1 @@
1
- {"version":3,"file":"CallDynamicTool.js","sources":["../../../../src/chat/Tool/mcp-tools/CallDynamicTool.tsx"],"sourcesContent":["import { Mcp } from '@reforma/icons/14';\nimport { humanizeString } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { DefaultTool } from '../default/Default';\nimport { parseCallDynamicToolInput, parsePrefixedMcpToolName } from './parseCallDynamicToolInput';\n\nimport type { ToolRendererProps } from '../types';\n\nfunction titleWords(raw: string): string {\n return humanizeString(raw)\n .split(' ')\n .filter(Boolean)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\n/** @internal */\nexport function callDynamicToolTitle(toolName: string, namespace?: string): string {\n const tool = titleWords(toolName);\n\n if (!namespace) {\n return `Run ${ tool }`;\n }\n\n const ns = titleWords(namespace);\n const label = tool.split(' ')[0]?.toLowerCase() === ns.toLowerCase() ? tool : `${ ns } ${ tool }`;\n\n return `Run ${ label }`;\n}\n\n/** CallDynamicTool: render like a native tool — MCP icon, proxied tool name, and inner MCP args only. */\nexport function CallDynamicTool({ part, onToolApprovalResponse }: ToolRendererProps) {\n if (!isToolUIPart(part)) {\n return null;\n }\n\n const name = getToolName(part);\n const prefixed = name === 'CallDynamicTool' ? null : parsePrefixedMcpToolName(name);\n const parsed = name === 'CallDynamicTool'\n ? parseCallDynamicToolInput(part.input)\n : prefixed\n ? { toolName: prefixed.tool, namespace: prefixed.namespace, mcpInput: part.input }\n : undefined;\n\n if (!parsed) {\n return null;\n }\n\n const { toolName, namespace, mcpInput } = parsed;\n\n return (\n <DefaultTool\n part={ part }\n titleOverride={ callDynamicToolTitle(toolName, namespace) }\n inputOverride={ mcpInput }\n leadingIcon={ <Mcp aria-hidden /> }\n onToolApprovalResponse={ onToolApprovalResponse }\n />\n );\n}\n"],"names":["titleWords","raw","humanizeString","word","callDynamicToolTitle","toolName","namespace","tool","ns","CallDynamicTool","part","onToolApprovalResponse","isToolUIPart","name","getToolName","prefixed","parsePrefixedMcpToolName","parsed","parseCallDynamicToolInput","mcpInput","DefaultTool","Mcp"],"mappings":";;;;;;AAMA,SAASA,EAAWC,GAAK;AACvB,SAAOC,EAAeD,CAAG,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,IAAI,CAAAE,MAAQA,EAAK,OAAO,CAAC,EAAE,gBAAgBA,EAAK,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG;AAC1H;AAGO,SAASC,EAAqBC,GAAUC,GAAW;AACxD,QAAMC,IAAOP,EAAWK,CAAQ;AAChC,MAAI,CAACC;AACH,WAAO,OAAOC,CAAI;AAEpB,QAAMC,IAAKR,EAAWM,CAAS;AAE/B,SAAO,OADOC,EAAK,MAAM,GAAG,EAAE,CAAC,GAAG,YAAA,MAAkBC,EAAG,gBAAgBD,IAAO,GAAGC,CAAE,IAAID,CAAI,EACxE;AACrB;AAGO,SAASE,EAAgB;AAAA,EAC9B,MAAAC;AAAA,EACA,wBAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaF,CAAI;AACpB,WAAO;AAET,QAAMG,IAAOC,EAAYJ,CAAI,GACvBK,IAAWF,MAAS,oBAAoB,OAAOG,EAAyBH,CAAI,GAC5EI,IAASJ,MAAS,oBAAoBK,EAA0BR,EAAK,KAAK,IAAIK,IAAW;AAAA,IAC7F,UAAUA,EAAS;AAAA,IACnB,WAAWA,EAAS;AAAA,IACpB,UAAUL,EAAK;AAAA,EAAA,IACb;AACJ,MAAI,CAACO;AACH,WAAO;AAET,QAAM;AAAA,IACJ,UAAAZ;AAAA,IACA,WAAAC;AAAA,IACA,UAAAa;AAAA,EAAA,IACEF;AACJ,2BAAyBG,GAAa;AAAA,IACpC,MAAAV;AAAA,IACA,eAAeN,EAAqBC,GAAUC,CAAS;AAAA,IACvD,eAAea;AAAA,IACf,+BAA+BE,GAAK;AAAA,MAClC,eAAe;AAAA,IAAA,CAChB;AAAA,IACD,wBAAAV;AAAA,EAAA,CACD;AACH;"}
1
+ {"version":3,"file":"CallDynamicTool.js","sources":["../../../../src/chat/Tool/mcp-tools/CallDynamicTool.tsx"],"sourcesContent":["import { Mcp } from '@reforma/icons/14';\nimport { humanizeString } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { DefaultTool } from '../default/Default';\nimport { parseCallDynamicToolInput, parsePrefixedMcpToolName } from './parseCallDynamicToolInput';\n\nimport type { ToolRendererProps } from '../types';\n\nfunction titleWords(raw: string): string {\n return humanizeString(raw)\n .split(' ')\n .filter(Boolean)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\n/** @internal */\nexport function callDynamicToolTitle(toolName: string, namespace?: string): string {\n const tool = titleWords(toolName);\n\n if (!namespace) {\n return `Run ${ tool }`;\n }\n\n const ns = titleWords(namespace);\n const label = tool.split(' ')[0]?.toLowerCase() === ns.toLowerCase() ? tool : `${ ns } ${ tool }`;\n\n return `Run ${ label }`;\n}\n\n/** CallDynamicTool: render like a native tool — MCP icon, proxied tool name, and inner MCP args only. */\nexport function CallDynamicTool({ part, onToolApprovalResponse }: ToolRendererProps) {\n if (!isToolUIPart(part)) {\n return null;\n }\n\n const name = getToolName(part);\n const prefixed = name === 'CallDynamicTool' ? null : parsePrefixedMcpToolName(name);\n const parsed = name === 'CallDynamicTool'\n ? parseCallDynamicToolInput(part.input)\n : prefixed\n ? { toolName: prefixed.tool, namespace: prefixed.namespace, mcpInput: part.input }\n : undefined;\n\n if (!parsed) {\n return null;\n }\n\n const { toolName, namespace, mcpInput } = parsed;\n\n return (\n <DefaultTool\n part={ part }\n titleOverride={ callDynamicToolTitle(toolName, namespace) }\n inputOverride={ mcpInput }\n leadingIcon={ <Mcp aria-hidden /> }\n onToolApprovalResponse={ onToolApprovalResponse }\n />\n );\n}\n"],"names":["titleWords","raw","humanizeString","word","callDynamicToolTitle","toolName","namespace","tool","ns","CallDynamicTool","part","onToolApprovalResponse","isToolUIPart","name","getToolName","prefixed","parsePrefixedMcpToolName","parsed","parseCallDynamicToolInput","mcpInput","DefaultTool","Mcp"],"mappings":";;;;;;AAMA,SAASA,EAAWC,GAAK;AACvB,SAAOC,EAAeD,CAAG,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,IAAI,CAAAE,MAAQA,EAAK,OAAO,CAAC,EAAE,gBAAgBA,EAAK,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG;AAC1H;AAGO,SAASC,EAAqBC,GAAUC,GAAW;AACxD,QAAMC,IAAOP,EAAWK,CAAQ;AAChC,MAAI,CAACC;AACH,WAAO,OAAOC,CAAI;AAEpB,QAAMC,IAAKR,EAAWM,CAAS;AAE/B,SAAO,OADOC,EAAK,MAAM,GAAG,EAAE,CAAC,GAAG,YAAA,MAAkBC,EAAG,gBAAgBD,IAAO,GAAGC,CAAE,IAAID,CAAI,EACxE;AACrB;AAGO,SAASE,EAAgB;AAAA,EAC9B,MAAAC;AAAA,EACA,wBAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaF,CAAI;AACpB,WAAO;AAET,QAAMG,IAAOC,EAAYJ,CAAI,GACvBK,IAAWF,MAAS,oBAAoB,OAAOG,EAAyBH,CAAI,GAC5EI,IAASJ,MAAS,oBAAoBK,EAA0BR,EAAK,KAAK,IAAIK,IAAW;AAAA,IAC7F,UAAUA,EAAS;AAAA,IACnB,WAAWA,EAAS;AAAA,IACpB,UAAUL,EAAK;AAAA,EAAA,IACb;AACJ,MAAI,CAACO;AACH,WAAO;AAET,QAAM;AAAA,IACJ,UAAAZ;AAAA,IACA,WAAAC;AAAA,IACA,UAAAa;AAAA,EAAA,IACEF;AACJ,2BAAyBG,GAAa;AAAA,IACpC,MAAAV;AAAA,IACA,eAAeN,EAAqBC,GAAUC,CAAS;AAAA,IACvD,eAAea;AAAA,IACf,+BAA+BE,GAAK;AAAA,MAClC,eAAe;AAAA,IAAA,CAChB;AAAA,IACD,wBAAAV;AAAA,EAAA,CACD;AACH;"}
@@ -1,5 +1,5 @@
1
1
  import { Mcp as n } from "@reforma/icons/14";
2
- import { isToolUIPart as r, getToolName as s } from "ai";
2
+ import { isToolUIPart as r, getToolName as s } from "@reforma/types";
3
3
  import { getToolFailureRowState as a } from "../helpers.js";
4
4
  import { ToolShell as m, ToolShellHeader as c } from "../shell/ToolShell.js";
5
5
  import { jsx as e } from "react/jsx-runtime";
@@ -1 +1 @@
1
- {"version":3,"file":"GetDynamicToolsTool.js","sources":["../../../../src/chat/Tool/mcp-tools/GetDynamicToolsTool.tsx"],"sourcesContent":["import { Mcp } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { getToolFailureRowState } from '../helpers';\nimport { ToolShell, ToolShellHeader } from '../shell';\n\nimport type { GetDynamicToolsToolInput } from '@reforma/types';\nimport type { ToolRendererProps } from '../types';\n\nfunction namespaceFromInput(input: unknown): string {\n if (input == null || typeof input !== 'object') {\n return '';\n }\n\n const namespace = (input as GetDynamicToolsToolInput).namespace;\n\n return typeof namespace === 'string' ? namespace.trim() : '';\n}\n\n/** GetDynamicTools: compact catalog discovery row (no tool output in the UI). */\nexport function GetDynamicToolsTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'GetDynamicTools') {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const namespace = namespaceFromInput(part.input);\n const subject = namespace ? `${ namespace } tools` : 'tools';\n\n return (\n <ToolShell data-slot=\"get-dynamic-tools-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n title={ `Listed ${ subject }` }\n titleInProgress={ `Listing ${ subject }` }\n icon={ <Mcp aria-hidden /> }\n />\n </ToolShell>\n );\n}\n"],"names":["namespaceFromInput","input","namespace","GetDynamicToolsTool","part","isToolUIPart","getToolName","failure","getToolFailureRowState","subject","ToolShell","ToolShellHeader","Mcp"],"mappings":";;;;;AAKA,SAASA,EAAmBC,GAAO;AACjC,MAAIA,KAAS,QAAQ,OAAOA,KAAU;AACpC,WAAO;AAET,QAAMC,IAAYD,EAAM;AACxB,SAAO,OAAOC,KAAc,WAAWA,EAAU,SAAS;AAC5D;AAGO,SAASC,EAAoB;AAAA,EAClC,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAUC,EAAuBJ,CAAI,GACrCF,IAAYF,EAAmBI,EAAK,KAAK,GACzCK,IAAUP,IAAY,GAAGA,CAAS,WAAW;AACnD,2BAAyBQ,GAAW;AAAA,IAClC,aAAa;AAAA,IACb,4BAA4BC,GAAiB;AAAA,MAC3C,OAAOP,EAAK;AAAA,MACZ,cAAcG,EAAQ;AAAA,MACtB,OAAO,UAAUE,CAAO;AAAA,MACxB,iBAAiB,WAAWA,CAAO;AAAA,MACnC,wBAAwBG,GAAK;AAAA,QAC3B,eAAe;AAAA,MAAA,CAChB;AAAA,IAAA,CACF;AAAA,EAAA,CACF;AACH;"}
1
+ {"version":3,"file":"GetDynamicToolsTool.js","sources":["../../../../src/chat/Tool/mcp-tools/GetDynamicToolsTool.tsx"],"sourcesContent":["import { Mcp } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { getToolFailureRowState } from '../helpers';\nimport { ToolShell, ToolShellHeader } from '../shell';\n\nimport type { GetDynamicToolsToolInput } from '@reforma/types';\nimport type { ToolRendererProps } from '../types';\n\nfunction namespaceFromInput(input: unknown): string {\n if (input == null || typeof input !== 'object') {\n return '';\n }\n\n const namespace = (input as GetDynamicToolsToolInput).namespace;\n\n return typeof namespace === 'string' ? namespace.trim() : '';\n}\n\n/** GetDynamicTools: compact catalog discovery row (no tool output in the UI). */\nexport function GetDynamicToolsTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'GetDynamicTools') {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const namespace = namespaceFromInput(part.input);\n const subject = namespace ? `${ namespace } tools` : 'tools';\n\n return (\n <ToolShell data-slot=\"get-dynamic-tools-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n title={ `Listed ${ subject }` }\n titleInProgress={ `Listing ${ subject }` }\n icon={ <Mcp aria-hidden /> }\n />\n </ToolShell>\n );\n}\n"],"names":["namespaceFromInput","input","namespace","GetDynamicToolsTool","part","isToolUIPart","getToolName","failure","getToolFailureRowState","subject","ToolShell","ToolShellHeader","Mcp"],"mappings":";;;;;AAKA,SAASA,EAAmBC,GAAO;AACjC,MAAIA,KAAS,QAAQ,OAAOA,KAAU;AACpC,WAAO;AAET,QAAMC,IAAYD,EAAM;AACxB,SAAO,OAAOC,KAAc,WAAWA,EAAU,SAAS;AAC5D;AAGO,SAASC,EAAoB;AAAA,EAClC,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAUC,EAAuBJ,CAAI,GACrCF,IAAYF,EAAmBI,EAAK,KAAK,GACzCK,IAAUP,IAAY,GAAGA,CAAS,WAAW;AACnD,2BAAyBQ,GAAW;AAAA,IAClC,aAAa;AAAA,IACb,4BAA4BC,GAAiB;AAAA,MAC3C,OAAOP,EAAK;AAAA,MACZ,cAAcG,EAAQ;AAAA,MACtB,OAAO,UAAUE,CAAO;AAAA,MACxB,iBAAiB,WAAWA,CAAO;AAAA,MACnC,wBAAwBG,GAAK;AAAA,QAC3B,eAAe;AAAA,MAAA,CAChB;AAAA,IAAA,CACF;AAAA,EAAA,CACF;AACH;"}
@@ -1,5 +1,5 @@
1
1
  import { Book as c, Mcp as u } from "@reforma/icons/14";
2
- import { isToolUIPart as a, getToolName as n } from "ai";
2
+ import { isToolUIPart as a, getToolName as n } from "@reforma/types";
3
3
  import { Show as m } from "../../../Show/Show.js";
4
4
  import { Text as d } from "../../../Text/Text.js";
5
5
  import { getToolFailureRowState as p } from "../helpers.js";
@@ -1 +1 @@
1
- {"version":3,"file":"GetMcpResourcesTool.js","sources":["../../../../src/chat/Tool/mcp-tools/GetMcpResourcesTool.tsx"],"sourcesContent":["import { Book, Mcp } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState } from '../helpers';\nimport {\n ToolShell,\n ToolShellFooter,\n ToolShellHeader,\n ToolSummaryBadges,\n} from '../shell';\nimport {\n mcpResourceBadgeLabel,\n mcpResourceErrorFromOutput,\n parseGetMcpResourcesInput,\n} from './parseGetMcpResources';\n\nimport type { ToolRendererProps } from '../types';\n\n/** GetMcpResources: list row or Skill-like read row. Body stays out of the UI. */\nexport function GetMcpResourcesTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'GetMcpResources') {\n return null;\n }\n\n const { isRead } = parseGetMcpResourcesInput(part.input);\n const failure = getToolFailureRowState(part);\n const done = part.state === 'output-available';\n const logicalError = done ? mcpResourceErrorFromOutput(part.output) : undefined;\n const badge = mcpResourceBadgeLabel(part.input, done ? part.output : undefined);\n\n return (\n <ToolShell data-slot=\"get-mcp-resources-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n title={ isRead ? 'Read resource' : 'Listed MCP resources' }\n titleInProgress={ isRead ? 'Reading resource' : 'Listing MCP resources' }\n icon={ isRead ? <Book aria-hidden /> : <Mcp aria-hidden /> }\n >\n <ToolSummaryBadges\n labels={ badge ? [badge] : [] }\n aria-label={ isRead ? 'Resource' : 'MCP server' }\n />\n </ToolShellHeader>\n\n <Show when={ logicalError ?? failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{logicalError ?? failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["GetMcpResourcesTool","part","isToolUIPart","getToolName","isRead","parseGetMcpResourcesInput","failure","getToolFailureRowState","done","logicalError","mcpResourceErrorFromOutput","badge","mcpResourceBadgeLabel","ToolShell","_jsx","ToolShellHeader","Book","Mcp","ToolSummaryBadges","Show","ToolShellFooter","Text"],"mappings":";;;;;;;;;AASO,SAASA,EAAoB;AAAA,EAClC,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAM;AAAA,IACJ,QAAAG;AAAA,EAAA,IACEC,EAA0BJ,EAAK,KAAK,GAClCK,IAAUC,EAAuBN,CAAI,GACrCO,IAAOP,EAAK,UAAU,oBACtBQ,IAAeD,IAAOE,EAA2BT,EAAK,MAAM,IAAI,QAChEU,IAAQC,EAAsBX,EAAK,OAAOO,IAAOP,EAAK,SAAS,MAAS;AAC9E,2BAA0BY,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAOd,EAAK;AAAA,MACZ,cAAcK,EAAQ;AAAA,MACtB,OAAOF,IAAS,kBAAkB;AAAA,MAClC,iBAAiBA,IAAS,qBAAqB;AAAA,MAC/C,MAAMA,IAAsBU,gBAAAA,EAAKE,GAAM;AAAA,QACrC,eAAe;AAAA,MAAA,CAChB,IAAiBF,gBAAAA,EAAKG,GAAK;AAAA,QAC1B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,4BAA4BC,GAAmB;AAAA,QAC7C,QAAQP,IAAQ,CAACA,CAAK,IAAI,CAAA;AAAA,QAC1B,cAAcP,IAAS,aAAa;AAAA,MAAA,CACrC;AAAA,IAAA,CACF,GAAgBU,gBAAAA,EAAKK,GAAM;AAAA,MAC1B,MAAMV,KAAgBH,EAAQ;AAAA,MAC9B,4BAA4Bc,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUZ,KAAgBH,EAAQ;AAAA,QAAA,CACnC;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
1
+ {"version":3,"file":"GetMcpResourcesTool.js","sources":["../../../../src/chat/Tool/mcp-tools/GetMcpResourcesTool.tsx"],"sourcesContent":["import { Book, Mcp } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState } from '../helpers';\nimport {\n ToolShell,\n ToolShellFooter,\n ToolShellHeader,\n ToolSummaryBadges,\n} from '../shell';\nimport {\n mcpResourceBadgeLabel,\n mcpResourceErrorFromOutput,\n parseGetMcpResourcesInput,\n} from './parseGetMcpResources';\n\nimport type { ToolRendererProps } from '../types';\n\n/** GetMcpResources: list row or Skill-like read row. Body stays out of the UI. */\nexport function GetMcpResourcesTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'GetMcpResources') {\n return null;\n }\n\n const { isRead } = parseGetMcpResourcesInput(part.input);\n const failure = getToolFailureRowState(part);\n const done = part.state === 'output-available';\n const logicalError = done ? mcpResourceErrorFromOutput(part.output) : undefined;\n const badge = mcpResourceBadgeLabel(part.input, done ? part.output : undefined);\n\n return (\n <ToolShell data-slot=\"get-mcp-resources-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n title={ isRead ? 'Read resource' : 'Listed MCP resources' }\n titleInProgress={ isRead ? 'Reading resource' : 'Listing MCP resources' }\n icon={ isRead ? <Book aria-hidden /> : <Mcp aria-hidden /> }\n >\n <ToolSummaryBadges\n labels={ badge ? [badge] : [] }\n aria-label={ isRead ? 'Resource' : 'MCP server' }\n />\n </ToolShellHeader>\n\n <Show when={ logicalError ?? failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{logicalError ?? failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["GetMcpResourcesTool","part","isToolUIPart","getToolName","isRead","parseGetMcpResourcesInput","failure","getToolFailureRowState","done","logicalError","mcpResourceErrorFromOutput","badge","mcpResourceBadgeLabel","ToolShell","_jsx","ToolShellHeader","Book","Mcp","ToolSummaryBadges","Show","ToolShellFooter","Text"],"mappings":";;;;;;;;;AASO,SAASA,EAAoB;AAAA,EAClC,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAM;AAAA,IACJ,QAAAG;AAAA,EAAA,IACEC,EAA0BJ,EAAK,KAAK,GAClCK,IAAUC,EAAuBN,CAAI,GACrCO,IAAOP,EAAK,UAAU,oBACtBQ,IAAeD,IAAOE,EAA2BT,EAAK,MAAM,IAAI,QAChEU,IAAQC,EAAsBX,EAAK,OAAOO,IAAOP,EAAK,SAAS,MAAS;AAC9E,2BAA0BY,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAOd,EAAK;AAAA,MACZ,cAAcK,EAAQ;AAAA,MACtB,OAAOF,IAAS,kBAAkB;AAAA,MAClC,iBAAiBA,IAAS,qBAAqB;AAAA,MAC/C,MAAMA,IAAsBU,gBAAAA,EAAKE,GAAM;AAAA,QACrC,eAAe;AAAA,MAAA,CAChB,IAAiBF,gBAAAA,EAAKG,GAAK;AAAA,QAC1B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,4BAA4BC,GAAmB;AAAA,QAC7C,QAAQP,IAAQ,CAACA,CAAK,IAAI,CAAA;AAAA,QAC1B,cAAcP,IAAS,aAAa;AAAA,MAAA,CACrC;AAAA,IAAA,CACF,GAAgBU,gBAAAA,EAAKK,GAAM;AAAA,MAC1B,MAAMV,KAAgBH,EAAQ;AAAA,MAC9B,4BAA4Bc,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUZ,KAAgBH,EAAQ;AAAA,QAAA,CACnC;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
@@ -1,4 +1,4 @@
1
- import { isToolUIPart as p, getToolName as f } from "ai";
1
+ import { isToolUIPart as p, getToolName as f } from "@reforma/types";
2
2
  import { useState as u } from "react";
3
3
  import { useChat as c } from "../../ChatContext.js";
4
4
  import { IntegrationActionCard as v } from "../integration-card/IntegrationActionCard.js";
@@ -1 +1 @@
1
- {"version":3,"file":"McpAuth.js","sources":["../../../../src/chat/Tool/mcp-tools/McpAuth.tsx"],"sourcesContent":["import { getToolName, isToolUIPart } from 'ai';\nimport { useState } from 'react';\n\nimport { useChat } from '../../ChatContext';\nimport { IntegrationActionCard } from '../integration-card/IntegrationActionCard';\n\nimport type { ToolRendererProps } from '../types';\n\nfunction mcpAuthServer(input: unknown): string | undefined {\n if (!input || typeof input !== 'object') {\n return undefined;\n }\n\n const server = (input as { server?: unknown }).server;\n\n return typeof server === 'string' ? server.trim() || undefined : undefined;\n}\n\n/** McpAuth: Skip / Login plaque. Hidden after the user responds. */\nexport function McpAuth({ part, onToolApprovalResponse }: ToolRendererProps) {\n const { pluginsCatalog, onIntegrationLogin } = useChat();\n const [loggingIn, setLoggingIn] = useState(false);\n\n if (!isToolUIPart(part) || getToolName(part) !== 'McpAuth' || part.state !== 'approval-requested') {\n return null;\n }\n\n const server = mcpAuthServer(part.input);\n const row = server\n ? pluginsCatalog?.integrations.find(item => item.serverId === server || item.id === server)\n : undefined;\n const integrationId = row?.id ?? server;\n const name = row?.name ?? server ?? 'MCP';\n const approvalId = part.approval?.id;\n\n return (\n <IntegrationActionCard\n data-slot=\"mcp-auth-tool\"\n name={ name }\n description=\"Login required\"\n logo={ row?.logo }\n brandColor={ row?.brandColor }\n brandColorDark={ row?.brandColorDark }\n primaryLabel=\"Login\"\n isPending={ loggingIn }\n isPrimaryDisabled={ !onIntegrationLogin || !integrationId || !approvalId }\n onSkip={ () => {\n if (!approvalId) {\n return;\n }\n\n onToolApprovalResponse?.({\n id: approvalId,\n approved: false,\n });\n } }\n onPrimary={ () => {\n if (!integrationId || !approvalId) {\n return;\n }\n\n setLoggingIn(true);\n void Promise.resolve(\n onIntegrationLogin?.({ integrationId, approvalId })\n ).finally(() => {\n setLoggingIn(false);\n });\n } }\n />\n );\n}\n"],"names":["mcpAuthServer","input","server","McpAuth","part","onToolApprovalResponse","pluginsCatalog","onIntegrationLogin","useChat","loggingIn","setLoggingIn","useState","isToolUIPart","getToolName","row","item","integrationId","name","approvalId","IntegrationActionCard"],"mappings":";;;;;AAKA,SAASA,EAAcC,GAAO;AAC5B,MAAI,CAACA,KAAS,OAAOA,KAAU;AAC7B;AAEF,QAAMC,IAASD,EAAM;AACrB,SAAO,OAAOC,KAAW,YAAWA,EAAO,KAAA,KAAU;AACvD;AAGO,SAASC,EAAQ;AAAA,EACtB,MAAAC;AAAA,EACA,wBAAAC;AACF,GAAG;AACD,QAAM;AAAA,IACJ,gBAAAC;AAAA,IACA,oBAAAC;AAAA,EAAA,IACEC,EAAA,GACE,CAACC,GAAWC,CAAY,IAAIC,EAAS,EAAK;AAChD,MAAI,CAACC,EAAaR,CAAI,KAAKS,EAAYT,CAAI,MAAM,aAAaA,EAAK,UAAU;AAC3E,WAAO;AAET,QAAMF,IAASF,EAAcI,EAAK,KAAK,GACjCU,IAAMZ,IAASI,GAAgB,aAAa,KAAK,CAAAS,MAAQA,EAAK,aAAab,KAAUa,EAAK,OAAOb,CAAM,IAAI,QAC3Gc,IAAgBF,GAAK,MAAMZ,GAC3Be,IAAOH,GAAK,QAAQZ,KAAU,OAC9BgB,IAAad,EAAK,UAAU;AAClC,2BAAyBe,GAAuB;AAAA,IAC9C,aAAa;AAAA,IACb,MAAAF;AAAA,IACA,aAAa;AAAA,IACb,MAAMH,GAAK;AAAA,IACX,YAAYA,GAAK;AAAA,IACjB,gBAAgBA,GAAK;AAAA,IACrB,cAAc;AAAA,IACd,WAAWL;AAAA,IACX,mBAAmB,CAACF,KAAsB,CAACS,KAAiB,CAACE;AAAA,IAC7D,QAAQ,MAAM;AACZ,MAAKA,KAGLb,IAAyB;AAAA,QACvB,IAAIa;AAAA,QACJ,UAAU;AAAA,MAAA,CACX;AAAA,IACH;AAAA,IACA,WAAW,MAAM;AACf,MAAI,CAACF,KAAiB,CAACE,MAGvBR,EAAa,EAAI,GACZ,QAAQ,QAAQH,IAAqB;AAAA,QACxC,eAAAS;AAAA,QACA,YAAAE;AAAA,MAAA,CACD,CAAC,EAAE,QAAQ,MAAM;AAChB,QAAAR,EAAa,EAAK;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EAAA,CACD;AACH;"}
1
+ {"version":3,"file":"McpAuth.js","sources":["../../../../src/chat/Tool/mcp-tools/McpAuth.tsx"],"sourcesContent":["import { getToolName, isToolUIPart } from '@reforma/types';\nimport { useState } from 'react';\n\nimport { useChat } from '../../ChatContext';\nimport { IntegrationActionCard } from '../integration-card/IntegrationActionCard';\n\nimport type { ToolRendererProps } from '../types';\n\nfunction mcpAuthServer(input: unknown): string | undefined {\n if (!input || typeof input !== 'object') {\n return undefined;\n }\n\n const server = (input as { server?: unknown }).server;\n\n return typeof server === 'string' ? server.trim() || undefined : undefined;\n}\n\n/** McpAuth: Skip / Login plaque. Hidden after the user responds. */\nexport function McpAuth({ part, onToolApprovalResponse }: ToolRendererProps) {\n const { pluginsCatalog, onIntegrationLogin } = useChat();\n const [loggingIn, setLoggingIn] = useState(false);\n\n if (!isToolUIPart(part) || getToolName(part) !== 'McpAuth' || part.state !== 'approval-requested') {\n return null;\n }\n\n const server = mcpAuthServer(part.input);\n const row = server\n ? pluginsCatalog?.integrations.find(item => item.serverId === server || item.id === server)\n : undefined;\n const integrationId = row?.id ?? server;\n const name = row?.name ?? server ?? 'MCP';\n const approvalId = part.approval?.id;\n\n return (\n <IntegrationActionCard\n data-slot=\"mcp-auth-tool\"\n name={ name }\n description=\"Login required\"\n logo={ row?.logo }\n brandColor={ row?.brandColor }\n brandColorDark={ row?.brandColorDark }\n primaryLabel=\"Login\"\n isPending={ loggingIn }\n isPrimaryDisabled={ !onIntegrationLogin || !integrationId || !approvalId }\n onSkip={ () => {\n if (!approvalId) {\n return;\n }\n\n onToolApprovalResponse?.({\n id: approvalId,\n approved: false,\n });\n } }\n onPrimary={ () => {\n if (!integrationId || !approvalId) {\n return;\n }\n\n setLoggingIn(true);\n void Promise.resolve(\n onIntegrationLogin?.({ integrationId, approvalId })\n ).finally(() => {\n setLoggingIn(false);\n });\n } }\n />\n );\n}\n"],"names":["mcpAuthServer","input","server","McpAuth","part","onToolApprovalResponse","pluginsCatalog","onIntegrationLogin","useChat","loggingIn","setLoggingIn","useState","isToolUIPart","getToolName","row","item","integrationId","name","approvalId","IntegrationActionCard"],"mappings":";;;;;AAKA,SAASA,EAAcC,GAAO;AAC5B,MAAI,CAACA,KAAS,OAAOA,KAAU;AAC7B;AAEF,QAAMC,IAASD,EAAM;AACrB,SAAO,OAAOC,KAAW,YAAWA,EAAO,KAAA,KAAU;AACvD;AAGO,SAASC,EAAQ;AAAA,EACtB,MAAAC;AAAA,EACA,wBAAAC;AACF,GAAG;AACD,QAAM;AAAA,IACJ,gBAAAC;AAAA,IACA,oBAAAC;AAAA,EAAA,IACEC,EAAA,GACE,CAACC,GAAWC,CAAY,IAAIC,EAAS,EAAK;AAChD,MAAI,CAACC,EAAaR,CAAI,KAAKS,EAAYT,CAAI,MAAM,aAAaA,EAAK,UAAU;AAC3E,WAAO;AAET,QAAMF,IAASF,EAAcI,EAAK,KAAK,GACjCU,IAAMZ,IAASI,GAAgB,aAAa,KAAK,CAAAS,MAAQA,EAAK,aAAab,KAAUa,EAAK,OAAOb,CAAM,IAAI,QAC3Gc,IAAgBF,GAAK,MAAMZ,GAC3Be,IAAOH,GAAK,QAAQZ,KAAU,OAC9BgB,IAAad,EAAK,UAAU;AAClC,2BAAyBe,GAAuB;AAAA,IAC9C,aAAa;AAAA,IACb,MAAAF;AAAA,IACA,aAAa;AAAA,IACb,MAAMH,GAAK;AAAA,IACX,YAAYA,GAAK;AAAA,IACjB,gBAAgBA,GAAK;AAAA,IACrB,cAAc;AAAA,IACd,WAAWL;AAAA,IACX,mBAAmB,CAACF,KAAsB,CAACS,KAAiB,CAACE;AAAA,IAC7D,QAAQ,MAAM;AACZ,MAAKA,KAGLb,IAAyB;AAAA,QACvB,IAAIa;AAAA,QACJ,UAAU;AAAA,MAAA,CACX;AAAA,IACH;AAAA,IACA,WAAW,MAAM;AACf,MAAI,CAACF,KAAiB,CAACE,MAGvBR,EAAa,EAAI,GACZ,QAAQ,QAAQH,IAAqB;AAAA,QACxC,eAAAS;AAAA,QACA,YAAAE;AAAA,MAAA,CACD,CAAC,EAAE,QAAQ,MAAM;AAChB,QAAAR,EAAa,EAAK;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EAAA,CACD;AACH;"}
@@ -1,5 +1,5 @@
1
1
  import { MemoryCard as a } from "@reforma/icons/14";
2
- import { isToolUIPart as c, getToolName as d } from "ai";
2
+ import { isToolUIPart as c, getToolName as d } from "@reforma/types";
3
3
  import { Show as n } from "../../../Show/Show.js";
4
4
  import { Text as f } from "../../../Text/Text.js";
5
5
  import { MessageText as u } from "../../Message/streamdown/MessageText.js";
@@ -1 +1 @@
1
- {"version":3,"file":"MemoryTool.js","sources":["../../../../src/chat/Tool/memory/MemoryTool.tsx"],"sourcesContent":["import { MemoryCard } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { MessageText } from '../../Message/streamdown/MessageText';\nimport { getToolFailureRowState } from '../helpers';\nimport {\n ToolShell,\n ToolShellContent,\n ToolShellFooter,\n ToolShellHeader,\n} from '../shell';\n\nimport type { ToolRendererProps } from '../types';\n\nfunction field(input: unknown, key: string): string | undefined {\n if (input == null || typeof input !== 'object') {\n return undefined;\n }\n\n const value = (input as Record<string, unknown>)[key];\n\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\n/** Remember / Forget. Header like reasoning; body is only the fact text. */\nexport function MemoryTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part)) {\n return null;\n }\n\n const name = getToolName(part);\n const isRemember = name === 'Remember';\n const isForget = name === 'Forget';\n\n if (!isRemember && !isForget) {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const detail = isRemember ? field(part.input, 'fact') : field(part.input, 'text');\n\n return (\n <ToolShell collapsible={ Boolean(detail) } data-slot=\"memory-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n title=\"Memory updated\"\n icon={ <MemoryCard aria-hidden /> }\n />\n\n <Show when={ detail }>\n { fact => (\n <ToolShellContent>\n <MessageText className=\"color-secondary-muted-text\" mode=\"static\">\n {fact}\n </MessageText>\n </ToolShellContent>\n ) }\n </Show>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["field","input","key","value","MemoryTool","part","isToolUIPart","name","getToolName","isRemember","failure","getToolFailureRowState","detail","ToolShell","_jsx","ToolShellHeader","MemoryCard","Show","fact","ToolShellContent","MessageText","ToolShellFooter","Text"],"mappings":";;;;;;;;AAQA,SAASA,EAAMC,GAAOC,GAAK;AACzB,MAAID,KAAS,QAAQ,OAAOA,KAAU;AACpC;AAEF,QAAME,IAAQF,EAAMC,CAAG;AACvB,SAAO,OAAOC,KAAU,YAAYA,EAAM,SAASA,EAAM,SAAS;AACpE;AAGO,SAASC,EAAW;AAAA,EACzB,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI;AACpB,WAAO;AAET,QAAME,IAAOC,EAAYH,CAAI,GACvBI,IAAaF,MAAS;AAE5B,MAAI,CAACE,KAAc,EADFF,MAAS;AAExB,WAAO;AAET,QAAMG,IAAUC,EAAuBN,CAAI,GACrCO,IAASH,IAAaT,EAAMK,EAAK,OAAO,MAAM,IAAIL,EAAMK,EAAK,OAAO,MAAM;AAChF,2BAA0BQ,GAAW;AAAA,IACnC,aAAa,EAAQD;AAAA,IACrB,aAAa;AAAA,IACb,UAAU,CAAcE,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAOV,EAAK;AAAA,MACZ,cAAcK,EAAQ;AAAA,MACtB,OAAO;AAAA,MACP,wBAAwBM,GAAY;AAAA,QAClC,eAAe;AAAA,MAAA,CAChB;AAAA,IAAA,CACF,GAAgBF,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAML;AAAA,MACN,UAAU,CAAAM,MAAqBJ,gBAAAA,EAAKK,GAAkB;AAAA,QACpD,4BAA4BC,GAAa;AAAA,UACvC,WAAW;AAAA,UACX,MAAM;AAAA,UACN,UAAUF;AAAA,QAAA,CACX;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBJ,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMP,EAAQ;AAAA,MACd,4BAA4BW,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUZ,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
1
+ {"version":3,"file":"MemoryTool.js","sources":["../../../../src/chat/Tool/memory/MemoryTool.tsx"],"sourcesContent":["import { MemoryCard } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { MessageText } from '../../Message/streamdown/MessageText';\nimport { getToolFailureRowState } from '../helpers';\nimport {\n ToolShell,\n ToolShellContent,\n ToolShellFooter,\n ToolShellHeader,\n} from '../shell';\n\nimport type { ToolRendererProps } from '../types';\n\nfunction field(input: unknown, key: string): string | undefined {\n if (input == null || typeof input !== 'object') {\n return undefined;\n }\n\n const value = (input as Record<string, unknown>)[key];\n\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\n/** Remember / Forget. Header like reasoning; body is only the fact text. */\nexport function MemoryTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part)) {\n return null;\n }\n\n const name = getToolName(part);\n const isRemember = name === 'Remember';\n const isForget = name === 'Forget';\n\n if (!isRemember && !isForget) {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const detail = isRemember ? field(part.input, 'fact') : field(part.input, 'text');\n\n return (\n <ToolShell collapsible={ Boolean(detail) } data-slot=\"memory-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n title=\"Memory updated\"\n icon={ <MemoryCard aria-hidden /> }\n />\n\n <Show when={ detail }>\n { fact => (\n <ToolShellContent>\n <MessageText className=\"color-secondary-muted-text\" mode=\"static\">\n {fact}\n </MessageText>\n </ToolShellContent>\n ) }\n </Show>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["field","input","key","value","MemoryTool","part","isToolUIPart","name","getToolName","isRemember","failure","getToolFailureRowState","detail","ToolShell","_jsx","ToolShellHeader","MemoryCard","Show","fact","ToolShellContent","MessageText","ToolShellFooter","Text"],"mappings":";;;;;;;;AAQA,SAASA,EAAMC,GAAOC,GAAK;AACzB,MAAID,KAAS,QAAQ,OAAOA,KAAU;AACpC;AAEF,QAAME,IAAQF,EAAMC,CAAG;AACvB,SAAO,OAAOC,KAAU,YAAYA,EAAM,SAASA,EAAM,SAAS;AACpE;AAGO,SAASC,EAAW;AAAA,EACzB,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI;AACpB,WAAO;AAET,QAAME,IAAOC,EAAYH,CAAI,GACvBI,IAAaF,MAAS;AAE5B,MAAI,CAACE,KAAc,EADFF,MAAS;AAExB,WAAO;AAET,QAAMG,IAAUC,EAAuBN,CAAI,GACrCO,IAASH,IAAaT,EAAMK,EAAK,OAAO,MAAM,IAAIL,EAAMK,EAAK,OAAO,MAAM;AAChF,2BAA0BQ,GAAW;AAAA,IACnC,aAAa,EAAQD;AAAA,IACrB,aAAa;AAAA,IACb,UAAU,CAAcE,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAOV,EAAK;AAAA,MACZ,cAAcK,EAAQ;AAAA,MACtB,OAAO;AAAA,MACP,wBAAwBM,GAAY;AAAA,QAClC,eAAe;AAAA,MAAA,CAChB;AAAA,IAAA,CACF,GAAgBF,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAML;AAAA,MACN,UAAU,CAAAM,MAAqBJ,gBAAAA,EAAKK,GAAkB;AAAA,QACpD,4BAA4BC,GAAa;AAAA,UACvC,WAAW;AAAA,UACX,MAAM;AAAA,UACN,UAAUF;AAAA,QAAA,CACX;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBJ,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMP,EAAQ;AAAA,MACd,4BAA4BW,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUZ,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
@@ -1,5 +1,5 @@
1
1
  import { Nowrap as v } from "@reforma/icons/14";
2
- import { isToolUIPart as u, getToolName as T } from "ai";
2
+ import { isToolUIPart as u, getToolName as T } from "@reforma/types";
3
3
  import { Box as w } from "../../../Box/Box.js";
4
4
  import { Show as s } from "../../../Show/Show.js";
5
5
  import { Text as c } from "../../../Text/Text.js";
@@ -1 +1 @@
1
- {"version":3,"file":"MoveFileTool.js","sources":["../../../../src/chat/Tool/move-file/MoveFileTool.tsx"],"sourcesContent":["import { Nowrap } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { Box } from '../../../Box';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { Chip, chipItemFromPath } from '../../Chip';\nimport { getToolFailureRowState, isToolInvocationInProgress } from '../helpers';\nimport { ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\nimport { parseMoveFileInput } from './parseMoveFileInput';\n\nimport type { ToolRendererProps } from '../types';\n\n/** MoveFile: label + from → to path chips (one `Chip` per path for separate aria-labels). */\nexport function MoveFileTool({ part, onOpenPath }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'MoveFile') {\n return null;\n }\n\n const state = part.state;\n const inProgress = isToolInvocationInProgress(state);\n const failure = getToolFailureRowState(part);\n\n const { fromPath, toPath } = parseMoveFileInput(part.input);\n\n const fromChip = chipItemFromPath(fromPath);\n const toChip = chipItemFromPath(toPath);\n\n return (\n <ToolShell data-slot=\"move-file-tool\">\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title=\"Moved\"\n titleInProgress=\"Moving\"\n icon={ <Nowrap aria-hidden /> }\n >\n <Show when={ !inProgress }>\n { fromChip && toChip && (\n <Box direction=\"row\" gap=\"sm\" align=\"center\" wrap=\"wrap\">\n <Chip\n aria-label=\"Move from\"\n item={ fromChip }\n />\n\n <Text color=\"secondary\" whitespace=\"nowrap\" aria-hidden>\n →\n </Text>\n\n <Chip\n aria-label=\"Move to\"\n item={ toChip }\n onAction={ onOpenPath }\n />\n </Box>\n ) }\n\n { fromChip && !toChip && (\n <Chip\n aria-label=\"Move from\"\n item={ fromChip }\n />\n ) }\n\n { !fromChip && toChip && (\n <Chip\n aria-label=\"Move to\"\n item={ toChip }\n onAction={ onOpenPath }\n />\n )}\n </Show>\n </ToolShellHeader>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["MoveFileTool","part","onOpenPath","isToolUIPart","getToolName","state","inProgress","isToolInvocationInProgress","failure","getToolFailureRowState","fromPath","toPath","parseMoveFileInput","fromChip","chipItemFromPath","toChip","ToolShell","_jsx","ToolShellHeader","Nowrap","Show","Box","Chip","Text","ToolShellFooter"],"mappings":";;;;;;;;;;;AAWO,SAASA,EAAa;AAAA,EAC3B,MAAAC;AAAA,EACA,YAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaF,CAAI,KAAKG,EAAYH,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMI,IAAQJ,EAAK,OACbK,IAAaC,EAA2BF,CAAK,GAC7CG,IAAUC,EAAuBR,CAAI,GACrC;AAAA,IACJ,UAAAS;AAAA,IACA,QAAAC;AAAA,EAAA,IACEC,EAAmBX,EAAK,KAAK,GAC3BY,IAAWC,EAAiBJ,CAAQ,GACpCK,IAASD,EAAiBH,CAAM;AACtC,2BAA0BK,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAAb;AAAA,MACA,cAAcG,EAAQ;AAAA,MACtB,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,wBAAwBW,GAAQ;AAAA,QAC9B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,4BAA6BC,GAAM;AAAA,QACjC,MAAM,CAACd;AAAA,QACP,UAAU,CAACO,KAAYE,uBAA6BM,GAAK;AAAA,UACvD,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,UACP,MAAM;AAAA,UACN,UAAU,CAAcJ,gBAAAA,EAAKK,GAAM;AAAA,YACjC,cAAc;AAAA,YACd,MAAMT;AAAA,UAAA,CACP,GAAgBI,gBAAAA,EAAKM,GAAM;AAAA,YAC1B,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,eAAe;AAAA,YACf,UAAU;AAAA,UAAA,CACX,GAAgBN,gBAAAA,EAAKK,GAAM;AAAA,YAC1B,cAAc;AAAA,YACd,MAAMP;AAAA,YACN,UAAUb;AAAA,UAAA,CACX,CAAC;AAAA,QAAA,CACH,GAAGW,KAAY,CAACE,uBAA4BO,GAAM;AAAA,UACjD,cAAc;AAAA,UACd,MAAMT;AAAA,QAAA,CACP,GAAG,CAACA,KAAYE,uBAA4BO,GAAM;AAAA,UACjD,cAAc;AAAA,UACd,MAAMP;AAAA,UACN,UAAUb;AAAA,QAAA,CACX,CAAC;AAAA,MAAA,CACH;AAAA,IAAA,CACF,GAAgBe,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMZ,EAAQ;AAAA,MACd,4BAA4BgB,GAAiB;AAAA,QAC3C,4BAA4BD,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUf,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
1
+ {"version":3,"file":"MoveFileTool.js","sources":["../../../../src/chat/Tool/move-file/MoveFileTool.tsx"],"sourcesContent":["import { Nowrap } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { Box } from '../../../Box';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { Chip, chipItemFromPath } from '../../Chip';\nimport { getToolFailureRowState, isToolInvocationInProgress } from '../helpers';\nimport { ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\nimport { parseMoveFileInput } from './parseMoveFileInput';\n\nimport type { ToolRendererProps } from '../types';\n\n/** MoveFile: label + from → to path chips (one `Chip` per path for separate aria-labels). */\nexport function MoveFileTool({ part, onOpenPath }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'MoveFile') {\n return null;\n }\n\n const state = part.state;\n const inProgress = isToolInvocationInProgress(state);\n const failure = getToolFailureRowState(part);\n\n const { fromPath, toPath } = parseMoveFileInput(part.input);\n\n const fromChip = chipItemFromPath(fromPath);\n const toChip = chipItemFromPath(toPath);\n\n return (\n <ToolShell data-slot=\"move-file-tool\">\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title=\"Moved\"\n titleInProgress=\"Moving\"\n icon={ <Nowrap aria-hidden /> }\n >\n <Show when={ !inProgress }>\n { fromChip && toChip && (\n <Box direction=\"row\" gap=\"sm\" align=\"center\" wrap=\"wrap\">\n <Chip\n aria-label=\"Move from\"\n item={ fromChip }\n />\n\n <Text color=\"secondary\" whitespace=\"nowrap\" aria-hidden>\n →\n </Text>\n\n <Chip\n aria-label=\"Move to\"\n item={ toChip }\n onAction={ onOpenPath }\n />\n </Box>\n ) }\n\n { fromChip && !toChip && (\n <Chip\n aria-label=\"Move from\"\n item={ fromChip }\n />\n ) }\n\n { !fromChip && toChip && (\n <Chip\n aria-label=\"Move to\"\n item={ toChip }\n onAction={ onOpenPath }\n />\n )}\n </Show>\n </ToolShellHeader>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["MoveFileTool","part","onOpenPath","isToolUIPart","getToolName","state","inProgress","isToolInvocationInProgress","failure","getToolFailureRowState","fromPath","toPath","parseMoveFileInput","fromChip","chipItemFromPath","toChip","ToolShell","_jsx","ToolShellHeader","Nowrap","Show","Box","Chip","Text","ToolShellFooter"],"mappings":";;;;;;;;;;;AAWO,SAASA,EAAa;AAAA,EAC3B,MAAAC;AAAA,EACA,YAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaF,CAAI,KAAKG,EAAYH,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMI,IAAQJ,EAAK,OACbK,IAAaC,EAA2BF,CAAK,GAC7CG,IAAUC,EAAuBR,CAAI,GACrC;AAAA,IACJ,UAAAS;AAAA,IACA,QAAAC;AAAA,EAAA,IACEC,EAAmBX,EAAK,KAAK,GAC3BY,IAAWC,EAAiBJ,CAAQ,GACpCK,IAASD,EAAiBH,CAAM;AACtC,2BAA0BK,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAAb;AAAA,MACA,cAAcG,EAAQ;AAAA,MACtB,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,wBAAwBW,GAAQ;AAAA,QAC9B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,4BAA6BC,GAAM;AAAA,QACjC,MAAM,CAACd;AAAA,QACP,UAAU,CAACO,KAAYE,uBAA6BM,GAAK;AAAA,UACvD,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,UACP,MAAM;AAAA,UACN,UAAU,CAAcJ,gBAAAA,EAAKK,GAAM;AAAA,YACjC,cAAc;AAAA,YACd,MAAMT;AAAA,UAAA,CACP,GAAgBI,gBAAAA,EAAKM,GAAM;AAAA,YAC1B,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,eAAe;AAAA,YACf,UAAU;AAAA,UAAA,CACX,GAAgBN,gBAAAA,EAAKK,GAAM;AAAA,YAC1B,cAAc;AAAA,YACd,MAAMP;AAAA,YACN,UAAUb;AAAA,UAAA,CACX,CAAC;AAAA,QAAA,CACH,GAAGW,KAAY,CAACE,uBAA4BO,GAAM;AAAA,UACjD,cAAc;AAAA,UACd,MAAMT;AAAA,QAAA,CACP,GAAG,CAACA,KAAYE,uBAA4BO,GAAM;AAAA,UACjD,cAAc;AAAA,UACd,MAAMP;AAAA,UACN,UAAUb;AAAA,QAAA,CACX,CAAC;AAAA,MAAA,CACH;AAAA,IAAA,CACF,GAAgBe,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMZ,EAAQ;AAAA,MACd,4BAA4BgB,GAAiB;AAAA,QAC3C,4BAA4BD,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUf,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
@@ -1,5 +1,5 @@
1
1
  import { Plan as T, ArrowUpRight as y } from "@reforma/icons/14";
2
- import { isToolUIPart as B, getToolName as N } from "ai";
2
+ import { isToolUIPart as B, getToolName as N } from "@reforma/types";
3
3
  import { Button as w } from "../../../Button/Button.js";
4
4
  import { Show as i } from "../../../Show/Show.js";
5
5
  import { Text as g } from "../../../Text/Text.js";
@@ -1 +1 @@
1
- {"version":3,"file":"CreatePlanTool.js","sources":["../../../../src/chat/Tool/plan/CreatePlanTool.tsx"],"sourcesContent":["import { ArrowUpRight, Plan as PlanIcon } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { Button } from '../../../Button';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { useChat } from '../../ChatContext';\nimport { Chip } from '../../Chip';\nimport { getToolFailureRowState } from '../helpers';\nimport {\n ToolShell,\n ToolShellCard,\n ToolShellCardContent,\n ToolShellCardFooter,\n ToolShellCardHeader,\n ToolShellFooter,\n ToolShellHeader,\n} from '../shell';\nimport { useToolProgress } from '../shell/toolProgress';\nimport shellStyles from '../shell/ToolShellCard.module.css';\nimport styles from './CreatePlanTool.module.css';\n\nimport type {\n CreatePlanToolInput,\n CreatePlanToolOutput,\n ReadPlanToolOutput,\n} from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\nfunction fieldString(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n\n const trimmed = value.trim();\n\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction planCardTitle(name: string | undefined, failed: boolean, live: boolean): string {\n if (failed) {\n return 'Plan failed';\n }\n\n if (name) {\n return name;\n }\n\n return live ? 'Creating plan' : 'Created plan';\n}\n\nconst PLAN_TOOLS = new Set(['ReadPlan', 'CreatePlan']);\n\n/** ReadPlan is a compact row; CreatePlan is a card. Open opens the plan panel. */\nexport function CreatePlanTool({ part }: ToolRendererProps) {\n const { onOpenPlan, onBuildPlan } = useChat();\n const failure = getToolFailureRowState(part);\n const { live } = useToolProgress(part.state);\n\n if (!isToolUIPart(part)) {\n return null;\n }\n\n const toolName = getToolName(part);\n\n if (!PLAN_TOOLS.has(toolName)) {\n return null;\n }\n\n const input = part.input as CreatePlanToolInput | undefined;\n const output = part.state === 'output-available'\n ? part.output as CreatePlanToolOutput | ReadPlanToolOutput | undefined\n : undefined;\n const name = fieldString(output?.name)\n ?? fieldString((input && 'name' in input) ? input.name : undefined);\n const overview = fieldString((input && 'overview' in input) ? input.overview : undefined)\n ?? fieldString((output && 'overview' in output) ? output.overview : undefined);\n const failed = failure.useFailureLabel;\n const isInputStreaming = part.state === 'input-streaming';\n\n if (toolName === 'ReadPlan') {\n return (\n <ToolShell data-slot=\"read-plan-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n title=\"Read plan\"\n titleInProgress=\"Reading plan\"\n icon={ <PlanIcon aria-hidden /> }\n >\n <Show when={ name }>\n { planName => (\n <Chip\n aria-label={ planName }\n item={ { label: planName, icon: 'nav' } }\n onAction={ (onOpenPlan && !failed) ? () => onOpenPlan() : undefined }\n />\n ) }\n </Show>\n </ToolShellHeader>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n }\n\n const canOpen = Boolean(onOpenPlan && !failed && !isInputStreaming);\n const canBuild = Boolean(onBuildPlan && !failed && !isInputStreaming);\n const errorText = failure.problemText;\n const bodyText = failed ? errorText : overview;\n\n return (\n <ToolShellCard\n collapsible={ false }\n className={ shellStyles.tool }\n data-slot=\"create-plan-tool\"\n >\n <ToolShellCardHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n title={ planCardTitle(name, failed, live) }\n icon={ <PlanIcon aria-hidden /> }\n />\n\n <Show when={ !isInputStreaming && bodyText }>\n { text => (\n <ToolShellCardContent className={ styles.content }>\n <Text\n color={ failed ? 'danger' : 'secondary' }\n variant=\"sm\"\n wrap=\"anywhere\"\n >\n {text}\n </Text>\n </ToolShellCardContent>\n ) }\n </Show>\n\n <Show when={ canOpen || canBuild }>\n <ToolShellCardFooter className={ styles.footer }>\n <Show when={ canBuild }>\n <Button\n size=\"xs\"\n color=\"contrast\"\n onPress={ () => onBuildPlan?.() }\n >\n Build\n </Button>\n </Show>\n\n <Show when={ canOpen }>\n <Button\n className=\"ml-auto\"\n size=\"xs\"\n variant=\"filling\"\n onPress={ () => onOpenPlan?.() }\n >\n <ArrowUpRight aria-hidden />\n Open\n </Button>\n </Show>\n </ToolShellCardFooter>\n </Show>\n </ToolShellCard>\n );\n}\n"],"names":["fieldString","value","trimmed","planCardTitle","name","failed","live","PLAN_TOOLS","CreatePlanTool","part","onOpenPlan","onBuildPlan","useChat","failure","getToolFailureRowState","useToolProgress","isToolUIPart","toolName","getToolName","input","output","overview","isInputStreaming","ToolShell","_jsx","ToolShellHeader","PlanIcon","Show","planName","Chip","ToolShellFooter","Text","canOpen","canBuild","errorText","bodyText","ToolShellCard","shellStyles","ToolShellCardHeader","text","ToolShellCardContent","styles","ToolShellCardFooter","Button","ArrowUpRight"],"mappings":"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"}
1
+ {"version":3,"file":"CreatePlanTool.js","sources":["../../../../src/chat/Tool/plan/CreatePlanTool.tsx"],"sourcesContent":["import { ArrowUpRight, Plan as PlanIcon } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { Button } from '../../../Button';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { useChat } from '../../ChatContext';\nimport { Chip } from '../../Chip';\nimport { getToolFailureRowState } from '../helpers';\nimport {\n ToolShell,\n ToolShellCard,\n ToolShellCardContent,\n ToolShellCardFooter,\n ToolShellCardHeader,\n ToolShellFooter,\n ToolShellHeader,\n} from '../shell';\nimport { useToolProgress } from '../shell/toolProgress';\nimport shellStyles from '../shell/ToolShellCard.module.css';\nimport styles from './CreatePlanTool.module.css';\n\nimport type {\n CreatePlanToolInput,\n CreatePlanToolOutput,\n ReadPlanToolOutput,\n} from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\nfunction fieldString(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n\n const trimmed = value.trim();\n\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction planCardTitle(name: string | undefined, failed: boolean, live: boolean): string {\n if (failed) {\n return 'Plan failed';\n }\n\n if (name) {\n return name;\n }\n\n return live ? 'Creating plan' : 'Created plan';\n}\n\nconst PLAN_TOOLS = new Set(['ReadPlan', 'CreatePlan']);\n\n/** ReadPlan is a compact row; CreatePlan is a card. Open opens the plan panel. */\nexport function CreatePlanTool({ part }: ToolRendererProps) {\n const { onOpenPlan, onBuildPlan } = useChat();\n const failure = getToolFailureRowState(part);\n const { live } = useToolProgress(part.state);\n\n if (!isToolUIPart(part)) {\n return null;\n }\n\n const toolName = getToolName(part);\n\n if (!PLAN_TOOLS.has(toolName)) {\n return null;\n }\n\n const input = part.input as CreatePlanToolInput | undefined;\n const output = part.state === 'output-available'\n ? part.output as CreatePlanToolOutput | ReadPlanToolOutput | undefined\n : undefined;\n const name = fieldString(output?.name)\n ?? fieldString((input && 'name' in input) ? input.name : undefined);\n const overview = fieldString((input && 'overview' in input) ? input.overview : undefined)\n ?? fieldString((output && 'overview' in output) ? output.overview : undefined);\n const failed = failure.useFailureLabel;\n const isInputStreaming = part.state === 'input-streaming';\n\n if (toolName === 'ReadPlan') {\n return (\n <ToolShell data-slot=\"read-plan-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n title=\"Read plan\"\n titleInProgress=\"Reading plan\"\n icon={ <PlanIcon aria-hidden /> }\n >\n <Show when={ name }>\n { planName => (\n <Chip\n aria-label={ planName }\n item={ { label: planName, icon: 'nav' } }\n onAction={ (onOpenPlan && !failed) ? () => onOpenPlan() : undefined }\n />\n ) }\n </Show>\n </ToolShellHeader>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n }\n\n const canOpen = Boolean(onOpenPlan && !failed && !isInputStreaming);\n const canBuild = Boolean(onBuildPlan && !failed && !isInputStreaming);\n const errorText = failure.problemText;\n const bodyText = failed ? errorText : overview;\n\n return (\n <ToolShellCard\n collapsible={ false }\n className={ shellStyles.tool }\n data-slot=\"create-plan-tool\"\n >\n <ToolShellCardHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n title={ planCardTitle(name, failed, live) }\n icon={ <PlanIcon aria-hidden /> }\n />\n\n <Show when={ !isInputStreaming && bodyText }>\n { text => (\n <ToolShellCardContent className={ styles.content }>\n <Text\n color={ failed ? 'danger' : 'secondary' }\n variant=\"sm\"\n wrap=\"anywhere\"\n >\n {text}\n </Text>\n </ToolShellCardContent>\n ) }\n </Show>\n\n <Show when={ canOpen || canBuild }>\n <ToolShellCardFooter className={ styles.footer }>\n <Show when={ canBuild }>\n <Button\n size=\"xs\"\n color=\"contrast\"\n onPress={ () => onBuildPlan?.() }\n >\n Build\n </Button>\n </Show>\n\n <Show when={ canOpen }>\n <Button\n className=\"ml-auto\"\n size=\"xs\"\n variant=\"filling\"\n onPress={ () => onOpenPlan?.() }\n >\n <ArrowUpRight aria-hidden />\n Open\n </Button>\n </Show>\n </ToolShellCardFooter>\n </Show>\n </ToolShellCard>\n );\n}\n"],"names":["fieldString","value","trimmed","planCardTitle","name","failed","live","PLAN_TOOLS","CreatePlanTool","part","onOpenPlan","onBuildPlan","useChat","failure","getToolFailureRowState","useToolProgress","isToolUIPart","toolName","getToolName","input","output","overview","isInputStreaming","ToolShell","_jsx","ToolShellHeader","PlanIcon","Show","planName","Chip","ToolShellFooter","Text","canOpen","canBuild","errorText","bodyText","ToolShellCard","shellStyles","ToolShellCardHeader","text","ToolShellCardContent","styles","ToolShellCardFooter","Button","ArrowUpRight"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { isToolUIPart as o, getToolName as i } from "ai";
1
+ import { isToolUIPart as o, getToolName as i } from "@reforma/types";
2
2
  import { MessageText as r } from "../../Message/streamdown/MessageText.js";
3
3
  import { jsx as m } from "react/jsx-runtime";
4
4
  function u({
@@ -1 +1 @@
1
- {"version":3,"file":"PreambleTool.js","sources":["../../../../src/chat/Tool/preamble/PreambleTool.tsx"],"sourcesContent":["import { getToolName, isToolUIPart } from 'ai';\n\nimport { MessageText } from '../../Message/streamdown/MessageText';\n\nimport type { PreambleToolInput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\n/** User-facing status note — renders like assistant prose (markdown), not a tool shell. */\nexport function PreambleTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'Preamble') {\n return null;\n }\n\n const content = (part.input as PreambleToolInput | undefined)?.content?.trim();\n\n if (!content) {\n return null;\n }\n\n const streaming = part.state === 'input-streaming' || part.state === 'input-available';\n\n return (\n <MessageText\n mode={ streaming ? 'streaming' : 'static' }\n >\n {content}\n </MessageText>\n );\n}\n"],"names":["PreambleTool","part","isToolUIPart","getToolName","content","streaming","MessageText"],"mappings":";;;AAIO,SAASA,EAAa;AAAA,EAC3B,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAUH,EAAK,OAAO,SAAS,KAAA;AACrC,MAAI,CAACG;AACH,WAAO;AAET,QAAMC,IAAYJ,EAAK,UAAU,qBAAqBA,EAAK,UAAU;AACrE,2BAAyBK,GAAa;AAAA,IACpC,MAAMD,IAAY,cAAc;AAAA,IAChC,UAAUD;AAAA,EAAA,CACX;AACH;"}
1
+ {"version":3,"file":"PreambleTool.js","sources":["../../../../src/chat/Tool/preamble/PreambleTool.tsx"],"sourcesContent":["import { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { MessageText } from '../../Message/streamdown/MessageText';\n\nimport type { PreambleToolInput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\n/** User-facing status note — renders like assistant prose (markdown), not a tool shell. */\nexport function PreambleTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'Preamble') {\n return null;\n }\n\n const content = (part.input as PreambleToolInput | undefined)?.content?.trim();\n\n if (!content) {\n return null;\n }\n\n const streaming = part.state === 'input-streaming' || part.state === 'input-available';\n\n return (\n <MessageText\n mode={ streaming ? 'streaming' : 'static' }\n >\n {content}\n </MessageText>\n );\n}\n"],"names":["PreambleTool","part","isToolUIPart","getToolName","content","streaming","MessageText"],"mappings":";;;AAIO,SAASA,EAAa;AAAA,EAC3B,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAUH,EAAK,OAAO,SAAS,KAAA;AACrC,MAAI,CAACG;AACH,WAAO;AAET,QAAMC,IAAYJ,EAAK,UAAU,qBAAqBA,EAAK,UAAU;AACrE,2BAAyBK,GAAa;AAAA,IACpC,MAAMD,IAAY,cAAc;AAAA,IAChC,UAAUD;AAAA,EAAA,CACX;AACH;"}