@astrosheep/square 0.4.0 → 0.4.1

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 (187) hide show
  1. package/dist/artifact.d.ts +1 -3
  2. package/dist/artifact.js +12 -36
  3. package/dist/attention-presentation.d.ts +2 -22
  4. package/dist/attention-presentation.js +9 -12
  5. package/dist/boundary-presentation.d.ts +3 -14
  6. package/dist/boundary-presentation.js +29 -104
  7. package/dist/card-presentation.d.ts +1 -0
  8. package/dist/card-presentation.js +2 -0
  9. package/dist/catch-decisions.js +1 -7
  10. package/dist/claude-delivery.d.ts +13 -8
  11. package/dist/claude-delivery.js +40 -93
  12. package/dist/claude-mcp-context.js +2 -2
  13. package/dist/claude-mod.js +28 -140
  14. package/dist/claude-transport.d.ts +3 -3
  15. package/dist/claude-transport.js +20 -44
  16. package/dist/cli/context.js +7 -9
  17. package/dist/cli/observation-commands.d.ts +2 -0
  18. package/dist/cli/observation-commands.js +12 -2
  19. package/dist/cli/registry.js +3 -1
  20. package/dist/codex-address.d.ts +2 -2
  21. package/dist/codex-boundary-state.d.ts +1 -5
  22. package/dist/codex-boundary-state.js +0 -4
  23. package/dist/codex-hook.d.ts +7 -10
  24. package/dist/codex-hook.js +69 -33
  25. package/dist/codex-queue.d.ts +10 -11
  26. package/dist/codex-queue.js +32 -32
  27. package/dist/codex-watch.d.ts +2 -0
  28. package/dist/codex-watch.js +100 -0
  29. package/dist/decisions.js +2 -2
  30. package/dist/delivery-deferral.d.ts +8 -17
  31. package/dist/delivery-deferral.js +0 -28
  32. package/dist/delivery-frame.d.ts +7 -0
  33. package/dist/delivery-frame.js +11 -0
  34. package/dist/delivery-ledger-sqlite.d.ts +97 -0
  35. package/dist/delivery-ledger-sqlite.js +496 -0
  36. package/dist/delivery-ledger.d.ts +196 -0
  37. package/dist/delivery-ledger.js +268 -0
  38. package/dist/delivery-lifetime.d.ts +6 -0
  39. package/dist/delivery-lifetime.js +45 -0
  40. package/dist/harness-links.js +61 -7
  41. package/dist/harness.js +12 -17
  42. package/dist/help.js +2 -0
  43. package/dist/http-delivery.d.ts +5 -9
  44. package/dist/http-delivery.js +20 -77
  45. package/dist/inbox.d.ts +6 -49
  46. package/dist/inbox.js +24 -371
  47. package/dist/index.d.ts +6 -3
  48. package/dist/index.js +4 -1
  49. package/dist/mcp.js +1 -1
  50. package/dist/model.d.ts +7 -47
  51. package/dist/model.js +1 -7
  52. package/dist/notifications.d.ts +24 -20
  53. package/dist/notifications.js +39 -108
  54. package/dist/operation-control.d.ts +4 -0
  55. package/dist/operation-control.js +20 -0
  56. package/dist/packages/agent-delivery/src/claude-native.d.ts +2 -0
  57. package/dist/packages/agent-delivery/src/claude-native.js +5 -0
  58. package/dist/packages/agent-delivery/src/codex-boundary.d.ts +11 -6
  59. package/dist/packages/agent-delivery/src/codex-boundary.js +31 -40
  60. package/dist/packages/agent-delivery/src/codex-hook.d.ts +17 -12
  61. package/dist/packages/agent-delivery/src/codex-hook.js +26 -39
  62. package/dist/packages/agent-delivery/src/codex.d.ts +3 -0
  63. package/dist/packages/agent-delivery/src/codex.js +41 -4
  64. package/dist/packages/agent-delivery/src/index.d.ts +3 -1
  65. package/dist/packages/agent-delivery/src/index.js +1 -1
  66. package/dist/packages/agent-delivery/src/paseo.js +11 -2
  67. package/dist/packages/agent-delivery/src/types.d.ts +1 -0
  68. package/dist/paseo-delivery.d.ts +5 -5
  69. package/dist/paseo-delivery.js +19 -97
  70. package/dist/paseo.d.ts +1 -1
  71. package/dist/paseo.js +1 -1
  72. package/dist/plugins/opencode/index.d.ts +5 -3
  73. package/dist/plugins/opencode/index.js +99 -21
  74. package/dist/plugins/opencode-shared/delivery.d.ts +23 -0
  75. package/dist/plugins/opencode-shared/delivery.js +109 -0
  76. package/dist/plugins/opencode-v1/index.d.ts +28 -0
  77. package/dist/plugins/opencode-v1/index.js +41 -0
  78. package/dist/plugins/opencode-v1/runtime.d.ts +56 -0
  79. package/dist/plugins/opencode-v1/runtime.js +152 -0
  80. package/dist/plugins/opencode-v1/transport.d.ts +13 -0
  81. package/dist/plugins/opencode-v1/transport.js +50 -0
  82. package/dist/plugins/paseo/shared/card-presentation.d.ts +10 -0
  83. package/dist/plugins/paseo/shared/card-presentation.js +7 -0
  84. package/dist/ports.d.ts +31 -90
  85. package/dist/session-lifecycle.d.ts +8 -7
  86. package/dist/session-lifecycle.js +40 -42
  87. package/dist/sqlite-square.d.ts +14 -23
  88. package/dist/sqlite-square.js +132 -139
  89. package/dist/square-api.js +4 -7
  90. package/dist/square-core.d.ts +0 -1
  91. package/dist/square-domain.d.ts +5 -17
  92. package/dist/square-domain.js +104 -221
  93. package/dist/square-facade.d.ts +18 -15
  94. package/dist/square-post.d.ts +53 -0
  95. package/dist/square-post.js +4 -0
  96. package/dist/square-posting.d.ts +13 -0
  97. package/dist/square-posting.js +174 -0
  98. package/dist/square-producer-sqlite.d.ts +11 -0
  99. package/dist/square-producer-sqlite.js +210 -0
  100. package/dist/square-sqlite.d.ts +15 -25
  101. package/dist/square-sqlite.js +150 -226
  102. package/dist/views.d.ts +2 -2
  103. package/dist/views.js +0 -1
  104. package/dist/wake-sink.d.ts +4 -11
  105. package/dist/wake-sink.js +8 -32
  106. package/dist/wake-transports.d.ts +4 -7
  107. package/dist/wake-transports.js +8 -39
  108. package/examples/symmetric-domains.mjs +29 -249
  109. package/guides/change-waits.md +13 -53
  110. package/guides/claude-native.md +19 -175
  111. package/guides/codex-delivery.md +55 -80
  112. package/guides/delivery-primitives.md +48 -207
  113. package/guides/operation-cancellation.md +2 -5
  114. package/guides/participant-ownership.md +25 -89
  115. package/guides/pi-native-delivery.md +19 -56
  116. package/guides/pi-tools.md +6 -8
  117. package/guides/square-api.md +113 -615
  118. package/package.json +8 -8
  119. package/plugins/claude/.claude-plugin/plugin.json +1 -1
  120. package/plugins/claude/hooks/hooks.json +1 -1
  121. package/plugins/claude/{hooks/register.js → mods/square.js} +4 -7
  122. package/plugins/codex/.codex-plugin/plugin.json +1 -1
  123. package/plugins/codex/hooks/hooks.json +11 -23
  124. package/plugins/opencode/index.ts +91 -23
  125. package/plugins/opencode-shared/delivery.ts +91 -0
  126. package/plugins/opencode-v1/index.ts +36 -0
  127. package/plugins/opencode-v1/runtime.ts +134 -0
  128. package/plugins/opencode-v1/transport.ts +41 -0
  129. package/plugins/paseo/OVERVIEW.md +5 -5
  130. package/plugins/paseo/README.md +7 -6
  131. package/plugins/paseo/client/markdown.tsx +5 -5
  132. package/plugins/paseo/client/square-message.tsx +28 -24
  133. package/plugins/paseo/client/transform.ts +8 -5
  134. package/plugins/paseo/shared/card-presentation.ts +16 -0
  135. package/plugins/paseo/shared/message.ts +6 -11
  136. package/plugins/pi/square-pi.js +156 -417
  137. package/dist/channel-artifact.d.ts +0 -10
  138. package/dist/channel-artifact.js +0 -55
  139. package/dist/channel-delivery.d.ts +0 -11
  140. package/dist/channel-delivery.js +0 -51
  141. package/dist/channel-domain.d.ts +0 -3
  142. package/dist/channel-domain.js +0 -83
  143. package/dist/channel-facade.d.ts +0 -76
  144. package/dist/channel-facade.js +0 -1
  145. package/dist/channel-internal.d.ts +0 -126
  146. package/dist/channel-internal.js +0 -440
  147. package/dist/channel-metadata.d.ts +0 -11
  148. package/dist/channel-metadata.js +0 -1
  149. package/dist/channel-ports.d.ts +0 -241
  150. package/dist/channel-ports.js +0 -1
  151. package/dist/channel-presentation.d.ts +0 -17
  152. package/dist/channel-presentation.js +0 -22
  153. package/dist/channel-sqlite-schema.d.ts +0 -13
  154. package/dist/channel-sqlite-schema.js +0 -81
  155. package/dist/channel-transport.d.ts +0 -62
  156. package/dist/channel-transport.js +0 -1
  157. package/dist/channel.d.ts +0 -84
  158. package/dist/channel.js +0 -60
  159. package/dist/claude-delivery-status.d.ts +0 -13
  160. package/dist/claude-delivery-status.js +0 -46
  161. package/dist/cmd/notify-once.d.ts +0 -2
  162. package/dist/cmd/notify-once.js +0 -29
  163. package/dist/delivery-attempts.d.ts +0 -52
  164. package/dist/delivery-attempts.js +0 -73
  165. package/dist/delivery-effects.d.ts +0 -139
  166. package/dist/delivery-effects.js +0 -163
  167. package/dist/delivery-health.d.ts +0 -51
  168. package/dist/delivery-health.js +0 -173
  169. package/dist/delivery-operations.d.ts +0 -22
  170. package/dist/delivery-operations.js +0 -198
  171. package/dist/delivery-primitives.d.ts +0 -5
  172. package/dist/delivery-primitives.js +0 -3
  173. package/dist/delivery.d.ts +0 -56
  174. package/dist/delivery.js +0 -80
  175. package/dist/plugins/opencode/delivery.d.ts +0 -19
  176. package/dist/plugins/opencode/delivery.js +0 -223
  177. package/dist/presentation-operations.d.ts +0 -5
  178. package/dist/presentation-operations.js +0 -86
  179. package/dist/sqlite-channel.d.ts +0 -15
  180. package/dist/sqlite-channel.js +0 -600
  181. package/dist/square-index.d.ts +0 -16
  182. package/dist/square-index.js +0 -106
  183. package/dist/wake-preview.d.ts +0 -7
  184. package/dist/wake-preview.js +0 -15
  185. package/plugins/opencode/delivery.ts +0 -198
  186. /package/dist/{channel-values.d.ts → square-values.d.ts} +0 -0
  187. /package/dist/{channel-values.js → square-values.js} +0 -0
@@ -1,241 +0,0 @@
1
- import type { Owner } from './neutral.js';
2
- import type { MessageMetadata, JsonValue, WakeAddress } from './channel-values.js';
3
- import type { MetadataMatch, DeliveryDeferralFact } from './delivery-deferral.js';
4
- import type { AttemptOutcome } from './delivery-attempts.js';
5
- import type { MessageId } from './message.js';
6
- import type { EndpointGeneration } from './message.js';
7
- export type { MessageId, EndpointGeneration };
8
- /** One lower write's custody claim. Every Channel mutation carries exactly one. */
9
- export type ChannelWriteAuthority = {
10
- readonly kind: 'send';
11
- readonly actor: string;
12
- } | {
13
- readonly kind: 'endpoint';
14
- readonly participant: string;
15
- readonly owner: Owner;
16
- } | {
17
- readonly kind: 'endpoint-cleanup';
18
- readonly seat: EndpointRef;
19
- } | {
20
- readonly kind: 'participant';
21
- readonly seat: EndpointRef;
22
- };
23
- /** The only storage surface a Channel is allowed to see: messages, endpoints and their custody. */
24
- export interface ChannelArtifact {
25
- read<T>(select: (facts: ChannelRead) => T, signal?: AbortSignal): Promise<{
26
- readonly value: T;
27
- readonly version: number;
28
- }>;
29
- transactAs<T>(authority: ChannelWriteAuthority, change: (facts: ChannelWrite) => T, signal?: AbortSignal): Promise<{
30
- readonly value: T;
31
- readonly changed: boolean;
32
- }>;
33
- claimDelivery(input: ChannelDeliveryClaimInput, signal?: AbortSignal): Promise<ChannelDeliveryClaimResult>;
34
- prepareDelivery(input: ChannelDeliveryPreparation, signal?: AbortSignal): Promise<boolean>;
35
- completeDelivery(input: ChannelDeliveryCompletion, signal?: AbortSignal): Promise<boolean>;
36
- cancelDeliveries(seat: EndpointRef, through?: number, signal?: AbortSignal): Promise<boolean>;
37
- changed(sinceVersion: number, timeoutMs: number, signal?: AbortSignal): Promise<boolean>;
38
- close(): Promise<void>;
39
- }
40
- export interface ChannelHeader {
41
- readonly revision: number;
42
- readonly deliveryRevision: number;
43
- readonly nextMessageIndex: number;
44
- readonly lastMessageIndex: number;
45
- }
46
- /** One Channel message. Body and caller metadata have exactly one authoritative copy. */
47
- export interface MessageFact {
48
- readonly index: number;
49
- readonly at: number;
50
- readonly from: string;
51
- readonly body: string;
52
- readonly metadata?: MessageMetadata;
53
- /** Sender-chosen preview projection; the stored body remains full. */
54
- readonly preview?: string;
55
- }
56
- export interface MessageAddressFact {
57
- readonly recipient: string;
58
- readonly generation?: EndpointGeneration;
59
- }
60
- export interface MessageHead {
61
- readonly index: number;
62
- readonly at: number;
63
- readonly from: string;
64
- readonly recipient: string;
65
- readonly generation?: EndpointGeneration;
66
- }
67
- export interface MessageFilter {
68
- readonly afterIndex?: number;
69
- readonly beforeIndex?: number;
70
- readonly throughIndex?: number;
71
- readonly indexes?: readonly number[];
72
- readonly senders?: readonly string[];
73
- readonly senderMatch?: 'identity' | 'exact';
74
- readonly afterAt?: number;
75
- readonly metadataMatch?: MetadataMatch;
76
- readonly search?: {
77
- readonly text: string;
78
- readonly mode: 'literal' | 'regex';
79
- };
80
- readonly unseenOnly?: true;
81
- readonly currentGeneration?: true;
82
- }
83
- export interface MessageDraft {
84
- readonly from: string;
85
- readonly at: number;
86
- readonly body: string;
87
- readonly metadata?: MessageMetadata;
88
- readonly preview?: string;
89
- readonly to: readonly MessageAddressFact[];
90
- }
91
- export interface EndpointFact {
92
- readonly participant: string;
93
- readonly owner: Owner;
94
- readonly generation: EndpointGeneration;
95
- readonly attachment: 'attached' | 'detached';
96
- readonly wakeAddress?: WakeAddress;
97
- }
98
- export type EndpointRef = Pick<EndpointFact, 'participant' | 'owner' | 'generation'>;
99
- /** Upper-owned namespace association; Channel never interprets its selector. */
100
- export interface ReceiveClaimFact {
101
- readonly namespace: string;
102
- readonly id: string;
103
- readonly owner: string;
104
- readonly generation: EndpointGeneration;
105
- readonly selector: JsonValue;
106
- /** Message-scoped suppression coverage; Channel owns this list, the selector stays opaque. */
107
- readonly suppressed: readonly number[];
108
- readonly heartbeatAt: number;
109
- readonly expiresAt: number;
110
- }
111
- export interface ChannelDeliveryEvidence {
112
- readonly participant: string;
113
- readonly generation: EndpointGeneration;
114
- readonly message: MessageId;
115
- readonly kind: 'wake' | 'presentation';
116
- readonly outcome: AttemptOutcome;
117
- readonly attemptN: number;
118
- readonly at: number;
119
- readonly expiresAt?: number;
120
- readonly claimToken?: string;
121
- readonly route?: WakeAddress;
122
- readonly signature?: string;
123
- readonly messageText?: string;
124
- readonly diagnostic?: JsonValue;
125
- readonly correlation?: {
126
- readonly harness: 'claude' | 'opencode' | 'pi';
127
- readonly token?: string;
128
- readonly messageId?: string;
129
- readonly payloadHash?: string;
130
- };
131
- /** Exact bytes prepared for this attempt; declared before the external effect. */
132
- readonly coverage?: 'full' | 'clipped';
133
- readonly description?: string;
134
- readonly nativeObservations?: readonly {
135
- readonly eventId: string;
136
- readonly messageId: string;
137
- readonly state: 'held' | 'released' | 'dropped';
138
- readonly reason?: string;
139
- readonly observedAt: number;
140
- }[];
141
- }
142
- export interface ChannelDeliveryClaimInput {
143
- readonly seat: EndpointRef;
144
- readonly message: MessageId;
145
- readonly kind: 'wake' | 'presentation';
146
- readonly observationOf?: string;
147
- readonly route?: WakeAddress;
148
- readonly at: number;
149
- readonly leaseMs: number;
150
- readonly claimToken: string;
151
- }
152
- export type ChannelDeliveryClaimResult = {
153
- readonly status: 'acquired';
154
- readonly claimToken: string;
155
- readonly attemptN: number;
156
- } | {
157
- readonly status: 'busy' | 'terminal' | 'stale' | 'deferred';
158
- readonly evidence?: ChannelDeliveryEvidence;
159
- };
160
- export interface ChannelDeliveryPreparation {
161
- readonly seat: EndpointRef;
162
- readonly claimToken: string;
163
- readonly correlation: NonNullable<ChannelDeliveryEvidence['correlation']>;
164
- readonly coverage: 'full' | 'clipped';
165
- readonly description?: string;
166
- }
167
- export interface ChannelDeliveryCompletion {
168
- readonly seat: EndpointRef;
169
- readonly message: MessageId;
170
- readonly claimToken: string;
171
- readonly outcome: Exclude<ChannelDeliveryEvidence['outcome'], 'dispatching'>;
172
- readonly at: number;
173
- readonly signature?: string;
174
- readonly messageText?: string;
175
- readonly diagnostic?: JsonValue;
176
- readonly correlation?: ChannelDeliveryEvidence['correlation'];
177
- }
178
- /** Lower read capabilities. Nothing here describes Agora events, routes or attention. */
179
- export interface ChannelRead {
180
- header(): ChannelHeader;
181
- message(index: number): MessageFact | undefined;
182
- messages(indexes: readonly number[]): readonly MessageFact[];
183
- messageHeads(filter: MessageFilter, page: {
184
- readonly edge: 'oldest' | 'newest';
185
- readonly limit: number;
186
- }): {
187
- readonly items: readonly MessageFact[];
188
- readonly hasMore: boolean;
189
- };
190
- messageCount(filter: MessageFilter): number;
191
- addresses(index: number): readonly MessageAddressFact[];
192
- receipt(owner: string, index: number): {
193
- readonly at: number;
194
- } | undefined;
195
- receiptFacts(owner: string, afterIndex: number): {
196
- readonly latestAt?: number;
197
- readonly latestActorMessageIndex?: number;
198
- };
199
- directed(recipient: string, filter: MessageFilter, page: {
200
- readonly edge: 'oldest' | 'newest';
201
- readonly limit: number;
202
- }): {
203
- readonly items: readonly MessageHead[];
204
- readonly hasMore: boolean;
205
- };
206
- directedCount(recipient: string, filter: MessageFilter): number;
207
- endpoint(requested: string): EndpointFact | undefined;
208
- endpointsForOwner(owner: Owner): readonly EndpointFact[];
209
- endpoints(): readonly EndpointFact[];
210
- deliveryEvidence(participant: string, generation: EndpointGeneration, message?: MessageId): readonly ChannelDeliveryEvidence[];
211
- deliveryByToken(claimToken: string): ChannelDeliveryEvidence | undefined;
212
- cancelledThrough(participant: string, generation: EndpointGeneration): number | undefined;
213
- deliveryDeferrals(participant: string, generation: EndpointGeneration): readonly DeliveryDeferralFact[];
214
- receiveClaims(owner: string, namespace?: string): readonly ReceiveClaimFact[];
215
- claimLease(owner: string, namespace?: string): ReceiveClaimFact | undefined;
216
- /** Any live claim of this endpoint covering the message suppresses its pending eligibility. */
217
- suppressed(owner: string, generation: EndpointGeneration, index: number, now: number): boolean;
218
- }
219
- export interface ChannelWrite extends ChannelRead {
220
- publishMessage(draft: MessageDraft): MessageFact;
221
- storeEndpoint(endpoint: EndpointFact): boolean;
222
- updateWakeAddress(endpoint: EndpointRef, wakeAddress?: WakeAddress): boolean;
223
- reattachEndpoint(endpoint: EndpointRef, wakeAddress?: WakeAddress): boolean;
224
- detachEndpoint(endpoint: EndpointRef): boolean;
225
- removeEndpoint(endpoint: EndpointRef): boolean;
226
- cancelThrough(endpoint: EndpointRef, through: number): boolean;
227
- markSeen(owner: string, indexes: readonly number[], at: number): number;
228
- claimDelivery(input: ChannelDeliveryClaimInput): ChannelDeliveryClaimResult;
229
- prepareDelivery(input: ChannelDeliveryPreparation): boolean;
230
- completeDelivery(input: ChannelDeliveryCompletion): boolean;
231
- observeNativeDelivery(input: {
232
- readonly seat: EndpointRef;
233
- readonly claimToken: string;
234
- readonly observation: NonNullable<ChannelDeliveryEvidence['nativeObservations']>[number];
235
- }): boolean;
236
- putDeliveryDeferral(seat: EndpointRef, id: string, match: MetadataMatch, expiresAt: number, now: number): boolean;
237
- renewDeliveryDeferral(seat: EndpointRef, id: string, expiresAt: number, now: number): boolean;
238
- releaseDeliveryDeferral(seat: EndpointRef, id: string, now: number): boolean;
239
- putReceiveClaim(claim: ReceiveClaimFact): boolean;
240
- removeReceiveClaim(owner: string, namespace: string, id: string): boolean;
241
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,17 +0,0 @@
1
- export declare function escapeSquareTags(text: string): string;
2
- /** A Channel message has no Agora route or activity record. */
3
- export declare function projectChannelNotification({ actor, body, preview }: {
4
- squarePath: string;
5
- recipient: string;
6
- actor: string;
7
- body: string;
8
- preview?: string;
9
- }): {
10
- text: string;
11
- full: string;
12
- preview: string;
13
- description: string;
14
- clipped: boolean;
15
- };
16
- /** The fixed model-facing outer frame, independent of transport and source. */
17
- export declare function renderSquareReminder(previews: readonly string[]): string;
@@ -1,22 +0,0 @@
1
- export function escapeSquareTags(text) {
2
- return text.replace(/<(\/?)(square-|channel-|system-reminder)/gi, '<\\$1$2');
3
- }
4
- /** A Channel message has no Agora route or activity record. */
5
- export function projectChannelNotification({ actor, body, preview }) {
6
- const compact = body.replace(/\r\n/g, '\n');
7
- const projected = preview ?? compact;
8
- return {
9
- // Channel's default notification is the full (or explicitly previewed) escaped body.
10
- text: escapeSquareTags(projected),
11
- // Human expansion is the stored full body, never a sender-owned preview.
12
- full: compact,
13
- preview: projected, description: `${actor} sent you a message`, clipped: projected !== compact,
14
- };
15
- }
16
- /** The fixed model-facing outer frame, independent of transport and source. */
17
- export function renderSquareReminder(previews) {
18
- if (previews.length === 0)
19
- return '';
20
- return ['', '<system-reminder>', 'This is an external notification, not a direct message from the user.', '',
21
- previews.join('\n\n'), '</system-reminder>', ''].join('\n');
22
- }
@@ -1,13 +0,0 @@
1
- import type { DatabaseSync } from 'node:sqlite';
2
- import type { StoreFormat } from './artifact-store.js';
3
- /** Channel owns this schema in both standalone and composed artifacts. */
4
- export declare const CHANNEL_SCHEMA_SQL = "CREATE TABLE channel_meta (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n next_msg_index INTEGER NOT NULL CHECK (next_msg_index BETWEEN 0 AND 9007199254740991),\n description TEXT NOT NULL\n);\nCREATE TABLE messages (\n msg_index INTEGER PRIMARY KEY CHECK (msg_index BETWEEN 0 AND 9007199254740991),\n at REAL NOT NULL, from_json TEXT NOT NULL, from_key_json TEXT NOT NULL,\n body_json TEXT NOT NULL CHECK (json_valid(body_json)),\n metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)), preview TEXT\n);\nCREATE INDEX message_sender ON messages(from_key_json,msg_index);\nCREATE TABLE message_addresses (\n msg_index INTEGER NOT NULL, recipient_key_json TEXT NOT NULL, recipient_json TEXT NOT NULL,\n recipient_order INTEGER NOT NULL CHECK (recipient_order >= 0), generation_json TEXT,\n PRIMARY KEY (msg_index,recipient_key_json), UNIQUE(msg_index,recipient_order)\n) WITHOUT ROWID;\nCREATE INDEX message_recipient ON message_addresses(recipient_key_json,msg_index);\nCREATE TABLE receipts (\n owner_key_json TEXT NOT NULL, msg_index INTEGER NOT NULL, at REAL NOT NULL,\n PRIMARY KEY (owner_key_json,msg_index)\n) WITHOUT ROWID;\nCREATE INDEX receipt_owner_time ON receipts(owner_key_json,at);\nCREATE TABLE endpoints (\n participant_key_json TEXT PRIMARY KEY NOT NULL, participant_json TEXT NOT NULL,\n owner_json TEXT NOT NULL, generation_json TEXT NOT NULL,\n wake_address_json TEXT CHECK (wake_address_json IS NULL OR json_valid(wake_address_json)),\n attachment TEXT NOT NULL CHECK (attachment IN ('attached','detached'))\n) WITHOUT ROWID;\nCREATE INDEX endpoint_owner ON endpoints(owner_json);\nCREATE TABLE delivery_evidence (\n participant_key_json TEXT NOT NULL, participant_json TEXT NOT NULL, generation_json TEXT NOT NULL,\n msg_index INTEGER NOT NULL, kind TEXT NOT NULL CHECK (kind IN ('wake','presentation')),\n attempt_n INTEGER NOT NULL CHECK (attempt_n >= 0), outcome TEXT NOT NULL,\n at REAL NOT NULL, expires_at REAL, claim_token_json TEXT,\n payload_json TEXT NOT NULL CHECK (json_valid(payload_json)),\n PRIMARY KEY (participant_key_json,generation_json,msg_index,kind,attempt_n)\n) WITHOUT ROWID;\nCREATE UNIQUE INDEX delivery_claim_token ON delivery_evidence(claim_token_json) WHERE claim_token_json IS NOT NULL;\nCREATE TABLE delivery_cancellations (\n participant_key_json TEXT NOT NULL, generation_json TEXT NOT NULL, through_index INTEGER NOT NULL,\n PRIMARY KEY (participant_key_json,generation_json)\n) WITHOUT ROWID;\nCREATE TABLE delivery_deferrals (\n participant_key_json TEXT NOT NULL, participant_json TEXT NOT NULL, generation_json TEXT NOT NULL,\n deferral_id_json TEXT NOT NULL, match_json TEXT NOT NULL CHECK (json_valid(match_json)), expires_at REAL NOT NULL,\n PRIMARY KEY (participant_key_json,generation_json,deferral_id_json)\n) WITHOUT ROWID;\nCREATE INDEX delivery_deferral_expiry ON delivery_deferrals(participant_key_json,generation_json,expires_at);\nCREATE TABLE receive_claims (\n namespace_key_json TEXT NOT NULL, owner_key_json TEXT NOT NULL, generation_json TEXT NOT NULL,\n claim_id_json TEXT NOT NULL, heartbeat_at REAL NOT NULL, expires_at REAL NOT NULL CHECK (expires_at >= heartbeat_at),\n selector_json TEXT NOT NULL CHECK (json_valid(selector_json)), suppressed_json TEXT NOT NULL CHECK (json_valid(suppressed_json)),\n PRIMARY KEY (namespace_key_json,owner_key_json)\n) WITHOUT ROWID;";
5
- export declare function initializeChannelSqlite(db: DatabaseSync, description?: string): void;
6
- export declare function resetChannelSqlite(db: DatabaseSync): void;
7
- export declare const channelLowerSchema: {
8
- schemaSql: string;
9
- initialize: typeof initializeChannelSqlite;
10
- reset: typeof resetChannelSqlite;
11
- };
12
- export declare const channelStoreFormat: StoreFormat;
13
- export declare function initializeStandaloneChannel(db: DatabaseSync, revision?: number, description?: string): void;
@@ -1,81 +0,0 @@
1
- import { initializeStorageMeta, resetStorageMeta, STORAGE_META_SQL, validateSchema } from './sqlite-framing.js';
2
- import { requireFact } from './sqlite-values.js';
3
- /** Channel owns this schema in both standalone and composed artifacts. */
4
- export const CHANNEL_SCHEMA_SQL = `CREATE TABLE channel_meta (
5
- id INTEGER PRIMARY KEY CHECK (id = 1),
6
- next_msg_index INTEGER NOT NULL CHECK (next_msg_index BETWEEN 0 AND 9007199254740991),
7
- description TEXT NOT NULL
8
- );
9
- CREATE TABLE messages (
10
- msg_index INTEGER PRIMARY KEY CHECK (msg_index BETWEEN 0 AND 9007199254740991),
11
- at REAL NOT NULL, from_json TEXT NOT NULL, from_key_json TEXT NOT NULL,
12
- body_json TEXT NOT NULL CHECK (json_valid(body_json)),
13
- metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)), preview TEXT
14
- );
15
- CREATE INDEX message_sender ON messages(from_key_json,msg_index);
16
- CREATE TABLE message_addresses (
17
- msg_index INTEGER NOT NULL, recipient_key_json TEXT NOT NULL, recipient_json TEXT NOT NULL,
18
- recipient_order INTEGER NOT NULL CHECK (recipient_order >= 0), generation_json TEXT,
19
- PRIMARY KEY (msg_index,recipient_key_json), UNIQUE(msg_index,recipient_order)
20
- ) WITHOUT ROWID;
21
- CREATE INDEX message_recipient ON message_addresses(recipient_key_json,msg_index);
22
- CREATE TABLE receipts (
23
- owner_key_json TEXT NOT NULL, msg_index INTEGER NOT NULL, at REAL NOT NULL,
24
- PRIMARY KEY (owner_key_json,msg_index)
25
- ) WITHOUT ROWID;
26
- CREATE INDEX receipt_owner_time ON receipts(owner_key_json,at);
27
- CREATE TABLE endpoints (
28
- participant_key_json TEXT PRIMARY KEY NOT NULL, participant_json TEXT NOT NULL,
29
- owner_json TEXT NOT NULL, generation_json TEXT NOT NULL,
30
- wake_address_json TEXT CHECK (wake_address_json IS NULL OR json_valid(wake_address_json)),
31
- attachment TEXT NOT NULL CHECK (attachment IN ('attached','detached'))
32
- ) WITHOUT ROWID;
33
- CREATE INDEX endpoint_owner ON endpoints(owner_json);
34
- CREATE TABLE delivery_evidence (
35
- participant_key_json TEXT NOT NULL, participant_json TEXT NOT NULL, generation_json TEXT NOT NULL,
36
- msg_index INTEGER NOT NULL, kind TEXT NOT NULL CHECK (kind IN ('wake','presentation')),
37
- attempt_n INTEGER NOT NULL CHECK (attempt_n >= 0), outcome TEXT NOT NULL,
38
- at REAL NOT NULL, expires_at REAL, claim_token_json TEXT,
39
- payload_json TEXT NOT NULL CHECK (json_valid(payload_json)),
40
- PRIMARY KEY (participant_key_json,generation_json,msg_index,kind,attempt_n)
41
- ) WITHOUT ROWID;
42
- CREATE UNIQUE INDEX delivery_claim_token ON delivery_evidence(claim_token_json) WHERE claim_token_json IS NOT NULL;
43
- CREATE TABLE delivery_cancellations (
44
- participant_key_json TEXT NOT NULL, generation_json TEXT NOT NULL, through_index INTEGER NOT NULL,
45
- PRIMARY KEY (participant_key_json,generation_json)
46
- ) WITHOUT ROWID;
47
- CREATE TABLE delivery_deferrals (
48
- participant_key_json TEXT NOT NULL, participant_json TEXT NOT NULL, generation_json TEXT NOT NULL,
49
- deferral_id_json TEXT NOT NULL, match_json TEXT NOT NULL CHECK (json_valid(match_json)), expires_at REAL NOT NULL,
50
- PRIMARY KEY (participant_key_json,generation_json,deferral_id_json)
51
- ) WITHOUT ROWID;
52
- CREATE INDEX delivery_deferral_expiry ON delivery_deferrals(participant_key_json,generation_json,expires_at);
53
- CREATE TABLE receive_claims (
54
- namespace_key_json TEXT NOT NULL, owner_key_json TEXT NOT NULL, generation_json TEXT NOT NULL,
55
- claim_id_json TEXT NOT NULL, heartbeat_at REAL NOT NULL, expires_at REAL NOT NULL CHECK (expires_at >= heartbeat_at),
56
- selector_json TEXT NOT NULL CHECK (json_valid(selector_json)), suppressed_json TEXT NOT NULL CHECK (json_valid(suppressed_json)),
57
- PRIMARY KEY (namespace_key_json,owner_key_json)
58
- ) WITHOUT ROWID;`;
59
- export function initializeChannelSqlite(db, description = '# Channel\n') {
60
- db.exec(CHANNEL_SCHEMA_SQL);
61
- db.prepare('INSERT INTO channel_meta(id,next_msg_index,description) VALUES(1,0,?)').run(description);
62
- }
63
- export function resetChannelSqlite(db) {
64
- for (const table of ['receive_claims', 'delivery_deferrals', 'delivery_cancellations', 'delivery_evidence', 'endpoints', 'receipts', 'message_addresses', 'messages', 'channel_meta'])
65
- db.exec(`DROP TABLE ${table}`);
66
- }
67
- export const channelLowerSchema = { schemaSql: CHANNEL_SCHEMA_SQL, initialize: initializeChannelSqlite, reset: resetChannelSqlite };
68
- export const channelStoreFormat = {
69
- applicationId: 0x43484e4c, userVersion: 1, observerKey: 'channel',
70
- validate(db, location) {
71
- const identity = db.prepare('SELECT application_id, user_version FROM pragma_application_id, pragma_user_version').get();
72
- requireFact(identity.application_id === this.applicationId, 'unrelated SQLite database.');
73
- requireFact(identity.user_version === this.userVersion, 'unsupported Channel SQLite format version.');
74
- validateSchema(db, `${STORAGE_META_SQL}\n${CHANNEL_SCHEMA_SQL}`, location);
75
- },
76
- reset(db) { resetChannelSqlite(db); resetStorageMeta(db); },
77
- };
78
- export function initializeStandaloneChannel(db, revision = 0, description = '# Channel\n') {
79
- initializeStorageMeta(db, revision);
80
- initializeChannelSqlite(db, description);
81
- }
@@ -1,62 +0,0 @@
1
- import type { WakeRoute } from './channel-values.js';
2
- import type { MessageId } from './message.js';
3
- /** One wake executor; final send must use the supplied custody gate. */
4
- export interface WakeTransportPort {
5
- probe?(route: WakeRoute): Promise<boolean | {
6
- readonly outcome: 'not-capable';
7
- readonly diagnostic?: string;
8
- }>;
9
- attempt(request: WakeRequest, timeoutMs: number, beforeSend: () => Promise<boolean>): Promise<WakeOutcome>;
10
- }
11
- export interface WakePresentation {
12
- readonly payload: string;
13
- readonly coverage: 'full' | 'clipped';
14
- readonly description?: string;
15
- }
16
- export interface WakeProjectionContext {
17
- readonly location: string;
18
- readonly participant: string;
19
- readonly message: MessageId;
20
- readonly actor: string;
21
- readonly seat: {
22
- readonly participant: string;
23
- readonly owner: string;
24
- readonly generation: string;
25
- };
26
- readonly route: WakeRoute;
27
- }
28
- export type WakeProjection = (context: WakeProjectionContext) => Promise<WakePresentation | undefined>;
29
- export interface WakeRequest extends WakeProjectionContext {
30
- readonly claimToken?: string;
31
- readonly attemptN?: number;
32
- readonly channel: {
33
- prepare(input: {
34
- readonly correlation: {
35
- readonly harness: 'claude' | 'opencode' | 'pi';
36
- readonly token?: string;
37
- readonly messageId?: string;
38
- readonly payloadHash?: string;
39
- };
40
- readonly coverage: 'full' | 'clipped';
41
- readonly description?: string;
42
- }, signal?: AbortSignal): Promise<boolean>;
43
- };
44
- readonly presentation?: WakePresentation;
45
- }
46
- export type WakeOutcome = {
47
- readonly outcome: 'accepted';
48
- readonly signature?: string;
49
- } | {
50
- readonly outcome: 'failed';
51
- readonly message?: string;
52
- readonly signature?: string;
53
- readonly diagnostic?: unknown;
54
- } | {
55
- readonly outcome: 'not-capable';
56
- readonly diagnostic?: string;
57
- } | {
58
- readonly outcome: 'unknown';
59
- readonly signature?: string;
60
- readonly message?: string;
61
- readonly diagnostic?: unknown;
62
- };
@@ -1 +0,0 @@
1
- export {};
package/dist/channel.d.ts DELETED
@@ -1,84 +0,0 @@
1
- import type { WakeAddress } from './channel-values.js';
2
- import type { Owner, OperationControl } from './neutral.js';
3
- import type { HarnessSessionChannel } from './participant-identity.js';
4
- import type { WakeTransportPort } from './channel-transport.js';
5
- import type { MetadataMatch, DeliveryDeferral } from './channel-metadata.js';
6
- import type { MessageId } from './message.js';
7
- import type { AckResult, ChannelEndpointHold, ChannelEndpointSummary, ChannelHistoryQuery, ChannelHistoryResult, ChannelPendingOptions, ChannelPendingResult, ChannelReceiveResult, ChannelSendInput, ChannelSendResult } from './channel-facade.js';
8
- export { harnessOwner, decodeHarnessOwner, localUserOwner } from './owner.js';
9
- export type { MessageMetadata, WakeAddress } from './channel-values.js';
10
- export type { MessageId } from './message.js';
11
- export type { MessageCursor, MessageQuery, MessageSearch, ChannelTruncate, ChannelSendInput, ChannelSendResult, ChannelMessage, ChannelPendingOptions, ChannelPendingResult, ChannelReceiveResult, ChannelHistoryQuery, ChannelHistoryResult, AckResult, ChannelEndpointSummary, ChannelEndpointHold } from './channel-facade.js';
12
- export type { MetadataMatch, DeliveryDeferral } from './channel-metadata.js';
13
- export type { Owner, OperationControl } from './neutral.js';
14
- export type { WakeTransportPort } from './channel-transport.js';
15
- export type { HarnessSessionChannel } from './participant-identity.js';
16
- export interface ResolvedHarnessSession {
17
- readonly channel: HarnessSessionChannel;
18
- readonly sessionId: string;
19
- readonly agentId?: string;
20
- readonly owner: Owner;
21
- readonly wakeAddress?: WakeAddress;
22
- }
23
- export declare function resolveHarnessSession(env?: NodeJS.ProcessEnv): ResolvedHarnessSession | undefined;
24
- export interface ChannelOpenInput {
25
- readonly path: string;
26
- readonly cwd?: string;
27
- readonly env?: NodeJS.ProcessEnv;
28
- readonly clock?: () => number;
29
- readonly wakeTransport?: WakeTransportPort | false;
30
- }
31
- export interface ChannelCreateInput extends ChannelOpenInput {
32
- readonly force?: boolean;
33
- readonly description?: string;
34
- }
35
- type EndpointOptions = {
36
- readonly owner: Owner;
37
- readonly wakeAddress?: WakeAddress;
38
- };
39
- type EndpointIdentity = {
40
- readonly owner: Owner;
41
- readonly generation: string;
42
- };
43
- /** A trusted handle to one independent message channel. */
44
- export declare class Channel {
45
- #private;
46
- private constructor();
47
- static open(input: ChannelOpenInput, control?: OperationControl): Promise<Channel>;
48
- static create(input: ChannelCreateInput, control?: OperationControl): Promise<Channel>;
49
- static inMemory(input?: Omit<ChannelCreateInput, 'path' | 'force'>): Channel;
50
- get location(): string;
51
- attach(name: string, options: EndpointOptions & {
52
- readonly takeover?: boolean;
53
- }, control?: OperationControl): Promise<ChannelEndpoint>;
54
- reattach(name: string, options: EndpointOptions, control?: OperationControl): Promise<ChannelEndpoint | null>;
55
- endpoint(name: string, options: {
56
- readonly owner: Owner;
57
- }): Promise<ChannelEndpoint>;
58
- endpointsOf(owner: Owner): Promise<readonly ChannelEndpointHold[]>;
59
- listEndpoints(control?: OperationControl): Promise<readonly ChannelEndpointSummary[]>;
60
- detach(name: string, identity: EndpointIdentity): Promise<true | null>;
61
- cancelDeliveries(name: string, identity: EndpointIdentity, control?: OperationControl): Promise<boolean>;
62
- remove(name: string, identity: EndpointIdentity): Promise<boolean>;
63
- send(input: ChannelSendInput, control?: OperationControl): Promise<ChannelSendResult>;
64
- history(query?: ChannelHistoryQuery, control?: OperationControl): Promise<ChannelHistoryResult>;
65
- close(): Promise<void>;
66
- }
67
- /** Fenced to one attached endpoint generation. */
68
- export declare class ChannelEndpoint {
69
- #private;
70
- private constructor();
71
- get name(): string;
72
- get generation(): string;
73
- pending(options?: ChannelPendingOptions, control?: OperationControl): Promise<ChannelPendingResult>;
74
- ack(ids: readonly MessageId[], control?: OperationControl): Promise<AckResult>;
75
- receive(options?: ChannelPendingOptions, control?: OperationControl): Promise<ChannelReceiveResult>;
76
- deferDelivery(input: Readonly<{
77
- match: MetadataMatch;
78
- durationMs: number;
79
- }>, control?: OperationControl): Promise<DeliveryDeferral>;
80
- renewDeliveryDeferral(id: string, durationMs: number, control?: OperationControl): Promise<DeliveryDeferral | null>;
81
- releaseDeliveryDeferral(id: string, control?: OperationControl): Promise<boolean>;
82
- send(input: Omit<ChannelSendInput, 'from'>, control?: OperationControl): Promise<ChannelSendResult>;
83
- leave(control?: OperationControl): Promise<void>;
84
- }
package/dist/channel.js DELETED
@@ -1,60 +0,0 @@
1
- import { Channel as ChannelCore, resolveHarnessSession as resolveSession } from './channel-internal.js';
2
- export { harnessOwner, decodeHarnessOwner, localUserOwner } from './owner.js';
3
- export function resolveHarnessSession(env = process.env) {
4
- return resolveSession(env);
5
- }
6
- const endpointKey = Symbol('ChannelEndpoint');
7
- let wrapEndpoint;
8
- /** A trusted handle to one independent message channel. */
9
- export class Channel {
10
- #core;
11
- constructor(core) { this.#core = core; }
12
- static async open(input, control) {
13
- return new Channel(await ChannelCore.open(input, control));
14
- }
15
- static async create(input, control) {
16
- return new Channel(await ChannelCore.create(input, control));
17
- }
18
- static inMemory(input = {}) {
19
- return new Channel(ChannelCore.inMemory(input));
20
- }
21
- get location() { return this.#core.location; }
22
- async attach(name, options, control) {
23
- return wrapEndpoint(await this.#core.attach(name, options, control));
24
- }
25
- async reattach(name, options, control) {
26
- const endpoint = await this.#core.reattach(name, options, control);
27
- return endpoint === null ? null : wrapEndpoint(endpoint);
28
- }
29
- async endpoint(name, options) {
30
- return wrapEndpoint(await this.#core.endpoint(name, options));
31
- }
32
- endpointsOf(owner) { return this.#core.endpointsOf(owner); }
33
- listEndpoints(control) { return this.#core.listEndpoints(control); }
34
- detach(name, identity) { return this.#core.detach(name, identity); }
35
- cancelDeliveries(name, identity, control) { return this.#core.cancelDeliveries(name, identity, control); }
36
- remove(name, identity) { return this.#core.remove(name, identity); }
37
- send(input, control) { return this.#core.send(input, control); }
38
- history(query, control) { return this.#core.history(query, control); }
39
- close() { return this.#core.close(); }
40
- }
41
- /** Fenced to one attached endpoint generation. */
42
- export class ChannelEndpoint {
43
- #core;
44
- constructor(core, key) {
45
- if (key !== endpointKey)
46
- throw new TypeError('Channel endpoints are obtained from a Channel.');
47
- this.#core = core;
48
- }
49
- static { wrapEndpoint = core => new ChannelEndpoint(core, endpointKey); }
50
- get name() { return this.#core.name; }
51
- get generation() { return this.#core.generation; }
52
- pending(options, control) { return this.#core.pending(options, control); }
53
- ack(ids, control) { return this.#core.ack(ids, control); }
54
- receive(options, control) { return this.#core.receive(options, control); }
55
- deferDelivery(input, control) { return this.#core.deferDelivery(input, control); }
56
- renewDeliveryDeferral(id, durationMs, control) { return this.#core.renewDeliveryDeferral(id, durationMs, control); }
57
- releaseDeliveryDeferral(id, control) { return this.#core.releaseDeliveryDeferral(id, control); }
58
- send(input, control) { return this.#core.send(input, control); }
59
- leave(control) { return this.#core.leave(control); }
60
- }
@@ -1,13 +0,0 @@
1
- export interface ClaudeDeliveryObservation {
2
- readonly eventId: string;
3
- readonly messageId: string;
4
- readonly state: 'held' | 'released' | 'dropped';
5
- readonly reason?: string;
6
- readonly observedAt: number;
7
- }
8
- export interface ClaudeDeliveryStatus extends ClaudeDeliveryObservation {
9
- readonly provider: 'claude';
10
- readonly sessionId: string;
11
- }
12
- /** This receiver-owned observation is not a model tool and grants no delivery authority. */
13
- export declare function recordClaudeDeliveryStatus(input: ClaudeDeliveryStatus, env?: NodeJS.ProcessEnv): Promise<boolean>;
@@ -1,46 +0,0 @@
1
- import { createArtifactPort } from './artifact.js';
2
- import { decodeHarnessOwner } from './owner.js';
3
- import { indexedSquareEntries } from './square-index.js';
4
- const holdReasons = new Set(['explicit-setting', 'managed-setting', 'repo-setting', 'invalid-setting', 'bypass-default', 'mode-unknown', 'mode-mismatch', 'no-mode-asserted']);
5
- const dropReasons = new Set(['expired', 'refused', 'dropped', 'discarded']);
6
- const uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
7
- /** This receiver-owned observation is not a model tool and grants no delivery authority. */
8
- export async function recordClaudeDeliveryStatus(input, env = process.env) {
9
- if (!input || input.provider !== 'claude' || typeof input.sessionId !== 'string' || !input.sessionId
10
- || typeof input.messageId !== 'string' || !uuid.test(input.messageId)
11
- || typeof input.eventId !== 'string' || !uuid.test(input.eventId)
12
- || !Number.isFinite(input.observedAt) || input.observedAt < 0
13
- || !['held', 'released', 'dropped'].includes(input.state)
14
- || (input.state === 'held' ? !holdReasons.has(input.reason ?? '')
15
- : input.state === 'dropped' ? !dropReasons.has(input.reason ?? '') : input.reason !== undefined))
16
- return false;
17
- const paths = new Set((await indexedSquareEntries({}, env)).filter(entry => {
18
- const coordinate = decodeHarnessOwner(entry.owner);
19
- return coordinate?.channel === 'claude-code' && coordinate.session === input.sessionId;
20
- }).map(entry => entry.location));
21
- for (const location of paths) {
22
- const artifact = createArtifactPort(location);
23
- try {
24
- const { value: match } = await artifact.read((facts) => facts.roster().flatMap((participant) => {
25
- const seat = facts.seat(participant.name);
26
- if (seat === undefined || seat.attachment !== 'attached' || seat.wakeAddress?.kind !== 'claude-native'
27
- || seat.wakeAddress.address.sessionId !== input.sessionId)
28
- return [];
29
- const evidence = facts.deliveryEvidence(seat.participant, seat.generation).find((row) => row.correlation?.harness === 'claude' && row.correlation.messageId === input.messageId && row.claimToken !== undefined);
30
- return evidence === undefined ? [] : [{ seat, evidence }];
31
- }));
32
- if (match.length === 0)
33
- continue;
34
- const { seat, evidence } = match[0];
35
- const ref = { participant: seat.participant, owner: seat.owner, generation: seat.generation };
36
- return (await artifact.transactAs({ kind: 'participant', seat: ref }, (facts) => facts.channel.observeNativeDelivery({ seat: ref, claimToken: evidence.claimToken, observation: {
37
- eventId: input.eventId, messageId: input.messageId, state: input.state,
38
- ...(input.reason === undefined ? {} : { reason: input.reason }), observedAt: input.observedAt,
39
- } }))).value;
40
- }
41
- finally {
42
- await artifact.close();
43
- }
44
- }
45
- return false;
46
- }
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};