@invisible-labs/sdk 0.6.0-devnet.3 → 0.6.0-devnet.5

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 (45) hide show
  1. package/README.md +129 -15
  2. package/dist/.invisible-sdk-build-target.json +7 -0
  3. package/dist/{chunk-QQSI3ZD7.js → chunk-3MDHAS4D.js} +109 -17
  4. package/dist/chunk-3MDHAS4D.js.map +1 -0
  5. package/dist/{chunk-NKRVQXRP.js → chunk-3TGQ4CZ3.js} +297 -11
  6. package/dist/chunk-3TGQ4CZ3.js.map +1 -0
  7. package/dist/chunk-DCTYBUY3.js +258 -0
  8. package/dist/chunk-DCTYBUY3.js.map +1 -0
  9. package/dist/{chunk-NHEHCUS5.js → chunk-EBWTAXNT.js} +3 -3
  10. package/dist/{chunk-NHEHCUS5.js.map → chunk-EBWTAXNT.js.map} +1 -1
  11. package/dist/{chunk-V5HXJRBW.js → chunk-HJFMDMPY.js} +3 -3
  12. package/dist/chunk-HJFMDMPY.js.map +1 -0
  13. package/dist/{chunk-GHBQF3A7.js → chunk-QRN46R3F.js} +5 -2
  14. package/dist/chunk-QRN46R3F.js.map +1 -0
  15. package/dist/chunk-Y7AK6RBV.js +4189 -0
  16. package/dist/chunk-Y7AK6RBV.js.map +1 -0
  17. package/dist/{coordinator-VVJ33WF2.js → coordinator-PEWHNZ7I.js} +3 -3
  18. package/dist/{coordinator-VVJ33WF2.js.map → coordinator-PEWHNZ7I.js.map} +1 -1
  19. package/dist/events.js +3 -3
  20. package/dist/index.d.ts +69 -353
  21. package/dist/index.js +161 -43
  22. package/dist/index.js.map +1 -1
  23. package/dist/lp.d.ts +76 -18
  24. package/dist/lp.js +511 -111
  25. package/dist/lp.js.map +1 -1
  26. package/dist/presets.d.ts +7 -40
  27. package/dist/presets.js +10 -68
  28. package/dist/presets.js.map +1 -1
  29. package/dist/stats.js +1 -1
  30. package/dist/storage.js +2 -243
  31. package/dist/storage.js.map +1 -1
  32. package/dist/{errors-N2touVm4.d.ts → types.generated-YhFu9ZBR.d.ts} +65 -4
  33. package/dist/user.d.ts +134 -8
  34. package/dist/user.js +991 -250
  35. package/dist/user.js.map +1 -1
  36. package/package.json +5 -31
  37. package/dist/chunk-BWCGNTN5.js +0 -1153
  38. package/dist/chunk-BWCGNTN5.js.map +0 -1
  39. package/dist/chunk-DIA6U2CV.js +0 -1927
  40. package/dist/chunk-DIA6U2CV.js.map +0 -1
  41. package/dist/chunk-GHBQF3A7.js.map +0 -1
  42. package/dist/chunk-NKRVQXRP.js.map +0 -1
  43. package/dist/chunk-QQSI3ZD7.js.map +0 -1
  44. package/dist/chunk-V5HXJRBW.js.map +0 -1
  45. package/dist/types.generated-BSEBz4jR.d.ts +0 -68
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
- import { createStateController, reattestSerialized } from './chunk-BWCGNTN5.js';
2
- export { closeSession, createExponentialBackoff, createSession, noiseWebSocketTransport, performAttestation, performNoiseHandshake } from './chunk-BWCGNTN5.js';
3
- export { assertAttested, hex, lamports, publicKey, requestId } from './chunk-NHEHCUS5.js';
4
- import { getSessionState, failSessionClosed } from './chunk-V5HXJRBW.js';
5
- export { assertAttestResponse, verifyAttestation } from './chunk-DIA6U2CV.js';
6
- import { TransportError, NotImplementedError } from './chunk-GHBQF3A7.js';
7
- export { AttestationError, CommandError, InvalidDepositAmountError, InvisibleError, LpLifecycleError, NotImplementedError, PolicyValidationError, RoutingError, StorageError, TransportError, WalletError, isInvisibleError, normalizeError } from './chunk-GHBQF3A7.js';
1
+ import { createStateController, createSessionInternal, isLoopbackUrl, reattestSerialized, INTEL_SGX_ROOT_CA_FINGERPRINT_SHA256 } from './chunk-Y7AK6RBV.js';
2
+ export { closeSession, createExponentialBackoff, noiseWebSocketTransport } from './chunk-Y7AK6RBV.js';
3
+ export { assertAttested, hex, lamports, publicKey, requestId } from './chunk-EBWTAXNT.js';
4
+ import { getSessionState, failSessionClosed } from './chunk-HJFMDMPY.js';
5
+ import './chunk-DCTYBUY3.js';
6
+ import { TransportError, NotImplementedError } from './chunk-QRN46R3F.js';
7
+ export { AttestationError, CommandError, InvalidDepositAmountError, InvisibleError, LpLifecycleError, NotImplementedError, PolicyValidationError, RoutingError, StorageError, TransportError, WalletError, isInvisibleError, normalizeError } from './chunk-QRN46R3F.js';
8
8
  import './chunk-VR6T6OJS.js';
9
9
 
10
10
  // src/core/version.ts
@@ -51,15 +51,139 @@ function inMemoryTransport(options = {}) {
51
51
  };
52
52
  }
53
53
 
54
- // src/attestation/index.ts
54
+ // src/presets/azure-prod-maa.generated.ts
55
+ var AZURE_PROD_MAA_TRUST = {
56
+ issuer: "https://sharedweu.weu.attest.azure.net",
57
+ jwksUrl: "https://sharedweu.weu.attest.azure.net/certs",
58
+ policyHash: "9NY0VnTQ-IiBriBplVUpFbczcDaEBUwsiFYAzHu_gco"};
59
+ var configuredRuntimeProfile = "prod-devnet-simplified-locked" ;
60
+ var APPROVED_PRODUCTION_RUNTIME_PROFILE = configuredRuntimeProfile ;
61
+
62
+ // src/presets/production.ts
63
+ var AZURE_PROD_COORDINATOR_MRTD = "a2e61f1316e9e367e9c1f7a0adc98c48eb13875c399c85d286cee5ea2b05e57f2df9f61d903b0ae7ac5607d843dfffc1";
64
+ var AZURE_PROD_RUNTIME_PROFILE = APPROVED_PRODUCTION_RUNTIME_PROFILE;
65
+ var BINARY_HASH_HEX = /^[0-9a-f]{64}$/i;
66
+ var MRTD_HEX = /^[0-9a-f]{96}$/i;
67
+ var AZURE_PROD_RELEASE_PIN = {
68
+ mrtd: AZURE_PROD_COORDINATOR_MRTD,
69
+ runtimeProfile: AZURE_PROD_RUNTIME_PROFILE,
70
+ intelRootFingerprint: INTEL_SGX_ROOT_CA_FINGERPRINT_SHA256,
71
+ azureMaa: {
72
+ issuer: AZURE_PROD_MAA_TRUST.issuer,
73
+ jwksUrl: AZURE_PROD_MAA_TRUST.jwksUrl,
74
+ policyHash: AZURE_PROD_MAA_TRUST.policyHash
75
+ }
76
+ };
77
+ function assertApprovedBinaryHash(value) {
78
+ const binaryHash = typeof value === "string" ? value.toLowerCase() : "";
79
+ if (!BINARY_HASH_HEX.test(binaryHash)) {
80
+ throw new Error("an approved 64-character binary SHA-256 hash is required");
81
+ }
82
+ return binaryHash;
83
+ }
84
+ function assertApprovedMrtd(value) {
85
+ const mrtd = typeof value === "string" ? value.toLowerCase() : "";
86
+ if (!MRTD_HEX.test(mrtd)) {
87
+ throw new Error("an approved 96-character production MRTD is required");
88
+ }
89
+ return mrtd;
90
+ }
91
+ function createAzureProductionEndpoint({
92
+ wsUrl,
93
+ expectedHostname,
94
+ approvedBinaryHash,
95
+ approvedMrtd = AZURE_PROD_COORDINATOR_MRTD
96
+ }) {
97
+ const binaryHash = assertApprovedBinaryHash(approvedBinaryHash);
98
+ const mrtd = assertApprovedMrtd(approvedMrtd);
99
+ return {
100
+ wsUrl,
101
+ expectedHostname,
102
+ releasePin: { ...AZURE_PROD_RELEASE_PIN, mrtd, binaryHash },
103
+ requiredMode: "prod"
104
+ };
105
+ }
106
+
107
+ // src/presets/productionBinaryHash.ts
108
+ var APPROVED_PRODUCTION_COORDINATOR_BINARY_HASH = "e08f16d1c303f402e8210302e85ff8ce497e4152d7511143849c7771d56a1663".toLowerCase() ;
109
+
110
+ // src/presets/productionMrtd.ts
111
+ var APPROVED_PRODUCTION_COORDINATOR_MRTD = "a2e61f1316e9e367e9c1f7a0adc98c48eb13875c399c85d286cee5ea2b05e57f2df9f61d903b0ae7ac5607d843dfffc1".toLowerCase() ;
112
+
113
+ // src/session/publicReleasePolicy.ts
114
+ function publicProductionReleasePolicy() {
115
+ return {
116
+ expectedMrtd: APPROVED_PRODUCTION_COORDINATOR_MRTD,
117
+ expectedBinaryHash: APPROVED_PRODUCTION_COORDINATOR_BINARY_HASH,
118
+ expectedRuntimeProfile: APPROVED_PRODUCTION_RUNTIME_PROFILE
119
+ };
120
+ }
121
+
122
+ // src/session/publicSession.ts
123
+ var PUBLIC_SESSION_OPTION_KEYS = /* @__PURE__ */ new Set([
124
+ "coordinatorUrl",
125
+ "storage",
126
+ "wallet",
127
+ "clientPersistence"
128
+ ]);
129
+ var PUBLIC_COORDINATOR_URL_PROTOCOL = "wss:";
130
+ var PUBLIC_COORDINATOR_URL_ERROR = "public SDK createSession requires a non-loopback wss:// coordinatorUrl";
131
+ async function createSession(options) {
132
+ assertPublicOptions(options);
133
+ const parsedUrl = parsePublicCoordinatorUrl(options.coordinatorUrl);
134
+ const releasePolicy = publicProductionReleasePolicy();
135
+ const endpoint = createAzureProductionEndpoint({
136
+ wsUrl: options.coordinatorUrl,
137
+ expectedHostname: parsedUrl.hostname,
138
+ approvedBinaryHash: releasePolicy.expectedBinaryHash,
139
+ approvedMrtd: releasePolicy.expectedMrtd
140
+ });
141
+ const internalOptions = {
142
+ coordinator: { endpoints: [endpoint] },
143
+ ...options.storage === void 0 ? {} : { storage: options.storage },
144
+ ...options.wallet === void 0 ? {} : { wallet: options.wallet },
145
+ ...options.clientPersistence === void 0 ? {} : { clientPersistence: options.clientPersistence }
146
+ };
147
+ return createSessionInternal(internalOptions);
148
+ }
149
+ function assertPublicOptions(options) {
150
+ if (typeof options !== "object" || options === null || Array.isArray(options)) {
151
+ throw new TypeError("public SDK createSession options must be an object");
152
+ }
153
+ for (const key of Object.keys(options)) {
154
+ if (!PUBLIC_SESSION_OPTION_KEYS.has(key)) {
155
+ throw new Error(`public SDK createSession does not accept option ${key}`);
156
+ }
157
+ }
158
+ const coordinatorUrl = options.coordinatorUrl;
159
+ if (typeof coordinatorUrl !== "string") {
160
+ throw new TypeError("public SDK createSession requires coordinatorUrl");
161
+ }
162
+ const clientPersistence = options.clientPersistence;
163
+ if (clientPersistence !== void 0 && typeof clientPersistence !== "boolean") {
164
+ throw new TypeError("public SDK createSession clientPersistence must be a boolean");
165
+ }
166
+ }
167
+ function parsePublicCoordinatorUrl(value) {
168
+ let parsed;
169
+ try {
170
+ parsed = new URL(value);
171
+ } catch (cause) {
172
+ const error = new Error(PUBLIC_COORDINATOR_URL_ERROR);
173
+ error.cause = cause;
174
+ throw error;
175
+ }
176
+ if (parsed.protocol !== PUBLIC_COORDINATOR_URL_PROTOCOL || isLoopbackUrl(value)) {
177
+ throw new Error(PUBLIC_COORDINATOR_URL_ERROR);
178
+ }
179
+ return parsed;
180
+ }
181
+
182
+ // src/attestation/public.ts
55
183
  var attestation = {
56
- /**
57
- * Force-verify the current session against the active policy by re-running
58
- * attestation over the live channel. Updates the stored result on success.
59
- *
60
- * @throws AttestationError if verification fails.
61
- * @throws TransportError if the session has no live attested channel.
62
- */
184
+ productionPolicy() {
185
+ return publicProductionReleasePolicy();
186
+ },
63
187
  async assertValid(session) {
64
188
  const state = getSessionState(session);
65
189
  const endpoint = state.pool.endpoints[0];
@@ -74,19 +198,26 @@ var attestation = {
74
198
  throw error;
75
199
  }
76
200
  },
77
- /** The last verified attestation result, or `null` before first attestation. */
78
201
  current(session) {
79
202
  return getSessionState(session).attestation;
80
203
  },
81
- /** The release pin the active leader endpoint is verified against. Read-only. */
82
204
  policy(session) {
83
- return getSessionState(session).pool.endpoints[0].releasePin;
205
+ const pin = getSessionState(session).pool.endpoints[0].releasePin;
206
+ return {
207
+ expectedMrtd: pin.mrtd,
208
+ ...pin.binaryHash === void 0 ? {} : { expectedBinaryHash: pin.binaryHash },
209
+ ...pin.runtimeProfile === void 0 ? {} : { expectedRuntimeProfile: pin.runtimeProfile },
210
+ ...pin.runtimeMeasurements === void 0 ? {} : { expectedRuntimeMeasurements: pin.runtimeMeasurements },
211
+ ...pin.intelRootFingerprint === void 0 ? {} : { intelRootFingerprint: pin.intelRootFingerprint },
212
+ ...pin.azureMaa === void 0 ? {} : {
213
+ azureMaa: {
214
+ expectedIssuer: pin.azureMaa.issuer,
215
+ expectedJwksUrl: pin.azureMaa.jwksUrl,
216
+ expectedPolicyHash: pin.azureMaa.policyHash
217
+ }
218
+ }
219
+ };
84
220
  },
85
- /**
86
- * Subscribe to out-of-band attestation failures (e.g. during periodic
87
- * re-attestation). The handler fires with the verification error; returns an
88
- * unsubscribe function.
89
- */
90
221
  onPolicyViolation(session, handler) {
91
222
  const handlers = getSessionState(session).policyViolationHandlers;
92
223
  handlers.add(handler);
@@ -94,39 +225,26 @@ var attestation = {
94
225
  }
95
226
  };
96
227
 
97
- // src/coordinator/index.ts
228
+ // src/coordinator/public.ts
98
229
  var coordinator = {
99
- /** All configured endpoints, in the order supplied. Read-only. */
100
230
  endpoints(session) {
101
- return getSessionState(session).pool.endpoints;
231
+ return getSessionState(session).pool.endpoints.map((endpoint) => ({
232
+ coordinatorUrl: endpoint.wsUrl,
233
+ ...endpoint.roleHint === void 0 ? {} : { roleHint: endpoint.roleHint },
234
+ ...endpoint.weight === void 0 ? {} : { weight: endpoint.weight }
235
+ }));
102
236
  },
103
- /**
104
- * The endpoint currently accepting mutating commands.
105
- *
106
- * @throws NotImplementedError - deferred (coordinator-pending).
107
- */
108
237
  currentLeader(_session) {
109
238
  return Promise.reject(new NotImplementedError("coordinator.currentLeader"));
110
239
  },
111
- /**
112
- * The coordinator-reported version snapshot.
113
- *
114
- * @throws NotImplementedError - deferred (coordinator-pending).
115
- */
116
240
  version(_session) {
117
241
  return Promise.reject(new NotImplementedError("coordinator.version"));
118
242
  },
119
- /**
120
- * Tear down the active session and reconnect through the next healthy
121
- * endpoint, forcing a fresh attestation.
122
- *
123
- * @throws NotImplementedError - deferred (coordinator-pending).
124
- */
125
243
  forceFailover(_session) {
126
244
  return Promise.reject(new NotImplementedError("coordinator.forceFailover"));
127
245
  }
128
246
  };
129
247
 
130
- export { apiVersion, attestation, coordinator, inMemoryTransport, isAttested };
248
+ export { apiVersion, attestation, coordinator, createSession, inMemoryTransport, isAttested };
131
249
  //# sourceMappingURL=index.js.map
132
250
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/version.ts","../src/core/session.ts","../src/transport/inMemoryTransport.ts","../src/attestation/index.ts","../src/coordinator/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The API surface version this build implements. Bumped only on a breaking\n * surface change. See docs/sdk-specification.md section 12.\n */\nexport const apiVersion = \"v0\" as const;\n\n/** Literal type of {@link apiVersion}. */\nexport type ApiVersion = typeof apiVersion;\n","/**\n * The opaque session handle.\n *\n * A `Session` is the single stateful object the functional surface threads\n * through every call: `fn(session, args)`. It owns the transport, the\n * attestation state, and (later) the leader-epoch bookkeeping. Consumers treat\n * it as opaque - they read `session.attested` and pass it back to SDK\n * functions, but never reach inside. The internal state map and constructor\n * live alongside `createSession` (added in a later ticket); this module only\n * fixes the public shape so the rest of the surface can type against it.\n */\n\ndeclare const sessionBrand: unique symbol;\n\n/**\n * Opaque, attested session handle. Obtain one from `createSession`; pass it as\n * the first argument to every actor command. The only field consumers read is\n * {@link Session.attested}.\n */\nexport interface Session {\n /**\n * Whether the current Noise session has passed full TDX attestation. Sensitive\n * commands refuse to run until this is `true`. Re-handshake or failover resets\n * it to `false` until a fresh attestation completes.\n */\n readonly attested: boolean;\n /** @internal Opacity brand; not constructable by consumers. */\n readonly [sessionBrand]: true;\n}\n\n/** Convenience predicate mirroring {@link Session.attested}. */\nexport function isAttested(session: Session): boolean {\n return session.attested;\n}\n","/**\n * In-memory transport.\n *\n * A zero-network channel used by unit tests. It transitions straight to `open`\n * on connect. `send` delivers the raw frame bytes to an optional peer sink: the\n * WebSocket message boundary is the frame boundary, so there is no extra length\n * prefix (matching the production transport). Noise lives above this pure byte\n * channel, never inside it.\n *\n * With no peer wired in, `send` is a silent no-op (legacy stub behaviour for\n * tests that never exchange frames). A paired loopback coordinator supplies a\n * `peer` sink so a real Noise XX handshake can run in-process (see the\n * `testLoopback` fixture).\n */\n\nimport { TransportError } from \"../core/errors.js\";\nimport { createStateController } from \"./stateController.js\";\nimport type { Transport, Unsubscribe } from \"./types.js\";\n\n/** Options for {@link inMemoryTransport}. Test-only paired-loopback wiring. */\nexport interface InMemoryTransportOptions {\n /**\n * Sink for frames written via `send()`. A paired in-process coordinator sets\n * this so the client's raw bytes reach the responder. When omitted, `send`\n * is a no-op so legacy stub-only tests keep working.\n */\n readonly peer?: (frame: Uint8Array) => void;\n}\n\n/** In-memory transport with a hook to feed inbound frames into `onMessage`. */\nexport interface InMemoryTransportHandle extends Transport {\n /** Deliver a frame to this transport's `onMessage` listeners (peer -> client). */\n readonly deliver: (frame: Uint8Array) => void;\n}\n\nexport function inMemoryTransport(options: InMemoryTransportOptions = {}): InMemoryTransportHandle {\n const sc = createStateController(\"idle\");\n const messageListeners = new Set<(frame: Uint8Array) => void>();\n\n return {\n state: () => sc.get(),\n onStateChange: (listener) => sc.onChange(listener),\n onMessage(listener): Unsubscribe {\n messageListeners.add(listener);\n return () => messageListeners.delete(listener);\n },\n deliver(frame: Uint8Array): void {\n for (const listener of messageListeners) listener(frame);\n },\n async connect(signal) {\n if (signal?.aborted) {\n throw new TransportError(\"CONNECTION_LOST\", \"connect aborted before it started\");\n }\n if (sc.get() === \"open\") return;\n sc.set(\"connecting\");\n sc.set(\"open\");\n },\n send(frame: Uint8Array): void {\n if (sc.get() !== \"open\") {\n throw new TransportError(\"CONNECTION_LOST\", \"cannot send on a non-open transport\");\n }\n options.peer?.(frame);\n },\n close() {\n if (sc.get() === \"closed\") return;\n sc.set(\"closing\");\n sc.set(\"closed\");\n },\n };\n}\n","/**\n * `attestation` - read controls and verification triggers (spec section 4.1).\n *\n * Grouped as a small object of free functions over the opaque `Session`. The\n * read accessors (`current`, `policy`) report the last verified result and the\n * active pin; `assertValid` re-runs attestation over the live channel and\n * `onPolicyViolation` subscribes to out-of-band re-attestation failures.\n */\n\nimport type { Session } from \"../core/session.js\";\nimport type { Unsubscribe } from \"../transport/types.js\";\nimport type { AttestationResult } from \"../transport/handshake.js\";\nimport type { CoordinatorReleasePin } from \"../schemas/types.generated.js\";\nimport { failSessionClosed, getSessionState } from \"../session/state.js\";\nimport { reattestSerialized } from \"./reattest.js\";\n\nexport const attestation = {\n /**\n * Force-verify the current session against the active policy by re-running\n * attestation over the live channel. Updates the stored result on success.\n *\n * @throws AttestationError if verification fails.\n * @throws TransportError if the session has no live attested channel.\n */\n async assertValid(session: Session): Promise<AttestationResult> {\n const state = getSessionState(session);\n const endpoint = state.pool.endpoints[0]!;\n try {\n const result = await reattestSerialized(state, endpoint, state.pool.noiseTransportTimeoutMs);\n state.attestation = result;\n state.attested = true;\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n failSessionClosed(state, error);\n throw error;\n }\n },\n\n /** The last verified attestation result, or `null` before first attestation. */\n current(session: Session): AttestationResult | null {\n return getSessionState(session).attestation;\n },\n\n /** The release pin the active leader endpoint is verified against. Read-only. */\n policy(session: Session): CoordinatorReleasePin {\n return getSessionState(session).pool.endpoints[0]!.releasePin;\n },\n\n /**\n * Subscribe to out-of-band attestation failures (e.g. during periodic\n * re-attestation). The handler fires with the verification error; returns an\n * unsubscribe function.\n */\n onPolicyViolation(session: Session, handler: (error: Error) => void): Unsubscribe {\n const handlers = getSessionState(session).policyViolationHandlers;\n handlers.add(handler);\n return () => handlers.delete(handler);\n },\n};\n","/**\n * `coordinator` - endpoint pool inspection and failover (spec section 4.2).\n *\n * `endpoints` is a read accessor that works today. Leader discovery, version\n * reporting, and failover depend on the coordinator network surface and are\n * deferred (marked 🟡 V0-target in the spec).\n */\n\nimport { NotImplementedError } from \"../core/errors.js\";\nimport type { Session } from \"../core/session.js\";\nimport type { CoordinatorEndpoint } from \"../schemas/types.generated.js\";\nimport { getSessionState } from \"../session/state.js\";\n\n/** Coordinator-reported version and role snapshot. */\nexport interface CoordinatorVersion {\n readonly mode: \"prod\" | \"dev\";\n readonly protocolVersion: string;\n readonly schemaVersion: string;\n readonly hostname: string;\n readonly leaderEpoch: number;\n}\n\nexport const coordinator = {\n /** All configured endpoints, in the order supplied. Read-only. */\n endpoints(session: Session): readonly CoordinatorEndpoint[] {\n return getSessionState(session).pool.endpoints;\n },\n\n /**\n * The endpoint currently accepting mutating commands.\n *\n * @throws NotImplementedError - deferred (coordinator-pending).\n */\n currentLeader(_session: Session): Promise<CoordinatorEndpoint | null> {\n return Promise.reject(new NotImplementedError(\"coordinator.currentLeader\"));\n },\n\n /**\n * The coordinator-reported version snapshot.\n *\n * @throws NotImplementedError - deferred (coordinator-pending).\n */\n version(_session: Session): Promise<CoordinatorVersion> {\n return Promise.reject(new NotImplementedError(\"coordinator.version\"));\n },\n\n /**\n * Tear down the active session and reconnect through the next healthy\n * endpoint, forcing a fresh attestation.\n *\n * @throws NotImplementedError - deferred (coordinator-pending).\n */\n forceFailover(_session: Session): Promise<void> {\n return Promise.reject(new NotImplementedError(\"coordinator.forceFailover\"));\n },\n};\n"]}
1
+ {"version":3,"sources":["../src/core/version.ts","../src/core/session.ts","../src/transport/inMemoryTransport.ts","../src/presets/azure-prod-maa.generated.ts","../src/presets/productionRuntimeProfile.ts","../src/presets/production.ts","../src/presets/productionBinaryHash.ts","../src/presets/productionMrtd.ts","../src/session/publicReleasePolicy.ts","../src/session/publicSession.ts","../src/attestation/public.ts","../src/coordinator/public.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The API surface version this build implements. Bumped only on a breaking\n * surface change. See docs/sdk-specification.md section 12.\n */\nexport const apiVersion = \"v0\" as const;\n\n/** Literal type of {@link apiVersion}. */\nexport type ApiVersion = typeof apiVersion;\n","/**\n * The opaque session handle.\n *\n * A `Session` is the single stateful object the functional surface threads\n * through every call: `fn(session, args)`. It owns the transport, the\n * attestation state, and (later) the leader-epoch bookkeeping. Consumers treat\n * it as opaque - they read `session.attested` and pass it back to SDK\n * functions, but never reach inside. The internal state map and constructor\n * live alongside `createSession` (added in a later ticket); this module only\n * fixes the public shape so the rest of the surface can type against it.\n */\n\ndeclare const sessionBrand: unique symbol;\n\n/**\n * Opaque, attested session handle. Obtain one from `createSession`; pass it as\n * the first argument to every actor command. The only field consumers read is\n * {@link Session.attested}.\n */\nexport interface Session {\n /**\n * Whether the current Noise session has passed full TDX attestation. Sensitive\n * commands refuse to run until this is `true`. Re-handshake or failover resets\n * it to `false` until a fresh attestation completes.\n */\n readonly attested: boolean;\n /** @internal Opacity brand; not constructable by consumers. */\n readonly [sessionBrand]: true;\n}\n\n/** Convenience predicate mirroring {@link Session.attested}. */\nexport function isAttested(session: Session): boolean {\n return session.attested;\n}\n","/**\n * In-memory transport.\n *\n * A zero-network channel used by unit tests. It transitions straight to `open`\n * on connect. `send` delivers the raw frame bytes to an optional peer sink: the\n * WebSocket message boundary is the frame boundary, so there is no extra length\n * prefix (matching the production transport). Noise lives above this pure byte\n * channel, never inside it.\n *\n * With no peer wired in, `send` is a silent no-op (legacy stub behaviour for\n * tests that never exchange frames). A paired loopback coordinator supplies a\n * `peer` sink so a real Noise XX handshake can run in-process (see the\n * `testLoopback` fixture).\n */\n\nimport { TransportError } from \"../core/errors.js\";\nimport { createStateController } from \"./stateController.js\";\nimport type { Transport, Unsubscribe } from \"./types.js\";\n\n/** Options for {@link inMemoryTransport}. Test-only paired-loopback wiring. */\nexport interface InMemoryTransportOptions {\n /**\n * Sink for frames written via `send()`. A paired in-process coordinator sets\n * this so the client's raw bytes reach the responder. When omitted, `send`\n * is a no-op so legacy stub-only tests keep working.\n */\n readonly peer?: (frame: Uint8Array) => void;\n}\n\n/** In-memory transport with a hook to feed inbound frames into `onMessage`. */\nexport interface InMemoryTransportHandle extends Transport {\n /** Deliver a frame to this transport's `onMessage` listeners (peer -> client). */\n readonly deliver: (frame: Uint8Array) => void;\n}\n\nexport function inMemoryTransport(options: InMemoryTransportOptions = {}): InMemoryTransportHandle {\n const sc = createStateController(\"idle\");\n const messageListeners = new Set<(frame: Uint8Array) => void>();\n\n return {\n state: () => sc.get(),\n onStateChange: (listener) => sc.onChange(listener),\n onMessage(listener): Unsubscribe {\n messageListeners.add(listener);\n return () => messageListeners.delete(listener);\n },\n deliver(frame: Uint8Array): void {\n for (const listener of messageListeners) listener(frame);\n },\n async connect(signal) {\n if (signal?.aborted) {\n throw new TransportError(\"CONNECTION_LOST\", \"connect aborted before it started\");\n }\n if (sc.get() === \"open\") return;\n sc.set(\"connecting\");\n sc.set(\"open\");\n },\n send(frame: Uint8Array): void {\n if (sc.get() !== \"open\") {\n throw new TransportError(\"CONNECTION_LOST\", \"cannot send on a non-open transport\");\n }\n options.peer?.(frame);\n },\n close() {\n if (sc.get() === \"closed\") return;\n sc.set(\"closing\");\n sc.set(\"closed\");\n },\n };\n}\n","// Generated by npm run release:trust-policy:generate-sdk. Do not edit.\nexport const AZURE_PROD_MAA_TRUST = {\n issuer: \"https://sharedweu.weu.attest.azure.net\",\n jwksUrl: \"https://sharedweu.weu.attest.azure.net/certs\",\n policyHash: \"9NY0VnTQ-IiBriBplVUpFbczcDaEBUwsiFYAzHu_gco\",\n trustSetVersion: \"azure-prod-maa-v1\",\n} as const;\n","/** Build-time projection of the approved production runtime profile. */\n\nexport const DEFAULT_AZURE_PROD_RUNTIME_PROFILE = \"prod-devnet-simplified\" as const;\nexport const PROD_HARDENED_RUNTIME_PROFILE = \"prod-hardened\" as const;\nexport const PROD_DEVNET_SIMPLIFIED_RUNTIME_PROFILE = \"prod-devnet-simplified\" as const;\nexport const PROD_DEVNET_SIMPLIFIED_LOCKED_RUNTIME_PROFILE =\n \"prod-devnet-simplified-locked\" as const;\n\ndeclare const __INVISIBLE_SDK_PRODUCTION_RUNTIME_PROFILE__: string | undefined;\n\nconst configuredRuntimeProfile =\n typeof __INVISIBLE_SDK_PRODUCTION_RUNTIME_PROFILE__ === \"string\"\n ? __INVISIBLE_SDK_PRODUCTION_RUNTIME_PROFILE__\n : \"\";\n\nexport const APPROVED_PRODUCTION_RUNTIME_PROFILE =\n configuredRuntimeProfile === PROD_HARDENED_RUNTIME_PROFILE ||\n configuredRuntimeProfile === PROD_DEVNET_SIMPLIFIED_RUNTIME_PROFILE ||\n configuredRuntimeProfile === PROD_DEVNET_SIMPLIFIED_LOCKED_RUNTIME_PROFILE\n ? configuredRuntimeProfile\n : DEFAULT_AZURE_PROD_RUNTIME_PROFILE;\n","import { INTEL_SGX_ROOT_CA_FINGERPRINT_SHA256 } from \"../attestation/verifier.js\";\nimport type { CoordinatorEndpoint, CoordinatorReleasePin } from \"../schemas/types.generated.js\";\nimport { AZURE_PROD_MAA_TRUST } from \"./azure-prod-maa.generated.js\";\nimport { APPROVED_PRODUCTION_RUNTIME_PROFILE } from \"./productionRuntimeProfile.js\";\n\nexport const LOCAL_DEV_RELEASE_PIN_MRTD = \"local-dev-no-mrtd\";\n\nexport const PLACEHOLDER_RELEASE_PIN = {\n mrtd: \"\",\n intelRootFingerprint: \"\",\n} as const satisfies CoordinatorReleasePin;\n\nexport const AZURE_PROD_COORDINATOR_MRTD =\n \"a2e61f1316e9e367e9c1f7a0adc98c48eb13875c399c85d286cee5ea2b05e57f2df9f61d903b0ae7ac5607d843dfffc1\";\nexport const AZURE_PROD_RUNTIME_PROFILE = APPROVED_PRODUCTION_RUNTIME_PROFILE;\n\nconst BINARY_HASH_HEX = /^[0-9a-f]{64}$/i;\nconst MRTD_HEX = /^[0-9a-f]{96}$/i;\n\nconst AZURE_PROD_RELEASE_PIN = {\n mrtd: AZURE_PROD_COORDINATOR_MRTD,\n runtimeProfile: AZURE_PROD_RUNTIME_PROFILE,\n intelRootFingerprint: INTEL_SGX_ROOT_CA_FINGERPRINT_SHA256,\n azureMaa: {\n issuer: AZURE_PROD_MAA_TRUST.issuer,\n jwksUrl: AZURE_PROD_MAA_TRUST.jwksUrl,\n policyHash: AZURE_PROD_MAA_TRUST.policyHash,\n },\n} as const;\n\nexport function assertApprovedBinaryHash(value: string): string {\n const binaryHash = typeof value === \"string\" ? value.toLowerCase() : \"\";\n if (!BINARY_HASH_HEX.test(binaryHash)) {\n throw new Error(\"an approved 64-character binary SHA-256 hash is required\");\n }\n return binaryHash;\n}\n\nexport function assertApprovedMrtd(value: string): string {\n const mrtd = typeof value === \"string\" ? value.toLowerCase() : \"\";\n if (!MRTD_HEX.test(mrtd)) {\n throw new Error(\"an approved 96-character production MRTD is required\");\n }\n return mrtd;\n}\n\n/** Build the active Azure production policy for a concrete coordinator URL. */\nexport function createAzureProductionEndpoint({\n wsUrl,\n expectedHostname,\n approvedBinaryHash,\n approvedMrtd = AZURE_PROD_COORDINATOR_MRTD,\n}: {\n readonly wsUrl: string;\n readonly expectedHostname: string;\n readonly approvedBinaryHash: string;\n readonly approvedMrtd?: string;\n}): CoordinatorEndpoint {\n const binaryHash = assertApprovedBinaryHash(approvedBinaryHash);\n const mrtd = assertApprovedMrtd(approvedMrtd);\n return {\n wsUrl,\n expectedHostname,\n releasePin: { ...AZURE_PROD_RELEASE_PIN, mrtd, binaryHash },\n requiredMode: \"prod\",\n };\n}\n\n/** Build the explicit private dev/test policy. */\nexport function createDevelopmentEndpoint({\n wsUrl,\n expectedHostname,\n allowMissingDcapCollateral,\n}: {\n readonly wsUrl: string;\n readonly expectedHostname: string;\n readonly allowMissingDcapCollateral?: boolean;\n}): CoordinatorEndpoint {\n return {\n wsUrl,\n expectedHostname,\n releasePin: {\n ...PLACEHOLDER_RELEASE_PIN,\n ...(allowMissingDcapCollateral === true ? { allowMissingDcapCollateral: true } : {}),\n },\n requiredMode: \"dev\",\n };\n}\n","/** Build-time projection of the approved coordinator binary hash. */\n\ndeclare const __INVISIBLE_SDK_PRODUCTION_BINARY_HASH__: string | undefined;\n\nexport const APPROVED_PRODUCTION_COORDINATOR_BINARY_HASH =\n typeof __INVISIBLE_SDK_PRODUCTION_BINARY_HASH__ === \"string\"\n ? __INVISIBLE_SDK_PRODUCTION_BINARY_HASH__.toLowerCase()\n : \"\";\n","/** Build-time projection of the approved production coordinator MRTD. */\n\ndeclare const __INVISIBLE_SDK_PRODUCTION_MRTD__: string | undefined;\n\nexport const APPROVED_PRODUCTION_COORDINATOR_MRTD =\n typeof __INVISIBLE_SDK_PRODUCTION_MRTD__ === \"string\"\n ? __INVISIBLE_SDK_PRODUCTION_MRTD__.toLowerCase()\n : \"\";\n","import { APPROVED_PRODUCTION_COORDINATOR_BINARY_HASH } from \"../presets/productionBinaryHash.js\";\nimport { APPROVED_PRODUCTION_COORDINATOR_MRTD } from \"../presets/productionMrtd.js\";\nimport { APPROVED_PRODUCTION_RUNTIME_PROFILE } from \"../presets/productionRuntimeProfile.js\";\nimport type { CoordinatorRuntimeProfile } from \"../attestation/verifier.js\";\n\nexport interface PublicProductionReleasePolicy {\n readonly expectedMrtd: string;\n readonly expectedBinaryHash: string;\n readonly expectedRuntimeProfile: CoordinatorRuntimeProfile;\n}\n\n/** The build-bound production tuple used by the public session constructor. */\nexport function publicProductionReleasePolicy(): PublicProductionReleasePolicy {\n return {\n expectedMrtd: APPROVED_PRODUCTION_COORDINATOR_MRTD,\n expectedBinaryHash: APPROVED_PRODUCTION_COORDINATOR_BINARY_HASH,\n expectedRuntimeProfile: APPROVED_PRODUCTION_RUNTIME_PROFILE,\n };\n}\n","import type { Session } from \"../core/session.js\";\nimport { createAzureProductionEndpoint } from \"../presets/production.js\";\nimport { isLoopbackUrl } from \"./secureChannel.js\";\nimport { publicProductionReleasePolicy } from \"./publicReleasePolicy.js\";\nimport {\n closeSession,\n createSessionInternal,\n type CreateSessionOptions as InternalCreateSessionOptions,\n} from \"./createSession.js\";\n\nconst PUBLIC_SESSION_OPTION_KEYS = new Set([\n \"coordinatorUrl\",\n \"storage\",\n \"wallet\",\n \"clientPersistence\",\n]);\nconst PUBLIC_COORDINATOR_URL_PROTOCOL = \"wss:\";\nconst PUBLIC_COORDINATOR_URL_ERROR =\n \"public SDK createSession requires a non-loopback wss:// coordinatorUrl\";\n\nexport interface PublicCreateSessionOptions {\n readonly coordinatorUrl: string;\n readonly storage?: unknown;\n readonly wallet?: unknown;\n /** Opt into SDK-owned normal-user transfer persistence. */\n readonly clientPersistence?: boolean;\n}\n\n/**\n * Open a production-only public SDK session.\n *\n * The caller supplies only the route and public adapters. The Azure\n * production release policy is embedded by the selected SDK build.\n */\nexport async function createSession(options: PublicCreateSessionOptions): Promise<Session> {\n assertPublicOptions(options);\n const parsedUrl = parsePublicCoordinatorUrl(options.coordinatorUrl);\n const releasePolicy = publicProductionReleasePolicy();\n const endpoint = createAzureProductionEndpoint({\n wsUrl: options.coordinatorUrl,\n expectedHostname: parsedUrl.hostname,\n approvedBinaryHash: releasePolicy.expectedBinaryHash,\n approvedMrtd: releasePolicy.expectedMrtd,\n });\n\n const internalOptions: InternalCreateSessionOptions = {\n coordinator: { endpoints: [endpoint] },\n ...(options.storage === undefined ? {} : { storage: options.storage }),\n ...(options.wallet === undefined ? {} : { wallet: options.wallet }),\n ...(options.clientPersistence === undefined\n ? {}\n : { clientPersistence: options.clientPersistence }),\n };\n return createSessionInternal(internalOptions);\n}\n\nexport { closeSession };\n\nfunction assertPublicOptions(options: unknown): asserts options is PublicCreateSessionOptions {\n if (typeof options !== \"object\" || options === null || Array.isArray(options)) {\n throw new TypeError(\"public SDK createSession options must be an object\");\n }\n for (const key of Object.keys(options)) {\n if (!PUBLIC_SESSION_OPTION_KEYS.has(key)) {\n throw new Error(`public SDK createSession does not accept option ${key}`);\n }\n }\n const coordinatorUrl = (options as { coordinatorUrl?: unknown }).coordinatorUrl;\n if (typeof coordinatorUrl !== \"string\") {\n throw new TypeError(\"public SDK createSession requires coordinatorUrl\");\n }\n const clientPersistence = (options as { clientPersistence?: unknown }).clientPersistence;\n if (clientPersistence !== undefined && typeof clientPersistence !== \"boolean\") {\n throw new TypeError(\"public SDK createSession clientPersistence must be a boolean\");\n }\n}\n\nfunction parsePublicCoordinatorUrl(value: string): URL {\n let parsed: URL;\n try {\n parsed = new URL(value);\n } catch (cause) {\n const error = new Error(PUBLIC_COORDINATOR_URL_ERROR);\n (error as { cause?: unknown }).cause = cause;\n throw error;\n }\n if (parsed.protocol !== PUBLIC_COORDINATOR_URL_PROTOCOL || isLoopbackUrl(value)) {\n throw new Error(PUBLIC_COORDINATOR_URL_ERROR);\n }\n return parsed;\n}\n","import type { Session } from \"../core/session.js\";\nimport type { AttestationResult } from \"../transport/handshake.js\";\nimport type { Unsubscribe } from \"../transport/types.js\";\nimport { reattestSerialized } from \"./reattest.js\";\nimport { failSessionClosed, getSessionState } from \"../session/state.js\";\nimport {\n publicProductionReleasePolicy,\n type PublicProductionReleasePolicy,\n} from \"../session/publicReleasePolicy.js\";\n\nexport type { AttestationResult } from \"../transport/handshake.js\";\n\nexport interface PublicAttestationPolicy {\n readonly expectedMrtd: string;\n readonly expectedBinaryHash?: string;\n readonly expectedRuntimeProfile?:\n | \"prod-hardened\"\n | \"prod-devnet-simplified\"\n | \"prod-devnet-simplified-locked\"\n | \"azure-tdx-v0-agentless\";\n readonly expectedRuntimeMeasurements?: {\n readonly rtmr0: string;\n readonly rtmr1: string;\n readonly rtmr2: string;\n readonly rtmr3: string;\n };\n readonly intelRootFingerprint?: string;\n readonly azureMaa?: {\n readonly expectedIssuer: string;\n readonly expectedJwksUrl: string;\n readonly expectedPolicyHash: string;\n };\n}\n\n/** Public attestation read controls. Policy construction remains internal. */\nexport const attestation = {\n productionPolicy(): PublicProductionReleasePolicy {\n return publicProductionReleasePolicy();\n },\n\n async assertValid(session: Session): Promise<AttestationResult> {\n const state = getSessionState(session);\n const endpoint = state.pool.endpoints[0]!;\n try {\n const result = await reattestSerialized(state, endpoint, state.pool.noiseTransportTimeoutMs);\n state.attestation = result;\n state.attested = true;\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n failSessionClosed(state, error);\n throw error;\n }\n },\n\n current(session: Session): AttestationResult | null {\n return getSessionState(session).attestation;\n },\n\n policy(session: Session): PublicAttestationPolicy {\n const pin = getSessionState(session).pool.endpoints[0]!.releasePin;\n return {\n expectedMrtd: pin.mrtd,\n ...(pin.binaryHash === undefined ? {} : { expectedBinaryHash: pin.binaryHash }),\n ...(pin.runtimeProfile === undefined ? {} : { expectedRuntimeProfile: pin.runtimeProfile }),\n ...(pin.runtimeMeasurements === undefined\n ? {}\n : { expectedRuntimeMeasurements: pin.runtimeMeasurements }),\n ...(pin.intelRootFingerprint === undefined\n ? {}\n : { intelRootFingerprint: pin.intelRootFingerprint }),\n ...(pin.azureMaa === undefined\n ? {}\n : {\n azureMaa: {\n expectedIssuer: pin.azureMaa.issuer,\n expectedJwksUrl: pin.azureMaa.jwksUrl,\n expectedPolicyHash: pin.azureMaa.policyHash,\n },\n }),\n };\n },\n\n onPolicyViolation(session: Session, handler: (error: Error) => void): Unsubscribe {\n const handlers = getSessionState(session).policyViolationHandlers;\n handlers.add(handler);\n return () => handlers.delete(handler);\n },\n};\n","import { NotImplementedError } from \"../core/errors.js\";\nimport type { Session } from \"../core/session.js\";\nimport { getSessionState } from \"../session/state.js\";\n\nexport interface PublicCoordinatorEndpoint {\n readonly coordinatorUrl: string;\n readonly roleHint?: \"leader\" | \"watcher\";\n readonly weight?: number;\n}\n\nexport interface CoordinatorVersion {\n readonly mode: \"prod\" | \"dev\";\n readonly protocolVersion: string;\n readonly schemaVersion: string;\n readonly hostname: string;\n readonly leaderEpoch: number;\n}\n\nexport const coordinator = {\n endpoints(session: Session): readonly PublicCoordinatorEndpoint[] {\n return getSessionState(session).pool.endpoints.map((endpoint) => ({\n coordinatorUrl: endpoint.wsUrl,\n ...(endpoint.roleHint === undefined ? {} : { roleHint: endpoint.roleHint }),\n ...(endpoint.weight === undefined ? {} : { weight: endpoint.weight }),\n }));\n },\n\n currentLeader(_session: Session): Promise<PublicCoordinatorEndpoint | null> {\n return Promise.reject(new NotImplementedError(\"coordinator.currentLeader\"));\n },\n\n version(_session: Session): Promise<CoordinatorVersion> {\n return Promise.reject(new NotImplementedError(\"coordinator.version\"));\n },\n\n forceFailover(_session: Session): Promise<void> {\n return Promise.reject(new NotImplementedError(\"coordinator.forceFailover\"));\n },\n};\n"]}
package/dist/lp.d.ts CHANGED
@@ -19,6 +19,7 @@ declare function bytesToHex(bytes: Uint8Array): string;
19
19
  declare function signLpCommandBytes(auth: LpPositionCodeAuth, bytes: Uint8Array): Promise<Uint8Array>;
20
20
 
21
21
  type SourceLiquidityUse = "not_materialized" | "available" | "locked_for_payout" | "pending_finality" | "spent" | "released";
22
+ type LpWithdrawalMode = "exact" | "max_available";
22
23
  type LpInventoryShard = {
23
24
  kind: "lp";
24
25
  lpPositionId: string;
@@ -44,8 +45,14 @@ type LpPositionView = {
44
45
  refillThreshold: number;
45
46
  shards: LpInventoryShard[];
46
47
  createdAt: number;
48
+ redemptionPermission?: LpRedemptionPermission;
47
49
  actorSync?: LpActorSyncView;
48
50
  };
51
+ type LpRedemptionPermission = {
52
+ state: "unknown" | "locked" | "enabled";
53
+ grantRevision: number;
54
+ observedAtMs: number;
55
+ };
49
56
  type LpActorSyncView = {
50
57
  lpPositionId: string;
51
58
  status: "idle" | "settling" | "reimbursement_due";
@@ -56,6 +63,8 @@ type LpActorSyncView = {
56
63
  lifetimeEarnedLamports: number;
57
64
  redeemablePrincipalSourceCount: number;
58
65
  redeemableFeeSourceCount: number;
66
+ /** Distinct physical sources contributing to the full redeemable claim. */
67
+ redeemableSourceCount?: number;
59
68
  pendingReservationCount: number;
60
69
  reservedPayoutLamports: number;
61
70
  estimatedNetworkFeeLamports: number;
@@ -78,6 +87,7 @@ type LpActorSyncView = {
78
87
  type LpRedemptionHistoryView = {
79
88
  redemptionId: string;
80
89
  state: "requested" | "match_requested" | "reserved" | "pending" | "confirmed" | "rejected";
90
+ withdrawalMode?: LpWithdrawalMode;
81
91
  acceptedLamports: number;
82
92
  acceptedDepositPrincipalLamports: number;
83
93
  acceptedEarnedFeeLamports: number;
@@ -99,8 +109,23 @@ type LpRedemptionHistoryView = {
99
109
  createdAtMs: number;
100
110
  updatedAtMs: number;
101
111
  };
112
+ /** Wallet adapter used only for the coordinator-issued V0 LP admission proof. */
113
+ type LpCreationSigner = {
114
+ readonly publicKey: string;
115
+ readonly signMessage: (message: Uint8Array) => Promise<Uint8Array>;
116
+ };
117
+ type LpPositionCreationIntent = {
118
+ readonly committedLamports: number;
119
+ readonly shardCount: number;
120
+ readonly shardAmountLamports: number;
121
+ readonly refillThreshold: number;
122
+ };
123
+ type LpCreationAuthorization = {
124
+ readonly authorizationId: string;
125
+ };
102
126
  type OpenLpPositionInput = {
103
127
  lpPositionId: string;
128
+ creationAuthorizationId: string;
104
129
  authPublicKey: number[];
105
130
  refillPublicKey: number[];
106
131
  withdrawalCommitment: number[];
@@ -140,6 +165,9 @@ type FinalizeLpDkgBatchInput = {
140
165
  type LpWithdrawalExecutionView = {
141
166
  withdrawalId: string;
142
167
  txSignatures: string[];
168
+ acceptedLamports: number;
169
+ acceptedDepositPrincipalLamports: number;
170
+ acceptedEarnedFeeLamports: number;
143
171
  };
144
172
  type LpDkgClient = {
145
173
  initDkg(input: {
@@ -170,8 +198,9 @@ type LpDkgClient = {
170
198
  }>;
171
199
  };
172
200
  type LpCoordinatorClient = LpDkgClient & {
201
+ authorizePositionCreation(intent: LpPositionCreationIntent, signer: LpCreationSigner): Promise<LpCreationAuthorization>;
173
202
  openPosition(input: OpenLpPositionInput, auth: LpPositionCodeAuth): Promise<LpPositionView>;
174
- getPosition(lpPositionId: string, auth: LpPositionCodeAuth): Promise<LpPositionView>;
203
+ getPosition(lpPositionId: string, auth: LpPositionCodeAuth, options?: LpPositionRequestOptions): Promise<LpPositionView>;
175
204
  finalizeDkgBatch(input: FinalizeLpDkgBatchInput, auth: LpPositionCodeAuth): Promise<LpPositionView>;
176
205
  refillPosition(input: RefillLpPositionInput, auth: LpPositionCodeAuth): Promise<LpPositionView>;
177
206
  reconcileFunding(lpPositionId: string, auth: LpPositionCodeAuth): Promise<LpPositionView>;
@@ -195,13 +224,20 @@ type LpCoordinatorClient = LpDkgClient & {
195
224
  destinationAddresses: string[];
196
225
  depositPrincipalLamports: number;
197
226
  earnedFeeLamports: number;
227
+ withdrawalMode: LpWithdrawalMode;
198
228
  requestedAtMs: number;
199
229
  allowManyToOne?: boolean;
200
230
  }, auth: LpPositionCodeAuth): Promise<LpWithdrawalExecutionView>;
201
231
  };
232
+ interface LpPositionRequestOptions {
233
+ readonly deadlineMs?: number;
234
+ readonly signal?: AbortSignal;
235
+ readonly timeoutMs?: number;
236
+ }
202
237
 
203
238
  declare const LP_REDEMPTION_RECONCILING_MESSAGE = "LP redemption is still settling on the coordinator; it will reconcile from sync";
204
239
  declare const LP_MISSING_POSITION_CODE_MESSAGE = "Save or recover the LP Position Code before using LP funds";
240
+ declare const LP_FEE_SOURCE_COUNT_UNAVAILABLE_MESSAGE = "LP earned-fee source count is not available; pass allowManyToOne: true to acknowledge many-to-one withdrawal risk";
205
241
  type LpLifecycleDkgProgress = {
206
242
  readonly phase: "dkg";
207
243
  readonly lpPositionId: string;
@@ -211,14 +247,12 @@ type LpLifecycleDkgProgress = {
211
247
  readonly total: number;
212
248
  };
213
249
  interface CreatePositionArgs {
250
+ readonly wallet: LpCreationSigner;
214
251
  readonly committedLamports?: number;
215
252
  readonly shardCount?: number;
216
253
  readonly refillThreshold?: number;
217
254
  readonly feePolicy?: unknown;
218
- /**
219
- * Called after SDK-owned code generation and before the coordinator open call.
220
- * Use this to show/save the code if coordinator intake fails.
221
- */
255
+ /** Called only after the coordinator has durably opened the position. */
222
256
  readonly onPositionCode?: (code: LpGeneratedPositionCode) => void;
223
257
  }
224
258
  interface LpGeneratedPositionCode {
@@ -251,9 +285,11 @@ interface LpTopUpRequest {
251
285
  readonly status: "watching" | "funded" | "expired";
252
286
  }
253
287
  interface WithdrawPositionArgs {
254
- /** Accepted LP deposit-principal bucket claim. Computed from the position when omitted. */
288
+ /** Signed intent mode. The coordinator resolves max_available from sealed state. */
289
+ readonly withdrawalMode: LpWithdrawalMode;
290
+ /** Exact LP deposit-principal bucket claim. Required for exact mode. */
255
291
  readonly depositPrincipalLamports?: number;
256
- /** Accepted earned-fee bucket claim. Computed from the position when omitted. */
292
+ /** Exact earned-fee bucket claim. Required for exact mode. */
257
293
  readonly earnedFeeLamports?: number;
258
294
  readonly destinationAddresses: string[];
259
295
  /** Required to accept a privacy-degrading single-destination withdrawal. */
@@ -268,6 +304,9 @@ interface RefillArgs {
268
304
  interface WithdrawalExecution {
269
305
  readonly withdrawalId: string;
270
306
  readonly txSignatures: string[];
307
+ readonly acceptedLamports?: number;
308
+ readonly acceptedDepositPrincipalLamports?: number;
309
+ readonly acceptedEarnedFeeLamports?: number;
271
310
  }
272
311
  interface LpWithdrawalRecord {
273
312
  readonly redemptionId: string;
@@ -300,6 +339,7 @@ interface WithdrawalConfirmation {
300
339
  }
301
340
  interface LpLifecycleRuntime {
302
341
  readonly coordinatorClient?: LpCoordinatorClient;
342
+ readonly reconnectSession?: () => Promise<Session>;
303
343
  readonly workerFactory?: () => Worker;
304
344
  readonly useDeterministicTestAddresses?: boolean;
305
345
  readonly nowMs?: () => number;
@@ -313,19 +353,36 @@ interface WaitForWithdrawalConfirmationOptions {
313
353
  readonly onPosition?: (position: LpPositionView) => void;
314
354
  readonly onRedemptionUpdate?: (record: LpWithdrawalRecord) => void;
315
355
  readonly redemptionRecord?: LpWithdrawalRecord;
356
+ /** Caller-owned absolute deadline preserved across client/session retries. */
357
+ readonly deadlineMs?: number;
358
+ readonly signal?: AbortSignal;
359
+ }
360
+ interface RecoverPositionArgs {
361
+ readonly code: string;
362
+ readonly deadlineMs?: number;
363
+ readonly signal?: AbortSignal;
316
364
  }
317
365
  interface WaitForTopUpOptions {
318
366
  readonly signal?: AbortSignal;
319
367
  readonly pollIntervalMs?: number;
320
368
  readonly positionId?: string;
321
369
  }
370
+ interface LpWithdrawalPlanPreviewArgs {
371
+ readonly depositPrincipalLamports?: number;
372
+ readonly earnedFeeLamports?: number;
373
+ readonly allowManyToOne?: boolean;
374
+ }
375
+ interface LpWithdrawalPlanPreview {
376
+ readonly depositPrincipalLamports: number;
377
+ readonly earnedFeeLamports: number;
378
+ readonly sourceCount: number;
379
+ }
322
380
  declare function isLpRedemptionReconcilingError(error: unknown): boolean;
323
381
  declare function isLpPositionAuthMissingError(error: unknown): boolean;
382
+ declare function previewLpWithdrawalPlan(position: LpPositionView, args?: LpWithdrawalPlanPreviewArgs): LpWithdrawalPlanPreview;
324
383
  interface LpLifecycleClient {
325
- createPosition(args?: CreatePositionArgs): Promise<CreatePositionResult>;
326
- recoverPosition(args: {
327
- readonly code: string;
328
- }): Promise<LpPositionView>;
384
+ createPosition(args: CreatePositionArgs): Promise<CreatePositionResult>;
385
+ recoverPosition(args: RecoverPositionArgs): Promise<LpPositionView>;
329
386
  confirmPositionCodeSaved(positionId: string): void;
330
387
  completeDkgBatch(positionId: string, options?: CompleteDkgBatchOptions): Promise<LpPositionView>;
331
388
  refreshPosition(positionId: string): Promise<LpPositionView>;
@@ -344,9 +401,12 @@ interface LpLifecycleClient {
344
401
  declare function createLpLifecycleClient(session: Session, runtime?: LpLifecycleRuntime): LpLifecycleClient;
345
402
  declare function defaultLpLifecycleClient(session: Session): LpLifecycleClient;
346
403
 
347
- declare const LP_COMMAND_REQUEST_TIMEOUT_MS = 120000;
404
+ declare const LP_COMMAND_REQUEST_TIMEOUT_MS = 30000;
348
405
  declare const LP_DKG_ABORT_REQUEST_TIMEOUT_MS = 10000;
349
- declare function createLpCoordinatorClient(session: Session): LpCoordinatorClient;
406
+ type LpCoordinatorClientOptions = {
407
+ readonly reconnectSession?: () => Promise<Session>;
408
+ };
409
+ declare function createLpCoordinatorClient(session: Session, options?: LpCoordinatorClientOptions): LpCoordinatorClient;
350
410
 
351
411
  type LpDkgProgress = {
352
412
  completed: number;
@@ -369,10 +429,8 @@ declare const LP_DKG_WORKER_REQUEST_TIMEOUT_MESSAGE = "LP DKG worker request tim
369
429
  declare const LP_DKG_ABORT_CLEANUP_TIMEOUT_MS = 10000;
370
430
  declare function createLpDkgBatch(input: CreateLpDkgBatchInput): Promise<string[]>;
371
431
 
372
- declare function createPosition(session: Session, args?: CreatePositionArgs): Promise<CreatePositionResult>;
373
- declare function recoverPosition(session: Session, args: {
374
- readonly code: string;
375
- }): Promise<LpPositionView>;
432
+ declare function createPosition(session: Session, args: CreatePositionArgs): Promise<CreatePositionResult>;
433
+ declare function recoverPosition(session: Session, args: RecoverPositionArgs): Promise<LpPositionView>;
376
434
  declare function confirmPositionCodeSaved(session: Session, positionId: string): void;
377
435
  declare function completeDkgBatch(session: Session, positionId: string, opts?: CompleteDkgBatchOptions): Promise<LpPositionView>;
378
436
  declare function refreshPosition(session: Session, positionId: string): Promise<LpPositionView>;
@@ -392,4 +450,4 @@ declare function withdrawFees(session: Session, positionId: string, args: {
392
450
  }): Promise<never>;
393
451
  declare function listPositions(session: Session): Promise<LpPositionView[]>;
394
452
 
395
- export { type CompleteDkgBatchOptions, type CreateLpDkgBatchInput, type CreatePositionArgs, type CreatePositionResult, type FinalizeLpDkgBatchInput, type FundingConfirmationInput, type InitialFundingPlan, LP_COMMAND_REQUEST_TIMEOUT_MS, LP_DKG_ABORT_CLEANUP_TIMEOUT_MS, LP_DKG_ABORT_REQUEST_TIMEOUT_MS, LP_DKG_WORKER_REQUEST_TIMEOUT_MESSAGE, LP_DKG_WORKER_REQUEST_TIMEOUT_MS, LP_MISSING_POSITION_CODE_MESSAGE, LP_REDEMPTION_RECONCILING_MESSAGE, type LpActorSyncView, type LpCoordinatorClient, type LpDkgClient, type LpDkgProgress, type LpInventoryShard, type LpLifecycleClient, type LpLifecycleDkgProgress, type LpLifecycleRuntime, type LpPositionCode, type LpPositionCodeAuth, type LpPositionView, type LpRedemptionHistoryView, type LpTopUpRequest, type LpWithdrawalExecutionView, type LpWithdrawalRecord, type OpenLpPositionInput, type RefillArgs, type RefillLpPositionInput, type SourceLiquidityUse, type WaitForTopUpOptions, type WaitForWithdrawalConfirmationOptions, type WithdrawPositionArgs, type WithdrawPositionResult, type WithdrawalConfirmation, type WithdrawalExecution, bytesToHex, completeDkgBatch, confirmPositionCodeSaved, createLpCoordinatorClient, createLpDkgBatch, createLpLifecycleClient, createPosition, defaultLpLifecycleClient, deriveLpPositionCodeAuth, generateLpPositionCode, isLpPositionAuthMissingError, isLpRedemptionReconcilingError, listPositions, normalizeLpPositionCode, prepareInitialFunding, prepareTopUp, reconcileFunding, recoverPosition, refill, refreshPosition, signLpCommandBytes, waitForTopUp, waitForWithdrawalConfirmation, withdrawFees, withdrawPosition };
453
+ export { type CompleteDkgBatchOptions, type CreateLpDkgBatchInput, type CreatePositionArgs, type CreatePositionResult, type FinalizeLpDkgBatchInput, type FundingConfirmationInput, type InitialFundingPlan, LP_COMMAND_REQUEST_TIMEOUT_MS, LP_DKG_ABORT_CLEANUP_TIMEOUT_MS, LP_DKG_ABORT_REQUEST_TIMEOUT_MS, LP_DKG_WORKER_REQUEST_TIMEOUT_MESSAGE, LP_DKG_WORKER_REQUEST_TIMEOUT_MS, LP_FEE_SOURCE_COUNT_UNAVAILABLE_MESSAGE, LP_MISSING_POSITION_CODE_MESSAGE, LP_REDEMPTION_RECONCILING_MESSAGE, type LpActorSyncView, type LpCoordinatorClient, type LpCoordinatorClientOptions, type LpCreationAuthorization, type LpCreationSigner, type LpDkgClient, type LpDkgProgress, type LpInventoryShard, type LpLifecycleClient, type LpLifecycleDkgProgress, type LpLifecycleRuntime, type LpPositionCode, type LpPositionCodeAuth, type LpPositionCreationIntent, type LpPositionRequestOptions, type LpPositionView, type LpRedemptionHistoryView, type LpRedemptionPermission, type LpTopUpRequest, type LpWithdrawalExecutionView, type LpWithdrawalMode, type LpWithdrawalPlanPreview, type LpWithdrawalPlanPreviewArgs, type LpWithdrawalRecord, type OpenLpPositionInput, type RecoverPositionArgs, type RefillArgs, type RefillLpPositionInput, type SourceLiquidityUse, type WaitForTopUpOptions, type WaitForWithdrawalConfirmationOptions, type WithdrawPositionArgs, type WithdrawPositionResult, type WithdrawalConfirmation, type WithdrawalExecution, bytesToHex, completeDkgBatch, confirmPositionCodeSaved, createLpCoordinatorClient, createLpDkgBatch, createLpLifecycleClient, createPosition, defaultLpLifecycleClient, deriveLpPositionCodeAuth, generateLpPositionCode, isLpPositionAuthMissingError, isLpRedemptionReconcilingError, listPositions, normalizeLpPositionCode, prepareInitialFunding, prepareTopUp, previewLpWithdrawalPlan, reconcileFunding, recoverPosition, refill, refreshPosition, signLpCommandBytes, waitForTopUp, waitForWithdrawalConfirmation, withdrawFees, withdrawPosition };