@contractspec/example.agent-console 3.8.10 → 3.8.12

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.
@@ -2,14 +2,14 @@ $ contractspec-bun-build prebuild
2
2
  $ bun run build:bundle && bun run build:types
3
3
  $ contractspec-bun-build transpile
4
4
  [contractspec-bun-build] transpile target=bun root=src entries=74 noBundle=false
5
- Bundled 80 modules in 92ms
5
+ Bundled 80 modules in 106ms
6
6
 
7
7
  ./agent.capability.js 318 bytes (entry point)
8
8
  tool/tool.test-spec.js 0.97 KB (entry point)
9
9
  shared/overlay-types.js 8 bytes (entry point)
10
10
  run/run.test-spec.js 0.96 KB (entry point)
11
11
  seeders/index.js 471 bytes (entry point)
12
- ./index.js 137.16 KB (entry point)
12
+ ./index.js 137.17 KB (entry point)
13
13
  ui/index.js 52.83 KB (entry point)
14
14
  ui/views/index.js 13.11 KB (entry point)
15
15
  ui/overlays/index.js 0.98 KB (entry point)
@@ -53,7 +53,7 @@ Bundled 80 modules in 92ms
53
53
  agent/index.js 26.77 KB (entry point)
54
54
  docs/index.js 3.88 KB (entry point)
55
55
  docs/agent-console.docblock.js 3.88 KB (entry point)
56
- ./example.js 0.93 KB (entry point)
56
+ ./example.js 0.94 KB (entry point)
57
57
  handlers/index.js 60.38 KB (entry point)
58
58
  tool/tool.handler.js 13.52 KB (entry point)
59
59
  run/run.handler.js 18.43 KB (entry point)
@@ -80,14 +80,14 @@ Bundled 80 modules in 92ms
80
80
  agent/agent.enum.js 314 bytes (entry point)
81
81
 
82
82
  [contractspec-bun-build] transpile target=node root=src entries=74 noBundle=false
83
- Bundled 80 modules in 100ms
83
+ Bundled 80 modules in 130ms
84
84
 
85
85
  ./agent.capability.js 310 bytes (entry point)
86
86
  tool/tool.test-spec.js 0.96 KB (entry point)
87
87
  shared/overlay-types.js 0 KB (entry point)
88
88
  run/run.test-spec.js 0.95 KB (entry point)
89
89
  seeders/index.js 463 bytes (entry point)
90
- ./index.js 137.1 KB (entry point)
90
+ ./index.js 137.11 KB (entry point)
91
91
  ui/index.js 52.78 KB (entry point)
92
92
  ui/views/index.js 13.1 KB (entry point)
93
93
  ui/overlays/index.js 0.97 KB (entry point)
@@ -131,7 +131,7 @@ Bundled 80 modules in 100ms
131
131
  agent/index.js 26.77 KB (entry point)
132
132
  docs/index.js 3.86 KB (entry point)
133
133
  docs/agent-console.docblock.js 3.86 KB (entry point)
134
- ./example.js 0.92 KB (entry point)
134
+ ./example.js 0.93 KB (entry point)
135
135
  handlers/index.js 60.37 KB (entry point)
136
136
  tool/tool.handler.js 13.52 KB (entry point)
137
137
  run/run.handler.js 18.42 KB (entry point)
@@ -158,14 +158,14 @@ Bundled 80 modules in 100ms
158
158
  agent/agent.enum.js 306 bytes (entry point)
159
159
 
160
160
  [contractspec-bun-build] transpile target=browser root=src entries=74 noBundle=false
161
- Bundled 80 modules in 80ms
161
+ Bundled 80 modules in 131ms
162
162
 
163
163
  ./agent.capability.js 310 bytes (entry point)
164
164
  tool/tool.test-spec.js 0.96 KB (entry point)
165
165
  shared/overlay-types.js 0 KB (entry point)
166
166
  run/run.test-spec.js 0.95 KB (entry point)
167
167
  seeders/index.js 463 bytes (entry point)
168
- ./index.js 137.1 KB (entry point)
168
+ ./index.js 137.11 KB (entry point)
169
169
  ui/index.js 52.78 KB (entry point)
170
170
  ui/views/index.js 13.1 KB (entry point)
171
171
  ui/overlays/index.js 0.97 KB (entry point)
@@ -209,7 +209,7 @@ Bundled 80 modules in 80ms
209
209
  agent/index.js 26.77 KB (entry point)
210
210
  docs/index.js 3.86 KB (entry point)
211
211
  docs/agent-console.docblock.js 3.86 KB (entry point)
212
- ./example.js 0.92 KB (entry point)
212
+ ./example.js 0.93 KB (entry point)
213
213
  handlers/index.js 60.37 KB (entry point)
214
214
  tool/tool.handler.js 13.52 KB (entry point)
215
215
  run/run.handler.js 18.42 KB (entry point)
package/CHANGELOG.md CHANGED
@@ -1,5 +1,37 @@
1
1
  # @contractspec/example.agent-console
2
2
 
3
+ ## 3.8.12
4
+
5
+ ### Patch Changes
6
+
7
+ - Unify example preview metadata so templates and docs derive inline preview support from shared example registry data instead of hand-maintained lists.
8
+ - Packages: @contractspec/module.examples (minor), @contractspec/bundle.marketing (patch), @contractspec/bundle.library (patch), @contractspec/app.web-landing (patch), @contractspec/example.agent-console (patch), @contractspec/example.ai-chat-assistant (patch), @contractspec/example.analytics-dashboard (patch), @contractspec/example.crm-pipeline (patch), @contractspec/example.integration-hub (patch), @contractspec/example.learning-journey-registry (patch), @contractspec/example.marketplace (patch), @contractspec/example.policy-safe-knowledge-assistant (patch), @contractspec/example.saas-boilerplate (patch), @contractspec/example.workflow-system (patch)
9
+ - Migration: Any published example that exports `./ui` should also advertise that UI surface in its `ExampleSpec` entrypoints so preview tooling can discover it.
10
+ - Updated dependencies because of Add a family-aware ContractSpec Adoption Engine, expand contract authoring targets across CLI and VS Code tooling, and refresh release-facing schema and policy artifacts for downstream workspaces.
11
+ - Updated dependencies because of chore: auto-bump internal dependents
12
+ - Updated dependencies because of Improve app-config, theme, and feature authoring with explicit validation APIs, first-class theme discovery and scaffolding, and key-based app-config generation across contracts, workspace tooling, and the CLI.
13
+ - Updated dependencies because of Harden the shared data-table stack and add a first-class composed toolbar for search, filter chips, selection summary, and hidden-column recovery.
14
+ - Updated dependencies because of Refresh root, package, website, and LLM-facing docs so Connect, Builder, release capsules, and the current contracts-spec export surface stay aligned.
15
+ - Updated dependencies because of Persist canonical knowledge payload text during indexing and align the retrieval/query docs with the corrected behavior.
16
+ - @contractspec/lib.contracts-spec@5.4.0
17
+ - @contractspec/lib.example-shared-ui@6.0.20
18
+ - @contractspec/lib.presentation-runtime-core@3.9.8
19
+ - @contractspec/module.execution-console@0.1.3
20
+ - @contractspec/lib.design-system@3.10.0
21
+ - @contractspec/lib.ui-kit-web@3.10.1
22
+
23
+ ## 3.8.11
24
+
25
+ ### Patch Changes
26
+
27
+ - Updated dependencies because of Expand ContractSpec authoring with preset-driven workspace setup, shell completion, packaged workspace schema artifacts, and richer form and UI surfaces across the CLI, editors, and shared runtimes.
28
+ - @contractspec/lib.contracts-spec@5.3.0
29
+ - @contractspec/lib.design-system@3.9.0
30
+ - @contractspec/lib.ui-kit-web@3.10.0
31
+ - @contractspec/lib.example-shared-ui@6.0.19
32
+ - @contractspec/lib.presentation-runtime-core@3.9.7
33
+ - @contractspec/module.execution-console@0.1.2
34
+
3
35
  ## 3.8.10
4
36
 
5
37
  ### Patch Changes
@@ -1 +1 @@
1
- import{defineExample as g}from"@contractspec/lib.contracts-spec";var h=g({meta:{key:"agent-console",version:"1.0.0",title:"Agent Console",description:"AI agent ops console: tools, agents, runs, logs, and metrics (spec-first, regenerable).",kind:"template",visibility:"public",stability:"beta",owners:["@platform.core"],tags:["ai","agents","tools","orchestration"]},docs:{rootDocId:"docs.examples.agent-console.reference",goalDocId:"docs.examples.agent-console.goal",usageDocId:"docs.examples.agent-console.usage",constraintsDocId:"docs.examples.agent-console.constraints"},entrypoints:{packageName:"@contractspec/example.agent-console",feature:"./agent.feature",presentations:"./presentations",handlers:"./handlers",docs:"./docs"},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs","builder","markdown","evolution"]},studio:{enabled:!0,installable:!0},mcp:{enabled:!0}}}),q=h;export{q as default};
1
+ import{defineExample as g}from"@contractspec/lib.contracts-spec";var h=g({meta:{key:"agent-console",version:"1.0.0",title:"Agent Console",description:"AI agent ops console: tools, agents, runs, logs, and metrics (spec-first, regenerable).",kind:"template",visibility:"public",stability:"beta",owners:["@platform.core"],tags:["ai","agents","tools","orchestration"]},docs:{rootDocId:"docs.examples.agent-console.reference",goalDocId:"docs.examples.agent-console.goal",usageDocId:"docs.examples.agent-console.usage",constraintsDocId:"docs.examples.agent-console.constraints"},entrypoints:{packageName:"@contractspec/example.agent-console",feature:"./agent.feature",presentations:"./presentations",handlers:"./handlers",docs:"./docs",ui:"./ui"},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs","builder","markdown","evolution"]},studio:{enabled:!0,installable:!0},mcp:{enabled:!0}}}),q=h;export{q as default};
@@ -49,7 +49,7 @@ import{defineVisualization as Y2,VisualizationRegistry as z4}from"@contractspec/
49
49
  ## Verification
50
50
  - Add fixtures for tool schema changes and run lifecycle.
51
51
  - Ensure Audit/Notifications remain wired for runs; metrics collection unchanged.
52
- - Use Feature Flags to gate risky tools; default safe/off.`}];C4(h4);import{defineExample as f4}from"@contractspec/lib.contracts-spec";var j4=f4({meta:{key:"agent-console",version:"1.0.0",title:"Agent Console",description:"AI agent ops console: tools, agents, runs, logs, and metrics (spec-first, regenerable).",kind:"template",visibility:"public",stability:"beta",owners:["@platform.core"],tags:["ai","agents","tools","orchestration"]},docs:{rootDocId:"docs.examples.agent-console.reference",goalDocId:"docs.examples.agent-console.goal",usageDocId:"docs.examples.agent-console.usage",constraintsDocId:"docs.examples.agent-console.constraints"},entrypoints:{packageName:"@contractspec/example.agent-console",feature:"./agent.feature",presentations:"./presentations",handlers:"./handlers",docs:"./docs"},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs","builder","markdown","evolution"]},studio:{enabled:!0,installable:!0},mcp:{enabled:!0}}}),x4=j4;import{defineEnum as d0}from"@contractspec/lib.schema";var a=d0("RunStatus",["QUEUED","IN_PROGRESS","COMPLETED","FAILED","CANCELLED","EXPIRED"]),W2=d0("RunStepType",["MESSAGE_CREATION","TOOL_CALL","TOOL_RESULT","ERROR"]),R0=d0("LogLevel",["DEBUG","INFO","WARN","ERROR"]),_2=d0("Granularity",["hour","day","week","month"]);import{defineSchemaModel as $0,ScalarTypeEnum as I}from"@contractspec/lib.schema";var N2=$0({name:"RunInput",description:"Input data for agent execution",fields:{message:{type:I.NonEmptyString(),isOptional:!1},context:{type:I.JSONObject(),isOptional:!0}}}),m0=$0({name:"RunStep",description:"Individual step within a run",fields:{id:{type:I.String_unsecure(),isOptional:!1},stepNumber:{type:I.Int_unsecure(),isOptional:!1},type:{type:W2,isOptional:!1},toolId:{type:I.String_unsecure(),isOptional:!0},toolName:{type:I.String_unsecure(),isOptional:!0},input:{type:I.JSONObject(),isOptional:!0},output:{type:I.JSONObject(),isOptional:!0},status:{type:a,isOptional:!1},errorMessage:{type:I.String_unsecure(),isOptional:!0},tokensUsed:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},durationMs:{type:I.Int_unsecure(),isOptional:!0},startedAt:{type:I.DateTime(),isOptional:!1},completedAt:{type:I.DateTime(),isOptional:!0}}}),E0=$0({name:"RunLog",description:"Execution log entry",fields:{id:{type:I.String_unsecure(),isOptional:!1},stepId:{type:I.String_unsecure(),isOptional:!0},level:{type:R0,isOptional:!1},message:{type:I.String_unsecure(),isOptional:!1},data:{type:I.JSONObject(),isOptional:!0},source:{type:I.String_unsecure(),isOptional:!0},traceId:{type:I.String_unsecure(),isOptional:!0},spanId:{type:I.String_unsecure(),isOptional:!0},timestamp:{type:I.DateTime(),isOptional:!1}}}),A1=$0({name:"RunAgentRef",description:"Agent reference in a run",fields:{id:{type:I.String_unsecure(),isOptional:!1},name:{type:I.NonEmptyString(),isOptional:!1},modelProvider:{type:I.String_unsecure(),isOptional:!1},modelName:{type:I.String_unsecure(),isOptional:!1}}}),L2=$0({name:"Run",description:"Agent execution instance",fields:{id:{type:I.String_unsecure(),isOptional:!1},organizationId:{type:I.String_unsecure(),isOptional:!1},agentId:{type:I.String_unsecure(),isOptional:!1},userId:{type:I.String_unsecure(),isOptional:!0},sessionId:{type:I.String_unsecure(),isOptional:!0},input:{type:I.JSONObject(),isOptional:!1},output:{type:I.JSONObject(),isOptional:!0},status:{type:a,isOptional:!1},errorMessage:{type:I.String_unsecure(),isOptional:!0},errorCode:{type:I.String_unsecure(),isOptional:!0},totalTokens:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},promptTokens:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},completionTokens:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},totalIterations:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},durationMs:{type:I.Int_unsecure(),isOptional:!0},estimatedCostUsd:{type:I.Float_unsecure(),isOptional:!0},queuedAt:{type:I.DateTime(),isOptional:!1},startedAt:{type:I.DateTime(),isOptional:!0},completedAt:{type:I.DateTime(),isOptional:!0},metadata:{type:I.JSONObject(),isOptional:!0},steps:{type:m0,isArray:!0,isOptional:!0},logs:{type:E0,isArray:!0,isOptional:!0},agent:{type:A1,isOptional:!0}}}),X0=$0({name:"RunSummary",description:"Summary of a run for list views",fields:{id:{type:I.String_unsecure(),isOptional:!1},agentId:{type:I.String_unsecure(),isOptional:!1},agentName:{type:I.NonEmptyString(),isOptional:!1},status:{type:a,isOptional:!1},totalTokens:{type:I.Int_unsecure(),isOptional:!1},durationMs:{type:I.Int_unsecure(),isOptional:!0},estimatedCostUsd:{type:I.Float_unsecure(),isOptional:!0},queuedAt:{type:I.DateTime(),isOptional:!1},completedAt:{type:I.DateTime(),isOptional:!0}}}),R2=$0({name:"TimelineDataPoint",description:"Timeline data point for metrics",fields:{period:{type:I.String_unsecure(),isOptional:!1},runs:{type:I.Int_unsecure(),isOptional:!1},tokens:{type:I.Int_unsecure(),isOptional:!1},costUsd:{type:I.Float_unsecure(),isOptional:!1},avgDurationMs:{type:I.Float_unsecure(),isOptional:!1}}});import{defineCommand as V1,defineQuery as O0}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as S,ScalarTypeEnum as N}from"@contractspec/lib.schema";var e=["@agent-console-team"],O2=V1({meta:{key:"agent.run.execute",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","execute"],description:"Starts a new agent run with the given input.",goal:"Execute an AI agent with user input.",context:"Called from chat interface or API."},io:{input:S({name:"ExecuteAgentInput",fields:{agentId:{type:N.String_unsecure(),isOptional:!1},input:{type:N2,isOptional:!1},sessionId:{type:N.String_unsecure(),isOptional:!0},metadata:{type:N.JSONObject(),isOptional:!0},stream:{type:N.Boolean(),isOptional:!0},maxIterations:{type:N.Int_unsecure(),isOptional:!0},timeoutMs:{type:N.Int_unsecure(),isOptional:!0}}}),output:S({name:"ExecuteAgentOutput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},status:{type:a,isOptional:!1},estimatedWaitMs:{type:N.Int_unsecure(),isOptional:!0}}}),errors:{AGENT_NOT_FOUND:{description:"The specified agent does not exist",http:404,gqlCode:"AGENT_NOT_FOUND",when:"Agent ID is invalid"},AGENT_NOT_ACTIVE:{description:"The specified agent is not active",http:400,gqlCode:"AGENT_NOT_ACTIVE",when:"Agent is in draft/paused/archived state"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"run.started",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","started"],when:"Run is queued",payload:X0}],audit:["run.started"]},acceptance:{scenarios:[{key:"execute-agent-happy-path",given:["Agent exists","Agent is active"],when:["User submits execution request"],then:["Run is created","RunStarted event is emitted"]},{key:"execute-agent-not-active",given:["Agent exists but is not active"],when:["User attempts to execute"],then:["AGENT_NOT_ACTIVE error is returned"]}],examples:[{key:"basic-execute",input:{agentId:"agent-123",input:{message:"Hello"}},output:{runId:"run-456",status:"pending",estimatedWaitMs:5000}}]}}),K1=V1({meta:{key:"agent.run.cancel",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","cancel"],description:"Cancels an in-progress agent run.",goal:"Stop a running agent execution.",context:"Called when user wants to abort a long-running task."},io:{input:S({name:"CancelRunInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},reason:{type:N.String_unsecure(),isOptional:!0}}}),output:S({name:"CancelRunOutput",fields:{success:{type:N.Boolean(),isOptional:!1},status:{type:a,isOptional:!1}}}),errors:{RUN_NOT_FOUND:{description:"The specified run does not exist",http:404,gqlCode:"RUN_NOT_FOUND",when:"Run ID is invalid"},RUN_NOT_CANCELLABLE:{description:"The run cannot be cancelled",http:400,gqlCode:"RUN_NOT_CANCELLABLE",when:"Run is already completed/failed/cancelled"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"run.cancelled",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","cancelled"],when:"Run is cancelled",payload:X0}],audit:["run.cancelled"]},acceptance:{scenarios:[{key:"cancel-run-happy-path",given:["Run exists","Run is in progress"],when:["User cancels run"],then:["Run is cancelled","RunCancelled event is emitted"]},{key:"cancel-run-already-completed",given:["Run exists but is already completed"],when:["User attempts to cancel"],then:["RUN_NOT_CANCELLABLE error is returned"]}],examples:[{key:"cancel-basic",input:{runId:"run-456",reason:"User requested"},output:{success:!0,status:"cancelled"}}]}}),k1=O0({meta:{key:"agent.run.get",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","get"],description:"Retrieves a run by its ID with optional details.",goal:"View detailed run information.",context:"Run details page or monitoring."},io:{input:S({name:"GetRunInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},includeSteps:{type:N.Boolean(),isOptional:!0},includeLogs:{type:N.Boolean(),isOptional:!0}}}),output:L2,errors:{RUN_NOT_FOUND:{description:"The specified run does not exist",http:404,gqlCode:"RUN_NOT_FOUND",when:"Run ID is invalid"}}},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-happy-path",given:["Run exists"],when:["User requests run by ID"],then:["Run details are returned"]}],examples:[{key:"get-with-steps",input:{runId:"run-456",includeSteps:!0,includeLogs:!1},output:{id:"run-456",status:"completed",steps:[]}}]}}),M2=O0({meta:{key:"agent.run.list",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","list"],description:"Lists runs with optional filtering.",goal:"Browse and search run history.",context:"Run history/dashboard view."},io:{input:S({name:"ListRunsInput",fields:{organizationId:{type:N.String_unsecure(),isOptional:!0},agentId:{type:N.String_unsecure(),isOptional:!0},userId:{type:N.String_unsecure(),isOptional:!0},sessionId:{type:N.String_unsecure(),isOptional:!0},status:{type:a,isOptional:!0},startDate:{type:N.DateTime(),isOptional:!0},endDate:{type:N.DateTime(),isOptional:!0},limit:{type:N.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:N.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:S({name:"ListRunsOutput",fields:{items:{type:X0,isArray:!0,isOptional:!1},total:{type:N.Int_unsecure(),isOptional:!1},hasMore:{type:N.Boolean(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-runs-happy-path",given:["Organization has runs"],when:["User lists runs"],then:["Paginated list of runs is returned"]}],examples:[{key:"list-by-agent",input:{agentId:"agent-123",limit:20,offset:0},output:{items:[],total:0,hasMore:!1}}]}}),g4=O0({meta:{key:"agent.run.getSteps",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","steps"],description:"Retrieves all steps for a specific run.",goal:"View step-by-step execution details.",context:"Run details page - steps tab."},io:{input:S({name:"GetRunStepsInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1}}}),output:S({name:"GetRunStepsOutput",fields:{steps:{type:m0,isArray:!0,isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-steps-happy-path",given:["Run exists with steps"],when:["User requests steps"],then:["Steps list is returned"]}],examples:[{key:"get-steps-basic",input:{runId:"run-456"},output:{steps:[]}}]}}),T4=O0({meta:{key:"agent.run.getLogs",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","logs"],description:"Retrieves all logs for a specific run.",goal:"Debug and audit run execution.",context:"Run details page - logs tab."},io:{input:S({name:"GetRunLogsInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},level:{type:R0,isOptional:!0},stepId:{type:N.String_unsecure(),isOptional:!0},limit:{type:N.Int_unsecure(),isOptional:!0,defaultValue:100},offset:{type:N.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:S({name:"GetRunLogsOutput",fields:{items:{type:E0,isArray:!0,isOptional:!1},total:{type:N.Int_unsecure(),isOptional:!1},hasMore:{type:N.Boolean(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-logs-happy-path",given:["Run exists with logs"],when:["User requests logs"],then:["Paginated logs list is returned"]}],examples:[{key:"get-logs-filtered",input:{runId:"run-456",level:"error",limit:50},output:{items:[],total:0,hasMore:!1}}]}}),P1=O0({meta:{key:"agent.run.getMetrics",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","metrics"],description:"Retrieves aggregated metrics for runs within a time period.",goal:"Monitor and analyze agent usage.",context:"Analytics dashboard."},io:{input:S({name:"GetRunMetricsInput",fields:{organizationId:{type:N.String_unsecure(),isOptional:!1},agentId:{type:N.String_unsecure(),isOptional:!0},startDate:{type:N.DateTime(),isOptional:!1},endDate:{type:N.DateTime(),isOptional:!1},granularity:{type:_2,isOptional:!0,defaultValue:"day"}}}),output:S({name:"GetRunMetricsOutput",fields:{totalRuns:{type:N.Int_unsecure(),isOptional:!1},completedRuns:{type:N.Int_unsecure(),isOptional:!1},failedRuns:{type:N.Int_unsecure(),isOptional:!1},totalTokens:{type:N.Int_unsecure(),isOptional:!1},totalCostUsd:{type:N.Float_unsecure(),isOptional:!1},averageDurationMs:{type:N.Float_unsecure(),isOptional:!1},successRate:{type:N.Float_unsecure(),isOptional:!1},timeline:{type:R2,isArray:!0,isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-metrics-happy-path",given:["Organization has run history"],when:["User requests metrics for date range"],then:["Aggregated metrics are returned"]}],examples:[{key:"get-daily-metrics",input:{organizationId:"org-123",startDate:"2025-01-01",endDate:"2025-01-31",granularity:"day"},output:{totalRuns:100,completedRuns:90,failedRuns:10,totalTokens:50000,totalCostUsd:5,averageDurationMs:2500,successRate:0.9,timeline:[]}}]}});import{defineEnum as b2}from"@contractspec/lib.schema";var z0=b2("ToolCategory",["RETRIEVAL","COMPUTATION","COMMUNICATION","INTEGRATION","UTILITY","CUSTOM"]),Z0=b2("ToolStatus",["DRAFT","ACTIVE","DEPRECATED","DISABLED"]),p0=b2("ImplementationType",["http","function","workflow"]);import{defineSchemaModel as o0,ScalarTypeEnum as O}from"@contractspec/lib.schema";var w2=o0({name:"Tool",description:"AI tool definition",fields:{id:{type:O.String_unsecure(),isOptional:!1},organizationId:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!1},slug:{type:O.String_unsecure(),isOptional:!1},description:{type:O.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!1},status:{type:Z0,isOptional:!1},parametersSchema:{type:O.JSONObject(),isOptional:!1},outputSchema:{type:O.JSONObject(),isOptional:!0},implementationType:{type:p0,isOptional:!1},implementationConfig:{type:O.JSONObject(),isOptional:!1},maxInvocationsPerMinute:{type:O.Int_unsecure(),isOptional:!0},timeoutMs:{type:O.Int_unsecure(),isOptional:!1,defaultValue:30000},version:{type:O.NonEmptyString(),isOptional:!1},tags:{type:O.String_unsecure(),isArray:!0,isOptional:!0},createdAt:{type:O.DateTime(),isOptional:!1},updatedAt:{type:O.DateTime(),isOptional:!1}}}),Q0=o0({name:"ToolSummary",description:"Summary of a tool for list views",fields:{id:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!1},slug:{type:O.String_unsecure(),isOptional:!1},description:{type:O.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!1},status:{type:Z0,isOptional:!1},version:{type:O.NonEmptyString(),isOptional:!1},createdAt:{type:O.DateTime(),isOptional:!1}}}),C2=o0({name:"CreateToolInput",description:"Input for creating a tool",fields:{organizationId:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!1},slug:{type:O.String_unsecure(),isOptional:!1},description:{type:O.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!0},parametersSchema:{type:O.JSONObject(),isOptional:!1},outputSchema:{type:O.JSONObject(),isOptional:!0},implementationType:{type:p0,isOptional:!1},implementationConfig:{type:O.JSONObject(),isOptional:!1},maxInvocationsPerMinute:{type:O.Int_unsecure(),isOptional:!0},timeoutMs:{type:O.Int_unsecure(),isOptional:!0},tags:{type:O.String_unsecure(),isArray:!0,isOptional:!0}}}),h2=o0({name:"UpdateToolInput",description:"Input for updating a tool",fields:{toolId:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!0},description:{type:O.String_unsecure(),isOptional:!0},status:{type:Z0,isOptional:!0},parametersSchema:{type:O.JSONObject(),isOptional:!0},outputSchema:{type:O.JSONObject(),isOptional:!0},implementationConfig:{type:O.JSONObject(),isOptional:!0},maxInvocationsPerMinute:{type:O.Int_unsecure(),isOptional:!0},timeoutMs:{type:O.Int_unsecure(),isOptional:!0},tags:{type:O.String_unsecure(),isArray:!0,isOptional:!0}}});import{defineCommand as f2,defineQuery as I1}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as G0,ScalarTypeEnum as x}from"@contractspec/lib.schema";var F0=["@agent-console-team"],B1=f2({meta:{key:"agent.tool.create",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","create"],description:"Creates a new AI tool definition.",goal:"Allow users to define new tools that agents can use.",context:"Called from the tool builder UI when creating a new tool."},io:{input:C2,output:G0({name:"CreateToolOutput",fields:{id:{type:x.String_unsecure(),isOptional:!1},name:{type:x.NonEmptyString(),isOptional:!1},slug:{type:x.String_unsecure(),isOptional:!1},status:{type:Z0,isOptional:!1}}}),errors:{SLUG_EXISTS:{description:"A tool with this slug already exists in the organization",http:409,gqlCode:"SLUG_EXISTS",when:"Slug is already taken"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"tool.created",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","created"],when:"Tool is successfully created",payload:Q0}],audit:["tool.created"]},acceptance:{scenarios:[{key:"create-tool-happy-path",given:["User is authenticated","Organization exists"],when:["User submits valid tool configuration"],then:["New tool is created","ToolCreated event is emitted"]},{key:"create-tool-slug-conflict",given:["Tool with same slug exists"],when:["User submits tool with duplicate slug"],then:["SLUG_EXISTS error is returned"]}],examples:[{key:"create-api-tool",input:{name:"Weather API",slug:"weather-api",category:"api",description:"Fetches weather data"},output:{id:"tool-123",name:"Weather API",slug:"weather-api",status:"draft"}}]}}),v1=f2({meta:{key:"agent.tool.update",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","update"],description:"Updates an existing AI tool definition.",goal:"Allow users to modify tool settings and configuration.",context:"Called from the tool settings UI."},io:{input:h2,output:G0({name:"UpdateToolOutput",fields:{id:{type:x.String_unsecure(),isOptional:!1},name:{type:x.NonEmptyString(),isOptional:!1},status:{type:Z0,isOptional:!1},updatedAt:{type:x.DateTime(),isOptional:!1}}}),errors:{TOOL_NOT_FOUND:{description:"The specified tool does not exist",http:404,gqlCode:"TOOL_NOT_FOUND",when:"Tool ID is invalid"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"tool.updated",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","updated"],when:"Tool is updated",payload:Q0}],audit:["tool.updated"]},acceptance:{scenarios:[{key:"update-tool-happy-path",given:["Tool exists","User owns the tool"],when:["User submits updated configuration"],then:["Tool is updated","ToolUpdated event is emitted"]}],examples:[{key:"update-description",input:{toolId:"tool-123",description:"Updated weather API tool"},output:{id:"tool-123",name:"Weather API",status:"draft",updatedAt:"2025-01-01T00:00:00Z"}}]}}),W1=I1({meta:{key:"agent.tool.get",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","get"],description:"Retrieves a tool by its ID.",goal:"View detailed tool configuration.",context:"Called when viewing tool details or editing."},io:{input:G0({name:"GetToolInput",fields:{toolId:{type:x.String_unsecure(),isOptional:!1}}}),output:w2,errors:{TOOL_NOT_FOUND:{description:"The specified tool does not exist",http:404,gqlCode:"TOOL_NOT_FOUND",when:"Tool ID is invalid"}}},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-tool-happy-path",given:["Tool exists"],when:["User requests tool by ID"],then:["Tool details are returned"]}],examples:[{key:"get-basic",input:{toolId:"tool-123"},output:{id:"tool-123",name:"Weather API",status:"active",category:"api"}}]}}),j2=I1({meta:{key:"agent.tool.list",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","list"],description:"Lists tools for an organization with optional filtering.",goal:"Browse and search available tools.",context:"Tool list/dashboard view."},io:{input:G0({name:"ListToolsInput",fields:{organizationId:{type:x.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!0},status:{type:Z0,isOptional:!0},search:{type:x.String_unsecure(),isOptional:!0},limit:{type:x.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:x.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:G0({name:"ListToolsOutput",fields:{items:{type:Q0,isArray:!0,isOptional:!1},total:{type:x.Int_unsecure(),isOptional:!1},hasMore:{type:x.Boolean(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-tools-happy-path",given:["Organization has tools"],when:["User lists tools"],then:["Paginated list of tools is returned"]}],examples:[{key:"list-by-category",input:{organizationId:"org-123",category:"api",limit:10},output:{items:[],total:0,hasMore:!1}}]}}),_1=f2({meta:{key:"agent.tool.test",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","test"],description:"Tests a tool with sample input to verify it works correctly.",goal:"Validate tool configuration before deployment.",context:"Tool builder UI - test panel."},io:{input:G0({name:"TestToolInput",fields:{toolId:{type:x.String_unsecure(),isOptional:!1},testInput:{type:x.JSONObject(),isOptional:!1}}}),output:G0({name:"TestToolOutput",fields:{success:{type:x.Boolean(),isOptional:!1},output:{type:x.JSONObject(),isOptional:!0},error:{type:x.String_unsecure(),isOptional:!0},durationMs:{type:x.Int_unsecure(),isOptional:!1}}}),errors:{TOOL_NOT_FOUND:{description:"The specified tool does not exist",http:404,gqlCode:"TOOL_NOT_FOUND",when:"Tool ID is invalid"},TOOL_EXECUTION_ERROR:{description:"Tool execution failed",http:500,gqlCode:"TOOL_EXECUTION_ERROR",when:"Tool returns an error"}}},policy:{auth:"user"},sideEffects:{audit:["tool.tested"]},acceptance:{scenarios:[{key:"test-tool-success",given:["Tool exists","Tool is configured correctly"],when:["User runs test with valid input"],then:["Tool executes successfully","Output is returned"]},{key:"test-tool-failure",given:["Tool exists","Tool has configuration error"],when:["User runs test"],then:["TOOL_EXECUTION_ERROR is returned"]}],examples:[{key:"test-weather-api",input:{toolId:"tool-123",testInput:{city:"Paris"}},output:{success:!0,output:{temperature:22},durationMs:150}}]}});import{web as y4}from"@contractspec/lib.runtime-sandbox";var{generateId:N1}=y4;var L1={queuedAt:"r.queuedAt",totalTokens:"r.totalTokens",durationMs:"r.durationMs",estimatedCostUsd:"r.estimatedCostUsd",status:"r.status",agentName:"a.name"};function S0(Z){return{id:Z.id,projectId:Z.projectId,organizationId:Z.organizationId,name:Z.name,description:Z.description??void 0,modelProvider:Z.modelProvider,modelName:Z.modelName,systemPrompt:Z.systemPrompt??void 0,temperature:Z.temperature,maxTokens:Z.maxTokens,status:Z.status,createdAt:new Date(Z.createdAt),updatedAt:new Date(Z.updatedAt)}}function d4(Z){return{id:Z.id,projectId:Z.projectId,organizationId:Z.organizationId,name:Z.name,description:Z.description??void 0,version:Z.version,category:Z.category,status:Z.status,inputSchema:Z.inputSchema??void 0,outputSchema:Z.outputSchema??void 0,endpoint:Z.endpoint??void 0,createdAt:new Date(Z.createdAt),updatedAt:new Date(Z.updatedAt)}}function R1(Z,q){return{id:Z.id,projectId:Z.projectId,agentId:Z.agentId,agentName:q,status:Z.status,input:Z.input??void 0,output:Z.output??void 0,totalTokens:Z.totalTokens,promptTokens:Z.promptTokens,completionTokens:Z.completionTokens,estimatedCostUsd:Z.estimatedCostUsd,durationMs:Z.durationMs??void 0,errorMessage:Z.errorMessage??void 0,queuedAt:new Date(Z.queuedAt),startedAt:Z.startedAt?new Date(Z.startedAt):void 0,completedAt:Z.completedAt?new Date(Z.completedAt):void 0}}function m4(Z){async function q($){let{projectId:H,organizationId:Q,status:G,search:F,limit:U=20,offset:L=0}=$,B="WHERE projectId = ?",W=[H];if(Q)B+=" AND organizationId = ?",W.push(Q);if(G&&G!=="all")B+=" AND status = ?",W.push(G);if(F)B+=" AND (name LIKE ? OR description LIKE ?)",W.push(`%${F}%`,`%${F}%`);let v=(await Z.query(`SELECT COUNT(*) as count FROM agent_definition ${B}`,W)).rows[0]?.count??0,b=(await Z.query(`SELECT * FROM agent_definition ${B} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,[...W,U,L])).rows;return{items:b.map(S0),total:v,hasMore:L+b.length<v}}async function D($){let H=(await Z.query("SELECT * FROM agent_definition WHERE id = ?",[$])).rows;return H[0]?S0(H[0]):null}async function Y($,H){let Q=N1("agent"),G=new Date().toISOString();await Z.execute(`INSERT INTO agent_definition (id, projectId, organizationId, name, description, modelProvider, modelName, systemPrompt, temperature, maxTokens, status, createdAt, updatedAt)
52
+ - Use Feature Flags to gate risky tools; default safe/off.`}];C4(h4);import{defineExample as f4}from"@contractspec/lib.contracts-spec";var j4=f4({meta:{key:"agent-console",version:"1.0.0",title:"Agent Console",description:"AI agent ops console: tools, agents, runs, logs, and metrics (spec-first, regenerable).",kind:"template",visibility:"public",stability:"beta",owners:["@platform.core"],tags:["ai","agents","tools","orchestration"]},docs:{rootDocId:"docs.examples.agent-console.reference",goalDocId:"docs.examples.agent-console.goal",usageDocId:"docs.examples.agent-console.usage",constraintsDocId:"docs.examples.agent-console.constraints"},entrypoints:{packageName:"@contractspec/example.agent-console",feature:"./agent.feature",presentations:"./presentations",handlers:"./handlers",docs:"./docs",ui:"./ui"},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs","builder","markdown","evolution"]},studio:{enabled:!0,installable:!0},mcp:{enabled:!0}}}),x4=j4;import{defineEnum as d0}from"@contractspec/lib.schema";var a=d0("RunStatus",["QUEUED","IN_PROGRESS","COMPLETED","FAILED","CANCELLED","EXPIRED"]),W2=d0("RunStepType",["MESSAGE_CREATION","TOOL_CALL","TOOL_RESULT","ERROR"]),R0=d0("LogLevel",["DEBUG","INFO","WARN","ERROR"]),_2=d0("Granularity",["hour","day","week","month"]);import{defineSchemaModel as $0,ScalarTypeEnum as I}from"@contractspec/lib.schema";var N2=$0({name:"RunInput",description:"Input data for agent execution",fields:{message:{type:I.NonEmptyString(),isOptional:!1},context:{type:I.JSONObject(),isOptional:!0}}}),m0=$0({name:"RunStep",description:"Individual step within a run",fields:{id:{type:I.String_unsecure(),isOptional:!1},stepNumber:{type:I.Int_unsecure(),isOptional:!1},type:{type:W2,isOptional:!1},toolId:{type:I.String_unsecure(),isOptional:!0},toolName:{type:I.String_unsecure(),isOptional:!0},input:{type:I.JSONObject(),isOptional:!0},output:{type:I.JSONObject(),isOptional:!0},status:{type:a,isOptional:!1},errorMessage:{type:I.String_unsecure(),isOptional:!0},tokensUsed:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},durationMs:{type:I.Int_unsecure(),isOptional:!0},startedAt:{type:I.DateTime(),isOptional:!1},completedAt:{type:I.DateTime(),isOptional:!0}}}),E0=$0({name:"RunLog",description:"Execution log entry",fields:{id:{type:I.String_unsecure(),isOptional:!1},stepId:{type:I.String_unsecure(),isOptional:!0},level:{type:R0,isOptional:!1},message:{type:I.String_unsecure(),isOptional:!1},data:{type:I.JSONObject(),isOptional:!0},source:{type:I.String_unsecure(),isOptional:!0},traceId:{type:I.String_unsecure(),isOptional:!0},spanId:{type:I.String_unsecure(),isOptional:!0},timestamp:{type:I.DateTime(),isOptional:!1}}}),A1=$0({name:"RunAgentRef",description:"Agent reference in a run",fields:{id:{type:I.String_unsecure(),isOptional:!1},name:{type:I.NonEmptyString(),isOptional:!1},modelProvider:{type:I.String_unsecure(),isOptional:!1},modelName:{type:I.String_unsecure(),isOptional:!1}}}),L2=$0({name:"Run",description:"Agent execution instance",fields:{id:{type:I.String_unsecure(),isOptional:!1},organizationId:{type:I.String_unsecure(),isOptional:!1},agentId:{type:I.String_unsecure(),isOptional:!1},userId:{type:I.String_unsecure(),isOptional:!0},sessionId:{type:I.String_unsecure(),isOptional:!0},input:{type:I.JSONObject(),isOptional:!1},output:{type:I.JSONObject(),isOptional:!0},status:{type:a,isOptional:!1},errorMessage:{type:I.String_unsecure(),isOptional:!0},errorCode:{type:I.String_unsecure(),isOptional:!0},totalTokens:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},promptTokens:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},completionTokens:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},totalIterations:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},durationMs:{type:I.Int_unsecure(),isOptional:!0},estimatedCostUsd:{type:I.Float_unsecure(),isOptional:!0},queuedAt:{type:I.DateTime(),isOptional:!1},startedAt:{type:I.DateTime(),isOptional:!0},completedAt:{type:I.DateTime(),isOptional:!0},metadata:{type:I.JSONObject(),isOptional:!0},steps:{type:m0,isArray:!0,isOptional:!0},logs:{type:E0,isArray:!0,isOptional:!0},agent:{type:A1,isOptional:!0}}}),X0=$0({name:"RunSummary",description:"Summary of a run for list views",fields:{id:{type:I.String_unsecure(),isOptional:!1},agentId:{type:I.String_unsecure(),isOptional:!1},agentName:{type:I.NonEmptyString(),isOptional:!1},status:{type:a,isOptional:!1},totalTokens:{type:I.Int_unsecure(),isOptional:!1},durationMs:{type:I.Int_unsecure(),isOptional:!0},estimatedCostUsd:{type:I.Float_unsecure(),isOptional:!0},queuedAt:{type:I.DateTime(),isOptional:!1},completedAt:{type:I.DateTime(),isOptional:!0}}}),R2=$0({name:"TimelineDataPoint",description:"Timeline data point for metrics",fields:{period:{type:I.String_unsecure(),isOptional:!1},runs:{type:I.Int_unsecure(),isOptional:!1},tokens:{type:I.Int_unsecure(),isOptional:!1},costUsd:{type:I.Float_unsecure(),isOptional:!1},avgDurationMs:{type:I.Float_unsecure(),isOptional:!1}}});import{defineCommand as V1,defineQuery as O0}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as S,ScalarTypeEnum as N}from"@contractspec/lib.schema";var e=["@agent-console-team"],O2=V1({meta:{key:"agent.run.execute",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","execute"],description:"Starts a new agent run with the given input.",goal:"Execute an AI agent with user input.",context:"Called from chat interface or API."},io:{input:S({name:"ExecuteAgentInput",fields:{agentId:{type:N.String_unsecure(),isOptional:!1},input:{type:N2,isOptional:!1},sessionId:{type:N.String_unsecure(),isOptional:!0},metadata:{type:N.JSONObject(),isOptional:!0},stream:{type:N.Boolean(),isOptional:!0},maxIterations:{type:N.Int_unsecure(),isOptional:!0},timeoutMs:{type:N.Int_unsecure(),isOptional:!0}}}),output:S({name:"ExecuteAgentOutput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},status:{type:a,isOptional:!1},estimatedWaitMs:{type:N.Int_unsecure(),isOptional:!0}}}),errors:{AGENT_NOT_FOUND:{description:"The specified agent does not exist",http:404,gqlCode:"AGENT_NOT_FOUND",when:"Agent ID is invalid"},AGENT_NOT_ACTIVE:{description:"The specified agent is not active",http:400,gqlCode:"AGENT_NOT_ACTIVE",when:"Agent is in draft/paused/archived state"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"run.started",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","started"],when:"Run is queued",payload:X0}],audit:["run.started"]},acceptance:{scenarios:[{key:"execute-agent-happy-path",given:["Agent exists","Agent is active"],when:["User submits execution request"],then:["Run is created","RunStarted event is emitted"]},{key:"execute-agent-not-active",given:["Agent exists but is not active"],when:["User attempts to execute"],then:["AGENT_NOT_ACTIVE error is returned"]}],examples:[{key:"basic-execute",input:{agentId:"agent-123",input:{message:"Hello"}},output:{runId:"run-456",status:"pending",estimatedWaitMs:5000}}]}}),K1=V1({meta:{key:"agent.run.cancel",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","cancel"],description:"Cancels an in-progress agent run.",goal:"Stop a running agent execution.",context:"Called when user wants to abort a long-running task."},io:{input:S({name:"CancelRunInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},reason:{type:N.String_unsecure(),isOptional:!0}}}),output:S({name:"CancelRunOutput",fields:{success:{type:N.Boolean(),isOptional:!1},status:{type:a,isOptional:!1}}}),errors:{RUN_NOT_FOUND:{description:"The specified run does not exist",http:404,gqlCode:"RUN_NOT_FOUND",when:"Run ID is invalid"},RUN_NOT_CANCELLABLE:{description:"The run cannot be cancelled",http:400,gqlCode:"RUN_NOT_CANCELLABLE",when:"Run is already completed/failed/cancelled"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"run.cancelled",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","cancelled"],when:"Run is cancelled",payload:X0}],audit:["run.cancelled"]},acceptance:{scenarios:[{key:"cancel-run-happy-path",given:["Run exists","Run is in progress"],when:["User cancels run"],then:["Run is cancelled","RunCancelled event is emitted"]},{key:"cancel-run-already-completed",given:["Run exists but is already completed"],when:["User attempts to cancel"],then:["RUN_NOT_CANCELLABLE error is returned"]}],examples:[{key:"cancel-basic",input:{runId:"run-456",reason:"User requested"},output:{success:!0,status:"cancelled"}}]}}),k1=O0({meta:{key:"agent.run.get",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","get"],description:"Retrieves a run by its ID with optional details.",goal:"View detailed run information.",context:"Run details page or monitoring."},io:{input:S({name:"GetRunInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},includeSteps:{type:N.Boolean(),isOptional:!0},includeLogs:{type:N.Boolean(),isOptional:!0}}}),output:L2,errors:{RUN_NOT_FOUND:{description:"The specified run does not exist",http:404,gqlCode:"RUN_NOT_FOUND",when:"Run ID is invalid"}}},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-happy-path",given:["Run exists"],when:["User requests run by ID"],then:["Run details are returned"]}],examples:[{key:"get-with-steps",input:{runId:"run-456",includeSteps:!0,includeLogs:!1},output:{id:"run-456",status:"completed",steps:[]}}]}}),M2=O0({meta:{key:"agent.run.list",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","list"],description:"Lists runs with optional filtering.",goal:"Browse and search run history.",context:"Run history/dashboard view."},io:{input:S({name:"ListRunsInput",fields:{organizationId:{type:N.String_unsecure(),isOptional:!0},agentId:{type:N.String_unsecure(),isOptional:!0},userId:{type:N.String_unsecure(),isOptional:!0},sessionId:{type:N.String_unsecure(),isOptional:!0},status:{type:a,isOptional:!0},startDate:{type:N.DateTime(),isOptional:!0},endDate:{type:N.DateTime(),isOptional:!0},limit:{type:N.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:N.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:S({name:"ListRunsOutput",fields:{items:{type:X0,isArray:!0,isOptional:!1},total:{type:N.Int_unsecure(),isOptional:!1},hasMore:{type:N.Boolean(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-runs-happy-path",given:["Organization has runs"],when:["User lists runs"],then:["Paginated list of runs is returned"]}],examples:[{key:"list-by-agent",input:{agentId:"agent-123",limit:20,offset:0},output:{items:[],total:0,hasMore:!1}}]}}),g4=O0({meta:{key:"agent.run.getSteps",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","steps"],description:"Retrieves all steps for a specific run.",goal:"View step-by-step execution details.",context:"Run details page - steps tab."},io:{input:S({name:"GetRunStepsInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1}}}),output:S({name:"GetRunStepsOutput",fields:{steps:{type:m0,isArray:!0,isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-steps-happy-path",given:["Run exists with steps"],when:["User requests steps"],then:["Steps list is returned"]}],examples:[{key:"get-steps-basic",input:{runId:"run-456"},output:{steps:[]}}]}}),T4=O0({meta:{key:"agent.run.getLogs",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","logs"],description:"Retrieves all logs for a specific run.",goal:"Debug and audit run execution.",context:"Run details page - logs tab."},io:{input:S({name:"GetRunLogsInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},level:{type:R0,isOptional:!0},stepId:{type:N.String_unsecure(),isOptional:!0},limit:{type:N.Int_unsecure(),isOptional:!0,defaultValue:100},offset:{type:N.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:S({name:"GetRunLogsOutput",fields:{items:{type:E0,isArray:!0,isOptional:!1},total:{type:N.Int_unsecure(),isOptional:!1},hasMore:{type:N.Boolean(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-logs-happy-path",given:["Run exists with logs"],when:["User requests logs"],then:["Paginated logs list is returned"]}],examples:[{key:"get-logs-filtered",input:{runId:"run-456",level:"error",limit:50},output:{items:[],total:0,hasMore:!1}}]}}),P1=O0({meta:{key:"agent.run.getMetrics",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","metrics"],description:"Retrieves aggregated metrics for runs within a time period.",goal:"Monitor and analyze agent usage.",context:"Analytics dashboard."},io:{input:S({name:"GetRunMetricsInput",fields:{organizationId:{type:N.String_unsecure(),isOptional:!1},agentId:{type:N.String_unsecure(),isOptional:!0},startDate:{type:N.DateTime(),isOptional:!1},endDate:{type:N.DateTime(),isOptional:!1},granularity:{type:_2,isOptional:!0,defaultValue:"day"}}}),output:S({name:"GetRunMetricsOutput",fields:{totalRuns:{type:N.Int_unsecure(),isOptional:!1},completedRuns:{type:N.Int_unsecure(),isOptional:!1},failedRuns:{type:N.Int_unsecure(),isOptional:!1},totalTokens:{type:N.Int_unsecure(),isOptional:!1},totalCostUsd:{type:N.Float_unsecure(),isOptional:!1},averageDurationMs:{type:N.Float_unsecure(),isOptional:!1},successRate:{type:N.Float_unsecure(),isOptional:!1},timeline:{type:R2,isArray:!0,isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-metrics-happy-path",given:["Organization has run history"],when:["User requests metrics for date range"],then:["Aggregated metrics are returned"]}],examples:[{key:"get-daily-metrics",input:{organizationId:"org-123",startDate:"2025-01-01",endDate:"2025-01-31",granularity:"day"},output:{totalRuns:100,completedRuns:90,failedRuns:10,totalTokens:50000,totalCostUsd:5,averageDurationMs:2500,successRate:0.9,timeline:[]}}]}});import{defineEnum as b2}from"@contractspec/lib.schema";var z0=b2("ToolCategory",["RETRIEVAL","COMPUTATION","COMMUNICATION","INTEGRATION","UTILITY","CUSTOM"]),Z0=b2("ToolStatus",["DRAFT","ACTIVE","DEPRECATED","DISABLED"]),p0=b2("ImplementationType",["http","function","workflow"]);import{defineSchemaModel as o0,ScalarTypeEnum as O}from"@contractspec/lib.schema";var w2=o0({name:"Tool",description:"AI tool definition",fields:{id:{type:O.String_unsecure(),isOptional:!1},organizationId:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!1},slug:{type:O.String_unsecure(),isOptional:!1},description:{type:O.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!1},status:{type:Z0,isOptional:!1},parametersSchema:{type:O.JSONObject(),isOptional:!1},outputSchema:{type:O.JSONObject(),isOptional:!0},implementationType:{type:p0,isOptional:!1},implementationConfig:{type:O.JSONObject(),isOptional:!1},maxInvocationsPerMinute:{type:O.Int_unsecure(),isOptional:!0},timeoutMs:{type:O.Int_unsecure(),isOptional:!1,defaultValue:30000},version:{type:O.NonEmptyString(),isOptional:!1},tags:{type:O.String_unsecure(),isArray:!0,isOptional:!0},createdAt:{type:O.DateTime(),isOptional:!1},updatedAt:{type:O.DateTime(),isOptional:!1}}}),Q0=o0({name:"ToolSummary",description:"Summary of a tool for list views",fields:{id:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!1},slug:{type:O.String_unsecure(),isOptional:!1},description:{type:O.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!1},status:{type:Z0,isOptional:!1},version:{type:O.NonEmptyString(),isOptional:!1},createdAt:{type:O.DateTime(),isOptional:!1}}}),C2=o0({name:"CreateToolInput",description:"Input for creating a tool",fields:{organizationId:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!1},slug:{type:O.String_unsecure(),isOptional:!1},description:{type:O.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!0},parametersSchema:{type:O.JSONObject(),isOptional:!1},outputSchema:{type:O.JSONObject(),isOptional:!0},implementationType:{type:p0,isOptional:!1},implementationConfig:{type:O.JSONObject(),isOptional:!1},maxInvocationsPerMinute:{type:O.Int_unsecure(),isOptional:!0},timeoutMs:{type:O.Int_unsecure(),isOptional:!0},tags:{type:O.String_unsecure(),isArray:!0,isOptional:!0}}}),h2=o0({name:"UpdateToolInput",description:"Input for updating a tool",fields:{toolId:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!0},description:{type:O.String_unsecure(),isOptional:!0},status:{type:Z0,isOptional:!0},parametersSchema:{type:O.JSONObject(),isOptional:!0},outputSchema:{type:O.JSONObject(),isOptional:!0},implementationConfig:{type:O.JSONObject(),isOptional:!0},maxInvocationsPerMinute:{type:O.Int_unsecure(),isOptional:!0},timeoutMs:{type:O.Int_unsecure(),isOptional:!0},tags:{type:O.String_unsecure(),isArray:!0,isOptional:!0}}});import{defineCommand as f2,defineQuery as I1}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as G0,ScalarTypeEnum as x}from"@contractspec/lib.schema";var F0=["@agent-console-team"],B1=f2({meta:{key:"agent.tool.create",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","create"],description:"Creates a new AI tool definition.",goal:"Allow users to define new tools that agents can use.",context:"Called from the tool builder UI when creating a new tool."},io:{input:C2,output:G0({name:"CreateToolOutput",fields:{id:{type:x.String_unsecure(),isOptional:!1},name:{type:x.NonEmptyString(),isOptional:!1},slug:{type:x.String_unsecure(),isOptional:!1},status:{type:Z0,isOptional:!1}}}),errors:{SLUG_EXISTS:{description:"A tool with this slug already exists in the organization",http:409,gqlCode:"SLUG_EXISTS",when:"Slug is already taken"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"tool.created",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","created"],when:"Tool is successfully created",payload:Q0}],audit:["tool.created"]},acceptance:{scenarios:[{key:"create-tool-happy-path",given:["User is authenticated","Organization exists"],when:["User submits valid tool configuration"],then:["New tool is created","ToolCreated event is emitted"]},{key:"create-tool-slug-conflict",given:["Tool with same slug exists"],when:["User submits tool with duplicate slug"],then:["SLUG_EXISTS error is returned"]}],examples:[{key:"create-api-tool",input:{name:"Weather API",slug:"weather-api",category:"api",description:"Fetches weather data"},output:{id:"tool-123",name:"Weather API",slug:"weather-api",status:"draft"}}]}}),v1=f2({meta:{key:"agent.tool.update",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","update"],description:"Updates an existing AI tool definition.",goal:"Allow users to modify tool settings and configuration.",context:"Called from the tool settings UI."},io:{input:h2,output:G0({name:"UpdateToolOutput",fields:{id:{type:x.String_unsecure(),isOptional:!1},name:{type:x.NonEmptyString(),isOptional:!1},status:{type:Z0,isOptional:!1},updatedAt:{type:x.DateTime(),isOptional:!1}}}),errors:{TOOL_NOT_FOUND:{description:"The specified tool does not exist",http:404,gqlCode:"TOOL_NOT_FOUND",when:"Tool ID is invalid"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"tool.updated",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","updated"],when:"Tool is updated",payload:Q0}],audit:["tool.updated"]},acceptance:{scenarios:[{key:"update-tool-happy-path",given:["Tool exists","User owns the tool"],when:["User submits updated configuration"],then:["Tool is updated","ToolUpdated event is emitted"]}],examples:[{key:"update-description",input:{toolId:"tool-123",description:"Updated weather API tool"},output:{id:"tool-123",name:"Weather API",status:"draft",updatedAt:"2025-01-01T00:00:00Z"}}]}}),W1=I1({meta:{key:"agent.tool.get",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","get"],description:"Retrieves a tool by its ID.",goal:"View detailed tool configuration.",context:"Called when viewing tool details or editing."},io:{input:G0({name:"GetToolInput",fields:{toolId:{type:x.String_unsecure(),isOptional:!1}}}),output:w2,errors:{TOOL_NOT_FOUND:{description:"The specified tool does not exist",http:404,gqlCode:"TOOL_NOT_FOUND",when:"Tool ID is invalid"}}},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-tool-happy-path",given:["Tool exists"],when:["User requests tool by ID"],then:["Tool details are returned"]}],examples:[{key:"get-basic",input:{toolId:"tool-123"},output:{id:"tool-123",name:"Weather API",status:"active",category:"api"}}]}}),j2=I1({meta:{key:"agent.tool.list",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","list"],description:"Lists tools for an organization with optional filtering.",goal:"Browse and search available tools.",context:"Tool list/dashboard view."},io:{input:G0({name:"ListToolsInput",fields:{organizationId:{type:x.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!0},status:{type:Z0,isOptional:!0},search:{type:x.String_unsecure(),isOptional:!0},limit:{type:x.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:x.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:G0({name:"ListToolsOutput",fields:{items:{type:Q0,isArray:!0,isOptional:!1},total:{type:x.Int_unsecure(),isOptional:!1},hasMore:{type:x.Boolean(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-tools-happy-path",given:["Organization has tools"],when:["User lists tools"],then:["Paginated list of tools is returned"]}],examples:[{key:"list-by-category",input:{organizationId:"org-123",category:"api",limit:10},output:{items:[],total:0,hasMore:!1}}]}}),_1=f2({meta:{key:"agent.tool.test",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","test"],description:"Tests a tool with sample input to verify it works correctly.",goal:"Validate tool configuration before deployment.",context:"Tool builder UI - test panel."},io:{input:G0({name:"TestToolInput",fields:{toolId:{type:x.String_unsecure(),isOptional:!1},testInput:{type:x.JSONObject(),isOptional:!1}}}),output:G0({name:"TestToolOutput",fields:{success:{type:x.Boolean(),isOptional:!1},output:{type:x.JSONObject(),isOptional:!0},error:{type:x.String_unsecure(),isOptional:!0},durationMs:{type:x.Int_unsecure(),isOptional:!1}}}),errors:{TOOL_NOT_FOUND:{description:"The specified tool does not exist",http:404,gqlCode:"TOOL_NOT_FOUND",when:"Tool ID is invalid"},TOOL_EXECUTION_ERROR:{description:"Tool execution failed",http:500,gqlCode:"TOOL_EXECUTION_ERROR",when:"Tool returns an error"}}},policy:{auth:"user"},sideEffects:{audit:["tool.tested"]},acceptance:{scenarios:[{key:"test-tool-success",given:["Tool exists","Tool is configured correctly"],when:["User runs test with valid input"],then:["Tool executes successfully","Output is returned"]},{key:"test-tool-failure",given:["Tool exists","Tool has configuration error"],when:["User runs test"],then:["TOOL_EXECUTION_ERROR is returned"]}],examples:[{key:"test-weather-api",input:{toolId:"tool-123",testInput:{city:"Paris"}},output:{success:!0,output:{temperature:22},durationMs:150}}]}});import{web as y4}from"@contractspec/lib.runtime-sandbox";var{generateId:N1}=y4;var L1={queuedAt:"r.queuedAt",totalTokens:"r.totalTokens",durationMs:"r.durationMs",estimatedCostUsd:"r.estimatedCostUsd",status:"r.status",agentName:"a.name"};function S0(Z){return{id:Z.id,projectId:Z.projectId,organizationId:Z.organizationId,name:Z.name,description:Z.description??void 0,modelProvider:Z.modelProvider,modelName:Z.modelName,systemPrompt:Z.systemPrompt??void 0,temperature:Z.temperature,maxTokens:Z.maxTokens,status:Z.status,createdAt:new Date(Z.createdAt),updatedAt:new Date(Z.updatedAt)}}function d4(Z){return{id:Z.id,projectId:Z.projectId,organizationId:Z.organizationId,name:Z.name,description:Z.description??void 0,version:Z.version,category:Z.category,status:Z.status,inputSchema:Z.inputSchema??void 0,outputSchema:Z.outputSchema??void 0,endpoint:Z.endpoint??void 0,createdAt:new Date(Z.createdAt),updatedAt:new Date(Z.updatedAt)}}function R1(Z,q){return{id:Z.id,projectId:Z.projectId,agentId:Z.agentId,agentName:q,status:Z.status,input:Z.input??void 0,output:Z.output??void 0,totalTokens:Z.totalTokens,promptTokens:Z.promptTokens,completionTokens:Z.completionTokens,estimatedCostUsd:Z.estimatedCostUsd,durationMs:Z.durationMs??void 0,errorMessage:Z.errorMessage??void 0,queuedAt:new Date(Z.queuedAt),startedAt:Z.startedAt?new Date(Z.startedAt):void 0,completedAt:Z.completedAt?new Date(Z.completedAt):void 0}}function m4(Z){async function q($){let{projectId:H,organizationId:Q,status:G,search:F,limit:U=20,offset:L=0}=$,B="WHERE projectId = ?",W=[H];if(Q)B+=" AND organizationId = ?",W.push(Q);if(G&&G!=="all")B+=" AND status = ?",W.push(G);if(F)B+=" AND (name LIKE ? OR description LIKE ?)",W.push(`%${F}%`,`%${F}%`);let v=(await Z.query(`SELECT COUNT(*) as count FROM agent_definition ${B}`,W)).rows[0]?.count??0,b=(await Z.query(`SELECT * FROM agent_definition ${B} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,[...W,U,L])).rows;return{items:b.map(S0),total:v,hasMore:L+b.length<v}}async function D($){let H=(await Z.query("SELECT * FROM agent_definition WHERE id = ?",[$])).rows;return H[0]?S0(H[0]):null}async function Y($,H){let Q=N1("agent"),G=new Date().toISOString();await Z.execute(`INSERT INTO agent_definition (id, projectId, organizationId, name, description, modelProvider, modelName, systemPrompt, temperature, maxTokens, status, createdAt, updatedAt)
53
53
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[Q,H.projectId,H.organizationId,$.name,$.description??null,$.modelProvider??"openai",$.modelName??"gpt-4",$.systemPrompt??null,$.temperature??0.7,$.maxTokens??4096,"DRAFT",G,G]);let U=(await Z.query("SELECT * FROM agent_definition WHERE id = ?",[Q])).rows[0];if(!U)throw Error("Failed to retrieve created agent");return S0(U)}async function X($){let H=new Date().toISOString(),Q=["updatedAt = ?"],G=[H];if($.name!==void 0)Q.push("name = ?"),G.push($.name);if($.description!==void 0)Q.push("description = ?"),G.push($.description);if($.status!==void 0)Q.push("status = ?"),G.push($.status);G.push($.id),await Z.execute(`UPDATE agent_definition SET ${Q.join(", ")} WHERE id = ?`,G);let F=(await Z.query("SELECT * FROM agent_definition WHERE id = ?",[$.id])).rows;if(!F[0])throw Error("NOT_FOUND");return S0(F[0])}async function A($){let{projectId:H,organizationId:Q,category:G,status:F,search:U,limit:L=50,offset:B=0}=$,W="WHERE projectId = ?",P=[H];if(Q)W+=" AND organizationId = ?",P.push(Q);if(G&&G!=="all")W+=" AND category = ?",P.push(G);if(F&&F!=="all")W+=" AND status = ?",P.push(F);if(U)W+=" AND (name LIKE ? OR description LIKE ?)",P.push(`%${U}%`,`%${U}%`);let b=(await Z.query(`SELECT COUNT(*) as count FROM agent_tool ${W}`,P)).rows[0]?.count??0,o=(await Z.query(`SELECT * FROM agent_tool ${W} ORDER BY name ASC LIMIT ? OFFSET ?`,[...P,L,B])).rows;return{items:o.map(d4),total:b,hasMore:B+o.length<b}}async function z($){let{projectId:H,agentId:Q,status:G,sortBy:F,sortDirection:U="desc",limit:L=20,offset:B=0}=$,W="WHERE r.projectId = ?",P=[H];if(Q)W+=" AND r.agentId = ?",P.push(Q);if(G&&G!=="all")W+=" AND r.status = ?",P.push(G);let b=(await Z.query(`SELECT COUNT(*) as count FROM agent_run r ${W}`,P)).rows[0]?.count??0,o=F?L1[F]:L1.queuedAt,f0=U==="asc"?"ASC":"DESC",d=(await Z.query(`SELECT r.*, a.name as agentName
54
54
  FROM agent_run r
55
55
  LEFT JOIN agent_definition a ON r.agentId = a.id
package/dist/example.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{defineExample as g}from"@contractspec/lib.contracts-spec";var h=g({meta:{key:"agent-console",version:"1.0.0",title:"Agent Console",description:"AI agent ops console: tools, agents, runs, logs, and metrics (spec-first, regenerable).",kind:"template",visibility:"public",stability:"beta",owners:["@platform.core"],tags:["ai","agents","tools","orchestration"]},docs:{rootDocId:"docs.examples.agent-console.reference",goalDocId:"docs.examples.agent-console.goal",usageDocId:"docs.examples.agent-console.usage",constraintsDocId:"docs.examples.agent-console.constraints"},entrypoints:{packageName:"@contractspec/example.agent-console",feature:"./agent.feature",presentations:"./presentations",handlers:"./handlers",docs:"./docs"},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs","builder","markdown","evolution"]},studio:{enabled:!0,installable:!0},mcp:{enabled:!0}}}),q=h;export{q as default};
2
+ import{defineExample as g}from"@contractspec/lib.contracts-spec";var h=g({meta:{key:"agent-console",version:"1.0.0",title:"Agent Console",description:"AI agent ops console: tools, agents, runs, logs, and metrics (spec-first, regenerable).",kind:"template",visibility:"public",stability:"beta",owners:["@platform.core"],tags:["ai","agents","tools","orchestration"]},docs:{rootDocId:"docs.examples.agent-console.reference",goalDocId:"docs.examples.agent-console.goal",usageDocId:"docs.examples.agent-console.usage",constraintsDocId:"docs.examples.agent-console.constraints"},entrypoints:{packageName:"@contractspec/example.agent-console",feature:"./agent.feature",presentations:"./presentations",handlers:"./handlers",docs:"./docs",ui:"./ui"},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs","builder","markdown","evolution"]},studio:{enabled:!0,installable:!0},mcp:{enabled:!0}}}),q=h;export{q as default};
package/dist/index.js CHANGED
@@ -50,7 +50,7 @@ import{defineVisualization as Y2,VisualizationRegistry as z4}from"@contractspec/
50
50
  ## Verification
51
51
  - Add fixtures for tool schema changes and run lifecycle.
52
52
  - Ensure Audit/Notifications remain wired for runs; metrics collection unchanged.
53
- - Use Feature Flags to gate risky tools; default safe/off.`}];C4(h4);import{defineExample as f4}from"@contractspec/lib.contracts-spec";var j4=f4({meta:{key:"agent-console",version:"1.0.0",title:"Agent Console",description:"AI agent ops console: tools, agents, runs, logs, and metrics (spec-first, regenerable).",kind:"template",visibility:"public",stability:"beta",owners:["@platform.core"],tags:["ai","agents","tools","orchestration"]},docs:{rootDocId:"docs.examples.agent-console.reference",goalDocId:"docs.examples.agent-console.goal",usageDocId:"docs.examples.agent-console.usage",constraintsDocId:"docs.examples.agent-console.constraints"},entrypoints:{packageName:"@contractspec/example.agent-console",feature:"./agent.feature",presentations:"./presentations",handlers:"./handlers",docs:"./docs"},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs","builder","markdown","evolution"]},studio:{enabled:!0,installable:!0},mcp:{enabled:!0}}}),x4=j4;import{defineEnum as d0}from"@contractspec/lib.schema";var a=d0("RunStatus",["QUEUED","IN_PROGRESS","COMPLETED","FAILED","CANCELLED","EXPIRED"]),W2=d0("RunStepType",["MESSAGE_CREATION","TOOL_CALL","TOOL_RESULT","ERROR"]),R0=d0("LogLevel",["DEBUG","INFO","WARN","ERROR"]),_2=d0("Granularity",["hour","day","week","month"]);import{defineSchemaModel as $0,ScalarTypeEnum as I}from"@contractspec/lib.schema";var N2=$0({name:"RunInput",description:"Input data for agent execution",fields:{message:{type:I.NonEmptyString(),isOptional:!1},context:{type:I.JSONObject(),isOptional:!0}}}),m0=$0({name:"RunStep",description:"Individual step within a run",fields:{id:{type:I.String_unsecure(),isOptional:!1},stepNumber:{type:I.Int_unsecure(),isOptional:!1},type:{type:W2,isOptional:!1},toolId:{type:I.String_unsecure(),isOptional:!0},toolName:{type:I.String_unsecure(),isOptional:!0},input:{type:I.JSONObject(),isOptional:!0},output:{type:I.JSONObject(),isOptional:!0},status:{type:a,isOptional:!1},errorMessage:{type:I.String_unsecure(),isOptional:!0},tokensUsed:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},durationMs:{type:I.Int_unsecure(),isOptional:!0},startedAt:{type:I.DateTime(),isOptional:!1},completedAt:{type:I.DateTime(),isOptional:!0}}}),E0=$0({name:"RunLog",description:"Execution log entry",fields:{id:{type:I.String_unsecure(),isOptional:!1},stepId:{type:I.String_unsecure(),isOptional:!0},level:{type:R0,isOptional:!1},message:{type:I.String_unsecure(),isOptional:!1},data:{type:I.JSONObject(),isOptional:!0},source:{type:I.String_unsecure(),isOptional:!0},traceId:{type:I.String_unsecure(),isOptional:!0},spanId:{type:I.String_unsecure(),isOptional:!0},timestamp:{type:I.DateTime(),isOptional:!1}}}),A1=$0({name:"RunAgentRef",description:"Agent reference in a run",fields:{id:{type:I.String_unsecure(),isOptional:!1},name:{type:I.NonEmptyString(),isOptional:!1},modelProvider:{type:I.String_unsecure(),isOptional:!1},modelName:{type:I.String_unsecure(),isOptional:!1}}}),L2=$0({name:"Run",description:"Agent execution instance",fields:{id:{type:I.String_unsecure(),isOptional:!1},organizationId:{type:I.String_unsecure(),isOptional:!1},agentId:{type:I.String_unsecure(),isOptional:!1},userId:{type:I.String_unsecure(),isOptional:!0},sessionId:{type:I.String_unsecure(),isOptional:!0},input:{type:I.JSONObject(),isOptional:!1},output:{type:I.JSONObject(),isOptional:!0},status:{type:a,isOptional:!1},errorMessage:{type:I.String_unsecure(),isOptional:!0},errorCode:{type:I.String_unsecure(),isOptional:!0},totalTokens:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},promptTokens:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},completionTokens:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},totalIterations:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},durationMs:{type:I.Int_unsecure(),isOptional:!0},estimatedCostUsd:{type:I.Float_unsecure(),isOptional:!0},queuedAt:{type:I.DateTime(),isOptional:!1},startedAt:{type:I.DateTime(),isOptional:!0},completedAt:{type:I.DateTime(),isOptional:!0},metadata:{type:I.JSONObject(),isOptional:!0},steps:{type:m0,isArray:!0,isOptional:!0},logs:{type:E0,isArray:!0,isOptional:!0},agent:{type:A1,isOptional:!0}}}),X0=$0({name:"RunSummary",description:"Summary of a run for list views",fields:{id:{type:I.String_unsecure(),isOptional:!1},agentId:{type:I.String_unsecure(),isOptional:!1},agentName:{type:I.NonEmptyString(),isOptional:!1},status:{type:a,isOptional:!1},totalTokens:{type:I.Int_unsecure(),isOptional:!1},durationMs:{type:I.Int_unsecure(),isOptional:!0},estimatedCostUsd:{type:I.Float_unsecure(),isOptional:!0},queuedAt:{type:I.DateTime(),isOptional:!1},completedAt:{type:I.DateTime(),isOptional:!0}}}),R2=$0({name:"TimelineDataPoint",description:"Timeline data point for metrics",fields:{period:{type:I.String_unsecure(),isOptional:!1},runs:{type:I.Int_unsecure(),isOptional:!1},tokens:{type:I.Int_unsecure(),isOptional:!1},costUsd:{type:I.Float_unsecure(),isOptional:!1},avgDurationMs:{type:I.Float_unsecure(),isOptional:!1}}});import{defineCommand as V1,defineQuery as O0}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as S,ScalarTypeEnum as N}from"@contractspec/lib.schema";var e=["@agent-console-team"],O2=V1({meta:{key:"agent.run.execute",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","execute"],description:"Starts a new agent run with the given input.",goal:"Execute an AI agent with user input.",context:"Called from chat interface or API."},io:{input:S({name:"ExecuteAgentInput",fields:{agentId:{type:N.String_unsecure(),isOptional:!1},input:{type:N2,isOptional:!1},sessionId:{type:N.String_unsecure(),isOptional:!0},metadata:{type:N.JSONObject(),isOptional:!0},stream:{type:N.Boolean(),isOptional:!0},maxIterations:{type:N.Int_unsecure(),isOptional:!0},timeoutMs:{type:N.Int_unsecure(),isOptional:!0}}}),output:S({name:"ExecuteAgentOutput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},status:{type:a,isOptional:!1},estimatedWaitMs:{type:N.Int_unsecure(),isOptional:!0}}}),errors:{AGENT_NOT_FOUND:{description:"The specified agent does not exist",http:404,gqlCode:"AGENT_NOT_FOUND",when:"Agent ID is invalid"},AGENT_NOT_ACTIVE:{description:"The specified agent is not active",http:400,gqlCode:"AGENT_NOT_ACTIVE",when:"Agent is in draft/paused/archived state"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"run.started",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","started"],when:"Run is queued",payload:X0}],audit:["run.started"]},acceptance:{scenarios:[{key:"execute-agent-happy-path",given:["Agent exists","Agent is active"],when:["User submits execution request"],then:["Run is created","RunStarted event is emitted"]},{key:"execute-agent-not-active",given:["Agent exists but is not active"],when:["User attempts to execute"],then:["AGENT_NOT_ACTIVE error is returned"]}],examples:[{key:"basic-execute",input:{agentId:"agent-123",input:{message:"Hello"}},output:{runId:"run-456",status:"pending",estimatedWaitMs:5000}}]}}),K1=V1({meta:{key:"agent.run.cancel",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","cancel"],description:"Cancels an in-progress agent run.",goal:"Stop a running agent execution.",context:"Called when user wants to abort a long-running task."},io:{input:S({name:"CancelRunInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},reason:{type:N.String_unsecure(),isOptional:!0}}}),output:S({name:"CancelRunOutput",fields:{success:{type:N.Boolean(),isOptional:!1},status:{type:a,isOptional:!1}}}),errors:{RUN_NOT_FOUND:{description:"The specified run does not exist",http:404,gqlCode:"RUN_NOT_FOUND",when:"Run ID is invalid"},RUN_NOT_CANCELLABLE:{description:"The run cannot be cancelled",http:400,gqlCode:"RUN_NOT_CANCELLABLE",when:"Run is already completed/failed/cancelled"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"run.cancelled",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","cancelled"],when:"Run is cancelled",payload:X0}],audit:["run.cancelled"]},acceptance:{scenarios:[{key:"cancel-run-happy-path",given:["Run exists","Run is in progress"],when:["User cancels run"],then:["Run is cancelled","RunCancelled event is emitted"]},{key:"cancel-run-already-completed",given:["Run exists but is already completed"],when:["User attempts to cancel"],then:["RUN_NOT_CANCELLABLE error is returned"]}],examples:[{key:"cancel-basic",input:{runId:"run-456",reason:"User requested"},output:{success:!0,status:"cancelled"}}]}}),k1=O0({meta:{key:"agent.run.get",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","get"],description:"Retrieves a run by its ID with optional details.",goal:"View detailed run information.",context:"Run details page or monitoring."},io:{input:S({name:"GetRunInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},includeSteps:{type:N.Boolean(),isOptional:!0},includeLogs:{type:N.Boolean(),isOptional:!0}}}),output:L2,errors:{RUN_NOT_FOUND:{description:"The specified run does not exist",http:404,gqlCode:"RUN_NOT_FOUND",when:"Run ID is invalid"}}},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-happy-path",given:["Run exists"],when:["User requests run by ID"],then:["Run details are returned"]}],examples:[{key:"get-with-steps",input:{runId:"run-456",includeSteps:!0,includeLogs:!1},output:{id:"run-456",status:"completed",steps:[]}}]}}),M2=O0({meta:{key:"agent.run.list",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","list"],description:"Lists runs with optional filtering.",goal:"Browse and search run history.",context:"Run history/dashboard view."},io:{input:S({name:"ListRunsInput",fields:{organizationId:{type:N.String_unsecure(),isOptional:!0},agentId:{type:N.String_unsecure(),isOptional:!0},userId:{type:N.String_unsecure(),isOptional:!0},sessionId:{type:N.String_unsecure(),isOptional:!0},status:{type:a,isOptional:!0},startDate:{type:N.DateTime(),isOptional:!0},endDate:{type:N.DateTime(),isOptional:!0},limit:{type:N.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:N.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:S({name:"ListRunsOutput",fields:{items:{type:X0,isArray:!0,isOptional:!1},total:{type:N.Int_unsecure(),isOptional:!1},hasMore:{type:N.Boolean(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-runs-happy-path",given:["Organization has runs"],when:["User lists runs"],then:["Paginated list of runs is returned"]}],examples:[{key:"list-by-agent",input:{agentId:"agent-123",limit:20,offset:0},output:{items:[],total:0,hasMore:!1}}]}}),g4=O0({meta:{key:"agent.run.getSteps",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","steps"],description:"Retrieves all steps for a specific run.",goal:"View step-by-step execution details.",context:"Run details page - steps tab."},io:{input:S({name:"GetRunStepsInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1}}}),output:S({name:"GetRunStepsOutput",fields:{steps:{type:m0,isArray:!0,isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-steps-happy-path",given:["Run exists with steps"],when:["User requests steps"],then:["Steps list is returned"]}],examples:[{key:"get-steps-basic",input:{runId:"run-456"},output:{steps:[]}}]}}),T4=O0({meta:{key:"agent.run.getLogs",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","logs"],description:"Retrieves all logs for a specific run.",goal:"Debug and audit run execution.",context:"Run details page - logs tab."},io:{input:S({name:"GetRunLogsInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},level:{type:R0,isOptional:!0},stepId:{type:N.String_unsecure(),isOptional:!0},limit:{type:N.Int_unsecure(),isOptional:!0,defaultValue:100},offset:{type:N.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:S({name:"GetRunLogsOutput",fields:{items:{type:E0,isArray:!0,isOptional:!1},total:{type:N.Int_unsecure(),isOptional:!1},hasMore:{type:N.Boolean(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-logs-happy-path",given:["Run exists with logs"],when:["User requests logs"],then:["Paginated logs list is returned"]}],examples:[{key:"get-logs-filtered",input:{runId:"run-456",level:"error",limit:50},output:{items:[],total:0,hasMore:!1}}]}}),P1=O0({meta:{key:"agent.run.getMetrics",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","metrics"],description:"Retrieves aggregated metrics for runs within a time period.",goal:"Monitor and analyze agent usage.",context:"Analytics dashboard."},io:{input:S({name:"GetRunMetricsInput",fields:{organizationId:{type:N.String_unsecure(),isOptional:!1},agentId:{type:N.String_unsecure(),isOptional:!0},startDate:{type:N.DateTime(),isOptional:!1},endDate:{type:N.DateTime(),isOptional:!1},granularity:{type:_2,isOptional:!0,defaultValue:"day"}}}),output:S({name:"GetRunMetricsOutput",fields:{totalRuns:{type:N.Int_unsecure(),isOptional:!1},completedRuns:{type:N.Int_unsecure(),isOptional:!1},failedRuns:{type:N.Int_unsecure(),isOptional:!1},totalTokens:{type:N.Int_unsecure(),isOptional:!1},totalCostUsd:{type:N.Float_unsecure(),isOptional:!1},averageDurationMs:{type:N.Float_unsecure(),isOptional:!1},successRate:{type:N.Float_unsecure(),isOptional:!1},timeline:{type:R2,isArray:!0,isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-metrics-happy-path",given:["Organization has run history"],when:["User requests metrics for date range"],then:["Aggregated metrics are returned"]}],examples:[{key:"get-daily-metrics",input:{organizationId:"org-123",startDate:"2025-01-01",endDate:"2025-01-31",granularity:"day"},output:{totalRuns:100,completedRuns:90,failedRuns:10,totalTokens:50000,totalCostUsd:5,averageDurationMs:2500,successRate:0.9,timeline:[]}}]}});import{defineEnum as b2}from"@contractspec/lib.schema";var z0=b2("ToolCategory",["RETRIEVAL","COMPUTATION","COMMUNICATION","INTEGRATION","UTILITY","CUSTOM"]),Z0=b2("ToolStatus",["DRAFT","ACTIVE","DEPRECATED","DISABLED"]),p0=b2("ImplementationType",["http","function","workflow"]);import{defineSchemaModel as o0,ScalarTypeEnum as O}from"@contractspec/lib.schema";var w2=o0({name:"Tool",description:"AI tool definition",fields:{id:{type:O.String_unsecure(),isOptional:!1},organizationId:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!1},slug:{type:O.String_unsecure(),isOptional:!1},description:{type:O.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!1},status:{type:Z0,isOptional:!1},parametersSchema:{type:O.JSONObject(),isOptional:!1},outputSchema:{type:O.JSONObject(),isOptional:!0},implementationType:{type:p0,isOptional:!1},implementationConfig:{type:O.JSONObject(),isOptional:!1},maxInvocationsPerMinute:{type:O.Int_unsecure(),isOptional:!0},timeoutMs:{type:O.Int_unsecure(),isOptional:!1,defaultValue:30000},version:{type:O.NonEmptyString(),isOptional:!1},tags:{type:O.String_unsecure(),isArray:!0,isOptional:!0},createdAt:{type:O.DateTime(),isOptional:!1},updatedAt:{type:O.DateTime(),isOptional:!1}}}),Q0=o0({name:"ToolSummary",description:"Summary of a tool for list views",fields:{id:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!1},slug:{type:O.String_unsecure(),isOptional:!1},description:{type:O.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!1},status:{type:Z0,isOptional:!1},version:{type:O.NonEmptyString(),isOptional:!1},createdAt:{type:O.DateTime(),isOptional:!1}}}),C2=o0({name:"CreateToolInput",description:"Input for creating a tool",fields:{organizationId:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!1},slug:{type:O.String_unsecure(),isOptional:!1},description:{type:O.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!0},parametersSchema:{type:O.JSONObject(),isOptional:!1},outputSchema:{type:O.JSONObject(),isOptional:!0},implementationType:{type:p0,isOptional:!1},implementationConfig:{type:O.JSONObject(),isOptional:!1},maxInvocationsPerMinute:{type:O.Int_unsecure(),isOptional:!0},timeoutMs:{type:O.Int_unsecure(),isOptional:!0},tags:{type:O.String_unsecure(),isArray:!0,isOptional:!0}}}),h2=o0({name:"UpdateToolInput",description:"Input for updating a tool",fields:{toolId:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!0},description:{type:O.String_unsecure(),isOptional:!0},status:{type:Z0,isOptional:!0},parametersSchema:{type:O.JSONObject(),isOptional:!0},outputSchema:{type:O.JSONObject(),isOptional:!0},implementationConfig:{type:O.JSONObject(),isOptional:!0},maxInvocationsPerMinute:{type:O.Int_unsecure(),isOptional:!0},timeoutMs:{type:O.Int_unsecure(),isOptional:!0},tags:{type:O.String_unsecure(),isArray:!0,isOptional:!0}}});import{defineCommand as f2,defineQuery as I1}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as G0,ScalarTypeEnum as x}from"@contractspec/lib.schema";var F0=["@agent-console-team"],B1=f2({meta:{key:"agent.tool.create",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","create"],description:"Creates a new AI tool definition.",goal:"Allow users to define new tools that agents can use.",context:"Called from the tool builder UI when creating a new tool."},io:{input:C2,output:G0({name:"CreateToolOutput",fields:{id:{type:x.String_unsecure(),isOptional:!1},name:{type:x.NonEmptyString(),isOptional:!1},slug:{type:x.String_unsecure(),isOptional:!1},status:{type:Z0,isOptional:!1}}}),errors:{SLUG_EXISTS:{description:"A tool with this slug already exists in the organization",http:409,gqlCode:"SLUG_EXISTS",when:"Slug is already taken"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"tool.created",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","created"],when:"Tool is successfully created",payload:Q0}],audit:["tool.created"]},acceptance:{scenarios:[{key:"create-tool-happy-path",given:["User is authenticated","Organization exists"],when:["User submits valid tool configuration"],then:["New tool is created","ToolCreated event is emitted"]},{key:"create-tool-slug-conflict",given:["Tool with same slug exists"],when:["User submits tool with duplicate slug"],then:["SLUG_EXISTS error is returned"]}],examples:[{key:"create-api-tool",input:{name:"Weather API",slug:"weather-api",category:"api",description:"Fetches weather data"},output:{id:"tool-123",name:"Weather API",slug:"weather-api",status:"draft"}}]}}),v1=f2({meta:{key:"agent.tool.update",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","update"],description:"Updates an existing AI tool definition.",goal:"Allow users to modify tool settings and configuration.",context:"Called from the tool settings UI."},io:{input:h2,output:G0({name:"UpdateToolOutput",fields:{id:{type:x.String_unsecure(),isOptional:!1},name:{type:x.NonEmptyString(),isOptional:!1},status:{type:Z0,isOptional:!1},updatedAt:{type:x.DateTime(),isOptional:!1}}}),errors:{TOOL_NOT_FOUND:{description:"The specified tool does not exist",http:404,gqlCode:"TOOL_NOT_FOUND",when:"Tool ID is invalid"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"tool.updated",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","updated"],when:"Tool is updated",payload:Q0}],audit:["tool.updated"]},acceptance:{scenarios:[{key:"update-tool-happy-path",given:["Tool exists","User owns the tool"],when:["User submits updated configuration"],then:["Tool is updated","ToolUpdated event is emitted"]}],examples:[{key:"update-description",input:{toolId:"tool-123",description:"Updated weather API tool"},output:{id:"tool-123",name:"Weather API",status:"draft",updatedAt:"2025-01-01T00:00:00Z"}}]}}),W1=I1({meta:{key:"agent.tool.get",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","get"],description:"Retrieves a tool by its ID.",goal:"View detailed tool configuration.",context:"Called when viewing tool details or editing."},io:{input:G0({name:"GetToolInput",fields:{toolId:{type:x.String_unsecure(),isOptional:!1}}}),output:w2,errors:{TOOL_NOT_FOUND:{description:"The specified tool does not exist",http:404,gqlCode:"TOOL_NOT_FOUND",when:"Tool ID is invalid"}}},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-tool-happy-path",given:["Tool exists"],when:["User requests tool by ID"],then:["Tool details are returned"]}],examples:[{key:"get-basic",input:{toolId:"tool-123"},output:{id:"tool-123",name:"Weather API",status:"active",category:"api"}}]}}),j2=I1({meta:{key:"agent.tool.list",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","list"],description:"Lists tools for an organization with optional filtering.",goal:"Browse and search available tools.",context:"Tool list/dashboard view."},io:{input:G0({name:"ListToolsInput",fields:{organizationId:{type:x.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!0},status:{type:Z0,isOptional:!0},search:{type:x.String_unsecure(),isOptional:!0},limit:{type:x.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:x.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:G0({name:"ListToolsOutput",fields:{items:{type:Q0,isArray:!0,isOptional:!1},total:{type:x.Int_unsecure(),isOptional:!1},hasMore:{type:x.Boolean(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-tools-happy-path",given:["Organization has tools"],when:["User lists tools"],then:["Paginated list of tools is returned"]}],examples:[{key:"list-by-category",input:{organizationId:"org-123",category:"api",limit:10},output:{items:[],total:0,hasMore:!1}}]}}),_1=f2({meta:{key:"agent.tool.test",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","test"],description:"Tests a tool with sample input to verify it works correctly.",goal:"Validate tool configuration before deployment.",context:"Tool builder UI - test panel."},io:{input:G0({name:"TestToolInput",fields:{toolId:{type:x.String_unsecure(),isOptional:!1},testInput:{type:x.JSONObject(),isOptional:!1}}}),output:G0({name:"TestToolOutput",fields:{success:{type:x.Boolean(),isOptional:!1},output:{type:x.JSONObject(),isOptional:!0},error:{type:x.String_unsecure(),isOptional:!0},durationMs:{type:x.Int_unsecure(),isOptional:!1}}}),errors:{TOOL_NOT_FOUND:{description:"The specified tool does not exist",http:404,gqlCode:"TOOL_NOT_FOUND",when:"Tool ID is invalid"},TOOL_EXECUTION_ERROR:{description:"Tool execution failed",http:500,gqlCode:"TOOL_EXECUTION_ERROR",when:"Tool returns an error"}}},policy:{auth:"user"},sideEffects:{audit:["tool.tested"]},acceptance:{scenarios:[{key:"test-tool-success",given:["Tool exists","Tool is configured correctly"],when:["User runs test with valid input"],then:["Tool executes successfully","Output is returned"]},{key:"test-tool-failure",given:["Tool exists","Tool has configuration error"],when:["User runs test"],then:["TOOL_EXECUTION_ERROR is returned"]}],examples:[{key:"test-weather-api",input:{toolId:"tool-123",testInput:{city:"Paris"}},output:{success:!0,output:{temperature:22},durationMs:150}}]}});import{web as y4}from"@contractspec/lib.runtime-sandbox";var{generateId:N1}=y4;var L1={queuedAt:"r.queuedAt",totalTokens:"r.totalTokens",durationMs:"r.durationMs",estimatedCostUsd:"r.estimatedCostUsd",status:"r.status",agentName:"a.name"};function S0(Z){return{id:Z.id,projectId:Z.projectId,organizationId:Z.organizationId,name:Z.name,description:Z.description??void 0,modelProvider:Z.modelProvider,modelName:Z.modelName,systemPrompt:Z.systemPrompt??void 0,temperature:Z.temperature,maxTokens:Z.maxTokens,status:Z.status,createdAt:new Date(Z.createdAt),updatedAt:new Date(Z.updatedAt)}}function d4(Z){return{id:Z.id,projectId:Z.projectId,organizationId:Z.organizationId,name:Z.name,description:Z.description??void 0,version:Z.version,category:Z.category,status:Z.status,inputSchema:Z.inputSchema??void 0,outputSchema:Z.outputSchema??void 0,endpoint:Z.endpoint??void 0,createdAt:new Date(Z.createdAt),updatedAt:new Date(Z.updatedAt)}}function R1(Z,q){return{id:Z.id,projectId:Z.projectId,agentId:Z.agentId,agentName:q,status:Z.status,input:Z.input??void 0,output:Z.output??void 0,totalTokens:Z.totalTokens,promptTokens:Z.promptTokens,completionTokens:Z.completionTokens,estimatedCostUsd:Z.estimatedCostUsd,durationMs:Z.durationMs??void 0,errorMessage:Z.errorMessage??void 0,queuedAt:new Date(Z.queuedAt),startedAt:Z.startedAt?new Date(Z.startedAt):void 0,completedAt:Z.completedAt?new Date(Z.completedAt):void 0}}function m4(Z){async function q($){let{projectId:H,organizationId:Q,status:G,search:F,limit:U=20,offset:L=0}=$,B="WHERE projectId = ?",W=[H];if(Q)B+=" AND organizationId = ?",W.push(Q);if(G&&G!=="all")B+=" AND status = ?",W.push(G);if(F)B+=" AND (name LIKE ? OR description LIKE ?)",W.push(`%${F}%`,`%${F}%`);let v=(await Z.query(`SELECT COUNT(*) as count FROM agent_definition ${B}`,W)).rows[0]?.count??0,b=(await Z.query(`SELECT * FROM agent_definition ${B} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,[...W,U,L])).rows;return{items:b.map(S0),total:v,hasMore:L+b.length<v}}async function D($){let H=(await Z.query("SELECT * FROM agent_definition WHERE id = ?",[$])).rows;return H[0]?S0(H[0]):null}async function Y($,H){let Q=N1("agent"),G=new Date().toISOString();await Z.execute(`INSERT INTO agent_definition (id, projectId, organizationId, name, description, modelProvider, modelName, systemPrompt, temperature, maxTokens, status, createdAt, updatedAt)
53
+ - Use Feature Flags to gate risky tools; default safe/off.`}];C4(h4);import{defineExample as f4}from"@contractspec/lib.contracts-spec";var j4=f4({meta:{key:"agent-console",version:"1.0.0",title:"Agent Console",description:"AI agent ops console: tools, agents, runs, logs, and metrics (spec-first, regenerable).",kind:"template",visibility:"public",stability:"beta",owners:["@platform.core"],tags:["ai","agents","tools","orchestration"]},docs:{rootDocId:"docs.examples.agent-console.reference",goalDocId:"docs.examples.agent-console.goal",usageDocId:"docs.examples.agent-console.usage",constraintsDocId:"docs.examples.agent-console.constraints"},entrypoints:{packageName:"@contractspec/example.agent-console",feature:"./agent.feature",presentations:"./presentations",handlers:"./handlers",docs:"./docs",ui:"./ui"},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs","builder","markdown","evolution"]},studio:{enabled:!0,installable:!0},mcp:{enabled:!0}}}),x4=j4;import{defineEnum as d0}from"@contractspec/lib.schema";var a=d0("RunStatus",["QUEUED","IN_PROGRESS","COMPLETED","FAILED","CANCELLED","EXPIRED"]),W2=d0("RunStepType",["MESSAGE_CREATION","TOOL_CALL","TOOL_RESULT","ERROR"]),R0=d0("LogLevel",["DEBUG","INFO","WARN","ERROR"]),_2=d0("Granularity",["hour","day","week","month"]);import{defineSchemaModel as $0,ScalarTypeEnum as I}from"@contractspec/lib.schema";var N2=$0({name:"RunInput",description:"Input data for agent execution",fields:{message:{type:I.NonEmptyString(),isOptional:!1},context:{type:I.JSONObject(),isOptional:!0}}}),m0=$0({name:"RunStep",description:"Individual step within a run",fields:{id:{type:I.String_unsecure(),isOptional:!1},stepNumber:{type:I.Int_unsecure(),isOptional:!1},type:{type:W2,isOptional:!1},toolId:{type:I.String_unsecure(),isOptional:!0},toolName:{type:I.String_unsecure(),isOptional:!0},input:{type:I.JSONObject(),isOptional:!0},output:{type:I.JSONObject(),isOptional:!0},status:{type:a,isOptional:!1},errorMessage:{type:I.String_unsecure(),isOptional:!0},tokensUsed:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},durationMs:{type:I.Int_unsecure(),isOptional:!0},startedAt:{type:I.DateTime(),isOptional:!1},completedAt:{type:I.DateTime(),isOptional:!0}}}),E0=$0({name:"RunLog",description:"Execution log entry",fields:{id:{type:I.String_unsecure(),isOptional:!1},stepId:{type:I.String_unsecure(),isOptional:!0},level:{type:R0,isOptional:!1},message:{type:I.String_unsecure(),isOptional:!1},data:{type:I.JSONObject(),isOptional:!0},source:{type:I.String_unsecure(),isOptional:!0},traceId:{type:I.String_unsecure(),isOptional:!0},spanId:{type:I.String_unsecure(),isOptional:!0},timestamp:{type:I.DateTime(),isOptional:!1}}}),A1=$0({name:"RunAgentRef",description:"Agent reference in a run",fields:{id:{type:I.String_unsecure(),isOptional:!1},name:{type:I.NonEmptyString(),isOptional:!1},modelProvider:{type:I.String_unsecure(),isOptional:!1},modelName:{type:I.String_unsecure(),isOptional:!1}}}),L2=$0({name:"Run",description:"Agent execution instance",fields:{id:{type:I.String_unsecure(),isOptional:!1},organizationId:{type:I.String_unsecure(),isOptional:!1},agentId:{type:I.String_unsecure(),isOptional:!1},userId:{type:I.String_unsecure(),isOptional:!0},sessionId:{type:I.String_unsecure(),isOptional:!0},input:{type:I.JSONObject(),isOptional:!1},output:{type:I.JSONObject(),isOptional:!0},status:{type:a,isOptional:!1},errorMessage:{type:I.String_unsecure(),isOptional:!0},errorCode:{type:I.String_unsecure(),isOptional:!0},totalTokens:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},promptTokens:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},completionTokens:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},totalIterations:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},durationMs:{type:I.Int_unsecure(),isOptional:!0},estimatedCostUsd:{type:I.Float_unsecure(),isOptional:!0},queuedAt:{type:I.DateTime(),isOptional:!1},startedAt:{type:I.DateTime(),isOptional:!0},completedAt:{type:I.DateTime(),isOptional:!0},metadata:{type:I.JSONObject(),isOptional:!0},steps:{type:m0,isArray:!0,isOptional:!0},logs:{type:E0,isArray:!0,isOptional:!0},agent:{type:A1,isOptional:!0}}}),X0=$0({name:"RunSummary",description:"Summary of a run for list views",fields:{id:{type:I.String_unsecure(),isOptional:!1},agentId:{type:I.String_unsecure(),isOptional:!1},agentName:{type:I.NonEmptyString(),isOptional:!1},status:{type:a,isOptional:!1},totalTokens:{type:I.Int_unsecure(),isOptional:!1},durationMs:{type:I.Int_unsecure(),isOptional:!0},estimatedCostUsd:{type:I.Float_unsecure(),isOptional:!0},queuedAt:{type:I.DateTime(),isOptional:!1},completedAt:{type:I.DateTime(),isOptional:!0}}}),R2=$0({name:"TimelineDataPoint",description:"Timeline data point for metrics",fields:{period:{type:I.String_unsecure(),isOptional:!1},runs:{type:I.Int_unsecure(),isOptional:!1},tokens:{type:I.Int_unsecure(),isOptional:!1},costUsd:{type:I.Float_unsecure(),isOptional:!1},avgDurationMs:{type:I.Float_unsecure(),isOptional:!1}}});import{defineCommand as V1,defineQuery as O0}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as S,ScalarTypeEnum as N}from"@contractspec/lib.schema";var e=["@agent-console-team"],O2=V1({meta:{key:"agent.run.execute",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","execute"],description:"Starts a new agent run with the given input.",goal:"Execute an AI agent with user input.",context:"Called from chat interface or API."},io:{input:S({name:"ExecuteAgentInput",fields:{agentId:{type:N.String_unsecure(),isOptional:!1},input:{type:N2,isOptional:!1},sessionId:{type:N.String_unsecure(),isOptional:!0},metadata:{type:N.JSONObject(),isOptional:!0},stream:{type:N.Boolean(),isOptional:!0},maxIterations:{type:N.Int_unsecure(),isOptional:!0},timeoutMs:{type:N.Int_unsecure(),isOptional:!0}}}),output:S({name:"ExecuteAgentOutput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},status:{type:a,isOptional:!1},estimatedWaitMs:{type:N.Int_unsecure(),isOptional:!0}}}),errors:{AGENT_NOT_FOUND:{description:"The specified agent does not exist",http:404,gqlCode:"AGENT_NOT_FOUND",when:"Agent ID is invalid"},AGENT_NOT_ACTIVE:{description:"The specified agent is not active",http:400,gqlCode:"AGENT_NOT_ACTIVE",when:"Agent is in draft/paused/archived state"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"run.started",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","started"],when:"Run is queued",payload:X0}],audit:["run.started"]},acceptance:{scenarios:[{key:"execute-agent-happy-path",given:["Agent exists","Agent is active"],when:["User submits execution request"],then:["Run is created","RunStarted event is emitted"]},{key:"execute-agent-not-active",given:["Agent exists but is not active"],when:["User attempts to execute"],then:["AGENT_NOT_ACTIVE error is returned"]}],examples:[{key:"basic-execute",input:{agentId:"agent-123",input:{message:"Hello"}},output:{runId:"run-456",status:"pending",estimatedWaitMs:5000}}]}}),K1=V1({meta:{key:"agent.run.cancel",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","cancel"],description:"Cancels an in-progress agent run.",goal:"Stop a running agent execution.",context:"Called when user wants to abort a long-running task."},io:{input:S({name:"CancelRunInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},reason:{type:N.String_unsecure(),isOptional:!0}}}),output:S({name:"CancelRunOutput",fields:{success:{type:N.Boolean(),isOptional:!1},status:{type:a,isOptional:!1}}}),errors:{RUN_NOT_FOUND:{description:"The specified run does not exist",http:404,gqlCode:"RUN_NOT_FOUND",when:"Run ID is invalid"},RUN_NOT_CANCELLABLE:{description:"The run cannot be cancelled",http:400,gqlCode:"RUN_NOT_CANCELLABLE",when:"Run is already completed/failed/cancelled"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"run.cancelled",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","cancelled"],when:"Run is cancelled",payload:X0}],audit:["run.cancelled"]},acceptance:{scenarios:[{key:"cancel-run-happy-path",given:["Run exists","Run is in progress"],when:["User cancels run"],then:["Run is cancelled","RunCancelled event is emitted"]},{key:"cancel-run-already-completed",given:["Run exists but is already completed"],when:["User attempts to cancel"],then:["RUN_NOT_CANCELLABLE error is returned"]}],examples:[{key:"cancel-basic",input:{runId:"run-456",reason:"User requested"},output:{success:!0,status:"cancelled"}}]}}),k1=O0({meta:{key:"agent.run.get",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","get"],description:"Retrieves a run by its ID with optional details.",goal:"View detailed run information.",context:"Run details page or monitoring."},io:{input:S({name:"GetRunInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},includeSteps:{type:N.Boolean(),isOptional:!0},includeLogs:{type:N.Boolean(),isOptional:!0}}}),output:L2,errors:{RUN_NOT_FOUND:{description:"The specified run does not exist",http:404,gqlCode:"RUN_NOT_FOUND",when:"Run ID is invalid"}}},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-happy-path",given:["Run exists"],when:["User requests run by ID"],then:["Run details are returned"]}],examples:[{key:"get-with-steps",input:{runId:"run-456",includeSteps:!0,includeLogs:!1},output:{id:"run-456",status:"completed",steps:[]}}]}}),M2=O0({meta:{key:"agent.run.list",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","list"],description:"Lists runs with optional filtering.",goal:"Browse and search run history.",context:"Run history/dashboard view."},io:{input:S({name:"ListRunsInput",fields:{organizationId:{type:N.String_unsecure(),isOptional:!0},agentId:{type:N.String_unsecure(),isOptional:!0},userId:{type:N.String_unsecure(),isOptional:!0},sessionId:{type:N.String_unsecure(),isOptional:!0},status:{type:a,isOptional:!0},startDate:{type:N.DateTime(),isOptional:!0},endDate:{type:N.DateTime(),isOptional:!0},limit:{type:N.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:N.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:S({name:"ListRunsOutput",fields:{items:{type:X0,isArray:!0,isOptional:!1},total:{type:N.Int_unsecure(),isOptional:!1},hasMore:{type:N.Boolean(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-runs-happy-path",given:["Organization has runs"],when:["User lists runs"],then:["Paginated list of runs is returned"]}],examples:[{key:"list-by-agent",input:{agentId:"agent-123",limit:20,offset:0},output:{items:[],total:0,hasMore:!1}}]}}),g4=O0({meta:{key:"agent.run.getSteps",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","steps"],description:"Retrieves all steps for a specific run.",goal:"View step-by-step execution details.",context:"Run details page - steps tab."},io:{input:S({name:"GetRunStepsInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1}}}),output:S({name:"GetRunStepsOutput",fields:{steps:{type:m0,isArray:!0,isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-steps-happy-path",given:["Run exists with steps"],when:["User requests steps"],then:["Steps list is returned"]}],examples:[{key:"get-steps-basic",input:{runId:"run-456"},output:{steps:[]}}]}}),T4=O0({meta:{key:"agent.run.getLogs",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","logs"],description:"Retrieves all logs for a specific run.",goal:"Debug and audit run execution.",context:"Run details page - logs tab."},io:{input:S({name:"GetRunLogsInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},level:{type:R0,isOptional:!0},stepId:{type:N.String_unsecure(),isOptional:!0},limit:{type:N.Int_unsecure(),isOptional:!0,defaultValue:100},offset:{type:N.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:S({name:"GetRunLogsOutput",fields:{items:{type:E0,isArray:!0,isOptional:!1},total:{type:N.Int_unsecure(),isOptional:!1},hasMore:{type:N.Boolean(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-logs-happy-path",given:["Run exists with logs"],when:["User requests logs"],then:["Paginated logs list is returned"]}],examples:[{key:"get-logs-filtered",input:{runId:"run-456",level:"error",limit:50},output:{items:[],total:0,hasMore:!1}}]}}),P1=O0({meta:{key:"agent.run.getMetrics",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","metrics"],description:"Retrieves aggregated metrics for runs within a time period.",goal:"Monitor and analyze agent usage.",context:"Analytics dashboard."},io:{input:S({name:"GetRunMetricsInput",fields:{organizationId:{type:N.String_unsecure(),isOptional:!1},agentId:{type:N.String_unsecure(),isOptional:!0},startDate:{type:N.DateTime(),isOptional:!1},endDate:{type:N.DateTime(),isOptional:!1},granularity:{type:_2,isOptional:!0,defaultValue:"day"}}}),output:S({name:"GetRunMetricsOutput",fields:{totalRuns:{type:N.Int_unsecure(),isOptional:!1},completedRuns:{type:N.Int_unsecure(),isOptional:!1},failedRuns:{type:N.Int_unsecure(),isOptional:!1},totalTokens:{type:N.Int_unsecure(),isOptional:!1},totalCostUsd:{type:N.Float_unsecure(),isOptional:!1},averageDurationMs:{type:N.Float_unsecure(),isOptional:!1},successRate:{type:N.Float_unsecure(),isOptional:!1},timeline:{type:R2,isArray:!0,isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-metrics-happy-path",given:["Organization has run history"],when:["User requests metrics for date range"],then:["Aggregated metrics are returned"]}],examples:[{key:"get-daily-metrics",input:{organizationId:"org-123",startDate:"2025-01-01",endDate:"2025-01-31",granularity:"day"},output:{totalRuns:100,completedRuns:90,failedRuns:10,totalTokens:50000,totalCostUsd:5,averageDurationMs:2500,successRate:0.9,timeline:[]}}]}});import{defineEnum as b2}from"@contractspec/lib.schema";var z0=b2("ToolCategory",["RETRIEVAL","COMPUTATION","COMMUNICATION","INTEGRATION","UTILITY","CUSTOM"]),Z0=b2("ToolStatus",["DRAFT","ACTIVE","DEPRECATED","DISABLED"]),p0=b2("ImplementationType",["http","function","workflow"]);import{defineSchemaModel as o0,ScalarTypeEnum as O}from"@contractspec/lib.schema";var w2=o0({name:"Tool",description:"AI tool definition",fields:{id:{type:O.String_unsecure(),isOptional:!1},organizationId:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!1},slug:{type:O.String_unsecure(),isOptional:!1},description:{type:O.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!1},status:{type:Z0,isOptional:!1},parametersSchema:{type:O.JSONObject(),isOptional:!1},outputSchema:{type:O.JSONObject(),isOptional:!0},implementationType:{type:p0,isOptional:!1},implementationConfig:{type:O.JSONObject(),isOptional:!1},maxInvocationsPerMinute:{type:O.Int_unsecure(),isOptional:!0},timeoutMs:{type:O.Int_unsecure(),isOptional:!1,defaultValue:30000},version:{type:O.NonEmptyString(),isOptional:!1},tags:{type:O.String_unsecure(),isArray:!0,isOptional:!0},createdAt:{type:O.DateTime(),isOptional:!1},updatedAt:{type:O.DateTime(),isOptional:!1}}}),Q0=o0({name:"ToolSummary",description:"Summary of a tool for list views",fields:{id:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!1},slug:{type:O.String_unsecure(),isOptional:!1},description:{type:O.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!1},status:{type:Z0,isOptional:!1},version:{type:O.NonEmptyString(),isOptional:!1},createdAt:{type:O.DateTime(),isOptional:!1}}}),C2=o0({name:"CreateToolInput",description:"Input for creating a tool",fields:{organizationId:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!1},slug:{type:O.String_unsecure(),isOptional:!1},description:{type:O.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!0},parametersSchema:{type:O.JSONObject(),isOptional:!1},outputSchema:{type:O.JSONObject(),isOptional:!0},implementationType:{type:p0,isOptional:!1},implementationConfig:{type:O.JSONObject(),isOptional:!1},maxInvocationsPerMinute:{type:O.Int_unsecure(),isOptional:!0},timeoutMs:{type:O.Int_unsecure(),isOptional:!0},tags:{type:O.String_unsecure(),isArray:!0,isOptional:!0}}}),h2=o0({name:"UpdateToolInput",description:"Input for updating a tool",fields:{toolId:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!0},description:{type:O.String_unsecure(),isOptional:!0},status:{type:Z0,isOptional:!0},parametersSchema:{type:O.JSONObject(),isOptional:!0},outputSchema:{type:O.JSONObject(),isOptional:!0},implementationConfig:{type:O.JSONObject(),isOptional:!0},maxInvocationsPerMinute:{type:O.Int_unsecure(),isOptional:!0},timeoutMs:{type:O.Int_unsecure(),isOptional:!0},tags:{type:O.String_unsecure(),isArray:!0,isOptional:!0}}});import{defineCommand as f2,defineQuery as I1}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as G0,ScalarTypeEnum as x}from"@contractspec/lib.schema";var F0=["@agent-console-team"],B1=f2({meta:{key:"agent.tool.create",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","create"],description:"Creates a new AI tool definition.",goal:"Allow users to define new tools that agents can use.",context:"Called from the tool builder UI when creating a new tool."},io:{input:C2,output:G0({name:"CreateToolOutput",fields:{id:{type:x.String_unsecure(),isOptional:!1},name:{type:x.NonEmptyString(),isOptional:!1},slug:{type:x.String_unsecure(),isOptional:!1},status:{type:Z0,isOptional:!1}}}),errors:{SLUG_EXISTS:{description:"A tool with this slug already exists in the organization",http:409,gqlCode:"SLUG_EXISTS",when:"Slug is already taken"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"tool.created",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","created"],when:"Tool is successfully created",payload:Q0}],audit:["tool.created"]},acceptance:{scenarios:[{key:"create-tool-happy-path",given:["User is authenticated","Organization exists"],when:["User submits valid tool configuration"],then:["New tool is created","ToolCreated event is emitted"]},{key:"create-tool-slug-conflict",given:["Tool with same slug exists"],when:["User submits tool with duplicate slug"],then:["SLUG_EXISTS error is returned"]}],examples:[{key:"create-api-tool",input:{name:"Weather API",slug:"weather-api",category:"api",description:"Fetches weather data"},output:{id:"tool-123",name:"Weather API",slug:"weather-api",status:"draft"}}]}}),v1=f2({meta:{key:"agent.tool.update",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","update"],description:"Updates an existing AI tool definition.",goal:"Allow users to modify tool settings and configuration.",context:"Called from the tool settings UI."},io:{input:h2,output:G0({name:"UpdateToolOutput",fields:{id:{type:x.String_unsecure(),isOptional:!1},name:{type:x.NonEmptyString(),isOptional:!1},status:{type:Z0,isOptional:!1},updatedAt:{type:x.DateTime(),isOptional:!1}}}),errors:{TOOL_NOT_FOUND:{description:"The specified tool does not exist",http:404,gqlCode:"TOOL_NOT_FOUND",when:"Tool ID is invalid"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"tool.updated",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","updated"],when:"Tool is updated",payload:Q0}],audit:["tool.updated"]},acceptance:{scenarios:[{key:"update-tool-happy-path",given:["Tool exists","User owns the tool"],when:["User submits updated configuration"],then:["Tool is updated","ToolUpdated event is emitted"]}],examples:[{key:"update-description",input:{toolId:"tool-123",description:"Updated weather API tool"},output:{id:"tool-123",name:"Weather API",status:"draft",updatedAt:"2025-01-01T00:00:00Z"}}]}}),W1=I1({meta:{key:"agent.tool.get",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","get"],description:"Retrieves a tool by its ID.",goal:"View detailed tool configuration.",context:"Called when viewing tool details or editing."},io:{input:G0({name:"GetToolInput",fields:{toolId:{type:x.String_unsecure(),isOptional:!1}}}),output:w2,errors:{TOOL_NOT_FOUND:{description:"The specified tool does not exist",http:404,gqlCode:"TOOL_NOT_FOUND",when:"Tool ID is invalid"}}},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-tool-happy-path",given:["Tool exists"],when:["User requests tool by ID"],then:["Tool details are returned"]}],examples:[{key:"get-basic",input:{toolId:"tool-123"},output:{id:"tool-123",name:"Weather API",status:"active",category:"api"}}]}}),j2=I1({meta:{key:"agent.tool.list",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","list"],description:"Lists tools for an organization with optional filtering.",goal:"Browse and search available tools.",context:"Tool list/dashboard view."},io:{input:G0({name:"ListToolsInput",fields:{organizationId:{type:x.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!0},status:{type:Z0,isOptional:!0},search:{type:x.String_unsecure(),isOptional:!0},limit:{type:x.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:x.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:G0({name:"ListToolsOutput",fields:{items:{type:Q0,isArray:!0,isOptional:!1},total:{type:x.Int_unsecure(),isOptional:!1},hasMore:{type:x.Boolean(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-tools-happy-path",given:["Organization has tools"],when:["User lists tools"],then:["Paginated list of tools is returned"]}],examples:[{key:"list-by-category",input:{organizationId:"org-123",category:"api",limit:10},output:{items:[],total:0,hasMore:!1}}]}}),_1=f2({meta:{key:"agent.tool.test",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","test"],description:"Tests a tool with sample input to verify it works correctly.",goal:"Validate tool configuration before deployment.",context:"Tool builder UI - test panel."},io:{input:G0({name:"TestToolInput",fields:{toolId:{type:x.String_unsecure(),isOptional:!1},testInput:{type:x.JSONObject(),isOptional:!1}}}),output:G0({name:"TestToolOutput",fields:{success:{type:x.Boolean(),isOptional:!1},output:{type:x.JSONObject(),isOptional:!0},error:{type:x.String_unsecure(),isOptional:!0},durationMs:{type:x.Int_unsecure(),isOptional:!1}}}),errors:{TOOL_NOT_FOUND:{description:"The specified tool does not exist",http:404,gqlCode:"TOOL_NOT_FOUND",when:"Tool ID is invalid"},TOOL_EXECUTION_ERROR:{description:"Tool execution failed",http:500,gqlCode:"TOOL_EXECUTION_ERROR",when:"Tool returns an error"}}},policy:{auth:"user"},sideEffects:{audit:["tool.tested"]},acceptance:{scenarios:[{key:"test-tool-success",given:["Tool exists","Tool is configured correctly"],when:["User runs test with valid input"],then:["Tool executes successfully","Output is returned"]},{key:"test-tool-failure",given:["Tool exists","Tool has configuration error"],when:["User runs test"],then:["TOOL_EXECUTION_ERROR is returned"]}],examples:[{key:"test-weather-api",input:{toolId:"tool-123",testInput:{city:"Paris"}},output:{success:!0,output:{temperature:22},durationMs:150}}]}});import{web as y4}from"@contractspec/lib.runtime-sandbox";var{generateId:N1}=y4;var L1={queuedAt:"r.queuedAt",totalTokens:"r.totalTokens",durationMs:"r.durationMs",estimatedCostUsd:"r.estimatedCostUsd",status:"r.status",agentName:"a.name"};function S0(Z){return{id:Z.id,projectId:Z.projectId,organizationId:Z.organizationId,name:Z.name,description:Z.description??void 0,modelProvider:Z.modelProvider,modelName:Z.modelName,systemPrompt:Z.systemPrompt??void 0,temperature:Z.temperature,maxTokens:Z.maxTokens,status:Z.status,createdAt:new Date(Z.createdAt),updatedAt:new Date(Z.updatedAt)}}function d4(Z){return{id:Z.id,projectId:Z.projectId,organizationId:Z.organizationId,name:Z.name,description:Z.description??void 0,version:Z.version,category:Z.category,status:Z.status,inputSchema:Z.inputSchema??void 0,outputSchema:Z.outputSchema??void 0,endpoint:Z.endpoint??void 0,createdAt:new Date(Z.createdAt),updatedAt:new Date(Z.updatedAt)}}function R1(Z,q){return{id:Z.id,projectId:Z.projectId,agentId:Z.agentId,agentName:q,status:Z.status,input:Z.input??void 0,output:Z.output??void 0,totalTokens:Z.totalTokens,promptTokens:Z.promptTokens,completionTokens:Z.completionTokens,estimatedCostUsd:Z.estimatedCostUsd,durationMs:Z.durationMs??void 0,errorMessage:Z.errorMessage??void 0,queuedAt:new Date(Z.queuedAt),startedAt:Z.startedAt?new Date(Z.startedAt):void 0,completedAt:Z.completedAt?new Date(Z.completedAt):void 0}}function m4(Z){async function q($){let{projectId:H,organizationId:Q,status:G,search:F,limit:U=20,offset:L=0}=$,B="WHERE projectId = ?",W=[H];if(Q)B+=" AND organizationId = ?",W.push(Q);if(G&&G!=="all")B+=" AND status = ?",W.push(G);if(F)B+=" AND (name LIKE ? OR description LIKE ?)",W.push(`%${F}%`,`%${F}%`);let v=(await Z.query(`SELECT COUNT(*) as count FROM agent_definition ${B}`,W)).rows[0]?.count??0,b=(await Z.query(`SELECT * FROM agent_definition ${B} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,[...W,U,L])).rows;return{items:b.map(S0),total:v,hasMore:L+b.length<v}}async function D($){let H=(await Z.query("SELECT * FROM agent_definition WHERE id = ?",[$])).rows;return H[0]?S0(H[0]):null}async function Y($,H){let Q=N1("agent"),G=new Date().toISOString();await Z.execute(`INSERT INTO agent_definition (id, projectId, organizationId, name, description, modelProvider, modelName, systemPrompt, temperature, maxTokens, status, createdAt, updatedAt)
54
54
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[Q,H.projectId,H.organizationId,$.name,$.description??null,$.modelProvider??"openai",$.modelName??"gpt-4",$.systemPrompt??null,$.temperature??0.7,$.maxTokens??4096,"DRAFT",G,G]);let U=(await Z.query("SELECT * FROM agent_definition WHERE id = ?",[Q])).rows[0];if(!U)throw Error("Failed to retrieve created agent");return S0(U)}async function X($){let H=new Date().toISOString(),Q=["updatedAt = ?"],G=[H];if($.name!==void 0)Q.push("name = ?"),G.push($.name);if($.description!==void 0)Q.push("description = ?"),G.push($.description);if($.status!==void 0)Q.push("status = ?"),G.push($.status);G.push($.id),await Z.execute(`UPDATE agent_definition SET ${Q.join(", ")} WHERE id = ?`,G);let F=(await Z.query("SELECT * FROM agent_definition WHERE id = ?",[$.id])).rows;if(!F[0])throw Error("NOT_FOUND");return S0(F[0])}async function A($){let{projectId:H,organizationId:Q,category:G,status:F,search:U,limit:L=50,offset:B=0}=$,W="WHERE projectId = ?",P=[H];if(Q)W+=" AND organizationId = ?",P.push(Q);if(G&&G!=="all")W+=" AND category = ?",P.push(G);if(F&&F!=="all")W+=" AND status = ?",P.push(F);if(U)W+=" AND (name LIKE ? OR description LIKE ?)",P.push(`%${U}%`,`%${U}%`);let b=(await Z.query(`SELECT COUNT(*) as count FROM agent_tool ${W}`,P)).rows[0]?.count??0,o=(await Z.query(`SELECT * FROM agent_tool ${W} ORDER BY name ASC LIMIT ? OFFSET ?`,[...P,L,B])).rows;return{items:o.map(d4),total:b,hasMore:B+o.length<b}}async function z($){let{projectId:H,agentId:Q,status:G,sortBy:F,sortDirection:U="desc",limit:L=20,offset:B=0}=$,W="WHERE r.projectId = ?",P=[H];if(Q)W+=" AND r.agentId = ?",P.push(Q);if(G&&G!=="all")W+=" AND r.status = ?",P.push(G);let b=(await Z.query(`SELECT COUNT(*) as count FROM agent_run r ${W}`,P)).rows[0]?.count??0,o=F?L1[F]:L1.queuedAt,f0=U==="asc"?"ASC":"DESC",d=(await Z.query(`SELECT r.*, a.name as agentName
55
55
  FROM agent_run r
56
56
  LEFT JOIN agent_definition a ON r.agentId = a.id
@@ -1 +1 @@
1
- import{defineExample as g}from"@contractspec/lib.contracts-spec";var h=g({meta:{key:"agent-console",version:"1.0.0",title:"Agent Console",description:"AI agent ops console: tools, agents, runs, logs, and metrics (spec-first, regenerable).",kind:"template",visibility:"public",stability:"beta",owners:["@platform.core"],tags:["ai","agents","tools","orchestration"]},docs:{rootDocId:"docs.examples.agent-console.reference",goalDocId:"docs.examples.agent-console.goal",usageDocId:"docs.examples.agent-console.usage",constraintsDocId:"docs.examples.agent-console.constraints"},entrypoints:{packageName:"@contractspec/example.agent-console",feature:"./agent.feature",presentations:"./presentations",handlers:"./handlers",docs:"./docs"},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs","builder","markdown","evolution"]},studio:{enabled:!0,installable:!0},mcp:{enabled:!0}}}),q=h;export{q as default};
1
+ import{defineExample as g}from"@contractspec/lib.contracts-spec";var h=g({meta:{key:"agent-console",version:"1.0.0",title:"Agent Console",description:"AI agent ops console: tools, agents, runs, logs, and metrics (spec-first, regenerable).",kind:"template",visibility:"public",stability:"beta",owners:["@platform.core"],tags:["ai","agents","tools","orchestration"]},docs:{rootDocId:"docs.examples.agent-console.reference",goalDocId:"docs.examples.agent-console.goal",usageDocId:"docs.examples.agent-console.usage",constraintsDocId:"docs.examples.agent-console.constraints"},entrypoints:{packageName:"@contractspec/example.agent-console",feature:"./agent.feature",presentations:"./presentations",handlers:"./handlers",docs:"./docs",ui:"./ui"},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs","builder","markdown","evolution"]},studio:{enabled:!0,installable:!0},mcp:{enabled:!0}}}),q=h;export{q as default};
@@ -49,7 +49,7 @@ import{defineVisualization as Y2,VisualizationRegistry as z4}from"@contractspec/
49
49
  ## Verification
50
50
  - Add fixtures for tool schema changes and run lifecycle.
51
51
  - Ensure Audit/Notifications remain wired for runs; metrics collection unchanged.
52
- - Use Feature Flags to gate risky tools; default safe/off.`}];C4(h4);import{defineExample as f4}from"@contractspec/lib.contracts-spec";var j4=f4({meta:{key:"agent-console",version:"1.0.0",title:"Agent Console",description:"AI agent ops console: tools, agents, runs, logs, and metrics (spec-first, regenerable).",kind:"template",visibility:"public",stability:"beta",owners:["@platform.core"],tags:["ai","agents","tools","orchestration"]},docs:{rootDocId:"docs.examples.agent-console.reference",goalDocId:"docs.examples.agent-console.goal",usageDocId:"docs.examples.agent-console.usage",constraintsDocId:"docs.examples.agent-console.constraints"},entrypoints:{packageName:"@contractspec/example.agent-console",feature:"./agent.feature",presentations:"./presentations",handlers:"./handlers",docs:"./docs"},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs","builder","markdown","evolution"]},studio:{enabled:!0,installable:!0},mcp:{enabled:!0}}}),x4=j4;import{defineEnum as d0}from"@contractspec/lib.schema";var a=d0("RunStatus",["QUEUED","IN_PROGRESS","COMPLETED","FAILED","CANCELLED","EXPIRED"]),W2=d0("RunStepType",["MESSAGE_CREATION","TOOL_CALL","TOOL_RESULT","ERROR"]),R0=d0("LogLevel",["DEBUG","INFO","WARN","ERROR"]),_2=d0("Granularity",["hour","day","week","month"]);import{defineSchemaModel as $0,ScalarTypeEnum as I}from"@contractspec/lib.schema";var N2=$0({name:"RunInput",description:"Input data for agent execution",fields:{message:{type:I.NonEmptyString(),isOptional:!1},context:{type:I.JSONObject(),isOptional:!0}}}),m0=$0({name:"RunStep",description:"Individual step within a run",fields:{id:{type:I.String_unsecure(),isOptional:!1},stepNumber:{type:I.Int_unsecure(),isOptional:!1},type:{type:W2,isOptional:!1},toolId:{type:I.String_unsecure(),isOptional:!0},toolName:{type:I.String_unsecure(),isOptional:!0},input:{type:I.JSONObject(),isOptional:!0},output:{type:I.JSONObject(),isOptional:!0},status:{type:a,isOptional:!1},errorMessage:{type:I.String_unsecure(),isOptional:!0},tokensUsed:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},durationMs:{type:I.Int_unsecure(),isOptional:!0},startedAt:{type:I.DateTime(),isOptional:!1},completedAt:{type:I.DateTime(),isOptional:!0}}}),E0=$0({name:"RunLog",description:"Execution log entry",fields:{id:{type:I.String_unsecure(),isOptional:!1},stepId:{type:I.String_unsecure(),isOptional:!0},level:{type:R0,isOptional:!1},message:{type:I.String_unsecure(),isOptional:!1},data:{type:I.JSONObject(),isOptional:!0},source:{type:I.String_unsecure(),isOptional:!0},traceId:{type:I.String_unsecure(),isOptional:!0},spanId:{type:I.String_unsecure(),isOptional:!0},timestamp:{type:I.DateTime(),isOptional:!1}}}),A1=$0({name:"RunAgentRef",description:"Agent reference in a run",fields:{id:{type:I.String_unsecure(),isOptional:!1},name:{type:I.NonEmptyString(),isOptional:!1},modelProvider:{type:I.String_unsecure(),isOptional:!1},modelName:{type:I.String_unsecure(),isOptional:!1}}}),L2=$0({name:"Run",description:"Agent execution instance",fields:{id:{type:I.String_unsecure(),isOptional:!1},organizationId:{type:I.String_unsecure(),isOptional:!1},agentId:{type:I.String_unsecure(),isOptional:!1},userId:{type:I.String_unsecure(),isOptional:!0},sessionId:{type:I.String_unsecure(),isOptional:!0},input:{type:I.JSONObject(),isOptional:!1},output:{type:I.JSONObject(),isOptional:!0},status:{type:a,isOptional:!1},errorMessage:{type:I.String_unsecure(),isOptional:!0},errorCode:{type:I.String_unsecure(),isOptional:!0},totalTokens:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},promptTokens:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},completionTokens:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},totalIterations:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},durationMs:{type:I.Int_unsecure(),isOptional:!0},estimatedCostUsd:{type:I.Float_unsecure(),isOptional:!0},queuedAt:{type:I.DateTime(),isOptional:!1},startedAt:{type:I.DateTime(),isOptional:!0},completedAt:{type:I.DateTime(),isOptional:!0},metadata:{type:I.JSONObject(),isOptional:!0},steps:{type:m0,isArray:!0,isOptional:!0},logs:{type:E0,isArray:!0,isOptional:!0},agent:{type:A1,isOptional:!0}}}),X0=$0({name:"RunSummary",description:"Summary of a run for list views",fields:{id:{type:I.String_unsecure(),isOptional:!1},agentId:{type:I.String_unsecure(),isOptional:!1},agentName:{type:I.NonEmptyString(),isOptional:!1},status:{type:a,isOptional:!1},totalTokens:{type:I.Int_unsecure(),isOptional:!1},durationMs:{type:I.Int_unsecure(),isOptional:!0},estimatedCostUsd:{type:I.Float_unsecure(),isOptional:!0},queuedAt:{type:I.DateTime(),isOptional:!1},completedAt:{type:I.DateTime(),isOptional:!0}}}),R2=$0({name:"TimelineDataPoint",description:"Timeline data point for metrics",fields:{period:{type:I.String_unsecure(),isOptional:!1},runs:{type:I.Int_unsecure(),isOptional:!1},tokens:{type:I.Int_unsecure(),isOptional:!1},costUsd:{type:I.Float_unsecure(),isOptional:!1},avgDurationMs:{type:I.Float_unsecure(),isOptional:!1}}});import{defineCommand as V1,defineQuery as O0}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as S,ScalarTypeEnum as N}from"@contractspec/lib.schema";var e=["@agent-console-team"],O2=V1({meta:{key:"agent.run.execute",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","execute"],description:"Starts a new agent run with the given input.",goal:"Execute an AI agent with user input.",context:"Called from chat interface or API."},io:{input:S({name:"ExecuteAgentInput",fields:{agentId:{type:N.String_unsecure(),isOptional:!1},input:{type:N2,isOptional:!1},sessionId:{type:N.String_unsecure(),isOptional:!0},metadata:{type:N.JSONObject(),isOptional:!0},stream:{type:N.Boolean(),isOptional:!0},maxIterations:{type:N.Int_unsecure(),isOptional:!0},timeoutMs:{type:N.Int_unsecure(),isOptional:!0}}}),output:S({name:"ExecuteAgentOutput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},status:{type:a,isOptional:!1},estimatedWaitMs:{type:N.Int_unsecure(),isOptional:!0}}}),errors:{AGENT_NOT_FOUND:{description:"The specified agent does not exist",http:404,gqlCode:"AGENT_NOT_FOUND",when:"Agent ID is invalid"},AGENT_NOT_ACTIVE:{description:"The specified agent is not active",http:400,gqlCode:"AGENT_NOT_ACTIVE",when:"Agent is in draft/paused/archived state"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"run.started",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","started"],when:"Run is queued",payload:X0}],audit:["run.started"]},acceptance:{scenarios:[{key:"execute-agent-happy-path",given:["Agent exists","Agent is active"],when:["User submits execution request"],then:["Run is created","RunStarted event is emitted"]},{key:"execute-agent-not-active",given:["Agent exists but is not active"],when:["User attempts to execute"],then:["AGENT_NOT_ACTIVE error is returned"]}],examples:[{key:"basic-execute",input:{agentId:"agent-123",input:{message:"Hello"}},output:{runId:"run-456",status:"pending",estimatedWaitMs:5000}}]}}),K1=V1({meta:{key:"agent.run.cancel",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","cancel"],description:"Cancels an in-progress agent run.",goal:"Stop a running agent execution.",context:"Called when user wants to abort a long-running task."},io:{input:S({name:"CancelRunInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},reason:{type:N.String_unsecure(),isOptional:!0}}}),output:S({name:"CancelRunOutput",fields:{success:{type:N.Boolean(),isOptional:!1},status:{type:a,isOptional:!1}}}),errors:{RUN_NOT_FOUND:{description:"The specified run does not exist",http:404,gqlCode:"RUN_NOT_FOUND",when:"Run ID is invalid"},RUN_NOT_CANCELLABLE:{description:"The run cannot be cancelled",http:400,gqlCode:"RUN_NOT_CANCELLABLE",when:"Run is already completed/failed/cancelled"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"run.cancelled",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","cancelled"],when:"Run is cancelled",payload:X0}],audit:["run.cancelled"]},acceptance:{scenarios:[{key:"cancel-run-happy-path",given:["Run exists","Run is in progress"],when:["User cancels run"],then:["Run is cancelled","RunCancelled event is emitted"]},{key:"cancel-run-already-completed",given:["Run exists but is already completed"],when:["User attempts to cancel"],then:["RUN_NOT_CANCELLABLE error is returned"]}],examples:[{key:"cancel-basic",input:{runId:"run-456",reason:"User requested"},output:{success:!0,status:"cancelled"}}]}}),k1=O0({meta:{key:"agent.run.get",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","get"],description:"Retrieves a run by its ID with optional details.",goal:"View detailed run information.",context:"Run details page or monitoring."},io:{input:S({name:"GetRunInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},includeSteps:{type:N.Boolean(),isOptional:!0},includeLogs:{type:N.Boolean(),isOptional:!0}}}),output:L2,errors:{RUN_NOT_FOUND:{description:"The specified run does not exist",http:404,gqlCode:"RUN_NOT_FOUND",when:"Run ID is invalid"}}},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-happy-path",given:["Run exists"],when:["User requests run by ID"],then:["Run details are returned"]}],examples:[{key:"get-with-steps",input:{runId:"run-456",includeSteps:!0,includeLogs:!1},output:{id:"run-456",status:"completed",steps:[]}}]}}),M2=O0({meta:{key:"agent.run.list",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","list"],description:"Lists runs with optional filtering.",goal:"Browse and search run history.",context:"Run history/dashboard view."},io:{input:S({name:"ListRunsInput",fields:{organizationId:{type:N.String_unsecure(),isOptional:!0},agentId:{type:N.String_unsecure(),isOptional:!0},userId:{type:N.String_unsecure(),isOptional:!0},sessionId:{type:N.String_unsecure(),isOptional:!0},status:{type:a,isOptional:!0},startDate:{type:N.DateTime(),isOptional:!0},endDate:{type:N.DateTime(),isOptional:!0},limit:{type:N.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:N.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:S({name:"ListRunsOutput",fields:{items:{type:X0,isArray:!0,isOptional:!1},total:{type:N.Int_unsecure(),isOptional:!1},hasMore:{type:N.Boolean(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-runs-happy-path",given:["Organization has runs"],when:["User lists runs"],then:["Paginated list of runs is returned"]}],examples:[{key:"list-by-agent",input:{agentId:"agent-123",limit:20,offset:0},output:{items:[],total:0,hasMore:!1}}]}}),g4=O0({meta:{key:"agent.run.getSteps",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","steps"],description:"Retrieves all steps for a specific run.",goal:"View step-by-step execution details.",context:"Run details page - steps tab."},io:{input:S({name:"GetRunStepsInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1}}}),output:S({name:"GetRunStepsOutput",fields:{steps:{type:m0,isArray:!0,isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-steps-happy-path",given:["Run exists with steps"],when:["User requests steps"],then:["Steps list is returned"]}],examples:[{key:"get-steps-basic",input:{runId:"run-456"},output:{steps:[]}}]}}),T4=O0({meta:{key:"agent.run.getLogs",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","logs"],description:"Retrieves all logs for a specific run.",goal:"Debug and audit run execution.",context:"Run details page - logs tab."},io:{input:S({name:"GetRunLogsInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},level:{type:R0,isOptional:!0},stepId:{type:N.String_unsecure(),isOptional:!0},limit:{type:N.Int_unsecure(),isOptional:!0,defaultValue:100},offset:{type:N.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:S({name:"GetRunLogsOutput",fields:{items:{type:E0,isArray:!0,isOptional:!1},total:{type:N.Int_unsecure(),isOptional:!1},hasMore:{type:N.Boolean(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-logs-happy-path",given:["Run exists with logs"],when:["User requests logs"],then:["Paginated logs list is returned"]}],examples:[{key:"get-logs-filtered",input:{runId:"run-456",level:"error",limit:50},output:{items:[],total:0,hasMore:!1}}]}}),P1=O0({meta:{key:"agent.run.getMetrics",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","metrics"],description:"Retrieves aggregated metrics for runs within a time period.",goal:"Monitor and analyze agent usage.",context:"Analytics dashboard."},io:{input:S({name:"GetRunMetricsInput",fields:{organizationId:{type:N.String_unsecure(),isOptional:!1},agentId:{type:N.String_unsecure(),isOptional:!0},startDate:{type:N.DateTime(),isOptional:!1},endDate:{type:N.DateTime(),isOptional:!1},granularity:{type:_2,isOptional:!0,defaultValue:"day"}}}),output:S({name:"GetRunMetricsOutput",fields:{totalRuns:{type:N.Int_unsecure(),isOptional:!1},completedRuns:{type:N.Int_unsecure(),isOptional:!1},failedRuns:{type:N.Int_unsecure(),isOptional:!1},totalTokens:{type:N.Int_unsecure(),isOptional:!1},totalCostUsd:{type:N.Float_unsecure(),isOptional:!1},averageDurationMs:{type:N.Float_unsecure(),isOptional:!1},successRate:{type:N.Float_unsecure(),isOptional:!1},timeline:{type:R2,isArray:!0,isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-metrics-happy-path",given:["Organization has run history"],when:["User requests metrics for date range"],then:["Aggregated metrics are returned"]}],examples:[{key:"get-daily-metrics",input:{organizationId:"org-123",startDate:"2025-01-01",endDate:"2025-01-31",granularity:"day"},output:{totalRuns:100,completedRuns:90,failedRuns:10,totalTokens:50000,totalCostUsd:5,averageDurationMs:2500,successRate:0.9,timeline:[]}}]}});import{defineEnum as b2}from"@contractspec/lib.schema";var z0=b2("ToolCategory",["RETRIEVAL","COMPUTATION","COMMUNICATION","INTEGRATION","UTILITY","CUSTOM"]),Z0=b2("ToolStatus",["DRAFT","ACTIVE","DEPRECATED","DISABLED"]),p0=b2("ImplementationType",["http","function","workflow"]);import{defineSchemaModel as o0,ScalarTypeEnum as O}from"@contractspec/lib.schema";var w2=o0({name:"Tool",description:"AI tool definition",fields:{id:{type:O.String_unsecure(),isOptional:!1},organizationId:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!1},slug:{type:O.String_unsecure(),isOptional:!1},description:{type:O.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!1},status:{type:Z0,isOptional:!1},parametersSchema:{type:O.JSONObject(),isOptional:!1},outputSchema:{type:O.JSONObject(),isOptional:!0},implementationType:{type:p0,isOptional:!1},implementationConfig:{type:O.JSONObject(),isOptional:!1},maxInvocationsPerMinute:{type:O.Int_unsecure(),isOptional:!0},timeoutMs:{type:O.Int_unsecure(),isOptional:!1,defaultValue:30000},version:{type:O.NonEmptyString(),isOptional:!1},tags:{type:O.String_unsecure(),isArray:!0,isOptional:!0},createdAt:{type:O.DateTime(),isOptional:!1},updatedAt:{type:O.DateTime(),isOptional:!1}}}),Q0=o0({name:"ToolSummary",description:"Summary of a tool for list views",fields:{id:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!1},slug:{type:O.String_unsecure(),isOptional:!1},description:{type:O.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!1},status:{type:Z0,isOptional:!1},version:{type:O.NonEmptyString(),isOptional:!1},createdAt:{type:O.DateTime(),isOptional:!1}}}),C2=o0({name:"CreateToolInput",description:"Input for creating a tool",fields:{organizationId:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!1},slug:{type:O.String_unsecure(),isOptional:!1},description:{type:O.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!0},parametersSchema:{type:O.JSONObject(),isOptional:!1},outputSchema:{type:O.JSONObject(),isOptional:!0},implementationType:{type:p0,isOptional:!1},implementationConfig:{type:O.JSONObject(),isOptional:!1},maxInvocationsPerMinute:{type:O.Int_unsecure(),isOptional:!0},timeoutMs:{type:O.Int_unsecure(),isOptional:!0},tags:{type:O.String_unsecure(),isArray:!0,isOptional:!0}}}),h2=o0({name:"UpdateToolInput",description:"Input for updating a tool",fields:{toolId:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!0},description:{type:O.String_unsecure(),isOptional:!0},status:{type:Z0,isOptional:!0},parametersSchema:{type:O.JSONObject(),isOptional:!0},outputSchema:{type:O.JSONObject(),isOptional:!0},implementationConfig:{type:O.JSONObject(),isOptional:!0},maxInvocationsPerMinute:{type:O.Int_unsecure(),isOptional:!0},timeoutMs:{type:O.Int_unsecure(),isOptional:!0},tags:{type:O.String_unsecure(),isArray:!0,isOptional:!0}}});import{defineCommand as f2,defineQuery as I1}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as G0,ScalarTypeEnum as x}from"@contractspec/lib.schema";var F0=["@agent-console-team"],B1=f2({meta:{key:"agent.tool.create",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","create"],description:"Creates a new AI tool definition.",goal:"Allow users to define new tools that agents can use.",context:"Called from the tool builder UI when creating a new tool."},io:{input:C2,output:G0({name:"CreateToolOutput",fields:{id:{type:x.String_unsecure(),isOptional:!1},name:{type:x.NonEmptyString(),isOptional:!1},slug:{type:x.String_unsecure(),isOptional:!1},status:{type:Z0,isOptional:!1}}}),errors:{SLUG_EXISTS:{description:"A tool with this slug already exists in the organization",http:409,gqlCode:"SLUG_EXISTS",when:"Slug is already taken"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"tool.created",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","created"],when:"Tool is successfully created",payload:Q0}],audit:["tool.created"]},acceptance:{scenarios:[{key:"create-tool-happy-path",given:["User is authenticated","Organization exists"],when:["User submits valid tool configuration"],then:["New tool is created","ToolCreated event is emitted"]},{key:"create-tool-slug-conflict",given:["Tool with same slug exists"],when:["User submits tool with duplicate slug"],then:["SLUG_EXISTS error is returned"]}],examples:[{key:"create-api-tool",input:{name:"Weather API",slug:"weather-api",category:"api",description:"Fetches weather data"},output:{id:"tool-123",name:"Weather API",slug:"weather-api",status:"draft"}}]}}),v1=f2({meta:{key:"agent.tool.update",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","update"],description:"Updates an existing AI tool definition.",goal:"Allow users to modify tool settings and configuration.",context:"Called from the tool settings UI."},io:{input:h2,output:G0({name:"UpdateToolOutput",fields:{id:{type:x.String_unsecure(),isOptional:!1},name:{type:x.NonEmptyString(),isOptional:!1},status:{type:Z0,isOptional:!1},updatedAt:{type:x.DateTime(),isOptional:!1}}}),errors:{TOOL_NOT_FOUND:{description:"The specified tool does not exist",http:404,gqlCode:"TOOL_NOT_FOUND",when:"Tool ID is invalid"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"tool.updated",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","updated"],when:"Tool is updated",payload:Q0}],audit:["tool.updated"]},acceptance:{scenarios:[{key:"update-tool-happy-path",given:["Tool exists","User owns the tool"],when:["User submits updated configuration"],then:["Tool is updated","ToolUpdated event is emitted"]}],examples:[{key:"update-description",input:{toolId:"tool-123",description:"Updated weather API tool"},output:{id:"tool-123",name:"Weather API",status:"draft",updatedAt:"2025-01-01T00:00:00Z"}}]}}),W1=I1({meta:{key:"agent.tool.get",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","get"],description:"Retrieves a tool by its ID.",goal:"View detailed tool configuration.",context:"Called when viewing tool details or editing."},io:{input:G0({name:"GetToolInput",fields:{toolId:{type:x.String_unsecure(),isOptional:!1}}}),output:w2,errors:{TOOL_NOT_FOUND:{description:"The specified tool does not exist",http:404,gqlCode:"TOOL_NOT_FOUND",when:"Tool ID is invalid"}}},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-tool-happy-path",given:["Tool exists"],when:["User requests tool by ID"],then:["Tool details are returned"]}],examples:[{key:"get-basic",input:{toolId:"tool-123"},output:{id:"tool-123",name:"Weather API",status:"active",category:"api"}}]}}),j2=I1({meta:{key:"agent.tool.list",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","list"],description:"Lists tools for an organization with optional filtering.",goal:"Browse and search available tools.",context:"Tool list/dashboard view."},io:{input:G0({name:"ListToolsInput",fields:{organizationId:{type:x.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!0},status:{type:Z0,isOptional:!0},search:{type:x.String_unsecure(),isOptional:!0},limit:{type:x.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:x.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:G0({name:"ListToolsOutput",fields:{items:{type:Q0,isArray:!0,isOptional:!1},total:{type:x.Int_unsecure(),isOptional:!1},hasMore:{type:x.Boolean(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-tools-happy-path",given:["Organization has tools"],when:["User lists tools"],then:["Paginated list of tools is returned"]}],examples:[{key:"list-by-category",input:{organizationId:"org-123",category:"api",limit:10},output:{items:[],total:0,hasMore:!1}}]}}),_1=f2({meta:{key:"agent.tool.test",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","test"],description:"Tests a tool with sample input to verify it works correctly.",goal:"Validate tool configuration before deployment.",context:"Tool builder UI - test panel."},io:{input:G0({name:"TestToolInput",fields:{toolId:{type:x.String_unsecure(),isOptional:!1},testInput:{type:x.JSONObject(),isOptional:!1}}}),output:G0({name:"TestToolOutput",fields:{success:{type:x.Boolean(),isOptional:!1},output:{type:x.JSONObject(),isOptional:!0},error:{type:x.String_unsecure(),isOptional:!0},durationMs:{type:x.Int_unsecure(),isOptional:!1}}}),errors:{TOOL_NOT_FOUND:{description:"The specified tool does not exist",http:404,gqlCode:"TOOL_NOT_FOUND",when:"Tool ID is invalid"},TOOL_EXECUTION_ERROR:{description:"Tool execution failed",http:500,gqlCode:"TOOL_EXECUTION_ERROR",when:"Tool returns an error"}}},policy:{auth:"user"},sideEffects:{audit:["tool.tested"]},acceptance:{scenarios:[{key:"test-tool-success",given:["Tool exists","Tool is configured correctly"],when:["User runs test with valid input"],then:["Tool executes successfully","Output is returned"]},{key:"test-tool-failure",given:["Tool exists","Tool has configuration error"],when:["User runs test"],then:["TOOL_EXECUTION_ERROR is returned"]}],examples:[{key:"test-weather-api",input:{toolId:"tool-123",testInput:{city:"Paris"}},output:{success:!0,output:{temperature:22},durationMs:150}}]}});import{web as y4}from"@contractspec/lib.runtime-sandbox";var{generateId:N1}=y4;var L1={queuedAt:"r.queuedAt",totalTokens:"r.totalTokens",durationMs:"r.durationMs",estimatedCostUsd:"r.estimatedCostUsd",status:"r.status",agentName:"a.name"};function S0(Z){return{id:Z.id,projectId:Z.projectId,organizationId:Z.organizationId,name:Z.name,description:Z.description??void 0,modelProvider:Z.modelProvider,modelName:Z.modelName,systemPrompt:Z.systemPrompt??void 0,temperature:Z.temperature,maxTokens:Z.maxTokens,status:Z.status,createdAt:new Date(Z.createdAt),updatedAt:new Date(Z.updatedAt)}}function d4(Z){return{id:Z.id,projectId:Z.projectId,organizationId:Z.organizationId,name:Z.name,description:Z.description??void 0,version:Z.version,category:Z.category,status:Z.status,inputSchema:Z.inputSchema??void 0,outputSchema:Z.outputSchema??void 0,endpoint:Z.endpoint??void 0,createdAt:new Date(Z.createdAt),updatedAt:new Date(Z.updatedAt)}}function R1(Z,q){return{id:Z.id,projectId:Z.projectId,agentId:Z.agentId,agentName:q,status:Z.status,input:Z.input??void 0,output:Z.output??void 0,totalTokens:Z.totalTokens,promptTokens:Z.promptTokens,completionTokens:Z.completionTokens,estimatedCostUsd:Z.estimatedCostUsd,durationMs:Z.durationMs??void 0,errorMessage:Z.errorMessage??void 0,queuedAt:new Date(Z.queuedAt),startedAt:Z.startedAt?new Date(Z.startedAt):void 0,completedAt:Z.completedAt?new Date(Z.completedAt):void 0}}function m4(Z){async function q($){let{projectId:H,organizationId:Q,status:G,search:F,limit:U=20,offset:L=0}=$,B="WHERE projectId = ?",W=[H];if(Q)B+=" AND organizationId = ?",W.push(Q);if(G&&G!=="all")B+=" AND status = ?",W.push(G);if(F)B+=" AND (name LIKE ? OR description LIKE ?)",W.push(`%${F}%`,`%${F}%`);let v=(await Z.query(`SELECT COUNT(*) as count FROM agent_definition ${B}`,W)).rows[0]?.count??0,b=(await Z.query(`SELECT * FROM agent_definition ${B} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,[...W,U,L])).rows;return{items:b.map(S0),total:v,hasMore:L+b.length<v}}async function D($){let H=(await Z.query("SELECT * FROM agent_definition WHERE id = ?",[$])).rows;return H[0]?S0(H[0]):null}async function Y($,H){let Q=N1("agent"),G=new Date().toISOString();await Z.execute(`INSERT INTO agent_definition (id, projectId, organizationId, name, description, modelProvider, modelName, systemPrompt, temperature, maxTokens, status, createdAt, updatedAt)
52
+ - Use Feature Flags to gate risky tools; default safe/off.`}];C4(h4);import{defineExample as f4}from"@contractspec/lib.contracts-spec";var j4=f4({meta:{key:"agent-console",version:"1.0.0",title:"Agent Console",description:"AI agent ops console: tools, agents, runs, logs, and metrics (spec-first, regenerable).",kind:"template",visibility:"public",stability:"beta",owners:["@platform.core"],tags:["ai","agents","tools","orchestration"]},docs:{rootDocId:"docs.examples.agent-console.reference",goalDocId:"docs.examples.agent-console.goal",usageDocId:"docs.examples.agent-console.usage",constraintsDocId:"docs.examples.agent-console.constraints"},entrypoints:{packageName:"@contractspec/example.agent-console",feature:"./agent.feature",presentations:"./presentations",handlers:"./handlers",docs:"./docs",ui:"./ui"},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs","builder","markdown","evolution"]},studio:{enabled:!0,installable:!0},mcp:{enabled:!0}}}),x4=j4;import{defineEnum as d0}from"@contractspec/lib.schema";var a=d0("RunStatus",["QUEUED","IN_PROGRESS","COMPLETED","FAILED","CANCELLED","EXPIRED"]),W2=d0("RunStepType",["MESSAGE_CREATION","TOOL_CALL","TOOL_RESULT","ERROR"]),R0=d0("LogLevel",["DEBUG","INFO","WARN","ERROR"]),_2=d0("Granularity",["hour","day","week","month"]);import{defineSchemaModel as $0,ScalarTypeEnum as I}from"@contractspec/lib.schema";var N2=$0({name:"RunInput",description:"Input data for agent execution",fields:{message:{type:I.NonEmptyString(),isOptional:!1},context:{type:I.JSONObject(),isOptional:!0}}}),m0=$0({name:"RunStep",description:"Individual step within a run",fields:{id:{type:I.String_unsecure(),isOptional:!1},stepNumber:{type:I.Int_unsecure(),isOptional:!1},type:{type:W2,isOptional:!1},toolId:{type:I.String_unsecure(),isOptional:!0},toolName:{type:I.String_unsecure(),isOptional:!0},input:{type:I.JSONObject(),isOptional:!0},output:{type:I.JSONObject(),isOptional:!0},status:{type:a,isOptional:!1},errorMessage:{type:I.String_unsecure(),isOptional:!0},tokensUsed:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},durationMs:{type:I.Int_unsecure(),isOptional:!0},startedAt:{type:I.DateTime(),isOptional:!1},completedAt:{type:I.DateTime(),isOptional:!0}}}),E0=$0({name:"RunLog",description:"Execution log entry",fields:{id:{type:I.String_unsecure(),isOptional:!1},stepId:{type:I.String_unsecure(),isOptional:!0},level:{type:R0,isOptional:!1},message:{type:I.String_unsecure(),isOptional:!1},data:{type:I.JSONObject(),isOptional:!0},source:{type:I.String_unsecure(),isOptional:!0},traceId:{type:I.String_unsecure(),isOptional:!0},spanId:{type:I.String_unsecure(),isOptional:!0},timestamp:{type:I.DateTime(),isOptional:!1}}}),A1=$0({name:"RunAgentRef",description:"Agent reference in a run",fields:{id:{type:I.String_unsecure(),isOptional:!1},name:{type:I.NonEmptyString(),isOptional:!1},modelProvider:{type:I.String_unsecure(),isOptional:!1},modelName:{type:I.String_unsecure(),isOptional:!1}}}),L2=$0({name:"Run",description:"Agent execution instance",fields:{id:{type:I.String_unsecure(),isOptional:!1},organizationId:{type:I.String_unsecure(),isOptional:!1},agentId:{type:I.String_unsecure(),isOptional:!1},userId:{type:I.String_unsecure(),isOptional:!0},sessionId:{type:I.String_unsecure(),isOptional:!0},input:{type:I.JSONObject(),isOptional:!1},output:{type:I.JSONObject(),isOptional:!0},status:{type:a,isOptional:!1},errorMessage:{type:I.String_unsecure(),isOptional:!0},errorCode:{type:I.String_unsecure(),isOptional:!0},totalTokens:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},promptTokens:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},completionTokens:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},totalIterations:{type:I.Int_unsecure(),isOptional:!1,defaultValue:0},durationMs:{type:I.Int_unsecure(),isOptional:!0},estimatedCostUsd:{type:I.Float_unsecure(),isOptional:!0},queuedAt:{type:I.DateTime(),isOptional:!1},startedAt:{type:I.DateTime(),isOptional:!0},completedAt:{type:I.DateTime(),isOptional:!0},metadata:{type:I.JSONObject(),isOptional:!0},steps:{type:m0,isArray:!0,isOptional:!0},logs:{type:E0,isArray:!0,isOptional:!0},agent:{type:A1,isOptional:!0}}}),X0=$0({name:"RunSummary",description:"Summary of a run for list views",fields:{id:{type:I.String_unsecure(),isOptional:!1},agentId:{type:I.String_unsecure(),isOptional:!1},agentName:{type:I.NonEmptyString(),isOptional:!1},status:{type:a,isOptional:!1},totalTokens:{type:I.Int_unsecure(),isOptional:!1},durationMs:{type:I.Int_unsecure(),isOptional:!0},estimatedCostUsd:{type:I.Float_unsecure(),isOptional:!0},queuedAt:{type:I.DateTime(),isOptional:!1},completedAt:{type:I.DateTime(),isOptional:!0}}}),R2=$0({name:"TimelineDataPoint",description:"Timeline data point for metrics",fields:{period:{type:I.String_unsecure(),isOptional:!1},runs:{type:I.Int_unsecure(),isOptional:!1},tokens:{type:I.Int_unsecure(),isOptional:!1},costUsd:{type:I.Float_unsecure(),isOptional:!1},avgDurationMs:{type:I.Float_unsecure(),isOptional:!1}}});import{defineCommand as V1,defineQuery as O0}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as S,ScalarTypeEnum as N}from"@contractspec/lib.schema";var e=["@agent-console-team"],O2=V1({meta:{key:"agent.run.execute",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","execute"],description:"Starts a new agent run with the given input.",goal:"Execute an AI agent with user input.",context:"Called from chat interface or API."},io:{input:S({name:"ExecuteAgentInput",fields:{agentId:{type:N.String_unsecure(),isOptional:!1},input:{type:N2,isOptional:!1},sessionId:{type:N.String_unsecure(),isOptional:!0},metadata:{type:N.JSONObject(),isOptional:!0},stream:{type:N.Boolean(),isOptional:!0},maxIterations:{type:N.Int_unsecure(),isOptional:!0},timeoutMs:{type:N.Int_unsecure(),isOptional:!0}}}),output:S({name:"ExecuteAgentOutput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},status:{type:a,isOptional:!1},estimatedWaitMs:{type:N.Int_unsecure(),isOptional:!0}}}),errors:{AGENT_NOT_FOUND:{description:"The specified agent does not exist",http:404,gqlCode:"AGENT_NOT_FOUND",when:"Agent ID is invalid"},AGENT_NOT_ACTIVE:{description:"The specified agent is not active",http:400,gqlCode:"AGENT_NOT_ACTIVE",when:"Agent is in draft/paused/archived state"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"run.started",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","started"],when:"Run is queued",payload:X0}],audit:["run.started"]},acceptance:{scenarios:[{key:"execute-agent-happy-path",given:["Agent exists","Agent is active"],when:["User submits execution request"],then:["Run is created","RunStarted event is emitted"]},{key:"execute-agent-not-active",given:["Agent exists but is not active"],when:["User attempts to execute"],then:["AGENT_NOT_ACTIVE error is returned"]}],examples:[{key:"basic-execute",input:{agentId:"agent-123",input:{message:"Hello"}},output:{runId:"run-456",status:"pending",estimatedWaitMs:5000}}]}}),K1=V1({meta:{key:"agent.run.cancel",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","cancel"],description:"Cancels an in-progress agent run.",goal:"Stop a running agent execution.",context:"Called when user wants to abort a long-running task."},io:{input:S({name:"CancelRunInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},reason:{type:N.String_unsecure(),isOptional:!0}}}),output:S({name:"CancelRunOutput",fields:{success:{type:N.Boolean(),isOptional:!1},status:{type:a,isOptional:!1}}}),errors:{RUN_NOT_FOUND:{description:"The specified run does not exist",http:404,gqlCode:"RUN_NOT_FOUND",when:"Run ID is invalid"},RUN_NOT_CANCELLABLE:{description:"The run cannot be cancelled",http:400,gqlCode:"RUN_NOT_CANCELLABLE",when:"Run is already completed/failed/cancelled"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"run.cancelled",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","cancelled"],when:"Run is cancelled",payload:X0}],audit:["run.cancelled"]},acceptance:{scenarios:[{key:"cancel-run-happy-path",given:["Run exists","Run is in progress"],when:["User cancels run"],then:["Run is cancelled","RunCancelled event is emitted"]},{key:"cancel-run-already-completed",given:["Run exists but is already completed"],when:["User attempts to cancel"],then:["RUN_NOT_CANCELLABLE error is returned"]}],examples:[{key:"cancel-basic",input:{runId:"run-456",reason:"User requested"},output:{success:!0,status:"cancelled"}}]}}),k1=O0({meta:{key:"agent.run.get",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","get"],description:"Retrieves a run by its ID with optional details.",goal:"View detailed run information.",context:"Run details page or monitoring."},io:{input:S({name:"GetRunInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},includeSteps:{type:N.Boolean(),isOptional:!0},includeLogs:{type:N.Boolean(),isOptional:!0}}}),output:L2,errors:{RUN_NOT_FOUND:{description:"The specified run does not exist",http:404,gqlCode:"RUN_NOT_FOUND",when:"Run ID is invalid"}}},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-happy-path",given:["Run exists"],when:["User requests run by ID"],then:["Run details are returned"]}],examples:[{key:"get-with-steps",input:{runId:"run-456",includeSteps:!0,includeLogs:!1},output:{id:"run-456",status:"completed",steps:[]}}]}}),M2=O0({meta:{key:"agent.run.list",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","list"],description:"Lists runs with optional filtering.",goal:"Browse and search run history.",context:"Run history/dashboard view."},io:{input:S({name:"ListRunsInput",fields:{organizationId:{type:N.String_unsecure(),isOptional:!0},agentId:{type:N.String_unsecure(),isOptional:!0},userId:{type:N.String_unsecure(),isOptional:!0},sessionId:{type:N.String_unsecure(),isOptional:!0},status:{type:a,isOptional:!0},startDate:{type:N.DateTime(),isOptional:!0},endDate:{type:N.DateTime(),isOptional:!0},limit:{type:N.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:N.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:S({name:"ListRunsOutput",fields:{items:{type:X0,isArray:!0,isOptional:!1},total:{type:N.Int_unsecure(),isOptional:!1},hasMore:{type:N.Boolean(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-runs-happy-path",given:["Organization has runs"],when:["User lists runs"],then:["Paginated list of runs is returned"]}],examples:[{key:"list-by-agent",input:{agentId:"agent-123",limit:20,offset:0},output:{items:[],total:0,hasMore:!1}}]}}),g4=O0({meta:{key:"agent.run.getSteps",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","steps"],description:"Retrieves all steps for a specific run.",goal:"View step-by-step execution details.",context:"Run details page - steps tab."},io:{input:S({name:"GetRunStepsInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1}}}),output:S({name:"GetRunStepsOutput",fields:{steps:{type:m0,isArray:!0,isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-steps-happy-path",given:["Run exists with steps"],when:["User requests steps"],then:["Steps list is returned"]}],examples:[{key:"get-steps-basic",input:{runId:"run-456"},output:{steps:[]}}]}}),T4=O0({meta:{key:"agent.run.getLogs",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","logs"],description:"Retrieves all logs for a specific run.",goal:"Debug and audit run execution.",context:"Run details page - logs tab."},io:{input:S({name:"GetRunLogsInput",fields:{runId:{type:N.String_unsecure(),isOptional:!1},level:{type:R0,isOptional:!0},stepId:{type:N.String_unsecure(),isOptional:!0},limit:{type:N.Int_unsecure(),isOptional:!0,defaultValue:100},offset:{type:N.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:S({name:"GetRunLogsOutput",fields:{items:{type:E0,isArray:!0,isOptional:!1},total:{type:N.Int_unsecure(),isOptional:!1},hasMore:{type:N.Boolean(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-logs-happy-path",given:["Run exists with logs"],when:["User requests logs"],then:["Paginated logs list is returned"]}],examples:[{key:"get-logs-filtered",input:{runId:"run-456",level:"error",limit:50},output:{items:[],total:0,hasMore:!1}}]}}),P1=O0({meta:{key:"agent.run.getMetrics",version:"1.0.0",stability:"stable",owners:[...e],tags:["run","metrics"],description:"Retrieves aggregated metrics for runs within a time period.",goal:"Monitor and analyze agent usage.",context:"Analytics dashboard."},io:{input:S({name:"GetRunMetricsInput",fields:{organizationId:{type:N.String_unsecure(),isOptional:!1},agentId:{type:N.String_unsecure(),isOptional:!0},startDate:{type:N.DateTime(),isOptional:!1},endDate:{type:N.DateTime(),isOptional:!1},granularity:{type:_2,isOptional:!0,defaultValue:"day"}}}),output:S({name:"GetRunMetricsOutput",fields:{totalRuns:{type:N.Int_unsecure(),isOptional:!1},completedRuns:{type:N.Int_unsecure(),isOptional:!1},failedRuns:{type:N.Int_unsecure(),isOptional:!1},totalTokens:{type:N.Int_unsecure(),isOptional:!1},totalCostUsd:{type:N.Float_unsecure(),isOptional:!1},averageDurationMs:{type:N.Float_unsecure(),isOptional:!1},successRate:{type:N.Float_unsecure(),isOptional:!1},timeline:{type:R2,isArray:!0,isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-run-metrics-happy-path",given:["Organization has run history"],when:["User requests metrics for date range"],then:["Aggregated metrics are returned"]}],examples:[{key:"get-daily-metrics",input:{organizationId:"org-123",startDate:"2025-01-01",endDate:"2025-01-31",granularity:"day"},output:{totalRuns:100,completedRuns:90,failedRuns:10,totalTokens:50000,totalCostUsd:5,averageDurationMs:2500,successRate:0.9,timeline:[]}}]}});import{defineEnum as b2}from"@contractspec/lib.schema";var z0=b2("ToolCategory",["RETRIEVAL","COMPUTATION","COMMUNICATION","INTEGRATION","UTILITY","CUSTOM"]),Z0=b2("ToolStatus",["DRAFT","ACTIVE","DEPRECATED","DISABLED"]),p0=b2("ImplementationType",["http","function","workflow"]);import{defineSchemaModel as o0,ScalarTypeEnum as O}from"@contractspec/lib.schema";var w2=o0({name:"Tool",description:"AI tool definition",fields:{id:{type:O.String_unsecure(),isOptional:!1},organizationId:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!1},slug:{type:O.String_unsecure(),isOptional:!1},description:{type:O.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!1},status:{type:Z0,isOptional:!1},parametersSchema:{type:O.JSONObject(),isOptional:!1},outputSchema:{type:O.JSONObject(),isOptional:!0},implementationType:{type:p0,isOptional:!1},implementationConfig:{type:O.JSONObject(),isOptional:!1},maxInvocationsPerMinute:{type:O.Int_unsecure(),isOptional:!0},timeoutMs:{type:O.Int_unsecure(),isOptional:!1,defaultValue:30000},version:{type:O.NonEmptyString(),isOptional:!1},tags:{type:O.String_unsecure(),isArray:!0,isOptional:!0},createdAt:{type:O.DateTime(),isOptional:!1},updatedAt:{type:O.DateTime(),isOptional:!1}}}),Q0=o0({name:"ToolSummary",description:"Summary of a tool for list views",fields:{id:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!1},slug:{type:O.String_unsecure(),isOptional:!1},description:{type:O.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!1},status:{type:Z0,isOptional:!1},version:{type:O.NonEmptyString(),isOptional:!1},createdAt:{type:O.DateTime(),isOptional:!1}}}),C2=o0({name:"CreateToolInput",description:"Input for creating a tool",fields:{organizationId:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!1},slug:{type:O.String_unsecure(),isOptional:!1},description:{type:O.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!0},parametersSchema:{type:O.JSONObject(),isOptional:!1},outputSchema:{type:O.JSONObject(),isOptional:!0},implementationType:{type:p0,isOptional:!1},implementationConfig:{type:O.JSONObject(),isOptional:!1},maxInvocationsPerMinute:{type:O.Int_unsecure(),isOptional:!0},timeoutMs:{type:O.Int_unsecure(),isOptional:!0},tags:{type:O.String_unsecure(),isArray:!0,isOptional:!0}}}),h2=o0({name:"UpdateToolInput",description:"Input for updating a tool",fields:{toolId:{type:O.String_unsecure(),isOptional:!1},name:{type:O.NonEmptyString(),isOptional:!0},description:{type:O.String_unsecure(),isOptional:!0},status:{type:Z0,isOptional:!0},parametersSchema:{type:O.JSONObject(),isOptional:!0},outputSchema:{type:O.JSONObject(),isOptional:!0},implementationConfig:{type:O.JSONObject(),isOptional:!0},maxInvocationsPerMinute:{type:O.Int_unsecure(),isOptional:!0},timeoutMs:{type:O.Int_unsecure(),isOptional:!0},tags:{type:O.String_unsecure(),isArray:!0,isOptional:!0}}});import{defineCommand as f2,defineQuery as I1}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as G0,ScalarTypeEnum as x}from"@contractspec/lib.schema";var F0=["@agent-console-team"],B1=f2({meta:{key:"agent.tool.create",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","create"],description:"Creates a new AI tool definition.",goal:"Allow users to define new tools that agents can use.",context:"Called from the tool builder UI when creating a new tool."},io:{input:C2,output:G0({name:"CreateToolOutput",fields:{id:{type:x.String_unsecure(),isOptional:!1},name:{type:x.NonEmptyString(),isOptional:!1},slug:{type:x.String_unsecure(),isOptional:!1},status:{type:Z0,isOptional:!1}}}),errors:{SLUG_EXISTS:{description:"A tool with this slug already exists in the organization",http:409,gqlCode:"SLUG_EXISTS",when:"Slug is already taken"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"tool.created",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","created"],when:"Tool is successfully created",payload:Q0}],audit:["tool.created"]},acceptance:{scenarios:[{key:"create-tool-happy-path",given:["User is authenticated","Organization exists"],when:["User submits valid tool configuration"],then:["New tool is created","ToolCreated event is emitted"]},{key:"create-tool-slug-conflict",given:["Tool with same slug exists"],when:["User submits tool with duplicate slug"],then:["SLUG_EXISTS error is returned"]}],examples:[{key:"create-api-tool",input:{name:"Weather API",slug:"weather-api",category:"api",description:"Fetches weather data"},output:{id:"tool-123",name:"Weather API",slug:"weather-api",status:"draft"}}]}}),v1=f2({meta:{key:"agent.tool.update",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","update"],description:"Updates an existing AI tool definition.",goal:"Allow users to modify tool settings and configuration.",context:"Called from the tool settings UI."},io:{input:h2,output:G0({name:"UpdateToolOutput",fields:{id:{type:x.String_unsecure(),isOptional:!1},name:{type:x.NonEmptyString(),isOptional:!1},status:{type:Z0,isOptional:!1},updatedAt:{type:x.DateTime(),isOptional:!1}}}),errors:{TOOL_NOT_FOUND:{description:"The specified tool does not exist",http:404,gqlCode:"TOOL_NOT_FOUND",when:"Tool ID is invalid"}}},policy:{auth:"user"},sideEffects:{emits:[{key:"tool.updated",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","updated"],when:"Tool is updated",payload:Q0}],audit:["tool.updated"]},acceptance:{scenarios:[{key:"update-tool-happy-path",given:["Tool exists","User owns the tool"],when:["User submits updated configuration"],then:["Tool is updated","ToolUpdated event is emitted"]}],examples:[{key:"update-description",input:{toolId:"tool-123",description:"Updated weather API tool"},output:{id:"tool-123",name:"Weather API",status:"draft",updatedAt:"2025-01-01T00:00:00Z"}}]}}),W1=I1({meta:{key:"agent.tool.get",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","get"],description:"Retrieves a tool by its ID.",goal:"View detailed tool configuration.",context:"Called when viewing tool details or editing."},io:{input:G0({name:"GetToolInput",fields:{toolId:{type:x.String_unsecure(),isOptional:!1}}}),output:w2,errors:{TOOL_NOT_FOUND:{description:"The specified tool does not exist",http:404,gqlCode:"TOOL_NOT_FOUND",when:"Tool ID is invalid"}}},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-tool-happy-path",given:["Tool exists"],when:["User requests tool by ID"],then:["Tool details are returned"]}],examples:[{key:"get-basic",input:{toolId:"tool-123"},output:{id:"tool-123",name:"Weather API",status:"active",category:"api"}}]}}),j2=I1({meta:{key:"agent.tool.list",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","list"],description:"Lists tools for an organization with optional filtering.",goal:"Browse and search available tools.",context:"Tool list/dashboard view."},io:{input:G0({name:"ListToolsInput",fields:{organizationId:{type:x.String_unsecure(),isOptional:!1},category:{type:z0,isOptional:!0},status:{type:Z0,isOptional:!0},search:{type:x.String_unsecure(),isOptional:!0},limit:{type:x.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:x.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:G0({name:"ListToolsOutput",fields:{items:{type:Q0,isArray:!0,isOptional:!1},total:{type:x.Int_unsecure(),isOptional:!1},hasMore:{type:x.Boolean(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-tools-happy-path",given:["Organization has tools"],when:["User lists tools"],then:["Paginated list of tools is returned"]}],examples:[{key:"list-by-category",input:{organizationId:"org-123",category:"api",limit:10},output:{items:[],total:0,hasMore:!1}}]}}),_1=f2({meta:{key:"agent.tool.test",version:"1.0.0",stability:"stable",owners:[...F0],tags:["tool","test"],description:"Tests a tool with sample input to verify it works correctly.",goal:"Validate tool configuration before deployment.",context:"Tool builder UI - test panel."},io:{input:G0({name:"TestToolInput",fields:{toolId:{type:x.String_unsecure(),isOptional:!1},testInput:{type:x.JSONObject(),isOptional:!1}}}),output:G0({name:"TestToolOutput",fields:{success:{type:x.Boolean(),isOptional:!1},output:{type:x.JSONObject(),isOptional:!0},error:{type:x.String_unsecure(),isOptional:!0},durationMs:{type:x.Int_unsecure(),isOptional:!1}}}),errors:{TOOL_NOT_FOUND:{description:"The specified tool does not exist",http:404,gqlCode:"TOOL_NOT_FOUND",when:"Tool ID is invalid"},TOOL_EXECUTION_ERROR:{description:"Tool execution failed",http:500,gqlCode:"TOOL_EXECUTION_ERROR",when:"Tool returns an error"}}},policy:{auth:"user"},sideEffects:{audit:["tool.tested"]},acceptance:{scenarios:[{key:"test-tool-success",given:["Tool exists","Tool is configured correctly"],when:["User runs test with valid input"],then:["Tool executes successfully","Output is returned"]},{key:"test-tool-failure",given:["Tool exists","Tool has configuration error"],when:["User runs test"],then:["TOOL_EXECUTION_ERROR is returned"]}],examples:[{key:"test-weather-api",input:{toolId:"tool-123",testInput:{city:"Paris"}},output:{success:!0,output:{temperature:22},durationMs:150}}]}});import{web as y4}from"@contractspec/lib.runtime-sandbox";var{generateId:N1}=y4;var L1={queuedAt:"r.queuedAt",totalTokens:"r.totalTokens",durationMs:"r.durationMs",estimatedCostUsd:"r.estimatedCostUsd",status:"r.status",agentName:"a.name"};function S0(Z){return{id:Z.id,projectId:Z.projectId,organizationId:Z.organizationId,name:Z.name,description:Z.description??void 0,modelProvider:Z.modelProvider,modelName:Z.modelName,systemPrompt:Z.systemPrompt??void 0,temperature:Z.temperature,maxTokens:Z.maxTokens,status:Z.status,createdAt:new Date(Z.createdAt),updatedAt:new Date(Z.updatedAt)}}function d4(Z){return{id:Z.id,projectId:Z.projectId,organizationId:Z.organizationId,name:Z.name,description:Z.description??void 0,version:Z.version,category:Z.category,status:Z.status,inputSchema:Z.inputSchema??void 0,outputSchema:Z.outputSchema??void 0,endpoint:Z.endpoint??void 0,createdAt:new Date(Z.createdAt),updatedAt:new Date(Z.updatedAt)}}function R1(Z,q){return{id:Z.id,projectId:Z.projectId,agentId:Z.agentId,agentName:q,status:Z.status,input:Z.input??void 0,output:Z.output??void 0,totalTokens:Z.totalTokens,promptTokens:Z.promptTokens,completionTokens:Z.completionTokens,estimatedCostUsd:Z.estimatedCostUsd,durationMs:Z.durationMs??void 0,errorMessage:Z.errorMessage??void 0,queuedAt:new Date(Z.queuedAt),startedAt:Z.startedAt?new Date(Z.startedAt):void 0,completedAt:Z.completedAt?new Date(Z.completedAt):void 0}}function m4(Z){async function q($){let{projectId:H,organizationId:Q,status:G,search:F,limit:U=20,offset:L=0}=$,B="WHERE projectId = ?",W=[H];if(Q)B+=" AND organizationId = ?",W.push(Q);if(G&&G!=="all")B+=" AND status = ?",W.push(G);if(F)B+=" AND (name LIKE ? OR description LIKE ?)",W.push(`%${F}%`,`%${F}%`);let v=(await Z.query(`SELECT COUNT(*) as count FROM agent_definition ${B}`,W)).rows[0]?.count??0,b=(await Z.query(`SELECT * FROM agent_definition ${B} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,[...W,U,L])).rows;return{items:b.map(S0),total:v,hasMore:L+b.length<v}}async function D($){let H=(await Z.query("SELECT * FROM agent_definition WHERE id = ?",[$])).rows;return H[0]?S0(H[0]):null}async function Y($,H){let Q=N1("agent"),G=new Date().toISOString();await Z.execute(`INSERT INTO agent_definition (id, projectId, organizationId, name, description, modelProvider, modelName, systemPrompt, temperature, maxTokens, status, createdAt, updatedAt)
53
53
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[Q,H.projectId,H.organizationId,$.name,$.description??null,$.modelProvider??"openai",$.modelName??"gpt-4",$.systemPrompt??null,$.temperature??0.7,$.maxTokens??4096,"DRAFT",G,G]);let U=(await Z.query("SELECT * FROM agent_definition WHERE id = ?",[Q])).rows[0];if(!U)throw Error("Failed to retrieve created agent");return S0(U)}async function X($){let H=new Date().toISOString(),Q=["updatedAt = ?"],G=[H];if($.name!==void 0)Q.push("name = ?"),G.push($.name);if($.description!==void 0)Q.push("description = ?"),G.push($.description);if($.status!==void 0)Q.push("status = ?"),G.push($.status);G.push($.id),await Z.execute(`UPDATE agent_definition SET ${Q.join(", ")} WHERE id = ?`,G);let F=(await Z.query("SELECT * FROM agent_definition WHERE id = ?",[$.id])).rows;if(!F[0])throw Error("NOT_FOUND");return S0(F[0])}async function A($){let{projectId:H,organizationId:Q,category:G,status:F,search:U,limit:L=50,offset:B=0}=$,W="WHERE projectId = ?",P=[H];if(Q)W+=" AND organizationId = ?",P.push(Q);if(G&&G!=="all")W+=" AND category = ?",P.push(G);if(F&&F!=="all")W+=" AND status = ?",P.push(F);if(U)W+=" AND (name LIKE ? OR description LIKE ?)",P.push(`%${U}%`,`%${U}%`);let b=(await Z.query(`SELECT COUNT(*) as count FROM agent_tool ${W}`,P)).rows[0]?.count??0,o=(await Z.query(`SELECT * FROM agent_tool ${W} ORDER BY name ASC LIMIT ? OFFSET ?`,[...P,L,B])).rows;return{items:o.map(d4),total:b,hasMore:B+o.length<b}}async function z($){let{projectId:H,agentId:Q,status:G,sortBy:F,sortDirection:U="desc",limit:L=20,offset:B=0}=$,W="WHERE r.projectId = ?",P=[H];if(Q)W+=" AND r.agentId = ?",P.push(Q);if(G&&G!=="all")W+=" AND r.status = ?",P.push(G);let b=(await Z.query(`SELECT COUNT(*) as count FROM agent_run r ${W}`,P)).rows[0]?.count??0,o=F?L1[F]:L1.queuedAt,f0=U==="asc"?"ASC":"DESC",d=(await Z.query(`SELECT r.*, a.name as agentName
54
54
  FROM agent_run r
55
55
  LEFT JOIN agent_definition a ON r.agentId = a.id
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contractspec/example.agent-console",
3
- "version": "3.8.10",
3
+ "version": "3.8.12",
4
4
  "description": "Agent Console example - AI agent orchestration with tools, runs, and logs",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -543,18 +543,18 @@
543
543
  },
544
544
  "dependencies": {
545
545
  "@contractspec/lib.schema": "3.7.14",
546
- "@contractspec/lib.contracts-spec": "5.2.0",
547
- "@contractspec/lib.example-shared-ui": "6.0.18",
548
- "@contractspec/lib.design-system": "3.8.11",
546
+ "@contractspec/lib.contracts-spec": "5.4.0",
547
+ "@contractspec/lib.example-shared-ui": "6.0.20",
548
+ "@contractspec/lib.design-system": "3.10.0",
549
549
  "@contractspec/lib.runtime-sandbox": "2.7.14",
550
- "@contractspec/lib.ui-kit-web": "3.9.10",
551
- "@contractspec/module.execution-console": "0.1.1",
550
+ "@contractspec/lib.ui-kit-web": "3.10.1",
551
+ "@contractspec/module.execution-console": "0.1.3",
552
552
  "react": "19.2.0",
553
553
  "react-dom": "19.2.0",
554
- "@contractspec/lib.presentation-runtime-core": "3.9.6"
554
+ "@contractspec/lib.presentation-runtime-core": "3.9.8"
555
555
  },
556
556
  "devDependencies": {
557
- "@contractspec/lib.harness": "0.2.11",
557
+ "@contractspec/lib.harness": "0.2.13",
558
558
  "@contractspec/tool.bun": "3.7.14",
559
559
  "@contractspec/tool.typescript": "3.7.13",
560
560
  "@types/react": "^19.2.14",
package/src/example.ts CHANGED
@@ -25,6 +25,7 @@ const example = defineExample({
25
25
  presentations: './presentations',
26
26
  handlers: './handlers',
27
27
  docs: './docs',
28
+ ui: './ui',
28
29
  },
29
30
  surfaces: {
30
31
  templates: true,
@@ -42,10 +42,19 @@ beforeAll(() => {
42
42
  value: SyntaxError,
43
43
  configurable: true,
44
44
  });
45
+ const encodeURIComponentFromGlobal =
46
+ globalThis.encodeURIComponent.bind(globalThis);
47
+ const decodeURIComponentFromGlobal =
48
+ globalThis.decodeURIComponent.bind(globalThis);
49
+ Object.assign(windowInstance, {
50
+ encodeURIComponent: encodeURIComponentFromGlobal,
51
+ decodeURIComponent: decodeURIComponentFromGlobal,
52
+ });
45
53
  Object.assign(globalThis, {
46
54
  window: windowInstance,
47
55
  document: windowInstance.document,
48
56
  navigator: windowInstance.navigator,
57
+ location: windowInstance.location,
49
58
  HTMLElement: windowInstance.HTMLElement,
50
59
  HTMLButtonElement: windowInstance.HTMLButtonElement,
51
60
  HTMLInputElement: windowInstance.HTMLInputElement,
@@ -55,6 +64,7 @@ beforeAll(() => {
55
64
  MouseEvent: windowInstance.MouseEvent,
56
65
  KeyboardEvent: windowInstance.KeyboardEvent,
57
66
  MutationObserver: windowInstance.MutationObserver,
67
+ DocumentFragment: windowInstance.DocumentFragment,
58
68
  getComputedStyle: windowInstance.getComputedStyle.bind(windowInstance),
59
69
  requestAnimationFrame: (callback: FrameRequestCallback) =>
60
70
  setTimeout(() => callback(Date.now()), 0),
@@ -40,10 +40,19 @@ beforeAll(() => {
40
40
  value: SyntaxError,
41
41
  configurable: true,
42
42
  });
43
+ const encodeURIComponentFromGlobal =
44
+ globalThis.encodeURIComponent.bind(globalThis);
45
+ const decodeURIComponentFromGlobal =
46
+ globalThis.decodeURIComponent.bind(globalThis);
47
+ Object.assign(windowInstance, {
48
+ encodeURIComponent: encodeURIComponentFromGlobal,
49
+ decodeURIComponent: decodeURIComponentFromGlobal,
50
+ });
43
51
  Object.assign(globalThis, {
44
52
  window: windowInstance,
45
53
  document: windowInstance.document,
46
54
  navigator: windowInstance.navigator,
55
+ location: windowInstance.location,
47
56
  HTMLElement: windowInstance.HTMLElement,
48
57
  HTMLButtonElement: windowInstance.HTMLButtonElement,
49
58
  HTMLInputElement: windowInstance.HTMLInputElement,
@@ -53,6 +62,7 @@ beforeAll(() => {
53
62
  MouseEvent: windowInstance.MouseEvent,
54
63
  KeyboardEvent: windowInstance.KeyboardEvent,
55
64
  MutationObserver: windowInstance.MutationObserver,
65
+ DocumentFragment: windowInstance.DocumentFragment,
56
66
  getComputedStyle: windowInstance.getComputedStyle.bind(windowInstance),
57
67
  requestAnimationFrame: (callback: FrameRequestCallback) =>
58
68
  setTimeout(() => callback(Date.now()), 0),