agent-embassy 1.7.0 → 1.8.0

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 (118) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/CONTRIBUTING.md +51 -47
  3. package/README.md +26 -9
  4. package/README.zh-CN.md +22 -9
  5. package/SECURITY.md +48 -35
  6. package/dist/src/gateway/acp-client.d.ts +12 -19
  7. package/dist/src/gateway/acp-client.js +90 -65
  8. package/dist/src/gateway/acp-client.js.map +1 -1
  9. package/dist/src/gateway/acp-provider.d.ts +11 -10
  10. package/dist/src/gateway/acp-provider.js +165 -53
  11. package/dist/src/gateway/acp-provider.js.map +1 -1
  12. package/dist/src/gateway/claude-helper-client.d.ts +2 -43
  13. package/dist/src/gateway/claude-helper-client.js +1 -211
  14. package/dist/src/gateway/claude-helper-client.js.map +1 -1
  15. package/dist/src/gateway/claude-helper-protocol.d.ts +16 -74
  16. package/dist/src/gateway/claude-helper-protocol.js +99 -378
  17. package/dist/src/gateway/claude-helper-protocol.js.map +1 -1
  18. package/dist/src/gateway/claude-helper-supervisor.d.ts +56 -44
  19. package/dist/src/gateway/claude-helper-supervisor.js +265 -456
  20. package/dist/src/gateway/claude-helper-supervisor.js.map +1 -1
  21. package/dist/src/gateway/claude-helper.js +184 -210
  22. package/dist/src/gateway/claude-helper.js.map +1 -1
  23. package/dist/src/gateway/claude-peer.d.ts +20 -87
  24. package/dist/src/gateway/claude-peer.js +310 -1009
  25. package/dist/src/gateway/claude-peer.js.map +1 -1
  26. package/dist/src/gateway/claude-runtime.d.ts +13 -15
  27. package/dist/src/gateway/claude-runtime.js +14 -168
  28. package/dist/src/gateway/claude-runtime.js.map +1 -1
  29. package/dist/src/gateway/cli-copy.en.d.ts +2 -2
  30. package/dist/src/gateway/cli-copy.en.js +4 -2
  31. package/dist/src/gateway/cli-copy.en.js.map +1 -1
  32. package/dist/src/gateway/cli-copy.zh-CN.d.ts +2 -2
  33. package/dist/src/gateway/cli-copy.zh-CN.js +4 -2
  34. package/dist/src/gateway/cli-copy.zh-CN.js.map +1 -1
  35. package/dist/src/gateway/cli.d.ts +7 -2
  36. package/dist/src/gateway/cli.js +277 -575
  37. package/dist/src/gateway/cli.js.map +1 -1
  38. package/dist/src/gateway/codex-app-server.d.ts +5 -227
  39. package/dist/src/gateway/codex-app-server.js +18 -1463
  40. package/dist/src/gateway/codex-app-server.js.map +1 -1
  41. package/dist/src/gateway/codex-doctor.d.ts +36 -0
  42. package/dist/src/gateway/codex-doctor.js +127 -0
  43. package/dist/src/gateway/codex-doctor.js.map +1 -0
  44. package/dist/src/gateway/codex-local-transport.d.ts +6 -6
  45. package/dist/src/gateway/codex-local-transport.js +13 -10
  46. package/dist/src/gateway/codex-local-transport.js.map +1 -1
  47. package/dist/src/gateway/codex-stateless-transport.d.ts +114 -0
  48. package/dist/src/gateway/codex-stateless-transport.js +1108 -0
  49. package/dist/src/gateway/codex-stateless-transport.js.map +1 -0
  50. package/dist/src/gateway/config.d.ts +2 -9
  51. package/dist/src/gateway/config.js +62 -100
  52. package/dist/src/gateway/config.js.map +1 -1
  53. package/dist/src/gateway/control.d.ts +36 -90
  54. package/dist/src/gateway/control.js +465 -1123
  55. package/dist/src/gateway/control.js.map +1 -1
  56. package/dist/src/gateway/dashboard-copy.d.ts +1 -1
  57. package/dist/src/gateway/dashboard-copy.en.d.ts +8 -26
  58. package/dist/src/gateway/dashboard-copy.en.js +19 -37
  59. package/dist/src/gateway/dashboard-copy.en.js.map +1 -1
  60. package/dist/src/gateway/dashboard-copy.js +8 -26
  61. package/dist/src/gateway/dashboard-copy.js.map +1 -1
  62. package/dist/src/gateway/dashboard-copy.zh-CN.d.ts +8 -26
  63. package/dist/src/gateway/dashboard-copy.zh-CN.js +19 -37
  64. package/dist/src/gateway/dashboard-copy.zh-CN.js.map +1 -1
  65. package/dist/src/gateway/dashboard-model.d.ts +8 -22
  66. package/dist/src/gateway/dashboard-model.js +44 -130
  67. package/dist/src/gateway/dashboard-model.js.map +1 -1
  68. package/dist/src/gateway/dashboard.d.ts +0 -6
  69. package/dist/src/gateway/dashboard.js +3 -7
  70. package/dist/src/gateway/dashboard.js.map +1 -1
  71. package/dist/src/gateway/live-dashboard-app/app.js +20 -34
  72. package/dist/src/gateway/live-dashboard-command.js +2 -2
  73. package/dist/src/gateway/live-dashboard-command.js.map +1 -1
  74. package/dist/src/gateway/live-dashboard-http.d.ts +1 -1
  75. package/dist/src/gateway/live-dashboard-http.js +2 -2
  76. package/dist/src/gateway/live-dashboard-http.js.map +1 -1
  77. package/dist/src/gateway/progress-watch-machine.d.ts +1 -37
  78. package/dist/src/gateway/progress-watch-machine.js +4 -15
  79. package/dist/src/gateway/progress-watch-machine.js.map +1 -1
  80. package/dist/src/gateway/providers.d.ts +58 -191
  81. package/dist/src/gateway/providers.js +637 -2434
  82. package/dist/src/gateway/providers.js.map +1 -1
  83. package/dist/src/gateway/server.d.ts +16 -25
  84. package/dist/src/gateway/server.js +165 -240
  85. package/dist/src/gateway/server.js.map +1 -1
  86. package/dist/src/gateway/service.d.ts +149 -427
  87. package/dist/src/gateway/service.js +1639 -5662
  88. package/dist/src/gateway/service.js.map +1 -1
  89. package/dist/src/gateway/state-v2-to-v3.d.ts +23 -0
  90. package/dist/src/gateway/state-v2-to-v3.js +994 -0
  91. package/dist/src/gateway/state-v2-to-v3.js.map +1 -0
  92. package/dist/src/gateway/store.d.ts +54 -309
  93. package/dist/src/gateway/store.js +1560 -3510
  94. package/dist/src/gateway/store.js.map +1 -1
  95. package/dist/src/gateway/types.d.ts +181 -225
  96. package/dist/src/gateway/types.js +115 -251
  97. package/dist/src/gateway/types.js.map +1 -1
  98. package/docs/CONFIGURATION.md +22 -9
  99. package/docs/CONFIGURATION.zh-CN.md +21 -9
  100. package/docs/DASHBOARD.md +10 -10
  101. package/docs/DASHBOARD.zh-CN.md +3 -3
  102. package/docs/DELIVERY.md +4 -4
  103. package/docs/DELIVERY.zh-CN.md +4 -4
  104. package/docs/GATEWAY-ARCHITECTURE.md +158 -187
  105. package/package.json +1 -1
  106. package/skills/embassy-peer/SKILL.md +28 -22
  107. package/dist/src/gateway/codex-registration-generation.d.ts +0 -5
  108. package/dist/src/gateway/codex-registration-generation.js +0 -19
  109. package/dist/src/gateway/codex-registration-generation.js.map +0 -1
  110. package/dist/src/gateway/codex-registration-succession.d.ts +0 -209
  111. package/dist/src/gateway/codex-registration-succession.js +0 -588
  112. package/dist/src/gateway/codex-registration-succession.js.map +0 -1
  113. package/dist/src/gateway/compatibility.d.ts +0 -22
  114. package/dist/src/gateway/compatibility.js +0 -23
  115. package/dist/src/gateway/compatibility.js.map +0 -1
  116. package/dist/src/gateway/delivery-machine.d.ts +0 -235
  117. package/dist/src/gateway/delivery-machine.js +0 -540
  118. package/dist/src/gateway/delivery-machine.js.map +0 -1
@@ -1,24 +1,16 @@
1
1
  import { type Socket } from "node:net";
2
2
  import type { GatewayDeliveryNoticeMode } from "./config.js";
3
3
  import { type DashboardLocale } from "./locale.js";
4
- /**
5
- * This adapter intentionally pins the inspected, implementation-specific
6
- * local peer boundary. The feature is documented in Claude Code, but its
7
- * registry and NDJSON formats are not a stable public integration contract.
8
- */
9
4
  export declare const CLAUDE_PEER_COMPATIBILITY: Readonly<{
10
- claudeCodeVersion: "2.1.227";
11
5
  peerProtocol: 1;
12
- messageVersion: 1;
13
6
  }>;
14
7
  export declare const claudePeerStatuses: readonly ["busy", "shell", "idle", "waiting"];
15
8
  export type ClaudePeerStatus = (typeof claudePeerStatuses)[number];
16
9
  export declare const claudePeerKinds: readonly ["interactive", "bg", "daemon", "daemon-worker"];
17
10
  export type ClaudePeerKind = (typeof claudePeerKinds)[number];
18
- export declare const claudePeerRejectionCodes: readonly ["ENTRY_LIMIT_EXCEEDED", "INVALID_FILE_NAME", "REGISTRY_NOT_REGULAR", "REGISTRY_OWNER_MISMATCH", "REGISTRY_MODE_UNSAFE", "REGISTRY_TOO_LARGE", "REGISTRY_RACED", "REGISTRY_INVALID_JSON", "REGISTRY_INVALID_SCHEMA", "PID_MISMATCH", "PID_NOT_LIVE", "PID_OWNER_MISMATCH", "SOCKET_OUTSIDE_ROOT", "SOCKET_NOT_SOCKET", "SOCKET_OWNER_MISMATCH", "SOCKET_MODE_UNSAFE", "SELF_TARGET", "SESSION_ID_COLLISION"];
11
+ export declare const claudePeerRejectionCodes: readonly ["ENTRY_LIMIT_EXCEEDED", "INVALID_FILE_NAME", "REGISTRY_NOT_REGULAR", "REGISTRY_TOO_LARGE", "REGISTRY_RACED", "REGISTRY_INVALID_JSON", "REGISTRY_INVALID_SCHEMA", "PID_MISMATCH", "PID_NOT_LIVE", "PID_OWNER_MISMATCH", "SOCKET_OUTSIDE_ROOT", "SOCKET_NOT_SOCKET", "SELF_TARGET", "SESSION_ID_COLLISION"];
19
12
  export type ClaudePeerRejectionCode = (typeof claudePeerRejectionCodes)[number];
20
13
  export type ClaudePeerDescriptor = {
21
- /** Claude's stable logical session UUID. Names and sockets are not identity. */
22
14
  targetId: string;
23
15
  alias: string;
24
16
  kind: ClaudePeerKind;
@@ -29,20 +21,13 @@ export type ClaudePeerDiscovery = {
29
21
  peers: ClaudePeerDescriptor[];
30
22
  rejected: Partial<Record<ClaudePeerRejectionCode, number>>;
31
23
  truncated: boolean;
32
- /** Bounded registry entries examined, including safely skipped records. */
33
24
  entriesScanned: number;
34
- /** Records whose required known fields parsed before later liveness checks. */
35
25
  parseableRecords: number;
36
26
  };
37
- export type ClaudePeerTransportStatus = "connecting" | "write_started" | "transport_written" | "ambiguous" | "not_written";
38
- export type ClaudePeerReceiptStatus = "held"
39
- /** Native `delivered`: approval released the frame to Claude's queue. */
40
- | "released" | "denied" | "expired" | "unconfirmed" | "ambiguous";
41
27
  export type ClaudePeerDeliveryDiagnostic = {
42
- /** Stable, non-sensitive gateway code rendered into Claude's context. */
43
28
  code: string;
44
29
  };
45
- export declare const claudePeerInboundStallReasons: readonly ["ROUTE_BUSY", "ROUTE_UNAVAILABLE", "CODEX_ROUTE_STALE", "AWAITING_EXTERNAL_APPROVAL"];
30
+ export declare const claudePeerInboundStallReasons: readonly ["ROUTE_BUSY", "ROUTE_UNAVAILABLE", "AWAITING_EXTERNAL_APPROVAL"];
46
31
  export type ClaudePeerInboundStallReason = (typeof claudePeerInboundStallReasons)[number];
47
32
  export type ClaudePeerInboundProgress = {
48
33
  kind: "stall";
@@ -52,33 +37,20 @@ export type ClaudePeerInboundProgress = {
52
37
  export type ClaudePeerAcknowledgmentResult = {
53
38
  transportStatus: "transport_written" | "suppressed";
54
39
  };
55
- export type ClaudePeerTransportEvent = {
56
- messageId: string;
57
- status: ClaudePeerTransportStatus;
58
- };
59
- export type ClaudePeerReceiptEvent = {
60
- messageId: string;
61
- status: ClaudePeerReceiptStatus;
62
- trust: "untrusted_same_uid_peer";
63
- };
64
40
  export type ClaudePeerInboundMessage = {
65
41
  inboundId: string;
66
42
  content: string;
67
- /** Validated connect-back capability, not proof of the connecting PID. */
68
43
  sourceTargetId?: string;
69
- /** Display label from that capability; never an authority. */
70
44
  sourceAlias?: string;
71
- /** Opaque listener-owned handle for native held/delivered status updates. */
72
45
  receiptHandle?: string;
73
46
  replySupported: boolean;
74
47
  trust: "untrusted_same_uid_peer" | "untrusted_anonymous_local_peer";
75
48
  };
76
49
  export type ClaudePeerProtocolNotice = {
77
- code: "FRAME_TOO_LARGE" | "INVALID_UTF8" | "INVALID_FRAME" | "UNSUPPORTED_FRAME" | "UNREGISTERED_REPLY_ADDRESS" | "UNKNOWN_RECEIPT" | "INVALID_RECEIPT_TRANSITION" | "RECEIPT_LIMIT" | "CONNECTION_LIMIT" | "CONNECTION_TIMEOUT" | "CALLBACK_ERROR";
50
+ code: "FRAME_TOO_LARGE" | "INVALID_UTF8" | "INVALID_FRAME" | "UNSUPPORTED_FRAME" | "UNREGISTERED_REPLY_ADDRESS" | "RECEIPT_LIMIT" | "CONNECTION_LIMIT" | "CONNECTION_TIMEOUT" | "CALLBACK_ERROR";
78
51
  };
79
52
  export type ClaudeProcessIdentity = {
80
53
  uid: number;
81
- /** Stable only for the lifetime of this process, such as ps(1) lstart. */
82
54
  generation: string;
83
55
  };
84
56
  export type ClaudeProcessInspector = (pid: number) => Promise<ClaudeProcessIdentity | undefined>;
@@ -86,99 +58,69 @@ export type ClaudePeerConnect = (socketPath: string) => Socket;
86
58
  export type ClaudePeerAdapterOptions = {
87
59
  sessionsDir: string;
88
60
  socketDir: string;
89
- /** Bounded metadata from the attested runtime, never user input. */
90
- attestedClaudeCodeVersion: string;
91
- /** Locale for bounded user-visible gateway notices written to Claude. */
92
61
  locale?: DashboardLocale;
93
- /** Gateway-authored user-frame policy; native status frames are unaffected. */
94
62
  deliveryNotices?: GatewayDeliveryNoticeMode;
95
63
  maxRegistryEntries?: number;
96
64
  maxRegistryBytes?: number;
97
65
  maxFrameBytes?: number;
98
- targetLeaseMs?: number;
99
66
  connectTimeoutMs?: number;
100
- receiptDeadlineMs?: number;
101
67
  maxPendingReceipts?: number;
102
68
  maxConnections?: number;
103
69
  connectionIdleMs?: number;
104
70
  maxFramesPerConnection?: number;
105
71
  };
106
- /** Dependency seams for deterministic tests; never populate from config. */
107
72
  export type ClaudePeerAdapterTestOverrides = {
108
- /** Deterministic owner-mismatch seam; production always uses process.getuid(). */
109
73
  expectedUid?: number;
110
74
  processInspector?: ClaudeProcessInspector;
111
75
  connect?: ClaudePeerConnect;
112
76
  now?: () => number;
113
77
  createId?: () => string;
114
- /** Separate from protocol/message UUID generation so lifecycle tests cannot alias it. */
115
- createGeneration?: () => string;
78
+ createArtifactToken?: () => string;
116
79
  registryRename?: (source: string, destination: string) => Promise<void>;
117
80
  registryOperationHook?: (event: {
118
- operation: "advertise" | "publish" | "status" | "unadvertise";
81
+ operation: "advertise" | "status" | "unadvertise";
119
82
  phase: "entered" | "exited";
120
83
  generation: string;
121
84
  }) => void | Promise<void>;
122
85
  userHome?: string;
123
86
  tempRoots?: readonly string[];
124
- registryPublicationHook?: (stage: "before_rename" | "after_rename") => void | Promise<void>;
125
87
  postBindHook?: (socketPath: string) => void | Promise<void>;
126
88
  };
127
- export type ClaudePeerRegistryPublicationOutcome = "published" | "not_published" | "unknown";
128
89
  export type ClaudePeerListenerOptions = {
129
90
  onMessage: (message: ClaudePeerInboundMessage) => void | Promise<void>;
130
- onReceipt?: (event: ClaudePeerReceiptEvent) => void | Promise<void>;
131
91
  onProtocolNotice?: (notice: ClaudePeerProtocolNotice) => void | Promise<void>;
132
92
  };
133
- export type ClaudePeerSendOptions = {
134
- listener?: ClaudePeerListener;
135
- /** Exact gateway message deadline as an epoch-millisecond timestamp. */
136
- receiptDeadlineAt?: number;
137
- onTransportStatus?: (event: ClaudePeerTransportEvent) => void | Promise<void>;
138
- };
139
- export type ClaudePeerSendResult = {
93
+ export type ClaudePeerPreparedSendResult = {
140
94
  messageId: string;
141
95
  transportStatus: "transport_written";
142
- receiptStatus: "pending" | "unavailable";
143
- };
144
- type FileGeneration = {
145
- dev: number;
146
- ino: number;
147
- size: number;
148
- mtimeMs: number;
149
- };
150
- type SocketGeneration = {
151
- dev: number;
152
- ino: number;
153
96
  };
97
+ export type ClaudePeerPreparedSend = Readonly<{
98
+ messageId: string;
99
+ frameBytes: number;
100
+ sha256: string;
101
+ perform: () => Promise<ClaudePeerPreparedSendResult>;
102
+ cancel: () => void;
103
+ }>;
154
104
  type ParsedRegistryRecord = {
155
105
  pid: number;
156
106
  sessionId: string;
157
107
  cwd: string;
158
- peerProtocol: 1;
159
108
  kind: ClaudePeerKind;
160
109
  messagingSocketPath: string;
161
110
  name: string;
162
111
  status: ClaudePeerStatus;
163
112
  embassyAdvertisement: boolean;
164
113
  };
165
- type TargetBinding = {
114
+ type TargetBinding = Readonly<{
166
115
  targetId: string;
167
116
  alias: string;
168
- registryPath: string;
169
- registryGeneration: FileGeneration;
170
- socketGeneration: SocketGeneration;
171
117
  record: ParsedRegistryRecord;
172
- processGeneration: string;
173
- expiresAt: number;
174
- };
118
+ }>;
175
119
  type AdapterLimits = {
176
120
  maxRegistryEntries: number;
177
121
  maxRegistryBytes: number;
178
122
  maxFrameBytes: number;
179
- targetLeaseMs: number;
180
123
  connectTimeoutMs: number;
181
- receiptDeadlineMs: number;
182
124
  maxPendingReceipts: number;
183
125
  maxConnections: number;
184
126
  connectionIdleMs: number;
@@ -206,8 +148,11 @@ export declare class ClaudePeerAdapter {
206
148
  */
207
149
  resolveReplyAddress(address: string): Promise<ClaudePeerDescriptor>;
208
150
  listen(options: ClaudePeerListenerOptions): Promise<ClaudePeerListener>;
209
- listenPrepared(generation: string, options: ClaudePeerListenerOptions): Promise<ClaudePeerListener>;
210
- send(targetId: string, content: string, options?: ClaudePeerSendOptions): Promise<ClaudePeerSendResult>;
151
+ prepareSend(targetId: string, content: string, options: Readonly<{
152
+ deadlineAt: number;
153
+ /** Owned reply address only; no outbound receipt is tracked. */
154
+ replyListener?: ClaudePeerListener;
155
+ }>): Promise<ClaudePeerPreparedSend>;
211
156
  close(): Promise<void>;
212
157
  }
213
158
  type ListenerCreateOptions = {
@@ -217,21 +162,15 @@ type ListenerCreateOptions = {
217
162
  limits: AdapterLimits;
218
163
  createId: () => string;
219
164
  connect: ClaudePeerConnect;
220
- now: () => number;
221
165
  locale: DashboardLocale;
222
166
  deliveryNotices: GatewayDeliveryNoticeMode;
223
- attestedClaudeCodeVersion: string;
224
167
  resolveReplyAddress: (address: string) => Promise<TargetBinding>;
225
168
  resolveSessionBinding: (sessionId: string) => Promise<TargetBinding>;
226
- revalidateBinding: (binding: TargetBinding) => Promise<TargetBinding>;
227
169
  options: ClaudePeerListenerOptions;
228
- owner: object;
229
170
  generation: string;
230
171
  registryRename: (source: string, destination: string) => Promise<void>;
231
172
  registryOperationHook?: ClaudePeerAdapterTestOverrides["registryOperationHook"];
232
173
  runRegistryMutation: <T>(operation: () => Promise<T>) => Promise<T>;
233
- preparedGeneration?: string;
234
- registryPublicationHook?: (stage: "before_rename" | "after_rename") => void | Promise<void>;
235
174
  postBindHook: ClaudePeerAdapterTestOverrides["postBindHook"];
236
175
  onClosed: () => void;
237
176
  };
@@ -243,11 +182,8 @@ export declare class ClaudePeerListener {
243
182
  static create(options: ListenerCreateOptions): Promise<ClaudePeerListener>;
244
183
  get closed(): boolean;
245
184
  advertise(name: string, cwd: string): Promise<void>;
246
- publishReplacing(current: ClaudePeerListener, name: string, cwd: string): Promise<ClaudePeerRegistryPublicationOutcome>;
247
185
  updateAdvertisedStatus(status: ClaudePeerStatus): Promise<void>;
248
186
  unadvertise(name?: string): Promise<void>;
249
- grantSuccessionActivation(): void;
250
- resumeInbound(): void;
251
187
  acknowledge(receiptHandle: string, status: "held" | "delivered" | "denied" | "expired", diagnostic?: ClaudePeerDeliveryDiagnostic): Promise<ClaudePeerAcknowledgmentResult>;
252
188
  /**
253
189
  * Writes one nonterminal gateway progress frame without synthesizing a
@@ -268,9 +204,6 @@ export declare class ClaudePeerListener {
268
204
  * closing the provider socket.
269
205
  */
270
206
  quiesceInbound(): Promise<void>;
271
- track(messageId: string, binding: TargetBinding, receiptDeadlineAt?: number): void;
272
- recordTransportOutcome(messageId: string, outcome: "transport_written" | "transport_uncertain"): void;
273
- untrack(messageId: string): void;
274
207
  close(): Promise<void>;
275
208
  }
276
209
  export {};