@sentropic/llm-mesh 0.12.0 → 0.13.2

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 (66) hide show
  1. package/README.md +35 -1
  2. package/dist/auth.d.ts +8 -2
  3. package/dist/auth.d.ts.map +1 -1
  4. package/dist/auth.js +14 -0
  5. package/dist/auth.js.map +1 -1
  6. package/dist/enrollment/claude-code.d.ts +9 -0
  7. package/dist/enrollment/claude-code.d.ts.map +1 -0
  8. package/dist/enrollment/claude-code.js +18 -0
  9. package/dist/enrollment/claude-code.js.map +1 -0
  10. package/dist/enrollment/cloud-code.d.ts +36 -0
  11. package/dist/enrollment/cloud-code.d.ts.map +1 -0
  12. package/dist/enrollment/cloud-code.js +259 -0
  13. package/dist/enrollment/cloud-code.js.map +1 -0
  14. package/dist/enrollment/codex.d.ts +33 -0
  15. package/dist/enrollment/codex.d.ts.map +1 -0
  16. package/dist/enrollment/codex.js +222 -0
  17. package/dist/enrollment/codex.js.map +1 -0
  18. package/dist/enrollment/contracts.d.ts +86 -0
  19. package/dist/enrollment/contracts.d.ts.map +1 -0
  20. package/dist/enrollment/contracts.js +3 -0
  21. package/dist/enrollment/contracts.js.map +1 -0
  22. package/dist/enrollment/index.d.ts +2 -0
  23. package/dist/enrollment/index.d.ts.map +1 -0
  24. package/dist/enrollment/index.js +3 -0
  25. package/dist/enrollment/index.js.map +1 -0
  26. package/dist/enrollment/pkce.d.ts +18 -0
  27. package/dist/enrollment/pkce.d.ts.map +1 -0
  28. package/dist/enrollment/pkce.js +104 -0
  29. package/dist/enrollment/pkce.js.map +1 -0
  30. package/dist/node/index.d.ts +7 -0
  31. package/dist/node/index.d.ts.map +1 -0
  32. package/dist/node/index.js +6 -0
  33. package/dist/node/index.js.map +1 -0
  34. package/dist/node/keyring/encrypted-file-keyring.d.ts +13 -0
  35. package/dist/node/keyring/encrypted-file-keyring.d.ts.map +1 -0
  36. package/dist/node/keyring/encrypted-file-keyring.js +134 -0
  37. package/dist/node/keyring/encrypted-file-keyring.js.map +1 -0
  38. package/dist/node/keyring/env-keyring.d.ts +11 -0
  39. package/dist/node/keyring/env-keyring.d.ts.map +1 -0
  40. package/dist/node/keyring/env-keyring.js +26 -0
  41. package/dist/node/keyring/env-keyring.js.map +1 -0
  42. package/dist/node/keyring/in-memory-keyring.d.ts +8 -0
  43. package/dist/node/keyring/in-memory-keyring.d.ts.map +1 -0
  44. package/dist/node/keyring/in-memory-keyring.js +13 -0
  45. package/dist/node/keyring/in-memory-keyring.js.map +1 -0
  46. package/dist/node/keyring/linux-secretstore-keyring.d.ts +10 -0
  47. package/dist/node/keyring/linux-secretstore-keyring.d.ts.map +1 -0
  48. package/dist/node/keyring/linux-secretstore-keyring.js +17 -0
  49. package/dist/node/keyring/linux-secretstore-keyring.js.map +1 -0
  50. package/dist/node/keyring/macos-keychain-keyring.d.ts +10 -0
  51. package/dist/node/keyring/macos-keychain-keyring.d.ts.map +1 -0
  52. package/dist/node/keyring/macos-keychain-keyring.js +17 -0
  53. package/dist/node/keyring/macos-keychain-keyring.js.map +1 -0
  54. package/dist/service/facade.d.ts +52 -0
  55. package/dist/service/facade.d.ts.map +1 -0
  56. package/dist/service/facade.js +53 -0
  57. package/dist/service/facade.js.map +1 -0
  58. package/dist/service/local-account-transport-service.d.ts +34 -0
  59. package/dist/service/local-account-transport-service.d.ts.map +1 -0
  60. package/dist/service/local-account-transport-service.js +263 -0
  61. package/dist/service/local-account-transport-service.js.map +1 -0
  62. package/dist/transport/cloud-code-transport.d.ts +26 -0
  63. package/dist/transport/cloud-code-transport.d.ts.map +1 -0
  64. package/dist/transport/cloud-code-transport.js +214 -0
  65. package/dist/transport/cloud-code-transport.js.map +1 -0
  66. package/package.json +18 -1
@@ -0,0 +1,263 @@
1
+ import { AccountTransportAcquireError, InMemoryAccountTransportCoordinator, } from '../account-transports.js';
2
+ export class LocalAccountTransportService {
3
+ keyring;
4
+ providers;
5
+ configResolver;
6
+ static accountIndexKey = 'sentropic-llm-mesh:accounts:index';
7
+ coordinator;
8
+ accountsMap = new Map();
9
+ credentialVersions = new Map();
10
+ refreshInFlight = new Map();
11
+ constructor(keyring, providers, configResolver) {
12
+ this.keyring = keyring;
13
+ this.providers = providers;
14
+ this.configResolver = configResolver;
15
+ this.coordinator = new InMemoryAccountTransportCoordinator();
16
+ }
17
+ // ── Enrollment (called via facade by h2a CLI) ──────────────────────────
18
+ async enroll(providerId, input) {
19
+ const provider = this.providers.get(providerId);
20
+ if (!provider) {
21
+ throw new Error(`Enrollment provider '${providerId}' not registered`);
22
+ }
23
+ return provider.start(input);
24
+ }
25
+ async waitForCallback(enrollmentId) {
26
+ const provider = this.providers.get('cloud-code');
27
+ if (!provider?.waitForCallback) {
28
+ throw new Error("No enrollment provider with 'waitForCallback' registered");
29
+ }
30
+ const res = await provider.waitForCallback(enrollmentId);
31
+ if (res.credential) {
32
+ const now = new Date().toISOString();
33
+ const account = {
34
+ accountId: res.accountId,
35
+ accountLabel: res.label,
36
+ targetProviderId: 'google',
37
+ transportProviderId: 'cloud-code',
38
+ accessToken: res.credential.accessToken,
39
+ refreshToken: res.credential.refreshToken,
40
+ expiresAt: res.credential.expiresAt,
41
+ status: 'active',
42
+ metadata: res.metadata,
43
+ };
44
+ this.registerAccount(account, res.credential.authClientConfigVersion);
45
+ await this.persistCredential({
46
+ accountId: account.accountId,
47
+ accountLabel: res.label,
48
+ providerId: 'cloud-code',
49
+ status: 'active',
50
+ createdAt: now,
51
+ updatedAt: now,
52
+ }, {
53
+ accountId: account.accountId,
54
+ accessToken: res.credential.accessToken,
55
+ refreshToken: res.credential.refreshToken,
56
+ expiresAt: res.credential.expiresAt,
57
+ authClientConfigVersion: res.credential.authClientConfigVersion,
58
+ }, account);
59
+ }
60
+ return { accountId: res.accountId, label: res.label };
61
+ }
62
+ async pollForCompletion(enrollmentId) {
63
+ const provider = this.providers.get('codex');
64
+ if (!provider?.pollForCompletion) {
65
+ throw new Error("No enrollment provider with 'pollForCompletion' registered");
66
+ }
67
+ const res = await provider.pollForCompletion(enrollmentId);
68
+ if (res.credential) {
69
+ // P0-4: Persist credentials obtained via device flow poll into keyring/accounts
70
+ const account = {
71
+ accountId: res.accountId,
72
+ accountLabel: res.label,
73
+ targetProviderId: 'codex',
74
+ transportProviderId: 'codex',
75
+ accessToken: res.credential.accessToken,
76
+ refreshToken: res.credential.refreshToken,
77
+ expiresAt: res.credential.expiresAt,
78
+ status: 'active',
79
+ metadata: res.metadata,
80
+ };
81
+ this.registerAccount(account, res.credential.authClientConfigVersion);
82
+ const now = new Date().toISOString();
83
+ await this.persistCredential({
84
+ accountId: res.accountId,
85
+ accountLabel: res.label,
86
+ providerId: 'codex',
87
+ status: 'active',
88
+ createdAt: now,
89
+ updatedAt: now,
90
+ }, {
91
+ accountId: res.accountId,
92
+ accessToken: res.credential.accessToken,
93
+ refreshToken: res.credential.refreshToken,
94
+ expiresAt: res.credential.expiresAt,
95
+ authClientConfigVersion: res.credential.authClientConfigVersion,
96
+ }, account);
97
+ }
98
+ return { accountId: res.accountId, label: res.label };
99
+ }
100
+ async cancel(enrollmentId) {
101
+ for (const provider of this.providers.values()) {
102
+ if (provider.cancel) {
103
+ await provider.cancel(enrollmentId);
104
+ }
105
+ }
106
+ }
107
+ // ── Account Registration for Coordinator ──────────────────────────────
108
+ registerAccount(account, configVersion = 'v1.0.0') {
109
+ this.accountsMap.set(account.accountId, account);
110
+ this.credentialVersions.set(account.accountId, configVersion);
111
+ this.coordinator.addAccount(account);
112
+ }
113
+ // ── Runtime (called via facade by h2a gateway) ─────────────────────────
114
+ async acquire(input) {
115
+ await this.restorePersistedAccounts();
116
+ // Attempt coordinator acquisition
117
+ let acquisition;
118
+ try {
119
+ acquisition = await this.coordinator.acquire(input);
120
+ }
121
+ catch (err) {
122
+ if (err instanceof AccountTransportAcquireError) {
123
+ throw err;
124
+ }
125
+ throw new AccountTransportAcquireError(`Acquire failed for ${input.transportProviderId}`, 'no_active_account');
126
+ }
127
+ const account = this.accountsMap.get(acquisition.material.accountId ?? '');
128
+ const nowMs = typeof input.now === 'number' ? input.now : Date.now();
129
+ // Check if access token is expired
130
+ if (account && account.expiresAt) {
131
+ const expiresAtMs = new Date(account.expiresAt).getTime();
132
+ if (expiresAtMs <= nowMs) {
133
+ try {
134
+ const version = this.credentialVersions.get(account.accountId) ?? 'v1.0.0';
135
+ const refreshed = await this.refreshToken({
136
+ accountId: account.accountId,
137
+ refreshToken: account.refreshToken ?? undefined,
138
+ credentialVersion: version,
139
+ });
140
+ // Atomic persistence of updated credentials
141
+ account.accessToken = refreshed.accessToken;
142
+ if (refreshed.refreshToken) {
143
+ account.refreshToken = refreshed.refreshToken;
144
+ }
145
+ account.expiresAt = refreshed.expiresAt;
146
+ await this.persistCredential({
147
+ accountId: account.accountId,
148
+ accountLabel: account.accountLabel ?? undefined,
149
+ providerId: account.transportProviderId,
150
+ status: 'active',
151
+ createdAt: new Date().toISOString(),
152
+ updatedAt: new Date().toISOString(),
153
+ }, {
154
+ accountId: account.accountId,
155
+ accessToken: refreshed.accessToken,
156
+ refreshToken: account.refreshToken ?? undefined,
157
+ expiresAt: refreshed.expiresAt,
158
+ authClientConfigVersion: refreshed.authClientConfigVersion,
159
+ }, account);
160
+ // Update material with refreshed token
161
+ acquisition.material.accessToken = refreshed.accessToken;
162
+ if (refreshed.refreshToken) {
163
+ acquisition.material.refreshToken = refreshed.refreshToken;
164
+ }
165
+ acquisition.material.expiresAt = refreshed.expiresAt;
166
+ }
167
+ catch (refreshErr) {
168
+ await this.markReauthRequired(account.accountId);
169
+ throw new AccountTransportAcquireError(`Account ${account.accountId} token refresh failed: ${refreshErr instanceof Error ? refreshErr.message : String(refreshErr)}`, 'no_active_account');
170
+ }
171
+ }
172
+ }
173
+ return acquisition;
174
+ }
175
+ async release(_acquisition) {
176
+ // Q2B abort -> release reservation without recording an outcome / zero account impact
177
+ return;
178
+ }
179
+ // ── Internal — never exposed to h2a ───────────────────────────────────────
180
+ async completeEnrollment(_input) {
181
+ // Handled internally by EnrollmentProvider.complete()
182
+ }
183
+ async refreshToken(input) {
184
+ // P0-5: Single-flight refresh map to prevent parallel refresh races
185
+ if (this.refreshInFlight.has(input.accountId)) {
186
+ return this.refreshInFlight.get(input.accountId);
187
+ }
188
+ const refreshPromise = (async () => {
189
+ try {
190
+ const account = this.accountsMap.get(input.accountId);
191
+ const providerId = account?.transportProviderId ?? 'cloud-code';
192
+ const provider = this.providers.get(providerId);
193
+ if (!provider) {
194
+ throw new Error(`No provider registered for refresh: ${providerId}`);
195
+ }
196
+ return await provider.refresh(input);
197
+ }
198
+ finally {
199
+ this.refreshInFlight.delete(input.accountId);
200
+ }
201
+ })();
202
+ this.refreshInFlight.set(input.accountId, refreshPromise);
203
+ return refreshPromise;
204
+ }
205
+ async persistCredential(pub, env, account) {
206
+ const { accessToken: _accessToken, refreshToken: _refreshToken, expiresAt: _expiresAt, ...persistedAccount } = account;
207
+ const publicRecord = { ...pub, account: persistedAccount };
208
+ await this.keyring.setSecret(`sentropic-llm-mesh:${pub.accountId}:public`, JSON.stringify(publicRecord));
209
+ await this.keyring.setSecret(`sentropic-llm-mesh:${pub.accountId}:envelope`, JSON.stringify(env));
210
+ const rawIndex = await this.keyring.getSecret(LocalAccountTransportService.accountIndexKey);
211
+ const accountIds = this.parseAccountIndex(rawIndex);
212
+ if (!accountIds.includes(pub.accountId)) {
213
+ accountIds.push(pub.accountId);
214
+ await this.keyring.setSecret(LocalAccountTransportService.accountIndexKey, JSON.stringify(accountIds));
215
+ }
216
+ }
217
+ parseAccountIndex(raw) {
218
+ if (!raw)
219
+ return [];
220
+ try {
221
+ const parsed = JSON.parse(raw);
222
+ return Array.isArray(parsed)
223
+ ? parsed.filter((value) => typeof value === 'string')
224
+ : [];
225
+ }
226
+ catch {
227
+ return [];
228
+ }
229
+ }
230
+ async restorePersistedAccounts() {
231
+ const rawIndex = await this.keyring.getSecret(LocalAccountTransportService.accountIndexKey);
232
+ for (const accountId of this.parseAccountIndex(rawIndex)) {
233
+ if (this.accountsMap.has(accountId))
234
+ continue;
235
+ const publicRaw = await this.keyring.getSecret(`sentropic-llm-mesh:${accountId}:public`);
236
+ const envelopeRaw = await this.keyring.getSecret(`sentropic-llm-mesh:${accountId}:envelope`);
237
+ if (!publicRaw || !envelopeRaw)
238
+ continue;
239
+ try {
240
+ const publicRecord = JSON.parse(publicRaw);
241
+ const envelope = JSON.parse(envelopeRaw);
242
+ if (!publicRecord.account || envelope.accountId !== accountId)
243
+ continue;
244
+ this.registerAccount({
245
+ ...publicRecord.account,
246
+ accessToken: envelope.accessToken,
247
+ refreshToken: envelope.refreshToken,
248
+ expiresAt: envelope.expiresAt,
249
+ }, envelope.authClientConfigVersion);
250
+ }
251
+ catch {
252
+ // Ignore incomplete/corrupt entries; another active account may still be usable.
253
+ }
254
+ }
255
+ }
256
+ async markReauthRequired(accountId) {
257
+ const account = this.accountsMap.get(accountId);
258
+ if (account) {
259
+ account.status = 'reauth_required';
260
+ }
261
+ }
262
+ }
263
+ //# sourceMappingURL=local-account-transport-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-account-transport-service.js","sourceRoot":"","sources":["../../src/service/local-account-transport-service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,EAC5B,mCAAmC,GAIpC,MAAM,0BAA0B,CAAC;AAsBlC,MAAM,OAAO,4BAA4B;IAQpB;IACA;IACA;IATX,MAAM,CAAU,eAAe,GAAG,mCAAmC,CAAC;IAC7D,WAAW,CAAsC;IACjD,WAAW,GAAG,IAAI,GAAG,EAAmC,CAAC;IACzD,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,eAAe,GAAG,IAAI,GAAG,EAAuC,CAAC;IAElF,YACmB,OAAuB,EACvB,SAA0C,EAC1C,cAA8B;QAF9B,YAAO,GAAP,OAAO,CAAgB;QACvB,cAAS,GAAT,SAAS,CAAiC;QAC1C,mBAAc,GAAd,cAAc,CAAgB;QAE/C,IAAI,CAAC,WAAW,GAAG,IAAI,mCAAmC,EAAE,CAAC;IAC/D,CAAC;IAED,0EAA0E;IAC1E,KAAK,CAAC,MAAM,CAAC,UAAkB,EAAE,KAA2B;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,wBAAwB,UAAU,kBAAkB,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,YAAoB;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QACzD,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,OAAO,GAA4B;gBACvC,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,YAAY,EAAE,GAAG,CAAC,KAAK;gBACvB,gBAAgB,EAAE,QAAQ;gBAC1B,mBAAmB,EAAE,YAAY;gBACjC,WAAW,EAAE,GAAG,CAAC,UAAU,CAAC,WAAW;gBACvC,YAAY,EAAE,GAAG,CAAC,UAAU,CAAC,YAAY;gBACzC,SAAS,EAAE,GAAG,CAAC,UAAU,CAAC,SAAS;gBACnC,MAAM,EAAE,QAAQ;gBAChB,QAAQ,EAAE,GAAG,CAAC,QAAQ;aACvB,CAAC;YACF,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;YACtE,MAAM,IAAI,CAAC,iBAAiB,CAC1B;gBACE,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,YAAY,EAAE,GAAG,CAAC,KAAK;gBACvB,UAAU,EAAE,YAAY;gBACxB,MAAM,EAAE,QAAQ;gBAChB,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,GAAG;aACf,EACD;gBACE,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,WAAW,EAAE,GAAG,CAAC,UAAU,CAAC,WAAW;gBACvC,YAAY,EAAE,GAAG,CAAC,UAAU,CAAC,YAAY;gBACzC,SAAS,EAAE,GAAG,CAAC,UAAU,CAAC,SAAS;gBACnC,uBAAuB,EAAE,GAAG,CAAC,UAAU,CAAC,uBAAuB;aAChE,EACD,OAAO,CACR,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,YAAoB;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAC3D,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;YACnB,gFAAgF;YAChF,MAAM,OAAO,GAA4B;gBACvC,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,YAAY,EAAE,GAAG,CAAC,KAAK;gBACvB,gBAAgB,EAAE,OAAO;gBACzB,mBAAmB,EAAE,OAAO;gBAC5B,WAAW,EAAE,GAAG,CAAC,UAAU,CAAC,WAAW;gBACvC,YAAY,EAAE,GAAG,CAAC,UAAU,CAAC,YAAY;gBACzC,SAAS,EAAE,GAAG,CAAC,UAAU,CAAC,SAAS;gBACnC,MAAM,EAAE,QAAQ;gBAChB,QAAQ,EAAE,GAAG,CAAC,QAAQ;aACvB,CAAC;YACF,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;YACtE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,IAAI,CAAC,iBAAiB,CAC1B;gBACE,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,YAAY,EAAE,GAAG,CAAC,KAAK;gBACvB,UAAU,EAAE,OAAO;gBACnB,MAAM,EAAE,QAAQ;gBAChB,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,GAAG;aACf,EACD;gBACE,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,WAAW,EAAE,GAAG,CAAC,UAAU,CAAC,WAAW;gBACvC,YAAY,EAAE,GAAG,CAAC,UAAU,CAAC,YAAY;gBACzC,SAAS,EAAE,GAAG,CAAC,UAAU,CAAC,SAAS;gBACnC,uBAAuB,EAAE,GAAG,CAAC,UAAU,CAAC,uBAAuB;aAChE,EACD,OAAO,CACR,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,YAAoB;QAC/B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/C,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACpB,MAAM,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,eAAe,CAAC,OAAgC,EAAE,aAAa,GAAG,QAAQ;QACxE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAC9D,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,0EAA0E;IAC1E,KAAK,CAAC,OAAO,CAAC,KAAmC;QAC/C,MAAM,IAAI,CAAC,wBAAwB,EAAE,CAAC;QACtC,kCAAkC;QAClC,IAAI,WAAwC,CAAC;QAC7C,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,4BAA4B,EAAE,CAAC;gBAChD,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,MAAM,IAAI,4BAA4B,CACpC,sBAAsB,KAAK,CAAC,mBAAmB,EAAE,EACjD,mBAAmB,CACpB,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QAC3E,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAErE,mCAAmC;QACnC,IAAI,OAAO,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACjC,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;YAC1D,IAAI,WAAW,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC;oBAC3E,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC;wBACxC,SAAS,EAAE,OAAO,CAAC,SAAS;wBAC5B,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,SAAS;wBAC/C,iBAAiB,EAAE,OAAO;qBAC3B,CAAC,CAAC;oBAEH,4CAA4C;oBAC5C,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC;oBAC5C,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;wBAC3B,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC;oBAChD,CAAC;oBACD,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;oBAExC,MAAM,IAAI,CAAC,iBAAiB,CAC1B;wBACE,SAAS,EAAE,OAAO,CAAC,SAAS;wBAC5B,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,SAAS;wBAC/C,UAAU,EAAE,OAAO,CAAC,mBAAmB;wBACvC,MAAM,EAAE,QAAQ;wBAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;wBACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;qBACpC,EACD;wBACE,SAAS,EAAE,OAAO,CAAC,SAAS;wBAC5B,WAAW,EAAE,SAAS,CAAC,WAAW;wBAClC,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,SAAS;wBAC/C,SAAS,EAAE,SAAS,CAAC,SAAS;wBAC9B,uBAAuB,EAAE,SAAS,CAAC,uBAAuB;qBAC3D,EACD,OAAO,CACR,CAAC;oBAEF,uCAAuC;oBACvC,WAAW,CAAC,QAAQ,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC;oBACzD,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;wBAC3B,WAAW,CAAC,QAAQ,CAAC,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC;oBAC7D,CAAC;oBACD,WAAW,CAAC,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;gBACvD,CAAC;gBAAC,OAAO,UAAU,EAAE,CAAC;oBACpB,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBACjD,MAAM,IAAI,4BAA4B,CACpC,WAAW,OAAO,CAAC,SAAS,0BAA0B,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,EAC7H,mBAAmB,CACpB,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,YAAyC;QACrD,sFAAsF;QACtF,OAAO;IACT,CAAC;IAED,6EAA6E;IACrE,KAAK,CAAC,kBAAkB,CAAC,MAA+B;QAC9D,sDAAsD;IACxD,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,KAAmB;QAC5C,oEAAoE;QACpE,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAE,CAAC;QACpD,CAAC;QAED,MAAM,cAAc,GAAG,CAAC,KAAK,IAAI,EAAE;YACjC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBACtD,MAAM,UAAU,GAAG,OAAO,EAAE,mBAAmB,IAAI,YAAY,CAAC;gBAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAEhD,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,MAAM,IAAI,KAAK,CAAC,uCAAuC,UAAU,EAAE,CAAC,CAAC;gBACvE,CAAC;gBAED,OAAO,MAAM,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACvC,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QAEL,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAC1D,OAAO,cAAc,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC7B,GAAkB,EAClB,GAAuB,EACvB,OAAgC;QAEhC,MAAM,EACJ,WAAW,EAAE,YAAY,EACzB,YAAY,EAAE,aAAa,EAC3B,SAAS,EAAE,UAAU,EACrB,GAAG,gBAAgB,EACpB,GAAG,OAAO,CAAC;QACZ,MAAM,YAAY,GAAwB,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;QAChF,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAC1B,sBAAsB,GAAG,CAAC,SAAS,SAAS,EAC5C,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAC7B,CAAC;QACF,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,sBAAsB,GAAG,CAAC,SAAS,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAClG,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,4BAA4B,CAAC,eAAe,CAAC,CAAC;QAC5F,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACxC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC/B,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAC1B,4BAA4B,CAAC,eAAe,EAC5C,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAC3B,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,GAAkB;QAC1C,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;YAC1C,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC1B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;gBACtE,CAAC,CAAC,EAAE,CAAC;QACT,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,wBAAwB;QACpC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,4BAA4B,CAAC,eAAe,CAAC,CAAC;QAC5F,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzD,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,SAAS;YAC9C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,sBAAsB,SAAS,SAAS,CAAC,CAAC;YACzF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,sBAAsB,SAAS,WAAW,CAAC,CAAC;YAC7F,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW;gBAAE,SAAS;YACzC,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAiC,CAAC;gBAC3E,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAuB,CAAC;gBAC/D,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS;oBAAE,SAAS;gBACxE,IAAI,CAAC,eAAe,CAClB;oBACE,GAAG,YAAY,CAAC,OAAO;oBACvB,WAAW,EAAE,QAAQ,CAAC,WAAW;oBACjC,YAAY,EAAE,QAAQ,CAAC,YAAY;oBACnC,SAAS,EAAE,QAAQ,CAAC,SAAS;iBAC9B,EACD,QAAQ,CAAC,uBAAuB,CACjC,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,iFAAiF;YACnF,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,SAAiB;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,GAAG,iBAAiB,CAAC;QACrC,CAAC;IACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { AccountTransportAcquisition } from '../account-transports.js';
2
+ import type { ProviderAdapter, ProviderEvent, ProviderRequest } from '../service/facade.js';
3
+ export declare const CLOUD_CODE_STREAM_URL = "https://daily-cloudcode-pa.googleapis.com/v1internal:streamGenerateContent?alt=sse";
4
+ export declare const CLOUD_CODE_USER_AGENT = "antigravity/cli/1.1.10 (aidev_client; os_type=linux; arch=amd64; auth_method=consumer)";
5
+ export interface CloudCodeEnvelope {
6
+ project: string;
7
+ requestId: string;
8
+ model: string;
9
+ userAgent: string;
10
+ request: {
11
+ contents: unknown[];
12
+ generationConfig?: unknown;
13
+ };
14
+ }
15
+ export declare function buildCloudCodeRequest(acquisition: AccountTransportAcquisition, request: ProviderRequest): {
16
+ url: string;
17
+ headers: Record<string, string>;
18
+ body: CloudCodeEnvelope;
19
+ };
20
+ export declare function parseCloudCodeSSE(stream: ReadableStream<Uint8Array>): AsyncIterable<ProviderEvent>;
21
+ export declare class CloudCodeProviderAdapter implements ProviderAdapter {
22
+ private readonly fetchFn;
23
+ constructor(fetchFn?: typeof fetch);
24
+ execute(acquisition: AccountTransportAcquisition, request: ProviderRequest, signal: AbortSignal): AsyncIterable<ProviderEvent>;
25
+ }
26
+ //# sourceMappingURL=cloud-code-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-code-transport.d.ts","sourceRoot":"","sources":["../../src/transport/cloud-code-transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAE9B,eAAO,MAAM,qBAAqB,uFACoD,CAAC;AACvF,eAAO,MAAM,qBAAqB,2FACwD,CAAC;AAE3F,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QACP,QAAQ,EAAE,OAAO,EAAE,CAAC;QACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC5B,CAAC;CACH;AAED,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,2BAA2B,EACxC,OAAO,EAAE,eAAe,GACvB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,CAsC3E;AAED,wBAAuB,iBAAiB,CACtC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GACjC,aAAa,CAAC,aAAa,CAAC,CAmE9B;AAED,qBAAa,wBAAyB,YAAW,eAAe;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,GAAE,OAAO,KAAa;IAEnD,OAAO,CACZ,WAAW,EAAE,2BAA2B,EACxC,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,WAAW,GAClB,aAAa,CAAC,aAAa,CAAC;CA6HhC"}
@@ -0,0 +1,214 @@
1
+ import { randomUUID } from 'crypto';
2
+ export const CLOUD_CODE_STREAM_URL = 'https://daily-cloudcode-pa.googleapis.com/v1internal:streamGenerateContent?alt=sse';
3
+ export const CLOUD_CODE_USER_AGENT = 'antigravity/cli/1.1.10 (aidev_client; os_type=linux; arch=amd64; auth_method=consumer)';
4
+ export function buildCloudCodeRequest(acquisition, request) {
5
+ const project = acquisition.runtime.metadata?.cloudaicompanionProject ??
6
+ acquisition.material.metadata?.cloudaicompanionProject;
7
+ if (!project || typeof project !== 'string' || project.trim().length === 0) {
8
+ throw new Error('Cloud Code transport error: cloudaicompanionProject is required in acquisition runtime metadata');
9
+ }
10
+ // P1-2: Always generate a valid UUID v4 for envelope requestId
11
+ const requestId = randomUUID();
12
+ const headers = {
13
+ Authorization: `Bearer ${acquisition.material.accessToken}`,
14
+ 'User-Agent': CLOUD_CODE_USER_AGENT,
15
+ 'Content-Type': 'application/json',
16
+ Accept: 'text/event-stream',
17
+ ...(acquisition.runtime.headers ?? {}),
18
+ };
19
+ const body = {
20
+ project: project.trim(),
21
+ requestId,
22
+ model: request.modelId,
23
+ userAgent: 'antigravity',
24
+ request: {
25
+ contents: request.contents,
26
+ ...(request.generationConfig ? { generationConfig: request.generationConfig } : {}),
27
+ },
28
+ };
29
+ return {
30
+ url: CLOUD_CODE_STREAM_URL,
31
+ headers,
32
+ body,
33
+ };
34
+ }
35
+ export async function* parseCloudCodeSSE(stream) {
36
+ const reader = stream.getReader();
37
+ const decoder = new TextDecoder();
38
+ let buffer = '';
39
+ let lastUsage = null;
40
+ try {
41
+ while (true) {
42
+ const { done, value } = await reader.read();
43
+ if (done)
44
+ break;
45
+ buffer += decoder.decode(value, { stream: true });
46
+ const lines = buffer.split('\n');
47
+ buffer = lines.pop() ?? '';
48
+ for (const line of lines) {
49
+ const trimmed = line.trim();
50
+ if (!trimmed.startsWith('data:'))
51
+ continue;
52
+ const dataStr = trimmed.slice(5).trim();
53
+ if (!dataStr || dataStr === '[DONE]')
54
+ continue;
55
+ try {
56
+ const parsed = JSON.parse(dataStr);
57
+ const payload = parsed.response ?? parsed;
58
+ if (payload.error) {
59
+ yield {
60
+ kind: 'error',
61
+ code: String(payload.error.code ?? 'sse_error'),
62
+ message: payload.error.message ?? 'Cloud Code SSE stream error',
63
+ };
64
+ return;
65
+ }
66
+ const parts = payload.candidates?.[0]?.content?.parts;
67
+ if (parts) {
68
+ for (const part of parts) {
69
+ if (part.text) {
70
+ yield { kind: 'content', delta: part.text };
71
+ }
72
+ }
73
+ }
74
+ if (payload.usageMetadata) {
75
+ lastUsage = payload.usageMetadata;
76
+ }
77
+ }
78
+ catch {
79
+ // Ignore unparseable SSE data lines
80
+ }
81
+ }
82
+ }
83
+ // P1-1: Yield done event exactly once after stream completion
84
+ yield { kind: 'done', usage: lastUsage ?? {} };
85
+ }
86
+ finally {
87
+ reader.releaseLock();
88
+ }
89
+ }
90
+ export class CloudCodeProviderAdapter {
91
+ fetchFn;
92
+ constructor(fetchFn = fetch) {
93
+ this.fetchFn = fetchFn;
94
+ }
95
+ async *execute(acquisition, request, signal) {
96
+ if (signal.aborted) {
97
+ // Q2B: abort = 0 outcome, handle via release
98
+ return;
99
+ }
100
+ const { url, headers, body } = buildCloudCodeRequest(acquisition, request);
101
+ let response;
102
+ try {
103
+ response = await this.fetchFn(url, {
104
+ method: 'POST',
105
+ headers,
106
+ body: JSON.stringify(body),
107
+ signal,
108
+ });
109
+ }
110
+ catch (err) {
111
+ if (signal.aborted) {
112
+ // Abort -> no outcome recorded
113
+ return;
114
+ }
115
+ await acquisition.recordOutcome({
116
+ status: 'failed',
117
+ errorCode: 'network_error',
118
+ });
119
+ yield {
120
+ kind: 'error',
121
+ code: 'network_error',
122
+ message: err instanceof Error ? err.message : String(err),
123
+ };
124
+ return;
125
+ }
126
+ if (signal.aborted) {
127
+ return;
128
+ }
129
+ if (response.status === 401 || response.status === 403) {
130
+ await acquisition.recordOutcome({
131
+ status: 'auth_failed',
132
+ providerStatusCode: response.status,
133
+ });
134
+ yield {
135
+ kind: 'error',
136
+ code: 'auth_failed',
137
+ message: `Cloud Code authentication failed (${response.status})`,
138
+ };
139
+ return;
140
+ }
141
+ if (response.status === 429) {
142
+ const retryAfterHeader = response.headers.get('Retry-After');
143
+ let retryAfterMs;
144
+ if (retryAfterHeader) {
145
+ const parsedSeconds = Number.parseInt(retryAfterHeader, 10);
146
+ if (Number.isFinite(parsedSeconds) && parsedSeconds > 0) {
147
+ retryAfterMs = parsedSeconds * 1000;
148
+ }
149
+ }
150
+ await acquisition.recordOutcome({
151
+ status: 'rate_limited',
152
+ providerStatusCode: 429,
153
+ retryAfterMs,
154
+ });
155
+ yield {
156
+ kind: 'error',
157
+ code: 'rate_limited',
158
+ message: 'Cloud Code rate limit exceeded (429)',
159
+ };
160
+ return;
161
+ }
162
+ if (!response.ok) {
163
+ await acquisition.recordOutcome({
164
+ status: 'failed',
165
+ providerStatusCode: response.status,
166
+ });
167
+ yield {
168
+ kind: 'error',
169
+ code: 'http_error',
170
+ message: `Cloud Code HTTP error (${response.status})`,
171
+ };
172
+ return;
173
+ }
174
+ if (!response.body) {
175
+ await acquisition.recordOutcome({ status: 'failed', errorCode: 'no_body' });
176
+ yield { kind: 'error', code: 'no_body', message: 'No response body received' };
177
+ return;
178
+ }
179
+ let hasError = false;
180
+ // P0-6: Wrap SSE iteration in try-catch to guarantee recordOutcome on network/stream exception
181
+ try {
182
+ for await (const event of parseCloudCodeSSE(response.body)) {
183
+ if (signal.aborted) {
184
+ return;
185
+ }
186
+ if (event.kind === 'error') {
187
+ hasError = true;
188
+ }
189
+ yield event;
190
+ }
191
+ }
192
+ catch (streamErr) {
193
+ if (signal.aborted) {
194
+ return;
195
+ }
196
+ await acquisition.recordOutcome({
197
+ status: 'failed',
198
+ errorCode: 'stream_error',
199
+ });
200
+ yield {
201
+ kind: 'error',
202
+ code: 'stream_error',
203
+ message: streamErr instanceof Error ? streamErr.message : String(streamErr),
204
+ };
205
+ return;
206
+ }
207
+ if (!signal.aborted) {
208
+ await acquisition.recordOutcome({
209
+ status: hasError ? 'failed' : 'success',
210
+ });
211
+ }
212
+ }
213
+ }
214
+ //# sourceMappingURL=cloud-code-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-code-transport.js","sourceRoot":"","sources":["../../src/transport/cloud-code-transport.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentropic/llm-mesh",
3
- "version": "0.12.0",
3
+ "version": "0.13.2",
4
4
  "description": "Provider-agnostic LLM access runtime SDK for Sentropic.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -15,6 +15,22 @@
15
15
  ".": {
16
16
  "types": "./dist/index.d.ts",
17
17
  "import": "./dist/index.js"
18
+ },
19
+ "./facade": {
20
+ "types": "./dist/service/facade.d.ts",
21
+ "import": "./dist/service/facade.js"
22
+ },
23
+ "./enrollment": {
24
+ "types": "./dist/enrollment/index.d.ts",
25
+ "import": "./dist/enrollment/index.js"
26
+ },
27
+ "./node": {
28
+ "types": "./dist/node/index.d.ts",
29
+ "import": "./dist/node/index.js"
30
+ },
31
+ "./transport/cloud-code": {
32
+ "types": "./dist/transport/cloud-code-transport.d.ts",
33
+ "import": "./dist/transport/cloud-code-transport.js"
18
34
  }
19
35
  },
20
36
  "files": [
@@ -23,6 +39,7 @@
23
39
  "LICENSE"
24
40
  ],
25
41
  "publishConfig": {
42
+ "provenance": true,
26
43
  "access": "public"
27
44
  },
28
45
  "sideEffects": false,