@openscout/protocol 0.2.63 → 0.2.82
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/LICENSE +202 -0
- package/README.md +103 -52
- package/dist/a2a.d.ts +224 -0
- package/dist/a2a.d.ts.map +1 -0
- package/dist/a2a.js +225 -0
- package/dist/activity.d.ts +70 -0
- package/dist/activity.d.ts.map +1 -0
- package/dist/activity.js +1 -0
- package/dist/actors.d.ts +7 -3
- package/dist/actors.d.ts.map +1 -0
- package/dist/actors.js +15 -1
- package/dist/agent-broker-feed.d.ts +84 -0
- package/dist/agent-broker-feed.d.ts.map +1 -0
- package/dist/agent-broker-feed.js +1 -0
- package/dist/agent-identity.d.ts +23 -0
- package/dist/agent-identity.d.ts.map +1 -0
- package/dist/agent-identity.js +122 -8
- package/dist/agent-runs.d.ts +191 -0
- package/dist/agent-runs.d.ts.map +1 -0
- package/dist/agent-runs.js +365 -0
- package/dist/assigned-roles.d.ts +205 -0
- package/dist/assigned-roles.d.ts.map +1 -0
- package/dist/assigned-roles.js +228 -0
- package/dist/broker-routes.d.ts +40 -0
- package/dist/broker-routes.d.ts.map +1 -0
- package/dist/broker-routes.js +56 -0
- package/dist/budget.d.ts +65 -0
- package/dist/budget.d.ts.map +1 -0
- package/dist/budget.js +19 -0
- package/dist/capability-matrix.d.ts +230 -0
- package/dist/capability-matrix.d.ts.map +1 -0
- package/dist/capability-matrix.js +304 -0
- package/dist/channel-identity.d.ts +40 -0
- package/dist/channel-identity.d.ts.map +1 -0
- package/dist/channel-identity.js +108 -0
- package/dist/collaboration.d.ts +45 -16
- package/dist/collaboration.d.ts.map +1 -0
- package/dist/collaboration.js +39 -23
- package/dist/common.d.ts +4 -3
- package/dist/common.d.ts.map +1 -0
- package/dist/conversations.d.ts +1 -0
- package/dist/conversations.d.ts.map +1 -0
- package/dist/cursor-transport.d.ts +22 -0
- package/dist/cursor-transport.d.ts.map +1 -0
- package/dist/cursor-transport.js +10 -0
- package/dist/debug-attach.d.ts +29 -0
- package/dist/debug-attach.d.ts.map +1 -0
- package/dist/debug-attach.js +6 -0
- package/dist/deliveries.d.ts +16 -2
- package/dist/deliveries.d.ts.map +1 -0
- package/dist/durable-actions.d.ts +94 -0
- package/dist/durable-actions.d.ts.map +1 -0
- package/dist/durable-actions.js +1 -0
- package/dist/events.d.ts +27 -1
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +14 -1
- package/dist/harness-feature-support.d.ts +76 -0
- package/dist/harness-feature-support.d.ts.map +1 -0
- package/dist/harness-feature-support.js +29 -0
- package/dist/host-integrations.d.ts +22 -0
- package/dist/host-integrations.d.ts.map +1 -0
- package/dist/host-integrations.js +64 -0
- package/dist/inbox.d.ts +50 -0
- package/dist/inbox.d.ts.map +1 -0
- package/dist/inbox.js +9 -0
- package/dist/index.d.ts +36 -2
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -2
- package/dist/invocations.d.ts +121 -0
- package/dist/invocations.d.ts.map +1 -0
- package/dist/invocations.js +201 -1
- package/dist/mesh.d.ts +98 -0
- package/dist/mesh.d.ts.map +1 -0
- package/dist/mesh.js +18 -1
- package/dist/messages.d.ts +3 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/native-interactions.d.ts +30 -0
- package/dist/native-interactions.d.ts.map +1 -0
- package/dist/native-interactions.js +51 -0
- package/dist/observed-status.d.ts +33 -0
- package/dist/observed-status.d.ts.map +1 -0
- package/dist/observed-status.js +6 -0
- package/dist/orchestrator-prompt.d.ts +10 -0
- package/dist/orchestrator-prompt.d.ts.map +1 -0
- package/dist/orchestrator-prompt.js +36 -0
- package/dist/permission-policy.d.ts +5 -0
- package/dist/permission-policy.d.ts.map +1 -0
- package/dist/permission-policy.js +15 -0
- package/dist/provisional-agent-names.d.ts +30 -0
- package/dist/provisional-agent-names.d.ts.map +1 -0
- package/dist/provisional-agent-names.js +224 -0
- package/dist/read-receipts.d.ts +12 -0
- package/dist/read-receipts.d.ts.map +1 -0
- package/dist/read-receipts.js +1 -0
- package/dist/relay-agent-card.d.ts +10 -0
- package/dist/relay-agent-card.d.ts.map +1 -0
- package/dist/rendezvous.d.ts +97 -0
- package/dist/rendezvous.d.ts.map +1 -0
- package/dist/rendezvous.js +35 -0
- package/dist/reserved-vocabulary.d.ts +21 -0
- package/dist/reserved-vocabulary.d.ts.map +1 -0
- package/dist/reserved-vocabulary.js +101 -0
- package/dist/route-aliases.d.ts +112 -0
- package/dist/route-aliases.d.ts.map +1 -0
- package/dist/route-aliases.js +1 -0
- package/dist/runtime-catalog-contract.d.ts +39 -0
- package/dist/runtime-catalog-contract.d.ts.map +1 -0
- package/dist/runtime-catalog-contract.js +17 -0
- package/dist/runtime-catalog.d.ts +11 -0
- package/dist/runtime-catalog.d.ts.map +1 -0
- package/dist/runtime-catalog.generated.d.ts +230 -0
- package/dist/runtime-catalog.generated.d.ts.map +1 -0
- package/dist/runtime-catalog.generated.js +299 -0
- package/dist/runtime-catalog.js +192 -0
- package/dist/runtime-execution.d.ts +161 -0
- package/dist/runtime-execution.d.ts.map +1 -0
- package/dist/runtime-execution.js +327 -0
- package/dist/runtime-profiles.d.ts +12 -0
- package/dist/runtime-profiles.d.ts.map +1 -0
- package/dist/runtime-profiles.js +20 -0
- package/dist/scout-agent-card.d.ts +10 -0
- package/dist/scout-agent-card.d.ts.map +1 -0
- package/dist/scout-composer.d.ts +27 -0
- package/dist/scout-composer.d.ts.map +1 -0
- package/dist/scout-composer.js +192 -0
- package/dist/scout-delivery.d.ts +101 -4
- package/dist/scout-delivery.d.ts.map +1 -0
- package/dist/scout-dispatch.d.ts +44 -3
- package/dist/scout-dispatch.d.ts.map +1 -0
- package/dist/scout-reply-context.d.ts +14 -0
- package/dist/scout-reply-context.d.ts.map +1 -0
- package/dist/scout-reply-context.js +1 -0
- package/dist/session-display-state.d.ts +132 -0
- package/dist/session-display-state.d.ts.map +1 -0
- package/dist/session-display-state.js +94 -0
- package/dist/terminal-host-topology.d.ts +119 -0
- package/dist/terminal-host-topology.d.ts.map +1 -0
- package/dist/terminal-host-topology.js +21 -0
- package/dist/terminal-sessions.d.ts +142 -0
- package/dist/terminal-sessions.d.ts.map +1 -0
- package/dist/terminal-sessions.js +81 -0
- package/dist/terminal-surface-id.d.ts +73 -0
- package/dist/terminal-surface-id.d.ts.map +1 -0
- package/dist/terminal-surface-id.js +162 -0
- package/dist/terminal-workspaces.d.ts +199 -0
- package/dist/terminal-workspaces.d.ts.map +1 -0
- package/dist/terminal-workspaces.js +287 -0
- package/dist/thread-events.d.ts +1 -0
- package/dist/thread-events.d.ts.map +1 -0
- package/dist/time.d.ts +16 -0
- package/dist/time.d.ts.map +1 -0
- package/dist/time.js +33 -0
- package/dist/transports.d.ts +1 -0
- package/dist/transports.d.ts.map +1 -0
- package/package.json +37 -9
- package/src/a2a.ts +471 -0
- package/src/activity.ts +113 -0
- package/src/actors.ts +42 -8
- package/src/agent-broker-feed.ts +102 -0
- package/src/agent-identity.ts +143 -8
- package/src/agent-runs.ts +675 -0
- package/src/assigned-roles.ts +437 -0
- package/src/broker-routes.ts +62 -0
- package/src/budget.ts +88 -0
- package/src/capability-matrix.ts +648 -0
- package/src/channel-identity.ts +147 -0
- package/src/collaboration.ts +78 -48
- package/src/common.ts +24 -5
- package/src/cursor-transport.ts +34 -0
- package/src/debug-attach.ts +38 -0
- package/src/deliveries.ts +16 -1
- package/src/durable-actions.ts +125 -0
- package/src/events.ts +31 -0
- package/src/harness-feature-support.ts +116 -0
- package/src/host-integrations.ts +104 -0
- package/src/inbox.ts +68 -0
- package/src/index.ts +35 -2
- package/src/invocations.ts +353 -0
- package/src/mesh.ts +130 -0
- package/src/messages.ts +2 -0
- package/src/native-interactions.ts +100 -0
- package/src/observed-status.ts +90 -0
- package/src/orchestrator-prompt.ts +47 -0
- package/src/permission-policy.ts +21 -0
- package/src/provisional-agent-names.ts +272 -0
- package/src/read-receipts.ts +12 -0
- package/src/relay-agent-card.ts +73 -63
- package/src/rendezvous.ts +154 -0
- package/src/reserved-vocabulary.ts +135 -0
- package/src/route-aliases.ts +130 -0
- package/src/runtime-catalog-contract.ts +60 -0
- package/src/runtime-catalog.generated.ts +300 -0
- package/src/runtime-catalog.md +21 -0
- package/src/runtime-catalog.ts +193 -0
- package/src/runtime-catalog.v1.json +81 -0
- package/src/runtime-execution.ts +545 -0
- package/src/runtime-profiles.ts +37 -0
- package/src/scout-agent-card.ts +10 -0
- package/src/scout-composer.ts +249 -0
- package/src/scout-delivery.ts +117 -4
- package/src/scout-dispatch.ts +34 -2
- package/src/scout-reply-context.ts +15 -0
- package/src/session-display-state.ts +202 -0
- package/src/terminal-host-topology.ts +132 -0
- package/src/terminal-sessions.ts +187 -0
- package/src/terminal-surface-id.ts +189 -0
- package/src/terminal-workspaces.ts +455 -0
- package/src/time.ts +49 -0
- package/dist/agent-address.d.ts +0 -1
- package/dist/agent-address.js +0 -1
- package/dist/agent-selectors.d.ts +0 -1
- package/dist/agent-selectors.js +0 -1
- package/src/agent-address.ts +0 -1
- package/src/agent-identity.test.ts +0 -435
- package/src/agent-selectors.ts +0 -1
- package/src/scout-agent-card.test.ts +0 -54
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
// Generated automatically from runtime-catalog.v1.json. Do not edit.
|
|
2
|
+
|
|
3
|
+
export const SCOUT_RUNTIME_CATALOG_DATA = {
|
|
4
|
+
"schemaVersion": "openscout.runtime-catalog.v1",
|
|
5
|
+
"revision": "2026-08-18.1",
|
|
6
|
+
"harnesses": [
|
|
7
|
+
{
|
|
8
|
+
"id": "claude",
|
|
9
|
+
"label": "Claude Code",
|
|
10
|
+
"enabled": true,
|
|
11
|
+
"default": true,
|
|
12
|
+
"reasoningEfforts": [
|
|
13
|
+
"low",
|
|
14
|
+
"medium",
|
|
15
|
+
"high",
|
|
16
|
+
"xhigh",
|
|
17
|
+
"max"
|
|
18
|
+
],
|
|
19
|
+
"defaultReasoningEffort": "medium",
|
|
20
|
+
"models": [
|
|
21
|
+
{
|
|
22
|
+
"id": "claude-opus-5",
|
|
23
|
+
"label": "Opus 5",
|
|
24
|
+
"enabled": true,
|
|
25
|
+
"default": true,
|
|
26
|
+
"family": "Opus",
|
|
27
|
+
"version": "5"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "claude-sonnet-4-6",
|
|
31
|
+
"label": "Sonnet 4.6",
|
|
32
|
+
"enabled": true,
|
|
33
|
+
"family": "Sonnet",
|
|
34
|
+
"version": "4.6"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"id": "claude-haiku-4-5",
|
|
38
|
+
"label": "Haiku 4.5",
|
|
39
|
+
"enabled": true,
|
|
40
|
+
"family": "Haiku",
|
|
41
|
+
"version": "4.5"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": "claude-opus-4-8",
|
|
45
|
+
"label": "Opus 4.8",
|
|
46
|
+
"enabled": true,
|
|
47
|
+
"family": "Opus",
|
|
48
|
+
"version": "4.8"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "claude-opus-4-7",
|
|
52
|
+
"label": "Opus 4.7",
|
|
53
|
+
"enabled": true,
|
|
54
|
+
"family": "Opus",
|
|
55
|
+
"version": "4.7"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"id": "claude-sonnet-4-5",
|
|
59
|
+
"label": "Sonnet 4.5",
|
|
60
|
+
"enabled": true,
|
|
61
|
+
"family": "Sonnet",
|
|
62
|
+
"version": "4.5"
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"id": "codex",
|
|
68
|
+
"label": "Codex",
|
|
69
|
+
"enabled": true,
|
|
70
|
+
"reasoningEfforts": [
|
|
71
|
+
"low",
|
|
72
|
+
"medium",
|
|
73
|
+
"high",
|
|
74
|
+
"xhigh"
|
|
75
|
+
],
|
|
76
|
+
"defaultReasoningEffort": "medium",
|
|
77
|
+
"models": [
|
|
78
|
+
{
|
|
79
|
+
"id": "gpt-5.6-sol",
|
|
80
|
+
"label": "5.6 Sol",
|
|
81
|
+
"enabled": true,
|
|
82
|
+
"default": true,
|
|
83
|
+
"family": "GPT",
|
|
84
|
+
"version": "5.6 Sol",
|
|
85
|
+
"reasoningEfforts": [
|
|
86
|
+
"low",
|
|
87
|
+
"medium",
|
|
88
|
+
"high",
|
|
89
|
+
"xhigh",
|
|
90
|
+
"ultra"
|
|
91
|
+
]
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"id": "gpt-5.6-terra",
|
|
95
|
+
"label": "5.6 Terra",
|
|
96
|
+
"enabled": true,
|
|
97
|
+
"family": "GPT",
|
|
98
|
+
"version": "5.6 Terra",
|
|
99
|
+
"reasoningEfforts": [
|
|
100
|
+
"low",
|
|
101
|
+
"medium",
|
|
102
|
+
"high",
|
|
103
|
+
"xhigh",
|
|
104
|
+
"ultra"
|
|
105
|
+
]
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"id": "gpt-5.6-luna",
|
|
109
|
+
"label": "5.6 Luna",
|
|
110
|
+
"enabled": true,
|
|
111
|
+
"family": "GPT",
|
|
112
|
+
"version": "5.6 Luna"
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"id": "gpt-5.5",
|
|
116
|
+
"label": "5.5",
|
|
117
|
+
"enabled": true,
|
|
118
|
+
"family": "GPT",
|
|
119
|
+
"version": "5.5"
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"id": "gpt-5.5-mini",
|
|
123
|
+
"label": "5.5 mini",
|
|
124
|
+
"enabled": true,
|
|
125
|
+
"family": "GPT",
|
|
126
|
+
"version": "5.5 mini"
|
|
127
|
+
}
|
|
128
|
+
]
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"id": "grok",
|
|
132
|
+
"label": "Grok CLI",
|
|
133
|
+
"enabled": true,
|
|
134
|
+
"listed": false,
|
|
135
|
+
"reasoningEfforts": [
|
|
136
|
+
"low",
|
|
137
|
+
"medium",
|
|
138
|
+
"high",
|
|
139
|
+
"xhigh"
|
|
140
|
+
],
|
|
141
|
+
"defaultReasoningEffort": "medium",
|
|
142
|
+
"models": [
|
|
143
|
+
{
|
|
144
|
+
"id": "grok-4.6",
|
|
145
|
+
"label": "Grok 4.6",
|
|
146
|
+
"enabled": true,
|
|
147
|
+
"default": true,
|
|
148
|
+
"family": "Grok",
|
|
149
|
+
"version": "4.6",
|
|
150
|
+
"contextWindowTokens": 500000
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"id": "grok-4.5",
|
|
154
|
+
"label": "Grok 4.5",
|
|
155
|
+
"enabled": true,
|
|
156
|
+
"family": "Grok",
|
|
157
|
+
"version": "4.5"
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"id": "grok-4.3",
|
|
161
|
+
"label": "Grok 4.3",
|
|
162
|
+
"enabled": true,
|
|
163
|
+
"family": "Grok",
|
|
164
|
+
"version": "4.3"
|
|
165
|
+
}
|
|
166
|
+
]
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"id": "grok-acp",
|
|
170
|
+
"label": "Grok",
|
|
171
|
+
"enabled": true,
|
|
172
|
+
"reasoningEfforts": null,
|
|
173
|
+
"models": [
|
|
174
|
+
{
|
|
175
|
+
"id": "grok-4.6",
|
|
176
|
+
"label": "Grok 4.6",
|
|
177
|
+
"enabled": true,
|
|
178
|
+
"default": true,
|
|
179
|
+
"family": "Grok",
|
|
180
|
+
"version": "4.6",
|
|
181
|
+
"contextWindowTokens": 500000
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"id": "grok-4.5",
|
|
185
|
+
"label": "Grok 4.5",
|
|
186
|
+
"enabled": true,
|
|
187
|
+
"family": "Grok",
|
|
188
|
+
"version": "4.5"
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"id": "grok-4.3",
|
|
192
|
+
"label": "Grok 4.3",
|
|
193
|
+
"enabled": true,
|
|
194
|
+
"family": "Grok",
|
|
195
|
+
"version": "4.3"
|
|
196
|
+
}
|
|
197
|
+
]
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"id": "kimi",
|
|
201
|
+
"label": "Kimi Code",
|
|
202
|
+
"enabled": true,
|
|
203
|
+
"reasoningEfforts": null,
|
|
204
|
+
"models": []
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"id": "flue",
|
|
208
|
+
"label": "Flue",
|
|
209
|
+
"enabled": true,
|
|
210
|
+
"reasoningEfforts": null,
|
|
211
|
+
"models": []
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"id": "cursor",
|
|
215
|
+
"label": "Cursor CLI",
|
|
216
|
+
"enabled": true,
|
|
217
|
+
"reasoningEfforts": null,
|
|
218
|
+
"models": []
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"id": "opencode",
|
|
222
|
+
"label": "OpenCode",
|
|
223
|
+
"enabled": true,
|
|
224
|
+
"reasoningEfforts": null,
|
|
225
|
+
"models": [
|
|
226
|
+
{
|
|
227
|
+
"id": "opencode-go/glm-5.2",
|
|
228
|
+
"label": "GLM-5.2",
|
|
229
|
+
"enabled": true,
|
|
230
|
+
"default": true,
|
|
231
|
+
"family": "GLM",
|
|
232
|
+
"version": "5.2"
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
"id": "opencode-go/glm-5.1",
|
|
236
|
+
"label": "GLM-5.1",
|
|
237
|
+
"enabled": true,
|
|
238
|
+
"family": "GLM",
|
|
239
|
+
"version": "5.1"
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
"id": "opencode-go/kimi-k3",
|
|
243
|
+
"label": "Kimi K3",
|
|
244
|
+
"enabled": true,
|
|
245
|
+
"family": "Kimi",
|
|
246
|
+
"version": "K3"
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
"id": "opencode-go/qwen3.8-max",
|
|
250
|
+
"label": "Qwen3.8 Max",
|
|
251
|
+
"enabled": true,
|
|
252
|
+
"family": "Qwen",
|
|
253
|
+
"version": "3.8 Max"
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
"id": "opencode-go/minimax-m3",
|
|
257
|
+
"label": "MiniMax M3",
|
|
258
|
+
"enabled": true,
|
|
259
|
+
"family": "MiniMax",
|
|
260
|
+
"version": "M3"
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
"id": "opencode-go/deepseek-v4-pro",
|
|
264
|
+
"label": "DeepSeek V4 Pro",
|
|
265
|
+
"enabled": true,
|
|
266
|
+
"family": "DeepSeek",
|
|
267
|
+
"version": "V4 Pro"
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
"id": "opencode-go/grok-4.5",
|
|
271
|
+
"label": "Grok 4.5",
|
|
272
|
+
"enabled": true,
|
|
273
|
+
"family": "Grok",
|
|
274
|
+
"version": "4.5"
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
"id": "opencode/nemotron-3-ultra-free",
|
|
278
|
+
"label": "Nemotron 3 Ultra (free)",
|
|
279
|
+
"enabled": true,
|
|
280
|
+
"family": "Nemotron",
|
|
281
|
+
"version": "3 Ultra Free"
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
"id": "opencode/laguna-s-2.1-free",
|
|
285
|
+
"label": "Laguna S 2.1 (free)",
|
|
286
|
+
"enabled": true,
|
|
287
|
+
"family": "Laguna",
|
|
288
|
+
"version": "S 2.1 Free"
|
|
289
|
+
}
|
|
290
|
+
]
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
"id": "pi",
|
|
294
|
+
"label": "Pi",
|
|
295
|
+
"enabled": true,
|
|
296
|
+
"reasoningEfforts": null,
|
|
297
|
+
"models": []
|
|
298
|
+
}
|
|
299
|
+
]
|
|
300
|
+
} as const;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Runtime model catalog
|
|
2
|
+
|
|
3
|
+
The operator contract is intentionally one step:
|
|
4
|
+
|
|
5
|
+
1. Edit `packages/protocol/src/runtime-catalog.v1.json`.
|
|
6
|
+
|
|
7
|
+
That is all. The deployed well-known route publishes the same JSON and every
|
|
8
|
+
running `scoutd` checks it once a minute. Valid revisions replace the bundled
|
|
9
|
+
or persisted last-known-good catalog; malformed or unreachable revisions are
|
|
10
|
+
quarantined with a warning. No generator, daemon restart, app rebuild, or
|
|
11
|
+
cache-bust command is part of a model update.
|
|
12
|
+
|
|
13
|
+
To intentionally restore older model contents, publish them under a new,
|
|
14
|
+
higher revision. Scout rejects revision downgrades and same-revision content
|
|
15
|
+
changes so retries cannot roll back or silently replace a catalog.
|
|
16
|
+
|
|
17
|
+
Increment the `YYYY-MM-DD.N` `revision` and add the provider's exact model ID,
|
|
18
|
+
label, harness, default, effort metadata, and `contextWindowTokens` when the
|
|
19
|
+
provider publishes it. Do not infer an aggregator-qualified ID from a
|
|
20
|
+
vendor announcement: xAI's `grok-4.6` proves the Grok IDs, but not an
|
|
21
|
+
`opencode-go/grok-4.6` ID.
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SCOUT_LAUNCHABLE_HARNESSES,
|
|
3
|
+
SCOUT_REASONING_EFFORTS,
|
|
4
|
+
type ScoutLaunchableHarness,
|
|
5
|
+
type ScoutOwnedRuntimeCatalog,
|
|
6
|
+
type ScoutOwnedRuntimeHarness,
|
|
7
|
+
type ScoutOwnedRuntimeModel,
|
|
8
|
+
type ScoutReasoningEffort,
|
|
9
|
+
} from "./runtime-catalog-contract.js";
|
|
10
|
+
|
|
11
|
+
export type ScoutRuntimeCatalogParseResult =
|
|
12
|
+
| { ok: true; catalog: ScoutOwnedRuntimeCatalog }
|
|
13
|
+
| { ok: false; errors: string[] };
|
|
14
|
+
|
|
15
|
+
const launchableHarnesses = new Set<string>(SCOUT_LAUNCHABLE_HARNESSES);
|
|
16
|
+
const reasoningEfforts = new Set<string>(SCOUT_REASONING_EFFORTS);
|
|
17
|
+
export const MAX_RUNTIME_MODELS_PER_HARNESS = 256;
|
|
18
|
+
|
|
19
|
+
function record(value: unknown): Record<string, unknown> | null {
|
|
20
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
21
|
+
? value as Record<string, unknown>
|
|
22
|
+
: null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function text(value: unknown): string | null {
|
|
26
|
+
return typeof value === "string" && value.trim() === value && value.length > 0
|
|
27
|
+
? value
|
|
28
|
+
: null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function effortList(value: unknown, path: string, errors: string[]): ScoutReasoningEffort[] | null | undefined {
|
|
32
|
+
if (value === null) return null;
|
|
33
|
+
if (!Array.isArray(value)) {
|
|
34
|
+
errors.push(`${path} must be an array or null`);
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
const result: ScoutReasoningEffort[] = [];
|
|
38
|
+
const seen = new Set<string>();
|
|
39
|
+
for (const candidate of value) {
|
|
40
|
+
if (typeof candidate !== "string" || !reasoningEfforts.has(candidate)) {
|
|
41
|
+
errors.push(`${path} contains unknown effort ${String(candidate)}`);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (seen.add(candidate)) result.push(candidate as ScoutReasoningEffort);
|
|
45
|
+
else errors.push(`${path} contains duplicate effort ${candidate}`);
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function model(value: unknown, path: string, errors: string[]): ScoutOwnedRuntimeModel | null {
|
|
51
|
+
const input = record(value);
|
|
52
|
+
if (!input) {
|
|
53
|
+
errors.push(`${path} must be an object`);
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
const id = text(input.id);
|
|
57
|
+
const label = text(input.label);
|
|
58
|
+
if (!id || !/^[A-Za-z0-9][A-Za-z0-9._/-]*$/u.test(id)) {
|
|
59
|
+
errors.push(`${path}.id must use provider-safe letters, numbers, dot, slash, underscore, or hyphen`);
|
|
60
|
+
}
|
|
61
|
+
if (!label) errors.push(`${path}.label is required`);
|
|
62
|
+
if (typeof input.enabled !== "boolean") errors.push(`${path}.enabled must be boolean`);
|
|
63
|
+
if (input.default === true && input.enabled !== true) errors.push(`${path} cannot be default while disabled`);
|
|
64
|
+
if (!id || !label || typeof input.enabled !== "boolean") return null;
|
|
65
|
+
const efforts = input.reasoningEfforts === undefined
|
|
66
|
+
? undefined
|
|
67
|
+
: effortList(input.reasoningEfforts, `${path}.reasoningEfforts`, errors);
|
|
68
|
+
const defaultEffort = input.defaultReasoningEffort == null ? null : text(input.defaultReasoningEffort);
|
|
69
|
+
const contextWindowTokens = input.contextWindowTokens;
|
|
70
|
+
if (contextWindowTokens !== undefined && (!Number.isInteger(contextWindowTokens) || Number(contextWindowTokens) <= 0)) {
|
|
71
|
+
errors.push(`${path}.contextWindowTokens must be a positive integer`);
|
|
72
|
+
}
|
|
73
|
+
if (input.defaultReasoningEffort != null && (!defaultEffort || !reasoningEfforts.has(defaultEffort))) {
|
|
74
|
+
errors.push(`${path}.defaultReasoningEffort is unknown`);
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
id,
|
|
78
|
+
label,
|
|
79
|
+
enabled: input.enabled,
|
|
80
|
+
...(input.default === true ? { default: true } : {}),
|
|
81
|
+
...(text(input.description) ? { description: text(input.description)! } : {}),
|
|
82
|
+
...(text(input.family) ? { family: text(input.family)! } : {}),
|
|
83
|
+
...(text(input.version) ? { version: text(input.version)! } : {}),
|
|
84
|
+
...(Number.isInteger(contextWindowTokens) && Number(contextWindowTokens) > 0
|
|
85
|
+
? { contextWindowTokens: Number(contextWindowTokens) }
|
|
86
|
+
: {}),
|
|
87
|
+
...(input.reasoningEfforts !== undefined ? { reasoningEfforts: efforts ?? null } : {}),
|
|
88
|
+
...(defaultEffort && reasoningEfforts.has(defaultEffort)
|
|
89
|
+
? { defaultReasoningEffort: defaultEffort as ScoutReasoningEffort }
|
|
90
|
+
: {}),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function harness(value: unknown, path: string, errors: string[]): ScoutOwnedRuntimeHarness | null {
|
|
95
|
+
const input = record(value);
|
|
96
|
+
if (!input) {
|
|
97
|
+
errors.push(`${path} must be an object`);
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
const id = text(input.id);
|
|
101
|
+
const label = text(input.label);
|
|
102
|
+
if (!id || !launchableHarnesses.has(id)) errors.push(`${path}.id is not a launchable harness`);
|
|
103
|
+
if (!label) errors.push(`${path}.label is required`);
|
|
104
|
+
if (typeof input.enabled !== "boolean") errors.push(`${path}.enabled must be boolean`);
|
|
105
|
+
if (input.listed !== undefined && typeof input.listed !== "boolean") {
|
|
106
|
+
errors.push(`${path}.listed must be boolean when provided`);
|
|
107
|
+
}
|
|
108
|
+
if (input.default === true && input.enabled !== true) errors.push(`${path} cannot be default while disabled`);
|
|
109
|
+
const efforts = effortList(input.reasoningEfforts, `${path}.reasoningEfforts`, errors);
|
|
110
|
+
if (!id || !launchableHarnesses.has(id) || !label || typeof input.enabled !== "boolean" || efforts === undefined) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
if (!Array.isArray(input.models)) {
|
|
114
|
+
errors.push(`${path}.models must be an array`);
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
if (input.models.length > MAX_RUNTIME_MODELS_PER_HARNESS) {
|
|
118
|
+
errors.push(`${path}.models exceeds the ${MAX_RUNTIME_MODELS_PER_HARNESS}-model limit`);
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
const models = input.models
|
|
122
|
+
.map((entry, index) => model(entry, `${path}.models[${index}]`, errors))
|
|
123
|
+
.filter((entry): entry is ScoutOwnedRuntimeModel => Boolean(entry));
|
|
124
|
+
const ids = new Set<string>();
|
|
125
|
+
for (const entry of models) {
|
|
126
|
+
if (!ids.add(entry.id)) errors.push(`${path} contains duplicate model ${entry.id}`);
|
|
127
|
+
const effective = entry.reasoningEfforts === undefined ? efforts : entry.reasoningEfforts;
|
|
128
|
+
if (entry.defaultReasoningEffort && !effective?.includes(entry.defaultReasoningEffort)) {
|
|
129
|
+
errors.push(`${path} model ${entry.id} has an unsupported default effort`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (models.filter((entry) => entry.default).length > 1) errors.push(`${path} has more than one default model`);
|
|
133
|
+
for (const entry of models) {
|
|
134
|
+
if (entry.default && !entry.enabled) errors.push(`${path} model ${entry.id} cannot be default while disabled`);
|
|
135
|
+
}
|
|
136
|
+
const defaultEffort = input.defaultReasoningEffort == null ? null : text(input.defaultReasoningEffort);
|
|
137
|
+
if (defaultEffort && !efforts?.includes(defaultEffort as ScoutReasoningEffort)) {
|
|
138
|
+
errors.push(`${path}.defaultReasoningEffort is not supported`);
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
id: id as ScoutLaunchableHarness,
|
|
142
|
+
label,
|
|
143
|
+
enabled: input.enabled,
|
|
144
|
+
...(typeof input.listed === "boolean" ? { listed: input.listed } : {}),
|
|
145
|
+
...(input.default === true ? { default: true } : {}),
|
|
146
|
+
reasoningEfforts: efforts,
|
|
147
|
+
...(defaultEffort && reasoningEfforts.has(defaultEffort)
|
|
148
|
+
? { defaultReasoningEffort: defaultEffort as ScoutReasoningEffort }
|
|
149
|
+
: {}),
|
|
150
|
+
models,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export function parseScoutRuntimeCatalog(value: unknown): ScoutRuntimeCatalogParseResult {
|
|
155
|
+
const input = record(value);
|
|
156
|
+
if (!input) return { ok: false, errors: ["catalog must be a JSON object"] };
|
|
157
|
+
const errors: string[] = [];
|
|
158
|
+
if (input.schemaVersion !== "openscout.runtime-catalog.v1") errors.push("unexpected schemaVersion");
|
|
159
|
+
const revision = text(input.revision);
|
|
160
|
+
if (!revision || !/^\d{4}-\d{2}-\d{2}\.\d+$/u.test(revision)) {
|
|
161
|
+
errors.push("revision must use YYYY-MM-DD.N format");
|
|
162
|
+
}
|
|
163
|
+
if (!Array.isArray(input.harnesses) || input.harnesses.length === 0) {
|
|
164
|
+
errors.push("harnesses must be a non-empty array");
|
|
165
|
+
return { ok: false, errors };
|
|
166
|
+
}
|
|
167
|
+
const harnesses = input.harnesses
|
|
168
|
+
.map((entry, index) => harness(entry, `harnesses[${index}]`, errors))
|
|
169
|
+
.filter((entry): entry is ScoutOwnedRuntimeHarness => Boolean(entry));
|
|
170
|
+
const ids = new Set<string>();
|
|
171
|
+
const sharedModels = new Map<string, string>();
|
|
172
|
+
for (const entry of harnesses) {
|
|
173
|
+
if (!ids.add(entry.id)) errors.push(`duplicate harness ${entry.id}`);
|
|
174
|
+
for (const model of entry.models) {
|
|
175
|
+
const signature = JSON.stringify([
|
|
176
|
+
model.label,
|
|
177
|
+
model.description ?? null,
|
|
178
|
+
model.family ?? null,
|
|
179
|
+
model.version ?? null,
|
|
180
|
+
model.contextWindowTokens ?? null,
|
|
181
|
+
]);
|
|
182
|
+
const prior = sharedModels.get(model.id);
|
|
183
|
+
if (prior && prior !== signature) errors.push(`shared model ${model.id} has inconsistent metadata`);
|
|
184
|
+
sharedModels.set(model.id, signature);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (harnesses.filter((entry) => entry.enabled && entry.default).length !== 1) {
|
|
188
|
+
errors.push("catalog must contain exactly one enabled default harness");
|
|
189
|
+
}
|
|
190
|
+
return errors.length || !revision
|
|
191
|
+
? { ok: false, errors }
|
|
192
|
+
: { ok: true, catalog: { schemaVersion: "openscout.runtime-catalog.v1", revision, harnesses } };
|
|
193
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "openscout.runtime-catalog.v1",
|
|
3
|
+
"revision": "2026-08-18.1",
|
|
4
|
+
"harnesses": [
|
|
5
|
+
{
|
|
6
|
+
"id": "claude",
|
|
7
|
+
"label": "Claude Code",
|
|
8
|
+
"enabled": true,
|
|
9
|
+
"default": true,
|
|
10
|
+
"reasoningEfforts": ["low", "medium", "high", "xhigh", "max"],
|
|
11
|
+
"defaultReasoningEffort": "medium",
|
|
12
|
+
"models": [
|
|
13
|
+
{ "id": "claude-opus-5", "label": "Opus 5", "enabled": true, "default": true, "family": "Opus", "version": "5" },
|
|
14
|
+
{ "id": "claude-sonnet-4-6", "label": "Sonnet 4.6", "enabled": true, "family": "Sonnet", "version": "4.6" },
|
|
15
|
+
{ "id": "claude-haiku-4-5", "label": "Haiku 4.5", "enabled": true, "family": "Haiku", "version": "4.5" },
|
|
16
|
+
{ "id": "claude-opus-4-8", "label": "Opus 4.8", "enabled": true, "family": "Opus", "version": "4.8" },
|
|
17
|
+
{ "id": "claude-opus-4-7", "label": "Opus 4.7", "enabled": true, "family": "Opus", "version": "4.7" },
|
|
18
|
+
{ "id": "claude-sonnet-4-5", "label": "Sonnet 4.5", "enabled": true, "family": "Sonnet", "version": "4.5" }
|
|
19
|
+
]
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "codex",
|
|
23
|
+
"label": "Codex",
|
|
24
|
+
"enabled": true,
|
|
25
|
+
"reasoningEfforts": ["low", "medium", "high", "xhigh"],
|
|
26
|
+
"defaultReasoningEffort": "medium",
|
|
27
|
+
"models": [
|
|
28
|
+
{ "id": "gpt-5.6-sol", "label": "5.6 Sol", "enabled": true, "default": true, "family": "GPT", "version": "5.6 Sol", "reasoningEfforts": ["low", "medium", "high", "xhigh", "ultra"] },
|
|
29
|
+
{ "id": "gpt-5.6-terra", "label": "5.6 Terra", "enabled": true, "family": "GPT", "version": "5.6 Terra", "reasoningEfforts": ["low", "medium", "high", "xhigh", "ultra"] },
|
|
30
|
+
{ "id": "gpt-5.6-luna", "label": "5.6 Luna", "enabled": true, "family": "GPT", "version": "5.6 Luna" },
|
|
31
|
+
{ "id": "gpt-5.5", "label": "5.5", "enabled": true, "family": "GPT", "version": "5.5" },
|
|
32
|
+
{ "id": "gpt-5.5-mini", "label": "5.5 mini", "enabled": true, "family": "GPT", "version": "5.5 mini" }
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"id": "grok",
|
|
37
|
+
"label": "Grok CLI",
|
|
38
|
+
"enabled": true,
|
|
39
|
+
"listed": false,
|
|
40
|
+
"reasoningEfforts": ["low", "medium", "high", "xhigh"],
|
|
41
|
+
"defaultReasoningEffort": "medium",
|
|
42
|
+
"models": [
|
|
43
|
+
{ "id": "grok-4.6", "label": "Grok 4.6", "enabled": true, "default": true, "family": "Grok", "version": "4.6", "contextWindowTokens": 500000 },
|
|
44
|
+
{ "id": "grok-4.5", "label": "Grok 4.5", "enabled": true, "family": "Grok", "version": "4.5" },
|
|
45
|
+
{ "id": "grok-4.3", "label": "Grok 4.3", "enabled": true, "family": "Grok", "version": "4.3" }
|
|
46
|
+
]
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"id": "grok-acp",
|
|
50
|
+
"label": "Grok",
|
|
51
|
+
"enabled": true,
|
|
52
|
+
"reasoningEfforts": null,
|
|
53
|
+
"models": [
|
|
54
|
+
{ "id": "grok-4.6", "label": "Grok 4.6", "enabled": true, "default": true, "family": "Grok", "version": "4.6", "contextWindowTokens": 500000 },
|
|
55
|
+
{ "id": "grok-4.5", "label": "Grok 4.5", "enabled": true, "family": "Grok", "version": "4.5" },
|
|
56
|
+
{ "id": "grok-4.3", "label": "Grok 4.3", "enabled": true, "family": "Grok", "version": "4.3" }
|
|
57
|
+
]
|
|
58
|
+
},
|
|
59
|
+
{ "id": "kimi", "label": "Kimi Code", "enabled": true, "reasoningEfforts": null, "models": [] },
|
|
60
|
+
{ "id": "flue", "label": "Flue", "enabled": true, "reasoningEfforts": null, "models": [] },
|
|
61
|
+
{ "id": "cursor", "label": "Cursor CLI", "enabled": true, "reasoningEfforts": null, "models": [] },
|
|
62
|
+
{
|
|
63
|
+
"id": "opencode",
|
|
64
|
+
"label": "OpenCode",
|
|
65
|
+
"enabled": true,
|
|
66
|
+
"reasoningEfforts": null,
|
|
67
|
+
"models": [
|
|
68
|
+
{ "id": "opencode-go/glm-5.2", "label": "GLM-5.2", "enabled": true, "default": true, "family": "GLM", "version": "5.2" },
|
|
69
|
+
{ "id": "opencode-go/glm-5.1", "label": "GLM-5.1", "enabled": true, "family": "GLM", "version": "5.1" },
|
|
70
|
+
{ "id": "opencode-go/kimi-k3", "label": "Kimi K3", "enabled": true, "family": "Kimi", "version": "K3" },
|
|
71
|
+
{ "id": "opencode-go/qwen3.8-max", "label": "Qwen3.8 Max", "enabled": true, "family": "Qwen", "version": "3.8 Max" },
|
|
72
|
+
{ "id": "opencode-go/minimax-m3", "label": "MiniMax M3", "enabled": true, "family": "MiniMax", "version": "M3" },
|
|
73
|
+
{ "id": "opencode-go/deepseek-v4-pro", "label": "DeepSeek V4 Pro", "enabled": true, "family": "DeepSeek", "version": "V4 Pro" },
|
|
74
|
+
{ "id": "opencode-go/grok-4.5", "label": "Grok 4.5", "enabled": true, "family": "Grok", "version": "4.5" },
|
|
75
|
+
{ "id": "opencode/nemotron-3-ultra-free", "label": "Nemotron 3 Ultra (free)", "enabled": true, "family": "Nemotron", "version": "3 Ultra Free" },
|
|
76
|
+
{ "id": "opencode/laguna-s-2.1-free", "label": "Laguna S 2.1 (free)", "enabled": true, "family": "Laguna", "version": "S 2.1 Free" }
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
{ "id": "pi", "label": "Pi", "enabled": true, "reasoningEfforts": null, "models": [] }
|
|
80
|
+
]
|
|
81
|
+
}
|