@tonyclaw/agent-inspector 3.0.13 → 3.0.14
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.
- package/.output/nitro.json +1 -1
- package/.output/public/assets/{CompareDrawer-BRV9ztWd.js → CompareDrawer-DDfwHQUi.js} +1 -1
- package/.output/public/assets/{ProxyViewerContainer-BVsv8OFb.js → ProxyViewerContainer-CbNsaoQw.js} +41 -41
- package/.output/public/assets/{ReplayDialog-B4b6aD0q.js → ReplayDialog-D-26DMBt.js} +1 -1
- package/.output/public/assets/{RequestAnatomy-ybH1l2Bp.js → RequestAnatomy-B6zNFqNX.js} +1 -1
- package/.output/public/assets/{ResponseView-DpPKgH-Y.js → ResponseView-Ccy95rWI.js} +2 -2
- package/.output/public/assets/{StreamingChunkSequence-9f_rtMzz.js → StreamingChunkSequence-yIiscGuE.js} +1 -1
- package/.output/public/assets/{_sessionId-gEmO-b2f.js → _sessionId-BnMB0zab.js} +1 -1
- package/.output/public/assets/index-49RC4dlD.js +1 -0
- package/.output/public/assets/{index-JgHKqbP1.js → index-BbtAIxbg.js} +1 -1
- package/.output/public/assets/index-DXKupW0r.css +1 -0
- package/.output/public/assets/{json-viewer-DFpIPmLo.js → json-viewer-C838cVmD.js} +1 -1
- package/.output/public/assets/{main-YvdO47OP.js → main-BfN4culo.js} +2 -2
- package/.output/server/_libs/lucide-react.mjs +33 -33
- package/.output/server/{_sessionId-wSX-l7m2.mjs → _sessionId-DoprmwZV.mjs} +3 -3
- package/.output/server/_ssr/{CompareDrawer-R4d8V0Rv.mjs → CompareDrawer-YMLJNxXR.mjs} +3 -3
- package/.output/server/_ssr/{ProxyViewerContainer-CDtJhGg8.mjs → ProxyViewerContainer-C62eZnva.mjs} +215 -24
- package/.output/server/_ssr/{ReplayDialog-BvmLERpW.mjs → ReplayDialog-NmN7Ukjo.mjs} +3 -3
- package/.output/server/_ssr/{RequestAnatomy-CH-oO6mY.mjs → RequestAnatomy-Dawm2qxe.mjs} +2 -2
- package/.output/server/_ssr/{ResponseView-D7shbJw0.mjs → ResponseView-BHyAY83t.mjs} +3 -3
- package/.output/server/_ssr/{StreamingChunkSequence-DB2YHGJj.mjs → StreamingChunkSequence-C4qgcJbg.mjs} +2 -2
- package/.output/server/_ssr/{index-CS4QLxuv.mjs → index-B2Pf6W_T.mjs} +2 -2
- package/.output/server/_ssr/index.mjs +2 -2
- package/.output/server/_ssr/{json-viewer-HxOn73kS.mjs → json-viewer-u67BASf8.mjs} +3 -3
- package/.output/server/_ssr/{router-l4O3mQ4T.mjs → router-CZhFVMGN.mjs} +267 -111
- package/.output/server/_tanstack-start-manifest_v-Dk2HfOoe.mjs +4 -0
- package/.output/server/index.mjs +75 -75
- package/README.md +24 -0
- package/package.json +1 -1
- package/src/components/ecosystem/AgentLabDialog.tsx +221 -10
- package/src/lib/ecosystemContract.ts +21 -1
- package/src/proxy/ecosystemRegistry.ts +52 -0
- package/src/proxy/ecosystemTasks.ts +95 -1
- package/src/routes/api/ecosystem.packages.ts +2 -1
- package/src/routes/api/ecosystem.recipes.$recipeId.run.ts +16 -0
- package/.output/public/assets/index-BIgsQvaF.css +0 -1
- package/.output/public/assets/index-CF3MPYb3.js +0 -1
- package/.output/server/_tanstack-start-manifest_v-Dckf_NHV.mjs +0 -4
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
const tsrStartManifest = () => ({ "routes": { "__root__": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/__root.tsx", "children": ["/", "/api/alerts", "/api/config", "/api/groups", "/api/health", "/api/logs", "/api/mcp", "/api/models", "/api/providers", "/api/runs", "/api/sessions", "/proxy/$", "/session/$sessionId", "/api/ecosystem/packages", "/api/ecosystem/tasks", "/api/knowledge/candidates", "/api/knowledge/project-context", "/api/knowledge/search", "/api/ecosystem/recipes/$recipeId/run", "/api/knowledge/sessions/$sessionId/candidates"], "preloads": ["/assets/main-BfN4culo.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-49RC4dlD.js", "/assets/ProxyViewerContainer-CbNsaoQw.js"] }, "/api/alerts": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/alerts.ts", "children": ["/api/alerts/summary"] }, "/api/config": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/config.ts", "children": ["/api/config/paths"] }, "/api/groups": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/groups.ts", "children": ["/api/groups/$groupId"] }, "/api/health": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/health.ts" }, "/api/logs": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.ts", "children": ["/api/logs/$id", "/api/logs/import", "/api/logs/stream"] }, "/api/mcp": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/mcp.ts" }, "/api/models": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/models.ts" }, "/api/providers": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.ts", "children": ["/api/providers/$providerId", "/api/providers/export", "/api/providers/import", "/api/providers/scan"] }, "/api/runs": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/runs.ts", "children": ["/api/runs/$runId"] }, "/api/sessions": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/sessions.ts" }, "/proxy/$": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/proxy/$.ts" }, "/session/$sessionId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/session/$sessionId.tsx", "assets": [], "preloads": ["/assets/_sessionId-BnMB0zab.js", "/assets/ProxyViewerContainer-CbNsaoQw.js"] }, "/api/alerts/summary": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/alerts.summary.ts" }, "/api/config/paths": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/config.paths.ts" }, "/api/ecosystem/packages": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/ecosystem.packages.ts", "children": ["/api/ecosystem/packages/$packageId/help", "/api/ecosystem/packages/$packageId/install", "/api/ecosystem/packages/$packageId/runner-presets", "/api/ecosystem/packages/$packageId/upgrade"] }, "/api/ecosystem/tasks": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/ecosystem.tasks.ts", "children": ["/api/ecosystem/tasks/$taskId"] }, "/api/groups/$groupId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/groups.$groupId.ts", "children": ["/api/groups/$groupId/evidence", "/api/groups/$groupId/sessions"] }, "/api/knowledge/candidates": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.candidates.ts", "children": ["/api/knowledge/candidates/$candidateId"] }, "/api/knowledge/project-context": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.project-context.ts" }, "/api/knowledge/search": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.search.ts" }, "/api/logs/$id": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.$id.ts", "children": ["/api/logs/$id/body", "/api/logs/$id/chunks", "/api/logs/$id/replay"] }, "/api/logs/import": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.import.ts" }, "/api/logs/stream": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.stream.ts" }, "/api/providers/$providerId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.$providerId.ts", "children": ["/api/providers/$providerId/model-metadata", "/api/providers/$providerId/test"] }, "/api/providers/export": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.export.ts" }, "/api/providers/import": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.import.ts" }, "/api/providers/scan": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.scan.ts" }, "/api/runs/$runId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/runs.$runId.ts", "children": ["/api/runs/$runId/evidence"] }, "/api/ecosystem/tasks/$taskId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/ecosystem.tasks.$taskId.ts" }, "/api/groups/$groupId/evidence": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/groups.$groupId.evidence.ts" }, "/api/groups/$groupId/sessions": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/groups.$groupId.sessions.ts" }, "/api/knowledge/candidates/$candidateId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.candidates.$candidateId.ts", "children": ["/api/knowledge/candidates/$candidateId/promote"] }, "/api/logs/$id/body": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.$id.body.ts" }, "/api/logs/$id/chunks": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.$id.chunks.ts" }, "/api/logs/$id/replay": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.$id.replay.ts" }, "/api/providers/$providerId/model-metadata": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.$providerId.model-metadata.ts" }, "/api/providers/$providerId/test": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.$providerId.test.ts", "children": ["/api/providers/$providerId/test/log"] }, "/api/runs/$runId/evidence": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/runs.$runId.evidence.ts" }, "/api/ecosystem/packages/$packageId/help": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/ecosystem.packages.$packageId.help.ts" }, "/api/ecosystem/packages/$packageId/install": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/ecosystem.packages.$packageId.install.ts" }, "/api/ecosystem/packages/$packageId/runner-presets": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/ecosystem.packages.$packageId.runner-presets.ts" }, "/api/ecosystem/packages/$packageId/upgrade": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/ecosystem.packages.$packageId.upgrade.ts" }, "/api/ecosystem/recipes/$recipeId/run": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/ecosystem.recipes.$recipeId.run.ts" }, "/api/knowledge/candidates/$candidateId/promote": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.candidates.$candidateId.promote.ts" }, "/api/knowledge/sessions/$sessionId/candidates": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.sessions.$sessionId.candidates.ts" }, "/api/providers/$providerId/test/log": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.$providerId.test.log.ts" } }, "clientEntry": "/assets/main-BfN4culo.js" });
|
|
2
|
+
export {
|
|
3
|
+
tsrStartManifest
|
|
4
|
+
};
|
package/.output/server/index.mjs
CHANGED
|
@@ -38,121 +38,121 @@ const assets = {
|
|
|
38
38
|
"/assets/agent-inspector-58K1_MsC.ico": {
|
|
39
39
|
"type": "image/vnd.microsoft.icon",
|
|
40
40
|
"etag": '"38fa-ZD8kPABHYjPIkcH82FMY6iZM7fI"',
|
|
41
|
-
"mtime": "2026-07-
|
|
41
|
+
"mtime": "2026-07-08T01:38:53.683Z",
|
|
42
42
|
"size": 14586,
|
|
43
43
|
"path": "../public/assets/agent-inspector-58K1_MsC.ico"
|
|
44
44
|
},
|
|
45
|
-
"/assets/
|
|
46
|
-
"type": "
|
|
47
|
-
"etag": '"
|
|
48
|
-
"mtime": "2026-07-
|
|
49
|
-
"size":
|
|
50
|
-
"path": "../public/assets/
|
|
45
|
+
"/assets/index-BbtAIxbg.js": {
|
|
46
|
+
"type": "text/javascript; charset=utf-8",
|
|
47
|
+
"etag": '"1cd2c-9sotzEOJt7YobaV9zbPeMBhUgKQ"',
|
|
48
|
+
"mtime": "2026-07-08T01:38:53.685Z",
|
|
49
|
+
"size": 118060,
|
|
50
|
+
"path": "../public/assets/index-BbtAIxbg.js"
|
|
51
|
+
},
|
|
52
|
+
"/assets/CompareDrawer-DDfwHQUi.js": {
|
|
53
|
+
"type": "text/javascript; charset=utf-8",
|
|
54
|
+
"etag": '"4bc3-V5X3VhcIpOcGi/B6cXBW6SUb4h4"',
|
|
55
|
+
"mtime": "2026-07-08T01:38:53.685Z",
|
|
56
|
+
"size": 19395,
|
|
57
|
+
"path": "../public/assets/CompareDrawer-DDfwHQUi.js"
|
|
58
|
+
},
|
|
59
|
+
"/assets/index-49RC4dlD.js": {
|
|
60
|
+
"type": "text/javascript; charset=utf-8",
|
|
61
|
+
"etag": '"74-GlRn93aSVOHR0mfj+RCxQ60Mu3o"',
|
|
62
|
+
"mtime": "2026-07-08T01:38:53.685Z",
|
|
63
|
+
"size": 116,
|
|
64
|
+
"path": "../public/assets/index-49RC4dlD.js"
|
|
65
|
+
},
|
|
66
|
+
"/assets/json-viewer-C838cVmD.js": {
|
|
67
|
+
"type": "text/javascript; charset=utf-8",
|
|
68
|
+
"etag": '"1ae6-quOA6edv0/Es47habtmdRT7jfNc"',
|
|
69
|
+
"mtime": "2026-07-08T01:38:53.685Z",
|
|
70
|
+
"size": 6886,
|
|
71
|
+
"path": "../public/assets/json-viewer-C838cVmD.js"
|
|
51
72
|
},
|
|
52
73
|
"/assets/minimax-BPMzvuL-.jpeg": {
|
|
53
74
|
"type": "image/jpeg",
|
|
54
75
|
"etag": '"1b06-IwivU89ko5UTMUM1/t7hn4sQK9A"',
|
|
55
|
-
"mtime": "2026-07-
|
|
76
|
+
"mtime": "2026-07-08T01:38:53.683Z",
|
|
56
77
|
"size": 6918,
|
|
57
78
|
"path": "../public/assets/minimax-BPMzvuL-.jpeg"
|
|
58
79
|
},
|
|
59
|
-
"/assets/
|
|
60
|
-
"type": "
|
|
61
|
-
"etag": '"
|
|
62
|
-
"mtime": "2026-07-
|
|
63
|
-
"size":
|
|
64
|
-
"path": "../public/assets/
|
|
65
|
-
},
|
|
66
|
-
"/assets/CompareDrawer-BRV9ztWd.js": {
|
|
67
|
-
"type": "text/javascript; charset=utf-8",
|
|
68
|
-
"etag": '"4bc3-shyRzaaE6ahHgRB0IA707QrKsJI"',
|
|
69
|
-
"mtime": "2026-07-07T13:32:21.623Z",
|
|
70
|
-
"size": 19395,
|
|
71
|
-
"path": "../public/assets/CompareDrawer-BRV9ztWd.js"
|
|
80
|
+
"/assets/alibaba-TTwafVwX.svg": {
|
|
81
|
+
"type": "image/svg+xml",
|
|
82
|
+
"etag": '"171b-6dyV5K8QjiaY35sN9qNprh9zDIs"',
|
|
83
|
+
"mtime": "2026-07-08T01:38:53.683Z",
|
|
84
|
+
"size": 5915,
|
|
85
|
+
"path": "../public/assets/alibaba-TTwafVwX.svg"
|
|
72
86
|
},
|
|
73
|
-
"/assets/
|
|
87
|
+
"/assets/ReplayDialog-D-26DMBt.js": {
|
|
74
88
|
"type": "text/javascript; charset=utf-8",
|
|
75
|
-
"etag": '"
|
|
76
|
-
"mtime": "2026-07-
|
|
77
|
-
"size":
|
|
78
|
-
"path": "../public/assets/
|
|
89
|
+
"etag": '"3347-aZE+Q0LWYe8L0W8182RYkrLiGmQ"',
|
|
90
|
+
"mtime": "2026-07-08T01:38:53.685Z",
|
|
91
|
+
"size": 13127,
|
|
92
|
+
"path": "../public/assets/ReplayDialog-D-26DMBt.js"
|
|
79
93
|
},
|
|
80
|
-
"/assets/index-
|
|
94
|
+
"/assets/index-DXKupW0r.css": {
|
|
81
95
|
"type": "text/css; charset=utf-8",
|
|
82
|
-
"etag": '"
|
|
83
|
-
"mtime": "2026-07-
|
|
84
|
-
"size":
|
|
85
|
-
"path": "../public/assets/index-
|
|
86
|
-
},
|
|
87
|
-
"/assets/index-JgHKqbP1.js": {
|
|
88
|
-
"type": "text/javascript; charset=utf-8",
|
|
89
|
-
"etag": '"1cd2c-0imryeYo69ow52gECBS18OO26Fo"',
|
|
90
|
-
"mtime": "2026-07-07T13:32:21.623Z",
|
|
91
|
-
"size": 118060,
|
|
92
|
-
"path": "../public/assets/index-JgHKqbP1.js"
|
|
96
|
+
"etag": '"23dd5-TDREYsXzXS8z4xFgQFr1UWJvDXE"',
|
|
97
|
+
"mtime": "2026-07-08T01:38:53.685Z",
|
|
98
|
+
"size": 146901,
|
|
99
|
+
"path": "../public/assets/index-DXKupW0r.css"
|
|
93
100
|
},
|
|
94
|
-
"/assets/main-
|
|
101
|
+
"/assets/main-BfN4culo.js": {
|
|
95
102
|
"type": "text/javascript; charset=utf-8",
|
|
96
|
-
"etag": '"512fd-
|
|
97
|
-
"mtime": "2026-07-
|
|
103
|
+
"etag": '"512fd-Lx/1rDXGJqcCtEnfodu55luhvMs"',
|
|
104
|
+
"mtime": "2026-07-08T01:38:53.685Z",
|
|
98
105
|
"size": 332541,
|
|
99
|
-
"path": "../public/assets/main-
|
|
106
|
+
"path": "../public/assets/main-BfN4culo.js"
|
|
100
107
|
},
|
|
101
|
-
"/assets/
|
|
108
|
+
"/assets/_sessionId-BnMB0zab.js": {
|
|
102
109
|
"type": "text/javascript; charset=utf-8",
|
|
103
|
-
"etag": '"
|
|
104
|
-
"mtime": "2026-07-
|
|
105
|
-
"size":
|
|
106
|
-
"path": "../public/assets/
|
|
110
|
+
"etag": '"36c-vmwadBttRO2Tr8uyzA9ILlXMGRg"',
|
|
111
|
+
"mtime": "2026-07-08T01:38:53.685Z",
|
|
112
|
+
"size": 876,
|
|
113
|
+
"path": "../public/assets/_sessionId-BnMB0zab.js"
|
|
107
114
|
},
|
|
108
|
-
"/assets/
|
|
115
|
+
"/assets/RequestAnatomy-B6zNFqNX.js": {
|
|
109
116
|
"type": "text/javascript; charset=utf-8",
|
|
110
|
-
"etag": '"
|
|
111
|
-
"mtime": "2026-07-
|
|
112
|
-
"size":
|
|
113
|
-
"path": "../public/assets/
|
|
117
|
+
"etag": '"43f2-FB7RmmcasRWbq5XlMj8Lfh/HgFQ"',
|
|
118
|
+
"mtime": "2026-07-08T01:38:53.685Z",
|
|
119
|
+
"size": 17394,
|
|
120
|
+
"path": "../public/assets/RequestAnatomy-B6zNFqNX.js"
|
|
114
121
|
},
|
|
115
122
|
"/assets/zhipuai-BPNAnxo-.svg": {
|
|
116
123
|
"type": "image/svg+xml",
|
|
117
124
|
"etag": '"2bf8-hNaLCTi89nOFCsIIfWpP/jrfo0s"',
|
|
118
|
-
"mtime": "2026-07-
|
|
125
|
+
"mtime": "2026-07-08T01:38:53.683Z",
|
|
119
126
|
"size": 11256,
|
|
120
127
|
"path": "../public/assets/zhipuai-BPNAnxo-.svg"
|
|
121
128
|
},
|
|
122
|
-
"/assets/
|
|
129
|
+
"/assets/StreamingChunkSequence-yIiscGuE.js": {
|
|
123
130
|
"type": "text/javascript; charset=utf-8",
|
|
124
|
-
"etag": '"
|
|
125
|
-
"mtime": "2026-07-
|
|
126
|
-
"size": 18428,
|
|
127
|
-
"path": "../public/assets/ResponseView-DpPKgH-Y.js"
|
|
128
|
-
},
|
|
129
|
-
"/assets/StreamingChunkSequence-9f_rtMzz.js": {
|
|
130
|
-
"type": "text/javascript; charset=utf-8",
|
|
131
|
-
"etag": '"e95-ez6Uni8ODVEO4MODGxVp1hZegy0"',
|
|
132
|
-
"mtime": "2026-07-07T13:32:21.623Z",
|
|
131
|
+
"etag": '"e95-KIXlCdHgHnZGrDZTGIAMwgHzmp0"',
|
|
132
|
+
"mtime": "2026-07-08T01:38:53.685Z",
|
|
133
133
|
"size": 3733,
|
|
134
|
-
"path": "../public/assets/StreamingChunkSequence-
|
|
134
|
+
"path": "../public/assets/StreamingChunkSequence-yIiscGuE.js"
|
|
135
135
|
},
|
|
136
|
-
"/assets/
|
|
136
|
+
"/assets/ResponseView-Ccy95rWI.js": {
|
|
137
137
|
"type": "text/javascript; charset=utf-8",
|
|
138
|
-
"etag": '"
|
|
139
|
-
"mtime": "2026-07-
|
|
140
|
-
"size":
|
|
141
|
-
"path": "../public/assets/
|
|
138
|
+
"etag": '"47fc-yKb5jKw9a0d9bY9FAp9fSDXbR5U"',
|
|
139
|
+
"mtime": "2026-07-08T01:38:53.685Z",
|
|
140
|
+
"size": 18428,
|
|
141
|
+
"path": "../public/assets/ResponseView-Ccy95rWI.js"
|
|
142
142
|
},
|
|
143
143
|
"/assets/qwen-CONDcHqt.png": {
|
|
144
144
|
"type": "image/png",
|
|
145
145
|
"etag": '"572c3-cdJAPaHdOvFCGzuaQjagdgOu6XE"',
|
|
146
|
-
"mtime": "2026-07-
|
|
146
|
+
"mtime": "2026-07-08T01:38:53.685Z",
|
|
147
147
|
"size": 357059,
|
|
148
148
|
"path": "../public/assets/qwen-CONDcHqt.png"
|
|
149
149
|
},
|
|
150
|
-
"/assets/ProxyViewerContainer-
|
|
150
|
+
"/assets/ProxyViewerContainer-CbNsaoQw.js": {
|
|
151
151
|
"type": "text/javascript; charset=utf-8",
|
|
152
|
-
"etag": '"
|
|
153
|
-
"mtime": "2026-07-
|
|
154
|
-
"size":
|
|
155
|
-
"path": "../public/assets/ProxyViewerContainer-
|
|
152
|
+
"etag": '"b78b9-I8pfWqThohzWE1l5xMxqDA+96Pw"',
|
|
153
|
+
"mtime": "2026-07-08T01:38:53.685Z",
|
|
154
|
+
"size": 751801,
|
|
155
|
+
"path": "../public/assets/ProxyViewerContainer-CbNsaoQw.js"
|
|
156
156
|
}
|
|
157
157
|
};
|
|
158
158
|
function readAsset(id) {
|
package/README.md
CHANGED
|
@@ -357,6 +357,30 @@ Built-in prompt templates help turn captured evidence into user-facing output:
|
|
|
357
357
|
- `inspector_generate_group_report`: produce a provider/model evaluation report for a group.
|
|
358
358
|
- `inspector_extract_repro_steps`: extract concise reproduction steps from a session.
|
|
359
359
|
|
|
360
|
+
## TonyClaw Lab Ecosystem
|
|
361
|
+
|
|
362
|
+
TonyClaw Lab turns Inspector into a local control panel for the TonyClaw npm ecosystem. The UI shows
|
|
363
|
+
installed and latest package status for `@tonyclaw/agent-inspector`,
|
|
364
|
+
`@tonyclaw/agent-inspector-mcp`, and `@tonyclaw/eval-harness`; it can launch install, upgrade,
|
|
365
|
+
help, preset discovery, and safe smoke-test recipes without leaving Inspector.
|
|
366
|
+
|
|
367
|
+
The Lab also exposes copy-ready recipes that connect Inspector evidence, MCP checks, and evaluation
|
|
368
|
+
runners:
|
|
369
|
+
|
|
370
|
+
```bash
|
|
371
|
+
npx @tonyclaw/eval-harness check-inspector-mcp
|
|
372
|
+
npx @tonyclaw/eval-harness inspector-smoke --title "TonyClaw Lab smoke" --latest-log-limit 5
|
|
373
|
+
npx @tonyclaw/eval-harness runner-presets --format json
|
|
374
|
+
npx @tonyclaw/eval-harness run-once --smoke --project-source <project> --work-source <work> --count 1 --parallel 1
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
Use these recipes as stable starting points for CI smoke tests, local provider checks, and
|
|
378
|
+
multi-run evaluation batches. Inspector remains the evidence surface; eval-harness drives repeatable
|
|
379
|
+
workloads; the MCP package bridges coding agents that prefer stdio.
|
|
380
|
+
|
|
381
|
+
Recipes without placeholders can be run directly from TonyClaw Lab. Template recipes remain
|
|
382
|
+
copy-ready so users can fill project and work directories explicitly before running them.
|
|
383
|
+
|
|
360
384
|
## Jenkins And GitCode
|
|
361
385
|
|
|
362
386
|
Team CI, GitCode WebHook setup, Cloudflare Tunnel notes, local push fallback, and the verified PR workflow live in [Jenkins + GitCode WebHook](docs/JENKINS_GITCODE_WEBHOOK_TUNNEL.md). Keep real Jenkins notify tokens, GitCode access tokens, and tunnel URLs out of the repository.
|
package/package.json
CHANGED
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
Copy,
|
|
7
7
|
Download,
|
|
8
8
|
FlaskConical,
|
|
9
|
+
History,
|
|
9
10
|
Loader2,
|
|
10
11
|
Network,
|
|
11
12
|
PackageCheck,
|
|
@@ -18,8 +19,10 @@ import useSWR from "swr";
|
|
|
18
19
|
import {
|
|
19
20
|
EcosystemPackagesResponseSchema,
|
|
20
21
|
EcosystemTaskResponseSchema,
|
|
22
|
+
EcosystemTasksResponseSchema,
|
|
21
23
|
type EcosystemPackage,
|
|
22
24
|
type EcosystemPackageState,
|
|
25
|
+
type EcosystemRecipe,
|
|
23
26
|
type EcosystemRunnerPreset,
|
|
24
27
|
type EcosystemTask,
|
|
25
28
|
type EcosystemTaskAction,
|
|
@@ -101,6 +104,15 @@ async function fetchEcosystemTask(url: string) {
|
|
|
101
104
|
);
|
|
102
105
|
}
|
|
103
106
|
|
|
107
|
+
async function fetchEcosystemTasks(url: string) {
|
|
108
|
+
return fetchJson(
|
|
109
|
+
url,
|
|
110
|
+
EcosystemTasksResponseSchema,
|
|
111
|
+
undefined,
|
|
112
|
+
(response) => `Failed to load ecosystem tasks: ${String(response.status)}`,
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
|
|
104
116
|
async function startEcosystemTask(
|
|
105
117
|
packageId: string,
|
|
106
118
|
action: EcosystemTaskAction,
|
|
@@ -114,6 +126,16 @@ async function startEcosystemTask(
|
|
|
114
126
|
return response.task;
|
|
115
127
|
}
|
|
116
128
|
|
|
129
|
+
async function startEcosystemRecipe(recipeId: string): Promise<EcosystemTask> {
|
|
130
|
+
const response = await fetchJson(
|
|
131
|
+
`/api/ecosystem/recipes/${encodeURIComponent(recipeId)}/run`,
|
|
132
|
+
EcosystemTaskResponseSchema,
|
|
133
|
+
{ method: "POST" },
|
|
134
|
+
(result) => `Failed to start ecosystem recipe: ${String(result.status)}`,
|
|
135
|
+
);
|
|
136
|
+
return response.task;
|
|
137
|
+
}
|
|
138
|
+
|
|
117
139
|
function stateLabel(state: EcosystemPackageState): string {
|
|
118
140
|
switch (state) {
|
|
119
141
|
case "installed":
|
|
@@ -164,6 +186,8 @@ function taskActionLabel(action: EcosystemTaskAction): string {
|
|
|
164
186
|
return "Help";
|
|
165
187
|
case "runner-presets":
|
|
166
188
|
return "Presets";
|
|
189
|
+
case "recipe":
|
|
190
|
+
return "Recipe";
|
|
167
191
|
}
|
|
168
192
|
}
|
|
169
193
|
|
|
@@ -180,6 +204,18 @@ function taskStatusLabel(task: EcosystemTask): string {
|
|
|
180
204
|
}
|
|
181
205
|
}
|
|
182
206
|
|
|
207
|
+
function taskStatusClassName(status: EcosystemTask["status"]): string {
|
|
208
|
+
switch (status) {
|
|
209
|
+
case "queued":
|
|
210
|
+
case "running":
|
|
211
|
+
return "border-cyan-300/20 bg-cyan-300/8 text-cyan-100";
|
|
212
|
+
case "succeeded":
|
|
213
|
+
return "border-emerald-400/20 bg-emerald-400/8 text-emerald-100";
|
|
214
|
+
case "failed":
|
|
215
|
+
return "border-red-400/20 bg-red-400/8 text-red-100";
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
183
219
|
function packagePrimaryAction(pkg: EcosystemPackage): EcosystemTaskAction | null {
|
|
184
220
|
switch (pkg.state) {
|
|
185
221
|
case "available":
|
|
@@ -292,15 +328,7 @@ function TaskConsole({ task }: { task: EcosystemTask | null }): JSX.Element | nu
|
|
|
292
328
|
<div className="break-all font-mono text-[11px] text-white/35">{task.command}</div>
|
|
293
329
|
</div>
|
|
294
330
|
</div>
|
|
295
|
-
<Badge
|
|
296
|
-
variant="outline"
|
|
297
|
-
className={cn(
|
|
298
|
-
"shrink-0",
|
|
299
|
-
task.status === "failed"
|
|
300
|
-
? "border-red-400/20 bg-red-400/8 text-red-100"
|
|
301
|
-
: "border-cyan-300/20 bg-cyan-300/8 text-cyan-100",
|
|
302
|
-
)}
|
|
303
|
-
>
|
|
331
|
+
<Badge variant="outline" className={cn("shrink-0", taskStatusClassName(task.status))}>
|
|
304
332
|
{task.status}
|
|
305
333
|
</Badge>
|
|
306
334
|
</div>
|
|
@@ -372,10 +400,110 @@ function RunnerPresetCard({ preset }: { preset: EcosystemRunnerPreset }): JSX.El
|
|
|
372
400
|
);
|
|
373
401
|
}
|
|
374
402
|
|
|
403
|
+
function RecipeCard({
|
|
404
|
+
recipe,
|
|
405
|
+
copied,
|
|
406
|
+
running,
|
|
407
|
+
onCopy,
|
|
408
|
+
onRun,
|
|
409
|
+
}: {
|
|
410
|
+
recipe: EcosystemRecipe;
|
|
411
|
+
copied: boolean;
|
|
412
|
+
running: boolean;
|
|
413
|
+
onCopy: (recipe: EcosystemRecipe) => void;
|
|
414
|
+
onRun: (recipe: EcosystemRecipe) => void;
|
|
415
|
+
}): JSX.Element {
|
|
416
|
+
return (
|
|
417
|
+
<div className="rounded-lg bg-white/[0.025] p-3 shadow-[inset_0_0_0_1px_rgba(255,255,255,0.055)]">
|
|
418
|
+
<div className="flex flex-wrap items-start justify-between gap-3">
|
|
419
|
+
<div className="min-w-0">
|
|
420
|
+
<div className="flex min-w-0 items-start gap-2">
|
|
421
|
+
<FlaskConical className="size-4 shrink-0 text-cyan-200/75" />
|
|
422
|
+
<div className="text-sm font-semibold leading-snug">{recipe.title}</div>
|
|
423
|
+
</div>
|
|
424
|
+
<div className="mt-1 text-xs leading-5 text-muted-foreground">{recipe.description}</div>
|
|
425
|
+
</div>
|
|
426
|
+
<Badge variant="outline" className="border-white/10 bg-white/[0.04] text-white/55">
|
|
427
|
+
{recipe.runnable ? recipe.stage : "Template"}
|
|
428
|
+
</Badge>
|
|
429
|
+
</div>
|
|
430
|
+
<div className="mt-3 rounded-md bg-black/20 p-2 font-mono text-[11px] leading-5 text-white/50 shadow-[inset_0_0_0_1px_rgba(255,255,255,0.045)]">
|
|
431
|
+
{recipe.command}
|
|
432
|
+
</div>
|
|
433
|
+
<div className="mt-3 flex items-center justify-between gap-2">
|
|
434
|
+
<span className="rounded bg-white/[0.035] px-2 py-1 font-mono text-[11px] text-white/35">
|
|
435
|
+
{recipe.packageId}
|
|
436
|
+
</span>
|
|
437
|
+
<div className="flex items-center gap-2">
|
|
438
|
+
<Button type="button" size="sm" variant="outline" onClick={() => onCopy(recipe)}>
|
|
439
|
+
{copied ? <Check className="size-3.5" /> : <Copy className="size-3.5" />}
|
|
440
|
+
{copied ? "Copied" : "Copy"}
|
|
441
|
+
</Button>
|
|
442
|
+
{recipe.runnable && (
|
|
443
|
+
<Button
|
|
444
|
+
type="button"
|
|
445
|
+
size="sm"
|
|
446
|
+
variant="secondary"
|
|
447
|
+
disabled={running}
|
|
448
|
+
onClick={() => onRun(recipe)}
|
|
449
|
+
>
|
|
450
|
+
{running ? (
|
|
451
|
+
<Loader2 className="size-3.5 animate-spin" />
|
|
452
|
+
) : (
|
|
453
|
+
<Rocket className="size-3.5" />
|
|
454
|
+
)}
|
|
455
|
+
{running ? "Running" : "Run"}
|
|
456
|
+
</Button>
|
|
457
|
+
)}
|
|
458
|
+
</div>
|
|
459
|
+
</div>
|
|
460
|
+
</div>
|
|
461
|
+
);
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
function RecentTaskRow({
|
|
465
|
+
task,
|
|
466
|
+
selected,
|
|
467
|
+
onSelect,
|
|
468
|
+
}: {
|
|
469
|
+
task: EcosystemTask;
|
|
470
|
+
selected: boolean;
|
|
471
|
+
onSelect: (task: EcosystemTask) => void;
|
|
472
|
+
}): JSX.Element {
|
|
473
|
+
const label = task.recipeId ?? taskActionLabel(task.action);
|
|
474
|
+
return (
|
|
475
|
+
<div className="flex items-center justify-between gap-3 rounded-md bg-white/[0.025] px-3 py-2 shadow-[inset_0_0_0_1px_rgba(255,255,255,0.045)]">
|
|
476
|
+
<div className="min-w-0">
|
|
477
|
+
<div className="flex min-w-0 items-center gap-2">
|
|
478
|
+
<History className="size-3.5 shrink-0 text-white/40" />
|
|
479
|
+
<div className="truncate text-xs font-semibold text-white/75">{label}</div>
|
|
480
|
+
<Badge variant="outline" className={cn("shrink-0", taskStatusClassName(task.status))}>
|
|
481
|
+
{task.status}
|
|
482
|
+
</Badge>
|
|
483
|
+
</div>
|
|
484
|
+
<div className="mt-1 flex min-w-0 flex-wrap items-center gap-2 font-mono text-[10px] text-white/35">
|
|
485
|
+
<span>{task.packageId}</span>
|
|
486
|
+
<span>{new Date(task.createdAt).toLocaleTimeString()}</span>
|
|
487
|
+
{task.exitCode !== null && <span>exit {String(task.exitCode)}</span>}
|
|
488
|
+
</div>
|
|
489
|
+
</div>
|
|
490
|
+
<Button
|
|
491
|
+
type="button"
|
|
492
|
+
size="sm"
|
|
493
|
+
variant={selected ? "secondary" : "outline"}
|
|
494
|
+
onClick={() => onSelect(task)}
|
|
495
|
+
>
|
|
496
|
+
{selected ? "Open" : "View"}
|
|
497
|
+
</Button>
|
|
498
|
+
</div>
|
|
499
|
+
);
|
|
500
|
+
}
|
|
501
|
+
|
|
375
502
|
export function AgentLabDialog({ currentSessionId, logCount }: AgentLabDialogProps): JSX.Element {
|
|
376
503
|
const [open, setOpen] = useState(false);
|
|
377
504
|
const [copied, setCopied] = useState(false);
|
|
378
505
|
const [copiedPresets, setCopiedPresets] = useState(false);
|
|
506
|
+
const [copiedRecipeId, setCopiedRecipeId] = useState<string | null>(null);
|
|
379
507
|
const [activeTaskId, setActiveTaskId] = useState<string | null>(null);
|
|
380
508
|
const [taskError, setTaskError] = useState<string | null>(null);
|
|
381
509
|
const response = useSWR("/api/ecosystem/packages", fetchEcosystemPackages, {
|
|
@@ -395,8 +523,14 @@ export function AgentLabDialog({ currentSessionId, logCount }: AgentLabDialogPro
|
|
|
395
523
|
revalidateOnFocus: false,
|
|
396
524
|
},
|
|
397
525
|
);
|
|
526
|
+
const tasksResponse = useSWR(open ? "/api/ecosystem/tasks" : null, fetchEcosystemTasks, {
|
|
527
|
+
refreshInterval: 2500,
|
|
528
|
+
revalidateOnFocus: false,
|
|
529
|
+
});
|
|
398
530
|
const packages = response.data?.packages ?? [];
|
|
399
531
|
const runnerPresets = response.data?.runnerPresets ?? [];
|
|
532
|
+
const recipes = response.data?.recipes ?? [];
|
|
533
|
+
const recentTasks = (tasksResponse.data?.tasks ?? []).slice(0, 6);
|
|
400
534
|
const installedCount = useMemo(
|
|
401
535
|
() =>
|
|
402
536
|
packages.filter((pkg) => pkg.state === "installed" || pkg.state === "update-available")
|
|
@@ -418,14 +552,33 @@ export function AgentLabDialog({ currentSessionId, logCount }: AgentLabDialogPro
|
|
|
418
552
|
window.setTimeout(() => setCopiedPresets(false), 1200);
|
|
419
553
|
});
|
|
420
554
|
};
|
|
555
|
+
const copyRecipeCommand = (recipe: EcosystemRecipe): void => {
|
|
556
|
+
void copyTextToClipboard(recipe.command).then(() => {
|
|
557
|
+
setCopiedRecipeId(recipe.id);
|
|
558
|
+
window.setTimeout(() => setCopiedRecipeId(null), 1200);
|
|
559
|
+
});
|
|
560
|
+
};
|
|
561
|
+
const runRecipe = (recipe: EcosystemRecipe): void => {
|
|
562
|
+
setTaskError(null);
|
|
563
|
+
void startEcosystemRecipe(recipe.id)
|
|
564
|
+
.then((task) => {
|
|
565
|
+
setActiveTaskId(task.id);
|
|
566
|
+
void activeTaskResponse.mutate({ task }, { revalidate: true });
|
|
567
|
+
void tasksResponse.mutate();
|
|
568
|
+
})
|
|
569
|
+
.catch((error: unknown) => {
|
|
570
|
+
setTaskError(error instanceof Error ? error.message : "Failed to start ecosystem recipe");
|
|
571
|
+
});
|
|
572
|
+
};
|
|
421
573
|
|
|
422
574
|
const activeTask = activeTaskResponse.data?.task ?? null;
|
|
423
575
|
|
|
424
576
|
useEffect(() => {
|
|
425
577
|
if (activeTask === null) return;
|
|
578
|
+
void tasksResponse.mutate();
|
|
426
579
|
if (activeTask.status !== "succeeded") return;
|
|
427
580
|
void response.mutate();
|
|
428
|
-
}, [activeTask, response]);
|
|
581
|
+
}, [activeTask, response, tasksResponse]);
|
|
429
582
|
|
|
430
583
|
const handleStartTask = (packageId: string, action: EcosystemTaskAction): void => {
|
|
431
584
|
setTaskError(null);
|
|
@@ -433,6 +586,7 @@ export function AgentLabDialog({ currentSessionId, logCount }: AgentLabDialogPro
|
|
|
433
586
|
.then((task) => {
|
|
434
587
|
setActiveTaskId(task.id);
|
|
435
588
|
void activeTaskResponse.mutate({ task }, { revalidate: true });
|
|
589
|
+
void tasksResponse.mutate();
|
|
436
590
|
})
|
|
437
591
|
.catch((error: unknown) => {
|
|
438
592
|
setTaskError(error instanceof Error ? error.message : "Failed to start ecosystem task");
|
|
@@ -514,6 +668,40 @@ export function AgentLabDialog({ currentSessionId, logCount }: AgentLabDialogPro
|
|
|
514
668
|
</section>
|
|
515
669
|
</div>
|
|
516
670
|
|
|
671
|
+
<section className="mt-3">
|
|
672
|
+
<div className="mb-2 flex items-center justify-between gap-3">
|
|
673
|
+
<div className="text-sm font-semibold">Lab recipes</div>
|
|
674
|
+
<div className="hidden items-center gap-1 font-mono text-[11px] text-muted-foreground sm:flex">
|
|
675
|
+
<Sparkles className="size-3.5" />
|
|
676
|
+
copy-ready workflows
|
|
677
|
+
</div>
|
|
678
|
+
</div>
|
|
679
|
+
<div className="grid gap-3 md:grid-cols-2">
|
|
680
|
+
{recipes.map((recipe) => (
|
|
681
|
+
<RecipeCard
|
|
682
|
+
key={recipe.id}
|
|
683
|
+
recipe={recipe}
|
|
684
|
+
copied={copiedRecipeId === recipe.id}
|
|
685
|
+
running={
|
|
686
|
+
activeTask !== null &&
|
|
687
|
+
activeTask.recipeId === recipe.id &&
|
|
688
|
+
(activeTask.status === "queued" || activeTask.status === "running")
|
|
689
|
+
}
|
|
690
|
+
onCopy={copyRecipeCommand}
|
|
691
|
+
onRun={runRecipe}
|
|
692
|
+
/>
|
|
693
|
+
))}
|
|
694
|
+
{response.isLoading &&
|
|
695
|
+
recipes.length === 0 &&
|
|
696
|
+
[0, 1].map((index) => (
|
|
697
|
+
<div
|
|
698
|
+
key={index}
|
|
699
|
+
className="h-40 animate-pulse rounded-lg bg-white/[0.025] shadow-[inset_0_0_0_1px_rgba(255,255,255,0.055)]"
|
|
700
|
+
/>
|
|
701
|
+
))}
|
|
702
|
+
</div>
|
|
703
|
+
</section>
|
|
704
|
+
|
|
517
705
|
<section className="mt-3">
|
|
518
706
|
<div className="mb-2 flex items-center justify-between gap-3">
|
|
519
707
|
<div className="text-sm font-semibold">Runner presets</div>
|
|
@@ -574,6 +762,29 @@ export function AgentLabDialog({ currentSessionId, logCount }: AgentLabDialogPro
|
|
|
574
762
|
{taskError}
|
|
575
763
|
</div>
|
|
576
764
|
)}
|
|
765
|
+
{recentTasks.length > 0 && (
|
|
766
|
+
<section className="mt-3">
|
|
767
|
+
<div className="mb-2 flex items-center justify-between gap-3">
|
|
768
|
+
<div className="text-sm font-semibold">Recent Lab runs</div>
|
|
769
|
+
<div className="hidden font-mono text-[11px] text-muted-foreground sm:block">
|
|
770
|
+
last {String(recentTasks.length)}
|
|
771
|
+
</div>
|
|
772
|
+
</div>
|
|
773
|
+
<div className="grid gap-2 md:grid-cols-2">
|
|
774
|
+
{recentTasks.map((task) => (
|
|
775
|
+
<RecentTaskRow
|
|
776
|
+
key={task.id}
|
|
777
|
+
task={task}
|
|
778
|
+
selected={activeTaskId === task.id}
|
|
779
|
+
onSelect={(selectedTask) => {
|
|
780
|
+
setActiveTaskId(selectedTask.id);
|
|
781
|
+
void activeTaskResponse.mutate({ task: selectedTask }, { revalidate: true });
|
|
782
|
+
}}
|
|
783
|
+
/>
|
|
784
|
+
))}
|
|
785
|
+
</div>
|
|
786
|
+
</section>
|
|
787
|
+
)}
|
|
577
788
|
<TaskConsole task={activeTask} />
|
|
578
789
|
</div>
|
|
579
790
|
</DialogContent>
|
|
@@ -35,13 +35,31 @@ export const EcosystemRunnerPresetSchema = z.object({
|
|
|
35
35
|
agentsDir: z.string(),
|
|
36
36
|
});
|
|
37
37
|
|
|
38
|
+
export const EcosystemRecipeSchema = z.object({
|
|
39
|
+
id: z.string(),
|
|
40
|
+
title: z.string(),
|
|
41
|
+
stage: z.string(),
|
|
42
|
+
packageId: z.string(),
|
|
43
|
+
description: z.string(),
|
|
44
|
+
command: z.string(),
|
|
45
|
+
requiresSession: z.boolean(),
|
|
46
|
+
runnable: z.boolean(),
|
|
47
|
+
});
|
|
48
|
+
|
|
38
49
|
export const EcosystemPackagesResponseSchema = z.object({
|
|
39
50
|
checkedAt: z.string(),
|
|
40
51
|
packages: z.array(EcosystemPackageSchema),
|
|
41
52
|
runnerPresets: z.array(EcosystemRunnerPresetSchema),
|
|
53
|
+
recipes: z.array(EcosystemRecipeSchema),
|
|
42
54
|
});
|
|
43
55
|
|
|
44
|
-
export const EcosystemTaskActionSchema = z.enum([
|
|
56
|
+
export const EcosystemTaskActionSchema = z.enum([
|
|
57
|
+
"install",
|
|
58
|
+
"upgrade",
|
|
59
|
+
"help",
|
|
60
|
+
"runner-presets",
|
|
61
|
+
"recipe",
|
|
62
|
+
]);
|
|
45
63
|
|
|
46
64
|
export const EcosystemTaskStatusSchema = z.enum(["queued", "running", "succeeded", "failed"]);
|
|
47
65
|
|
|
@@ -49,6 +67,7 @@ export const EcosystemTaskSchema = z.object({
|
|
|
49
67
|
id: z.string(),
|
|
50
68
|
packageId: z.string(),
|
|
51
69
|
npmName: z.string(),
|
|
70
|
+
recipeId: z.string().nullable().default(null),
|
|
52
71
|
action: EcosystemTaskActionSchema,
|
|
53
72
|
status: EcosystemTaskStatusSchema,
|
|
54
73
|
command: z.string(),
|
|
@@ -71,6 +90,7 @@ export const EcosystemTasksResponseSchema = z.object({
|
|
|
71
90
|
export type EcosystemPackageState = z.infer<typeof EcosystemPackageStateSchema>;
|
|
72
91
|
export type EcosystemPackage = z.infer<typeof EcosystemPackageSchema>;
|
|
73
92
|
export type EcosystemRunnerPreset = z.infer<typeof EcosystemRunnerPresetSchema>;
|
|
93
|
+
export type EcosystemRecipe = z.infer<typeof EcosystemRecipeSchema>;
|
|
74
94
|
export type EcosystemPackagesResponse = z.infer<typeof EcosystemPackagesResponseSchema>;
|
|
75
95
|
export type EcosystemTaskAction = z.infer<typeof EcosystemTaskActionSchema>;
|
|
76
96
|
export type EcosystemTaskStatus = z.infer<typeof EcosystemTaskStatusSchema>;
|