@arbidocs/blocks 0.4.138 → 0.4.140

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 (177) hide show
  1. package/dist/agents/definitions/AgentConnectInstructions.d.ts +12 -0
  2. package/dist/agents/definitions/defaults.d.ts +12 -0
  3. package/dist/agents/definitions/index.d.ts +2 -0
  4. package/dist/agents/index.cjs +333 -318
  5. package/dist/agents/index.js +7 -8
  6. package/dist/calendar/CalendarFormDialog.d.ts +13 -0
  7. package/dist/calendar/ProposeTimeDialog.d.ts +22 -0
  8. package/dist/calendar/WeeklyHoursEditor.d.ts +7 -0
  9. package/dist/calendar/access-setup.d.ts +8 -0
  10. package/dist/calendar/api-mapping.d.ts +22 -0
  11. package/dist/calendar/booking-form.d.ts +46 -0
  12. package/dist/calendar/conference.d.ts +11 -0
  13. package/dist/calendar/errors.d.ts +7 -0
  14. package/dist/calendar/feeds.d.ts +2 -0
  15. package/dist/calendar/freebusy.d.ts +22 -0
  16. package/dist/calendar/ics.d.ts +33 -0
  17. package/dist/calendar/index.cjs +472 -4293
  18. package/dist/calendar/index.cjs.map +1 -1
  19. package/dist/calendar/index.d.ts +17 -1
  20. package/dist/calendar/index.js +1 -4227
  21. package/dist/calendar/index.js.map +1 -1
  22. package/dist/calendar/requests.d.ts +42 -0
  23. package/dist/calendar/room-window.d.ts +6 -0
  24. package/dist/calendar/settings-value.d.ts +4 -0
  25. package/dist/calls/index.cjs +3 -3
  26. package/dist/calls/index.js +2 -2
  27. package/dist/{chunk-IE5CUCZK.cjs → chunk-3BFGL2JL.cjs} +6 -6
  28. package/dist/{chunk-IE5CUCZK.cjs.map → chunk-3BFGL2JL.cjs.map} +1 -1
  29. package/dist/{chunk-2KUCVSFF.js → chunk-45LRMW54.js} +3 -3
  30. package/dist/{chunk-2KUCVSFF.js.map → chunk-45LRMW54.js.map} +1 -1
  31. package/dist/chunk-5FTIHRZH.cjs +177 -0
  32. package/dist/chunk-5FTIHRZH.cjs.map +1 -0
  33. package/dist/{chunk-FUTMU4FR.js → chunk-5HFPRI3W.js} +3 -3
  34. package/dist/{chunk-FUTMU4FR.js.map → chunk-5HFPRI3W.js.map} +1 -1
  35. package/dist/{chunk-HLB4DIYV.cjs → chunk-5Y3SAJUK.cjs} +6 -6
  36. package/dist/{chunk-HLB4DIYV.cjs.map → chunk-5Y3SAJUK.cjs.map} +1 -1
  37. package/dist/chunk-6YTHQ73P.cjs +5334 -0
  38. package/dist/chunk-6YTHQ73P.cjs.map +1 -0
  39. package/dist/chunk-A3XPS2EU.js +245 -0
  40. package/dist/chunk-A3XPS2EU.js.map +1 -0
  41. package/dist/chunk-B3AHCIV5.js +5206 -0
  42. package/dist/chunk-B3AHCIV5.js.map +1 -0
  43. package/dist/{chunk-2Q7FDZAY.js → chunk-BPBSSMRB.js} +5 -163
  44. package/dist/chunk-BPBSSMRB.js.map +1 -0
  45. package/dist/{chunk-ED4HHTIA.js → chunk-BPUZEYSP.js} +3 -3
  46. package/dist/{chunk-ED4HHTIA.js.map → chunk-BPUZEYSP.js.map} +1 -1
  47. package/dist/{chunk-KSHKTOY2.js → chunk-CKCBBYTA.js} +205 -5
  48. package/dist/chunk-CKCBBYTA.js.map +1 -0
  49. package/dist/chunk-CYNF5PZI.js +170 -0
  50. package/dist/chunk-CYNF5PZI.js.map +1 -0
  51. package/dist/{chunk-3BI6EWKP.cjs → chunk-DAIHYDK6.cjs} +867 -7
  52. package/dist/chunk-DAIHYDK6.cjs.map +1 -0
  53. package/dist/{chunk-OPTBQSCV.cjs → chunk-DJM7DLCT.cjs} +3 -3
  54. package/dist/{chunk-OPTBQSCV.cjs.map → chunk-DJM7DLCT.cjs.map} +1 -1
  55. package/dist/{chunk-VHJHY7TT.js → chunk-ECERC6TI.js} +3 -3
  56. package/dist/{chunk-VHJHY7TT.js.map → chunk-ECERC6TI.js.map} +1 -1
  57. package/dist/{chunk-KDUGTKVI.cjs → chunk-GFNELPDP.cjs} +17 -6
  58. package/dist/chunk-GFNELPDP.cjs.map +1 -0
  59. package/dist/{chunk-OGBXV326.cjs → chunk-GFRQG36Y.cjs} +2 -243
  60. package/dist/chunk-GFRQG36Y.cjs.map +1 -0
  61. package/dist/{chunk-WXYQ66KC.cjs → chunk-HEMU73OP.cjs} +2 -166
  62. package/dist/chunk-HEMU73OP.cjs.map +1 -0
  63. package/dist/{chunk-XVME4XYD.js → chunk-IBIUPT23.js} +845 -7
  64. package/dist/chunk-IBIUPT23.js.map +1 -0
  65. package/dist/{chunk-UUHUQHXR.cjs → chunk-JZNXRMLH.cjs} +6 -6
  66. package/dist/{chunk-UUHUQHXR.cjs.map → chunk-JZNXRMLH.cjs.map} +1 -1
  67. package/dist/{chunk-RQ2Y7USX.cjs → chunk-MIDXCYZB.cjs} +235 -15
  68. package/dist/chunk-MIDXCYZB.cjs.map +1 -0
  69. package/dist/{chunk-W3VYZXNS.js → chunk-O6W6RW3B.js} +5 -240
  70. package/dist/chunk-O6W6RW3B.js.map +1 -0
  71. package/dist/{chunk-OQ7RUNOC.js → chunk-OCDDWDH2.js} +21 -5
  72. package/dist/chunk-OCDDWDH2.js.map +1 -0
  73. package/dist/{chunk-UBEI6WFJ.js → chunk-RYEJ6AA5.js} +12 -705
  74. package/dist/chunk-RYEJ6AA5.js.map +1 -0
  75. package/dist/{chunk-MJKBVIV3.cjs → chunk-SU7QY7U2.cjs} +36 -748
  76. package/dist/chunk-SU7QY7U2.cjs.map +1 -0
  77. package/dist/{chunk-ZNI4SW2G.js → chunk-UGCKUXRV.js} +3 -3
  78. package/dist/{chunk-ZNI4SW2G.js.map → chunk-UGCKUXRV.js.map} +1 -1
  79. package/dist/{chunk-AAFX64WD.cjs → chunk-UMG5S6H5.cjs} +21 -4
  80. package/dist/chunk-UMG5S6H5.cjs.map +1 -0
  81. package/dist/{chunk-L2PAPOZ5.js → chunk-US3S4DCB.js} +17 -6
  82. package/dist/chunk-US3S4DCB.js.map +1 -0
  83. package/dist/chunk-V46W7YLI.cjs +252 -0
  84. package/dist/chunk-V46W7YLI.cjs.map +1 -0
  85. package/dist/{chunk-JVL7HUIQ.cjs → chunk-YLUEQSMK.cjs} +5 -5
  86. package/dist/{chunk-JVL7HUIQ.cjs.map → chunk-YLUEQSMK.cjs.map} +1 -1
  87. package/dist/{chunk-DWZXSPMB.cjs → chunk-ZAVEMQ37.cjs} +3 -3
  88. package/dist/{chunk-DWZXSPMB.cjs.map → chunk-ZAVEMQ37.cjs.map} +1 -1
  89. package/dist/{chunk-E5OYHJMU.js → chunk-ZNTHEXNJ.js} +4 -4
  90. package/dist/{chunk-E5OYHJMU.js.map → chunk-ZNTHEXNJ.js.map} +1 -1
  91. package/dist/citations/QuietMarks.d.ts +5 -2
  92. package/dist/citations/index.cjs +14 -13
  93. package/dist/citations/index.js +2 -1
  94. package/dist/collaboration/index.cjs +42 -42
  95. package/dist/collaboration/index.js +2 -2
  96. package/dist/connect/docx.cjs +6 -6
  97. package/dist/connect/docx.js +5 -5
  98. package/dist/connect/index.cjs +4792 -179
  99. package/dist/connect/index.cjs.map +1 -1
  100. package/dist/connect/index.d.ts +4 -0
  101. package/dist/connect/index.js +4684 -91
  102. package/dist/connect/index.js.map +1 -1
  103. package/dist/connection/ConnectedAgentCreator.d.ts +37 -0
  104. package/dist/connection/ConnectedWorkflowHistory.d.ts +45 -0
  105. package/dist/connection/ConnectionProvider.d.ts +3 -1
  106. package/dist/connection/calendar/AddCalendarDialogs.d.ts +9 -0
  107. package/dist/connection/calendar/BookingPagesPanel.d.ts +13 -0
  108. package/dist/connection/calendar/CalendarAccountsPanel.d.ts +5 -0
  109. package/dist/connection/calendar/CalendarSettingsDialog.d.ts +12 -0
  110. package/dist/connection/calendar/ConnectedCalendar.d.ts +13 -0
  111. package/dist/connection/calendar/ConnectedMailInviteCard.d.ts +12 -0
  112. package/dist/connection/calendar/ConnectedPublicBooking.d.ts +9 -0
  113. package/dist/connection/calendar/ConnectedUpcomingEvents.d.ts +12 -0
  114. package/dist/connection/calendar/CopyField.d.ts +9 -0
  115. package/dist/connection/calendar/EventEditorDialog.d.ts +29 -0
  116. package/dist/connection/calendar/EventScheduling.d.ts +8 -0
  117. package/dist/connection/calendar/InvitationsPanel.d.ts +5 -0
  118. package/dist/connection/calendar/OpenAccessPanel.d.ts +7 -0
  119. package/dist/connection/calendar/PublishCalendarDialog.d.ts +8 -0
  120. package/dist/connection/calendar/RoomsDirectoryPanel.d.ts +8 -0
  121. package/dist/connection/calendar/ShareCalendarDialog.d.ts +6 -0
  122. package/dist/connection/calendar/copy.d.ts +2 -0
  123. package/dist/connection/calendar/index.d.ts +6 -0
  124. package/dist/connection/calendar/store.d.ts +47 -0
  125. package/dist/connection/calendar/types.d.ts +36 -0
  126. package/dist/connection/calendar/useWebinarAttendee.d.ts +3 -0
  127. package/dist/connection/notification-center/ConnectedNotificationCenter.d.ts +15 -0
  128. package/dist/connection/notification-center/NotificationCenter.d.ts +37 -0
  129. package/dist/connection/notification-center/NotificationEvent.d.ts +33 -0
  130. package/dist/connection/notification-center/index.d.ts +4 -0
  131. package/dist/connection/notification-center/items.d.ts +44 -0
  132. package/dist/facts/index.cjs +3 -3
  133. package/dist/facts/index.js +3 -3
  134. package/dist/files/index.cjs +3 -3
  135. package/dist/files/index.js +3 -3
  136. package/dist/home/index.cjs +2 -2
  137. package/dist/home/index.js +2 -2
  138. package/dist/index.cjs +685 -668
  139. package/dist/index.cjs.map +1 -1
  140. package/dist/index.js +20 -19
  141. package/dist/index.js.map +1 -1
  142. package/dist/retrieval/index.cjs +1 -1
  143. package/dist/retrieval/index.js +1 -1
  144. package/dist/settings/index.cjs +52 -66
  145. package/dist/settings/index.cjs.map +1 -1
  146. package/dist/settings/index.js +7 -24
  147. package/dist/settings/index.js.map +1 -1
  148. package/dist/shell/index.cjs +61 -60
  149. package/dist/shell/index.js +5 -4
  150. package/dist/site/index.cjs +5 -5
  151. package/dist/site/index.js +1 -1
  152. package/dist/studio/index.cjs +7 -7
  153. package/dist/studio/index.js +5 -5
  154. package/dist/workflow-canvas/index.cjs +26 -27
  155. package/dist/workflow-canvas/index.cjs.map +1 -1
  156. package/dist/workflow-canvas/index.js +9 -10
  157. package/dist/workflow-canvas/index.js.map +1 -1
  158. package/node_modules/@arbidocs/coedit/package.json +1 -1
  159. package/package.json +4 -4
  160. package/dist/chunk-2Q7FDZAY.js.map +0 -1
  161. package/dist/chunk-3BI6EWKP.cjs.map +0 -1
  162. package/dist/chunk-AAFX64WD.cjs.map +0 -1
  163. package/dist/chunk-CQCC7LE7.js +0 -210
  164. package/dist/chunk-CQCC7LE7.js.map +0 -1
  165. package/dist/chunk-KDUGTKVI.cjs.map +0 -1
  166. package/dist/chunk-KSHKTOY2.js.map +0 -1
  167. package/dist/chunk-L2PAPOZ5.js.map +0 -1
  168. package/dist/chunk-MJKBVIV3.cjs.map +0 -1
  169. package/dist/chunk-OGBXV326.cjs.map +0 -1
  170. package/dist/chunk-OQ7RUNOC.js.map +0 -1
  171. package/dist/chunk-RFIBUWLF.cjs +0 -232
  172. package/dist/chunk-RFIBUWLF.cjs.map +0 -1
  173. package/dist/chunk-RQ2Y7USX.cjs.map +0 -1
  174. package/dist/chunk-UBEI6WFJ.js.map +0 -1
  175. package/dist/chunk-W3VYZXNS.js.map +0 -1
  176. package/dist/chunk-WXYQ66KC.cjs.map +0 -1
  177. package/dist/chunk-XVME4XYD.js.map +0 -1
@@ -1,14 +1,16 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkWS5EX7DN_cjs = require('./chunk-WS5EX7DN.cjs');
5
- var chunkRQ2Y7USX_cjs = require('./chunk-RQ2Y7USX.cjs');
4
+ var chunkMIDXCYZB_cjs = require('./chunk-MIDXCYZB.cjs');
6
5
  var chunkZW6FPIFC_cjs = require('./chunk-ZW6FPIFC.cjs');
6
+ var chunkWS5EX7DN_cjs = require('./chunk-WS5EX7DN.cjs');
7
7
  var chunkDETZZBG2_cjs = require('./chunk-DETZZBG2.cjs');
8
8
  var chunkV4ISCZJ7_cjs = require('./chunk-V4ISCZJ7.cjs');
9
9
  var chunk2EI7NCUA_cjs = require('./chunk-2EI7NCUA.cjs');
10
10
  var chunkC2CWWEHO_cjs = require('./chunk-C2CWWEHO.cjs');
11
+ var chunkR26BK7YL_cjs = require('./chunk-R26BK7YL.cjs');
11
12
  var chunk7RGLTF76_cjs = require('./chunk-7RGLTF76.cjs');
13
+ var chunkC4WSHRR6_cjs = require('./chunk-C4WSHRR6.cjs');
12
14
  var chunkOWCEQKAR_cjs = require('./chunk-OWCEQKAR.cjs');
13
15
  var chunk32HW2Q33_cjs = require('./chunk-32HW2Q33.cjs');
14
16
  var chunkMHVNT4J3_cjs = require('./chunk-MHVNT4J3.cjs');
@@ -867,7 +869,7 @@ function WorkflowDocumentsField({
867
869
  children: [
868
870
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
869
871
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
870
- chunkRQ2Y7USX_cjs.DocumentPicker,
872
+ chunkMIDXCYZB_cjs.DocumentPicker,
871
873
  {
872
874
  groups: [{ id: "all", heading: l.allDocuments, docs: [...offered].sort(byTitle) }],
873
875
  value: multiple ? "" : ids[0] ?? "",
@@ -2974,6 +2976,677 @@ function StepNotices({
2974
2976
  ))
2975
2977
  ] });
2976
2978
  }
2979
+ function CapabilityTile({
2980
+ label,
2981
+ description,
2982
+ icon: Icon,
2983
+ selected,
2984
+ onToggle,
2985
+ testId,
2986
+ className
2987
+ }) {
2988
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2989
+ "button",
2990
+ {
2991
+ type: "button",
2992
+ onClick: onToggle,
2993
+ "aria-pressed": selected,
2994
+ "data-testid": testId,
2995
+ "data-slot": "capability-tile",
2996
+ className: ui.cn(
2997
+ "flex flex-col items-start gap-1 rounded-lg p-3 text-left transition-colors pointer-coarse:min-h-11 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
2998
+ selected ? "bg-accent text-accent-foreground ring-1 ring-inset ring-primary/30" : "bg-muted hover:bg-accent/60",
2999
+ className
3000
+ ),
3001
+ children: [
3002
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { size: 16, className: selected ? "text-accent-foreground" : "text-muted-foreground" }),
3003
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-medium leading-tight", children: label }),
3004
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs leading-tight text-muted-foreground", children: description })
3005
+ ]
3006
+ }
3007
+ );
3008
+ }
3009
+ function CapabilityGrid({
3010
+ children,
3011
+ testId,
3012
+ className
3013
+ }) {
3014
+ return /* @__PURE__ */ jsxRuntime.jsx(
3015
+ "div",
3016
+ {
3017
+ className: ui.cn("grid grid-cols-2 gap-2 sm:grid-cols-4", className),
3018
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testId, { testId: "agent-capabilities" }),
3019
+ children
3020
+ }
3021
+ );
3022
+ }
3023
+ var DEFAULT_AGENT_TYPE_SELECTOR_LABELS = {
3024
+ agentType: "Agent type"
3025
+ };
3026
+ function AgentTypeSelector({
3027
+ value,
3028
+ onChange,
3029
+ options,
3030
+ label,
3031
+ labels,
3032
+ testId,
3033
+ optionTestId
3034
+ }) {
3035
+ const l = { ...DEFAULT_AGENT_TYPE_SELECTOR_LABELS, ...labels };
3036
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", "data-testid": chunkMHVNT4J3_cjs.testIdOr(testId, { testId: "agent-type-selector" }), children: [
3037
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { children: label ?? l.agentType }),
3038
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-2 gap-2", children: options.map((opt) => /* @__PURE__ */ jsxRuntime.jsxs(
3039
+ "button",
3040
+ {
3041
+ type: "button",
3042
+ onClick: () => onChange(opt.value),
3043
+ "aria-pressed": value === opt.value,
3044
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(optionTestId?.(opt.value), { testId: `agent-type-${opt.value}` }),
3045
+ className: ui.cn(
3046
+ "rounded-lg p-3 text-left transition-colors pointer-coarse:min-h-11 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
3047
+ value === opt.value ? "bg-accent text-accent-foreground ring-1 ring-inset ring-primary/30" : "bg-muted hover:bg-accent/60"
3048
+ ),
3049
+ children: [
3050
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm font-medium", children: opt.title }),
3051
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-0.5 text-xs text-muted-foreground", children: opt.description })
3052
+ ]
3053
+ },
3054
+ opt.value
3055
+ )) })
3056
+ ] });
3057
+ }
3058
+ var DEFAULT_AGENT_AVATAR_FIELD_LABELS = {
3059
+ painting: "Painting\u2026",
3060
+ generate: "Generate avatar",
3061
+ regenerate: "Regenerate"
3062
+ };
3063
+ function AgentAvatarField({
3064
+ picture,
3065
+ isBusy,
3066
+ canGenerate,
3067
+ onGenerate,
3068
+ labels,
3069
+ testIds
3070
+ }) {
3071
+ const l = { ...DEFAULT_AGENT_AVATAR_FIELD_LABELS, ...labels };
3072
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-2", "data-slot": "agent-avatar-field", children: [
3073
+ /* @__PURE__ */ jsxRuntime.jsx(
3074
+ "div",
3075
+ {
3076
+ className: "flex size-24 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-muted",
3077
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.preview, { testId: "agent-avatar-preview" }),
3078
+ children: isBusy ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-1 text-ai-ink", children: [
3079
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "size-7 animate-spin" }),
3080
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs", children: l.painting })
3081
+ ] }) : picture ? /* @__PURE__ */ jsxRuntime.jsx("img", { src: picture, alt: "", className: "size-full object-cover" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Bot, { className: "size-10 text-ai-ink/70" })
3082
+ }
3083
+ ),
3084
+ /* @__PURE__ */ jsxRuntime.jsxs(
3085
+ ui.Button,
3086
+ {
3087
+ variant: "outline",
3088
+ size: "sm",
3089
+ className: "h-8 gap-1 px-2 text-xs pointer-coarse:h-11",
3090
+ disabled: isBusy || !canGenerate,
3091
+ onClick: onGenerate,
3092
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.generate, { testId: "agent-avatar-generate" }),
3093
+ children: [
3094
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Wand2, { size: 12 }),
3095
+ " ",
3096
+ picture ? l.regenerate : l.generate
3097
+ ]
3098
+ }
3099
+ )
3100
+ ] });
3101
+ }
3102
+ var DEFAULT_AGENT_CREATOR_LABELS = {
3103
+ titleNew: "New agent",
3104
+ titleEdit: (name) => `Edit ${name}`,
3105
+ descriptionNew: "Say what this agent is for. Everything else follows from that.",
3106
+ descriptionEdit: "Change what this agent is for, or fine-tune it under Advanced.",
3107
+ describe: "What should it do?",
3108
+ describePlaceholder: "e.g. Reads new files each morning and tells me what changed, with sources.",
3109
+ describeHint: "This becomes the agent\u2019s persona and shapes every answer.",
3110
+ startFrom: "Or start from",
3111
+ summaryHeading: "What it can do (its tools)",
3112
+ summaryCan: (list) => `Can ${list}.`,
3113
+ summaryCannot: (list) => `Cannot ${list}.`,
3114
+ summaryNone: "It can read your files and answer. Nothing else is switched on yet.",
3115
+ summaryModel: (model) => `Uses ${model}.`,
3116
+ summaryModelAuto: "Uses the default model.",
3117
+ summaryWorkspaces: (list) => `Can read ${list}.`,
3118
+ summaryNoWorkspaces: "Cannot read any workspace yet. Give it access under Advanced.",
3119
+ summaryName: (name) => `Will be called ${name}.`,
3120
+ workspaceAccess: "Workspace access",
3121
+ workspaceAccessHint: "Each workspace stays separate. The agent can only read the ones you tick here.",
3122
+ workspaceAlready: "Already has access",
3123
+ revokeWorkspace: (name) => `Remove access to ${name}`,
3124
+ noWorkspacesToGrant: "You have no workspaces yet.",
3125
+ name: "Name",
3126
+ nameHint: "Letters, digits, - and _ only; must start with a letter or digit.",
3127
+ nameInvalid: "Letters, digits, - and _ only; must start with a letter or digit.",
3128
+ advanced: "Advanced",
3129
+ capabilities: "Tools",
3130
+ toolsHint: "Tools are switches on this agent: what it may do on its own, such as search the web or run code. Change them any time.",
3131
+ summaryChange: "Change tools",
3132
+ model: "Model",
3133
+ modelAuto: "Automatic",
3134
+ cancel: "Cancel",
3135
+ create: "Create agent",
3136
+ save: "Save changes",
3137
+ saving: "Saving\u2026"
3138
+ };
3139
+ var NAME_RE = /^[a-zA-Z0-9][a-zA-Z0-9_-]*$/;
3140
+ var FILLER = /* @__PURE__ */ new Set([
3141
+ "a",
3142
+ "an",
3143
+ "the",
3144
+ "who",
3145
+ "that",
3146
+ "which",
3147
+ "to",
3148
+ "for",
3149
+ "and",
3150
+ "of",
3151
+ "i",
3152
+ "my"
3153
+ ]);
3154
+ function deriveAgentName(description) {
3155
+ const words = description.toLowerCase().replace(/[^a-z0-9\s-]/g, " ").split(/\s+/).filter((w) => w && !FILLER.has(w)).slice(0, 3);
3156
+ return words.join("-").slice(0, 64);
3157
+ }
3158
+ var isValidAgentName = (name) => NAME_RE.test(name) && name.length <= 64;
3159
+ var joinList = (items) => items.length <= 2 ? items.join(" and ") : `${items.slice(0, -1).join(", ")} and ${items[items.length - 1]}`;
3160
+ function summarizeCapabilities(capabilities, enabled, modelName, labels = DEFAULT_AGENT_CREATOR_LABELS) {
3161
+ const on = capabilities.filter((c) => enabled[c.key]).map((c) => c.label.toLowerCase());
3162
+ const off = capabilities.filter((c) => !enabled[c.key]).map((c) => c.label.toLowerCase());
3163
+ const lines = [];
3164
+ if (on.length === 0) lines.push(labels.summaryNone);
3165
+ else {
3166
+ lines.push(labels.summaryCan(joinList(on)));
3167
+ if (off.length > 0) lines.push(labels.summaryCannot(joinList(off)));
3168
+ }
3169
+ lines.push(modelName ? labels.summaryModel(modelName) : labels.summaryModelAuto);
3170
+ return lines;
3171
+ }
3172
+ function summarizeAgent(capabilities, values, workspaces, labels = DEFAULT_AGENT_CREATOR_LABELS) {
3173
+ const lines = summarizeCapabilities(capabilities, values.capabilities, values.modelName, labels);
3174
+ const names = workspaces.filter((w) => values.workspaceIds.includes(w.id)).map((w) => w.name);
3175
+ lines.push(
3176
+ names.length > 0 ? labels.summaryWorkspaces(joinList(names)) : labels.summaryNoWorkspaces
3177
+ );
3178
+ if (values.name) lines.push(labels.summaryName(values.name));
3179
+ return lines;
3180
+ }
3181
+ var BLANK = {
3182
+ name: "",
3183
+ persona: "",
3184
+ capabilities: {},
3185
+ modelName: "",
3186
+ type: "builtin",
3187
+ workspaceIds: []
3188
+ };
3189
+ function AgentCreator({
3190
+ open,
3191
+ onOpenChange,
3192
+ isEdit = false,
3193
+ agentName,
3194
+ capabilities,
3195
+ templates = [],
3196
+ models = [],
3197
+ workspaces = [],
3198
+ grantedWorkspaceIds = [],
3199
+ onRevokeWorkspace,
3200
+ revokingWorkspaceId,
3201
+ avatar,
3202
+ types,
3203
+ values: valuesProp,
3204
+ initialValues,
3205
+ onValuesChange,
3206
+ advanced,
3207
+ isSaving,
3208
+ onSubmit,
3209
+ labels,
3210
+ testId
3211
+ }) {
3212
+ const l = { ...DEFAULT_AGENT_CREATOR_LABELS, ...labels };
3213
+ const seed = react.useMemo(
3214
+ () => ({ ...BLANK, ...initialValues }),
3215
+ // Seeded once per open.
3216
+ // eslint-disable-next-line react-hooks/exhaustive-deps
3217
+ [open]
3218
+ );
3219
+ const [values, setValues] = useControllableState(
3220
+ valuesProp,
3221
+ seed,
3222
+ onValuesChange
3223
+ );
3224
+ const [advancedOpen, setAdvancedOpen] = react.useState(false);
3225
+ const [nameTouched, setNameTouched] = react.useState(false);
3226
+ react.useEffect(() => {
3227
+ if (open) {
3228
+ if (valuesProp === void 0) setValues(seed);
3229
+ setAdvancedOpen(false);
3230
+ setNameTouched(Boolean(seed.name));
3231
+ }
3232
+ }, [open]);
3233
+ const id = chunkMHVNT4J3_cjs.testIdOr(testId, { testId: "agent-creator" });
3234
+ const name = values.name;
3235
+ const nameValid = isValidAgentName(name);
3236
+ const canSubmit = (isEdit || nameValid) && !isSaving;
3237
+ const patch = (next) => setValues({ ...values, ...next });
3238
+ const setPersona = (persona) => patch({ persona, ...!isEdit && !nameTouched ? { name: deriveAgentName(persona) } : {} });
3239
+ const applyTemplate = (t) => patch({
3240
+ persona: t.persona,
3241
+ capabilities: Object.fromEntries(
3242
+ capabilities.map((c) => [c.key, t.capabilities.includes(c.key)])
3243
+ ),
3244
+ ...!isEdit && !nameTouched ? { name: deriveAgentName(t.persona) } : {}
3245
+ });
3246
+ const summary = summarizeAgent(capabilities, values, workspaces, l);
3247
+ return /* @__PURE__ */ jsxRuntime.jsx(ui.Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxRuntime.jsxs(
3248
+ ui.DialogContent,
3249
+ {
3250
+ presentation: "sheet",
3251
+ className: "max-h-[calc(100dvh-2rem)] overflow-y-auto sm:max-w-xl",
3252
+ "data-testid": id,
3253
+ children: [
3254
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.DialogHeader, { children: [
3255
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DialogTitle, { children: isEdit ? l.titleEdit(agentName ?? name) : l.titleNew }),
3256
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DialogDescription, { children: isEdit ? l.descriptionEdit : l.descriptionNew })
3257
+ ] }),
3258
+ /* @__PURE__ */ jsxRuntime.jsxs(
3259
+ "form",
3260
+ {
3261
+ className: "flex flex-col gap-5",
3262
+ onSubmit: (event) => {
3263
+ event.preventDefault();
3264
+ if (canSubmit) onSubmit(values);
3265
+ },
3266
+ children: [
3267
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1.5", children: [
3268
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { htmlFor: "agent-creator-describe", children: l.describe }),
3269
+ /* @__PURE__ */ jsxRuntime.jsx(
3270
+ ui.Textarea,
3271
+ {
3272
+ id: "agent-creator-describe",
3273
+ "data-testid": `${id}-describe`,
3274
+ value: values.persona,
3275
+ placeholder: l.describePlaceholder,
3276
+ rows: 4,
3277
+ autoFocus: true,
3278
+ onChange: (e) => setPersona(e.target.value)
3279
+ }
3280
+ ),
3281
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: l.describeHint })
3282
+ ] }),
3283
+ !isEdit && templates.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", "data-testid": `${id}-templates`, children: [
3284
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { children: l.startFrom }),
3285
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-2", children: templates.map((t) => /* @__PURE__ */ jsxRuntime.jsx(
3286
+ "button",
3287
+ {
3288
+ type: "button",
3289
+ title: t.description,
3290
+ onClick: () => applyTemplate(t),
3291
+ "data-testid": `${id}-template-${t.id}`,
3292
+ className: ui.cn(
3293
+ "rounded-full border border-border px-3 py-1.5 text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11 [&:hover]:bg-accent"
3294
+ ),
3295
+ children: t.title
3296
+ },
3297
+ t.id
3298
+ )) })
3299
+ ] }),
3300
+ /* @__PURE__ */ jsxRuntime.jsxs(
3301
+ "div",
3302
+ {
3303
+ className: "rounded-lg bg-muted p-3 text-sm",
3304
+ "data-testid": `${id}-summary`,
3305
+ "aria-live": "polite",
3306
+ children: [
3307
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-1 flex items-center gap-1.5 text-xs font-medium text-muted-foreground", children: [
3308
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Sparkles, { className: "size-4 text-ai-ink", "aria-hidden": "true" }),
3309
+ l.summaryHeading
3310
+ ] }),
3311
+ summary.map((line) => /* @__PURE__ */ jsxRuntime.jsx("p", { children: line }, line)),
3312
+ /* @__PURE__ */ jsxRuntime.jsx(
3313
+ "button",
3314
+ {
3315
+ type: "button",
3316
+ onClick: () => setAdvancedOpen(true),
3317
+ "data-testid": `${id}-summary-change`,
3318
+ className: "mt-1 text-xs font-medium text-primary underline-offset-2 hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11",
3319
+ children: l.summaryChange
3320
+ }
3321
+ )
3322
+ ]
3323
+ }
3324
+ ),
3325
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-end gap-4", children: [
3326
+ typeof avatar === "function" ? avatar(values) : avatar,
3327
+ !isEdit && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-1.5", children: [
3328
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { htmlFor: "agent-creator-name", children: l.name }),
3329
+ /* @__PURE__ */ jsxRuntime.jsx(
3330
+ ui.Input,
3331
+ {
3332
+ id: "agent-creator-name",
3333
+ "data-testid": `${id}-name`,
3334
+ value: name,
3335
+ placeholder: "research-assistant",
3336
+ "aria-invalid": name !== "" && !nameValid ? true : void 0,
3337
+ onChange: (e) => {
3338
+ setNameTouched(true);
3339
+ patch({ name: e.target.value });
3340
+ }
3341
+ }
3342
+ ),
3343
+ name !== "" && !nameValid && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-destructive", children: l.nameInvalid })
3344
+ ] })
3345
+ ] }),
3346
+ /* @__PURE__ */ jsxRuntime.jsx(
3347
+ chunkWS5EX7DN_cjs.FoldSection,
3348
+ {
3349
+ label: l.advanced,
3350
+ open: advancedOpen,
3351
+ onOpenChange: setAdvancedOpen,
3352
+ testId: `${id}-advanced-toggle`,
3353
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4", children: [
3354
+ !isEdit && types && types.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
3355
+ AgentTypeSelector,
3356
+ {
3357
+ value: values.type,
3358
+ onChange: (type) => patch({ type }),
3359
+ options: types,
3360
+ testId: `${id}-type`,
3361
+ optionTestId: (value) => `${id}-type-${value}`
3362
+ }
3363
+ ),
3364
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
3365
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { children: l.capabilities }),
3366
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: l.toolsHint }),
3367
+ /* @__PURE__ */ jsxRuntime.jsx(CapabilityGrid, { testId: `${id}-capabilities`, children: capabilities.map((c) => /* @__PURE__ */ jsxRuntime.jsx(
3368
+ CapabilityTile,
3369
+ {
3370
+ label: c.label,
3371
+ description: c.description,
3372
+ icon: c.icon,
3373
+ selected: Boolean(values.capabilities[c.key]),
3374
+ onToggle: () => patch({
3375
+ capabilities: {
3376
+ ...values.capabilities,
3377
+ [c.key]: !values.capabilities[c.key]
3378
+ }
3379
+ }),
3380
+ testId: `${id}-cap-${c.key}`
3381
+ },
3382
+ c.key
3383
+ )) })
3384
+ ] }),
3385
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", "data-testid": `${id}-workspaces`, children: [
3386
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { children: l.workspaceAccess }),
3387
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: l.workspaceAccessHint }),
3388
+ workspaces.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: l.noWorkspacesToGrant }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-2", children: workspaces.map((w) => {
3389
+ const already = grantedWorkspaceIds.includes(w.id);
3390
+ const on = already || values.workspaceIds.includes(w.id);
3391
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-1", children: [
3392
+ /* @__PURE__ */ jsxRuntime.jsx(
3393
+ "button",
3394
+ {
3395
+ type: "button",
3396
+ role: "checkbox",
3397
+ "aria-checked": on,
3398
+ disabled: already,
3399
+ title: already ? l.workspaceAlready : void 0,
3400
+ "data-testid": `${id}-workspace-${w.id}`,
3401
+ onClick: () => patch({
3402
+ workspaceIds: on ? values.workspaceIds.filter((x) => x !== w.id) : [...values.workspaceIds, w.id]
3403
+ }),
3404
+ className: ui.cn(
3405
+ "rounded-md border px-3 py-1.5 text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-60 pointer-coarse:min-h-11",
3406
+ on ? "border-primary bg-primary/10 text-primary" : "border-border [&:hover:not(:disabled)]:bg-accent"
3407
+ ),
3408
+ children: w.name
3409
+ }
3410
+ ),
3411
+ already && onRevokeWorkspace && /* @__PURE__ */ jsxRuntime.jsx(
3412
+ "button",
3413
+ {
3414
+ type: "button",
3415
+ "aria-label": l.revokeWorkspace(w.name),
3416
+ title: l.revokeWorkspace(w.name),
3417
+ disabled: revokingWorkspaceId === w.id,
3418
+ "data-testid": `${id}-workspace-${w.id}-revoke`,
3419
+ onClick: () => onRevokeWorkspace(w.id),
3420
+ className: "flex size-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-50 pointer-coarse:size-11",
3421
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "size-4", "aria-hidden": true })
3422
+ }
3423
+ )
3424
+ ] }, w.id);
3425
+ }) })
3426
+ ] }),
3427
+ models.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1.5", children: [
3428
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { children: l.model }),
3429
+ /* @__PURE__ */ jsxRuntime.jsxs(
3430
+ ui.Select,
3431
+ {
3432
+ value: values.modelName || "__auto__",
3433
+ onValueChange: (v) => patch({ modelName: v === "__auto__" ? "" : v }),
3434
+ children: [
3435
+ /* @__PURE__ */ jsxRuntime.jsx(ui.SelectTrigger, { "data-testid": `${id}-model`, className: "pointer-coarse:min-h-11", children: /* @__PURE__ */ jsxRuntime.jsx(ui.SelectValue, {}) }),
3436
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.SelectContent, { children: [
3437
+ /* @__PURE__ */ jsxRuntime.jsx(ui.SelectItem, { value: "__auto__", children: l.modelAuto }),
3438
+ models.map((m) => /* @__PURE__ */ jsxRuntime.jsx(ui.SelectItem, { value: m, children: m }, m))
3439
+ ] })
3440
+ ]
3441
+ }
3442
+ )
3443
+ ] }),
3444
+ typeof advanced === "function" ? advanced(values) : advanced
3445
+ ] })
3446
+ }
3447
+ ),
3448
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col-reverse sm:flex-row sm:justify-end gap-2 border-t border-border pt-3", children: [
3449
+ /* @__PURE__ */ jsxRuntime.jsx(
3450
+ ui.Button,
3451
+ {
3452
+ type: "button",
3453
+ variant: "ghost",
3454
+ onClick: () => onOpenChange(false),
3455
+ "data-testid": `${id}-cancel`,
3456
+ className: "pointer-coarse:min-h-11",
3457
+ children: l.cancel
3458
+ }
3459
+ ),
3460
+ /* @__PURE__ */ jsxRuntime.jsxs(
3461
+ ui.Button,
3462
+ {
3463
+ type: "submit",
3464
+ disabled: !canSubmit,
3465
+ "data-testid": `${id}-submit`,
3466
+ className: "gap-1.5 pointer-coarse:min-h-11",
3467
+ children: [
3468
+ isSaving ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "size-4 animate-spin" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Sparkles, { className: "size-4" }),
3469
+ isSaving ? l.saving : isEdit ? l.save : l.create
3470
+ ]
3471
+ }
3472
+ )
3473
+ ] })
3474
+ ]
3475
+ }
3476
+ )
3477
+ ]
3478
+ }
3479
+ ) });
3480
+ }
3481
+
3482
+ // src/agents/definitions/persona.ts
3483
+ function composePersona(name, description) {
3484
+ const body = description.trim();
3485
+ const preamble = `You are ${name}, an AI agent.`;
3486
+ return body ? `${preamble} ${body}` : preamble;
3487
+ }
3488
+ function stripPersonaPreamble(persona) {
3489
+ return persona.replace(/^You are .+?, an AI agent\.\s*/, "").trim();
3490
+ }
3491
+ function agentCreatorToConfigSection(values, capabilityKeys) {
3492
+ return {
3493
+ PERSONA: composePersona(values.name, values.persona),
3494
+ ...values.modelName ? { AGENT_MODEL_NAME: values.modelName } : {},
3495
+ ...Object.fromEntries(capabilityKeys.map((k) => [k, !!values.capabilities[k]]))
3496
+ };
3497
+ }
3498
+ function agentConfigSectionToValues(section, capabilityKeys) {
3499
+ const s = section ?? {};
3500
+ return {
3501
+ persona: stripPersonaPreamble(String(s.PERSONA ?? "")),
3502
+ modelName: String(s.AGENT_MODEL_NAME ?? ""),
3503
+ capabilities: Object.fromEntries(capabilityKeys.map((k) => [k, Boolean(s[k])]))
3504
+ };
3505
+ }
3506
+ var DEFAULT_AGENT_CAPABILITIES = [
3507
+ {
3508
+ key: "WEB_SEARCH_ENABLED",
3509
+ label: "Web search",
3510
+ description: "Current facts, cited sources",
3511
+ icon: lucideReact.Globe
3512
+ },
3513
+ {
3514
+ key: "RUN_CODE_ENABLED",
3515
+ label: "Run code",
3516
+ description: "Exact numbers, real computation",
3517
+ icon: lucideReact.Terminal
3518
+ },
3519
+ {
3520
+ key: "DEEP_RESEARCH_ENABLED",
3521
+ label: "Deep research",
3522
+ description: "Multi-source investigations",
3523
+ icon: lucideReact.Telescope
3524
+ },
3525
+ {
3526
+ key: "PLANNING_ENABLED",
3527
+ label: "Planning",
3528
+ description: "Plans complex work first",
3529
+ icon: lucideReact.ListChecks
3530
+ },
3531
+ {
3532
+ key: "ARTIFACTS_ENABLED",
3533
+ label: "Documents",
3534
+ description: "Drafts and edits documents",
3535
+ icon: lucideReact.FileText
3536
+ },
3537
+ {
3538
+ key: "IMAGE_ENABLED",
3539
+ label: "Images",
3540
+ description: "Generates and edits images",
3541
+ icon: lucideReact.ImageIcon
3542
+ },
3543
+ { key: "MEMORY_ENABLED", label: "Memory", description: "Remembers across sessions", icon: lucideReact.Brain },
3544
+ { key: "SKILLS_ENABLED", label: "Skills", description: "May follow your skills", icon: lucideReact.Wand2 }
3545
+ ];
3546
+ var DEFAULT_AGENT_TEMPLATES = [
3547
+ {
3548
+ id: "researcher",
3549
+ title: "Researcher",
3550
+ description: "Looks things up and cites its sources",
3551
+ persona: "Researches a question thoroughly, reads the best sources, and cites every claim. Says plainly when something could not be confirmed.",
3552
+ capabilities: ["WEB_SEARCH_ENABLED", "DEEP_RESEARCH_ENABLED", "PLANNING_ENABLED"]
3553
+ },
3554
+ {
3555
+ id: "analyst",
3556
+ title: "Analyst",
3557
+ description: "Works through numbers and data",
3558
+ persona: "Works through data carefully, checks its arithmetic by running code, and explains how it reached each figure.",
3559
+ capabilities: ["RUN_CODE_ENABLED", "PLANNING_ENABLED", "ARTIFACTS_ENABLED"]
3560
+ },
3561
+ {
3562
+ id: "note-taker",
3563
+ title: "Note taker",
3564
+ description: "Keeps notes and remembers context",
3565
+ persona: "Keeps concise notes, remembers what matters between sessions, and drafts clean summaries on request.",
3566
+ capabilities: ["MEMORY_ENABLED", "ARTIFACTS_ENABLED"]
3567
+ },
3568
+ { id: "blank", title: "Blank", description: "Start from nothing", persona: "", capabilities: [] }
3569
+ ];
3570
+ var DEFAULT_AGENT_TYPES = [
3571
+ {
3572
+ value: "builtin",
3573
+ title: "Built-in",
3574
+ description: "Runs on ARBI\u2019s servers \u2014 woken by tasks and messages."
3575
+ },
3576
+ {
3577
+ value: "external",
3578
+ title: "External",
3579
+ description: "Connect a Claude or OpenClaw runtime from your machine."
3580
+ }
3581
+ ];
3582
+ function AgentConnectInstructions({ email, signingKey }) {
3583
+ const { notify, runtimeConfig } = chunkC4WSHRR6_cjs.useBlocksEnvironment();
3584
+ const [agentBackend, setAgentBackend] = react.useState("claude");
3585
+ const [copied, setCopied] = react.useState(false);
3586
+ const setupScript = react.useMemo(
3587
+ () => [
3588
+ "npm install -g @arbidocs/cli",
3589
+ `arbi config set-url https://${runtimeConfig.deploymentDomain}`,
3590
+ `arbi login --email ${email} --signing-key ${signingKey}`,
3591
+ `arbi listen --agent ${agentBackend}`
3592
+ ].join("\n"),
3593
+ [email, signingKey, agentBackend, runtimeConfig.deploymentDomain]
3594
+ );
3595
+ const handleCopy = react.useCallback(async () => {
3596
+ try {
3597
+ await navigator.clipboard.writeText(setupScript);
3598
+ setCopied(true);
3599
+ notify("Setup commands copied", "success");
3600
+ setTimeout(() => setCopied(false), 2e3);
3601
+ } catch {
3602
+ notify("Failed to copy", "error");
3603
+ }
3604
+ }, [setupScript, notify]);
3605
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3606
+ "div",
3607
+ {
3608
+ className: "space-y-2 rounded-lg border border-yellow-border bg-yellow-bg/60 p-3",
3609
+ "data-testid": "agent-connect-instructions",
3610
+ children: [
3611
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-3", children: [
3612
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium", children: "Connect it \u2014 run on the agent machine:" }),
3613
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
3614
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { htmlFor: "agent-backend", className: "text-xs text-muted-foreground", children: "Runtime" }),
3615
+ /* @__PURE__ */ jsxRuntime.jsxs(
3616
+ "select",
3617
+ {
3618
+ id: "agent-backend",
3619
+ value: agentBackend,
3620
+ onChange: (e) => setAgentBackend(e.target.value),
3621
+ className: "h-7 rounded-md border border-input bg-background px-2 text-xs",
3622
+ "data-testid": "agent-backend-select",
3623
+ children: [
3624
+ /* @__PURE__ */ jsxRuntime.jsx("option", { value: "claude", children: "claude" }),
3625
+ /* @__PURE__ */ jsxRuntime.jsx("option", { value: "openclaw", children: "openclaw" })
3626
+ ]
3627
+ }
3628
+ )
3629
+ ] })
3630
+ ] }),
3631
+ /* @__PURE__ */ jsxRuntime.jsx(
3632
+ "pre",
3633
+ {
3634
+ className: "select-all whitespace-pre-wrap break-all rounded-md bg-muted p-3 text-xs font-mono leading-relaxed",
3635
+ "data-testid": "agent-setup-script",
3636
+ children: setupScript
3637
+ }
3638
+ ),
3639
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-2", children: [
3640
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: "The signing key is shown only once \u2014 copy it now. It cannot be recovered." }),
3641
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Button, { variant: "outline", size: "sm", onClick: handleCopy, className: "shrink-0", children: [
3642
+ copied ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "mr-2 h-4 w-4" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Copy, { className: "mr-2 h-4 w-4" }),
3643
+ "Copy"
3644
+ ] })
3645
+ ] })
3646
+ ]
3647
+ }
3648
+ );
3649
+ }
2977
3650
  function SkillTypeBadge({ type, className }) {
2978
3651
  return /* @__PURE__ */ jsxRuntime.jsx(
2979
3652
  "span",
@@ -4343,7 +5016,7 @@ function WorkflowsTable(props) {
4343
5016
  ariaLabel: l.searchLabel,
4344
5017
  testIds: { input: "workflow-search" },
4345
5018
  filter: /* @__PURE__ */ jsxRuntime.jsx(
4346
- chunkRQ2Y7USX_cjs.TriStateFilterMenu,
5019
+ chunkMIDXCYZB_cjs.TriStateFilterMenu,
4347
5020
  {
4348
5021
  testId: "automations-filter-button",
4349
5022
  open: filterOpen,
@@ -4645,12 +5318,189 @@ function TaskActivityTimeline({
4645
5318
  );
4646
5319
  }) });
4647
5320
  }
5321
+ function TaskActivityDialog({
5322
+ open,
5323
+ onOpenChange,
5324
+ taskName,
5325
+ events,
5326
+ isLoading,
5327
+ isError,
5328
+ labels,
5329
+ testId,
5330
+ ...timeline
5331
+ }) {
5332
+ const l = { ...DEFAULT_TASK_ACTIVITY_LABELS, ...labels };
5333
+ const id = chunkMHVNT4J3_cjs.testIdOr(testId, { testId: "task-activity" });
5334
+ const count = events?.length ?? 0;
5335
+ const scrollToEnd = react.useCallback(
5336
+ (el) => {
5337
+ if (count >= 0) el?.scrollIntoView?.({ block: "end" });
5338
+ },
5339
+ [count]
5340
+ );
5341
+ return /* @__PURE__ */ jsxRuntime.jsx(ui.Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.DialogContent, { presentation: "sheet", className: "max-h-[80dvh] sm:max-w-lg", "data-testid": id, children: [
5342
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.DialogHeader, { children: [
5343
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DialogTitle, { children: l.title }),
5344
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DialogDescription, { className: "truncate", children: taskName })
5345
+ ] }),
5346
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-h-[55dvh] overflow-y-auto pr-1", "data-testid": `${id}-scroll`, children: [
5347
+ isLoading && !events ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: l.loading }) : isError && !events ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-destructive", children: l.error }) : count === 0 ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: l.empty }) : /* @__PURE__ */ jsxRuntime.jsx(TaskActivityTimeline, { events: events ?? [], labels, testId: id, ...timeline }),
5348
+ /* @__PURE__ */ jsxRuntime.jsx("div", { ref: scrollToEnd })
5349
+ ] })
5350
+ ] }) });
5351
+ }
5352
+ var DEFAULT_TASK_RUNS_DIALOG_LABELS = {
5353
+ title: (taskName) => `Run history \u2014 ${taskName}`,
5354
+ description: "Every time this task ran. Open a run to read or watch it in its conversation.",
5355
+ loading: "Loading runs\u2026",
5356
+ empty: "This task hasn\u2019t run yet.",
5357
+ open: "Open"
5358
+ };
5359
+ var STATUS_STYLE = {
5360
+ running: "bg-ai-soft text-ai-ink",
5361
+ success: "bg-green-bg text-green-text",
5362
+ completed: "bg-green-bg text-green-text",
5363
+ failed: "bg-red-bg text-red-text"
5364
+ };
5365
+ function TaskRunsDialog({
5366
+ inline = false,
5367
+ renderErrorReport,
5368
+ hideHeader = false,
5369
+ open,
5370
+ onOpenChange,
5371
+ taskName,
5372
+ runs,
5373
+ isLoading,
5374
+ onOpenRun,
5375
+ onOpenResult,
5376
+ getRunHref,
5377
+ testIds,
5378
+ labels
5379
+ }) {
5380
+ const l = { ...DEFAULT_TASK_RUNS_DIALOG_LABELS, ...labels };
5381
+ const columns = react.useMemo(
5382
+ () => [
5383
+ {
5384
+ colId: "status",
5385
+ field: "status",
5386
+ headerName: "Status",
5387
+ width: 160,
5388
+ minWidth: 140,
5389
+ cellRenderer: ({ data }) => data && /* @__PURE__ */ jsxRuntime.jsx(
5390
+ "span",
5391
+ {
5392
+ className: ui.cn(
5393
+ "rounded-full px-2 py-0.5 text-xs font-medium capitalize",
5394
+ STATUS_STYLE[data.status] ?? "text-muted-foreground"
5395
+ ),
5396
+ children: workflowRunStatusLabel(data.status)
5397
+ }
5398
+ )
5399
+ },
5400
+ { colId: "when", field: "when", headerName: "Run", flex: 2, minWidth: 240 },
5401
+ {
5402
+ colId: "result",
5403
+ headerName: "",
5404
+ width: 280,
5405
+ minWidth: 220,
5406
+ sortable: false,
5407
+ cellRenderer: ({ data: run }) => {
5408
+ if (!run) return null;
5409
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full items-center gap-2", children: [
5410
+ run.error && renderErrorReport?.(run),
5411
+ (run.conversationId || run.resultId && onOpenResult) && /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { asChild: true, variant: "ghost", size: "sm", className: "h-7 gap-1.5", children: /* @__PURE__ */ jsxRuntime.jsxs(
5412
+ chunkR26BK7YL_cjs.ActionLink,
5413
+ {
5414
+ href: getRunHref?.(run),
5415
+ onSelect: () => {
5416
+ if (run.conversationId) onOpenRun(run.conversationId);
5417
+ else if (run.resultId) onOpenResult?.(run.resultId);
5418
+ onOpenChange(false);
5419
+ },
5420
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.open, { testId: "task-run-open" }),
5421
+ children: [
5422
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Eye, { size: 13 }),
5423
+ " ",
5424
+ l.open
5425
+ ]
5426
+ }
5427
+ ) })
5428
+ ] });
5429
+ }
5430
+ }
5431
+ ],
5432
+ [onOpenRun, onOpenResult, getRunHref, onOpenChange, testIds?.open, l.open, renderErrorReport]
5433
+ );
5434
+ const content = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
5435
+ hideHeader ? null : inline ? /* @__PURE__ */ jsxRuntime.jsx(
5436
+ chunk7RGLTF76_cjs.TabHeader,
5437
+ {
5438
+ tabs: [
5439
+ {
5440
+ id: "history",
5441
+ label: l.title(taskName),
5442
+ count: runs.length,
5443
+ countIcon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.History, { size: 14 }),
5444
+ presentation: "count",
5445
+ onClose: () => onOpenChange(false)
5446
+ }
5447
+ ],
5448
+ activeTabId: "history",
5449
+ onTabChange: () => {
5450
+ }
5451
+ }
5452
+ ) : /* @__PURE__ */ jsxRuntime.jsxs(ui.DialogHeader, { children: [
5453
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.DialogTitle, { className: "flex items-center gap-2", children: [
5454
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.History, { size: 16 }),
5455
+ " ",
5456
+ l.title(taskName)
5457
+ ] }),
5458
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DialogDescription, { children: l.description })
5459
+ ] }),
5460
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
5461
+ chunkC2CWWEHO_cjs.GridView,
5462
+ {
5463
+ testId: chunkMHVNT4J3_cjs.testIdOr(testIds?.list, { testId: "task-runs-list" }),
5464
+ gridId: "workflow-runs",
5465
+ items: runs,
5466
+ columnDefs: columns,
5467
+ getItemId: (run) => run.id,
5468
+ getRowTestId: () => chunkMHVNT4J3_cjs.testIdOr(testIds?.row, { testId: "task-run-row" }),
5469
+ isLoading,
5470
+ loadingMessage: l.loading,
5471
+ emptyState: { title: l.empty },
5472
+ height: "100%"
5473
+ }
5474
+ ) })
5475
+ ] });
5476
+ return inline ? /* @__PURE__ */ jsxRuntime.jsx("section", { className: "flex min-h-0 flex-1 flex-col", "data-testid": "automation-history", children: content }) : /* @__PURE__ */ jsxRuntime.jsx(ui.Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxRuntime.jsx(
5477
+ ui.DialogContent,
5478
+ {
5479
+ presentation: "sheet",
5480
+ className: "flex h-[min(32rem,calc(100dvh-2rem))] min-h-0 max-w-3xl flex-col",
5481
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.modal, { testId: "task-runs-modal" }),
5482
+ children: content
5483
+ }
5484
+ ) });
5485
+ }
4648
5486
 
4649
5487
  exports.ActionStepBody = ActionStepBody;
5488
+ exports.AgentAvatarField = AgentAvatarField;
5489
+ exports.AgentConnectInstructions = AgentConnectInstructions;
5490
+ exports.AgentCreator = AgentCreator;
4650
5491
  exports.AgentSelect = AgentSelect;
5492
+ exports.AgentTypeSelector = AgentTypeSelector;
4651
5493
  exports.ApprovalEvidence = ApprovalEvidence;
4652
5494
  exports.AssigneeLine = AssigneeLine;
5495
+ exports.CapabilityGrid = CapabilityGrid;
5496
+ exports.CapabilityTile = CapabilityTile;
5497
+ exports.DEFAULT_AGENT_AVATAR_FIELD_LABELS = DEFAULT_AGENT_AVATAR_FIELD_LABELS;
5498
+ exports.DEFAULT_AGENT_CAPABILITIES = DEFAULT_AGENT_CAPABILITIES;
5499
+ exports.DEFAULT_AGENT_CREATOR_LABELS = DEFAULT_AGENT_CREATOR_LABELS;
4653
5500
  exports.DEFAULT_AGENT_SELECT_LABELS = DEFAULT_AGENT_SELECT_LABELS;
5501
+ exports.DEFAULT_AGENT_TEMPLATES = DEFAULT_AGENT_TEMPLATES;
5502
+ exports.DEFAULT_AGENT_TYPES = DEFAULT_AGENT_TYPES;
5503
+ exports.DEFAULT_AGENT_TYPE_SELECTOR_LABELS = DEFAULT_AGENT_TYPE_SELECTOR_LABELS;
4654
5504
  exports.DEFAULT_SCHEMA_FORM_LABELS = DEFAULT_SCHEMA_FORM_LABELS;
4655
5505
  exports.DEFAULT_SKILL_EDIT_FORM_LABELS = DEFAULT_SKILL_EDIT_FORM_LABELS;
4656
5506
  exports.DEFAULT_SKILL_GENERATE_FORM_LABELS = DEFAULT_SKILL_GENERATE_FORM_LABELS;
@@ -4658,6 +5508,7 @@ exports.DEFAULT_SKILL_GLOBAL_BADGE_LABELS = DEFAULT_SKILL_GLOBAL_BADGE_LABELS;
4658
5508
  exports.DEFAULT_SKILL_VIEW_TOGGLE_LABELS = DEFAULT_SKILL_VIEW_TOGGLE_LABELS;
4659
5509
  exports.DEFAULT_STEP_BAR_LABELS = DEFAULT_STEP_BAR_LABELS;
4660
5510
  exports.DEFAULT_TASK_ACTIVITY_LABELS = DEFAULT_TASK_ACTIVITY_LABELS;
5511
+ exports.DEFAULT_TASK_RUNS_DIALOG_LABELS = DEFAULT_TASK_RUNS_DIALOG_LABELS;
4661
5512
  exports.DEFAULT_TASK_TRIGGER_CHIP_LABELS = DEFAULT_TASK_TRIGGER_CHIP_LABELS;
4662
5513
  exports.DEFAULT_WORKFLOW_CONFIG_DIALOG_LABELS = DEFAULT_WORKFLOW_CONFIG_DIALOG_LABELS;
4663
5514
  exports.DEFAULT_WORKFLOW_DOCUMENTS_FIELD_LABELS = DEFAULT_WORKFLOW_DOCUMENTS_FIELD_LABELS;
@@ -4687,7 +5538,9 @@ exports.SkillTile = SkillTile;
4687
5538
  exports.SkillTypeBadge = SkillTypeBadge;
4688
5539
  exports.SkillViewToggle = SkillViewToggle;
4689
5540
  exports.StepBarFrame = StepBarFrame;
5541
+ exports.TaskActivityDialog = TaskActivityDialog;
4690
5542
  exports.TaskActivityTimeline = TaskActivityTimeline;
5543
+ exports.TaskRunsDialog = TaskRunsDialog;
4691
5544
  exports.TaskTriggerChip = TaskTriggerChip;
4692
5545
  exports.WORKFLOW_COLUMN_ORDER = WORKFLOW_COLUMN_ORDER;
4693
5546
  exports.WorkflowConfigDialog = WorkflowConfigDialog;
@@ -4698,10 +5551,14 @@ exports.WorkflowStepBar = WorkflowStepBar;
4698
5551
  exports.WorkflowsTable = WorkflowsTable;
4699
5552
  exports.activateOnKey = activateOnKey;
4700
5553
  exports.activeStepId = activeStepId;
5554
+ exports.agentConfigSectionToValues = agentConfigSectionToValues;
5555
+ exports.agentCreatorToConfigSection = agentCreatorToConfigSection;
4701
5556
  exports.buildLibrarySkills = buildLibrarySkills;
4702
5557
  exports.buildWorkflowScopeSource = buildWorkflowScopeSource;
4703
5558
  exports.buildZipSkillImport = buildZipSkillImport;
5559
+ exports.composePersona = composePersona;
4704
5560
  exports.createWorkflowColumns = createWorkflowColumns;
5561
+ exports.deriveAgentName = deriveAgentName;
4705
5562
  exports.documentScopeLabels = documentScopeLabels;
4706
5563
  exports.filterLibrarySkills = filterLibrarySkills;
4707
5564
  exports.fromPlanAssignee = fromPlanAssignee;
@@ -4714,6 +5571,7 @@ exports.importSkillFromUrl = importSkillFromUrl;
4714
5571
  exports.isIncompleteSignal = isIncompleteSignal;
4715
5572
  exports.isMainSkillFile = isMainSkillFile;
4716
5573
  exports.isSkillRow = isSkillRow;
5574
+ exports.isValidAgentName = isValidAgentName;
4717
5575
  exports.layoutFromPlanSteps = layoutFromPlanSteps;
4718
5576
  exports.matchWorkflowScope = matchWorkflowScope;
4719
5577
  exports.parseSkillFrontmatter = parseSkillFrontmatter;
@@ -4721,6 +5579,9 @@ exports.readSkillArchive = readSkillArchive;
4721
5579
  exports.serializeSkill = serializeSkill;
4722
5580
  exports.skillSlug = skillSlug;
4723
5581
  exports.stepWindow = stepWindow;
5582
+ exports.stripPersonaPreamble = stripPersonaPreamble;
5583
+ exports.summarizeAgent = summarizeAgent;
5584
+ exports.summarizeCapabilities = summarizeCapabilities;
4724
5585
  exports.taskActivityHeadline = taskActivityHeadline;
4725
5586
  exports.toPlanAssignee = toPlanAssignee;
4726
5587
  exports.toPlanDocumentRef = toPlanDocumentRef;
@@ -4728,9 +5589,8 @@ exports.toPlanSteps = toPlanSteps;
4728
5589
  exports.useControllableState = useControllableState;
4729
5590
  exports.useWorkflowView = useWorkflowView;
4730
5591
  exports.workflowFromSkillMarkdown = workflowFromSkillMarkdown;
4731
- exports.workflowRunStatusLabel = workflowRunStatusLabel;
4732
5592
  exports.workflowStatus = workflowStatus;
4733
5593
  exports.workflowToSkillMarkdown = workflowToSkillMarkdown;
4734
5594
  exports.workflowTriggerType = workflowTriggerType;
4735
- //# sourceMappingURL=chunk-3BI6EWKP.cjs.map
4736
- //# sourceMappingURL=chunk-3BI6EWKP.cjs.map
5595
+ //# sourceMappingURL=chunk-DAIHYDK6.cjs.map
5596
+ //# sourceMappingURL=chunk-DAIHYDK6.cjs.map