@contractspec/example.agent-console 0.0.0-canary-20260113170453

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 (306) hide show
  1. package/.turbo/turbo-build$colon$bundle.log +280 -0
  2. package/.turbo/turbo-build.log +281 -0
  3. package/CHANGELOG.md +368 -0
  4. package/LICENSE +21 -0
  5. package/README.md +86 -0
  6. package/dist/agent/agent.entity.d.ts +55 -0
  7. package/dist/agent/agent.entity.d.ts.map +1 -0
  8. package/dist/agent/agent.entity.js +136 -0
  9. package/dist/agent/agent.entity.js.map +1 -0
  10. package/dist/agent/agent.enum.d.ts +18 -0
  11. package/dist/agent/agent.enum.d.ts.map +1 -0
  12. package/dist/agent/agent.enum.js +34 -0
  13. package/dist/agent/agent.enum.js.map +1 -0
  14. package/dist/agent/agent.event.d.ts +128 -0
  15. package/dist/agent/agent.event.d.ts.map +1 -0
  16. package/dist/agent/agent.event.js +210 -0
  17. package/dist/agent/agent.event.js.map +1 -0
  18. package/dist/agent/agent.handler.d.ts +100 -0
  19. package/dist/agent/agent.handler.d.ts.map +1 -0
  20. package/dist/agent/agent.handler.js +84 -0
  21. package/dist/agent/agent.handler.js.map +1 -0
  22. package/dist/agent/agent.operation.d.ts +471 -0
  23. package/dist/agent/agent.operation.d.ts.map +1 -0
  24. package/dist/agent/agent.operation.js +486 -0
  25. package/dist/agent/agent.operation.js.map +1 -0
  26. package/dist/agent/agent.presentation.d.ts +18 -0
  27. package/dist/agent/agent.presentation.d.ts.map +1 -0
  28. package/dist/agent/agent.presentation.js +89 -0
  29. package/dist/agent/agent.presentation.js.map +1 -0
  30. package/dist/agent/agent.schema.d.ts +401 -0
  31. package/dist/agent/agent.schema.d.ts.map +1 -0
  32. package/dist/agent/agent.schema.js +406 -0
  33. package/dist/agent/agent.schema.js.map +1 -0
  34. package/dist/agent/agent.test-spec.d.ts +8 -0
  35. package/dist/agent/agent.test-spec.d.ts.map +1 -0
  36. package/dist/agent/agent.test-spec.js +65 -0
  37. package/dist/agent/agent.test-spec.js.map +1 -0
  38. package/dist/agent/index.d.ts +8 -0
  39. package/dist/agent/index.js +9 -0
  40. package/dist/agent.capability.d.ts +7 -0
  41. package/dist/agent.capability.d.ts.map +1 -0
  42. package/dist/agent.capability.js +20 -0
  43. package/dist/agent.capability.js.map +1 -0
  44. package/dist/agent.feature.d.ts +12 -0
  45. package/dist/agent.feature.d.ts.map +1 -0
  46. package/dist/agent.feature.js +305 -0
  47. package/dist/agent.feature.js.map +1 -0
  48. package/dist/docs/agent-console.docblock.d.ts +1 -0
  49. package/dist/docs/agent-console.docblock.js +113 -0
  50. package/dist/docs/agent-console.docblock.js.map +1 -0
  51. package/dist/docs/index.d.ts +1 -0
  52. package/dist/docs/index.js +1 -0
  53. package/dist/example.d.ts +7 -0
  54. package/dist/example.d.ts.map +1 -0
  55. package/dist/example.js +58 -0
  56. package/dist/example.js.map +1 -0
  57. package/dist/handlers/agent.handlers.d.ts +135 -0
  58. package/dist/handlers/agent.handlers.d.ts.map +1 -0
  59. package/dist/handlers/agent.handlers.js +263 -0
  60. package/dist/handlers/agent.handlers.js.map +1 -0
  61. package/dist/handlers/index.d.ts +5 -0
  62. package/dist/handlers/index.js +6 -0
  63. package/dist/index.d.ts +48 -0
  64. package/dist/index.js +50 -0
  65. package/dist/presentations/index.d.ts +4 -0
  66. package/dist/presentations/index.js +5 -0
  67. package/dist/run/index.d.ts +8 -0
  68. package/dist/run/index.js +9 -0
  69. package/dist/run/run.entity.d.ts +82 -0
  70. package/dist/run/run.entity.d.ts.map +1 -0
  71. package/dist/run/run.entity.js +205 -0
  72. package/dist/run/run.entity.js.map +1 -0
  73. package/dist/run/run.enum.d.ts +22 -0
  74. package/dist/run/run.enum.d.ts.map +1 -0
  75. package/dist/run/run.enum.js +45 -0
  76. package/dist/run/run.enum.js.map +1 -0
  77. package/dist/run/run.event.d.ts +290 -0
  78. package/dist/run/run.event.d.ts.map +1 -0
  79. package/dist/run/run.event.js +434 -0
  80. package/dist/run/run.event.js.map +1 -0
  81. package/dist/run/run.handler.d.ts +203 -0
  82. package/dist/run/run.handler.d.ts.map +1 -0
  83. package/dist/run/run.handler.js +83 -0
  84. package/dist/run/run.handler.js.map +1 -0
  85. package/dist/run/run.operation.d.ts +720 -0
  86. package/dist/run/run.operation.d.ts.map +1 -0
  87. package/dist/run/run.operation.js +626 -0
  88. package/dist/run/run.operation.js.map +1 -0
  89. package/dist/run/run.presentation.d.ts +14 -0
  90. package/dist/run/run.presentation.d.ts.map +1 -0
  91. package/dist/run/run.presentation.js +65 -0
  92. package/dist/run/run.presentation.js.map +1 -0
  93. package/dist/run/run.schema.d.ts +416 -0
  94. package/dist/run/run.schema.d.ts.map +1 -0
  95. package/dist/run/run.schema.js +338 -0
  96. package/dist/run/run.schema.js.map +1 -0
  97. package/dist/run/run.test-spec.d.ts +8 -0
  98. package/dist/run/run.test-spec.d.ts.map +1 -0
  99. package/dist/run/run.test-spec.js +65 -0
  100. package/dist/run/run.test-spec.js.map +1 -0
  101. package/dist/seeders/index.d.ts +10 -0
  102. package/dist/seeders/index.d.ts.map +1 -0
  103. package/dist/seeders/index.js +20 -0
  104. package/dist/seeders/index.js.map +1 -0
  105. package/dist/shared/index.d.ts +4 -0
  106. package/dist/shared/index.js +5 -0
  107. package/dist/shared/mock-agents.d.ts +88 -0
  108. package/dist/shared/mock-agents.d.ts.map +1 -0
  109. package/dist/shared/mock-agents.js +94 -0
  110. package/dist/shared/mock-agents.js.map +1 -0
  111. package/dist/shared/mock-runs.d.ts +120 -0
  112. package/dist/shared/mock-runs.d.ts.map +1 -0
  113. package/dist/shared/mock-runs.js +118 -0
  114. package/dist/shared/mock-runs.js.map +1 -0
  115. package/dist/shared/mock-tools.d.ts +244 -0
  116. package/dist/shared/mock-tools.d.ts.map +1 -0
  117. package/dist/shared/mock-tools.js +181 -0
  118. package/dist/shared/mock-tools.js.map +1 -0
  119. package/dist/shared/overlay-types.d.ts +34 -0
  120. package/dist/shared/overlay-types.d.ts.map +1 -0
  121. package/dist/shared/overlay-types.js +0 -0
  122. package/dist/tool/index.d.ts +8 -0
  123. package/dist/tool/index.js +9 -0
  124. package/dist/tool/tool.entity.d.ts +42 -0
  125. package/dist/tool/tool.entity.d.ts.map +1 -0
  126. package/dist/tool/tool.entity.js +105 -0
  127. package/dist/tool/tool.entity.js.map +1 -0
  128. package/dist/tool/tool.enum.d.ts +18 -0
  129. package/dist/tool/tool.enum.d.ts.map +1 -0
  130. package/dist/tool/tool.enum.js +35 -0
  131. package/dist/tool/tool.enum.js.map +1 -0
  132. package/dist/tool/tool.event.d.ts +103 -0
  133. package/dist/tool/tool.event.d.ts.map +1 -0
  134. package/dist/tool/tool.event.js +159 -0
  135. package/dist/tool/tool.event.js.map +1 -0
  136. package/dist/tool/tool.handler.d.ts +315 -0
  137. package/dist/tool/tool.handler.d.ts.map +1 -0
  138. package/dist/tool/tool.handler.js +87 -0
  139. package/dist/tool/tool.handler.js.map +1 -0
  140. package/dist/tool/tool.operation.d.ts +411 -0
  141. package/dist/tool/tool.operation.d.ts.map +1 -0
  142. package/dist/tool/tool.operation.js +406 -0
  143. package/dist/tool/tool.operation.js.map +1 -0
  144. package/dist/tool/tool.presentation.d.ts +14 -0
  145. package/dist/tool/tool.presentation.d.ts.map +1 -0
  146. package/dist/tool/tool.presentation.js +65 -0
  147. package/dist/tool/tool.presentation.js.map +1 -0
  148. package/dist/tool/tool.schema.d.ts +218 -0
  149. package/dist/tool/tool.schema.d.ts.map +1 -0
  150. package/dist/tool/tool.schema.js +236 -0
  151. package/dist/tool/tool.schema.js.map +1 -0
  152. package/dist/tool/tool.test-spec.d.ts +8 -0
  153. package/dist/tool/tool.test-spec.d.ts.map +1 -0
  154. package/dist/tool/tool.test-spec.js +65 -0
  155. package/dist/tool/tool.test-spec.js.map +1 -0
  156. package/dist/ui/AgentDashboard.d.ts +7 -0
  157. package/dist/ui/AgentDashboard.d.ts.map +1 -0
  158. package/dist/ui/AgentDashboard.js +420 -0
  159. package/dist/ui/AgentDashboard.js.map +1 -0
  160. package/dist/ui/AgentRunList.d.ts +2 -0
  161. package/dist/ui/AgentRunList.js +5 -0
  162. package/dist/ui/AgentToolRegistry.d.ts +2 -0
  163. package/dist/ui/AgentToolRegistry.js +5 -0
  164. package/dist/ui/hooks/index.d.ts +6 -0
  165. package/dist/ui/hooks/index.js +8 -0
  166. package/dist/ui/hooks/useAgentList.d.ts +28 -0
  167. package/dist/ui/hooks/useAgentList.d.ts.map +1 -0
  168. package/dist/ui/hooks/useAgentList.js +66 -0
  169. package/dist/ui/hooks/useAgentList.js.map +1 -0
  170. package/dist/ui/hooks/useAgentMutations.d.ts +29 -0
  171. package/dist/ui/hooks/useAgentMutations.d.ts.map +1 -0
  172. package/dist/ui/hooks/useAgentMutations.js +124 -0
  173. package/dist/ui/hooks/useAgentMutations.js.map +1 -0
  174. package/dist/ui/hooks/useRunList.d.ts +24 -0
  175. package/dist/ui/hooks/useRunList.d.ts.map +1 -0
  176. package/dist/ui/hooks/useRunList.js +66 -0
  177. package/dist/ui/hooks/useRunList.js.map +1 -0
  178. package/dist/ui/hooks/useToolList.d.ts +40 -0
  179. package/dist/ui/hooks/useToolList.d.ts.map +1 -0
  180. package/dist/ui/hooks/useToolList.js +96 -0
  181. package/dist/ui/hooks/useToolList.js.map +1 -0
  182. package/dist/ui/index.d.ts +24 -0
  183. package/dist/ui/index.js +24 -0
  184. package/dist/ui/modals/AgentActionsModal.d.ts +27 -0
  185. package/dist/ui/modals/AgentActionsModal.d.ts.map +1 -0
  186. package/dist/ui/modals/AgentActionsModal.js +262 -0
  187. package/dist/ui/modals/AgentActionsModal.js.map +1 -0
  188. package/dist/ui/modals/CreateAgentModal.d.ts +25 -0
  189. package/dist/ui/modals/CreateAgentModal.d.ts.map +1 -0
  190. package/dist/ui/modals/CreateAgentModal.js +214 -0
  191. package/dist/ui/modals/CreateAgentModal.js.map +1 -0
  192. package/dist/ui/modals/index.d.ts +3 -0
  193. package/dist/ui/modals/index.js +4 -0
  194. package/dist/ui/overlays/demo-overlays.d.ts +19 -0
  195. package/dist/ui/overlays/demo-overlays.d.ts.map +1 -0
  196. package/dist/ui/overlays/demo-overlays.js +73 -0
  197. package/dist/ui/overlays/demo-overlays.js.map +1 -0
  198. package/dist/ui/overlays/index.d.ts +2 -0
  199. package/dist/ui/overlays/index.js +3 -0
  200. package/dist/ui/renderers/agent-list.markdown.d.ts +15 -0
  201. package/dist/ui/renderers/agent-list.markdown.d.ts.map +1 -0
  202. package/dist/ui/renderers/agent-list.markdown.js +51 -0
  203. package/dist/ui/renderers/agent-list.markdown.js.map +1 -0
  204. package/dist/ui/renderers/agent-list.renderer.d.ts +11 -0
  205. package/dist/ui/renderers/agent-list.renderer.d.ts.map +1 -0
  206. package/dist/ui/renderers/agent-list.renderer.js +19 -0
  207. package/dist/ui/renderers/agent-list.renderer.js.map +1 -0
  208. package/dist/ui/renderers/dashboard.markdown.d.ts +15 -0
  209. package/dist/ui/renderers/dashboard.markdown.d.ts.map +1 -0
  210. package/dist/ui/renderers/dashboard.markdown.js +100 -0
  211. package/dist/ui/renderers/dashboard.markdown.js.map +1 -0
  212. package/dist/ui/renderers/index.d.ts +6 -0
  213. package/dist/ui/renderers/index.js +7 -0
  214. package/dist/ui/renderers/run-list.markdown.d.ts +15 -0
  215. package/dist/ui/renderers/run-list.markdown.d.ts.map +1 -0
  216. package/dist/ui/renderers/run-list.markdown.js +44 -0
  217. package/dist/ui/renderers/run-list.markdown.js.map +1 -0
  218. package/dist/ui/renderers/tool-registry.markdown.d.ts +15 -0
  219. package/dist/ui/renderers/tool-registry.markdown.d.ts.map +1 -0
  220. package/dist/ui/renderers/tool-registry.markdown.js +55 -0
  221. package/dist/ui/renderers/tool-registry.markdown.js.map +1 -0
  222. package/dist/ui/views/AgentListView.d.ts +7 -0
  223. package/dist/ui/views/AgentListView.d.ts.map +1 -0
  224. package/dist/ui/views/AgentListView.js +93 -0
  225. package/dist/ui/views/AgentListView.js.map +1 -0
  226. package/dist/ui/views/RunListView.d.ts +14 -0
  227. package/dist/ui/views/RunListView.d.ts.map +1 -0
  228. package/dist/ui/views/RunListView.js +165 -0
  229. package/dist/ui/views/RunListView.js.map +1 -0
  230. package/dist/ui/views/ToolRegistryView.d.ts +14 -0
  231. package/dist/ui/views/ToolRegistryView.d.ts.map +1 -0
  232. package/dist/ui/views/ToolRegistryView.js +97 -0
  233. package/dist/ui/views/ToolRegistryView.js.map +1 -0
  234. package/dist/ui/views/index.d.ts +4 -0
  235. package/dist/ui/views/index.js +5 -0
  236. package/example.ts +1 -0
  237. package/package.json +155 -0
  238. package/src/agent/agent.entity.ts +137 -0
  239. package/src/agent/agent.enum.ts +31 -0
  240. package/src/agent/agent.event.ts +142 -0
  241. package/src/agent/agent.handler.ts +178 -0
  242. package/src/agent/agent.operation.ts +444 -0
  243. package/src/agent/agent.presentation.ts +80 -0
  244. package/src/agent/agent.schema.ts +214 -0
  245. package/src/agent/agent.test-spec.ts +55 -0
  246. package/src/agent/index.ts +67 -0
  247. package/src/agent.capability.ts +13 -0
  248. package/src/agent.feature.ts +147 -0
  249. package/src/docs/agent-console.docblock.ts +97 -0
  250. package/src/docs/index.ts +1 -0
  251. package/src/example.ts +41 -0
  252. package/src/handlers/agent.handlers.ts +572 -0
  253. package/src/handlers/index.ts +30 -0
  254. package/src/index.ts +32 -0
  255. package/src/presentations/index.ts +26 -0
  256. package/src/run/index.ts +68 -0
  257. package/src/run/run.entity.ts +175 -0
  258. package/src/run/run.enum.ts +43 -0
  259. package/src/run/run.event.ts +264 -0
  260. package/src/run/run.handler.ts +138 -0
  261. package/src/run/run.operation.ts +524 -0
  262. package/src/run/run.presentation.ts +54 -0
  263. package/src/run/run.schema.ts +169 -0
  264. package/src/run/run.test-spec.ts +55 -0
  265. package/src/seeders/index.ts +29 -0
  266. package/src/shared/index.ts +6 -0
  267. package/src/shared/mock-agents.ts +81 -0
  268. package/src/shared/mock-runs.ts +107 -0
  269. package/src/shared/mock-tools.ts +145 -0
  270. package/src/shared/overlay-types.ts +39 -0
  271. package/src/tool/index.ts +60 -0
  272. package/src/tool/tool.entity.ts +99 -0
  273. package/src/tool/tool.enum.ts +32 -0
  274. package/src/tool/tool.event.ts +119 -0
  275. package/src/tool/tool.handler.ts +154 -0
  276. package/src/tool/tool.operation.ts +366 -0
  277. package/src/tool/tool.presentation.ts +55 -0
  278. package/src/tool/tool.schema.ts +133 -0
  279. package/src/tool/tool.test-spec.ts +55 -0
  280. package/src/ui/AgentDashboard.tsx +416 -0
  281. package/src/ui/AgentRunList.tsx +8 -0
  282. package/src/ui/AgentToolRegistry.tsx +8 -0
  283. package/src/ui/hooks/index.ts +14 -0
  284. package/src/ui/hooks/useAgentList.ts +80 -0
  285. package/src/ui/hooks/useAgentMutations.ts +156 -0
  286. package/src/ui/hooks/useRunList.ts +81 -0
  287. package/src/ui/hooks/useToolList.ts +122 -0
  288. package/src/ui/index.ts +21 -0
  289. package/src/ui/modals/AgentActionsModal.tsx +306 -0
  290. package/src/ui/modals/CreateAgentModal.tsx +257 -0
  291. package/src/ui/modals/index.ts +2 -0
  292. package/src/ui/overlays/demo-overlays.ts +77 -0
  293. package/src/ui/overlays/index.ts +1 -0
  294. package/src/ui/renderers/agent-list.markdown.ts +84 -0
  295. package/src/ui/renderers/agent-list.renderer.tsx +27 -0
  296. package/src/ui/renderers/dashboard.markdown.ts +169 -0
  297. package/src/ui/renderers/index.ts +12 -0
  298. package/src/ui/renderers/run-list.markdown.ts +75 -0
  299. package/src/ui/renderers/tool-registry.markdown.ts +91 -0
  300. package/src/ui/views/AgentListView.tsx +113 -0
  301. package/src/ui/views/RunListView.tsx +173 -0
  302. package/src/ui/views/ToolRegistryView.tsx +140 -0
  303. package/src/ui/views/index.ts +6 -0
  304. package/tsconfig.json +10 -0
  305. package/tsconfig.tsbuildinfo +1 -0
  306. package/tsdown.config.js +7 -0
@@ -0,0 +1,524 @@
1
+ import {
2
+ defineCommand,
3
+ defineQuery,
4
+ } from '@contractspec/lib.contracts/operations';
5
+ import { defineSchemaModel, ScalarTypeEnum } from '@contractspec/lib.schema';
6
+ import { GranularityEnum, LogLevelEnum, RunStatusEnum } from './run.enum';
7
+ import {
8
+ RunInputModel,
9
+ RunLogModel,
10
+ RunModel,
11
+ RunStepModel,
12
+ RunSummaryModel,
13
+ TimelineDataPointModel,
14
+ } from './run.schema';
15
+
16
+ const OWNERS = ['@agent-console-team'] as const;
17
+
18
+ /**
19
+ * ExecuteAgentCommand - Starts a new agent run.
20
+ */
21
+ export const ExecuteAgentCommand = defineCommand({
22
+ meta: {
23
+ key: 'agent.run.execute',
24
+ version: '1.0.0',
25
+ stability: 'stable',
26
+ owners: [...OWNERS],
27
+ tags: ['run', 'execute'],
28
+ description: 'Starts a new agent run with the given input.',
29
+ goal: 'Execute an AI agent with user input.',
30
+ context: 'Called from chat interface or API.',
31
+ },
32
+ io: {
33
+ input: defineSchemaModel({
34
+ name: 'ExecuteAgentInput',
35
+ fields: {
36
+ agentId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
37
+ input: { type: RunInputModel, isOptional: false },
38
+ sessionId: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
39
+ metadata: { type: ScalarTypeEnum.JSONObject(), isOptional: true },
40
+ stream: { type: ScalarTypeEnum.Boolean(), isOptional: true },
41
+ maxIterations: {
42
+ type: ScalarTypeEnum.Int_unsecure(),
43
+ isOptional: true,
44
+ },
45
+ timeoutMs: { type: ScalarTypeEnum.Int_unsecure(), isOptional: true },
46
+ },
47
+ }),
48
+ output: defineSchemaModel({
49
+ name: 'ExecuteAgentOutput',
50
+ fields: {
51
+ runId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
52
+ status: { type: RunStatusEnum, isOptional: false },
53
+ estimatedWaitMs: {
54
+ type: ScalarTypeEnum.Int_unsecure(),
55
+ isOptional: true,
56
+ },
57
+ },
58
+ }),
59
+ errors: {
60
+ AGENT_NOT_FOUND: {
61
+ description: 'The specified agent does not exist',
62
+ http: 404,
63
+ gqlCode: 'AGENT_NOT_FOUND',
64
+ when: 'Agent ID is invalid',
65
+ },
66
+ AGENT_NOT_ACTIVE: {
67
+ description: 'The specified agent is not active',
68
+ http: 400,
69
+ gqlCode: 'AGENT_NOT_ACTIVE',
70
+ when: 'Agent is in draft/paused/archived state',
71
+ },
72
+ },
73
+ },
74
+ policy: { auth: 'user' },
75
+ sideEffects: {
76
+ emits: [
77
+ {
78
+ key: 'run.started',
79
+ version: '1.0.0',
80
+ stability: 'stable',
81
+ owners: [...OWNERS],
82
+ tags: ['run', 'started'],
83
+ when: 'Run is queued',
84
+ payload: RunSummaryModel,
85
+ },
86
+ ],
87
+ audit: ['run.started'],
88
+ },
89
+ acceptance: {
90
+ scenarios: [
91
+ {
92
+ key: 'execute-agent-happy-path',
93
+ given: ['Agent exists', 'Agent is active'],
94
+ when: ['User submits execution request'],
95
+ then: ['Run is created', 'RunStarted event is emitted'],
96
+ },
97
+ {
98
+ key: 'execute-agent-not-active',
99
+ given: ['Agent exists but is not active'],
100
+ when: ['User attempts to execute'],
101
+ then: ['AGENT_NOT_ACTIVE error is returned'],
102
+ },
103
+ ],
104
+ examples: [
105
+ {
106
+ key: 'basic-execute',
107
+ input: { agentId: 'agent-123', input: { message: 'Hello' } },
108
+ output: { runId: 'run-456', status: 'pending', estimatedWaitMs: 5000 },
109
+ },
110
+ ],
111
+ },
112
+ });
113
+
114
+ /**
115
+ * CancelRunCommand - Cancels an in-progress run.
116
+ */
117
+ export const CancelRunCommand = defineCommand({
118
+ meta: {
119
+ key: 'agent.run.cancel',
120
+ version: '1.0.0',
121
+ stability: 'stable',
122
+ owners: [...OWNERS],
123
+ tags: ['run', 'cancel'],
124
+ description: 'Cancels an in-progress agent run.',
125
+ goal: 'Stop a running agent execution.',
126
+ context: 'Called when user wants to abort a long-running task.',
127
+ },
128
+ io: {
129
+ input: defineSchemaModel({
130
+ name: 'CancelRunInput',
131
+ fields: {
132
+ runId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
133
+ reason: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
134
+ },
135
+ }),
136
+ output: defineSchemaModel({
137
+ name: 'CancelRunOutput',
138
+ fields: {
139
+ success: { type: ScalarTypeEnum.Boolean(), isOptional: false },
140
+ status: { type: RunStatusEnum, isOptional: false },
141
+ },
142
+ }),
143
+ errors: {
144
+ RUN_NOT_FOUND: {
145
+ description: 'The specified run does not exist',
146
+ http: 404,
147
+ gqlCode: 'RUN_NOT_FOUND',
148
+ when: 'Run ID is invalid',
149
+ },
150
+ RUN_NOT_CANCELLABLE: {
151
+ description: 'The run cannot be cancelled',
152
+ http: 400,
153
+ gqlCode: 'RUN_NOT_CANCELLABLE',
154
+ when: 'Run is already completed/failed/cancelled',
155
+ },
156
+ },
157
+ },
158
+ policy: { auth: 'user' },
159
+ sideEffects: {
160
+ emits: [
161
+ {
162
+ key: 'run.cancelled',
163
+ version: '1.0.0',
164
+ stability: 'stable',
165
+ owners: [...OWNERS],
166
+ tags: ['run', 'cancelled'],
167
+ when: 'Run is cancelled',
168
+ payload: RunSummaryModel,
169
+ },
170
+ ],
171
+ audit: ['run.cancelled'],
172
+ },
173
+ acceptance: {
174
+ scenarios: [
175
+ {
176
+ key: 'cancel-run-happy-path',
177
+ given: ['Run exists', 'Run is in progress'],
178
+ when: ['User cancels run'],
179
+ then: ['Run is cancelled', 'RunCancelled event is emitted'],
180
+ },
181
+ {
182
+ key: 'cancel-run-already-completed',
183
+ given: ['Run exists but is already completed'],
184
+ when: ['User attempts to cancel'],
185
+ then: ['RUN_NOT_CANCELLABLE error is returned'],
186
+ },
187
+ ],
188
+ examples: [
189
+ {
190
+ key: 'cancel-basic',
191
+ input: { runId: 'run-456', reason: 'User requested' },
192
+ output: { success: true, status: 'cancelled' },
193
+ },
194
+ ],
195
+ },
196
+ });
197
+
198
+ /**
199
+ * GetRunQuery - Retrieves a run by ID.
200
+ */
201
+ export const GetRunQuery = defineQuery({
202
+ meta: {
203
+ key: 'agent.run.get',
204
+ version: '1.0.0',
205
+ stability: 'stable',
206
+ owners: [...OWNERS],
207
+ tags: ['run', 'get'],
208
+ description: 'Retrieves a run by its ID with optional details.',
209
+ goal: 'View detailed run information.',
210
+ context: 'Run details page or monitoring.',
211
+ },
212
+ io: {
213
+ input: defineSchemaModel({
214
+ name: 'GetRunInput',
215
+ fields: {
216
+ runId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
217
+ includeSteps: { type: ScalarTypeEnum.Boolean(), isOptional: true },
218
+ includeLogs: { type: ScalarTypeEnum.Boolean(), isOptional: true },
219
+ },
220
+ }),
221
+ output: RunModel,
222
+ errors: {
223
+ RUN_NOT_FOUND: {
224
+ description: 'The specified run does not exist',
225
+ http: 404,
226
+ gqlCode: 'RUN_NOT_FOUND',
227
+ when: 'Run ID is invalid',
228
+ },
229
+ },
230
+ },
231
+ policy: { auth: 'user' },
232
+ acceptance: {
233
+ scenarios: [
234
+ {
235
+ key: 'get-run-happy-path',
236
+ given: ['Run exists'],
237
+ when: ['User requests run by ID'],
238
+ then: ['Run details are returned'],
239
+ },
240
+ ],
241
+ examples: [
242
+ {
243
+ key: 'get-with-steps',
244
+ input: { runId: 'run-456', includeSteps: true, includeLogs: false },
245
+ output: { id: 'run-456', status: 'completed', steps: [] },
246
+ },
247
+ ],
248
+ },
249
+ });
250
+
251
+ /**
252
+ * ListRunsQuery - Lists runs for an organization or agent.
253
+ */
254
+ export const ListRunsQuery = defineQuery({
255
+ meta: {
256
+ key: 'agent.run.list',
257
+ version: '1.0.0',
258
+ stability: 'stable',
259
+ owners: [...OWNERS],
260
+ tags: ['run', 'list'],
261
+ description: 'Lists runs with optional filtering.',
262
+ goal: 'Browse and search run history.',
263
+ context: 'Run history/dashboard view.',
264
+ },
265
+ io: {
266
+ input: defineSchemaModel({
267
+ name: 'ListRunsInput',
268
+ fields: {
269
+ organizationId: {
270
+ type: ScalarTypeEnum.String_unsecure(),
271
+ isOptional: true,
272
+ },
273
+ agentId: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
274
+ userId: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
275
+ sessionId: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
276
+ status: { type: RunStatusEnum, isOptional: true },
277
+ startDate: { type: ScalarTypeEnum.DateTime(), isOptional: true },
278
+ endDate: { type: ScalarTypeEnum.DateTime(), isOptional: true },
279
+ limit: {
280
+ type: ScalarTypeEnum.Int_unsecure(),
281
+ isOptional: true,
282
+ defaultValue: 20,
283
+ },
284
+ offset: {
285
+ type: ScalarTypeEnum.Int_unsecure(),
286
+ isOptional: true,
287
+ defaultValue: 0,
288
+ },
289
+ },
290
+ }),
291
+ output: defineSchemaModel({
292
+ name: 'ListRunsOutput',
293
+ fields: {
294
+ items: { type: RunSummaryModel, isArray: true, isOptional: false },
295
+ total: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },
296
+ hasMore: { type: ScalarTypeEnum.Boolean(), isOptional: false },
297
+ },
298
+ }),
299
+ },
300
+ policy: { auth: 'user' },
301
+ acceptance: {
302
+ scenarios: [
303
+ {
304
+ key: 'list-runs-happy-path',
305
+ given: ['Organization has runs'],
306
+ when: ['User lists runs'],
307
+ then: ['Paginated list of runs is returned'],
308
+ },
309
+ ],
310
+ examples: [
311
+ {
312
+ key: 'list-by-agent',
313
+ input: { agentId: 'agent-123', limit: 20, offset: 0 },
314
+ output: { items: [], total: 0, hasMore: false },
315
+ },
316
+ ],
317
+ },
318
+ });
319
+
320
+ /**
321
+ * GetRunStepsQuery - Retrieves steps for a run.
322
+ */
323
+ export const GetRunStepsQuery = defineQuery({
324
+ meta: {
325
+ key: 'agent.run.getSteps',
326
+ version: '1.0.0',
327
+ stability: 'stable',
328
+ owners: [...OWNERS],
329
+ tags: ['run', 'steps'],
330
+ description: 'Retrieves all steps for a specific run.',
331
+ goal: 'View step-by-step execution details.',
332
+ context: 'Run details page - steps tab.',
333
+ },
334
+ io: {
335
+ input: defineSchemaModel({
336
+ name: 'GetRunStepsInput',
337
+ fields: {
338
+ runId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
339
+ },
340
+ }),
341
+ output: defineSchemaModel({
342
+ name: 'GetRunStepsOutput',
343
+ fields: {
344
+ steps: { type: RunStepModel, isArray: true, isOptional: false },
345
+ },
346
+ }),
347
+ },
348
+ policy: { auth: 'user' },
349
+ acceptance: {
350
+ scenarios: [
351
+ {
352
+ key: 'get-run-steps-happy-path',
353
+ given: ['Run exists with steps'],
354
+ when: ['User requests steps'],
355
+ then: ['Steps list is returned'],
356
+ },
357
+ ],
358
+ examples: [
359
+ {
360
+ key: 'get-steps-basic',
361
+ input: { runId: 'run-456' },
362
+ output: { steps: [] },
363
+ },
364
+ ],
365
+ },
366
+ });
367
+
368
+ /**
369
+ * GetRunLogsQuery - Retrieves logs for a run.
370
+ */
371
+ export const GetRunLogsQuery = defineQuery({
372
+ meta: {
373
+ key: 'agent.run.getLogs',
374
+ version: '1.0.0',
375
+ stability: 'stable',
376
+ owners: [...OWNERS],
377
+ tags: ['run', 'logs'],
378
+ description: 'Retrieves all logs for a specific run.',
379
+ goal: 'Debug and audit run execution.',
380
+ context: 'Run details page - logs tab.',
381
+ },
382
+ io: {
383
+ input: defineSchemaModel({
384
+ name: 'GetRunLogsInput',
385
+ fields: {
386
+ runId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
387
+ level: { type: LogLevelEnum, isOptional: true },
388
+ stepId: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
389
+ limit: {
390
+ type: ScalarTypeEnum.Int_unsecure(),
391
+ isOptional: true,
392
+ defaultValue: 100,
393
+ },
394
+ offset: {
395
+ type: ScalarTypeEnum.Int_unsecure(),
396
+ isOptional: true,
397
+ defaultValue: 0,
398
+ },
399
+ },
400
+ }),
401
+ output: defineSchemaModel({
402
+ name: 'GetRunLogsOutput',
403
+ fields: {
404
+ items: { type: RunLogModel, isArray: true, isOptional: false },
405
+ total: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },
406
+ hasMore: { type: ScalarTypeEnum.Boolean(), isOptional: false },
407
+ },
408
+ }),
409
+ },
410
+ policy: { auth: 'user' },
411
+ acceptance: {
412
+ scenarios: [
413
+ {
414
+ key: 'get-run-logs-happy-path',
415
+ given: ['Run exists with logs'],
416
+ when: ['User requests logs'],
417
+ then: ['Paginated logs list is returned'],
418
+ },
419
+ ],
420
+ examples: [
421
+ {
422
+ key: 'get-logs-filtered',
423
+ input: { runId: 'run-456', level: 'error', limit: 50 },
424
+ output: { items: [], total: 0, hasMore: false },
425
+ },
426
+ ],
427
+ },
428
+ });
429
+
430
+ /**
431
+ * GetRunMetricsQuery - Retrieves aggregated metrics for runs.
432
+ */
433
+ export const GetRunMetricsQuery = defineQuery({
434
+ meta: {
435
+ key: 'agent.run.getMetrics',
436
+ version: '1.0.0',
437
+ stability: 'stable',
438
+ owners: [...OWNERS],
439
+ tags: ['run', 'metrics'],
440
+ description: 'Retrieves aggregated metrics for runs within a time period.',
441
+ goal: 'Monitor and analyze agent usage.',
442
+ context: 'Analytics dashboard.',
443
+ },
444
+ io: {
445
+ input: defineSchemaModel({
446
+ name: 'GetRunMetricsInput',
447
+ fields: {
448
+ organizationId: {
449
+ type: ScalarTypeEnum.String_unsecure(),
450
+ isOptional: false,
451
+ },
452
+ agentId: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
453
+ startDate: { type: ScalarTypeEnum.DateTime(), isOptional: false },
454
+ endDate: { type: ScalarTypeEnum.DateTime(), isOptional: false },
455
+ granularity: {
456
+ type: GranularityEnum,
457
+ isOptional: true,
458
+ defaultValue: 'day',
459
+ },
460
+ },
461
+ }),
462
+ output: defineSchemaModel({
463
+ name: 'GetRunMetricsOutput',
464
+ fields: {
465
+ totalRuns: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },
466
+ completedRuns: {
467
+ type: ScalarTypeEnum.Int_unsecure(),
468
+ isOptional: false,
469
+ },
470
+ failedRuns: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },
471
+ totalTokens: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },
472
+ totalCostUsd: {
473
+ type: ScalarTypeEnum.Float_unsecure(),
474
+ isOptional: false,
475
+ },
476
+ averageDurationMs: {
477
+ type: ScalarTypeEnum.Float_unsecure(),
478
+ isOptional: false,
479
+ },
480
+ successRate: {
481
+ type: ScalarTypeEnum.Float_unsecure(),
482
+ isOptional: false,
483
+ },
484
+ timeline: {
485
+ type: TimelineDataPointModel,
486
+ isArray: true,
487
+ isOptional: false,
488
+ },
489
+ },
490
+ }),
491
+ },
492
+ policy: { auth: 'user' },
493
+ acceptance: {
494
+ scenarios: [
495
+ {
496
+ key: 'get-run-metrics-happy-path',
497
+ given: ['Organization has run history'],
498
+ when: ['User requests metrics for date range'],
499
+ then: ['Aggregated metrics are returned'],
500
+ },
501
+ ],
502
+ examples: [
503
+ {
504
+ key: 'get-daily-metrics',
505
+ input: {
506
+ organizationId: 'org-123',
507
+ startDate: '2025-01-01',
508
+ endDate: '2025-01-31',
509
+ granularity: 'day',
510
+ },
511
+ output: {
512
+ totalRuns: 100,
513
+ completedRuns: 90,
514
+ failedRuns: 10,
515
+ totalTokens: 50000,
516
+ totalCostUsd: 5.0,
517
+ averageDurationMs: 2500,
518
+ successRate: 0.9,
519
+ timeline: [],
520
+ },
521
+ },
522
+ ],
523
+ },
524
+ });
@@ -0,0 +1,54 @@
1
+ import { StabilityEnum, definePresentation } from '@contractspec/lib.contracts';
2
+ import { RunSummaryModel } from './run.schema';
3
+
4
+ /**
5
+ * Presentation for displaying a list of agent runs.
6
+ */
7
+ export const RunListPresentation = definePresentation({
8
+ meta: {
9
+ key: 'agent-console.run.list',
10
+ version: '1.0.0',
11
+ title: 'Run List',
12
+ description:
13
+ 'List view of agent runs with status, tokens, and duration info',
14
+ goal: 'Provide an overview of agent execution history and performance.',
15
+ context: 'Run history dashboard.',
16
+ domain: 'agent-console',
17
+ owners: ['@agent-console-team'],
18
+ tags: ['run', 'list', 'dashboard'],
19
+ stability: StabilityEnum.Experimental,
20
+ },
21
+ source: {
22
+ type: 'component',
23
+ framework: 'react',
24
+ componentKey: 'RunListView',
25
+ props: RunSummaryModel,
26
+ },
27
+ targets: ['react', 'markdown', 'application/json'],
28
+ policy: { flags: ['agent-console.enabled'] },
29
+ });
30
+
31
+ /**
32
+ * Presentation for run detail view.
33
+ */
34
+ export const RunDetailPresentation = definePresentation({
35
+ meta: {
36
+ key: 'agent-console.run.detail',
37
+ version: '1.0.0',
38
+ title: 'Run Details',
39
+ description: 'Detailed view of an agent run with steps, logs, and metrics',
40
+ goal: 'Allow users to inspect and debug a specific agent run.',
41
+ context: 'Detailed view of an agent run.',
42
+ domain: 'agent-console',
43
+ owners: ['@agent-console-team'],
44
+ tags: ['run', 'detail'],
45
+ stability: StabilityEnum.Experimental,
46
+ },
47
+ source: {
48
+ type: 'component',
49
+ framework: 'react',
50
+ componentKey: 'RunDetailView',
51
+ },
52
+ targets: ['react', 'markdown'],
53
+ policy: { flags: ['agent-console.enabled'] },
54
+ });