@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.
Files changed (216) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +103 -52
  3. package/dist/a2a.d.ts +224 -0
  4. package/dist/a2a.d.ts.map +1 -0
  5. package/dist/a2a.js +225 -0
  6. package/dist/activity.d.ts +70 -0
  7. package/dist/activity.d.ts.map +1 -0
  8. package/dist/activity.js +1 -0
  9. package/dist/actors.d.ts +7 -3
  10. package/dist/actors.d.ts.map +1 -0
  11. package/dist/actors.js +15 -1
  12. package/dist/agent-broker-feed.d.ts +84 -0
  13. package/dist/agent-broker-feed.d.ts.map +1 -0
  14. package/dist/agent-broker-feed.js +1 -0
  15. package/dist/agent-identity.d.ts +23 -0
  16. package/dist/agent-identity.d.ts.map +1 -0
  17. package/dist/agent-identity.js +122 -8
  18. package/dist/agent-runs.d.ts +191 -0
  19. package/dist/agent-runs.d.ts.map +1 -0
  20. package/dist/agent-runs.js +365 -0
  21. package/dist/assigned-roles.d.ts +205 -0
  22. package/dist/assigned-roles.d.ts.map +1 -0
  23. package/dist/assigned-roles.js +228 -0
  24. package/dist/broker-routes.d.ts +40 -0
  25. package/dist/broker-routes.d.ts.map +1 -0
  26. package/dist/broker-routes.js +56 -0
  27. package/dist/budget.d.ts +65 -0
  28. package/dist/budget.d.ts.map +1 -0
  29. package/dist/budget.js +19 -0
  30. package/dist/capability-matrix.d.ts +230 -0
  31. package/dist/capability-matrix.d.ts.map +1 -0
  32. package/dist/capability-matrix.js +304 -0
  33. package/dist/channel-identity.d.ts +40 -0
  34. package/dist/channel-identity.d.ts.map +1 -0
  35. package/dist/channel-identity.js +108 -0
  36. package/dist/collaboration.d.ts +45 -16
  37. package/dist/collaboration.d.ts.map +1 -0
  38. package/dist/collaboration.js +39 -23
  39. package/dist/common.d.ts +4 -3
  40. package/dist/common.d.ts.map +1 -0
  41. package/dist/conversations.d.ts +1 -0
  42. package/dist/conversations.d.ts.map +1 -0
  43. package/dist/cursor-transport.d.ts +22 -0
  44. package/dist/cursor-transport.d.ts.map +1 -0
  45. package/dist/cursor-transport.js +10 -0
  46. package/dist/debug-attach.d.ts +29 -0
  47. package/dist/debug-attach.d.ts.map +1 -0
  48. package/dist/debug-attach.js +6 -0
  49. package/dist/deliveries.d.ts +16 -2
  50. package/dist/deliveries.d.ts.map +1 -0
  51. package/dist/durable-actions.d.ts +94 -0
  52. package/dist/durable-actions.d.ts.map +1 -0
  53. package/dist/durable-actions.js +1 -0
  54. package/dist/events.d.ts +27 -1
  55. package/dist/events.d.ts.map +1 -0
  56. package/dist/events.js +14 -1
  57. package/dist/harness-feature-support.d.ts +76 -0
  58. package/dist/harness-feature-support.d.ts.map +1 -0
  59. package/dist/harness-feature-support.js +29 -0
  60. package/dist/host-integrations.d.ts +22 -0
  61. package/dist/host-integrations.d.ts.map +1 -0
  62. package/dist/host-integrations.js +64 -0
  63. package/dist/inbox.d.ts +50 -0
  64. package/dist/inbox.d.ts.map +1 -0
  65. package/dist/inbox.js +9 -0
  66. package/dist/index.d.ts +36 -2
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +35 -2
  69. package/dist/invocations.d.ts +121 -0
  70. package/dist/invocations.d.ts.map +1 -0
  71. package/dist/invocations.js +201 -1
  72. package/dist/mesh.d.ts +98 -0
  73. package/dist/mesh.d.ts.map +1 -0
  74. package/dist/mesh.js +18 -1
  75. package/dist/messages.d.ts +3 -0
  76. package/dist/messages.d.ts.map +1 -0
  77. package/dist/native-interactions.d.ts +30 -0
  78. package/dist/native-interactions.d.ts.map +1 -0
  79. package/dist/native-interactions.js +51 -0
  80. package/dist/observed-status.d.ts +33 -0
  81. package/dist/observed-status.d.ts.map +1 -0
  82. package/dist/observed-status.js +6 -0
  83. package/dist/orchestrator-prompt.d.ts +10 -0
  84. package/dist/orchestrator-prompt.d.ts.map +1 -0
  85. package/dist/orchestrator-prompt.js +36 -0
  86. package/dist/permission-policy.d.ts +5 -0
  87. package/dist/permission-policy.d.ts.map +1 -0
  88. package/dist/permission-policy.js +15 -0
  89. package/dist/provisional-agent-names.d.ts +30 -0
  90. package/dist/provisional-agent-names.d.ts.map +1 -0
  91. package/dist/provisional-agent-names.js +224 -0
  92. package/dist/read-receipts.d.ts +12 -0
  93. package/dist/read-receipts.d.ts.map +1 -0
  94. package/dist/read-receipts.js +1 -0
  95. package/dist/relay-agent-card.d.ts +10 -0
  96. package/dist/relay-agent-card.d.ts.map +1 -0
  97. package/dist/rendezvous.d.ts +97 -0
  98. package/dist/rendezvous.d.ts.map +1 -0
  99. package/dist/rendezvous.js +35 -0
  100. package/dist/reserved-vocabulary.d.ts +21 -0
  101. package/dist/reserved-vocabulary.d.ts.map +1 -0
  102. package/dist/reserved-vocabulary.js +101 -0
  103. package/dist/route-aliases.d.ts +112 -0
  104. package/dist/route-aliases.d.ts.map +1 -0
  105. package/dist/route-aliases.js +1 -0
  106. package/dist/runtime-catalog-contract.d.ts +39 -0
  107. package/dist/runtime-catalog-contract.d.ts.map +1 -0
  108. package/dist/runtime-catalog-contract.js +17 -0
  109. package/dist/runtime-catalog.d.ts +11 -0
  110. package/dist/runtime-catalog.d.ts.map +1 -0
  111. package/dist/runtime-catalog.generated.d.ts +230 -0
  112. package/dist/runtime-catalog.generated.d.ts.map +1 -0
  113. package/dist/runtime-catalog.generated.js +299 -0
  114. package/dist/runtime-catalog.js +192 -0
  115. package/dist/runtime-execution.d.ts +161 -0
  116. package/dist/runtime-execution.d.ts.map +1 -0
  117. package/dist/runtime-execution.js +327 -0
  118. package/dist/runtime-profiles.d.ts +12 -0
  119. package/dist/runtime-profiles.d.ts.map +1 -0
  120. package/dist/runtime-profiles.js +20 -0
  121. package/dist/scout-agent-card.d.ts +10 -0
  122. package/dist/scout-agent-card.d.ts.map +1 -0
  123. package/dist/scout-composer.d.ts +27 -0
  124. package/dist/scout-composer.d.ts.map +1 -0
  125. package/dist/scout-composer.js +192 -0
  126. package/dist/scout-delivery.d.ts +101 -4
  127. package/dist/scout-delivery.d.ts.map +1 -0
  128. package/dist/scout-dispatch.d.ts +44 -3
  129. package/dist/scout-dispatch.d.ts.map +1 -0
  130. package/dist/scout-reply-context.d.ts +14 -0
  131. package/dist/scout-reply-context.d.ts.map +1 -0
  132. package/dist/scout-reply-context.js +1 -0
  133. package/dist/session-display-state.d.ts +132 -0
  134. package/dist/session-display-state.d.ts.map +1 -0
  135. package/dist/session-display-state.js +94 -0
  136. package/dist/terminal-host-topology.d.ts +119 -0
  137. package/dist/terminal-host-topology.d.ts.map +1 -0
  138. package/dist/terminal-host-topology.js +21 -0
  139. package/dist/terminal-sessions.d.ts +142 -0
  140. package/dist/terminal-sessions.d.ts.map +1 -0
  141. package/dist/terminal-sessions.js +81 -0
  142. package/dist/terminal-surface-id.d.ts +73 -0
  143. package/dist/terminal-surface-id.d.ts.map +1 -0
  144. package/dist/terminal-surface-id.js +162 -0
  145. package/dist/terminal-workspaces.d.ts +199 -0
  146. package/dist/terminal-workspaces.d.ts.map +1 -0
  147. package/dist/terminal-workspaces.js +287 -0
  148. package/dist/thread-events.d.ts +1 -0
  149. package/dist/thread-events.d.ts.map +1 -0
  150. package/dist/time.d.ts +16 -0
  151. package/dist/time.d.ts.map +1 -0
  152. package/dist/time.js +33 -0
  153. package/dist/transports.d.ts +1 -0
  154. package/dist/transports.d.ts.map +1 -0
  155. package/package.json +37 -9
  156. package/src/a2a.ts +471 -0
  157. package/src/activity.ts +113 -0
  158. package/src/actors.ts +42 -8
  159. package/src/agent-broker-feed.ts +102 -0
  160. package/src/agent-identity.ts +143 -8
  161. package/src/agent-runs.ts +675 -0
  162. package/src/assigned-roles.ts +437 -0
  163. package/src/broker-routes.ts +62 -0
  164. package/src/budget.ts +88 -0
  165. package/src/capability-matrix.ts +648 -0
  166. package/src/channel-identity.ts +147 -0
  167. package/src/collaboration.ts +78 -48
  168. package/src/common.ts +24 -5
  169. package/src/cursor-transport.ts +34 -0
  170. package/src/debug-attach.ts +38 -0
  171. package/src/deliveries.ts +16 -1
  172. package/src/durable-actions.ts +125 -0
  173. package/src/events.ts +31 -0
  174. package/src/harness-feature-support.ts +116 -0
  175. package/src/host-integrations.ts +104 -0
  176. package/src/inbox.ts +68 -0
  177. package/src/index.ts +35 -2
  178. package/src/invocations.ts +353 -0
  179. package/src/mesh.ts +130 -0
  180. package/src/messages.ts +2 -0
  181. package/src/native-interactions.ts +100 -0
  182. package/src/observed-status.ts +90 -0
  183. package/src/orchestrator-prompt.ts +47 -0
  184. package/src/permission-policy.ts +21 -0
  185. package/src/provisional-agent-names.ts +272 -0
  186. package/src/read-receipts.ts +12 -0
  187. package/src/relay-agent-card.ts +73 -63
  188. package/src/rendezvous.ts +154 -0
  189. package/src/reserved-vocabulary.ts +135 -0
  190. package/src/route-aliases.ts +130 -0
  191. package/src/runtime-catalog-contract.ts +60 -0
  192. package/src/runtime-catalog.generated.ts +300 -0
  193. package/src/runtime-catalog.md +21 -0
  194. package/src/runtime-catalog.ts +193 -0
  195. package/src/runtime-catalog.v1.json +81 -0
  196. package/src/runtime-execution.ts +545 -0
  197. package/src/runtime-profiles.ts +37 -0
  198. package/src/scout-agent-card.ts +10 -0
  199. package/src/scout-composer.ts +249 -0
  200. package/src/scout-delivery.ts +117 -4
  201. package/src/scout-dispatch.ts +34 -2
  202. package/src/scout-reply-context.ts +15 -0
  203. package/src/session-display-state.ts +202 -0
  204. package/src/terminal-host-topology.ts +132 -0
  205. package/src/terminal-sessions.ts +187 -0
  206. package/src/terminal-surface-id.ts +189 -0
  207. package/src/terminal-workspaces.ts +455 -0
  208. package/src/time.ts +49 -0
  209. package/dist/agent-address.d.ts +0 -1
  210. package/dist/agent-address.js +0 -1
  211. package/dist/agent-selectors.d.ts +0 -1
  212. package/dist/agent-selectors.js +0 -1
  213. package/src/agent-address.ts +0 -1
  214. package/src/agent-identity.test.ts +0 -435
  215. package/src/agent-selectors.ts +0 -1
  216. package/src/scout-agent-card.test.ts +0 -54
package/dist/index.d.ts CHANGED
@@ -1,18 +1,52 @@
1
1
  export * from "./common.js";
2
+ export * from "./time.js";
2
3
  export * from "./actors.js";
3
4
  export * from "./agent-identity.js";
4
- export * from "./agent-address.js";
5
- export * from "./agent-selectors.js";
5
+ export * from "./provisional-agent-names.js";
6
+ export * from "./a2a.js";
6
7
  export * from "./scout-agent-card.js";
7
8
  export * from "./relay-agent-card.js";
8
9
  export * from "./mesh.js";
9
10
  export * from "./conversations.js";
11
+ export * from "./channel-identity.js";
10
12
  export * from "./collaboration.js";
13
+ export * from "./assigned-roles.js";
14
+ export * from "./orchestrator-prompt.js";
11
15
  export * from "./messages.js";
16
+ export * from "./read-receipts.js";
12
17
  export * from "./invocations.js";
18
+ export * from "./agent-runs.js";
19
+ export * from "./budget.js";
20
+ export * from "./agent-broker-feed.js";
21
+ export * from "./durable-actions.js";
22
+ export * from "./observed-status.js";
23
+ export * from "./activity.js";
24
+ export * from "./harness-feature-support.js";
25
+ export * from "./host-integrations.js";
26
+ export * from "./native-interactions.js";
27
+ export * from "./session-display-state.js";
28
+ export * from "./capability-matrix.js";
29
+ export * from "./debug-attach.js";
13
30
  export * from "./scout-dispatch.js";
31
+ export * from "./runtime-profiles.js";
32
+ export * from "./runtime-execution.js";
33
+ export * from "./runtime-catalog.js";
34
+ export * from "./reserved-vocabulary.js";
35
+ export * from "./route-aliases.js";
14
36
  export * from "./scout-delivery.js";
37
+ export * from "./scout-reply-context.js";
38
+ export * from "./scout-composer.js";
15
39
  export * from "./deliveries.js";
40
+ export * from "./inbox.js";
16
41
  export * from "./transports.js";
17
42
  export * from "./events.js";
18
43
  export * from "./thread-events.js";
44
+ export * from "./permission-policy.js";
45
+ export * from "./cursor-transport.js";
46
+ export * from "./terminal-surface-id.js";
47
+ export * from "./terminal-sessions.js";
48
+ export * from "./terminal-workspaces.js";
49
+ export * from "./terminal-host-topology.js";
50
+ export * from "./broker-routes.js";
51
+ export * from "./rendezvous.js";
52
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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,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,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"}
package/dist/index.js CHANGED
@@ -1,18 +1,51 @@
1
1
  export * from "./common.js";
2
+ export * from "./time.js";
2
3
  export * from "./actors.js";
3
4
  export * from "./agent-identity.js";
4
- export * from "./agent-address.js";
5
- export * from "./agent-selectors.js";
5
+ export * from "./provisional-agent-names.js";
6
+ export * from "./a2a.js";
6
7
  export * from "./scout-agent-card.js";
7
8
  export * from "./relay-agent-card.js";
8
9
  export * from "./mesh.js";
9
10
  export * from "./conversations.js";
11
+ export * from "./channel-identity.js";
10
12
  export * from "./collaboration.js";
13
+ export * from "./assigned-roles.js";
14
+ export * from "./orchestrator-prompt.js";
11
15
  export * from "./messages.js";
16
+ export * from "./read-receipts.js";
12
17
  export * from "./invocations.js";
18
+ export * from "./agent-runs.js";
19
+ export * from "./budget.js";
20
+ export * from "./agent-broker-feed.js";
21
+ export * from "./durable-actions.js";
22
+ export * from "./observed-status.js";
23
+ export * from "./activity.js";
24
+ export * from "./harness-feature-support.js";
25
+ export * from "./host-integrations.js";
26
+ export * from "./native-interactions.js";
27
+ export * from "./session-display-state.js";
28
+ export * from "./capability-matrix.js";
29
+ export * from "./debug-attach.js";
13
30
  export * from "./scout-dispatch.js";
31
+ export * from "./runtime-profiles.js";
32
+ export * from "./runtime-execution.js";
33
+ export * from "./runtime-catalog.js";
34
+ export * from "./reserved-vocabulary.js";
35
+ export * from "./route-aliases.js";
14
36
  export * from "./scout-delivery.js";
37
+ export * from "./scout-reply-context.js";
38
+ export * from "./scout-composer.js";
15
39
  export * from "./deliveries.js";
40
+ export * from "./inbox.js";
16
41
  export * from "./transports.js";
17
42
  export * from "./events.js";
18
43
  export * from "./thread-events.js";
44
+ export * from "./permission-policy.js";
45
+ export * from "./cursor-transport.js";
46
+ export * from "./terminal-surface-id.js";
47
+ export * from "./terminal-sessions.js";
48
+ export * from "./terminal-workspaces.js";
49
+ export * from "./terminal-host-topology.js";
50
+ export * from "./broker-routes.js";
51
+ export * from "./rendezvous.js";
@@ -1,9 +1,51 @@
1
1
  import type { AgentHarness } from "./actors.js";
2
2
  import type { MetadataMap, ScoutId } from "./common.js";
3
+ import type { ScoutPermissionProfile } from "./permission-policy.js";
4
+ import type { ScoutExecutionResolution } from "./runtime-execution.js";
3
5
  export type InvocationAction = "consult" | "execute" | "summarize" | "status" | "wake";
4
6
  export type FlightState = "queued" | "waking" | "running" | "waiting" | "completed" | "failed" | "cancelled";
7
+ export type InvocationSessionPolicy = "new" | "reuse" | "existing" | "fork"
8
+ /** @deprecated use reuse */
9
+ | "any";
10
+ /** Where a newly created harness session should be discoverable. */
11
+ export type SessionPlacement = "background" | "foreground";
12
+ export type InvocationForkSourceKind = "native_thread_clone" | "scout_state_snapshot";
13
+ export interface InvocationForkContextOptions {
14
+ maxMessages?: number;
15
+ maxBytes?: number;
16
+ includeBrokerRecords?: boolean;
17
+ includeObservedHarnessMaterial?: boolean;
18
+ }
19
+ export interface InvocationSessionLineage {
20
+ parentSessionId?: ScoutId;
21
+ parentHarnessThreadId?: string;
22
+ forkSourceKind?: InvocationForkSourceKind;
23
+ forkSourceId?: ScoutId | string;
24
+ forkedAt?: number;
25
+ metadata?: MetadataMap;
26
+ }
5
27
  export interface InvocationExecutionPreference {
6
28
  harness?: AgentHarness;
29
+ model?: string;
30
+ reasoningEffort?: string;
31
+ permissionProfile?: ScoutPermissionProfile;
32
+ /**
33
+ * Background sessions use Scout-managed harness state. Foreground sessions
34
+ * use the operator's native harness state so the task is openable there.
35
+ */
36
+ placement?: SessionPlacement;
37
+ /**
38
+ * Controls whether work should enter fresh model context, opportunistically
39
+ * reuse a warm compatible session, continue one exact session, or fork a new
40
+ * execution session from prior state. The legacy "any" value is a
41
+ * compatibility alias for "reuse"; exact continuation requires targetSessionId.
42
+ */
43
+ session?: InvocationSessionPolicy;
44
+ targetSessionId?: ScoutId;
45
+ forkFromStateId?: ScoutId;
46
+ forkFromSessionId?: ScoutId;
47
+ forkContext?: InvocationForkContextOptions;
48
+ lineage?: InvocationSessionLineage;
7
49
  }
8
50
  export interface InvocationRequest {
9
51
  id: ScoutId;
@@ -18,9 +60,11 @@ export interface InvocationRequest {
18
60
  messageId?: ScoutId;
19
61
  context?: MetadataMap;
20
62
  execution?: InvocationExecutionPreference;
63
+ executionResolution?: ScoutExecutionResolution;
21
64
  ensureAwake: boolean;
22
65
  stream: boolean;
23
66
  timeoutMs?: number;
67
+ labels?: string[];
24
68
  createdAt: number;
25
69
  metadata?: MetadataMap;
26
70
  }
@@ -35,5 +79,82 @@ export interface FlightRecord {
35
79
  error?: string;
36
80
  startedAt?: number;
37
81
  completedAt?: number;
82
+ labels?: string[];
38
83
  metadata?: MetadataMap;
39
84
  }
85
+ /**
86
+ * One concrete harness session used while executing a flight. Flights are the
87
+ * stable coordination handle; sessions are ephemeral execution resources and
88
+ * may change when a dispatch is retried, resumed, or replaced.
89
+ */
90
+ export interface FlightSessionTraceEntry {
91
+ sessionId: ScoutId;
92
+ endpointId?: ScoutId;
93
+ nodeId?: ScoutId;
94
+ harness?: AgentHarness;
95
+ transport?: string;
96
+ strategy?: string;
97
+ placement?: SessionPlacement;
98
+ executionResolution?: ScoutExecutionResolution;
99
+ startedAt: number;
100
+ lastAcknowledgedAt: number;
101
+ endedAt?: number;
102
+ }
103
+ export interface FlightDispatchAcknowledgement {
104
+ sessionId?: ScoutId | null;
105
+ /**
106
+ * Provisional session id replaced by `sessionId` for this same dispatch.
107
+ * Absent for a real transition between two concrete provider sessions.
108
+ */
109
+ refinesSessionId?: ScoutId | null;
110
+ endpointId?: ScoutId | null;
111
+ nodeId?: ScoutId | null;
112
+ harness?: AgentHarness | null;
113
+ transport?: string | null;
114
+ strategy?: string | null;
115
+ placement?: SessionPlacement | null;
116
+ executionResolution?: ScoutExecutionResolution | null;
117
+ acknowledgedAt?: number | null;
118
+ }
119
+ /**
120
+ * Read a flight's ordered session history. Legacy records that only contain a
121
+ * dispatch acknowledgement are projected as a one-session trace.
122
+ */
123
+ export declare function flightSessionTrace(flightOrMetadata: Pick<FlightRecord, "metadata"> | MetadataMap | null | undefined): FlightSessionTraceEntry[];
124
+ /** Append a dispatch acknowledgement without losing earlier session identity. */
125
+ export declare function recordFlightSessionDispatch(metadata: MetadataMap | null | undefined, acknowledgement: unknown): MetadataMap;
126
+ /**
127
+ * Mutable execution status for an invocation. Every field is optional — a
128
+ * freshly-created invocation has no flight or status yet.
129
+ *
130
+ * Note the dispatch job's scheduler state (attempts / leaseOwner /
131
+ * leaseExpiresAt / lastError) is deliberately NOT part of this: it is a distinct
132
+ * concern (worker-lease mechanics), stays its own journal-backed record, and is
133
+ * surfaced separately rather than folded into the domain status.
134
+ */
135
+ export interface InvocationStatus {
136
+ /**
137
+ * Durable secondary id of the invocation's flight. Retained as a stable alias
138
+ * so projected run ids (`run:flight:<flightId>`) and follow links survive the
139
+ * flight→invocation storage merge.
140
+ */
141
+ flightId?: ScoutId;
142
+ state?: FlightState;
143
+ summary?: string;
144
+ output?: string;
145
+ error?: string;
146
+ startedAt?: number;
147
+ completedAt?: number;
148
+ }
149
+ /**
150
+ * The merged invocation record: the immutable request ({@link InvocationRequest})
151
+ * plus its mutable execution status ({@link InvocationStatus}). This is the
152
+ * single source of truth, from which the flight / work-item / agent-run views are
153
+ * projected. The standalone {@link FlightRecord} remains a compatibility shape
154
+ * over the same status subset.
155
+ */
156
+ export type Invocation = InvocationRequest & InvocationStatus;
157
+ export declare function normalizeInvocationSessionPolicy(policy: InvocationSessionPolicy | string | null | undefined): InvocationSessionPolicy | undefined;
158
+ export declare function effectiveInvocationSessionPolicy(execution: Pick<InvocationExecutionPreference, "session" | "targetSessionId" | "forkFromStateId" | "forkFromSessionId"> | null | undefined): Exclude<InvocationSessionPolicy, "any">;
159
+ export declare function validateInvocationExecutionPreference(execution: InvocationExecutionPreference | null | undefined): string[];
160
+ //# sourceMappingURL=invocations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invocations.d.ts","sourceRoot":"","sources":["../src/invocations.ts"],"names":[],"mappings":"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"}
@@ -1 +1,201 @@
1
- export {};
1
+ function cleanTraceString(value) {
2
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
3
+ }
4
+ function cleanTraceTimestamp(value) {
5
+ return typeof value === "number" && Number.isFinite(value) && value >= 0
6
+ ? value
7
+ : undefined;
8
+ }
9
+ function cleanTracePlacement(value) {
10
+ return value === "background" || value === "foreground" ? value : undefined;
11
+ }
12
+ function parseFlightSessionTraceEntry(value) {
13
+ if (!value || typeof value !== "object" || Array.isArray(value))
14
+ return null;
15
+ const record = value;
16
+ const sessionId = cleanTraceString(record.sessionId);
17
+ const startedAt = cleanTraceTimestamp(record.startedAt);
18
+ const lastAcknowledgedAt = cleanTraceTimestamp(record.lastAcknowledgedAt) ?? startedAt;
19
+ if (!sessionId || startedAt === undefined || lastAcknowledgedAt === undefined)
20
+ return null;
21
+ const harness = cleanTraceString(record.harness);
22
+ const executionResolution = record.executionResolution
23
+ && typeof record.executionResolution === "object"
24
+ && !Array.isArray(record.executionResolution)
25
+ ? record.executionResolution
26
+ : undefined;
27
+ return {
28
+ sessionId,
29
+ ...(cleanTraceString(record.endpointId) ? { endpointId: cleanTraceString(record.endpointId) } : {}),
30
+ ...(cleanTraceString(record.nodeId) ? { nodeId: cleanTraceString(record.nodeId) } : {}),
31
+ ...(harness ? { harness: harness } : {}),
32
+ ...(cleanTraceString(record.transport) ? { transport: cleanTraceString(record.transport) } : {}),
33
+ ...(cleanTraceString(record.strategy) ? { strategy: cleanTraceString(record.strategy) } : {}),
34
+ ...(cleanTracePlacement(record.placement) ? { placement: cleanTracePlacement(record.placement) } : {}),
35
+ ...(executionResolution ? { executionResolution } : {}),
36
+ startedAt,
37
+ lastAcknowledgedAt,
38
+ ...(cleanTraceTimestamp(record.endedAt) !== undefined
39
+ ? { endedAt: cleanTraceTimestamp(record.endedAt) }
40
+ : {}),
41
+ };
42
+ }
43
+ function parseDispatchAcknowledgement(value) {
44
+ if (!value || typeof value !== "object" || Array.isArray(value))
45
+ return null;
46
+ const record = value;
47
+ const sessionId = cleanTraceString(record.sessionId);
48
+ const acknowledgedAt = cleanTraceTimestamp(record.acknowledgedAt);
49
+ if (!sessionId || acknowledgedAt === undefined)
50
+ return null;
51
+ const harness = cleanTraceString(record.harness);
52
+ const executionResolution = record.executionResolution
53
+ && typeof record.executionResolution === "object"
54
+ && !Array.isArray(record.executionResolution)
55
+ ? record.executionResolution
56
+ : null;
57
+ return {
58
+ sessionId,
59
+ refinesSessionId: cleanTraceString(record.refinesSessionId) ?? null,
60
+ endpointId: cleanTraceString(record.endpointId) ?? null,
61
+ nodeId: cleanTraceString(record.nodeId) ?? null,
62
+ harness: harness ? harness : null,
63
+ transport: cleanTraceString(record.transport) ?? null,
64
+ strategy: cleanTraceString(record.strategy) ?? null,
65
+ placement: cleanTracePlacement(record.placement) ?? null,
66
+ executionResolution,
67
+ acknowledgedAt,
68
+ };
69
+ }
70
+ /**
71
+ * Read a flight's ordered session history. Legacy records that only contain a
72
+ * dispatch acknowledgement are projected as a one-session trace.
73
+ */
74
+ export function flightSessionTrace(flightOrMetadata) {
75
+ const metadata = (flightOrMetadata && "metadata" in flightOrMetadata
76
+ ? flightOrMetadata.metadata
77
+ : flightOrMetadata);
78
+ const recorded = Array.isArray(metadata?.sessionTrace)
79
+ ? metadata.sessionTrace
80
+ .map(parseFlightSessionTraceEntry)
81
+ .filter((entry) => entry !== null)
82
+ : [];
83
+ if (recorded.length > 0)
84
+ return recorded;
85
+ const dispatchAck = parseDispatchAcknowledgement(metadata?.dispatchAck);
86
+ if (!dispatchAck?.sessionId || dispatchAck.acknowledgedAt === null || dispatchAck.acknowledgedAt === undefined) {
87
+ return [];
88
+ }
89
+ return [{
90
+ sessionId: dispatchAck.sessionId,
91
+ ...(dispatchAck.endpointId ? { endpointId: dispatchAck.endpointId } : {}),
92
+ ...(dispatchAck.nodeId ? { nodeId: dispatchAck.nodeId } : {}),
93
+ ...(dispatchAck.harness ? { harness: dispatchAck.harness } : {}),
94
+ ...(dispatchAck.transport ? { transport: dispatchAck.transport } : {}),
95
+ ...(dispatchAck.strategy ? { strategy: dispatchAck.strategy } : {}),
96
+ ...(dispatchAck.placement ? { placement: dispatchAck.placement } : {}),
97
+ startedAt: dispatchAck.acknowledgedAt,
98
+ lastAcknowledgedAt: dispatchAck.acknowledgedAt,
99
+ }];
100
+ }
101
+ /** Append a dispatch acknowledgement without losing earlier session identity. */
102
+ export function recordFlightSessionDispatch(metadata, acknowledgement) {
103
+ const dispatchAck = parseDispatchAcknowledgement(acknowledgement);
104
+ const nextMetadata = { ...(metadata ?? {}), dispatchAck: acknowledgement };
105
+ if (!dispatchAck?.sessionId || dispatchAck.acknowledgedAt === null || dispatchAck.acknowledgedAt === undefined) {
106
+ return nextMetadata;
107
+ }
108
+ const trace = flightSessionTrace(metadata).map((entry) => ({ ...entry }));
109
+ const previous = trace.at(-1);
110
+ const refinesSameDispatch = Boolean(previous
111
+ && dispatchAck.refinesSessionId
112
+ && previous.sessionId === dispatchAck.refinesSessionId
113
+ && previous.sessionId !== dispatchAck.sessionId
114
+ && previous.endpointId
115
+ && dispatchAck.endpointId
116
+ && previous.endpointId === dispatchAck.endpointId
117
+ && previous.startedAt === dispatchAck.acknowledgedAt);
118
+ if (previous
119
+ && (previous.sessionId === dispatchAck.sessionId || refinesSameDispatch)
120
+ && (previous.endpointId ?? null) === (dispatchAck.endpointId ?? null)) {
121
+ // A transport can acknowledge with Scout's provisional routing id, then
122
+ // refine that same acknowledgement once the provider id is known. The
123
+ // unchanged endpoint and timestamp prove this is identity promotion, not
124
+ // a second harness session span.
125
+ if (refinesSameDispatch) {
126
+ previous.sessionId = dispatchAck.sessionId;
127
+ }
128
+ previous.lastAcknowledgedAt = Math.max(previous.lastAcknowledgedAt, dispatchAck.acknowledgedAt);
129
+ previous.strategy = dispatchAck.strategy ?? previous.strategy;
130
+ previous.placement = dispatchAck.placement ?? previous.placement;
131
+ previous.harness = dispatchAck.harness ?? previous.harness;
132
+ previous.transport = dispatchAck.transport ?? previous.transport;
133
+ previous.nodeId = dispatchAck.nodeId ?? previous.nodeId;
134
+ previous.executionResolution = dispatchAck.executionResolution ?? previous.executionResolution;
135
+ delete previous.endedAt;
136
+ }
137
+ else {
138
+ if (previous && previous.endedAt === undefined) {
139
+ previous.endedAt = dispatchAck.acknowledgedAt;
140
+ }
141
+ trace.push({
142
+ sessionId: dispatchAck.sessionId,
143
+ ...(dispatchAck.endpointId ? { endpointId: dispatchAck.endpointId } : {}),
144
+ ...(dispatchAck.nodeId ? { nodeId: dispatchAck.nodeId } : {}),
145
+ ...(dispatchAck.harness ? { harness: dispatchAck.harness } : {}),
146
+ ...(dispatchAck.transport ? { transport: dispatchAck.transport } : {}),
147
+ ...(dispatchAck.strategy ? { strategy: dispatchAck.strategy } : {}),
148
+ ...(dispatchAck.placement ? { placement: dispatchAck.placement } : {}),
149
+ ...(dispatchAck.executionResolution ? { executionResolution: dispatchAck.executionResolution } : {}),
150
+ startedAt: dispatchAck.acknowledgedAt,
151
+ lastAcknowledgedAt: dispatchAck.acknowledgedAt,
152
+ });
153
+ }
154
+ nextMetadata.sessionTrace = trace;
155
+ return nextMetadata;
156
+ }
157
+ export function normalizeInvocationSessionPolicy(policy) {
158
+ switch (policy) {
159
+ case "new":
160
+ case "reuse":
161
+ case "existing":
162
+ case "fork":
163
+ case "any":
164
+ return policy;
165
+ default:
166
+ return undefined;
167
+ }
168
+ }
169
+ export function effectiveInvocationSessionPolicy(execution) {
170
+ if (!execution)
171
+ return "new";
172
+ if (execution.forkFromStateId || execution.forkFromSessionId || execution.session === "fork") {
173
+ return "fork";
174
+ }
175
+ if (execution.targetSessionId || execution.session === "existing") {
176
+ return "existing";
177
+ }
178
+ if (execution.session === "reuse" || execution.session === "any") {
179
+ return "reuse";
180
+ }
181
+ return "new";
182
+ }
183
+ export function validateInvocationExecutionPreference(execution) {
184
+ if (!execution)
185
+ return [];
186
+ const errors = [];
187
+ const policy = effectiveInvocationSessionPolicy(execution);
188
+ if (policy === "existing" && !execution.targetSessionId) {
189
+ errors.push("session existing requires targetSessionId");
190
+ }
191
+ if (policy === "fork" && !execution.forkFromStateId && !execution.forkFromSessionId) {
192
+ errors.push("session fork requires forkFromStateId or forkFromSessionId");
193
+ }
194
+ if (execution.session === "new" && execution.targetSessionId) {
195
+ errors.push("session new cannot target an existing session");
196
+ }
197
+ if (execution.session === "new" && (execution.forkFromStateId || execution.forkFromSessionId)) {
198
+ errors.push("session new cannot include fork source ids");
199
+ }
200
+ return errors;
201
+ }
package/dist/mesh.d.ts CHANGED
@@ -1,4 +1,69 @@
1
1
  import type { AdvertiseScope, MetadataMap, ScoutId } from "./common.js";
2
+ export declare const OPENSCOUT_MESH_PROTOCOL_VERSION = 1;
3
+ export declare const OPENSCOUT_IROH_MESH_ALPN = "openscout/mesh/0";
4
+ export declare const DEFAULT_OPENSCOUT_MESH_RENDEZVOUS_URL = "https://mesh.oscout.net";
5
+ export declare const DEFAULT_OPENSCOUT_MOBILE_PAIRING_RELAY_URL = "wss://mesh.oscout.net/v1/relay";
6
+ export type NodeMeshEntrypoint = IrohMeshEntrypoint | CloudflareTunnelMeshEntrypoint | HttpMeshEntrypoint | MobilePairingMeshEntrypoint;
7
+ export interface IrohMeshEntrypoint {
8
+ kind: "iroh";
9
+ endpointId: string;
10
+ endpointAddr: unknown;
11
+ alpn: typeof OPENSCOUT_IROH_MESH_ALPN;
12
+ bridgeProtocolVersion: typeof OPENSCOUT_MESH_PROTOCOL_VERSION;
13
+ lastSeenAt?: number;
14
+ expiresAt?: number;
15
+ metadata?: MetadataMap;
16
+ }
17
+ export interface CloudflareTunnelMeshEntrypoint {
18
+ kind: "cloudflare_tunnel";
19
+ url: string;
20
+ lastSeenAt?: number;
21
+ expiresAt?: number;
22
+ metadata?: MetadataMap;
23
+ }
24
+ export interface HttpMeshEntrypoint {
25
+ kind: "http";
26
+ url: string;
27
+ lastSeenAt?: number;
28
+ expiresAt?: number;
29
+ metadata?: MetadataMap;
30
+ }
31
+ export interface MobilePairingMeshEntrypoint {
32
+ kind: "mobile_pairing";
33
+ relay: string;
34
+ fallbackRelays?: string[];
35
+ room: string;
36
+ publicKey: string;
37
+ expiresAt: number;
38
+ lastSeenAt?: number;
39
+ metadata?: MetadataMap;
40
+ }
41
+ export type TrustedPeerTier = "observe" | "control";
42
+ export type TrustedPeerGrantChannel = "sas" | "github" | "ssh";
43
+ export interface TrustedPeerRecord {
44
+ /** Canonical machine identity: full SHA-256 hex of the DER public key. */
45
+ keyId: string;
46
+ /** Base64 DER spki Ed25519 public key. */
47
+ publicKey: string;
48
+ /** Short `osc1:xxxx-xxxx` form — display-only, never an identity key. */
49
+ fingerprint: string;
50
+ /** Remote node's runtime id, when known. */
51
+ nodeId?: ScoutId;
52
+ label: string;
53
+ tier: TrustedPeerTier;
54
+ grantedVia: TrustedPeerGrantChannel;
55
+ grantedAt: number;
56
+ expiresAt?: number;
57
+ revokedAt?: number;
58
+ lastSeenAt?: number;
59
+ /**
60
+ * §11.2 durable TLS pin: SHA-256 hex of the peer TLS certificate's
61
+ * SubjectPublicKeyInfo DER, copied from the peer's verified signed card at
62
+ * enrollment. Absent for Tailscale-path peers and pre-P1.5 enrollments.
63
+ */
64
+ tlsSpkiFingerprint?: string;
65
+ metadata?: MetadataMap;
66
+ }
2
67
  export interface NodeDefinition {
3
68
  id: ScoutId;
4
69
  meshId: ScoutId;
@@ -6,6 +71,8 @@ export interface NodeDefinition {
6
71
  hostName?: string;
7
72
  advertiseScope: AdvertiseScope;
8
73
  brokerUrl?: string;
74
+ webUrl?: string;
75
+ meshEntrypoints?: NodeMeshEntrypoint[];
9
76
  tailnetName?: string;
10
77
  capabilities?: string[];
11
78
  labels?: string[];
@@ -13,3 +80,34 @@ export interface NodeDefinition {
13
80
  lastSeenAt?: number;
14
81
  registeredAt: number;
15
82
  }
83
+ export interface OpenScoutMeshPresence {
84
+ v: typeof OPENSCOUT_MESH_PROTOCOL_VERSION;
85
+ meshId: ScoutId;
86
+ nodeId: ScoutId;
87
+ nodeName: string;
88
+ issuedAt: number;
89
+ expiresAt: number;
90
+ entrypoints: NodeMeshEntrypoint[];
91
+ signature?: {
92
+ algorithm: "ed25519";
93
+ keyId: string;
94
+ value: string;
95
+ };
96
+ metadata?: MetadataMap;
97
+ }
98
+ export interface OpenScoutMeshPresenceRecord extends OpenScoutMeshPresence {
99
+ observedAt: number;
100
+ }
101
+ export interface OpenScoutMeshRendezvousList {
102
+ v: typeof OPENSCOUT_MESH_PROTOCOL_VERSION;
103
+ meshId: ScoutId;
104
+ nodes: OpenScoutMeshPresenceRecord[];
105
+ }
106
+ export declare function buildUnsignedMeshPresence(input: {
107
+ node: Pick<NodeDefinition, "id" | "meshId" | "name">;
108
+ entrypoints: NodeMeshEntrypoint[];
109
+ issuedAt?: number;
110
+ ttlMs?: number;
111
+ metadata?: MetadataMap;
112
+ }): OpenScoutMeshPresence;
113
+ //# sourceMappingURL=mesh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh.d.ts","sourceRoot":"","sources":["../src/mesh.ts"],"names":[],"mappings":"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"}
package/dist/mesh.js CHANGED
@@ -1 +1,18 @@
1
- export {};
1
+ export const OPENSCOUT_MESH_PROTOCOL_VERSION = 1;
2
+ export const OPENSCOUT_IROH_MESH_ALPN = "openscout/mesh/0";
3
+ export const DEFAULT_OPENSCOUT_MESH_RENDEZVOUS_URL = "https://mesh.oscout.net";
4
+ export const DEFAULT_OPENSCOUT_MOBILE_PAIRING_RELAY_URL = "wss://mesh.oscout.net/v1/relay";
5
+ export function buildUnsignedMeshPresence(input) {
6
+ const issuedAt = input.issuedAt ?? Date.now();
7
+ const ttlMs = input.ttlMs ?? 60_000;
8
+ return {
9
+ v: OPENSCOUT_MESH_PROTOCOL_VERSION,
10
+ meshId: input.node.meshId,
11
+ nodeId: input.node.id,
12
+ nodeName: input.node.name,
13
+ issuedAt,
14
+ expiresAt: issuedAt + ttlMs,
15
+ entrypoints: input.entrypoints,
16
+ ...(input.metadata ? { metadata: input.metadata } : {}),
17
+ };
18
+ }
@@ -22,6 +22,8 @@ export interface MessageAudience {
22
22
  notify?: ScoutId[];
23
23
  invoke?: ScoutId[];
24
24
  reason?: DeliveryReason;
25
+ /** Persist the message without scheduling any transport deliveries. */
26
+ delivery?: "none";
25
27
  }
26
28
  export interface MessageRecord {
27
29
  id: ScoutId;
@@ -41,3 +43,4 @@ export interface MessageRecord {
41
43
  createdAt: number;
42
44
  metadata?: MetadataMap;
43
45
  }
46
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,WAAW,EACX,OAAO,EACP,eAAe,EAChB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE9E,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,WAAW,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAClC,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,UAAU,EAAE,eAAe,CAAC;IAC5B,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,WAAW,CAAC;CACxB"}
@@ -0,0 +1,30 @@
1
+ import type { ScoutId } from "./common.js";
2
+ export type HarnessNativeInteractionKind = "question" | "plan_approval" | "task_projection" | "subagent_activity" | "tool_approval" | "follow_up" | "steer";
3
+ export type ScoutNativeInteractionTargetKind = "question" | "work_item" | "invocation" | "flight" | "message" | "session_projection";
4
+ export interface HarnessNativeInteractionSource {
5
+ harness: string;
6
+ sessionId?: ScoutId;
7
+ harnessThreadId?: string;
8
+ toolCallId?: string;
9
+ nativeName?: string;
10
+ rawEventId?: string;
11
+ }
12
+ export interface HarnessNativeInteraction {
13
+ id: ScoutId;
14
+ kind: HarnessNativeInteractionKind;
15
+ source: HarnessNativeInteractionSource;
16
+ title?: string;
17
+ summary?: string;
18
+ payload?: Record<string, unknown>;
19
+ observedAt: number;
20
+ }
21
+ export interface HarnessNativeInteractionMapping {
22
+ kind: HarnessNativeInteractionKind;
23
+ nativeNames: string[];
24
+ scoutTargets: ScoutNativeInteractionTargetKind[];
25
+ description: string;
26
+ }
27
+ export declare const DEFAULT_HARNESS_NATIVE_INTERACTION_MAPPINGS: readonly HarnessNativeInteractionMapping[];
28
+ export declare function scoutTargetsForNativeInteraction(kind: HarnessNativeInteractionKind): ScoutNativeInteractionTargetKind[];
29
+ export declare function nativeInteractionKindForName(nativeName: string): HarnessNativeInteractionKind | undefined;
30
+ //# sourceMappingURL=native-interactions.d.ts.map