sealbridge 0.2.2 → 0.3.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 (251) hide show
  1. package/README.ja.md +492 -30
  2. package/README.md +522 -109
  3. package/dist/cli/dist/accept.d.ts +13 -0
  4. package/dist/cli/dist/accept.js +115 -0
  5. package/dist/cli/dist/accept.js.map +1 -0
  6. package/dist/cli/dist/approval-summary.d.ts +1 -1
  7. package/dist/cli/dist/board.d.ts +10 -9
  8. package/dist/cli/dist/board.js +62 -31
  9. package/dist/cli/dist/board.js.map +1 -1
  10. package/dist/cli/dist/command-identity.d.ts +6 -0
  11. package/dist/cli/dist/command-identity.js +13 -0
  12. package/dist/cli/dist/command-identity.js.map +1 -0
  13. package/dist/cli/dist/config.d.ts +3 -0
  14. package/dist/cli/dist/config.js +29 -0
  15. package/dist/cli/dist/config.js.map +1 -0
  16. package/dist/cli/dist/connections.d.ts +15 -0
  17. package/dist/cli/dist/connections.js +191 -0
  18. package/dist/cli/dist/connections.js.map +1 -0
  19. package/dist/cli/dist/contacts.d.ts +4 -3
  20. package/dist/cli/dist/contacts.js +39 -28
  21. package/dist/cli/dist/contacts.js.map +1 -1
  22. package/dist/cli/dist/doctor.d.ts +9 -0
  23. package/dist/cli/dist/doctor.js +46 -5
  24. package/dist/cli/dist/doctor.js.map +1 -1
  25. package/dist/cli/dist/error-messages.js +22 -0
  26. package/dist/cli/dist/error-messages.js.map +1 -1
  27. package/dist/cli/dist/index.js +44 -6
  28. package/dist/cli/dist/index.js.map +1 -1
  29. package/dist/cli/dist/invite-output.d.ts +14 -0
  30. package/dist/cli/dist/invite-output.js +66 -0
  31. package/dist/cli/dist/invite-output.js.map +1 -0
  32. package/dist/cli/dist/invite-share.d.ts +6 -3
  33. package/dist/cli/dist/invite-share.js +40 -15
  34. package/dist/cli/dist/invite-share.js.map +1 -1
  35. package/dist/cli/dist/invites-migrate.d.ts +3 -0
  36. package/dist/cli/dist/invites-migrate.js +33 -0
  37. package/dist/cli/dist/invites-migrate.js.map +1 -0
  38. package/dist/cli/dist/mcp.d.ts +7 -5
  39. package/dist/cli/dist/mcp.js +23 -18
  40. package/dist/cli/dist/mcp.js.map +1 -1
  41. package/dist/cli/dist/network.d.ts +11 -1
  42. package/dist/cli/dist/network.js +150 -87
  43. package/dist/cli/dist/network.js.map +1 -1
  44. package/dist/cli/dist/pending.d.ts +8 -0
  45. package/dist/cli/dist/pending.js +50 -0
  46. package/dist/cli/dist/pending.js.map +1 -0
  47. package/dist/cli/dist/public-settings.d.ts +5 -4
  48. package/dist/cli/dist/public-settings.js +13 -15
  49. package/dist/cli/dist/public-settings.js.map +1 -1
  50. package/dist/cli/dist/receipt.d.ts +1 -1
  51. package/dist/cli/dist/relay-auth.d.ts +3 -0
  52. package/dist/cli/dist/relay-auth.js +23 -0
  53. package/dist/cli/dist/relay-auth.js.map +1 -0
  54. package/dist/cli/dist/requests.d.ts +10 -0
  55. package/dist/cli/dist/requests.js +91 -0
  56. package/dist/cli/dist/requests.js.map +1 -0
  57. package/dist/cli/dist/sdk.d.ts +10 -0
  58. package/dist/cli/dist/sdk.js +7 -0
  59. package/dist/cli/dist/sdk.js.map +1 -0
  60. package/dist/cli/dist/setup-files.d.ts +24 -0
  61. package/dist/cli/dist/setup-files.js +190 -0
  62. package/dist/cli/dist/setup-files.js.map +1 -0
  63. package/dist/cli/dist/setup-hosts.d.ts +29 -0
  64. package/dist/cli/dist/setup-hosts.js +75 -0
  65. package/dist/cli/dist/setup-hosts.js.map +1 -0
  66. package/dist/cli/dist/setup.d.ts +61 -0
  67. package/dist/cli/dist/setup.js +243 -0
  68. package/dist/cli/dist/setup.js.map +1 -0
  69. package/dist/cli/dist/task-input.d.ts +1 -1
  70. package/dist/cli/dist/wake-hook.d.ts +1 -1
  71. package/dist/cli/dist/worker-json.d.ts +4 -0
  72. package/dist/cli/dist/worker-json.js +87 -0
  73. package/dist/cli/dist/worker-json.js.map +1 -0
  74. package/dist/examples/two-owner-demo/dist/run-demo.d.ts +13 -13
  75. package/dist/package.json +1 -1
  76. package/dist/packages/adapters/dist/command.d.ts +2 -2
  77. package/dist/packages/adapters/dist/credential-proxy.d.ts +2 -2
  78. package/dist/packages/adapters/dist/index.d.ts +1 -1
  79. package/dist/packages/adapters/dist/mcp.d.ts +2 -2
  80. package/dist/packages/adapters/dist/openai.d.ts +2 -2
  81. package/dist/packages/adapters/dist/sandbox.d.ts +2 -2
  82. package/dist/packages/core/dist/connection.d.ts +58 -0
  83. package/dist/packages/core/dist/connection.js +132 -0
  84. package/dist/packages/core/dist/connection.js.map +1 -0
  85. package/dist/packages/core/dist/delivery-status.d.ts +22 -0
  86. package/dist/packages/core/dist/delivery-status.js +53 -0
  87. package/dist/packages/core/dist/delivery-status.js.map +1 -0
  88. package/dist/packages/core/dist/discovery.d.ts +7 -6
  89. package/dist/packages/core/dist/discovery.js +19 -20
  90. package/dist/packages/core/dist/discovery.js.map +1 -1
  91. package/dist/packages/core/dist/edge.d.ts +1 -0
  92. package/dist/packages/core/dist/edge.js +1 -0
  93. package/dist/packages/core/dist/edge.js.map +1 -1
  94. package/dist/packages/core/dist/index.d.ts +3 -0
  95. package/dist/packages/core/dist/index.js +3 -0
  96. package/dist/packages/core/dist/index.js.map +1 -1
  97. package/dist/packages/core/dist/protocol.d.ts +24 -0
  98. package/dist/packages/core/dist/protocol.js +54 -0
  99. package/dist/packages/core/dist/protocol.js.map +1 -0
  100. package/dist/packages/core/dist/receipts.d.ts +1 -0
  101. package/dist/packages/core/dist/receipts.js +1 -1
  102. package/dist/packages/core/dist/receipts.js.map +1 -1
  103. package/dist/packages/core/dist/schema.d.ts +1 -0
  104. package/dist/packages/core/dist/schema.js +13 -2
  105. package/dist/packages/core/dist/schema.js.map +1 -1
  106. package/dist/packages/ledger/dist/index.d.ts +1 -1
  107. package/dist/packages/relay/dist/admission.d.ts +14 -0
  108. package/dist/packages/relay/dist/admission.js +70 -0
  109. package/dist/packages/relay/dist/admission.js.map +1 -0
  110. package/dist/packages/relay/dist/fetch.d.ts +8 -2
  111. package/dist/packages/relay/dist/fetch.js +41 -12
  112. package/dist/packages/relay/dist/fetch.js.map +1 -1
  113. package/dist/packages/relay/dist/index.d.ts +23 -12
  114. package/dist/packages/relay/dist/index.js +130 -78
  115. package/dist/packages/relay/dist/index.js.map +1 -1
  116. package/dist/packages/relay/dist/journal.d.ts +1 -1
  117. package/dist/packages/relay/dist/notifications.d.ts +1 -1
  118. package/dist/packages/relay/dist/retry.d.ts +23 -0
  119. package/dist/packages/relay/dist/retry.js +43 -1
  120. package/dist/packages/relay/dist/retry.js.map +1 -1
  121. package/dist/packages/relay/dist/ssrf.d.ts +3 -2
  122. package/dist/packages/relay/dist/ssrf.js.map +1 -1
  123. package/dist/packages/relay/dist/worker.js +1 -1
  124. package/dist/packages/relay/dist/worker.js.map +1 -1
  125. package/dist/packages/runtime/dist/a2a.d.ts +1 -1
  126. package/dist/packages/runtime/dist/a2a.js +1 -1
  127. package/dist/packages/runtime/dist/adapter.d.ts +2 -2
  128. package/dist/packages/runtime/dist/application-config.d.ts +20 -0
  129. package/dist/packages/runtime/dist/application-config.js +222 -0
  130. package/dist/packages/runtime/dist/application-config.js.map +1 -0
  131. package/dist/packages/runtime/dist/approval-providers.d.ts +24 -3
  132. package/dist/packages/runtime/dist/approval-providers.js +79 -3
  133. package/dist/packages/runtime/dist/approval-providers.js.map +1 -1
  134. package/dist/packages/runtime/dist/connection-admission-review.d.ts +39 -0
  135. package/dist/packages/runtime/dist/connection-admission-review.js +86 -0
  136. package/dist/packages/runtime/dist/connection-admission-review.js.map +1 -0
  137. package/dist/packages/runtime/dist/connection-persistence.d.ts +35 -0
  138. package/dist/packages/runtime/dist/connection-persistence.js +181 -0
  139. package/dist/packages/runtime/dist/connection-persistence.js.map +1 -0
  140. package/dist/packages/runtime/dist/connection-records.d.ts +167 -0
  141. package/dist/packages/runtime/dist/connection-records.js +132 -0
  142. package/dist/packages/runtime/dist/connection-records.js.map +1 -0
  143. package/dist/packages/runtime/dist/connection-router.d.ts +45 -0
  144. package/dist/packages/runtime/dist/connection-router.js +130 -0
  145. package/dist/packages/runtime/dist/connection-router.js.map +1 -0
  146. package/dist/packages/runtime/dist/connection-service.d.ts +159 -0
  147. package/dist/packages/runtime/dist/connection-service.js +239 -0
  148. package/dist/packages/runtime/dist/connection-service.js.map +1 -0
  149. package/dist/packages/runtime/dist/connection-transport.d.ts +14 -0
  150. package/dist/packages/runtime/dist/connection-transport.js +89 -0
  151. package/dist/packages/runtime/dist/connection-transport.js.map +1 -0
  152. package/dist/packages/runtime/dist/delivery-records.d.ts +180 -0
  153. package/dist/packages/runtime/dist/delivery-records.js +205 -0
  154. package/dist/packages/runtime/dist/delivery-records.js.map +1 -0
  155. package/dist/packages/runtime/dist/delivery-status-router.d.ts +27 -0
  156. package/dist/packages/runtime/dist/delivery-status-router.js +150 -0
  157. package/dist/packages/runtime/dist/delivery-status-router.js.map +1 -0
  158. package/dist/packages/runtime/dist/delivery-status.d.ts +43 -0
  159. package/dist/packages/runtime/dist/delivery-status.js +193 -0
  160. package/dist/packages/runtime/dist/delivery-status.js.map +1 -0
  161. package/dist/packages/runtime/dist/delivery-store.d.ts +125 -0
  162. package/dist/packages/runtime/dist/delivery-store.js +1047 -0
  163. package/dist/packages/runtime/dist/delivery-store.js.map +1 -0
  164. package/dist/packages/runtime/dist/gateway.d.ts +4 -3
  165. package/dist/packages/runtime/dist/gateway.js.map +1 -1
  166. package/dist/packages/runtime/dist/held-request-review.d.ts +49 -0
  167. package/dist/packages/runtime/dist/held-request-review.js +122 -0
  168. package/dist/packages/runtime/dist/held-request-review.js.map +1 -0
  169. package/dist/packages/runtime/dist/held-request-store.d.ts +112 -0
  170. package/dist/packages/runtime/dist/held-request-store.js +290 -0
  171. package/dist/packages/runtime/dist/held-request-store.js.map +1 -0
  172. package/dist/packages/runtime/dist/idempotency-store.d.ts +53 -0
  173. package/dist/packages/runtime/dist/idempotency-store.js +331 -0
  174. package/dist/packages/runtime/dist/idempotency-store.js.map +1 -0
  175. package/dist/packages/runtime/dist/inbox.d.ts +1 -1
  176. package/dist/packages/runtime/dist/index.d.ts +27 -1
  177. package/dist/packages/runtime/dist/index.js +26 -0
  178. package/dist/packages/runtime/dist/index.js.map +1 -1
  179. package/dist/packages/runtime/dist/invite-store.d.ts +76 -0
  180. package/dist/packages/runtime/dist/invite-store.js +337 -0
  181. package/dist/packages/runtime/dist/invite-store.js.map +1 -0
  182. package/dist/packages/runtime/dist/key-store.d.ts +77 -0
  183. package/dist/packages/runtime/dist/key-store.js +226 -0
  184. package/dist/packages/runtime/dist/key-store.js.map +1 -0
  185. package/dist/packages/runtime/dist/local-identity.d.ts +33 -0
  186. package/dist/packages/runtime/dist/local-identity.js +278 -0
  187. package/dist/packages/runtime/dist/local-identity.js.map +1 -0
  188. package/dist/packages/runtime/dist/mcp-rpc.d.ts +19 -0
  189. package/dist/packages/runtime/dist/mcp-rpc.js +175 -0
  190. package/dist/packages/runtime/dist/mcp-rpc.js.map +1 -0
  191. package/dist/packages/runtime/dist/mcp-server.d.ts +46 -19
  192. package/dist/packages/runtime/dist/mcp-server.js +427 -184
  193. package/dist/packages/runtime/dist/mcp-server.js.map +1 -1
  194. package/dist/packages/runtime/dist/mcp-tool-catalog.d.ts +1 -1
  195. package/dist/packages/runtime/dist/mcp-tool-catalog.js +172 -13
  196. package/dist/packages/runtime/dist/mcp-tool-catalog.js.map +1 -1
  197. package/dist/packages/runtime/dist/mcp.d.ts +2 -2
  198. package/dist/packages/runtime/dist/message-status.d.ts +32 -0
  199. package/dist/packages/runtime/dist/message-status.js +29 -0
  200. package/dist/packages/runtime/dist/message-status.js.map +1 -0
  201. package/dist/packages/runtime/dist/outbox.d.ts +91 -0
  202. package/dist/packages/runtime/dist/outbox.js +462 -0
  203. package/dist/packages/runtime/dist/outbox.js.map +1 -0
  204. package/dist/packages/runtime/dist/policy.d.ts +1 -1
  205. package/dist/packages/runtime/dist/protocol-peer-store.d.ts +40 -0
  206. package/dist/packages/runtime/dist/protocol-peer-store.js +176 -0
  207. package/dist/packages/runtime/dist/protocol-peer-store.js.map +1 -0
  208. package/dist/packages/runtime/dist/protocol-release.d.ts +26 -0
  209. package/dist/packages/runtime/dist/protocol-release.js +76 -0
  210. package/dist/packages/runtime/dist/protocol-release.js.map +1 -0
  211. package/dist/packages/runtime/dist/quota.d.ts +1 -1
  212. package/dist/packages/runtime/dist/relay-selection.d.ts +20 -0
  213. package/dist/packages/runtime/dist/relay-selection.js +34 -0
  214. package/dist/packages/runtime/dist/relay-selection.js.map +1 -0
  215. package/dist/packages/runtime/dist/requester-pending-store.d.ts +59 -0
  216. package/dist/packages/runtime/dist/requester-pending-store.js +266 -0
  217. package/dist/packages/runtime/dist/requester-pending-store.js.map +1 -0
  218. package/dist/packages/runtime/dist/secret-store.d.ts +19 -0
  219. package/dist/packages/runtime/dist/secret-store.js +51 -0
  220. package/dist/packages/runtime/dist/secret-store.js.map +1 -0
  221. package/dist/packages/runtime/dist/session-audit.d.ts +29 -7
  222. package/dist/packages/runtime/dist/session-audit.js +149 -29
  223. package/dist/packages/runtime/dist/session-audit.js.map +1 -1
  224. package/dist/packages/runtime/dist/session.d.ts +101 -9
  225. package/dist/packages/runtime/dist/session.js +696 -96
  226. package/dist/packages/runtime/dist/session.js.map +1 -1
  227. package/dist/packages/runtime/dist/task-journal.d.ts +18 -3
  228. package/dist/packages/runtime/dist/task-journal.js +271 -18
  229. package/dist/packages/runtime/dist/task-journal.js.map +1 -1
  230. package/dist/packages/runtime/dist/verifier.d.ts +3 -2
  231. package/dist/packages/runtime/dist/verifier.js +1 -0
  232. package/dist/packages/runtime/dist/verifier.js.map +1 -1
  233. package/dist/packages/runtime/dist/worker-trust-store.d.ts +111 -0
  234. package/dist/packages/runtime/dist/worker-trust-store.js +592 -0
  235. package/dist/packages/runtime/dist/worker-trust-store.js.map +1 -0
  236. package/dist/packages/sandbox/dist/container.d.ts +1 -1
  237. package/dist/packages/sandbox/dist/index.d.ts +1 -1
  238. package/dist/spec/README.ja.md +21 -1
  239. package/dist/spec/README.md +20 -1
  240. package/dist/spec/agent-card.schema.json +11 -1
  241. package/dist/spec/delivery-status.schema.json +106 -0
  242. package/dist/spec/examples/protocol-versions/sample-agent-card.json +35 -0
  243. package/dist/spec/examples/sample-delivery-status.json +21 -0
  244. package/dist/spec/examples/sample-task-manifest.0.1.0.json +173 -0
  245. package/dist/spec/examples/sample-task-manifest.0.2.0.json +173 -0
  246. package/dist/spec/task-manifest.0.1.0.schema.json +422 -0
  247. package/dist/spec/task-manifest.0.2.0.schema.json +422 -0
  248. package/dist/spec/task-manifest.schema.json +9 -418
  249. package/docs/sdk.ja.md +133 -0
  250. package/docs/sdk.md +138 -0
  251. package/package.json +15 -3
@@ -0,0 +1,226 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ import * as fs from 'node:fs';
3
+ import { createHash, createPrivateKey } from 'node:crypto';
4
+ import { join } from 'node:path';
5
+ import { generateKeyPair, signPayload, verifySigned } from '../../core/dist/index.js';
6
+ import { inspectLocalIdentity, resolveOrCreateIdentity, resolveDataRoot, ensurePrivateDirectory, checkPrivatePath, checkPrivateStat, } from './local-identity.js';
7
+ import { readApplicationConfig } from './application-config.js';
8
+ const failure = (code) => new Error(code);
9
+ function validateKey(key) {
10
+ try {
11
+ if (!key || typeof key.did !== 'string' || typeof key.privateKey !== 'string' ||
12
+ createPrivateKey(key.privateKey).asymmetricKeyType !== 'ed25519' ||
13
+ !verifySigned(signPayload({ type: 'LocalIdentityCheck' }, key, '2026-01-01T00:00:00.000Z'), key.did))
14
+ throw failure('IDENTITY_INVALID');
15
+ return key;
16
+ }
17
+ catch {
18
+ throw failure('IDENTITY_INVALID');
19
+ }
20
+ }
21
+ /** File paths, legacy selection, validation and publication retain their existing implementation. */
22
+ export class FileKeyStore {
23
+ options;
24
+ constructor(options = {}) {
25
+ this.options = options;
26
+ }
27
+ load(role) { return inspectLocalIdentity(role, this.options).key; }
28
+ createIfMissing(role) { return resolveOrCreateIdentity(role, this.options); }
29
+ exists(role) { return this.load(role) !== undefined; }
30
+ describe(role) {
31
+ const selected = inspectLocalIdentity(role, this.options);
32
+ return { backend: 'file', location: selected.path, source: selected.source };
33
+ }
34
+ }
35
+ /** Stable service name scoped to the normalized absolute data root; accounts are role names. */
36
+ export function keychainService(options = {}) {
37
+ return 'sealbridge:' + createHash('sha256').update(resolveDataRoot(options)).digest('hex');
38
+ }
39
+ export class KeychainKeyStore {
40
+ module;
41
+ options;
42
+ service;
43
+ constructor(module, options = {}) {
44
+ this.module = module;
45
+ this.options = options;
46
+ this.service = keychainService(options);
47
+ }
48
+ describe(role) {
49
+ return { backend: 'keychain', location: this.service + '/' + role };
50
+ }
51
+ entry(role) {
52
+ return new this.module.Entry(this.service, role, { linux: { store: 'secret-service' } });
53
+ }
54
+ secret(role) {
55
+ try {
56
+ return this.entry(role).getPassword();
57
+ }
58
+ catch {
59
+ throw failure('KEY_STORE_UNAVAILABLE');
60
+ }
61
+ }
62
+ exists(role) { return this.secret(role) !== null; }
63
+ load(role) {
64
+ const secret = this.secret(role);
65
+ if (secret === null)
66
+ return undefined;
67
+ try {
68
+ if (Buffer.byteLength(secret) > 16 * 1024)
69
+ throw failure('IDENTITY_INVALID');
70
+ const jwk = JSON.parse(secret);
71
+ if (jwk.kty !== 'OKP' || jwk.crv !== 'Ed25519' || typeof jwk.d !== 'string' ||
72
+ typeof jwk.kid !== 'string')
73
+ throw failure('IDENTITY_INVALID');
74
+ const privateKey = createPrivateKey({ key: jwk, format: 'jwk' })
75
+ .export({ type: 'pkcs8', format: 'pem' }).toString();
76
+ return validateKey({ did: jwk.kid, privateKey });
77
+ }
78
+ catch {
79
+ throw failure('IDENTITY_INVALID');
80
+ }
81
+ }
82
+ createIfMissing(role) {
83
+ const existing = this.load(role);
84
+ if (existing)
85
+ return existing;
86
+ const io = this.options.fs ?? fs;
87
+ const platform = this.options.platform ?? process.platform;
88
+ const root = resolveDataRoot(this.options);
89
+ const lock = join(root, '.keychain-' + role + '.lock');
90
+ let fd;
91
+ try {
92
+ ensurePrivateDirectory(root, io, platform);
93
+ checkPrivatePath(lock, io, platform);
94
+ // The lock contains no key material and coordinates Sealbridge writers across processes.
95
+ fd = io.openSync(lock, fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL |
96
+ (fs.constants.O_NOFOLLOW ?? 0), 0o600);
97
+ checkPrivateStat(io.fstatSync(fd));
98
+ const winner = this.load(role);
99
+ if (winner)
100
+ return winner;
101
+ const key = generateKeyPair();
102
+ const jwk = createPrivateKey(key.privateKey).export({ format: 'jwk' });
103
+ try {
104
+ this.entry(role).setPassword(JSON.stringify({ ...jwk, kid: key.did }));
105
+ }
106
+ catch {
107
+ throw failure('KEY_STORE_UNAVAILABLE');
108
+ }
109
+ const stored = this.load(role);
110
+ if (!stored || stored.did !== key.did)
111
+ throw failure('KEY_STORE_CONFLICT');
112
+ return stored;
113
+ }
114
+ catch (error) {
115
+ if (error.code === 'EEXIST')
116
+ throw failure('KEY_STORE_BUSY');
117
+ if (error instanceof Error && /^(IDENTITY_|KEY_STORE_)/.test(error.message))
118
+ throw error;
119
+ throw failure('IDENTITY_STORE_UNWRITABLE');
120
+ }
121
+ finally {
122
+ if (fd !== undefined) {
123
+ io.closeSync(fd);
124
+ io.unlinkSync(lock);
125
+ }
126
+ }
127
+ }
128
+ }
129
+ export async function optionalKeyring(options, required) {
130
+ // A variable specifier keeps the native package optional for TypeScript and packaging.
131
+ const name = '@napi-rs/keyring';
132
+ try {
133
+ const module = await (options.keyringLoader ? options.keyringLoader() : import(name));
134
+ if (typeof module.Entry !== 'function')
135
+ throw failure('KEY_STORE_UNAVAILABLE');
136
+ return module;
137
+ }
138
+ catch {
139
+ if (required)
140
+ throw failure('KEY_STORE_UNAVAILABLE');
141
+ return undefined;
142
+ }
143
+ }
144
+ /** Resolve selection metadata without loading a backend or creating an identity. */
145
+ export function keyStoreSelection(options = {}) {
146
+ if (options.explicitKeyPath !== undefined)
147
+ return { keyStore: 'file', source: 'option' };
148
+ const env = options.env ?? process.env;
149
+ let keyStore = options.keyStore ?? env.SEALBRIDGE_KEY_STORE;
150
+ let source = options.keyStore !== undefined ? 'option' : 'env';
151
+ if (keyStore === undefined) {
152
+ // Relay opt-in is evaluated by relay consumers, independently of identity storage.
153
+ keyStore = readApplicationConfig({ ...options, allowPrivateRelay: true }).keyStore;
154
+ source = keyStore === undefined ? 'default' : 'config';
155
+ }
156
+ if (keyStore !== undefined && keyStore !== 'file' && keyStore !== 'keychain' &&
157
+ (typeof keyStore !== 'object' || keyStore === null))
158
+ throw failure('KEY_STORE_INVALID');
159
+ return { keyStore: keyStore ?? 'file', source };
160
+ }
161
+ /** Inspect the other backend without creating entries; optional keychain inspection may be unavailable. */
162
+ export async function otherKeyStorePresence(selected, options = {}) {
163
+ const module = selected === 'file' ? await optionalKeyring(options, false) : undefined;
164
+ if (selected === 'file' && !module)
165
+ return ['keychain: inspection unavailable'];
166
+ const other = selected === 'file' ? new KeychainKeyStore(module, options) : new FileKeyStore(options);
167
+ const warnings = [];
168
+ for (const role of ['requester', 'worker']) {
169
+ try {
170
+ if (await other.exists(role))
171
+ warnings.push(`${role}: identity also present in ${selected === 'file' ? 'keychain' : 'file'} backend; no identity was moved`);
172
+ }
173
+ catch (error) {
174
+ warnings.push(`${role}: other backend inspection returned ${error.message}`);
175
+ }
176
+ }
177
+ return warnings;
178
+ }
179
+ /** Explicit file paths always bypass backend configuration and optional module loading. */
180
+ export async function selectKeyStore(role, options = {}) {
181
+ if (options.explicitKeyPath !== undefined)
182
+ return new FileKeyStore(options);
183
+ const selection = keyStoreSelection(options);
184
+ const selected = selection.source === 'default' ? undefined : selection.keyStore;
185
+ if (selected !== undefined && typeof selected === 'object' && selected !== null)
186
+ return selected;
187
+ if (selected === 'file')
188
+ return new FileKeyStore(options);
189
+ if (selected !== undefined && selected !== 'keychain')
190
+ throw failure('KEY_STORE_INVALID');
191
+ const module = await optionalKeyring(options, selected === 'keychain');
192
+ if (selected === 'keychain')
193
+ return new KeychainKeyStore(module, options);
194
+ const file = new FileKeyStore(options);
195
+ let keychainPresent = false;
196
+ if (module) {
197
+ try {
198
+ keychainPresent = new KeychainKeyStore(module, options).exists(role);
199
+ }
200
+ catch (error) {
201
+ // No keychain was selected; retain file operation when inspection is unavailable.
202
+ if (!(error instanceof Error) || error.message !== 'KEY_STORE_UNAVAILABLE')
203
+ throw error;
204
+ }
205
+ }
206
+ if (keychainPresent) {
207
+ if (file.exists(role))
208
+ throw failure('KEY_STORE_CONFLICT');
209
+ throw failure('KEY_STORE_SELECTION_REQUIRED');
210
+ }
211
+ return file;
212
+ }
213
+ /** Read-only inspection used by doctor and peer review; never creates an identity. */
214
+ export async function inspectStoredIdentity(role, options = {}) {
215
+ const store = await selectKeyStore(role, options);
216
+ const description = await store.describe(role);
217
+ const key = await store.load(role);
218
+ return { ...description, present: key !== undefined, key: key === undefined ? undefined : validateKey(key) };
219
+ }
220
+ /** Resolve the configured store, preserving its create-if-missing semantics. */
221
+ export async function resolveStoredIdentity(role, options = {}) {
222
+ const store = await selectKeyStore(role, options);
223
+ const existing = await store.load(role);
224
+ return validateKey(existing ?? await store.createIfMissing(role));
225
+ }
226
+ //# sourceMappingURL=key-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-store.js","sourceRoot":"","sources":["../src/key-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import * as fs from 'node:fs';
2
+ import type { KeyPair } from '../../core/dist/index.js';
3
+ export type IdentityRole = 'requester' | 'worker';
4
+ export interface DataRootOptions {
5
+ env?: NodeJS.ProcessEnv;
6
+ home?: string;
7
+ platform?: NodeJS.Platform;
8
+ }
9
+ export interface LocalIdentityOptions extends DataRootOptions {
10
+ explicitKeyPath?: string;
11
+ /** Filesystem injection for deterministic I/O failure tests. */
12
+ fs?: typeof fs;
13
+ }
14
+ export interface LocalIdentity {
15
+ path: string;
16
+ source: 'explicit' | 'default' | 'legacy';
17
+ key?: KeyPair;
18
+ }
19
+ export declare function resolveDataRoot(options?: DataRootOptions): string;
20
+ /** Reject links, except macOS's root-owned /var and /tmp system aliases. */
21
+ export declare function checkPath(path: string, io: typeof fs, platform?: NodeJS.Platform): void;
22
+ export declare function checkStat(stat: fs.Stats, directory?: boolean): void;
23
+ export declare function inspectDirectory(path: string, io: typeof fs, platform?: NodeJS.Platform): void;
24
+ /** Bounded descriptor-based read using the application private-file policy. */
25
+ export declare function readPrivateFile(path: string, io: typeof fs, maxBytes: number, platform?: NodeJS.Platform): string | undefined;
26
+ /** Inspect without creating directories or identities. Canonical files take precedence. */
27
+ export declare function inspectLocalIdentity(role: IdentityRole, options?: LocalIdentityOptions): LocalIdentity;
28
+ export declare function privateDirectory(path: string, io: typeof fs, platform?: NodeJS.Platform): void;
29
+ /** Exclusive creation of a flushed private temporary file. Caller owns cleanup. */
30
+ export declare function writePrivateFile(path: string, bytes: Buffer, io: typeof fs, platform?: NodeJS.Platform): void;
31
+ /** Publish a flushed temporary key without replacing a concurrently committed identity. */
32
+ export declare function resolveOrCreateIdentity(role: IdentityRole, options?: LocalIdentityOptions): KeyPair;
33
+ export { checkPath as checkPrivatePath, checkStat as checkPrivateStat, inspectDirectory as inspectPrivateDirectory, privateDirectory as ensurePrivateDirectory, };
@@ -0,0 +1,278 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ import * as fs from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { dirname, join, posix, win32 } from 'node:path';
5
+ import { createPrivateKey, randomUUID } from 'node:crypto';
6
+ import { generateKeyPair, signPayload, verifySigned } from '../../core/dist/index.js';
7
+ const MAX_KEY_BYTES = 16 * 1024;
8
+ function failure(code) { return new Error(code); }
9
+ function errno(error) { return error.code; }
10
+ function context(options) {
11
+ const platform = options.platform ?? process.platform;
12
+ const paths = platform === 'win32' ? win32 : posix;
13
+ const env = options.env ?? process.env;
14
+ let home = options.home;
15
+ if (home === undefined) {
16
+ try {
17
+ home = homedir();
18
+ }
19
+ catch {
20
+ home = '';
21
+ }
22
+ }
23
+ return { platform, paths, env, home };
24
+ }
25
+ export function resolveDataRoot(options = {}) {
26
+ const { platform, paths, env, home } = context(options);
27
+ const override = env.SEALBRIDGE_DATA_DIR ?? env.ACP_DATA_DIR;
28
+ if (override !== undefined) {
29
+ if (!paths.isAbsolute(override))
30
+ throw failure('DATA_DIR_UNAVAILABLE');
31
+ return paths.normalize(override);
32
+ }
33
+ const base = platform === 'win32' ? env.LOCALAPPDATA
34
+ : platform === 'linux' ? env.XDG_DATA_HOME : undefined;
35
+ if (base) {
36
+ if (!paths.isAbsolute(base))
37
+ throw failure('DATA_DIR_UNAVAILABLE');
38
+ return paths.join(base, platform === 'win32' ? 'Sealbridge' : 'sealbridge');
39
+ }
40
+ if (!home || !paths.isAbsolute(home))
41
+ throw failure('DATA_DIR_UNAVAILABLE');
42
+ return platform === 'win32' ? paths.join(home, 'AppData', 'Local', 'Sealbridge')
43
+ : platform === 'darwin' ? paths.join(home, 'Library', 'Application Support', 'Sealbridge')
44
+ : paths.join(home, '.local', 'share', 'sealbridge');
45
+ }
46
+ function legacyPaths(role, options) {
47
+ const { paths, platform, env, home } = context(options);
48
+ if (!home || !paths.isAbsolute(home))
49
+ return [];
50
+ if (env.ACP_DATA_DIR !== undefined && !paths.isAbsolute(env.ACP_DATA_DIR))
51
+ throw failure('DATA_DIR_UNAVAILABLE');
52
+ const result = [paths.join(home, '.acp', role + '.private.json')];
53
+ if (role === 'requester') {
54
+ const oldRoot = env.ACP_DATA_DIR ?? (platform === 'win32'
55
+ ? paths.join(env.LOCALAPPDATA || home, 'AgentCollaborationPlatform')
56
+ : platform === 'darwin' ? paths.join(home, 'Library', 'Application Support', 'AgentCollaborationPlatform')
57
+ : paths.join(env.XDG_DATA_HOME || paths.join(home, '.local', 'share'), 'agent-collab-platform'));
58
+ if (!paths.isAbsolute(oldRoot))
59
+ throw failure('DATA_DIR_UNAVAILABLE');
60
+ result.push(paths.join(oldRoot, 'owner.private.json'));
61
+ }
62
+ return result;
63
+ }
64
+ /** Reject links, except macOS's root-owned /var and /tmp system aliases. */
65
+ export function checkPath(path, io, platform = process.platform) {
66
+ const paths = platform === 'win32' ? win32 : posix;
67
+ const parent = paths.dirname(path);
68
+ if (parent !== path)
69
+ checkPath(parent, io, platform);
70
+ try {
71
+ const stat = io.lstatSync(path);
72
+ if (stat.isSymbolicLink()) {
73
+ if (platform !== 'darwin' || !['/var', '/tmp'].includes(path) || stat.uid !== 0)
74
+ throw failure('IDENTITY_INVALID');
75
+ const target = posix.resolve(parent, io.readlinkSync(path));
76
+ if (target !== '/private' + path)
77
+ throw failure('IDENTITY_INVALID');
78
+ checkPath(target, io, platform);
79
+ }
80
+ }
81
+ catch (error) {
82
+ if (errno(error) !== 'ENOENT')
83
+ throw error;
84
+ }
85
+ }
86
+ export function checkStat(stat, directory = false) {
87
+ if (directory ? !stat.isDirectory() : !stat.isFile())
88
+ throw failure('IDENTITY_INVALID');
89
+ if (process.platform !== 'win32' &&
90
+ (stat.uid !== process.getuid() || (stat.mode & 0o077) !== 0))
91
+ throw failure('IDENTITY_INVALID');
92
+ }
93
+ export function inspectDirectory(path, io, platform = process.platform) {
94
+ checkPath(path, io, platform);
95
+ const before = io.lstatSync(path);
96
+ checkStat(before, true);
97
+ if (process.platform === 'win32')
98
+ return;
99
+ const fd = io.openSync(path, fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW ?? 0) |
100
+ (fs.constants.O_DIRECTORY ?? 0));
101
+ try {
102
+ const stat = io.fstatSync(fd);
103
+ checkStat(stat, true);
104
+ if (stat.dev !== before.dev || stat.ino !== before.ino)
105
+ throw failure('IDENTITY_INVALID');
106
+ }
107
+ finally {
108
+ io.closeSync(fd);
109
+ }
110
+ }
111
+ /** Bounded descriptor-based read using the application private-file policy. */
112
+ export function readPrivateFile(path, io, maxBytes, platform = process.platform) {
113
+ let fd;
114
+ let observed = false;
115
+ try {
116
+ checkPath(path, io, platform);
117
+ // Check type before opening so special files cannot block the reader.
118
+ const before = io.lstatSync(path);
119
+ observed = true;
120
+ checkStat(before);
121
+ fd = io.openSync(path, fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW ?? 0) |
122
+ (fs.constants.O_NONBLOCK ?? 0));
123
+ const stat = io.fstatSync(fd);
124
+ checkStat(stat);
125
+ if (stat.dev !== before.dev || stat.ino !== before.ino)
126
+ throw failure('IDENTITY_INVALID');
127
+ const bytes = Buffer.alloc(maxBytes + 1);
128
+ let length = 0;
129
+ while (length < bytes.length) {
130
+ const count = io.readSync(fd, bytes, length, bytes.length - length, null);
131
+ if (!count)
132
+ break;
133
+ length += count;
134
+ }
135
+ if (length > maxBytes)
136
+ throw failure('IDENTITY_INVALID');
137
+ return bytes.subarray(0, length).toString('utf8');
138
+ }
139
+ catch (error) {
140
+ if (errno(error) === 'ENOENT' && !observed)
141
+ return undefined;
142
+ if (error instanceof Error && error.message === 'IDENTITY_INVALID')
143
+ throw error;
144
+ throw failure('IDENTITY_UNREADABLE');
145
+ }
146
+ finally {
147
+ if (fd !== undefined)
148
+ io.closeSync(fd);
149
+ }
150
+ }
151
+ function readKey(path, io, platform) {
152
+ const contents = readPrivateFile(path, io, MAX_KEY_BYTES, platform);
153
+ if (contents === undefined)
154
+ return undefined;
155
+ try {
156
+ const value = JSON.parse(contents);
157
+ if (!value || typeof value.did !== 'string' || typeof value.privateKey !== 'string' ||
158
+ Object.keys(value).sort().join(',') !== 'did,privateKey' ||
159
+ createPrivateKey(value.privateKey).asymmetricKeyType !== 'ed25519' ||
160
+ !verifySigned(signPayload({ type: 'LocalIdentityCheck' }, value, '2026-01-01T00:00:00.000Z'), value.did))
161
+ throw failure('IDENTITY_INVALID');
162
+ return value;
163
+ }
164
+ catch {
165
+ throw failure('IDENTITY_INVALID');
166
+ }
167
+ }
168
+ /** Inspect without creating directories or identities. Canonical files take precedence. */
169
+ export function inspectLocalIdentity(role, options = {}) {
170
+ const io = options.fs ?? fs;
171
+ const platform = options.platform ?? process.platform;
172
+ if (options.explicitKeyPath !== undefined) {
173
+ const path = context(options).paths.resolve(options.explicitKeyPath);
174
+ const key = readKey(path, io, platform);
175
+ if (!key)
176
+ throw failure('IDENTITY_UNREADABLE');
177
+ return { path, source: 'explicit', key };
178
+ }
179
+ const root = resolveDataRoot(options);
180
+ for (const directory of [root, join(root, 'identities')]) {
181
+ try {
182
+ inspectDirectory(directory, io, platform);
183
+ }
184
+ catch (error) {
185
+ if (errno(error) !== 'ENOENT') {
186
+ if (error instanceof Error && error.message === 'IDENTITY_INVALID')
187
+ throw error;
188
+ throw failure('IDENTITY_UNREADABLE');
189
+ }
190
+ }
191
+ }
192
+ const path = join(root, 'identities', role + '.private.json');
193
+ const key = readKey(path, io, platform);
194
+ if (key)
195
+ return { path, source: 'default', key };
196
+ let legacy;
197
+ for (const candidate of legacyPaths(role, options)) {
198
+ const key = readKey(candidate, io, platform);
199
+ if (!key)
200
+ continue;
201
+ if (legacy && legacy.key.did !== key.did)
202
+ throw failure('IDENTITY_SELECTION_REQUIRED');
203
+ legacy ??= { path: candidate, source: 'legacy', key };
204
+ }
205
+ return legacy ?? { path, source: 'default' };
206
+ }
207
+ export function privateDirectory(path, io, platform = process.platform) {
208
+ checkPath(path, io, platform);
209
+ io.mkdirSync(path, { recursive: true, mode: 0o700 });
210
+ inspectDirectory(path, io, platform);
211
+ }
212
+ /** Exclusive creation of a flushed private temporary file. Caller owns cleanup. */
213
+ export function writePrivateFile(path, bytes, io, platform = process.platform) {
214
+ checkPath(path, io, platform);
215
+ const fd = io.openSync(path, fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL |
216
+ (fs.constants.O_NOFOLLOW ?? 0), 0o600);
217
+ try {
218
+ checkStat(io.fstatSync(fd));
219
+ let offset = 0;
220
+ while (offset < bytes.length) {
221
+ const count = io.writeSync(fd, bytes, offset, bytes.length - offset);
222
+ if (!count)
223
+ throw failure('IDENTITY_STORE_UNWRITABLE');
224
+ offset += count;
225
+ }
226
+ io.fsyncSync(fd);
227
+ }
228
+ catch (error) {
229
+ io.closeSync(fd);
230
+ io.unlinkSync(path);
231
+ throw error;
232
+ }
233
+ io.closeSync(fd);
234
+ }
235
+ /** Publish a flushed temporary key without replacing a concurrently committed identity. */
236
+ export function resolveOrCreateIdentity(role, options = {}) {
237
+ const io = options.fs ?? fs;
238
+ const platform = options.platform ?? process.platform;
239
+ const selected = inspectLocalIdentity(role, options);
240
+ if (selected.key)
241
+ return selected.key;
242
+ const root = resolveDataRoot(options);
243
+ const temporary = join(dirname(selected.path), '.' + role + '.' + randomUUID() + '.tmp');
244
+ let temporaryCreated = false;
245
+ try {
246
+ privateDirectory(root, io, platform);
247
+ privateDirectory(dirname(selected.path), io, platform);
248
+ writePrivateFile(temporary, Buffer.from(JSON.stringify(generateKeyPair()) + '\n'), io, platform);
249
+ temporaryCreated = true;
250
+ checkPath(selected.path, io, platform);
251
+ try {
252
+ io.linkSync(temporary, selected.path);
253
+ }
254
+ catch (error) {
255
+ if (errno(error) === 'EEXIST') { /* The committed winner is loaded below. */ }
256
+ else if (['ENOTSUP', 'EOPNOTSUPP', 'ENOSYS', 'EXDEV', 'EPERM'].includes(errno(error) ?? ''))
257
+ throw failure('IDENTITY_CREATION_UNSUPPORTED');
258
+ else
259
+ throw error;
260
+ }
261
+ }
262
+ catch (error) {
263
+ if (error instanceof Error && error.message.startsWith('IDENTITY_'))
264
+ throw error;
265
+ throw failure('IDENTITY_STORE_UNWRITABLE');
266
+ }
267
+ finally {
268
+ if (temporaryCreated)
269
+ io.unlinkSync(temporary);
270
+ }
271
+ const winner = readKey(selected.path, io, platform);
272
+ if (!winner)
273
+ throw failure('IDENTITY_UNREADABLE');
274
+ return winner;
275
+ }
276
+ // Shared checks for application files under the same data root.
277
+ export { checkPath as checkPrivatePath, checkStat as checkPrivateStat, inspectDirectory as inspectPrivateDirectory, privateDirectory as ensurePrivateDirectory, };
278
+ //# sourceMappingURL=local-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-identity.js","sourceRoot":"","sources":["../src/local-identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Readable, Writable } from 'node:stream';
2
+ import type { Json } from '../../core/dist/index.js';
3
+ /** Duplex routing keeps replies and cancellation moving while tools await the host. */
4
+ export declare class McpRpc {
5
+ private readonly output;
6
+ private readonly handle;
7
+ private framed?;
8
+ private serial;
9
+ private closed;
10
+ private readonly pending;
11
+ private readonly calls;
12
+ private writes;
13
+ constructor(output: Writable, handle: (message: unknown, signal?: AbortSignal) => Promise<Json | undefined>);
14
+ request(method: string, params: Json, signal: AbortSignal): Promise<unknown>;
15
+ private write;
16
+ private route;
17
+ close(): void;
18
+ serve(input: Readable): Promise<void>;
19
+ }