@openscout/protocol 0.2.94 → 0.2.96

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.
@@ -4,6 +4,7 @@ export declare const scoutBrokerPaths: {
4
4
  readonly home: "/v1/home";
5
5
  readonly node: "/v1/node";
6
6
  readonly snapshot: "/v1/snapshot";
7
+ readonly conversationProjection: "/v1/conversation-projection";
7
8
  readonly capabilities: "/v1/capabilities";
8
9
  readonly runtimeCatalog: "/v1/runtime-catalog";
9
10
  readonly topologySnapshot: "/v1/topology/snapshot";
@@ -1 +1 @@
1
- {"version":3,"file":"broker-routes.d.ts","sourceRoot":"","sources":["../src/broker-routes.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCnB,CAAC;AAEX,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAG3E;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAKvE;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,+BAA+B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,wBAAgB,kCAAkC,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE/E"}
1
+ {"version":3,"file":"broker-routes.d.ts","sourceRoot":"","sources":["../src/broker-routes.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCnB,CAAC;AAEX,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAG3E;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAKvE;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,+BAA+B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,wBAAgB,kCAAkC,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE/E"}
@@ -7,6 +7,7 @@ export const scoutBrokerPaths = {
7
7
  home: "/v1/home",
8
8
  node: "/v1/node",
9
9
  snapshot: "/v1/snapshot",
10
+ conversationProjection: "/v1/conversation-projection",
10
11
  capabilities: "/v1/capabilities",
11
12
  runtimeCatalog: "/v1/runtime-catalog",
12
13
  topologySnapshot: "/v1/topology/snapshot",
@@ -0,0 +1,100 @@
1
+ import type { ConversationKind } from "./conversations.js";
2
+ import type { ObservedActivity } from "./observed-status.js";
3
+ export declare const CONVERSATION_PROJECTION_VERSION = 1;
4
+ export type ConversationProjectionEntityKind = "scout_conversation" | "observed_session";
5
+ export type ConversationProjectionVisibility = "visible" | "hidden";
6
+ export type ConversationProjectionItem = {
7
+ feedId: string;
8
+ entityKind: ConversationProjectionEntityKind;
9
+ kind: ConversationKind | "observed_session";
10
+ conversationId: string | null;
11
+ runtimeSessionId: string | null;
12
+ source: string | null;
13
+ sourceSessionId: string | null;
14
+ title: string | null;
15
+ alias: string | null;
16
+ naturalKey: string | null;
17
+ projectRoot: string | null;
18
+ harness: string | null;
19
+ model: string | null;
20
+ effort: string | null;
21
+ agentId: string | null;
22
+ agentName: string | null;
23
+ currentBranch: string | null;
24
+ authorityNodeId: string | null;
25
+ authorityNodeName: string | null;
26
+ parentConversationId: string | null;
27
+ anchorMessageId: string | null;
28
+ activityState: ObservedActivity;
29
+ lastMessageId: string | null;
30
+ lastMessageAt: number | null;
31
+ lastActivityAt: number;
32
+ messageCount: number;
33
+ unreadCount: number;
34
+ participantCount: number;
35
+ preview: string | null;
36
+ lastEngagedAt: number | null;
37
+ sourceFreshAt: number | null;
38
+ visibilityState: ConversationProjectionVisibility;
39
+ updatedSeq: number;
40
+ updatedAt: number;
41
+ };
42
+ export type ConversationProjectionIdentityRedirect = {
43
+ fromFeedId: string;
44
+ toFeedId: string;
45
+ };
46
+ export type ConversationProjectionDelta = {
47
+ upserted: ConversationProjectionItem[];
48
+ notVisible: string[];
49
+ hardDeleted: string[];
50
+ identityRedirects: ConversationProjectionIdentityRedirect[];
51
+ };
52
+ export type ConversationProjectionEvent = {
53
+ projectionId: string;
54
+ seq: number;
55
+ ts: number;
56
+ delta: ConversationProjectionDelta;
57
+ };
58
+ export type ConversationProjectionCursor = {
59
+ projectionId: string;
60
+ seq: number;
61
+ };
62
+ export type ConversationProjectionSnapshot = {
63
+ projectionId: string;
64
+ projectionVersion: number;
65
+ sequence: number;
66
+ generatedAt: number;
67
+ sourceFreshAt: number | null;
68
+ items: ConversationProjectionItem[];
69
+ total: number;
70
+ hasMore: boolean;
71
+ engagedFeedId: string | null;
72
+ identityRedirects: ConversationProjectionIdentityRedirect[];
73
+ };
74
+ export type ConversationThreadLaunchSnapshot = {
75
+ projectionId: string;
76
+ projectionVersion: number;
77
+ /**
78
+ * Material projection sequence used only to order complete native artifact
79
+ * replacements. Paging uses the independent opaque `cursor` below.
80
+ */
81
+ sequence: number;
82
+ feedId: string;
83
+ entityKind: "scout_conversation";
84
+ conversationId: string;
85
+ cursor: string | null;
86
+ hasEarlier: boolean;
87
+ generatedAt: number;
88
+ messages: Array<{
89
+ id: string;
90
+ actorId: string;
91
+ actorName: string | null;
92
+ body: string;
93
+ class: string;
94
+ createdAt: number;
95
+ }>;
96
+ };
97
+ export declare function scoutConversationFeedId(conversationId: string): string;
98
+ export declare function observedSessionFeedId(source: string, sourceSessionId: string): string;
99
+ export declare function compareConversationProjectionItems(left: Pick<ConversationProjectionItem, "feedId" | "lastActivityAt">, right: Pick<ConversationProjectionItem, "feedId" | "lastActivityAt">): number;
100
+ //# sourceMappingURL=conversation-projection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-projection.d.ts","sourceRoot":"","sources":["../src/conversation-projection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export const CONVERSATION_PROJECTION_VERSION = 1;
2
+ export function scoutConversationFeedId(conversationId) {
3
+ return `conv:${conversationId}`;
4
+ }
5
+ export function observedSessionFeedId(source, sourceSessionId) {
6
+ return `obs:${source}:${sourceSessionId}`;
7
+ }
8
+ export function compareConversationProjectionItems(left, right) {
9
+ return right.lastActivityAt - left.lastActivityAt
10
+ || left.feedId.localeCompare(right.feedId);
11
+ }
package/dist/index.d.ts CHANGED
@@ -8,6 +8,7 @@ export * from "./scout-agent-card.js";
8
8
  export * from "./relay-agent-card.js";
9
9
  export * from "./mesh.js";
10
10
  export * from "./conversations.js";
11
+ export * from "./conversation-projection.js";
11
12
  export * from "./channel-identity.js";
12
13
  export * from "./collaboration.js";
13
14
  export * from "./assigned-roles.js";
@@ -27,6 +28,7 @@ export * from "./harness-feature-support.js";
27
28
  export * from "./host-integrations.js";
28
29
  export * from "./native-interactions.js";
29
30
  export * from "./session-display-state.js";
31
+ export * from "./session-handle.js";
30
32
  export * from "./capability-matrix.js";
31
33
  export * from "./debug-attach.js";
32
34
  export * from "./scout-dispatch.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC"}
package/dist/index.js CHANGED
@@ -8,6 +8,7 @@ export * from "./scout-agent-card.js";
8
8
  export * from "./relay-agent-card.js";
9
9
  export * from "./mesh.js";
10
10
  export * from "./conversations.js";
11
+ export * from "./conversation-projection.js";
11
12
  export * from "./channel-identity.js";
12
13
  export * from "./collaboration.js";
13
14
  export * from "./assigned-roles.js";
@@ -27,6 +28,7 @@ export * from "./harness-feature-support.js";
27
28
  export * from "./host-integrations.js";
28
29
  export * from "./native-interactions.js";
29
30
  export * from "./session-display-state.js";
31
+ export * from "./session-handle.js";
30
32
  export * from "./capability-matrix.js";
31
33
  export * from "./debug-attach.js";
32
34
  export * from "./scout-dispatch.js";
@@ -11,6 +11,7 @@ export type RouteAliasTarget = {
11
11
  nodeId: ScoutId;
12
12
  } | {
13
13
  kind: "session";
14
+ /** Opaque broker handle; the remaining fields are a pinned resolution receipt, not session identity. */
14
15
  sessionId: ScoutId;
15
16
  agentId: ScoutId;
16
17
  endpointId: ScoutId;
@@ -1 +1 @@
1
- {"version":3,"file":"route-aliases.d.ts","sourceRoot":"","sources":["../src/route-aliases.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route-aliases.d.ts","sourceRoot":"","sources":["../src/route-aliases.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  export declare const SCOUT_RUNTIME_CATALOG_DATA: {
2
2
  readonly schemaVersion: "openscout.runtime-catalog.v1";
3
- readonly revision: "2026-08-18.1";
3
+ readonly revision: "2026-09-01.1";
4
4
  readonly harnesses: readonly [{
5
5
  readonly id: "claude";
6
6
  readonly label: "Claude Code";
@@ -15,6 +15,12 @@ export declare const SCOUT_RUNTIME_CATALOG_DATA: {
15
15
  readonly default: true;
16
16
  readonly family: "Opus";
17
17
  readonly version: "5";
18
+ }, {
19
+ readonly id: "claude-fable-5";
20
+ readonly label: "Fable 5";
21
+ readonly enabled: true;
22
+ readonly family: "Fable";
23
+ readonly version: "5";
18
24
  }, {
19
25
  readonly id: "claude-sonnet-4-6";
20
26
  readonly label: "Sonnet 4.6";
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-catalog.generated.d.ts","sourceRoot":"","sources":["../src/runtime-catalog.generated.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyS7B,CAAC"}
1
+ {"version":3,"file":"runtime-catalog.generated.d.ts","sourceRoot":"","sources":["../src/runtime-catalog.generated.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgT7B,CAAC"}
@@ -1,7 +1,7 @@
1
1
  // Generated automatically from runtime-catalog.v1.json. Do not edit.
2
2
  export const SCOUT_RUNTIME_CATALOG_DATA = {
3
3
  "schemaVersion": "openscout.runtime-catalog.v1",
4
- "revision": "2026-08-18.1",
4
+ "revision": "2026-09-01.1",
5
5
  "harnesses": [
6
6
  {
7
7
  "id": "claude",
@@ -25,6 +25,13 @@ export const SCOUT_RUNTIME_CATALOG_DATA = {
25
25
  "family": "Opus",
26
26
  "version": "5"
27
27
  },
28
+ {
29
+ "id": "claude-fable-5",
30
+ "label": "Fable 5",
31
+ "enabled": true,
32
+ "family": "Fable",
33
+ "version": "5"
34
+ },
28
35
  {
29
36
  "id": "claude-sonnet-4-6",
30
37
  "label": "Sonnet 4.6",
@@ -43,6 +43,7 @@ export type ScoutRouteTarget = {
43
43
  value?: string;
44
44
  } | {
45
45
  kind: "session_id";
46
+ /** Canonical writes use a broker `sess.*` handle. Native ids are legacy resolver inputs only. */
46
47
  sessionId: ScoutId;
47
48
  harness?: AgentHarness;
48
49
  value?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"scout-dispatch.d.ts","sourceRoot":"","sources":["../src/scout-dispatch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scout-dispatch.d.ts","sourceRoot":"","sources":["../src/scout-dispatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * A broker-owned, opaque pointer to one concrete harness context.
3
+ *
4
+ * The token carries no agent, profile, project, harness, or node semantics.
5
+ * Those facts belong to the broker's resolution record and may change without
6
+ * changing the public address grammar.
7
+ */
8
+ export type ScoutSessionHandle = `sess.${string}`;
9
+ export declare const SCOUT_SESSION_HANDLE_PREFIX: "sess.";
10
+ export declare const SCOUT_SESSION_ADDRESS_PREFIX: "session:";
11
+ export declare const SCOUT_CANONICAL_SESSION_HANDLE_PATTERN: RegExp;
12
+ export declare function isScoutSessionHandle(value: string | null | undefined): value is ScoutSessionHandle;
13
+ export declare function parseScoutSessionAddress(value: string | null | undefined): ScoutSessionHandle | null;
14
+ export declare function formatScoutSessionAddress(handle: ScoutSessionHandle): string;
15
+ //# sourceMappingURL=session-handle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-handle.d.ts","sourceRoot":"","sources":["../src/session-handle.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,MAAM,EAAE,CAAC;AAElD,eAAO,MAAM,2BAA2B,EAAG,OAAgB,CAAC;AAC5D,eAAO,MAAM,4BAA4B,EAAG,UAAmB,CAAC;AAIhE,eAAO,MAAM,sCAAsC,QAAiC,CAAC;AAErF,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,KAAK,IAAI,kBAAkB,CAG7B;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,kBAAkB,GAAG,IAAI,CAO3B;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAE5E"}
@@ -0,0 +1,21 @@
1
+ export const SCOUT_SESSION_HANDLE_PREFIX = "sess.";
2
+ export const SCOUT_SESSION_ADDRESS_PREFIX = "session:";
3
+ // Current broker projections use 20 lowercase hex characters. Accept a wider
4
+ // URL-safe token alphabet so the encoding can evolve without changing callers.
5
+ export const SCOUT_CANONICAL_SESSION_HANDLE_PATTERN = /^sess\.[A-Za-z0-9_-]{10,64}$/;
6
+ export function isScoutSessionHandle(value) {
7
+ return typeof value === "string"
8
+ && SCOUT_CANONICAL_SESSION_HANDLE_PATTERN.test(value);
9
+ }
10
+ export function parseScoutSessionAddress(value) {
11
+ if (typeof value !== "string")
12
+ return null;
13
+ const trimmed = value.trim();
14
+ const handle = trimmed.startsWith(SCOUT_SESSION_ADDRESS_PREFIX)
15
+ ? trimmed.slice(SCOUT_SESSION_ADDRESS_PREFIX.length)
16
+ : trimmed;
17
+ return isScoutSessionHandle(handle) ? handle : null;
18
+ }
19
+ export function formatScoutSessionAddress(handle) {
20
+ return `${SCOUT_SESSION_ADDRESS_PREFIX}${handle}`;
21
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openscout/protocol",
3
- "version": "0.2.94",
3
+ "version": "0.2.96",
4
4
  "description": "Typed protocol for the OpenScout local control plane",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -57,5 +57,5 @@
57
57
  "devDependencies": {
58
58
  "typescript": "^5"
59
59
  },
60
- "gitHead": "23bcb0d2821b93066f0eb79f88d622777d8170e0"
60
+ "gitHead": "32b205d7fbc6d0be7768f208eabcecbd7fa371b6"
61
61
  }
@@ -8,6 +8,7 @@ export const scoutBrokerPaths = {
8
8
  home: "/v1/home",
9
9
  node: "/v1/node",
10
10
  snapshot: "/v1/snapshot",
11
+ conversationProjection: "/v1/conversation-projection",
11
12
  capabilities: "/v1/capabilities",
12
13
  runtimeCatalog: "/v1/runtime-catalog",
13
14
  topologySnapshot: "/v1/topology/snapshot",
@@ -0,0 +1,124 @@
1
+ import type { ConversationKind } from "./conversations.js";
2
+ import type { ObservedActivity } from "./observed-status.js";
3
+
4
+ export const CONVERSATION_PROJECTION_VERSION = 1;
5
+
6
+ export type ConversationProjectionEntityKind =
7
+ | "scout_conversation"
8
+ | "observed_session";
9
+
10
+ export type ConversationProjectionVisibility = "visible" | "hidden";
11
+
12
+ export type ConversationProjectionItem = {
13
+ feedId: string;
14
+ entityKind: ConversationProjectionEntityKind;
15
+ kind: ConversationKind | "observed_session";
16
+ conversationId: string | null;
17
+ runtimeSessionId: string | null;
18
+ source: string | null;
19
+ sourceSessionId: string | null;
20
+ title: string | null;
21
+ alias: string | null;
22
+ naturalKey: string | null;
23
+ projectRoot: string | null;
24
+ harness: string | null;
25
+ model: string | null;
26
+ effort: string | null;
27
+ agentId: string | null;
28
+ agentName: string | null;
29
+ currentBranch: string | null;
30
+ authorityNodeId: string | null;
31
+ authorityNodeName: string | null;
32
+ parentConversationId: string | null;
33
+ anchorMessageId: string | null;
34
+ activityState: ObservedActivity;
35
+ lastMessageId: string | null;
36
+ lastMessageAt: number | null;
37
+ lastActivityAt: number;
38
+ messageCount: number;
39
+ unreadCount: number;
40
+ participantCount: number;
41
+ preview: string | null;
42
+ lastEngagedAt: number | null;
43
+ sourceFreshAt: number | null;
44
+ visibilityState: ConversationProjectionVisibility;
45
+ updatedSeq: number;
46
+ updatedAt: number;
47
+ };
48
+
49
+ export type ConversationProjectionIdentityRedirect = {
50
+ fromFeedId: string;
51
+ toFeedId: string;
52
+ };
53
+
54
+ export type ConversationProjectionDelta = {
55
+ upserted: ConversationProjectionItem[];
56
+ notVisible: string[];
57
+ hardDeleted: string[];
58
+ identityRedirects: ConversationProjectionIdentityRedirect[];
59
+ };
60
+
61
+ export type ConversationProjectionEvent = {
62
+ projectionId: string;
63
+ seq: number;
64
+ ts: number;
65
+ delta: ConversationProjectionDelta;
66
+ };
67
+
68
+ export type ConversationProjectionCursor = {
69
+ projectionId: string;
70
+ seq: number;
71
+ };
72
+
73
+ export type ConversationProjectionSnapshot = {
74
+ projectionId: string;
75
+ projectionVersion: number;
76
+ sequence: number;
77
+ generatedAt: number;
78
+ sourceFreshAt: number | null;
79
+ items: ConversationProjectionItem[];
80
+ total: number;
81
+ hasMore: boolean;
82
+ engagedFeedId: string | null;
83
+ identityRedirects: ConversationProjectionIdentityRedirect[];
84
+ };
85
+
86
+ export type ConversationThreadLaunchSnapshot = {
87
+ projectionId: string;
88
+ projectionVersion: number;
89
+ /**
90
+ * Material projection sequence used only to order complete native artifact
91
+ * replacements. Paging uses the independent opaque `cursor` below.
92
+ */
93
+ sequence: number;
94
+ feedId: string;
95
+ entityKind: "scout_conversation";
96
+ conversationId: string;
97
+ cursor: string | null;
98
+ hasEarlier: boolean;
99
+ generatedAt: number;
100
+ messages: Array<{
101
+ id: string;
102
+ actorId: string;
103
+ actorName: string | null;
104
+ body: string;
105
+ class: string;
106
+ createdAt: number;
107
+ }>;
108
+ };
109
+
110
+ export function scoutConversationFeedId(conversationId: string): string {
111
+ return `conv:${conversationId}`;
112
+ }
113
+
114
+ export function observedSessionFeedId(source: string, sourceSessionId: string): string {
115
+ return `obs:${source}:${sourceSessionId}`;
116
+ }
117
+
118
+ export function compareConversationProjectionItems(
119
+ left: Pick<ConversationProjectionItem, "feedId" | "lastActivityAt">,
120
+ right: Pick<ConversationProjectionItem, "feedId" | "lastActivityAt">,
121
+ ): number {
122
+ return right.lastActivityAt - left.lastActivityAt
123
+ || left.feedId.localeCompare(right.feedId);
124
+ }
package/src/index.ts CHANGED
@@ -8,6 +8,7 @@ export * from "./scout-agent-card.js";
8
8
  export * from "./relay-agent-card.js";
9
9
  export * from "./mesh.js";
10
10
  export * from "./conversations.js";
11
+ export * from "./conversation-projection.js";
11
12
  export * from "./channel-identity.js";
12
13
  export * from "./collaboration.js";
13
14
  export * from "./assigned-roles.js";
@@ -27,6 +28,7 @@ export * from "./harness-feature-support.js";
27
28
  export * from "./host-integrations.js";
28
29
  export * from "./native-interactions.js";
29
30
  export * from "./session-display-state.js";
31
+ export * from "./session-handle.js";
30
32
  export * from "./capability-matrix.js";
31
33
  export * from "./debug-attach.js";
32
34
  export * from "./scout-dispatch.js";
@@ -11,6 +11,7 @@ export type RouteAliasTarget =
11
11
  | { kind: "agent"; agentId: ScoutId; nodeId: ScoutId }
12
12
  | {
13
13
  kind: "session";
14
+ /** Opaque broker handle; the remaining fields are a pinned resolution receipt, not session identity. */
14
15
  sessionId: ScoutId;
15
16
  agentId: ScoutId;
16
17
  endpointId: ScoutId;
@@ -2,7 +2,7 @@
2
2
 
3
3
  export const SCOUT_RUNTIME_CATALOG_DATA = {
4
4
  "schemaVersion": "openscout.runtime-catalog.v1",
5
- "revision": "2026-08-18.1",
5
+ "revision": "2026-09-01.1",
6
6
  "harnesses": [
7
7
  {
8
8
  "id": "claude",
@@ -26,6 +26,13 @@ export const SCOUT_RUNTIME_CATALOG_DATA = {
26
26
  "family": "Opus",
27
27
  "version": "5"
28
28
  },
29
+ {
30
+ "id": "claude-fable-5",
31
+ "label": "Fable 5",
32
+ "enabled": true,
33
+ "family": "Fable",
34
+ "version": "5"
35
+ },
29
36
  {
30
37
  "id": "claude-sonnet-4-6",
31
38
  "label": "Sonnet 4.6",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": "openscout.runtime-catalog.v1",
3
- "revision": "2026-08-18.1",
3
+ "revision": "2026-09-01.1",
4
4
  "harnesses": [
5
5
  {
6
6
  "id": "claude",
@@ -11,6 +11,7 @@
11
11
  "defaultReasoningEffort": "medium",
12
12
  "models": [
13
13
  { "id": "claude-opus-5", "label": "Opus 5", "enabled": true, "default": true, "family": "Opus", "version": "5" },
14
+ { "id": "claude-fable-5", "label": "Fable 5", "enabled": true, "family": "Fable", "version": "5" },
14
15
  { "id": "claude-sonnet-4-6", "label": "Sonnet 4.6", "enabled": true, "family": "Sonnet", "version": "4.6" },
15
16
  { "id": "claude-haiku-4-5", "label": "Haiku 4.5", "enabled": true, "family": "Haiku", "version": "4.5" },
16
17
  { "id": "claude-opus-4-8", "label": "Opus 4.8", "enabled": true, "family": "Opus", "version": "4.8" },
@@ -43,7 +43,13 @@ export type ScoutRouteTarget =
43
43
  }
44
44
  | { kind: "route_alias"; alias: string; scope?: RouteAliasScope; bindingId?: ScoutId; value?: string }
45
45
  | { kind: "target_handle"; handle: string; value?: string }
46
- | { kind: "session_id"; sessionId: ScoutId; harness?: AgentHarness; value?: string }
46
+ | {
47
+ kind: "session_id";
48
+ /** Canonical writes use a broker `sess.*` handle. Native ids are legacy resolver inputs only. */
49
+ sessionId: ScoutId;
50
+ harness?: AgentHarness;
51
+ value?: string;
52
+ }
47
53
  | { kind: "binding_ref"; ref: string; value?: string }
48
54
  | { kind: "project_path"; projectPath: string; value?: string }
49
55
  | { kind: "channel"; channel: string; value?: string }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * A broker-owned, opaque pointer to one concrete harness context.
3
+ *
4
+ * The token carries no agent, profile, project, harness, or node semantics.
5
+ * Those facts belong to the broker's resolution record and may change without
6
+ * changing the public address grammar.
7
+ */
8
+ export type ScoutSessionHandle = `sess.${string}`;
9
+
10
+ export const SCOUT_SESSION_HANDLE_PREFIX = "sess." as const;
11
+ export const SCOUT_SESSION_ADDRESS_PREFIX = "session:" as const;
12
+
13
+ // Current broker projections use 20 lowercase hex characters. Accept a wider
14
+ // URL-safe token alphabet so the encoding can evolve without changing callers.
15
+ export const SCOUT_CANONICAL_SESSION_HANDLE_PATTERN = /^sess\.[A-Za-z0-9_-]{10,64}$/;
16
+
17
+ export function isScoutSessionHandle(
18
+ value: string | null | undefined,
19
+ ): value is ScoutSessionHandle {
20
+ return typeof value === "string"
21
+ && SCOUT_CANONICAL_SESSION_HANDLE_PATTERN.test(value);
22
+ }
23
+
24
+ export function parseScoutSessionAddress(
25
+ value: string | null | undefined,
26
+ ): ScoutSessionHandle | null {
27
+ if (typeof value !== "string") return null;
28
+ const trimmed = value.trim();
29
+ const handle = trimmed.startsWith(SCOUT_SESSION_ADDRESS_PREFIX)
30
+ ? trimmed.slice(SCOUT_SESSION_ADDRESS_PREFIX.length)
31
+ : trimmed;
32
+ return isScoutSessionHandle(handle) ? handle : null;
33
+ }
34
+
35
+ export function formatScoutSessionAddress(handle: ScoutSessionHandle): string {
36
+ return `${SCOUT_SESSION_ADDRESS_PREFIX}${handle}`;
37
+ }