@synergenius/flow-weaver-pack-weaver 0.9.199 → 0.9.201

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 (181) hide show
  1. package/dist/ai-chat-provider.js +5 -5
  2. package/dist/ai-chat-provider.js.map +1 -1
  3. package/dist/bot/acceptance-merge.d.ts +21 -0
  4. package/dist/bot/acceptance-merge.d.ts.map +1 -0
  5. package/dist/bot/acceptance-merge.js +46 -0
  6. package/dist/bot/acceptance-merge.js.map +1 -0
  7. package/dist/bot/ai-client.d.ts +14 -2
  8. package/dist/bot/ai-client.d.ts.map +1 -1
  9. package/dist/bot/ai-client.js +71 -24
  10. package/dist/bot/ai-client.js.map +1 -1
  11. package/dist/bot/assistant-tools.js +3 -3
  12. package/dist/bot/assistant-tools.js.map +1 -1
  13. package/dist/bot/audit-logger.d.ts.map +1 -1
  14. package/dist/bot/audit-logger.js +34 -14
  15. package/dist/bot/audit-logger.js.map +1 -1
  16. package/dist/bot/audit-trail.d.ts +67 -0
  17. package/dist/bot/audit-trail.d.ts.map +1 -0
  18. package/dist/bot/audit-trail.js +153 -0
  19. package/dist/bot/audit-trail.js.map +1 -0
  20. package/dist/bot/behavior-defaults.d.ts +1 -1
  21. package/dist/bot/behavior-defaults.d.ts.map +1 -1
  22. package/dist/bot/behavior-defaults.js +7 -3
  23. package/dist/bot/behavior-defaults.js.map +1 -1
  24. package/dist/bot/capability-registry.d.ts +9 -0
  25. package/dist/bot/capability-registry.d.ts.map +1 -1
  26. package/dist/bot/capability-registry.js +81 -27
  27. package/dist/bot/capability-registry.js.map +1 -1
  28. package/dist/bot/capability-types.d.ts +10 -0
  29. package/dist/bot/capability-types.d.ts.map +1 -1
  30. package/dist/bot/cli-provider.d.ts.map +1 -1
  31. package/dist/bot/cli-provider.js +8 -7
  32. package/dist/bot/cli-provider.js.map +1 -1
  33. package/dist/bot/preflight.d.ts +48 -0
  34. package/dist/bot/preflight.d.ts.map +1 -0
  35. package/dist/bot/preflight.js +247 -0
  36. package/dist/bot/preflight.js.map +1 -0
  37. package/dist/bot/provider-shim.d.ts +74 -0
  38. package/dist/bot/provider-shim.d.ts.map +1 -0
  39. package/dist/bot/provider-shim.js +176 -0
  40. package/dist/bot/provider-shim.js.map +1 -0
  41. package/dist/bot/runner.d.ts +2 -0
  42. package/dist/bot/runner.d.ts.map +1 -1
  43. package/dist/bot/runner.js +60 -17
  44. package/dist/bot/runner.js.map +1 -1
  45. package/dist/bot/step-executor.d.ts.map +1 -1
  46. package/dist/bot/step-executor.js +72 -115
  47. package/dist/bot/step-executor.js.map +1 -1
  48. package/dist/bot/swarm-controller.d.ts +2 -0
  49. package/dist/bot/swarm-controller.d.ts.map +1 -1
  50. package/dist/bot/swarm-controller.js +92 -20
  51. package/dist/bot/swarm-controller.js.map +1 -1
  52. package/dist/bot/task-create-handler.d.ts +37 -0
  53. package/dist/bot/task-create-handler.d.ts.map +1 -0
  54. package/dist/bot/task-create-handler.js +124 -0
  55. package/dist/bot/task-create-handler.js.map +1 -0
  56. package/dist/bot/task-store.d.ts +1 -0
  57. package/dist/bot/task-store.d.ts.map +1 -1
  58. package/dist/bot/task-store.js +67 -0
  59. package/dist/bot/task-store.js.map +1 -1
  60. package/dist/bot/types.d.ts +1 -1
  61. package/dist/bot/types.d.ts.map +1 -1
  62. package/dist/bot/weaver-tools.d.ts.map +1 -1
  63. package/dist/bot/weaver-tools.js +7 -39
  64. package/dist/bot/weaver-tools.js.map +1 -1
  65. package/dist/node-types/agent-execute.d.ts +25 -8
  66. package/dist/node-types/agent-execute.d.ts.map +1 -1
  67. package/dist/node-types/agent-execute.js +89 -23
  68. package/dist/node-types/agent-execute.js.map +1 -1
  69. package/dist/node-types/bot-report.d.ts.map +1 -1
  70. package/dist/node-types/bot-report.js +24 -3
  71. package/dist/node-types/bot-report.js.map +1 -1
  72. package/dist/node-types/plan-task.d.ts +8 -17
  73. package/dist/node-types/plan-task.d.ts.map +1 -1
  74. package/dist/node-types/plan-task.js +217 -256
  75. package/dist/node-types/plan-task.js.map +1 -1
  76. package/dist/node-types/review-result.js +8 -6
  77. package/dist/node-types/review-result.js.map +1 -1
  78. package/dist/palindrome.d.ts +9 -0
  79. package/dist/palindrome.d.ts.map +1 -0
  80. package/dist/palindrome.js +14 -0
  81. package/dist/palindrome.js.map +1 -0
  82. package/dist/ui/approval-card.js +91 -82
  83. package/dist/ui/bot-activity.js +73 -56
  84. package/dist/ui/bot-config.js +48 -31
  85. package/dist/ui/bot-dashboard.js +52 -36
  86. package/dist/ui/bot-panel.js +230 -228
  87. package/dist/ui/bot-slot-card.js +100 -90
  88. package/dist/ui/bot-status.js +37 -15
  89. package/dist/ui/budget-bar.js +57 -31
  90. package/dist/ui/capability-editor.js +447 -378
  91. package/dist/ui/chat-task-result.js +78 -71
  92. package/dist/ui/decision-log.js +68 -81
  93. package/dist/ui/genesis-block.js +86 -95
  94. package/dist/ui/instance-stream-view.js +722 -0
  95. package/dist/ui/profile-card.js +96 -221
  96. package/dist/ui/profile-editor.js +532 -575
  97. package/dist/ui/settings-section.js +41 -45
  98. package/dist/ui/swarm-controls.js +212 -135
  99. package/dist/ui/swarm-dashboard.js +3992 -2715
  100. package/dist/ui/task-detail-view.js +415 -521
  101. package/dist/ui/task-editor.js +339 -390
  102. package/dist/ui/task-pool-list.js +60 -55
  103. package/dist/workflows/src/palindrome.d.ts +11 -0
  104. package/dist/workflows/src/palindrome.d.ts.map +1 -0
  105. package/dist/workflows/src/palindrome.js +16 -0
  106. package/dist/workflows/src/palindrome.js.map +1 -0
  107. package/dist/workflows/tests/palindrome.test.d.ts +2 -0
  108. package/dist/workflows/tests/palindrome.test.d.ts.map +1 -0
  109. package/dist/workflows/tests/palindrome.test.js +41 -0
  110. package/dist/workflows/tests/palindrome.test.js.map +1 -0
  111. package/dist/workflows/weaver-bot-batch.js +1 -1
  112. package/dist/workflows/weaver-bot-batch.js.map +1 -1
  113. package/dist/workflows/weaver-bot.js +1 -1
  114. package/dist/workflows/weaver-bot.js.map +1 -1
  115. package/flowweaver.manifest.json +1 -1
  116. package/package.json +8 -2
  117. package/src/ai-chat-provider.ts +5 -5
  118. package/src/bot/acceptance-merge.ts +62 -0
  119. package/src/bot/ai-client.ts +77 -21
  120. package/src/bot/assistant-tools.ts +3 -3
  121. package/src/bot/audit-logger.ts +42 -14
  122. package/src/bot/audit-trail.ts +211 -0
  123. package/src/bot/behavior-defaults.ts +7 -2
  124. package/src/bot/capability-registry.ts +84 -28
  125. package/src/bot/capability-types.ts +11 -0
  126. package/src/bot/cli-provider.ts +8 -7
  127. package/src/bot/preflight.ts +285 -0
  128. package/src/bot/provider-shim.ts +218 -0
  129. package/src/bot/runner.ts +68 -20
  130. package/src/bot/step-executor.ts +69 -127
  131. package/src/bot/swarm-controller.ts +94 -20
  132. package/src/bot/task-create-handler.ts +164 -0
  133. package/src/bot/task-store.ts +83 -0
  134. package/src/bot/types.ts +4 -1
  135. package/src/bot/weaver-tools.ts +7 -45
  136. package/src/node-types/agent-execute.ts +102 -16
  137. package/src/node-types/bot-report.ts +24 -3
  138. package/src/node-types/plan-task.ts +238 -280
  139. package/src/node-types/review-result.ts +8 -6
  140. package/src/palindrome.ts +14 -0
  141. package/src/ui/approval-card.tsx +78 -62
  142. package/src/ui/bot-activity.tsx +12 -10
  143. package/src/ui/bot-config.tsx +12 -10
  144. package/src/ui/bot-dashboard.tsx +13 -11
  145. package/src/ui/bot-panel.tsx +189 -171
  146. package/src/ui/bot-slot-card.tsx +125 -70
  147. package/src/ui/bot-status.tsx +4 -4
  148. package/src/ui/budget-bar.tsx +86 -25
  149. package/src/ui/capability-editor.tsx +392 -257
  150. package/src/ui/chat-task-result.tsx +81 -78
  151. package/src/ui/decision-log.tsx +76 -73
  152. package/src/ui/genesis-block.tsx +91 -61
  153. package/src/ui/instance-stream-view.tsx +861 -0
  154. package/src/ui/profile-card.tsx +195 -168
  155. package/src/ui/profile-editor.tsx +453 -370
  156. package/src/ui/settings-section.tsx +46 -39
  157. package/src/ui/swarm-controls.tsx +252 -123
  158. package/src/ui/swarm-dashboard.tsx +999 -466
  159. package/src/ui/task-detail-view.tsx +485 -428
  160. package/src/ui/task-editor.tsx +329 -271
  161. package/src/ui/task-pool-list.tsx +68 -62
  162. package/src/workflows/src/palindrome.ts +16 -0
  163. package/src/workflows/tests/palindrome.test.ts +49 -0
  164. package/src/workflows/weaver-bot-batch.ts +1 -1
  165. package/src/workflows/weaver-bot.ts +1 -1
  166. package/dist/ui/bot-constants.d.ts +0 -14
  167. package/dist/ui/bot-constants.d.ts.map +0 -1
  168. package/dist/ui/bot-constants.js +0 -189
  169. package/dist/ui/bot-constants.js.map +0 -1
  170. package/dist/ui/steer-api.d.ts +0 -7
  171. package/dist/ui/steer-api.d.ts.map +0 -1
  172. package/dist/ui/steer-api.js +0 -11
  173. package/dist/ui/steer-api.js.map +0 -1
  174. package/dist/ui/trace-to-timeline.d.ts +0 -91
  175. package/dist/ui/trace-to-timeline.d.ts.map +0 -1
  176. package/dist/ui/trace-to-timeline.js +0 -116
  177. package/dist/ui/trace-to-timeline.js.map +0 -1
  178. package/dist/ui/use-stream-timeline.d.ts +0 -50
  179. package/dist/ui/use-stream-timeline.d.ts.map +0 -1
  180. package/dist/ui/use-stream-timeline.js +0 -245
  181. package/dist/ui/use-stream-timeline.js.map +0 -1
@@ -1,13 +1,11 @@
1
1
  /**
2
2
  * ProfileCard — displays a bot profile summary with capabilities, behavior
3
3
  * config (phases, tiers, escalation, scope), and collapsible instructions.
4
- *
5
- * Pattern: CommonJS require for platform deps, React.createElement throughout.
6
4
  */
7
- const React = require('react');
8
- const {
5
+ import React from 'react';
6
+ import {
9
7
  Flex, Typography, Icon, Chip, IconButton, Field, CollapsibleSection,
10
- } = require('@fw/plugin-ui-kit');
8
+ } from '@fw/plugin-ui-kit';
11
9
 
12
10
  // ---------------------------------------------------------------------------
13
11
  // Types
@@ -105,183 +103,212 @@ function ProfileCard({ profile, activeInstances, onEdit, onDelete }: ProfileCard
105
103
  if (preferences.maxCostPerTask) budgetParts.push(`$${preferences.maxCostPerTask.toFixed(2)}/task`);
106
104
  const budgetText = budgetParts.length > 0 ? budgetParts.join(' / ') : null;
107
105
 
108
- return React.createElement(Flex, {
109
- variant: 'column-stretch-start-nowrap-6',
110
- style: {
111
- padding: '10px 12px',
112
- borderRadius: '8px',
113
- border: '1px solid var(--color-border-default)',
114
- backgroundColor: 'var(--color-surface-elevated)',
115
- },
116
- },
117
- // Header: Icon + Name + Edit/Delete buttons
118
- React.createElement(Flex, { variant: 'row-center-start-nowrap-8' },
119
- React.createElement(Flex, {
120
- variant: 'row-center-center-nowrap-0',
121
- style: { color: `var(--${color})`, flexShrink: 0 },
122
- },
123
- React.createElement(Icon, { name: icon || 'smartToy', size: 18 }),
124
- ),
125
- React.createElement(Typography, {
126
- variant: 'caption-thick',
127
- color: 'color-text-high',
128
- style: { flex: 1, minWidth: 0 },
129
- }, name),
130
- onEdit && React.createElement(IconButton, {
131
- icon: 'edit', size: 'xs', variant: 'clear',
132
- onClick: () => onEdit(id),
133
- title: 'Edit profile',
134
- }),
135
- onDelete && React.createElement(IconButton, {
136
- icon: 'outlinedDelete', size: 'xs', variant: 'clear', color: 'danger',
137
- onClick: () => onDelete(id),
138
- title: 'Delete profile',
139
- }),
140
- ),
106
+ return (
107
+ <Flex
108
+ variant="column-stretch-start-nowrap-6"
109
+ style={{
110
+ padding: '10px 12px',
111
+ borderRadius: '8px',
112
+ border: '1px solid var(--color-border-default)',
113
+ backgroundColor: 'var(--color-surface-elevated)',
114
+ }}
115
+ >
116
+ {/* Header: Icon + Name + Edit/Delete buttons */}
117
+ <Flex variant="row-center-start-nowrap-8">
118
+ <Flex
119
+ variant="row-center-center-nowrap-0"
120
+ style={{ color: `var(--${color})`, flexShrink: 0 }}
121
+ >
122
+ <Icon name={icon || 'smartToy'} size={18} color={color || 'color-text-medium'} />
123
+ </Flex>
124
+ <Typography
125
+ variant="caption-thick"
126
+ color="color-text-high"
127
+ style={{ flex: 1, minWidth: 0 }}
128
+ >
129
+ {name}
130
+ </Typography>
131
+ {onEdit && (
132
+ <IconButton
133
+ icon="edit"
134
+ size="xs"
135
+ variant="clear"
136
+ onClick={() => onEdit(id)}
137
+ title="Edit profile"
138
+ />
139
+ )}
140
+ {onDelete && (
141
+ <IconButton
142
+ icon="outlinedDelete"
143
+ size="xs"
144
+ variant="clear"
145
+ color="danger"
146
+ onClick={() => onDelete(id)}
147
+ title="Delete profile"
148
+ />
149
+ )}
150
+ </Flex>
141
151
 
142
- // Description
143
- description && React.createElement(Typography, {
144
- variant: 'smallCaption-regular',
145
- color: 'color-text-medium',
146
- }, description),
152
+ {/* Description */}
153
+ {description && (
154
+ <Typography variant="smallCaption-regular" color="color-text-medium">
155
+ {description}
156
+ </Typography>
157
+ )}
147
158
 
148
- // Divider
149
- React.createElement('div', {
150
- style: { borderTop: '1px solid var(--color-border-default)', margin: '2px 0' },
151
- }),
159
+ {/* Divider */}
160
+ <div style={{ borderTop: '1px solid var(--color-border-default)', margin: '2px 0' }} />
152
161
 
153
- // Capabilities
154
- capabilities.length > 0 && React.createElement(Field, { label: 'Capabilities', labelWidth: 90, align: 'start' },
155
- React.createElement(Flex, { variant: 'row-center-start-wrap-4' },
156
- ...capabilities.map((cap: Capability) =>
157
- React.createElement('span', { key: cap.name, title: cap.description },
158
- React.createElement(Chip, { label: cap.name, size: 'small', color: 'color-brand-main' }),
159
- ),
160
- ),
161
- ),
162
- ),
162
+ {/* Capabilities */}
163
+ {capabilities.length > 0 && (
164
+ <Field label="Capabilities" labelWidth={90} align="start">
165
+ <Flex variant="row-center-start-wrap-4">
166
+ {capabilities.map((cap: Capability) => (
167
+ <span key={cap.name} title={cap.description}>
168
+ <Chip label={cap.name} size="small" color="color-brand-main" />
169
+ </span>
170
+ ))}
171
+ </Flex>
172
+ </Field>
173
+ )}
163
174
 
164
- // Knowledge capabilities (from behavior)
165
- behavior?.capabilities && behavior.capabilities.length > 0 && React.createElement(Field, { label: 'Knowledge', labelWidth: 90, align: 'start' },
166
- React.createElement(Flex, { variant: 'row-center-start-wrap-4' },
167
- ...behavior.capabilities.map((capName: string) =>
168
- React.createElement('span', { key: capName },
169
- React.createElement(Chip, { label: capName, size: 'small', color: 'color-status-info' }),
170
- ),
171
- ),
172
- ),
173
- ),
175
+ {/* Capabilities (from behavior) */}
176
+ {behavior?.capabilities && behavior.capabilities.length > 0 && (
177
+ <Field label="Capabilities" labelWidth={90} align="start">
178
+ <Flex variant="row-center-start-wrap-4">
179
+ {behavior.capabilities.map((capName: string) => (
180
+ <span key={capName}>
181
+ <Chip label={capName} size="small" color="color-status-info" />
182
+ </span>
183
+ ))}
184
+ </Flex>
185
+ </Field>
186
+ )}
174
187
 
175
- // Budget (from behavior)
176
- behavior?.budget && React.createElement(Field, { label: 'Budget', labelWidth: 90, align: 'center' },
177
- React.createElement(Typography, {
178
- variant: 'smallCaption-regular', color: 'color-text-high',
179
- }, `$${behavior.budget.toFixed(2)}/task`),
180
- ),
188
+ {/* Budget (from behavior) */}
189
+ {behavior?.budget && (
190
+ <Field label="Budget" labelWidth={90} align="center">
191
+ <Typography variant="smallCaption-regular" color="color-text-high">
192
+ {`$${behavior.budget.toFixed(2)}/task`}
193
+ </Typography>
194
+ </Field>
195
+ )}
181
196
 
182
- // Strategy
183
- React.createElement(Field, { label: 'Strategy', labelWidth: 90, align: 'center' },
184
- React.createElement(Flex, { variant: 'row-center-start-nowrap-6' },
185
- React.createElement(Icon, { name: STRATEGY_ICONS[preferences.costStrategy] || 'syncAlt', size: 12 }),
186
- React.createElement(Typography, {
187
- variant: 'smallCaption-regular', color: 'color-text-high',
188
- }, STRATEGY_LABELS[preferences.costStrategy] ?? preferences.costStrategy),
189
- ),
190
- ),
197
+ {/* Strategy */}
198
+ <Field label="Strategy" labelWidth={90} align="center">
199
+ <Flex variant="row-center-start-nowrap-6">
200
+ <Icon name={STRATEGY_ICONS[preferences.costStrategy] || 'syncAlt'} size={12} color="color-text-medium" />
201
+ <Typography variant="smallCaption-regular" color="color-text-high">
202
+ {STRATEGY_LABELS[preferences.costStrategy] ?? preferences.costStrategy}
203
+ </Typography>
204
+ </Flex>
205
+ </Field>
191
206
 
192
- // Instances + Approval
193
- React.createElement(Field, { label: 'Instances', labelWidth: 90, align: 'center' },
194
- React.createElement(Flex, { variant: 'row-center-start-nowrap-8' },
195
- React.createElement(Typography, {
196
- variant: 'smallCaption-regular', color: 'color-text-high',
197
- }, `${activeInstances}/${maxInstances} active`),
198
- React.createElement(Chip, {
199
- label: preferences.requireApproval ? 'Approval required' : 'Auto-approve',
200
- size: 'small',
201
- color: preferences.requireApproval ? 'color-status-caution' : 'color-status-positive',
202
- }),
203
- ),
204
- ),
207
+ {/* Instances + Approval */}
208
+ <Field label="Instances" labelWidth={90} align="center">
209
+ <Flex variant="row-center-start-nowrap-8">
210
+ <Typography variant="smallCaption-regular" color="color-text-high">
211
+ {`${activeInstances}/${maxInstances} active`}
212
+ </Typography>
213
+ <Chip
214
+ label={preferences.requireApproval ? 'Approval required' : 'Auto-approve'}
215
+ size="small"
216
+ color={preferences.requireApproval ? 'color-status-caution' : 'color-status-positive'}
217
+ />
218
+ </Flex>
219
+ </Field>
205
220
 
206
- // Budget
207
- budgetText && React.createElement(Field, { label: 'Budget', labelWidth: 90, align: 'center' },
208
- React.createElement(Typography, {
209
- variant: 'smallCaption-regular', color: 'color-text-high',
210
- }, budgetText),
211
- ),
221
+ {/* Budget */}
222
+ {budgetText && (
223
+ <Field label="Budget" labelWidth={90} align="center">
224
+ <Typography variant="smallCaption-regular" color="color-text-high">
225
+ {budgetText}
226
+ </Typography>
227
+ </Field>
228
+ )}
212
229
 
213
- // --- Behavior section (new) ---
214
- behavior && React.createElement(React.Fragment, null,
215
- // Phase pills
216
- React.createElement(Field, { label: 'Phases', labelWidth: 90, align: 'start' },
217
- React.createElement(Flex, { variant: 'row-center-start-wrap-4' },
218
- ...Object.entries(behavior.phases).map(([phaseName, phase]) => {
219
- const enabled = phase?.enabled !== false;
220
- const isLlmPhase = phase?.tier !== undefined;
221
- const label = isLlmPhase && enabled
222
- ? `${phaseName} (${tierLabel(phase)})`
223
- : phaseName;
224
- return React.createElement('span', { key: phaseName },
225
- React.createElement(Chip, {
226
- label,
227
- size: 'small',
228
- color: enabled ? 'color-status-positive' : 'color-status-info',
229
- disabled: !enabled,
230
- }),
231
- );
232
- }),
233
- ),
234
- ),
230
+ {/* --- Behavior section (new) --- */}
231
+ {behavior && (
232
+ <>
233
+ {/* Phase pills */}
234
+ <Field label="Phases" labelWidth={90} align="start">
235
+ <Flex variant="row-center-start-wrap-4">
236
+ {Object.entries(behavior.phases).map(([phaseName, phase]) => {
237
+ const enabled = phase?.enabled !== false;
238
+ const isLlmPhase = phase?.tier !== undefined;
239
+ const label = isLlmPhase && enabled
240
+ ? `${phaseName} (${tierLabel(phase)})`
241
+ : phaseName;
242
+ return (
243
+ <span key={phaseName}>
244
+ <Chip
245
+ label={label}
246
+ size="small"
247
+ color={enabled ? 'color-status-positive' : 'color-status-info'}
248
+ disabled={!enabled}
249
+ />
250
+ </span>
251
+ );
252
+ })}
253
+ </Flex>
254
+ </Field>
235
255
 
236
- // Escalation
237
- React.createElement(Field, { label: 'Escalation', labelWidth: 90, align: 'center' },
238
- React.createElement(Typography, {
239
- variant: 'smallCaption-regular', color: 'color-text-high',
240
- }, `${behavior.escalation.maxAttempts} attempts, then ${behavior.escalation.onExhausted}`),
241
- ),
256
+ {/* Escalation */}
257
+ <Field label="Escalation" labelWidth={90} align="center">
258
+ <Typography variant="smallCaption-regular" color="color-text-high">
259
+ {`${behavior.escalation.maxAttempts} attempts, then ${behavior.escalation.onExhausted}`}
260
+ </Typography>
261
+ </Field>
242
262
 
243
- // Scope (if set)
244
- behavior.scope && (behavior.scope.allowedPaths?.length || behavior.scope.blockedPaths?.length) &&
245
- React.createElement(Field, { label: 'Scope', labelWidth: 90, align: 'start' },
246
- React.createElement(Flex, { variant: 'column-stretch-start-nowrap-2' },
247
- behavior.scope.blockedPaths?.length && React.createElement(Flex, { variant: 'row-center-start-wrap-4' },
248
- React.createElement(Typography, {
249
- variant: 'smallCaption-regular', color: 'color-text-subtle',
250
- }, 'Blocked:'),
251
- ...behavior.scope.blockedPaths.map((p: string) =>
252
- React.createElement('span', { key: p },
253
- React.createElement(Chip, { label: p, size: 'small', color: 'color-status-negative' }),
254
- ),
255
- ),
256
- ),
257
- behavior.scope.allowedPaths?.length && React.createElement(Flex, { variant: 'row-center-start-wrap-4' },
258
- React.createElement(Typography, {
259
- variant: 'smallCaption-regular', color: 'color-text-subtle',
260
- }, 'Allowed:'),
261
- ...behavior.scope.allowedPaths.map((p: string) =>
262
- React.createElement('span', { key: p },
263
- React.createElement(Chip, { label: p, size: 'small', color: 'color-status-positive' }),
264
- ),
265
- ),
266
- ),
267
- ),
268
- ),
269
- ),
263
+ {/* Scope (if set) */}
264
+ {behavior.scope && (behavior.scope.allowedPaths?.length || behavior.scope.blockedPaths?.length) && (
265
+ <Field label="Scope" labelWidth={90} align="start">
266
+ <Flex variant="column-stretch-start-nowrap-2">
267
+ {behavior.scope.blockedPaths?.length && (
268
+ <Flex variant="row-center-start-wrap-4">
269
+ <Typography variant="smallCaption-regular" color="color-text-subtle">
270
+ Blocked:
271
+ </Typography>
272
+ {behavior.scope.blockedPaths.map((p: string) => (
273
+ <span key={p}>
274
+ <Chip label={p} size="small" color="color-status-negative" />
275
+ </span>
276
+ ))}
277
+ </Flex>
278
+ )}
279
+ {behavior.scope.allowedPaths?.length && (
280
+ <Flex variant="row-center-start-wrap-4">
281
+ <Typography variant="smallCaption-regular" color="color-text-subtle">
282
+ Allowed:
283
+ </Typography>
284
+ {behavior.scope.allowedPaths.map((p: string) => (
285
+ <span key={p}>
286
+ <Chip label={p} size="small" color="color-status-positive" />
287
+ </span>
288
+ ))}
289
+ </Flex>
290
+ )}
291
+ </Flex>
292
+ </Field>
293
+ )}
294
+ </>
295
+ )}
270
296
 
271
- // Instructions — collapsible
272
- preferences.instructions && React.createElement(CollapsibleSection, {
273
- title: 'Protocol',
274
- variant: 'list',
275
- defaultExpanded: false,
276
- },
277
- React.createElement(Typography, {
278
- variant: 'smallCaption-regular', color: 'color-text-subtle',
279
- style: { whiteSpace: 'pre-wrap', lineHeight: '1.5', padding: '4px 0' },
280
- }, preferences.instructions),
281
- ),
297
+ {/* Instructions — collapsible */}
298
+ {preferences.instructions && (
299
+ <CollapsibleSection title="Protocol" variant="list" defaultExpanded={false}>
300
+ <Typography
301
+ variant="smallCaption-regular"
302
+ color="color-text-subtle"
303
+ style={{ whiteSpace: 'pre-wrap', lineHeight: '1.5', padding: '4px 0' }}
304
+ >
305
+ {preferences.instructions}
306
+ </Typography>
307
+ </CollapsibleSection>
308
+ )}
309
+ </Flex>
282
310
  );
283
311
  }
284
312
 
285
313
  export { ProfileCard };
286
314
  export default ProfileCard;
287
- module.exports = ProfileCard;