@contractspec/example.agent-console 3.7.6 → 3.7.7

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 (175) hide show
  1. package/.turbo/turbo-build.log +18 -18
  2. package/AGENTS.md +50 -31
  3. package/README.md +69 -77
  4. package/dist/agent/agent.event.js +1 -1
  5. package/dist/agent/agent.operation.js +1 -1
  6. package/dist/agent/index.d.ts +5 -5
  7. package/dist/agent/index.js +1 -1
  8. package/dist/browser/agent/agent.event.js +1 -1
  9. package/dist/browser/agent/agent.operation.js +1 -1
  10. package/dist/browser/agent/index.js +1 -1
  11. package/dist/browser/index.js +2145 -2145
  12. package/dist/browser/presentations/index.js +4 -4
  13. package/dist/browser/run/index.js +536 -536
  14. package/dist/browser/run/run.event.js +2 -2
  15. package/dist/browser/run/run.presentation.js +2 -2
  16. package/dist/browser/tool/index.js +260 -260
  17. package/dist/browser/tool/tool.event.js +1 -1
  18. package/dist/browser/tool/tool.presentation.js +2 -2
  19. package/dist/browser/ui/AgentDashboard.js +956 -956
  20. package/dist/browser/ui/AgentRunList.js +16 -16
  21. package/dist/browser/ui/AgentToolRegistry.js +9 -9
  22. package/dist/browser/ui/hooks/index.js +153 -153
  23. package/dist/browser/ui/hooks/useAgentList.js +1 -1
  24. package/dist/browser/ui/hooks/useAgentMutations.js +1 -1
  25. package/dist/browser/ui/hooks/useRunList.js +1 -1
  26. package/dist/browser/ui/hooks/useToolList.js +1 -1
  27. package/dist/browser/ui/index.js +1222 -1222
  28. package/dist/browser/ui/modals/AgentActionsModal.js +13 -13
  29. package/dist/browser/ui/modals/CreateAgentModal.js +15 -15
  30. package/dist/browser/ui/modals/index.js +297 -297
  31. package/dist/browser/ui/renderers/agent-list.renderer.js +7 -7
  32. package/dist/browser/ui/renderers/index.js +157 -157
  33. package/dist/browser/ui/views/AgentListView.js +7 -7
  34. package/dist/browser/ui/views/RunListView.js +16 -16
  35. package/dist/browser/ui/views/ToolRegistryView.js +9 -9
  36. package/dist/browser/ui/views/index.js +97 -97
  37. package/dist/handlers/index.d.ts +1 -1
  38. package/dist/index.d.ts +4 -4
  39. package/dist/index.js +2145 -2145
  40. package/dist/node/agent/agent.event.js +1 -1
  41. package/dist/node/agent/agent.operation.js +1 -1
  42. package/dist/node/agent/index.js +1 -1
  43. package/dist/node/index.js +2145 -2145
  44. package/dist/node/presentations/index.js +4 -4
  45. package/dist/node/run/index.js +536 -536
  46. package/dist/node/run/run.event.js +2 -2
  47. package/dist/node/run/run.presentation.js +2 -2
  48. package/dist/node/tool/index.js +260 -260
  49. package/dist/node/tool/tool.event.js +1 -1
  50. package/dist/node/tool/tool.presentation.js +2 -2
  51. package/dist/node/ui/AgentDashboard.js +956 -956
  52. package/dist/node/ui/AgentRunList.js +16 -16
  53. package/dist/node/ui/AgentToolRegistry.js +9 -9
  54. package/dist/node/ui/hooks/index.js +153 -153
  55. package/dist/node/ui/hooks/useAgentList.js +1 -1
  56. package/dist/node/ui/hooks/useAgentMutations.js +1 -1
  57. package/dist/node/ui/hooks/useRunList.js +1 -1
  58. package/dist/node/ui/hooks/useToolList.js +1 -1
  59. package/dist/node/ui/index.js +1222 -1222
  60. package/dist/node/ui/modals/AgentActionsModal.js +13 -13
  61. package/dist/node/ui/modals/CreateAgentModal.js +15 -15
  62. package/dist/node/ui/modals/index.js +297 -297
  63. package/dist/node/ui/renderers/agent-list.renderer.js +7 -7
  64. package/dist/node/ui/renderers/index.js +157 -157
  65. package/dist/node/ui/views/AgentListView.js +7 -7
  66. package/dist/node/ui/views/RunListView.js +16 -16
  67. package/dist/node/ui/views/ToolRegistryView.js +9 -9
  68. package/dist/node/ui/views/index.js +97 -97
  69. package/dist/presentations/index.d.ts +3 -5
  70. package/dist/presentations/index.js +4 -4
  71. package/dist/run/index.d.ts +7 -7
  72. package/dist/run/index.js +536 -536
  73. package/dist/run/run.event.js +2 -2
  74. package/dist/run/run.handler.d.ts +3 -0
  75. package/dist/run/run.presentation.js +2 -2
  76. package/dist/shared/index.d.ts +1 -1
  77. package/dist/tool/index.d.ts +7 -7
  78. package/dist/tool/index.js +260 -260
  79. package/dist/tool/tool.event.js +1 -1
  80. package/dist/tool/tool.handler.d.ts +1 -1
  81. package/dist/tool/tool.presentation.js +2 -2
  82. package/dist/ui/AgentDashboard.js +956 -956
  83. package/dist/ui/AgentRunList.js +16 -16
  84. package/dist/ui/AgentToolRegistry.js +9 -9
  85. package/dist/ui/hooks/index.d.ts +4 -4
  86. package/dist/ui/hooks/index.js +153 -153
  87. package/dist/ui/hooks/useAgentList.d.ts +5 -0
  88. package/dist/ui/hooks/useAgentList.js +1 -1
  89. package/dist/ui/hooks/useAgentMutations.d.ts +9 -2
  90. package/dist/ui/hooks/useAgentMutations.js +1 -1
  91. package/dist/ui/hooks/useRunList.d.ts +5 -0
  92. package/dist/ui/hooks/useRunList.js +1 -1
  93. package/dist/ui/hooks/useToolList.d.ts +5 -0
  94. package/dist/ui/hooks/useToolList.js +1 -1
  95. package/dist/ui/index.d.ts +3 -3
  96. package/dist/ui/index.js +1222 -1222
  97. package/dist/ui/modals/AgentActionsModal.js +13 -13
  98. package/dist/ui/modals/CreateAgentModal.js +15 -15
  99. package/dist/ui/modals/index.d.ts +1 -1
  100. package/dist/ui/modals/index.js +297 -297
  101. package/dist/ui/renderers/agent-list.markdown.d.ts +5 -0
  102. package/dist/ui/renderers/agent-list.renderer.js +7 -7
  103. package/dist/ui/renderers/dashboard.markdown.d.ts +5 -0
  104. package/dist/ui/renderers/index.d.ts +2 -2
  105. package/dist/ui/renderers/index.js +157 -157
  106. package/dist/ui/renderers/run-list.markdown.d.ts +5 -0
  107. package/dist/ui/renderers/tool-registry.markdown.d.ts +5 -0
  108. package/dist/ui/views/AgentListView.js +7 -7
  109. package/dist/ui/views/RunListView.js +16 -16
  110. package/dist/ui/views/ToolRegistryView.js +9 -9
  111. package/dist/ui/views/index.js +97 -97
  112. package/package.json +6 -6
  113. package/src/agent/agent.entity.ts +111 -111
  114. package/src/agent/agent.enum.ts +12 -12
  115. package/src/agent/agent.event.ts +91 -91
  116. package/src/agent/agent.handler.ts +123 -123
  117. package/src/agent/agent.operation.ts +400 -400
  118. package/src/agent/agent.presentation.ts +62 -62
  119. package/src/agent/agent.schema.ts +175 -175
  120. package/src/agent/agent.test-spec.ts +48 -48
  121. package/src/agent/index.ts +46 -51
  122. package/src/agent.capability.ts +11 -11
  123. package/src/agent.feature.ts +131 -131
  124. package/src/docs/agent-console.docblock.ts +42 -42
  125. package/src/example.ts +35 -35
  126. package/src/handlers/agent.handlers.ts +522 -521
  127. package/src/handlers/index.ts +12 -12
  128. package/src/index.ts +8 -9
  129. package/src/presentations/index.ts +11 -13
  130. package/src/run/index.ts +49 -54
  131. package/src/run/run.entity.ts +137 -137
  132. package/src/run/run.enum.ts +18 -18
  133. package/src/run/run.event.ts +174 -174
  134. package/src/run/run.handler.ts +92 -91
  135. package/src/run/run.operation.ts +474 -474
  136. package/src/run/run.presentation.ts +42 -42
  137. package/src/run/run.schema.ts +126 -126
  138. package/src/run/run.test-spec.ts +48 -48
  139. package/src/seeders/index.ts +21 -21
  140. package/src/shared/index.ts +1 -1
  141. package/src/shared/mock-agents.ts +76 -76
  142. package/src/shared/mock-runs.ts +102 -102
  143. package/src/shared/mock-tools.ts +140 -140
  144. package/src/shared/overlay-types.ts +23 -23
  145. package/src/tool/index.ts +39 -44
  146. package/src/tool/tool.entity.ts +73 -73
  147. package/src/tool/tool.enum.ts +13 -13
  148. package/src/tool/tool.event.ts +80 -80
  149. package/src/tool/tool.handler.ts +102 -102
  150. package/src/tool/tool.operation.ts +328 -328
  151. package/src/tool/tool.presentation.ts +43 -43
  152. package/src/tool/tool.schema.ts +106 -106
  153. package/src/tool/tool.test-spec.ts +48 -48
  154. package/src/ui/AgentDashboard.tsx +348 -348
  155. package/src/ui/hooks/index.ts +7 -7
  156. package/src/ui/hooks/useAgentList.ts +57 -56
  157. package/src/ui/hooks/useAgentMutations.ts +160 -159
  158. package/src/ui/hooks/useRunList.ts +58 -57
  159. package/src/ui/hooks/useToolList.ts +102 -101
  160. package/src/ui/index.ts +6 -9
  161. package/src/ui/modals/AgentActionsModal.tsx +262 -262
  162. package/src/ui/modals/CreateAgentModal.tsx +232 -232
  163. package/src/ui/modals/index.ts +1 -1
  164. package/src/ui/overlays/demo-overlays.ts +52 -52
  165. package/src/ui/renderers/agent-list.markdown.ts +61 -60
  166. package/src/ui/renderers/agent-list.renderer.tsx +14 -14
  167. package/src/ui/renderers/dashboard.markdown.ts +140 -139
  168. package/src/ui/renderers/index.ts +3 -4
  169. package/src/ui/renderers/run-list.markdown.ts +48 -47
  170. package/src/ui/renderers/tool-registry.markdown.ts +66 -65
  171. package/src/ui/views/AgentListView.tsx +90 -90
  172. package/src/ui/views/RunListView.tsx +141 -141
  173. package/src/ui/views/ToolRegistryView.tsx +113 -113
  174. package/tsconfig.json +7 -8
  175. package/tsdown.config.js +7 -3
@@ -1,250 +1,9 @@
1
1
  // @bun
2
- // src/ui/modals/CreateAgentModal.tsx
2
+ // src/ui/modals/AgentActionsModal.tsx
3
+ import { Button } from "@contractspec/lib.design-system";
3
4
  import { useState } from "react";
4
- import { Button, Input } from "@contractspec/lib.design-system";
5
5
  import { jsxDEV } from "react/jsx-dev-runtime";
6
6
  "use client";
7
- var MODEL_PROVIDERS = [
8
- {
9
- value: "openai",
10
- label: "OpenAI",
11
- models: ["gpt-5.4", "gpt-5-mini", "gpt-4o", "gpt-4-turbo", "gpt-3.5-turbo"]
12
- },
13
- {
14
- value: "anthropic",
15
- label: "Anthropic",
16
- models: ["claude-sonnet-4-6", "claude-opus-4-6", "claude-haiku-4-5"]
17
- },
18
- {
19
- value: "google",
20
- label: "Google",
21
- models: [
22
- "gemini-2.5-flash",
23
- "gemini-2.5-pro",
24
- "gemini-pro",
25
- "gemini-ultra"
26
- ]
27
- },
28
- {
29
- value: "mistral",
30
- label: "Mistral",
31
- models: [
32
- "mistral-large-2512",
33
- "mistral-large-latest",
34
- "mistral-medium-latest",
35
- "mistral-small-latest"
36
- ]
37
- }
38
- ];
39
- function CreateAgentModal({
40
- isOpen,
41
- onClose,
42
- onSubmit,
43
- isLoading = false
44
- }) {
45
- const [name, setName] = useState("");
46
- const [description, setDescription] = useState("");
47
- const [modelProvider, setModelProvider] = useState("openai");
48
- const [modelName, setModelName] = useState("gpt-5.4");
49
- const [systemPrompt, setSystemPrompt] = useState("");
50
- const [error, setError] = useState(null);
51
- const selectedProvider = MODEL_PROVIDERS.find((p) => p.value === modelProvider);
52
- const handleSubmit = async (e) => {
53
- e.preventDefault();
54
- setError(null);
55
- if (!name.trim()) {
56
- setError("Agent name is required");
57
- return;
58
- }
59
- try {
60
- await onSubmit({
61
- name: name.trim(),
62
- description: description.trim() || undefined,
63
- modelProvider,
64
- modelName,
65
- systemPrompt: systemPrompt.trim() || undefined
66
- });
67
- setName("");
68
- setDescription("");
69
- setModelProvider("openai");
70
- setModelName("gpt-5.4");
71
- setSystemPrompt("");
72
- onClose();
73
- } catch (err) {
74
- setError(err instanceof Error ? err.message : "Failed to create agent");
75
- }
76
- };
77
- const handleProviderChange = (provider) => {
78
- setModelProvider(provider);
79
- const providerConfig = MODEL_PROVIDERS.find((p) => p.value === provider);
80
- if (providerConfig) {
81
- setModelName(providerConfig.models[0]);
82
- }
83
- };
84
- if (!isOpen)
85
- return null;
86
- return /* @__PURE__ */ jsxDEV("div", {
87
- className: "fixed inset-0 z-50 flex items-center justify-center",
88
- children: [
89
- /* @__PURE__ */ jsxDEV("div", {
90
- className: "bg-background/80 absolute inset-0 backdrop-blur-sm",
91
- onClick: onClose,
92
- role: "button",
93
- tabIndex: 0,
94
- onKeyDown: (e) => {
95
- if (e.key === "Enter" || e.key === " ")
96
- onClose();
97
- },
98
- "aria-label": "Close modal"
99
- }, undefined, false, undefined, this),
100
- /* @__PURE__ */ jsxDEV("div", {
101
- className: "bg-card border-border relative z-10 max-h-[90vh] w-full max-w-lg overflow-y-auto rounded-xl border p-6 shadow-xl",
102
- children: [
103
- /* @__PURE__ */ jsxDEV("h2", {
104
- className: "mb-4 text-xl font-semibold",
105
- children: "Create New Agent"
106
- }, undefined, false, undefined, this),
107
- /* @__PURE__ */ jsxDEV("form", {
108
- onSubmit: handleSubmit,
109
- className: "space-y-4",
110
- children: [
111
- /* @__PURE__ */ jsxDEV("div", {
112
- children: [
113
- /* @__PURE__ */ jsxDEV("label", {
114
- htmlFor: "agent-name",
115
- className: "text-muted-foreground mb-1 block text-sm font-medium",
116
- children: "Agent Name *"
117
- }, undefined, false, undefined, this),
118
- /* @__PURE__ */ jsxDEV(Input, {
119
- id: "agent-name",
120
- value: name,
121
- onChange: (e) => setName(e.target.value),
122
- placeholder: "e.g., Customer Support Bot",
123
- disabled: isLoading
124
- }, undefined, false, undefined, this)
125
- ]
126
- }, undefined, true, undefined, this),
127
- /* @__PURE__ */ jsxDEV("div", {
128
- children: [
129
- /* @__PURE__ */ jsxDEV("label", {
130
- htmlFor: "agent-description",
131
- className: "text-muted-foreground mb-1 block text-sm font-medium",
132
- children: "Description"
133
- }, undefined, false, undefined, this),
134
- /* @__PURE__ */ jsxDEV("textarea", {
135
- id: "agent-description",
136
- value: description,
137
- onChange: (e) => setDescription(e.target.value),
138
- placeholder: "Describe what this agent does...",
139
- rows: 2,
140
- disabled: isLoading,
141
- className: "border-input bg-background focus:ring-ring w-full rounded-md border px-3 py-2 text-sm focus:ring-2 focus:outline-none disabled:opacity-50"
142
- }, undefined, false, undefined, this)
143
- ]
144
- }, undefined, true, undefined, this),
145
- /* @__PURE__ */ jsxDEV("div", {
146
- className: "flex gap-3",
147
- children: [
148
- /* @__PURE__ */ jsxDEV("div", {
149
- className: "flex-1",
150
- children: [
151
- /* @__PURE__ */ jsxDEV("label", {
152
- htmlFor: "model-provider",
153
- className: "text-muted-foreground mb-1 block text-sm font-medium",
154
- children: "Provider *"
155
- }, undefined, false, undefined, this),
156
- /* @__PURE__ */ jsxDEV("select", {
157
- id: "model-provider",
158
- value: modelProvider,
159
- onChange: (e) => handleProviderChange(e.target.value),
160
- disabled: isLoading,
161
- className: "border-input bg-background focus:ring-ring h-10 w-full rounded-md border px-3 py-2 text-sm focus:ring-2 focus:outline-none disabled:opacity-50",
162
- children: MODEL_PROVIDERS.map((p) => /* @__PURE__ */ jsxDEV("option", {
163
- value: p.value,
164
- children: p.label
165
- }, p.value, false, undefined, this))
166
- }, undefined, false, undefined, this)
167
- ]
168
- }, undefined, true, undefined, this),
169
- /* @__PURE__ */ jsxDEV("div", {
170
- className: "flex-1",
171
- children: [
172
- /* @__PURE__ */ jsxDEV("label", {
173
- htmlFor: "model-name",
174
- className: "text-muted-foreground mb-1 block text-sm font-medium",
175
- children: "Model *"
176
- }, undefined, false, undefined, this),
177
- /* @__PURE__ */ jsxDEV("select", {
178
- id: "model-name",
179
- value: modelName,
180
- onChange: (e) => setModelName(e.target.value),
181
- disabled: isLoading,
182
- className: "border-input bg-background focus:ring-ring h-10 w-full rounded-md border px-3 py-2 text-sm focus:ring-2 focus:outline-none disabled:opacity-50",
183
- children: selectedProvider?.models.map((m) => /* @__PURE__ */ jsxDEV("option", {
184
- value: m,
185
- children: m
186
- }, m, false, undefined, this))
187
- }, undefined, false, undefined, this)
188
- ]
189
- }, undefined, true, undefined, this)
190
- ]
191
- }, undefined, true, undefined, this),
192
- /* @__PURE__ */ jsxDEV("div", {
193
- children: [
194
- /* @__PURE__ */ jsxDEV("label", {
195
- htmlFor: "system-prompt",
196
- className: "text-muted-foreground mb-1 block text-sm font-medium",
197
- children: "System Prompt"
198
- }, undefined, false, undefined, this),
199
- /* @__PURE__ */ jsxDEV("textarea", {
200
- id: "system-prompt",
201
- value: systemPrompt,
202
- onChange: (e) => setSystemPrompt(e.target.value),
203
- placeholder: "You are a helpful assistant that...",
204
- rows: 4,
205
- disabled: isLoading,
206
- className: "border-input bg-background focus:ring-ring w-full rounded-md border px-3 py-2 font-mono text-sm focus:ring-2 focus:outline-none disabled:opacity-50"
207
- }, undefined, false, undefined, this),
208
- /* @__PURE__ */ jsxDEV("p", {
209
- className: "text-muted-foreground mt-1 text-xs",
210
- children: "Instructions that define the agent's behavior"
211
- }, undefined, false, undefined, this)
212
- ]
213
- }, undefined, true, undefined, this),
214
- error && /* @__PURE__ */ jsxDEV("div", {
215
- className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
216
- children: error
217
- }, undefined, false, undefined, this),
218
- /* @__PURE__ */ jsxDEV("div", {
219
- className: "flex justify-end gap-3 pt-2",
220
- children: [
221
- /* @__PURE__ */ jsxDEV(Button, {
222
- type: "button",
223
- variant: "ghost",
224
- onPress: onClose,
225
- disabled: isLoading,
226
- children: "Cancel"
227
- }, undefined, false, undefined, this),
228
- /* @__PURE__ */ jsxDEV(Button, {
229
- type: "submit",
230
- disabled: isLoading,
231
- children: isLoading ? "Creating..." : "Create Agent"
232
- }, undefined, false, undefined, this)
233
- ]
234
- }, undefined, true, undefined, this)
235
- ]
236
- }, undefined, true, undefined, this)
237
- ]
238
- }, undefined, true, undefined, this)
239
- ]
240
- }, undefined, true, undefined, this);
241
- }
242
-
243
- // src/ui/modals/AgentActionsModal.tsx
244
- import { useState as useState2 } from "react";
245
- import { Button as Button2 } from "@contractspec/lib.design-system";
246
- import { jsxDEV as jsxDEV2 } from "react/jsx-dev-runtime";
247
- "use client";
248
7
  function getStatusColor(status) {
249
8
  switch (status) {
250
9
  case "ACTIVE":
@@ -269,10 +28,10 @@ function AgentActionsModal({
269
28
  onExecute,
270
29
  isLoading = false
271
30
  }) {
272
- const [mode, setMode] = useState2("menu");
273
- const [message, setMessage] = useState2("");
274
- const [confirmAction, setConfirmAction] = useState2(null);
275
- const [error, setError] = useState2(null);
31
+ const [mode, setMode] = useState("menu");
32
+ const [message, setMessage] = useState("");
33
+ const [confirmAction, setConfirmAction] = useState(null);
34
+ const [error, setError] = useState(null);
276
35
  const resetForm = () => {
277
36
  setMode("menu");
278
37
  setMessage("");
@@ -321,11 +80,11 @@ function AgentActionsModal({
321
80
  };
322
81
  if (!isOpen || !agent)
323
82
  return null;
324
- return /* @__PURE__ */ jsxDEV2("div", {
83
+ return /* @__PURE__ */ jsxDEV("div", {
325
84
  className: "fixed inset-0 z-50 flex items-center justify-center",
326
85
  children: [
327
- /* @__PURE__ */ jsxDEV2("div", {
328
- className: "bg-background/80 absolute inset-0 backdrop-blur-sm",
86
+ /* @__PURE__ */ jsxDEV("div", {
87
+ className: "absolute inset-0 bg-background/80 backdrop-blur-sm",
329
88
  onClick: handleClose,
330
89
  role: "button",
331
90
  tabIndex: 0,
@@ -335,20 +94,20 @@ function AgentActionsModal({
335
94
  },
336
95
  "aria-label": "Close modal"
337
96
  }, undefined, false, undefined, this),
338
- /* @__PURE__ */ jsxDEV2("div", {
339
- className: "bg-card border-border relative z-10 w-full max-w-md rounded-xl border p-6 shadow-xl",
97
+ /* @__PURE__ */ jsxDEV("div", {
98
+ className: "relative z-10 w-full max-w-md rounded-xl border border-border bg-card p-6 shadow-xl",
340
99
  children: [
341
- /* @__PURE__ */ jsxDEV2("div", {
342
- className: "border-border mb-4 border-b pb-4",
100
+ /* @__PURE__ */ jsxDEV("div", {
101
+ className: "mb-4 border-border border-b pb-4",
343
102
  children: [
344
- /* @__PURE__ */ jsxDEV2("h2", {
345
- className: "text-xl font-semibold",
103
+ /* @__PURE__ */ jsxDEV("h2", {
104
+ className: "font-semibold text-xl",
346
105
  children: agent.name
347
106
  }, undefined, false, undefined, this),
348
- /* @__PURE__ */ jsxDEV2("div", {
107
+ /* @__PURE__ */ jsxDEV("div", {
349
108
  className: "mt-1 flex items-center gap-2",
350
109
  children: [
351
- /* @__PURE__ */ jsxDEV2("span", {
110
+ /* @__PURE__ */ jsxDEV("span", {
352
111
  className: "text-muted-foreground text-sm",
353
112
  children: [
354
113
  agent.modelProvider,
@@ -356,60 +115,60 @@ function AgentActionsModal({
356
115
  agent.modelName
357
116
  ]
358
117
  }, undefined, true, undefined, this),
359
- /* @__PURE__ */ jsxDEV2("span", {
360
- className: `rounded-full px-2 py-0.5 text-xs font-medium ${getStatusColor(agent.status)}`,
118
+ /* @__PURE__ */ jsxDEV("span", {
119
+ className: `rounded-full px-2 py-0.5 font-medium text-xs ${getStatusColor(agent.status)}`,
361
120
  children: agent.status
362
121
  }, undefined, false, undefined, this)
363
122
  ]
364
123
  }, undefined, true, undefined, this),
365
- agent.description && /* @__PURE__ */ jsxDEV2("p", {
366
- className: "text-muted-foreground mt-2 text-sm",
124
+ agent.description && /* @__PURE__ */ jsxDEV("p", {
125
+ className: "mt-2 text-muted-foreground text-sm",
367
126
  children: agent.description
368
127
  }, undefined, false, undefined, this)
369
128
  ]
370
129
  }, undefined, true, undefined, this),
371
- mode === "menu" && /* @__PURE__ */ jsxDEV2("div", {
130
+ mode === "menu" && /* @__PURE__ */ jsxDEV("div", {
372
131
  className: "space-y-3",
373
132
  children: [
374
- agent.status === "ACTIVE" && /* @__PURE__ */ jsxDEV2(Button2, {
133
+ agent.status === "ACTIVE" && /* @__PURE__ */ jsxDEV(Button, {
375
134
  className: "w-full justify-start",
376
135
  variant: "ghost",
377
136
  onPress: () => setMode("execute"),
378
137
  children: [
379
- /* @__PURE__ */ jsxDEV2("span", {
138
+ /* @__PURE__ */ jsxDEV("span", {
380
139
  className: "mr-2",
381
140
  children: "\u25B6\uFE0F"
382
141
  }, undefined, false, undefined, this),
383
142
  " Execute Agent"
384
143
  ]
385
144
  }, undefined, true, undefined, this),
386
- (agent.status === "DRAFT" || agent.status === "PAUSED") && /* @__PURE__ */ jsxDEV2(Button2, {
145
+ (agent.status === "DRAFT" || agent.status === "PAUSED") && /* @__PURE__ */ jsxDEV(Button, {
387
146
  className: "w-full justify-start",
388
147
  variant: "ghost",
389
148
  onPress: () => handleStatusChange("activate"),
390
149
  disabled: isLoading,
391
150
  children: [
392
- /* @__PURE__ */ jsxDEV2("span", {
151
+ /* @__PURE__ */ jsxDEV("span", {
393
152
  className: "mr-2",
394
153
  children: "\uD83D\uDFE2"
395
154
  }, undefined, false, undefined, this),
396
155
  " Activate Agent"
397
156
  ]
398
157
  }, undefined, true, undefined, this),
399
- agent.status === "ACTIVE" && /* @__PURE__ */ jsxDEV2(Button2, {
158
+ agent.status === "ACTIVE" && /* @__PURE__ */ jsxDEV(Button, {
400
159
  className: "w-full justify-start",
401
160
  variant: "ghost",
402
161
  onPress: () => handleStatusChange("pause"),
403
162
  disabled: isLoading,
404
163
  children: [
405
- /* @__PURE__ */ jsxDEV2("span", {
164
+ /* @__PURE__ */ jsxDEV("span", {
406
165
  className: "mr-2",
407
166
  children: "\u23F8\uFE0F"
408
167
  }, undefined, false, undefined, this),
409
168
  " Pause Agent"
410
169
  ]
411
170
  }, undefined, true, undefined, this),
412
- agent.status !== "ARCHIVED" && /* @__PURE__ */ jsxDEV2(Button2, {
171
+ agent.status !== "ARCHIVED" && /* @__PURE__ */ jsxDEV(Button, {
413
172
  className: "w-full justify-start text-yellow-600 hover:text-yellow-700",
414
173
  variant: "ghost",
415
174
  onPress: () => {
@@ -417,33 +176,33 @@ function AgentActionsModal({
417
176
  setMode("confirm");
418
177
  },
419
178
  children: [
420
- /* @__PURE__ */ jsxDEV2("span", {
179
+ /* @__PURE__ */ jsxDEV("span", {
421
180
  className: "mr-2",
422
181
  children: "\uD83D\uDCE6"
423
182
  }, undefined, false, undefined, this),
424
183
  " Archive Agent"
425
184
  ]
426
185
  }, undefined, true, undefined, this),
427
- agent.status === "ARCHIVED" && /* @__PURE__ */ jsxDEV2(Button2, {
186
+ agent.status === "ARCHIVED" && /* @__PURE__ */ jsxDEV(Button, {
428
187
  className: "w-full justify-start",
429
188
  variant: "ghost",
430
189
  onPress: () => handleStatusChange("activate"),
431
190
  disabled: isLoading,
432
191
  children: [
433
- /* @__PURE__ */ jsxDEV2("span", {
192
+ /* @__PURE__ */ jsxDEV("span", {
434
193
  className: "mr-2",
435
194
  children: "\uD83D\uDD04"
436
195
  }, undefined, false, undefined, this),
437
196
  " Restore Agent"
438
197
  ]
439
198
  }, undefined, true, undefined, this),
440
- error && /* @__PURE__ */ jsxDEV2("div", {
441
- className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
199
+ error && /* @__PURE__ */ jsxDEV("div", {
200
+ className: "rounded-md bg-destructive/10 p-3 text-destructive text-sm",
442
201
  children: error
443
202
  }, undefined, false, undefined, this),
444
- /* @__PURE__ */ jsxDEV2("div", {
203
+ /* @__PURE__ */ jsxDEV("div", {
445
204
  className: "border-border border-t pt-3",
446
- children: /* @__PURE__ */ jsxDEV2(Button2, {
205
+ children: /* @__PURE__ */ jsxDEV(Button, {
447
206
  className: "w-full",
448
207
  variant: "outline",
449
208
  onPress: handleClose,
@@ -452,41 +211,41 @@ function AgentActionsModal({
452
211
  }, undefined, false, undefined, this)
453
212
  ]
454
213
  }, undefined, true, undefined, this),
455
- mode === "execute" && /* @__PURE__ */ jsxDEV2("div", {
214
+ mode === "execute" && /* @__PURE__ */ jsxDEV("div", {
456
215
  className: "space-y-4",
457
216
  children: [
458
- /* @__PURE__ */ jsxDEV2("div", {
217
+ /* @__PURE__ */ jsxDEV("div", {
459
218
  children: [
460
- /* @__PURE__ */ jsxDEV2("label", {
219
+ /* @__PURE__ */ jsxDEV("label", {
461
220
  htmlFor: "execute-message",
462
- className: "text-muted-foreground mb-1 block text-sm font-medium",
221
+ className: "mb-1 block font-medium text-muted-foreground text-sm",
463
222
  children: "Message *"
464
223
  }, undefined, false, undefined, this),
465
- /* @__PURE__ */ jsxDEV2("textarea", {
224
+ /* @__PURE__ */ jsxDEV("textarea", {
466
225
  id: "execute-message",
467
226
  value: message,
468
227
  onChange: (e) => setMessage(e.target.value),
469
228
  placeholder: "Enter your message to the agent...",
470
229
  rows: 4,
471
230
  disabled: isLoading,
472
- className: "border-input bg-background focus:ring-ring w-full rounded-md border px-3 py-2 text-sm focus:ring-2 focus:outline-none disabled:opacity-50"
231
+ className: "w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring disabled:opacity-50"
473
232
  }, undefined, false, undefined, this)
474
233
  ]
475
234
  }, undefined, true, undefined, this),
476
- error && /* @__PURE__ */ jsxDEV2("div", {
477
- className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
235
+ error && /* @__PURE__ */ jsxDEV("div", {
236
+ className: "rounded-md bg-destructive/10 p-3 text-destructive text-sm",
478
237
  children: error
479
238
  }, undefined, false, undefined, this),
480
- /* @__PURE__ */ jsxDEV2("div", {
239
+ /* @__PURE__ */ jsxDEV("div", {
481
240
  className: "flex justify-end gap-3 pt-2",
482
241
  children: [
483
- /* @__PURE__ */ jsxDEV2(Button2, {
242
+ /* @__PURE__ */ jsxDEV(Button, {
484
243
  variant: "ghost",
485
244
  onPress: () => setMode("menu"),
486
245
  disabled: isLoading,
487
246
  children: "Back"
488
247
  }, undefined, false, undefined, this),
489
- /* @__PURE__ */ jsxDEV2(Button2, {
248
+ /* @__PURE__ */ jsxDEV(Button, {
490
249
  onPress: handleExecute,
491
250
  disabled: isLoading,
492
251
  children: isLoading ? "Executing..." : "\u25B6\uFE0F Execute"
@@ -495,42 +254,283 @@ function AgentActionsModal({
495
254
  }, undefined, true, undefined, this)
496
255
  ]
497
256
  }, undefined, true, undefined, this),
498
- mode === "confirm" && confirmAction === "archive" && /* @__PURE__ */ jsxDEV2("div", {
257
+ mode === "confirm" && confirmAction === "archive" && /* @__PURE__ */ jsxDEV("div", {
499
258
  className: "space-y-4",
500
259
  children: [
501
- /* @__PURE__ */ jsxDEV2("p", {
260
+ /* @__PURE__ */ jsxDEV("p", {
502
261
  className: "text-muted-foreground",
503
262
  children: [
504
263
  "Are you sure you want to archive",
505
264
  " ",
506
- /* @__PURE__ */ jsxDEV2("span", {
507
- className: "text-foreground font-medium",
265
+ /* @__PURE__ */ jsxDEV("span", {
266
+ className: "font-medium text-foreground",
508
267
  children: agent.name
509
268
  }, undefined, false, undefined, this),
510
269
  "?"
511
270
  ]
512
271
  }, undefined, true, undefined, this),
513
- /* @__PURE__ */ jsxDEV2("p", {
272
+ /* @__PURE__ */ jsxDEV("p", {
514
273
  className: "text-muted-foreground text-sm",
515
274
  children: "Archived agents cannot be executed but can be restored later."
516
275
  }, undefined, false, undefined, this),
276
+ error && /* @__PURE__ */ jsxDEV("div", {
277
+ className: "rounded-md bg-destructive/10 p-3 text-destructive text-sm",
278
+ children: error
279
+ }, undefined, false, undefined, this),
280
+ /* @__PURE__ */ jsxDEV("div", {
281
+ className: "flex justify-end gap-3 pt-2",
282
+ children: [
283
+ /* @__PURE__ */ jsxDEV(Button, {
284
+ variant: "ghost",
285
+ onPress: () => setMode("menu"),
286
+ disabled: isLoading,
287
+ children: "Cancel"
288
+ }, undefined, false, undefined, this),
289
+ /* @__PURE__ */ jsxDEV(Button, {
290
+ onPress: () => handleStatusChange("archive"),
291
+ disabled: isLoading,
292
+ children: isLoading ? "Archiving..." : "\uD83D\uDCE6 Archive"
293
+ }, undefined, false, undefined, this)
294
+ ]
295
+ }, undefined, true, undefined, this)
296
+ ]
297
+ }, undefined, true, undefined, this)
298
+ ]
299
+ }, undefined, true, undefined, this)
300
+ ]
301
+ }, undefined, true, undefined, this);
302
+ }
303
+
304
+ // src/ui/modals/CreateAgentModal.tsx
305
+ import { Button as Button2, Input } from "@contractspec/lib.design-system";
306
+ import { useState as useState2 } from "react";
307
+ import { jsxDEV as jsxDEV2 } from "react/jsx-dev-runtime";
308
+ "use client";
309
+ var MODEL_PROVIDERS = [
310
+ {
311
+ value: "openai",
312
+ label: "OpenAI",
313
+ models: ["gpt-5.4", "gpt-5-mini", "gpt-4o", "gpt-4-turbo", "gpt-3.5-turbo"]
314
+ },
315
+ {
316
+ value: "anthropic",
317
+ label: "Anthropic",
318
+ models: ["claude-sonnet-4-6", "claude-opus-4-6", "claude-haiku-4-5"]
319
+ },
320
+ {
321
+ value: "google",
322
+ label: "Google",
323
+ models: [
324
+ "gemini-2.5-flash",
325
+ "gemini-2.5-pro",
326
+ "gemini-pro",
327
+ "gemini-ultra"
328
+ ]
329
+ },
330
+ {
331
+ value: "mistral",
332
+ label: "Mistral",
333
+ models: [
334
+ "mistral-large-2512",
335
+ "mistral-large-latest",
336
+ "mistral-medium-latest",
337
+ "mistral-small-latest"
338
+ ]
339
+ }
340
+ ];
341
+ function CreateAgentModal({
342
+ isOpen,
343
+ onClose,
344
+ onSubmit,
345
+ isLoading = false
346
+ }) {
347
+ const [name, setName] = useState2("");
348
+ const [description, setDescription] = useState2("");
349
+ const [modelProvider, setModelProvider] = useState2("openai");
350
+ const [modelName, setModelName] = useState2("gpt-5.4");
351
+ const [systemPrompt, setSystemPrompt] = useState2("");
352
+ const [error, setError] = useState2(null);
353
+ const selectedProvider = MODEL_PROVIDERS.find((p) => p.value === modelProvider);
354
+ const handleSubmit = async (e) => {
355
+ e.preventDefault();
356
+ setError(null);
357
+ if (!name.trim()) {
358
+ setError("Agent name is required");
359
+ return;
360
+ }
361
+ try {
362
+ await onSubmit({
363
+ name: name.trim(),
364
+ description: description.trim() || undefined,
365
+ modelProvider,
366
+ modelName,
367
+ systemPrompt: systemPrompt.trim() || undefined
368
+ });
369
+ setName("");
370
+ setDescription("");
371
+ setModelProvider("openai");
372
+ setModelName("gpt-5.4");
373
+ setSystemPrompt("");
374
+ onClose();
375
+ } catch (err) {
376
+ setError(err instanceof Error ? err.message : "Failed to create agent");
377
+ }
378
+ };
379
+ const handleProviderChange = (provider) => {
380
+ setModelProvider(provider);
381
+ const providerConfig = MODEL_PROVIDERS.find((p) => p.value === provider);
382
+ if (providerConfig) {
383
+ setModelName(providerConfig.models[0]);
384
+ }
385
+ };
386
+ if (!isOpen)
387
+ return null;
388
+ return /* @__PURE__ */ jsxDEV2("div", {
389
+ className: "fixed inset-0 z-50 flex items-center justify-center",
390
+ children: [
391
+ /* @__PURE__ */ jsxDEV2("div", {
392
+ className: "absolute inset-0 bg-background/80 backdrop-blur-sm",
393
+ onClick: onClose,
394
+ role: "button",
395
+ tabIndex: 0,
396
+ onKeyDown: (e) => {
397
+ if (e.key === "Enter" || e.key === " ")
398
+ onClose();
399
+ },
400
+ "aria-label": "Close modal"
401
+ }, undefined, false, undefined, this),
402
+ /* @__PURE__ */ jsxDEV2("div", {
403
+ className: "relative z-10 max-h-[90vh] w-full max-w-lg overflow-y-auto rounded-xl border border-border bg-card p-6 shadow-xl",
404
+ children: [
405
+ /* @__PURE__ */ jsxDEV2("h2", {
406
+ className: "mb-4 font-semibold text-xl",
407
+ children: "Create New Agent"
408
+ }, undefined, false, undefined, this),
409
+ /* @__PURE__ */ jsxDEV2("form", {
410
+ onSubmit: handleSubmit,
411
+ className: "space-y-4",
412
+ children: [
413
+ /* @__PURE__ */ jsxDEV2("div", {
414
+ children: [
415
+ /* @__PURE__ */ jsxDEV2("label", {
416
+ htmlFor: "agent-name",
417
+ className: "mb-1 block font-medium text-muted-foreground text-sm",
418
+ children: "Agent Name *"
419
+ }, undefined, false, undefined, this),
420
+ /* @__PURE__ */ jsxDEV2(Input, {
421
+ id: "agent-name",
422
+ value: name,
423
+ onChange: (e) => setName(e.target.value),
424
+ placeholder: "e.g., Customer Support Bot",
425
+ disabled: isLoading
426
+ }, undefined, false, undefined, this)
427
+ ]
428
+ }, undefined, true, undefined, this),
429
+ /* @__PURE__ */ jsxDEV2("div", {
430
+ children: [
431
+ /* @__PURE__ */ jsxDEV2("label", {
432
+ htmlFor: "agent-description",
433
+ className: "mb-1 block font-medium text-muted-foreground text-sm",
434
+ children: "Description"
435
+ }, undefined, false, undefined, this),
436
+ /* @__PURE__ */ jsxDEV2("textarea", {
437
+ id: "agent-description",
438
+ value: description,
439
+ onChange: (e) => setDescription(e.target.value),
440
+ placeholder: "Describe what this agent does...",
441
+ rows: 2,
442
+ disabled: isLoading,
443
+ className: "w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring disabled:opacity-50"
444
+ }, undefined, false, undefined, this)
445
+ ]
446
+ }, undefined, true, undefined, this),
447
+ /* @__PURE__ */ jsxDEV2("div", {
448
+ className: "flex gap-3",
449
+ children: [
450
+ /* @__PURE__ */ jsxDEV2("div", {
451
+ className: "flex-1",
452
+ children: [
453
+ /* @__PURE__ */ jsxDEV2("label", {
454
+ htmlFor: "model-provider",
455
+ className: "mb-1 block font-medium text-muted-foreground text-sm",
456
+ children: "Provider *"
457
+ }, undefined, false, undefined, this),
458
+ /* @__PURE__ */ jsxDEV2("select", {
459
+ id: "model-provider",
460
+ value: modelProvider,
461
+ onChange: (e) => handleProviderChange(e.target.value),
462
+ disabled: isLoading,
463
+ className: "h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring disabled:opacity-50",
464
+ children: MODEL_PROVIDERS.map((p) => /* @__PURE__ */ jsxDEV2("option", {
465
+ value: p.value,
466
+ children: p.label
467
+ }, p.value, false, undefined, this))
468
+ }, undefined, false, undefined, this)
469
+ ]
470
+ }, undefined, true, undefined, this),
471
+ /* @__PURE__ */ jsxDEV2("div", {
472
+ className: "flex-1",
473
+ children: [
474
+ /* @__PURE__ */ jsxDEV2("label", {
475
+ htmlFor: "model-name",
476
+ className: "mb-1 block font-medium text-muted-foreground text-sm",
477
+ children: "Model *"
478
+ }, undefined, false, undefined, this),
479
+ /* @__PURE__ */ jsxDEV2("select", {
480
+ id: "model-name",
481
+ value: modelName,
482
+ onChange: (e) => setModelName(e.target.value),
483
+ disabled: isLoading,
484
+ className: "h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring disabled:opacity-50",
485
+ children: selectedProvider?.models.map((m) => /* @__PURE__ */ jsxDEV2("option", {
486
+ value: m,
487
+ children: m
488
+ }, m, false, undefined, this))
489
+ }, undefined, false, undefined, this)
490
+ ]
491
+ }, undefined, true, undefined, this)
492
+ ]
493
+ }, undefined, true, undefined, this),
494
+ /* @__PURE__ */ jsxDEV2("div", {
495
+ children: [
496
+ /* @__PURE__ */ jsxDEV2("label", {
497
+ htmlFor: "system-prompt",
498
+ className: "mb-1 block font-medium text-muted-foreground text-sm",
499
+ children: "System Prompt"
500
+ }, undefined, false, undefined, this),
501
+ /* @__PURE__ */ jsxDEV2("textarea", {
502
+ id: "system-prompt",
503
+ value: systemPrompt,
504
+ onChange: (e) => setSystemPrompt(e.target.value),
505
+ placeholder: "You are a helpful assistant that...",
506
+ rows: 4,
507
+ disabled: isLoading,
508
+ className: "w-full rounded-md border border-input bg-background px-3 py-2 font-mono text-sm focus:outline-none focus:ring-2 focus:ring-ring disabled:opacity-50"
509
+ }, undefined, false, undefined, this),
510
+ /* @__PURE__ */ jsxDEV2("p", {
511
+ className: "mt-1 text-muted-foreground text-xs",
512
+ children: "Instructions that define the agent's behavior"
513
+ }, undefined, false, undefined, this)
514
+ ]
515
+ }, undefined, true, undefined, this),
517
516
  error && /* @__PURE__ */ jsxDEV2("div", {
518
- className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
517
+ className: "rounded-md bg-destructive/10 p-3 text-destructive text-sm",
519
518
  children: error
520
519
  }, undefined, false, undefined, this),
521
520
  /* @__PURE__ */ jsxDEV2("div", {
522
521
  className: "flex justify-end gap-3 pt-2",
523
522
  children: [
524
523
  /* @__PURE__ */ jsxDEV2(Button2, {
524
+ type: "button",
525
525
  variant: "ghost",
526
- onPress: () => setMode("menu"),
526
+ onPress: onClose,
527
527
  disabled: isLoading,
528
528
  children: "Cancel"
529
529
  }, undefined, false, undefined, this),
530
530
  /* @__PURE__ */ jsxDEV2(Button2, {
531
- onPress: () => handleStatusChange("archive"),
531
+ type: "submit",
532
532
  disabled: isLoading,
533
- children: isLoading ? "Archiving..." : "\uD83D\uDCE6 Archive"
533
+ children: isLoading ? "Creating..." : "Create Agent"
534
534
  }, undefined, false, undefined, this)
535
535
  ]
536
536
  }, undefined, true, undefined, this)