@openscout/protocol 0.2.109 → 0.2.110
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/dist/actors.d.ts +1 -1
- package/dist/actors.d.ts.map +1 -1
- package/dist/agent-notifications.d.ts +137 -0
- package/dist/agent-notifications.d.ts.map +1 -0
- package/dist/agent-notifications.js +148 -0
- package/dist/channel-invites.d.ts +3 -1
- package/dist/channel-invites.d.ts.map +1 -1
- package/dist/channel-membership.d.ts +10 -0
- package/dist/channel-membership.d.ts.map +1 -0
- package/dist/channel-membership.js +16 -0
- package/dist/chat-mentions.d.ts +4 -0
- package/dist/chat-mentions.d.ts.map +1 -0
- package/dist/chat-mentions.js +11 -0
- package/dist/chat-message-corrections.d.ts +28 -0
- package/dist/chat-message-corrections.d.ts.map +1 -0
- package/dist/chat-message-corrections.js +46 -0
- package/dist/chat-pins.d.ts +14 -0
- package/dist/chat-pins.d.ts.map +1 -0
- package/dist/chat-pins.js +37 -0
- package/dist/common.d.ts +1 -1
- package/dist/common.d.ts.map +1 -1
- package/dist/events.d.ts +4 -1
- package/dist/events.d.ts.map +1 -1
- package/dist/herdr-workspace-digest.d.ts +8 -4
- package/dist/herdr-workspace-digest.d.ts.map +1 -1
- package/dist/herdr-workspace-digest.js +18 -3
- package/dist/host-integrations.js +6 -6
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/invocations.d.ts +17 -2
- package/dist/invocations.d.ts.map +1 -1
- package/dist/invocations.js +1 -1
- package/dist/mcp-core-tools.d.ts +137 -0
- package/dist/mcp-core-tools.d.ts.map +1 -0
- package/dist/mcp-core-tools.js +27 -0
- package/dist/message-reactions.d.ts +5 -0
- package/dist/message-reactions.d.ts.map +1 -1
- package/dist/message-reactions.js +10 -1
- package/dist/orchestration-provider-map.d.ts.map +1 -1
- package/dist/orchestration-provider-map.js +9 -1
- package/dist/read-receipts.d.ts +38 -0
- package/dist/read-receipts.d.ts.map +1 -1
- package/dist/read-receipts.js +43 -1
- package/dist/runtime-catalog-contract.d.ts +14 -0
- package/dist/runtime-catalog-contract.d.ts.map +1 -1
- package/dist/runtime-catalog.d.ts.map +1 -1
- package/dist/runtime-catalog.generated.d.ts +88 -2
- package/dist/runtime-catalog.generated.d.ts.map +1 -1
- package/dist/runtime-catalog.generated.js +114 -12
- package/dist/runtime-catalog.js +28 -0
- package/dist/runtime-execution.d.ts +33 -2
- package/dist/runtime-execution.d.ts.map +1 -1
- package/dist/runtime-execution.js +34 -17
- package/dist/scout-agent-card.d.ts +2 -0
- package/dist/scout-agent-card.d.ts.map +1 -1
- package/dist/scout-agent-card.js +3 -0
- package/dist/scout-composer.d.ts.map +1 -1
- package/dist/scout-composer.js +23 -0
- package/dist/scout-delivery.d.ts +3 -1
- package/dist/scout-delivery.d.ts.map +1 -1
- package/dist/scout-dispatch.d.ts +13 -0
- package/dist/scout-dispatch.d.ts.map +1 -1
- package/dist/session-handle.d.ts +37 -0
- package/dist/session-handle.d.ts.map +1 -1
- package/dist/session-handle.js +58 -0
- package/dist/terminal-host-topology.d.ts +5 -2
- package/dist/terminal-host-topology.d.ts.map +1 -1
- package/dist/terminal-host-topology.js +2 -1
- package/dist/transports.d.ts +8 -1
- package/dist/transports.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/actors.ts +2 -0
- package/src/agent-notifications.ts +241 -0
- package/src/channel-invites.ts +4 -1
- package/src/channel-membership.ts +22 -0
- package/src/chat-mentions.ts +11 -0
- package/src/chat-message-corrections.ts +40 -0
- package/src/chat-pins.ts +40 -0
- package/src/common.ts +2 -0
- package/src/events.ts +3 -0
- package/src/herdr-workspace-digest.ts +23 -6
- package/src/host-integrations.ts +6 -6
- package/src/index.ts +10 -0
- package/src/invocations.ts +18 -3
- package/src/mcp-core-tools.ts +46 -0
- package/src/message-reactions.ts +16 -2
- package/src/orchestration-provider-map.ts +12 -1
- package/src/read-receipts.ts +71 -0
- package/src/runtime-catalog-contract.ts +16 -0
- package/src/runtime-catalog.generated.ts +114 -12
- package/src/runtime-catalog.ts +32 -0
- package/src/runtime-catalog.v1.json +20 -13
- package/src/runtime-execution.ts +70 -16
- package/src/scout-agent-card.ts +5 -0
- package/src/scout-composer.ts +26 -0
- package/src/scout-delivery.ts +3 -1
- package/src/scout-dispatch.ts +13 -0
- package/src/session-handle.ts +88 -0
- package/src/terminal-host-topology.ts +5 -2
- package/src/transports.ts +9 -0
package/src/message-reactions.ts
CHANGED
|
@@ -35,6 +35,11 @@ export interface MessageReactionChip {
|
|
|
35
35
|
emoji: string;
|
|
36
36
|
count: number;
|
|
37
37
|
me: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Who reacted, earliest first. Clients resolve names from the roster they
|
|
40
|
+
* already hold; an older server omits it and the chip shows only the count.
|
|
41
|
+
*/
|
|
42
|
+
actorIds?: string[];
|
|
38
43
|
}
|
|
39
44
|
|
|
40
45
|
/** One stored row. Canonical identity is `(messageId, actorId, emoji)`. */
|
|
@@ -55,11 +60,12 @@ export function projectMessageReactionChips(
|
|
|
55
60
|
rows: readonly MessageReactionRecord[],
|
|
56
61
|
viewerActorId: string,
|
|
57
62
|
): MessageReactionChip[] {
|
|
58
|
-
const byEmoji = new Map<string, { count: number; me: boolean; firstAt: number }>();
|
|
63
|
+
const byEmoji = new Map<string, { count: number; me: boolean; firstAt: number; actors: MessageReactionRecord[] }>();
|
|
59
64
|
for (const row of rows) {
|
|
60
65
|
const current = byEmoji.get(row.emoji);
|
|
61
66
|
if (current) {
|
|
62
67
|
current.count += 1;
|
|
68
|
+
current.actors.push(row);
|
|
63
69
|
if (row.actorId === viewerActorId) current.me = true;
|
|
64
70
|
if (row.createdAt < current.firstAt) current.firstAt = row.createdAt;
|
|
65
71
|
} else {
|
|
@@ -67,6 +73,7 @@ export function projectMessageReactionChips(
|
|
|
67
73
|
count: 1,
|
|
68
74
|
me: row.actorId === viewerActorId,
|
|
69
75
|
firstAt: row.createdAt,
|
|
76
|
+
actors: [row],
|
|
70
77
|
});
|
|
71
78
|
}
|
|
72
79
|
}
|
|
@@ -80,5 +87,12 @@ export function projectMessageReactionChips(
|
|
|
80
87
|
if (time !== 0) return time;
|
|
81
88
|
return allowlistIndex(left[0]) - allowlistIndex(right[0]);
|
|
82
89
|
})
|
|
83
|
-
.map(([emoji, value]) => ({
|
|
90
|
+
.map(([emoji, value]) => ({
|
|
91
|
+
emoji,
|
|
92
|
+
count: value.count,
|
|
93
|
+
me: value.me,
|
|
94
|
+
actorIds: value.actors
|
|
95
|
+
.sort((left, right) => left.createdAt - right.createdAt)
|
|
96
|
+
.map((row) => row.actorId),
|
|
97
|
+
}));
|
|
84
98
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { scoutRuntimeHarness, scoutRuntimeLatestModelInFamily } from "./runtime-execution.js";
|
|
2
|
+
|
|
1
3
|
const HOUR_MS = 60 * 60_000;
|
|
2
4
|
const DAY_MS = 24 * HOUR_MS;
|
|
3
5
|
|
|
@@ -152,6 +154,15 @@ type RolePolicy = {
|
|
|
152
154
|
candidates: RuntimeCandidate[];
|
|
153
155
|
};
|
|
154
156
|
|
|
157
|
+
// The Opus role follows the catalog's newest Opus instead of pinning a release.
|
|
158
|
+
const OPUS = latestClaudeModel("Opus", { id: "claude-opus-5-5", label: "Opus 5.5" });
|
|
159
|
+
|
|
160
|
+
function latestClaudeModel(family: string, fallback: { id: string; label: string }): { id: string; label: string } {
|
|
161
|
+
const id = scoutRuntimeLatestModelInFamily("claude", family);
|
|
162
|
+
const model = scoutRuntimeHarness("claude")?.models.find((entry) => entry.id === id);
|
|
163
|
+
return model ? { id: model.id, label: model.label } : fallback;
|
|
164
|
+
}
|
|
165
|
+
|
|
155
166
|
const RUNTIMES = {
|
|
156
167
|
fable: runtimeDefinition(
|
|
157
168
|
"Fable 5", "claude", "claude", "claude-fable-5", "max", "Fable",
|
|
@@ -174,7 +185,7 @@ const RUNTIMES = {
|
|
|
174
185
|
"The harness owns the concrete model and quota telemetry can be stale; probe before large fan-out.",
|
|
175
186
|
),
|
|
176
187
|
opus: runtimeDefinition(
|
|
177
|
-
|
|
188
|
+
OPUS.label, "claude", "claude", OPUS.id, "high", "Opus",
|
|
178
189
|
"Long-context synthesis, nuanced architecture, and coherent product reasoning.",
|
|
179
190
|
"Premium shared Claude quota; avoid routine scans and repetitive verification.",
|
|
180
191
|
),
|
package/src/read-receipts.ts
CHANGED
|
@@ -10,3 +10,74 @@ export interface ConversationReadCursor {
|
|
|
10
10
|
updatedAt: number;
|
|
11
11
|
metadata?: MetadataMap;
|
|
12
12
|
}
|
|
13
|
+
|
|
14
|
+
/** A viewer's retained unread projection. Root messages and each thread keep
|
|
15
|
+
* separate cursors so opening a channel never reads unopened thread replies.
|
|
16
|
+
*/
|
|
17
|
+
export interface ChatReadLane {
|
|
18
|
+
rootMessageId: ScoutId | null;
|
|
19
|
+
lastReadMessageId: ScoutId | null;
|
|
20
|
+
latestMessageId: ScoutId | null;
|
|
21
|
+
unreadMessageIds: ScoutId[];
|
|
22
|
+
mentionMessageIds: ScoutId[];
|
|
23
|
+
/** The retained page cannot establish the entire unread history. */
|
|
24
|
+
incomplete: boolean;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface ChatReadState {
|
|
28
|
+
channelId: ScoutId;
|
|
29
|
+
actorId: ScoutId;
|
|
30
|
+
lanes: ChatReadLane[];
|
|
31
|
+
preferences?: ChatAttentionPreferences;
|
|
32
|
+
pins?: import("./chat-pins.js").ChatPin[];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Personal attention settings. Changing them never acknowledges messages. */
|
|
36
|
+
export interface ChatAttentionPreferences {
|
|
37
|
+
notificationMode: "all" | "mentions" | "muted";
|
|
38
|
+
followedThreadIds: ScoutId[];
|
|
39
|
+
/** Private bookmarks; absent on older stored preferences. */
|
|
40
|
+
savedMessageIds?: ScoutId[];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Set operations avoid overwriting another device's unrelated thread choice. */
|
|
44
|
+
export type ChatAttentionPreferenceChange =
|
|
45
|
+
| { notificationMode: ChatAttentionPreferences["notificationMode"] }
|
|
46
|
+
| { threadId: ScoutId; following: boolean }
|
|
47
|
+
| { messageId: ScoutId; saved: boolean };
|
|
48
|
+
|
|
49
|
+
export function readChatAttentionPreferences(value: unknown): ChatAttentionPreferences {
|
|
50
|
+
const record = value && typeof value === "object" ? value as Partial<ChatAttentionPreferences> : {};
|
|
51
|
+
return {
|
|
52
|
+
...(Array.isArray(record.savedMessageIds) ? { savedMessageIds: [...new Set(record.savedMessageIds.filter((id): id is string => typeof id === "string" && id.length > 0))] } : {}),
|
|
53
|
+
notificationMode: record.notificationMode === "mentions" || record.notificationMode === "muted" ? record.notificationMode : "all",
|
|
54
|
+
followedThreadIds: Array.isArray(record.followedThreadIds)
|
|
55
|
+
? [...new Set(record.followedThreadIds.filter((id): id is string => typeof id === "string" && id.length > 0))] : [],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function applyChatAttentionPreferenceChange(current: unknown, change: unknown): ChatAttentionPreferences {
|
|
60
|
+
const next = readChatAttentionPreferences(current);
|
|
61
|
+
if (!change || typeof change !== "object" || Array.isArray(change)) throw new Error("Invalid attention preference change.");
|
|
62
|
+
const input = change as Record<string, unknown>;
|
|
63
|
+
const keys = Object.keys(input);
|
|
64
|
+
if (keys.length === 1 && keys[0] === "notificationMode"
|
|
65
|
+
&& (input.notificationMode === "all" || input.notificationMode === "mentions" || input.notificationMode === "muted")) {
|
|
66
|
+
return { ...next, notificationMode: input.notificationMode };
|
|
67
|
+
}
|
|
68
|
+
if (keys.length === 2 && typeof input.threadId === "string" && input.threadId.trim() === input.threadId
|
|
69
|
+
&& input.threadId.length > 0 && input.threadId.length <= 256 && typeof input.following === "boolean") {
|
|
70
|
+
const ids = new Set(next.followedThreadIds);
|
|
71
|
+
if (input.following) ids.add(input.threadId); else ids.delete(input.threadId);
|
|
72
|
+
if (ids.size > 500) throw new Error("Followed thread limit reached. Unfollow a thread before adding another.");
|
|
73
|
+
return { ...next, followedThreadIds: [...ids] };
|
|
74
|
+
}
|
|
75
|
+
if (keys.length === 2 && typeof input.messageId === "string" && input.messageId.trim() === input.messageId
|
|
76
|
+
&& input.messageId.length > 0 && input.messageId.length <= 256 && typeof input.saved === "boolean") {
|
|
77
|
+
const ids = new Set(next.savedMessageIds ?? []);
|
|
78
|
+
if (input.saved) ids.add(input.messageId); else ids.delete(input.messageId);
|
|
79
|
+
if (ids.size > 500) throw new Error("Saved message limit reached. Remove a saved message before adding another.");
|
|
80
|
+
return { ...next, savedMessageIds: [...ids] };
|
|
81
|
+
}
|
|
82
|
+
throw new Error("Invalid attention preference change.");
|
|
83
|
+
}
|
|
@@ -24,6 +24,20 @@ export const SCOUT_REASONING_EFFORT_LABELS: Readonly<Record<ScoutReasoningEffort
|
|
|
24
24
|
ultra: "Ultra",
|
|
25
25
|
};
|
|
26
26
|
|
|
27
|
+
/** Optional picker-facing copy owned by the catalog, not by client code. */
|
|
28
|
+
export interface ScoutRuntimeHarnessPresentation {
|
|
29
|
+
/** One-word rail/chip label, e.g. "Claude" for "Claude Code". */
|
|
30
|
+
short?: string;
|
|
31
|
+
/** Typographic stand-in for surfaces that render the harness as a mark. */
|
|
32
|
+
monogram?: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Optional picker-facing copy owned by the catalog, not by client code. */
|
|
36
|
+
export interface ScoutRuntimeModelPresentation {
|
|
37
|
+
/** One-line picker blurb, e.g. "Deepest", "Frontier". */
|
|
38
|
+
detail?: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
27
41
|
export interface ScoutOwnedRuntimeModel {
|
|
28
42
|
id: string;
|
|
29
43
|
label: string;
|
|
@@ -35,6 +49,7 @@ export interface ScoutOwnedRuntimeModel {
|
|
|
35
49
|
contextWindowTokens?: number;
|
|
36
50
|
reasoningEfforts?: readonly ScoutReasoningEffort[] | null;
|
|
37
51
|
defaultReasoningEffort?: ScoutReasoningEffort | null;
|
|
52
|
+
presentation?: ScoutRuntimeModelPresentation;
|
|
38
53
|
}
|
|
39
54
|
|
|
40
55
|
export interface ScoutOwnedRuntimeHarness {
|
|
@@ -50,6 +65,7 @@ export interface ScoutOwnedRuntimeHarness {
|
|
|
50
65
|
default?: boolean;
|
|
51
66
|
reasoningEfforts: readonly ScoutReasoningEffort[] | null;
|
|
52
67
|
defaultReasoningEffort?: ScoutReasoningEffort | null;
|
|
68
|
+
presentation?: ScoutRuntimeHarnessPresentation;
|
|
53
69
|
models: readonly ScoutOwnedRuntimeModel[];
|
|
54
70
|
}
|
|
55
71
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
export const SCOUT_RUNTIME_CATALOG_DATA = {
|
|
4
4
|
"schemaVersion": "openscout.runtime-catalog.v1",
|
|
5
|
-
"revision": "2026-09-
|
|
5
|
+
"revision": "2026-09-24.1",
|
|
6
6
|
"harnesses": [
|
|
7
7
|
{
|
|
8
8
|
"id": "claude",
|
|
@@ -17,14 +17,32 @@ export const SCOUT_RUNTIME_CATALOG_DATA = {
|
|
|
17
17
|
"max"
|
|
18
18
|
],
|
|
19
19
|
"defaultReasoningEffort": "medium",
|
|
20
|
+
"presentation": {
|
|
21
|
+
"short": "Claude",
|
|
22
|
+
"monogram": "✳"
|
|
23
|
+
},
|
|
20
24
|
"models": [
|
|
25
|
+
{
|
|
26
|
+
"id": "claude-opus-5-5",
|
|
27
|
+
"label": "Opus 5.5",
|
|
28
|
+
"enabled": true,
|
|
29
|
+
"default": true,
|
|
30
|
+
"family": "Opus",
|
|
31
|
+
"version": "5.5",
|
|
32
|
+
"contextWindowTokens": 1000000,
|
|
33
|
+
"presentation": {
|
|
34
|
+
"detail": "Latest"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
21
37
|
{
|
|
22
38
|
"id": "claude-opus-5",
|
|
23
39
|
"label": "Opus 5",
|
|
24
40
|
"enabled": true,
|
|
25
|
-
"default": true,
|
|
26
41
|
"family": "Opus",
|
|
27
|
-
"version": "5"
|
|
42
|
+
"version": "5",
|
|
43
|
+
"presentation": {
|
|
44
|
+
"detail": "Deepest"
|
|
45
|
+
}
|
|
28
46
|
},
|
|
29
47
|
{
|
|
30
48
|
"id": "claude-fable-5",
|
|
@@ -38,14 +56,20 @@ export const SCOUT_RUNTIME_CATALOG_DATA = {
|
|
|
38
56
|
"label": "Sonnet 4.6",
|
|
39
57
|
"enabled": true,
|
|
40
58
|
"family": "Sonnet",
|
|
41
|
-
"version": "4.6"
|
|
59
|
+
"version": "4.6",
|
|
60
|
+
"presentation": {
|
|
61
|
+
"detail": "Balanced"
|
|
62
|
+
}
|
|
42
63
|
},
|
|
43
64
|
{
|
|
44
65
|
"id": "claude-haiku-4-5",
|
|
45
66
|
"label": "Haiku 4.5",
|
|
46
67
|
"enabled": true,
|
|
47
68
|
"family": "Haiku",
|
|
48
|
-
"version": "4.5"
|
|
69
|
+
"version": "4.5",
|
|
70
|
+
"presentation": {
|
|
71
|
+
"detail": "Fast"
|
|
72
|
+
}
|
|
49
73
|
},
|
|
50
74
|
{
|
|
51
75
|
"id": "claude-opus-4-8",
|
|
@@ -81,6 +105,10 @@ export const SCOUT_RUNTIME_CATALOG_DATA = {
|
|
|
81
105
|
"xhigh"
|
|
82
106
|
],
|
|
83
107
|
"defaultReasoningEffort": "medium",
|
|
108
|
+
"presentation": {
|
|
109
|
+
"short": "Codex",
|
|
110
|
+
"monogram": "◈"
|
|
111
|
+
},
|
|
84
112
|
"models": [
|
|
85
113
|
{
|
|
86
114
|
"id": "gpt-6-astra",
|
|
@@ -97,7 +125,50 @@ export const SCOUT_RUNTIME_CATALOG_DATA = {
|
|
|
97
125
|
"high",
|
|
98
126
|
"xhigh",
|
|
99
127
|
"max"
|
|
100
|
-
]
|
|
128
|
+
],
|
|
129
|
+
"defaultReasoningEffort": "low",
|
|
130
|
+
"presentation": {
|
|
131
|
+
"detail": "Most capable"
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"id": "gpt-6-sol",
|
|
136
|
+
"label": "6 Sol",
|
|
137
|
+
"enabled": true,
|
|
138
|
+
"description": "Complex coding and agentic workflows",
|
|
139
|
+
"family": "GPT",
|
|
140
|
+
"version": "6 Sol",
|
|
141
|
+
"contextWindowTokens": 272000,
|
|
142
|
+
"reasoningEfforts": [
|
|
143
|
+
"low",
|
|
144
|
+
"medium",
|
|
145
|
+
"high",
|
|
146
|
+
"xhigh",
|
|
147
|
+
"max",
|
|
148
|
+
"ultra"
|
|
149
|
+
],
|
|
150
|
+
"presentation": {
|
|
151
|
+
"detail": "Coding"
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"id": "gpt-6-luna",
|
|
156
|
+
"label": "6 Luna",
|
|
157
|
+
"enabled": true,
|
|
158
|
+
"description": "Efficient focused coding and repeatable tasks",
|
|
159
|
+
"family": "GPT",
|
|
160
|
+
"version": "6 Luna",
|
|
161
|
+
"contextWindowTokens": 272000,
|
|
162
|
+
"reasoningEfforts": [
|
|
163
|
+
"low",
|
|
164
|
+
"medium",
|
|
165
|
+
"high",
|
|
166
|
+
"xhigh",
|
|
167
|
+
"max"
|
|
168
|
+
],
|
|
169
|
+
"presentation": {
|
|
170
|
+
"detail": "Efficient"
|
|
171
|
+
}
|
|
101
172
|
},
|
|
102
173
|
{
|
|
103
174
|
"id": "gpt-5.6-sol",
|
|
@@ -111,7 +182,10 @@ export const SCOUT_RUNTIME_CATALOG_DATA = {
|
|
|
111
182
|
"high",
|
|
112
183
|
"xhigh",
|
|
113
184
|
"ultra"
|
|
114
|
-
]
|
|
185
|
+
],
|
|
186
|
+
"presentation": {
|
|
187
|
+
"detail": "Frontier"
|
|
188
|
+
}
|
|
115
189
|
},
|
|
116
190
|
{
|
|
117
191
|
"id": "gpt-5.6-terra",
|
|
@@ -125,14 +199,20 @@ export const SCOUT_RUNTIME_CATALOG_DATA = {
|
|
|
125
199
|
"high",
|
|
126
200
|
"xhigh",
|
|
127
201
|
"ultra"
|
|
128
|
-
]
|
|
202
|
+
],
|
|
203
|
+
"presentation": {
|
|
204
|
+
"detail": "Frontier"
|
|
205
|
+
}
|
|
129
206
|
},
|
|
130
207
|
{
|
|
131
208
|
"id": "gpt-5.6-luna",
|
|
132
209
|
"label": "5.6 Luna",
|
|
133
210
|
"enabled": true,
|
|
134
211
|
"family": "GPT",
|
|
135
|
-
"version": "5.6 Luna"
|
|
212
|
+
"version": "5.6 Luna",
|
|
213
|
+
"presentation": {
|
|
214
|
+
"detail": "Efficient"
|
|
215
|
+
}
|
|
136
216
|
},
|
|
137
217
|
{
|
|
138
218
|
"id": "gpt-5.5",
|
|
@@ -146,7 +226,10 @@ export const SCOUT_RUNTIME_CATALOG_DATA = {
|
|
|
146
226
|
"label": "5.5 mini",
|
|
147
227
|
"enabled": true,
|
|
148
228
|
"family": "GPT",
|
|
149
|
-
"version": "5.5 mini"
|
|
229
|
+
"version": "5.5 mini",
|
|
230
|
+
"presentation": {
|
|
231
|
+
"detail": "Fast"
|
|
232
|
+
}
|
|
150
233
|
}
|
|
151
234
|
]
|
|
152
235
|
},
|
|
@@ -162,6 +245,10 @@ export const SCOUT_RUNTIME_CATALOG_DATA = {
|
|
|
162
245
|
"xhigh"
|
|
163
246
|
],
|
|
164
247
|
"defaultReasoningEffort": "high",
|
|
248
|
+
"presentation": {
|
|
249
|
+
"short": "Grok",
|
|
250
|
+
"monogram": "✕"
|
|
251
|
+
},
|
|
165
252
|
"models": [
|
|
166
253
|
{
|
|
167
254
|
"id": "grok-4.6",
|
|
@@ -170,7 +257,10 @@ export const SCOUT_RUNTIME_CATALOG_DATA = {
|
|
|
170
257
|
"default": true,
|
|
171
258
|
"family": "Grok",
|
|
172
259
|
"version": "4.6",
|
|
173
|
-
"contextWindowTokens": 500000
|
|
260
|
+
"contextWindowTokens": 500000,
|
|
261
|
+
"presentation": {
|
|
262
|
+
"detail": "Latest"
|
|
263
|
+
}
|
|
174
264
|
},
|
|
175
265
|
{
|
|
176
266
|
"id": "grok-4.5",
|
|
@@ -193,6 +283,10 @@ export const SCOUT_RUNTIME_CATALOG_DATA = {
|
|
|
193
283
|
"xhigh"
|
|
194
284
|
],
|
|
195
285
|
"defaultReasoningEffort": "high",
|
|
286
|
+
"presentation": {
|
|
287
|
+
"short": "Grok",
|
|
288
|
+
"monogram": "✕"
|
|
289
|
+
},
|
|
196
290
|
"models": [
|
|
197
291
|
{
|
|
198
292
|
"id": "grok-4.6",
|
|
@@ -201,7 +295,10 @@ export const SCOUT_RUNTIME_CATALOG_DATA = {
|
|
|
201
295
|
"default": true,
|
|
202
296
|
"family": "Grok",
|
|
203
297
|
"version": "4.6",
|
|
204
|
-
"contextWindowTokens": 500000
|
|
298
|
+
"contextWindowTokens": 500000,
|
|
299
|
+
"presentation": {
|
|
300
|
+
"detail": "Latest"
|
|
301
|
+
}
|
|
205
302
|
},
|
|
206
303
|
{
|
|
207
304
|
"id": "grok-4.5",
|
|
@@ -218,12 +315,17 @@ export const SCOUT_RUNTIME_CATALOG_DATA = {
|
|
|
218
315
|
"label": "Kimi Code",
|
|
219
316
|
"enabled": true,
|
|
220
317
|
"reasoningEfforts": null,
|
|
318
|
+
"presentation": {
|
|
319
|
+
"short": "Kimi",
|
|
320
|
+
"monogram": "◐"
|
|
321
|
+
},
|
|
221
322
|
"models": []
|
|
222
323
|
},
|
|
223
324
|
{
|
|
224
325
|
"id": "flue",
|
|
225
326
|
"label": "Flue",
|
|
226
327
|
"enabled": true,
|
|
328
|
+
"listed": false,
|
|
227
329
|
"reasoningEfforts": null,
|
|
228
330
|
"models": []
|
|
229
331
|
},
|
package/src/runtime-catalog.ts
CHANGED
|
@@ -28,6 +28,32 @@ function text(value: unknown): string | null {
|
|
|
28
28
|
: null;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
+
function presentation<K extends string>(
|
|
32
|
+
value: unknown,
|
|
33
|
+
path: string,
|
|
34
|
+
errors: string[],
|
|
35
|
+
keys: readonly K[],
|
|
36
|
+
): Record<K, string> | undefined {
|
|
37
|
+
if (value === undefined) return undefined;
|
|
38
|
+
const input = record(value);
|
|
39
|
+
if (!input) {
|
|
40
|
+
errors.push(`${path} must be an object`);
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
const result = {} as Record<K, string>;
|
|
44
|
+
for (const key of keys) {
|
|
45
|
+
const field = input[key];
|
|
46
|
+
if (field === undefined) continue;
|
|
47
|
+
const parsed = text(field);
|
|
48
|
+
if (!parsed) {
|
|
49
|
+
errors.push(`${path}.${key} must be a non-empty trimmed string`);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
result[key] = parsed;
|
|
53
|
+
}
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
|
|
31
57
|
function effortList(value: unknown, path: string, errors: string[]): ScoutReasoningEffort[] | null | undefined {
|
|
32
58
|
if (value === null) return null;
|
|
33
59
|
if (!Array.isArray(value)) {
|
|
@@ -88,6 +114,9 @@ function model(value: unknown, path: string, errors: string[]): ScoutOwnedRuntim
|
|
|
88
114
|
...(defaultEffort && reasoningEfforts.has(defaultEffort)
|
|
89
115
|
? { defaultReasoningEffort: defaultEffort as ScoutReasoningEffort }
|
|
90
116
|
: {}),
|
|
117
|
+
...(input.presentation !== undefined
|
|
118
|
+
? { presentation: presentation(input.presentation, `${path}.presentation`, errors, ["detail"]) }
|
|
119
|
+
: {}),
|
|
91
120
|
};
|
|
92
121
|
}
|
|
93
122
|
|
|
@@ -147,6 +176,9 @@ function harness(value: unknown, path: string, errors: string[]): ScoutOwnedRunt
|
|
|
147
176
|
...(defaultEffort && reasoningEfforts.has(defaultEffort)
|
|
148
177
|
? { defaultReasoningEffort: defaultEffort as ScoutReasoningEffort }
|
|
149
178
|
: {}),
|
|
179
|
+
...(input.presentation !== undefined
|
|
180
|
+
? { presentation: presentation(input.presentation, `${path}.presentation`, errors, ["short", "monogram"]) }
|
|
181
|
+
: {}),
|
|
150
182
|
models,
|
|
151
183
|
};
|
|
152
184
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "openscout.runtime-catalog.v1",
|
|
3
|
-
"revision": "2026-09-
|
|
3
|
+
"revision": "2026-09-24.1",
|
|
4
4
|
"harnesses": [
|
|
5
5
|
{
|
|
6
6
|
"id": "claude",
|
|
@@ -9,11 +9,13 @@
|
|
|
9
9
|
"default": true,
|
|
10
10
|
"reasoningEfforts": ["low", "medium", "high", "xhigh", "max"],
|
|
11
11
|
"defaultReasoningEffort": "medium",
|
|
12
|
+
"presentation": { "short": "Claude", "monogram": "✳" },
|
|
12
13
|
"models": [
|
|
13
|
-
{ "id": "claude-opus-5", "label": "Opus 5", "enabled": true, "default": true, "family": "Opus", "version": "5" },
|
|
14
|
+
{ "id": "claude-opus-5-5", "label": "Opus 5.5", "enabled": true, "default": true, "family": "Opus", "version": "5.5", "contextWindowTokens": 1000000, "presentation": { "detail": "Latest" } },
|
|
15
|
+
{ "id": "claude-opus-5", "label": "Opus 5", "enabled": true, "family": "Opus", "version": "5", "presentation": { "detail": "Deepest" } },
|
|
14
16
|
{ "id": "claude-fable-5", "label": "Fable 5", "enabled": true, "family": "Fable", "version": "5" },
|
|
15
|
-
{ "id": "claude-sonnet-4-6", "label": "Sonnet 4.6", "enabled": true, "family": "Sonnet", "version": "4.6" },
|
|
16
|
-
{ "id": "claude-haiku-4-5", "label": "Haiku 4.5", "enabled": true, "family": "Haiku", "version": "4.5" },
|
|
17
|
+
{ "id": "claude-sonnet-4-6", "label": "Sonnet 4.6", "enabled": true, "family": "Sonnet", "version": "4.6", "presentation": { "detail": "Balanced" } },
|
|
18
|
+
{ "id": "claude-haiku-4-5", "label": "Haiku 4.5", "enabled": true, "family": "Haiku", "version": "4.5", "presentation": { "detail": "Fast" } },
|
|
17
19
|
{ "id": "claude-opus-4-8", "label": "Opus 4.8", "enabled": true, "family": "Opus", "version": "4.8" },
|
|
18
20
|
{ "id": "claude-opus-4-7", "label": "Opus 4.7", "enabled": true, "family": "Opus", "version": "4.7" },
|
|
19
21
|
{ "id": "claude-sonnet-4-5", "label": "Sonnet 4.5", "enabled": true, "family": "Sonnet", "version": "4.5" }
|
|
@@ -25,13 +27,16 @@
|
|
|
25
27
|
"enabled": true,
|
|
26
28
|
"reasoningEfforts": ["low", "medium", "high", "xhigh"],
|
|
27
29
|
"defaultReasoningEffort": "medium",
|
|
30
|
+
"presentation": { "short": "Codex", "monogram": "◈" },
|
|
28
31
|
"models": [
|
|
29
|
-
{ "id": "gpt-6-astra", "label": "6 Astra", "enabled": true, "default": true, "description": "Most capable for complex reasoning, coding, computer use, research, and document creation", "family": "GPT", "version": "6 Astra", "contextWindowTokens": 1050000, "reasoningEfforts": ["low", "medium", "high", "xhigh", "max"] },
|
|
30
|
-
{ "id": "gpt-
|
|
31
|
-
{ "id": "gpt-
|
|
32
|
-
{ "id": "gpt-5.6-
|
|
32
|
+
{ "id": "gpt-6-astra", "label": "6 Astra", "enabled": true, "default": true, "description": "Most capable for complex reasoning, coding, computer use, research, and document creation", "family": "GPT", "version": "6 Astra", "contextWindowTokens": 1050000, "reasoningEfforts": ["low", "medium", "high", "xhigh", "max"], "defaultReasoningEffort": "low", "presentation": { "detail": "Most capable" } },
|
|
33
|
+
{ "id": "gpt-6-sol", "label": "6 Sol", "enabled": true, "description": "Complex coding and agentic workflows", "family": "GPT", "version": "6 Sol", "contextWindowTokens": 272000, "reasoningEfforts": ["low", "medium", "high", "xhigh", "max", "ultra"], "presentation": { "detail": "Coding" } },
|
|
34
|
+
{ "id": "gpt-6-luna", "label": "6 Luna", "enabled": true, "description": "Efficient focused coding and repeatable tasks", "family": "GPT", "version": "6 Luna", "contextWindowTokens": 272000, "reasoningEfforts": ["low", "medium", "high", "xhigh", "max"], "presentation": { "detail": "Efficient" } },
|
|
35
|
+
{ "id": "gpt-5.6-sol", "label": "5.6 Sol", "enabled": true, "family": "GPT", "version": "5.6 Sol", "reasoningEfforts": ["low", "medium", "high", "xhigh", "ultra"], "presentation": { "detail": "Frontier" } },
|
|
36
|
+
{ "id": "gpt-5.6-terra", "label": "5.6 Terra", "enabled": true, "family": "GPT", "version": "5.6 Terra", "reasoningEfforts": ["low", "medium", "high", "xhigh", "ultra"], "presentation": { "detail": "Frontier" } },
|
|
37
|
+
{ "id": "gpt-5.6-luna", "label": "5.6 Luna", "enabled": true, "family": "GPT", "version": "5.6 Luna", "presentation": { "detail": "Efficient" } },
|
|
33
38
|
{ "id": "gpt-5.5", "label": "5.5", "enabled": true, "family": "GPT", "version": "5.5" },
|
|
34
|
-
{ "id": "gpt-5.5-mini", "label": "5.5 mini", "enabled": true, "family": "GPT", "version": "5.5 mini" }
|
|
39
|
+
{ "id": "gpt-5.5-mini", "label": "5.5 mini", "enabled": true, "family": "GPT", "version": "5.5 mini", "presentation": { "detail": "Fast" } }
|
|
35
40
|
]
|
|
36
41
|
},
|
|
37
42
|
{
|
|
@@ -41,8 +46,9 @@
|
|
|
41
46
|
"listed": false,
|
|
42
47
|
"reasoningEfforts": ["low", "medium", "high", "xhigh"],
|
|
43
48
|
"defaultReasoningEffort": "high",
|
|
49
|
+
"presentation": { "short": "Grok", "monogram": "✕" },
|
|
44
50
|
"models": [
|
|
45
|
-
{ "id": "grok-4.6", "label": "Grok 4.6", "enabled": true, "default": true, "family": "Grok", "version": "4.6", "contextWindowTokens": 500000 },
|
|
51
|
+
{ "id": "grok-4.6", "label": "Grok 4.6", "enabled": true, "default": true, "family": "Grok", "version": "4.6", "contextWindowTokens": 500000, "presentation": { "detail": "Latest" } },
|
|
46
52
|
{ "id": "grok-4.5", "label": "Grok 4.5", "enabled": true, "family": "Grok", "version": "4.5", "contextWindowTokens": 500000 }
|
|
47
53
|
]
|
|
48
54
|
},
|
|
@@ -52,13 +58,14 @@
|
|
|
52
58
|
"enabled": true,
|
|
53
59
|
"reasoningEfforts": ["low", "medium", "high", "xhigh"],
|
|
54
60
|
"defaultReasoningEffort": "high",
|
|
61
|
+
"presentation": { "short": "Grok", "monogram": "✕" },
|
|
55
62
|
"models": [
|
|
56
|
-
{ "id": "grok-4.6", "label": "Grok 4.6", "enabled": true, "default": true, "family": "Grok", "version": "4.6", "contextWindowTokens": 500000 },
|
|
63
|
+
{ "id": "grok-4.6", "label": "Grok 4.6", "enabled": true, "default": true, "family": "Grok", "version": "4.6", "contextWindowTokens": 500000, "presentation": { "detail": "Latest" } },
|
|
57
64
|
{ "id": "grok-4.5", "label": "Grok 4.5", "enabled": true, "family": "Grok", "version": "4.5", "contextWindowTokens": 500000 }
|
|
58
65
|
]
|
|
59
66
|
},
|
|
60
|
-
{ "id": "kimi", "label": "Kimi Code", "enabled": true, "reasoningEfforts": null, "models": [] },
|
|
61
|
-
{ "id": "flue", "label": "Flue", "enabled": true, "reasoningEfforts": null, "models": [] },
|
|
67
|
+
{ "id": "kimi", "label": "Kimi Code", "enabled": true, "reasoningEfforts": null, "presentation": { "short": "Kimi", "monogram": "◐" }, "models": [] },
|
|
68
|
+
{ "id": "flue", "label": "Flue", "enabled": true, "listed": false, "reasoningEfforts": null, "models": [] },
|
|
62
69
|
{ "id": "cursor", "label": "Cursor CLI", "enabled": true, "reasoningEfforts": null, "models": [] },
|
|
63
70
|
{
|
|
64
71
|
"id": "opencode",
|