@noodleseed/one 0.102.0 → 0.102.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 (136) hide show
  1. package/dist/commands/author-loop.d.ts.map +1 -1
  2. package/dist/commands/author-loop.js +4 -1
  3. package/dist/commands/author-loop.js.map +1 -1
  4. package/dist/commands/devtools.d.ts.map +1 -1
  5. package/dist/commands/devtools.js +3 -2
  6. package/dist/commands/devtools.js.map +1 -1
  7. package/dist/dev.d.ts +3 -0
  8. package/dist/dev.d.ts.map +1 -1
  9. package/dist/dev.js +57 -16
  10. package/dist/dev.js.map +1 -1
  11. package/dist/devtools-delegated-exchange-authority.d.ts +18 -0
  12. package/dist/devtools-delegated-exchange-authority.d.ts.map +1 -0
  13. package/dist/devtools-delegated-exchange-authority.js +288 -0
  14. package/dist/devtools-delegated-exchange-authority.js.map +1 -0
  15. package/dist/devtools-delegated-exchange-state.d.ts +22 -0
  16. package/dist/devtools-delegated-exchange-state.d.ts.map +1 -0
  17. package/dist/devtools-delegated-exchange-state.js +58 -0
  18. package/dist/devtools-delegated-exchange-state.js.map +1 -0
  19. package/dist/devtools-delegated-exchange-ui.d.ts +5 -0
  20. package/dist/devtools-delegated-exchange-ui.d.ts.map +1 -0
  21. package/dist/devtools-delegated-exchange-ui.js +123 -0
  22. package/dist/devtools-delegated-exchange-ui.js.map +1 -0
  23. package/dist/devtools-harness.d.ts +1 -0
  24. package/dist/devtools-harness.d.ts.map +1 -1
  25. package/dist/devtools-harness.js +8 -3
  26. package/dist/devtools-harness.js.map +1 -1
  27. package/dist/devtools-preview.d.ts +3 -0
  28. package/dist/devtools-preview.d.ts.map +1 -1
  29. package/dist/devtools-preview.js +65 -4
  30. package/dist/devtools-preview.js.map +1 -1
  31. package/dist/devtools-rpc-forwarder.d.ts.map +1 -1
  32. package/dist/devtools-rpc-forwarder.js +2 -1
  33. package/dist/devtools-rpc-forwarder.js.map +1 -1
  34. package/dist/index.d.ts +1 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/preview-session.d.ts.map +1 -1
  38. package/dist/preview-session.js +1 -0
  39. package/dist/preview-session.js.map +1 -1
  40. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +1 -1
  41. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js.map +1 -1
  42. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-auth-ref.d.ts.map +1 -1
  43. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-auth-ref.js +19 -2
  44. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-auth-ref.js.map +1 -1
  45. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  46. package/node_modules/@noodle-borg/auth/dist/jwt-issuer.d.ts +2 -0
  47. package/node_modules/@noodle-borg/auth/dist/jwt-issuer.d.ts.map +1 -1
  48. package/node_modules/@noodle-borg/auth/dist/jwt-issuer.js +3 -0
  49. package/node_modules/@noodle-borg/auth/dist/jwt-issuer.js.map +1 -1
  50. package/node_modules/@noodle-borg/auth/dist/verify.d.ts +4 -0
  51. package/node_modules/@noodle-borg/auth/dist/verify.d.ts.map +1 -1
  52. package/node_modules/@noodle-borg/auth/dist/verify.js +36 -0
  53. package/node_modules/@noodle-borg/auth/dist/verify.js.map +1 -1
  54. package/node_modules/@noodle-borg/connector-defs/dist/compile-http.js +1 -1
  55. package/node_modules/@noodle-borg/connector-defs/dist/compile-http.js.map +1 -1
  56. package/node_modules/@noodle-borg/service/dist/credential-broker-delegated-token-exchange.d.ts.map +1 -1
  57. package/node_modules/@noodle-borg/service/dist/credential-broker-delegated-token-exchange.js +99 -6
  58. package/node_modules/@noodle-borg/service/dist/credential-broker-delegated-token-exchange.js.map +1 -1
  59. package/node_modules/@noodle-borg/service/dist/credential-broker-options.d.ts +1 -1
  60. package/node_modules/@noodle-borg/service/dist/credential-broker-options.d.ts.map +1 -1
  61. package/node_modules/@noodle-borg/service/dist/credential-broker-options.js.map +1 -1
  62. package/node_modules/@noodle-borg/service/dist/customer-verifier-boundaries.d.ts +3 -1
  63. package/node_modules/@noodle-borg/service/dist/customer-verifier-boundaries.d.ts.map +1 -1
  64. package/node_modules/@noodle-borg/service/dist/customer-verifier-boundaries.js +23 -2
  65. package/node_modules/@noodle-borg/service/dist/customer-verifier-boundaries.js.map +1 -1
  66. package/node_modules/@noodle-borg/service/dist/customer-verifier.js +1 -0
  67. package/node_modules/@noodle-borg/service/dist/customer-verifier.js.map +1 -1
  68. package/node_modules/@noodle-borg/service/dist/delegated-token-exchange.d.ts +14 -0
  69. package/node_modules/@noodle-borg/service/dist/delegated-token-exchange.d.ts.map +1 -1
  70. package/node_modules/@noodle-borg/service/dist/delegated-token-exchange.js +106 -12
  71. package/node_modules/@noodle-borg/service/dist/delegated-token-exchange.js.map +1 -1
  72. package/node_modules/@noodle-borg/service/dist/index.d.ts +1 -0
  73. package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -1
  74. package/node_modules/@noodle-borg/service/dist/index.js +1 -0
  75. package/node_modules/@noodle-borg/service/dist/index.js.map +1 -1
  76. package/node_modules/@noodle-borg/service/dist/local-devtools-delegated-exchange.d.ts +21 -0
  77. package/node_modules/@noodle-borg/service/dist/local-devtools-delegated-exchange.d.ts.map +1 -0
  78. package/node_modules/@noodle-borg/service/dist/local-devtools-delegated-exchange.js +43 -0
  79. package/node_modules/@noodle-borg/service/dist/local-devtools-delegated-exchange.js.map +1 -0
  80. package/node_modules/@noodle-borg/service/dist/oauth/customer-bridge.d.ts +2 -0
  81. package/node_modules/@noodle-borg/service/dist/oauth/customer-bridge.d.ts.map +1 -1
  82. package/node_modules/@noodle-borg/service/dist/oauth/customer-bridge.js +15 -3
  83. package/node_modules/@noodle-borg/service/dist/oauth/customer-bridge.js.map +1 -1
  84. package/node_modules/@noodle-borg/service/dist/oauth/device-provider.d.ts.map +1 -1
  85. package/node_modules/@noodle-borg/service/dist/oauth/device-provider.js +2 -0
  86. package/node_modules/@noodle-borg/service/dist/oauth/device-provider.js.map +1 -1
  87. package/node_modules/@noodle-borg/service/dist/oauth/device-store-postgres-schema.d.ts.map +1 -1
  88. package/node_modules/@noodle-borg/service/dist/oauth/device-store-postgres-schema.js +2 -0
  89. package/node_modules/@noodle-borg/service/dist/oauth/device-store-postgres-schema.js.map +1 -1
  90. package/node_modules/@noodle-borg/service/dist/oauth/device-store-postgres-types.d.ts +1 -0
  91. package/node_modules/@noodle-borg/service/dist/oauth/device-store-postgres-types.d.ts.map +1 -1
  92. package/node_modules/@noodle-borg/service/dist/oauth/device-store-postgres-types.js +1 -0
  93. package/node_modules/@noodle-borg/service/dist/oauth/device-store-postgres-types.js.map +1 -1
  94. package/node_modules/@noodle-borg/service/dist/oauth/device-store.d.ts +2 -0
  95. package/node_modules/@noodle-borg/service/dist/oauth/device-store.d.ts.map +1 -1
  96. package/node_modules/@noodle-borg/service/dist/oauth/provider.d.ts.map +1 -1
  97. package/node_modules/@noodle-borg/service/dist/oauth/provider.js +9 -1
  98. package/node_modules/@noodle-borg/service/dist/oauth/provider.js.map +1 -1
  99. package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.d.ts +2 -0
  100. package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.d.ts.map +1 -1
  101. package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.js +11 -6
  102. package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.js.map +1 -1
  103. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres-schema.d.ts.map +1 -1
  104. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres-schema.js +4 -0
  105. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres-schema.js.map +1 -1
  106. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres.d.ts.map +1 -1
  107. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres.js +18 -11
  108. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres.js.map +1 -1
  109. package/node_modules/@noodle-borg/service/dist/oauth/store.d.ts +3 -0
  110. package/node_modules/@noodle-borg/service/dist/oauth/store.d.ts.map +1 -1
  111. package/node_modules/@noodle-borg/service/dist/oauth/store.js +2 -0
  112. package/node_modules/@noodle-borg/service/dist/oauth/store.js.map +1 -1
  113. package/node_modules/@noodle-borg/service/dist/oauth/token-issuer.d.ts +1 -0
  114. package/node_modules/@noodle-borg/service/dist/oauth/token-issuer.d.ts.map +1 -1
  115. package/node_modules/@noodle-borg/service/dist/oauth/token-issuer.js +4 -0
  116. package/node_modules/@noodle-borg/service/dist/oauth/token-issuer.js.map +1 -1
  117. package/node_modules/@noodle-borg/service/dist/registry-compile.d.ts +41 -0
  118. package/node_modules/@noodle-borg/service/dist/registry-compile.d.ts.map +1 -0
  119. package/node_modules/@noodle-borg/service/dist/registry-compile.js +116 -0
  120. package/node_modules/@noodle-borg/service/dist/registry-compile.js.map +1 -0
  121. package/node_modules/@noodle-borg/service/dist/registry-types.d.ts +3 -0
  122. package/node_modules/@noodle-borg/service/dist/registry-types.d.ts.map +1 -1
  123. package/node_modules/@noodle-borg/service/dist/registry.d.ts +2 -2
  124. package/node_modules/@noodle-borg/service/dist/registry.d.ts.map +1 -1
  125. package/node_modules/@noodle-borg/service/dist/registry.js +25 -98
  126. package/node_modules/@noodle-borg/service/dist/registry.js.map +1 -1
  127. package/node_modules/@noodle-borg/service/dist/serve-options.d.ts +3 -0
  128. package/node_modules/@noodle-borg/service/dist/serve-options.d.ts.map +1 -1
  129. package/node_modules/@noodle-borg/service/dist/serve-resource-auth.d.ts +2 -0
  130. package/node_modules/@noodle-borg/service/dist/serve-resource-auth.d.ts.map +1 -1
  131. package/node_modules/@noodle-borg/service/dist/serve-resource-auth.js +14 -0
  132. package/node_modules/@noodle-borg/service/dist/serve-resource-auth.js.map +1 -1
  133. package/node_modules/@noodle-borg/service/dist/serve.d.ts.map +1 -1
  134. package/node_modules/@noodle-borg/service/dist/serve.js +8 -10
  135. package/node_modules/@noodle-borg/service/dist/serve.js.map +1 -1
  136. package/package.json +1 -1
@@ -0,0 +1,288 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { constants } from 'node:fs';
3
+ import { link, mkdir, open, rename, unlink } from 'node:fs/promises';
4
+ import { dirname, join } from 'node:path';
5
+ import { createStaticSigningKeyProvider } from '@noodle-borg/auth';
6
+ import { exportPKCS8, generateKeyPair } from 'jose';
7
+ const KEY_FILE_NAME = 'delegated-exchange-signing-key.pem';
8
+ const TRUST_STATE_FILE_NAME = 'delegated-exchange-last-issuer';
9
+ const MAX_KEY_BYTES = 16 * 1024;
10
+ const MAX_TRUST_STATE_BYTES = 512;
11
+ const WINNER_FINALIZATION_ATTEMPTS = 20;
12
+ const WINNER_FINALIZATION_RETRY_MS = 5;
13
+ const PRIVATE_JWK_MEMBERS = ['d', 'p', 'q', 'dp', 'dq', 'qi', 'oth'];
14
+ export class LocalDevtoolsDelegatedExchangeAuthorityError extends Error {
15
+ code;
16
+ path;
17
+ constructor(path, kind = 'key') {
18
+ super(`Local delegated-exchange ${kind} is unsafe or unreadable. Stop Devtools, secure or remove ${JSON.stringify(path)}, then start again and update development endpoint trust.`);
19
+ this.name = 'LocalDevtoolsDelegatedExchangeAuthorityError';
20
+ this.code =
21
+ kind === 'key'
22
+ ? 'local_delegated_exchange_key_invalid'
23
+ : 'local_delegated_exchange_trust_state_invalid';
24
+ this.path = path;
25
+ }
26
+ }
27
+ class TransientWinnerFinalizationError extends Error {
28
+ }
29
+ export function createLocalDevtoolsDelegatedExchangeAuthority(projectRoot) {
30
+ const directory = join(projectRoot, '.noodle', 'devtools');
31
+ const keyPath = join(directory, KEY_FILE_NAME);
32
+ const trustStatePath = join(directory, TRUST_STATE_FILE_NAME);
33
+ let resolution;
34
+ let trust;
35
+ return {
36
+ resolve() {
37
+ resolution ??= resolveAuthority(directory, keyPath, trustStatePath)
38
+ .then(({ authority, trustDocument }) => {
39
+ trust = trustDocument;
40
+ return authority;
41
+ })
42
+ .catch((error) => {
43
+ throw toSafeError(keyPath, error);
44
+ });
45
+ return resolution;
46
+ },
47
+ trustDocument() {
48
+ return trust;
49
+ },
50
+ };
51
+ }
52
+ async function resolveAuthority(directory, keyPath, trustStatePath) {
53
+ await ensureOwnerOnlyDirectory(directory);
54
+ let previousIssuer;
55
+ try {
56
+ previousIssuer = await readPreviousIssuer(trustStatePath);
57
+ }
58
+ catch (error) {
59
+ throw toSafeTrustStateError(trustStatePath, error);
60
+ }
61
+ let privateKeyPem;
62
+ try {
63
+ privateKeyPem = await loadExistingKeyWithTransientRetry(keyPath);
64
+ }
65
+ catch (error) {
66
+ if (!isErrno(error, 'ENOENT')) {
67
+ throw error;
68
+ }
69
+ privateKeyPem = await createOrLoadWinningKey(directory, keyPath);
70
+ }
71
+ const resolved = await buildResolvedAuthority(privateKeyPem);
72
+ const trustChanged = previousIssuer !== undefined && previousIssuer !== resolved.trustDocument.issuer;
73
+ await persistCurrentIssuer(directory, trustStatePath, resolved.trustDocument.issuer);
74
+ return {
75
+ authority: resolved.authority,
76
+ trustDocument: Object.freeze({ ...resolved.trustDocument, trustChanged }),
77
+ };
78
+ }
79
+ async function readPreviousIssuer(trustStatePath) {
80
+ let handle;
81
+ try {
82
+ handle = await open(trustStatePath, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
83
+ const metadata = await handle.stat();
84
+ if (!metadata.isFile() ||
85
+ (metadata.mode & 0o077) !== 0 ||
86
+ metadata.size === 0 ||
87
+ metadata.size > MAX_TRUST_STATE_BYTES ||
88
+ metadata.nlink !== 1) {
89
+ throw new Error('unsafe trust state file');
90
+ }
91
+ const issuer = await handle.readFile('utf8');
92
+ if (!/^urn:noodleseed:devtools:[A-Za-z0-9_-]{1,256}$/u.test(issuer)) {
93
+ throw new Error('invalid trust state');
94
+ }
95
+ return issuer;
96
+ }
97
+ catch (error) {
98
+ if (isErrno(error, 'ENOENT'))
99
+ return undefined;
100
+ throw error;
101
+ }
102
+ finally {
103
+ await handle?.close();
104
+ }
105
+ }
106
+ async function persistCurrentIssuer(directory, trustStatePath, issuer) {
107
+ const temporaryPath = join(directory, `.${TRUST_STATE_FILE_NAME}.${process.pid}.${randomUUID()}.tmp`);
108
+ let handle;
109
+ let temporaryExists = false;
110
+ try {
111
+ handle = await open(temporaryPath, 'wx', 0o600);
112
+ temporaryExists = true;
113
+ await handle.writeFile(issuer, 'utf8');
114
+ await handle.sync();
115
+ await handle.close();
116
+ handle = undefined;
117
+ await rename(temporaryPath, trustStatePath);
118
+ temporaryExists = false;
119
+ }
120
+ finally {
121
+ await handle?.close();
122
+ if (temporaryExists) {
123
+ try {
124
+ await unlink(temporaryPath);
125
+ }
126
+ catch {
127
+ // The outer operation already fails closed; do not replace it with raw cleanup diagnostics.
128
+ }
129
+ }
130
+ }
131
+ }
132
+ async function ensureOwnerOnlyDirectory(directory) {
133
+ await ensureDirectoryWithoutFollowingSymlink(dirname(directory), false);
134
+ await ensureDirectoryWithoutFollowingSymlink(directory, true);
135
+ }
136
+ async function ensureDirectoryWithoutFollowingSymlink(directory, requireOwnerOnly) {
137
+ try {
138
+ await mkdir(directory, { mode: 0o700 });
139
+ }
140
+ catch (error) {
141
+ if (!isErrno(error, 'EEXIST')) {
142
+ throw error;
143
+ }
144
+ }
145
+ let handle;
146
+ try {
147
+ handle = await open(directory, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_DIRECTORY);
148
+ const metadata = await handle.stat();
149
+ if (!metadata.isDirectory() || (requireOwnerOnly && (metadata.mode & 0o077) !== 0)) {
150
+ throw new Error('unsafe directory');
151
+ }
152
+ }
153
+ finally {
154
+ await handle?.close();
155
+ }
156
+ }
157
+ async function loadExistingKeyWithTransientRetry(keyPath) {
158
+ for (let attempt = 0; attempt < WINNER_FINALIZATION_ATTEMPTS; attempt += 1) {
159
+ try {
160
+ return await readSecureKeyFile(keyPath);
161
+ }
162
+ catch (error) {
163
+ if (!(error instanceof TransientWinnerFinalizationError)) {
164
+ throw error;
165
+ }
166
+ if (attempt === WINNER_FINALIZATION_ATTEMPTS - 1) {
167
+ throw error;
168
+ }
169
+ await delay(WINNER_FINALIZATION_RETRY_MS);
170
+ }
171
+ }
172
+ throw new TransientWinnerFinalizationError();
173
+ }
174
+ async function readSecureKeyFile(keyPath) {
175
+ let handle;
176
+ try {
177
+ handle = await open(keyPath, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
178
+ const metadata = await handle.stat();
179
+ if (!metadata.isFile() ||
180
+ (metadata.mode & 0o077) !== 0 ||
181
+ metadata.size > MAX_KEY_BYTES ||
182
+ metadata.nlink < 1) {
183
+ throw new Error('unsafe key file');
184
+ }
185
+ if (metadata.nlink > 1) {
186
+ throw new TransientWinnerFinalizationError();
187
+ }
188
+ return await handle.readFile('utf8');
189
+ }
190
+ finally {
191
+ await handle?.close();
192
+ }
193
+ }
194
+ async function createOrLoadWinningKey(directory, keyPath) {
195
+ const pair = await generateKeyPair('RS256', { extractable: true });
196
+ const privateKeyPem = await exportPKCS8(pair.privateKey);
197
+ const temporaryPath = join(directory, `.${KEY_FILE_NAME}.${process.pid}.${randomUUID()}.tmp`);
198
+ let handle;
199
+ let temporaryExists = false;
200
+ try {
201
+ handle = await open(temporaryPath, 'wx', 0o600);
202
+ temporaryExists = true;
203
+ await handle.writeFile(privateKeyPem, 'utf8');
204
+ await handle.sync();
205
+ await handle.close();
206
+ handle = undefined;
207
+ try {
208
+ await link(temporaryPath, keyPath);
209
+ }
210
+ catch (error) {
211
+ if (!isErrno(error, 'EEXIST')) {
212
+ throw error;
213
+ }
214
+ await unlink(temporaryPath);
215
+ temporaryExists = false;
216
+ return await loadExistingKeyWithTransientRetry(keyPath);
217
+ }
218
+ await unlink(temporaryPath);
219
+ temporaryExists = false;
220
+ return privateKeyPem;
221
+ }
222
+ finally {
223
+ await handle?.close();
224
+ if (temporaryExists) {
225
+ try {
226
+ await unlink(temporaryPath);
227
+ }
228
+ catch {
229
+ // The outer operation already fails closed; do not replace it with raw cleanup diagnostics.
230
+ }
231
+ }
232
+ }
233
+ }
234
+ async function buildResolvedAuthority(privateKeyPem) {
235
+ const signer = await createStaticSigningKeyProvider({ privateKeyPem });
236
+ const published = await signer.publicJwks();
237
+ const sourceKey = published.keys[0];
238
+ if (published.keys.length !== 1 || !isSafePublicSigningKey(sourceKey)) {
239
+ throw new Error('unsafe public signing key');
240
+ }
241
+ const publicKey = Object.freeze({
242
+ kty: sourceKey.kty,
243
+ n: sourceKey.n,
244
+ e: sourceKey.e,
245
+ kid: sourceKey.kid,
246
+ alg: 'RS256',
247
+ use: 'sig',
248
+ });
249
+ const keys = Object.freeze([publicKey]);
250
+ const jwks = Object.freeze({ keys });
251
+ const issuer = `urn:noodleseed:devtools:${sourceKey.kid}`;
252
+ const trustDocument = Object.freeze({ issuer, jwks, trustChanged: false });
253
+ return {
254
+ authority: { issuer, signer },
255
+ trustDocument,
256
+ };
257
+ }
258
+ function isSafePublicSigningKey(key) {
259
+ if (key?.kty !== 'RSA' ||
260
+ typeof key.n !== 'string' ||
261
+ typeof key.e !== 'string' ||
262
+ typeof key.kid !== 'string' ||
263
+ key.kid.length === 0 ||
264
+ key.alg !== 'RS256' ||
265
+ key.use !== 'sig') {
266
+ return false;
267
+ }
268
+ return PRIVATE_JWK_MEMBERS.every((member) => !(member in key));
269
+ }
270
+ function isErrno(error, code) {
271
+ return error?.code === code;
272
+ }
273
+ function toSafeError(keyPath, error) {
274
+ if (error instanceof LocalDevtoolsDelegatedExchangeAuthorityError) {
275
+ return error;
276
+ }
277
+ return new LocalDevtoolsDelegatedExchangeAuthorityError(keyPath);
278
+ }
279
+ function toSafeTrustStateError(trustStatePath, error) {
280
+ if (error instanceof LocalDevtoolsDelegatedExchangeAuthorityError) {
281
+ return error;
282
+ }
283
+ return new LocalDevtoolsDelegatedExchangeAuthorityError(trustStatePath, 'trust state');
284
+ }
285
+ function delay(milliseconds) {
286
+ return new Promise((resolve) => setTimeout(resolve, milliseconds));
287
+ }
288
+ //# sourceMappingURL=devtools-delegated-exchange-authority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-delegated-exchange-authority.js","sourceRoot":"","sources":["../src/devtools-delegated-exchange-authority.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { LocalDevtoolsDelegatedExchangeBindingProjection, LocalDevtoolsDelegatedExchangeSuccess } from '@noodle-borg/service';
2
+ import type { JSONWebKeySet } from 'jose';
3
+ import type { LocalDevtoolsDelegatedExchangeTrustDocument } from './devtools-delegated-exchange-authority.js';
4
+ export interface DevtoolsDelegatedExchangeStatus {
5
+ readonly issuer: string;
6
+ readonly jwks: JSONWebKeySet;
7
+ readonly trustChanged: boolean;
8
+ readonly bindings: readonly {
9
+ readonly bindingKey: string;
10
+ readonly connectorId: string;
11
+ readonly operation?: string;
12
+ readonly verified: boolean;
13
+ }[];
14
+ }
15
+ interface DevtoolsDelegatedExchangeState {
16
+ snapshot(): DevtoolsDelegatedExchangeStatus | undefined;
17
+ replace(trust: LocalDevtoolsDelegatedExchangeTrustDocument | undefined, projections: readonly LocalDevtoolsDelegatedExchangeBindingProjection[]): void;
18
+ markVerified(event: LocalDevtoolsDelegatedExchangeSuccess): void;
19
+ }
20
+ export declare function createDevtoolsDelegatedExchangeState(): DevtoolsDelegatedExchangeState;
21
+ export {};
22
+ //# sourceMappingURL=devtools-delegated-exchange-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-delegated-exchange-state.d.ts","sourceRoot":"","sources":["../src/devtools-delegated-exchange-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,+CAA+C,EAC/C,qCAAqC,EACtC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,2CAA2C,EAAE,MAAM,4CAA4C,CAAC;AAE9G,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,SAAS;QAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;KAC5B,EAAE,CAAC;CACL;AAED,UAAU,8BAA8B;IACtC,QAAQ,IAAI,+BAA+B,GAAG,SAAS,CAAC;IACxD,OAAO,CACL,KAAK,EAAE,2CAA2C,GAAG,SAAS,EAC9D,WAAW,EAAE,SAAS,+CAA+C,EAAE,GACtE,IAAI,CAAC;IACR,YAAY,CAAC,KAAK,EAAE,qCAAqC,GAAG,IAAI,CAAC;CAClE;AAED,wBAAgB,oCAAoC,IAAI,8BAA8B,CAkDrF"}
@@ -0,0 +1,58 @@
1
+ export function createDevtoolsDelegatedExchangeState() {
2
+ let current;
3
+ return {
4
+ snapshot() {
5
+ return current === undefined ? undefined : cloneAndFreeze(current);
6
+ },
7
+ replace(trust, projections) {
8
+ if (projections.length === 0) {
9
+ current = undefined;
10
+ return;
11
+ }
12
+ if (trust === undefined) {
13
+ throw new Error('delegated-exchange projections require a resolved trust document');
14
+ }
15
+ const previous = current;
16
+ const sameIssuer = previous?.issuer === trust.issuer;
17
+ const verified = new Set();
18
+ if (sameIssuer && previous !== undefined) {
19
+ for (const binding of previous.bindings) {
20
+ if (binding.verified)
21
+ verified.add(binding.bindingKey);
22
+ }
23
+ }
24
+ current = cloneAndFreeze({
25
+ issuer: trust.issuer,
26
+ jwks: trust.jwks,
27
+ trustChanged: trust.trustChanged || (previous !== undefined && !sameIssuer),
28
+ bindings: projections.map((projection) => ({
29
+ bindingKey: projection.bindingKey,
30
+ connectorId: projection.connectorId,
31
+ ...(projection.operation === undefined ? {} : { operation: projection.operation }),
32
+ verified: verified.has(projection.bindingKey),
33
+ })),
34
+ });
35
+ },
36
+ markVerified(event) {
37
+ if (current === undefined ||
38
+ !current.bindings.some((binding) => binding.bindingKey === event.bindingKey)) {
39
+ return;
40
+ }
41
+ current = cloneAndFreeze({
42
+ ...current,
43
+ bindings: current.bindings.map((binding) => binding.bindingKey === event.bindingKey ? { ...binding, verified: true } : binding),
44
+ });
45
+ },
46
+ };
47
+ }
48
+ function cloneAndFreeze(value) {
49
+ return deepFreeze(structuredClone(value));
50
+ }
51
+ function deepFreeze(value) {
52
+ if (typeof value !== 'object' || value === null)
53
+ return value;
54
+ for (const child of Object.values(value))
55
+ deepFreeze(child);
56
+ return Object.freeze(value);
57
+ }
58
+ //# sourceMappingURL=devtools-delegated-exchange-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-delegated-exchange-state.js","sourceRoot":"","sources":["../src/devtools-delegated-exchange-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Browser-only projection of local delegated-exchange trust and per-binding test progress. */
2
+ export declare const DEVTOOLS_DELEGATED_EXCHANGE_STYLES = "\n.local-delegated-exchange{\n position:relative;\n z-index:21;\n flex:none;\n margin:0 14px 8px;\n overflow:hidden;\n border:1px solid var(--nd-border);\n border-radius:16px;\n background:rgba(255,255,255,.025);\n}\n.local-delegated-exchange summary{\n display:flex;\n min-height:42px;\n align-items:center;\n justify-content:space-between;\n gap:12px;\n padding:10px 12px;\n cursor:pointer;\n list-style:none;\n}\n.local-delegated-exchange summary::-webkit-details-marker{display:none}\n.local-delegated-exchange__title{display:flex;min-width:0;align-items:center;gap:9px}\n.local-delegated-exchange__title strong{font-size:11.5px;font-weight:640}\n.local-delegated-exchange__summary{color:var(--nd-faint);font-size:10px}\n.local-delegated-exchange__chevron{color:var(--nd-faint);font-size:10px;transition:transform .18s ease}\n.local-delegated-exchange[open] .local-delegated-exchange__chevron{transform:rotate(90deg)}\n.local-delegated-exchange__body{\n display:grid;\n grid-template-columns:minmax(0,1fr) minmax(0,1.2fr);\n gap:12px;\n padding:2px 12px 12px;\n border-top:1px solid var(--nd-border);\n}\n.local-delegated-exchange__trust,.local-delegated-exchange__bindings{\n display:flex;\n min-width:0;\n flex-direction:column;\n gap:8px;\n padding-top:11px;\n}\n.local-delegated-exchange__label{\n color:var(--nd-faint);\n font-size:9px;\n font-weight:650;\n letter-spacing:.09em;\n text-transform:uppercase;\n}\n.local-delegated-exchange pre{\n max-height:150px;\n margin:0;\n padding:9px;\n overflow:auto;\n border-radius:10px;\n background:rgba(0,0,0,.5);\n color:#d4d4d8;\n font:10px/1.55 var(--nd-mono);\n white-space:pre-wrap;\n word-break:break-all;\n}\n.local-delegated-exchange__warning,\n.local-delegated-exchange__clarification,\n.local-delegated-exchange__rotation{\n margin:0;\n color:var(--nd-muted);\n font-size:10px;\n line-height:1.5;\n}\n.local-delegated-exchange__warning,.local-delegated-exchange__rotation{color:var(--nd-warning)}\n.local-delegated-exchange__rotation[hidden]{display:none}\n.local-delegated-exchange__copy{align-self:flex-start}\n.local-delegated-exchange__binding{\n display:grid;\n grid-template-columns:minmax(0,1fr) auto;\n gap:5px 10px;\n padding:8px 9px;\n border-radius:10px;\n background:rgba(0,0,0,.28);\n}\n.local-delegated-exchange__binding-name{overflow:hidden;color:#e4e4e7;font:10.5px var(--nd-mono);text-overflow:ellipsis;white-space:nowrap}\n.local-delegated-exchange__binding-key{grid-column:1/-1;overflow:hidden;color:var(--nd-faint);font:9px var(--nd-mono);text-overflow:ellipsis;white-space:nowrap}\n.local-delegated-exchange__state{font-size:9.5px;font-weight:620;white-space:nowrap}\n.local-delegated-exchange__state--required{color:var(--nd-warning)}\n.local-delegated-exchange__state--ready{color:#fdba74}\n.local-delegated-exchange__state--verified{color:var(--nd-success)}\n@media (max-width:760px){\n .local-delegated-exchange__body{grid-template-columns:1fr}\n}\n@media (prefers-reduced-motion:reduce){\n .local-delegated-exchange__chevron{transition:none}\n}\n";
3
+ export declare const DEVTOOLS_DELEGATED_EXCHANGE_HTML: string;
4
+ export declare const DEVTOOLS_DELEGATED_EXCHANGE_CLIENT_JS: string;
5
+ //# sourceMappingURL=devtools-delegated-exchange-ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-delegated-exchange-ui.d.ts","sourceRoot":"","sources":["../src/devtools-delegated-exchange-ui.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,eAAO,MAAM,kCAAkC,qhGA2F9C,CAAC;AAEF,eAAO,MAAM,gCAAgC,QAkBf,CAAC;AAG/B,eAAO,MAAM,qCAAqC,QAStC,CAAC"}
@@ -0,0 +1,123 @@
1
+ /** Browser-only projection of local delegated-exchange trust and per-binding test progress. */
2
+ export const DEVTOOLS_DELEGATED_EXCHANGE_STYLES = `
3
+ .local-delegated-exchange{
4
+ position:relative;
5
+ z-index:21;
6
+ flex:none;
7
+ margin:0 14px 8px;
8
+ overflow:hidden;
9
+ border:1px solid var(--nd-border);
10
+ border-radius:16px;
11
+ background:rgba(255,255,255,.025);
12
+ }
13
+ .local-delegated-exchange summary{
14
+ display:flex;
15
+ min-height:42px;
16
+ align-items:center;
17
+ justify-content:space-between;
18
+ gap:12px;
19
+ padding:10px 12px;
20
+ cursor:pointer;
21
+ list-style:none;
22
+ }
23
+ .local-delegated-exchange summary::-webkit-details-marker{display:none}
24
+ .local-delegated-exchange__title{display:flex;min-width:0;align-items:center;gap:9px}
25
+ .local-delegated-exchange__title strong{font-size:11.5px;font-weight:640}
26
+ .local-delegated-exchange__summary{color:var(--nd-faint);font-size:10px}
27
+ .local-delegated-exchange__chevron{color:var(--nd-faint);font-size:10px;transition:transform .18s ease}
28
+ .local-delegated-exchange[open] .local-delegated-exchange__chevron{transform:rotate(90deg)}
29
+ .local-delegated-exchange__body{
30
+ display:grid;
31
+ grid-template-columns:minmax(0,1fr) minmax(0,1.2fr);
32
+ gap:12px;
33
+ padding:2px 12px 12px;
34
+ border-top:1px solid var(--nd-border);
35
+ }
36
+ .local-delegated-exchange__trust,.local-delegated-exchange__bindings{
37
+ display:flex;
38
+ min-width:0;
39
+ flex-direction:column;
40
+ gap:8px;
41
+ padding-top:11px;
42
+ }
43
+ .local-delegated-exchange__label{
44
+ color:var(--nd-faint);
45
+ font-size:9px;
46
+ font-weight:650;
47
+ letter-spacing:.09em;
48
+ text-transform:uppercase;
49
+ }
50
+ .local-delegated-exchange pre{
51
+ max-height:150px;
52
+ margin:0;
53
+ padding:9px;
54
+ overflow:auto;
55
+ border-radius:10px;
56
+ background:rgba(0,0,0,.5);
57
+ color:#d4d4d8;
58
+ font:10px/1.55 var(--nd-mono);
59
+ white-space:pre-wrap;
60
+ word-break:break-all;
61
+ }
62
+ .local-delegated-exchange__warning,
63
+ .local-delegated-exchange__clarification,
64
+ .local-delegated-exchange__rotation{
65
+ margin:0;
66
+ color:var(--nd-muted);
67
+ font-size:10px;
68
+ line-height:1.5;
69
+ }
70
+ .local-delegated-exchange__warning,.local-delegated-exchange__rotation{color:var(--nd-warning)}
71
+ .local-delegated-exchange__rotation[hidden]{display:none}
72
+ .local-delegated-exchange__copy{align-self:flex-start}
73
+ .local-delegated-exchange__binding{
74
+ display:grid;
75
+ grid-template-columns:minmax(0,1fr) auto;
76
+ gap:5px 10px;
77
+ padding:8px 9px;
78
+ border-radius:10px;
79
+ background:rgba(0,0,0,.28);
80
+ }
81
+ .local-delegated-exchange__binding-name{overflow:hidden;color:#e4e4e7;font:10.5px var(--nd-mono);text-overflow:ellipsis;white-space:nowrap}
82
+ .local-delegated-exchange__binding-key{grid-column:1/-1;overflow:hidden;color:var(--nd-faint);font:9px var(--nd-mono);text-overflow:ellipsis;white-space:nowrap}
83
+ .local-delegated-exchange__state{font-size:9.5px;font-weight:620;white-space:nowrap}
84
+ .local-delegated-exchange__state--required{color:var(--nd-warning)}
85
+ .local-delegated-exchange__state--ready{color:#fdba74}
86
+ .local-delegated-exchange__state--verified{color:var(--nd-success)}
87
+ @media (max-width:760px){
88
+ .local-delegated-exchange__body{grid-template-columns:1fr}
89
+ }
90
+ @media (prefers-reduced-motion:reduce){
91
+ .local-delegated-exchange__chevron{transition:none}
92
+ }
93
+ `;
94
+ export const DEVTOOLS_DELEGATED_EXCHANGE_HTML = '<details id="local-delegated-exchange" class="local-delegated-exchange">' +
95
+ '<summary><span class="local-delegated-exchange__title"><span class="status-dot" aria-hidden="true"></span>' +
96
+ '<strong>Local delegated exchange</strong><span id="local-delegated-exchange-summary" class="local-delegated-exchange__summary" aria-live="polite" aria-atomic="true">Loading status…</span></span>' +
97
+ '<span class="local-delegated-exchange__chevron" aria-hidden="true">▸</span></summary>' +
98
+ '<div class="local-delegated-exchange__body">' +
99
+ '<section class="local-delegated-exchange__trust" aria-label="Development trust">' +
100
+ '<p class="local-delegated-exchange__warning"><strong>Development only.</strong> Never trust this issuer in production.</p>' +
101
+ '<p class="local-delegated-exchange__clarification">Your OIDC IdP needs no additional signing-key change.</p>' +
102
+ '<p id="local-delegated-exchange-rotation" class="local-delegated-exchange__rotation" hidden>Issuer or key changed. Update development endpoint trust before testing again.</p>' +
103
+ '<span class="local-delegated-exchange__label">Issuer</span><pre id="local-delegated-exchange-issuer"></pre>' +
104
+ '<span class="local-delegated-exchange__label">Public JWKS</span><pre id="local-delegated-exchange-jwks"></pre>' +
105
+ '<button id="local-delegated-exchange-copy" class="copy-action local-delegated-exchange__copy" type="button" disabled>' +
106
+ '<span class="copy-action__label">Copy trust JSON</span></button>' +
107
+ '</section>' +
108
+ '<section class="local-delegated-exchange__bindings" aria-label="Delegated bindings">' +
109
+ '<span class="local-delegated-exchange__label">Bindings</span>' +
110
+ '<div id="local-delegated-exchange-bindings" aria-live="polite" aria-atomic="true"></div>' +
111
+ '</section></div></details>';
112
+ // Plain browser script. It receives only the safe projection from the capability-protected parent route.
113
+ export const DEVTOOLS_DELEGATED_EXCHANGE_CLIENT_JS = [
114
+ 'var localDelegatedExchangeSummary=document.getElementById("local-delegated-exchange-summary"); var localDelegatedExchangeIssuer=document.getElementById("local-delegated-exchange-issuer"); var localDelegatedExchangeJwks=document.getElementById("local-delegated-exchange-jwks"); var localDelegatedExchangeBindings=document.getElementById("local-delegated-exchange-bindings"); var localDelegatedExchangeRotation=document.getElementById("local-delegated-exchange-rotation"); var localDelegatedExchangeCopy=document.getElementById("local-delegated-exchange-copy");',
115
+ 'var localDelegatedExchangeStatus=null; var localDelegatedExchangeTrustJson=""; var localDelegatedExchangeFingerprint="";',
116
+ 'function localDelegatedExchangeState(status,binding){ if(!status.customerSignedIn)return {label:"Customer sign-in required",kind:"required"}; if(status.trustChanged||!binding.verified)return {label:"Local assertion ready",kind:"ready"}; return {label:"Exchange verified",kind:"verified"}; }',
117
+ 'function paintLocalDelegatedExchangeStatus(status){ var fingerprint=JSON.stringify([status.issuer,status.jwks,status.customerSignedIn,status.trustChanged,status.bindings]); if(fingerprint===localDelegatedExchangeFingerprint)return; localDelegatedExchangeFingerprint=fingerprint; localDelegatedExchangeStatus=status; localDelegatedExchangeTrustJson=JSON.stringify({issuer:localDelegatedExchangeStatus.issuer,jwks:localDelegatedExchangeStatus.jwks},null,2); localDelegatedExchangeIssuer.textContent=status.issuer; localDelegatedExchangeJwks.textContent=JSON.stringify(status.jwks,null,2); localDelegatedExchangeRotation.hidden=!status.trustChanged; localDelegatedExchangeCopy.disabled=false; while(localDelegatedExchangeBindings.firstChild)localDelegatedExchangeBindings.removeChild(localDelegatedExchangeBindings.firstChild); var verified=0; status.bindings.forEach(function(binding){ var state=localDelegatedExchangeState(status,binding); if(state.kind==="verified")verified+=1; var row=document.createElement("div"); row.className="local-delegated-exchange__binding"; var name=document.createElement("span"); name.className="local-delegated-exchange__binding-name"; name.textContent=binding.connectorId+(binding.operation?" · "+binding.operation:""); var stateView=document.createElement("span"); stateView.className="local-delegated-exchange__state local-delegated-exchange__state--"+state.kind; stateView.textContent=state.label; var key=document.createElement("span"); key.className="local-delegated-exchange__binding-key"; key.textContent=binding.bindingKey; row.appendChild(name); row.appendChild(stateView); row.appendChild(key); localDelegatedExchangeBindings.appendChild(row); }); localDelegatedExchangeSummary.textContent=status.customerSignedIn?verified+" of "+status.bindings.length+" verified":"Customer sign-in required"; }',
118
+ 'function refreshLocalDelegatedExchangeStatus(){ return fetch("/delegated-exchange/status",{headers:{"x-noodle-devtools-capability":RPC_CAPABILITY}}).then(function(r){if(!r.ok)throw new Error("status unavailable");return r.json();}).then(paintLocalDelegatedExchangeStatus).catch(function(){}); }',
119
+ 'localDelegatedExchangeCopy.addEventListener("click",function(){ if(localDelegatedExchangeStatus)copyText(localDelegatedExchangeTrustJson,localDelegatedExchangeCopy,"trust JSON"); });',
120
+ 'refreshLocalDelegatedExchangeStatus();',
121
+ 'setInterval(refreshLocalDelegatedExchangeStatus,2000);',
122
+ ].join('\n');
123
+ //# sourceMappingURL=devtools-delegated-exchange-ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-delegated-exchange-ui.js","sourceRoot":"","sources":["../src/devtools-delegated-exchange-ui.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,MAAM,CAAC,MAAM,kCAAkC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2FjD,CAAC;AAEF,MAAM,CAAC,MAAM,gCAAgC,GAC3C,0EAA0E;IAC1E,4GAA4G;IAC5G,oMAAoM;IACpM,uFAAuF;IACvF,8CAA8C;IAC9C,kFAAkF;IAClF,4HAA4H;IAC5H,8GAA8G;IAC9G,gLAAgL;IAChL,6GAA6G;IAC7G,gHAAgH;IAChH,uHAAuH;IACvH,kEAAkE;IAClE,YAAY;IACZ,sFAAsF;IACtF,+DAA+D;IAC/D,0FAA0F;IAC1F,4BAA4B,CAAC;AAE/B,yGAAyG;AACzG,MAAM,CAAC,MAAM,qCAAqC,GAAG;IACnD,ijBAAijB;IACjjB,0HAA0H;IAC1H,oSAAoS;IACpS,+yDAA+yD;IAC/yD,wSAAwS;IACxS,wLAAwL;IACxL,wCAAwC;IACxC,wDAAwD;CACzD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC"}
@@ -30,5 +30,6 @@ export declare function harnessHtml(options: {
30
30
  readonly rpcCapability?: string;
31
31
  readonly secureWidgets?: boolean;
32
32
  readonly authRequired?: boolean;
33
+ readonly localDelegatedExchangeRequired?: boolean;
33
34
  }): string;
34
35
  //# sourceMappingURL=devtools-harness.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"devtools-harness.d.ts","sourceRoot":"","sources":["../src/devtools-harness.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAmBH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AACrD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE1D,8FAA8F;AAC9F,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGtF;AAgBD,wGAAwG;AACxG,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAClC,yGAAyG;IACzG,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC,GAAG,MAAM,CA+CT;AAUD,+GAA+G;AAC/G,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAcvE;AAMD,oCAAoC;AACpC,wBAAgB,WAAW,CAAC,OAAO,EAAE;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC,GAAG,MAAM,CAgIT"}
1
+ {"version":3,"file":"devtools-harness.d.ts","sourceRoot":"","sources":["../src/devtools-harness.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAwBH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AACrD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE1D,8FAA8F;AAC9F,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGtF;AAgBD,wGAAwG;AACxG,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAClC,yGAAyG;IACzG,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC,GAAG,MAAM,CA+CT;AAUD,+GAA+G;AAC/G,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAcvE;AAMD,oCAAoC;AACpC,wBAAgB,WAAW,CAAC,OAAO,EAAE;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,8BAA8B,CAAC,EAAE,OAAO,CAAC;CACnD,GAAG,MAAM,CAuIT"}
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import { DEVTOOLS_AUTH_CLIENT_JS, DEVTOOLS_AUTH_GATE_HTML, DEVTOOLS_AUTH_SESSION_HTML, DEVTOOLS_AUTH_STYLES, } from './devtools-auth-ui.js';
10
10
  import { DEVTOOLS_FAVICON_DATA_URI, DEVTOOLS_SHADER_SCRIPT, DEVTOOLS_WORDMARK, } from './devtools-brand.js';
11
+ import { DEVTOOLS_DELEGATED_EXCHANGE_CLIENT_JS, DEVTOOLS_DELEGATED_EXCHANGE_HTML, DEVTOOLS_DELEGATED_EXCHANGE_STYLES, } from './devtools-delegated-exchange-ui.js';
11
12
  import { DEVTOOLS_DESIGN_CLIENT_JS, DEVTOOLS_DESIGN_HTML } from './devtools-design.js';
12
13
  import { DEVTOOLS_JSON_CLIENT_JS, DEVTOOLS_JSON_STYLES } from './devtools-json.js';
13
14
  import { CLAUDE_MARK, GEMINI_MARK, OPENAI_MARK } from './devtools-provider-logos.js';
@@ -111,7 +112,8 @@ export function harnessHtml(options) {
111
112
  const client = HARNESS_CLIENT_JS.replace('__INITIAL_THEME__', options.theme === 'dark' ? 'dark' : 'light')
112
113
  .replace('__INITIAL_DEVICE__', options.device === 'mobile' ? 'mobile' : 'desktop')
113
114
  .replace('__RPC_CAPABILITY__', jsonForScript(options.rpcCapability ?? ''))
114
- .replace('__SECURE_WIDGETS__', options.secureWidgets ? 'true' : 'false');
115
+ .replace('__SECURE_WIDGETS__', options.secureWidgets ? 'true' : 'false')
116
+ .replace('__LOCAL_DELEGATED_EXCHANGE_REQUIRED__', options.localDelegatedExchangeRequired ? 'true' : 'false');
115
117
  const designAttributes = options.secureWidgets
116
118
  ? ' disabled aria-disabled="true" title="Design mode is unavailable for authenticated previews"'
117
119
  : '';
@@ -124,6 +126,7 @@ export function harnessHtml(options) {
124
126
  DEVTOOLS_STYLES +
125
127
  DEVTOOLS_JSON_STYLES +
126
128
  (options.authRequired ? DEVTOOLS_AUTH_STYLES : '') +
129
+ (options.localDelegatedExchangeRequired ? DEVTOOLS_DELEGATED_EXCHANGE_STYLES : '') +
127
130
  `</style></head><body${bodyClass}>` +
128
131
  '<canvas id="ns-canvas" aria-hidden="true"></canvas>' +
129
132
  '<div class="ambient-fallback" aria-hidden="true"></div>' +
@@ -150,6 +153,7 @@ export function harnessHtml(options) {
150
153
  (options.authRequired ? DEVTOOLS_AUTH_SESSION_HTML : '') +
151
154
  '<button id="toggle-activity" class="rail-toggle rail-toggle--activity" type="button" aria-label="Open MCP calls" aria-controls="log" aria-expanded="false">' +
152
155
  '<span class="status-dot" aria-hidden="true"></span><span>Activity</span></button></header>' +
156
+ (options.localDelegatedExchangeRequired ? DEVTOOLS_DELEGATED_EXCHANGE_HTML : '') +
153
157
  (options.authRequired ? DEVTOOLS_AUTH_GATE_HTML : '') +
154
158
  '<div id="preview-view">' +
155
159
  '<div id="controls" class="controls">' +
@@ -226,6 +230,7 @@ export function harnessHtml(options) {
226
230
  DEVTOOLS_DESIGN_CLIENT_JS +
227
231
  '\n' +
228
232
  client +
233
+ (options.localDelegatedExchangeRequired ? `\n${DEVTOOLS_DELEGATED_EXCHANGE_CLIENT_JS}` : '') +
229
234
  (options.authRequired ? `\n${DEVTOOLS_AUTH_CLIENT_JS}` : '') +
230
235
  '</script><script>' +
231
236
  DEVTOOLS_SHADER_SCRIPT +
@@ -236,7 +241,7 @@ const HARNESS_CLIENT_JS = [
236
241
  calculateRangeProgress.toString(),
237
242
  isAutoSafeTool.toString(),
238
243
  parseWidgetToolCallMessage.toString(),
239
- 'var RPC_CAPABILITY=__RPC_CAPABILITY__; var SECURE_WIDGETS=__SECURE_WIDGETS__;',
244
+ 'var RPC_CAPABILITY=__RPC_CAPABILITY__; var SECURE_WIDGETS=__SECURE_WIDGETS__; var LOCAL_DELEGATED_EXCHANGE_REQUIRED=__LOCAL_DELEGATED_EXCHANGE_REQUIRED__;',
240
245
  'var frame=document.getElementById("frame");',
241
246
  'var empty=document.getElementById("empty");',
242
247
  'var themeToggle=document.getElementById("theme-toggle");',
@@ -301,7 +306,7 @@ const HARNESS_CLIENT_JS = [
301
306
  'function section(label,value){ var w=document.createElement("div"); var h=document.createElement("div"); h.className="log__label"; h.textContent=label; var pre=document.createElement("pre"); renderJson(pre,value); w.appendChild(h); w.appendChild(pre); return w; }',
302
307
  'function addLog(e){ var ol=document.getElementById("log-list"); var li=document.createElement("li"); li.className="log log--"+(e.status==="error"?"error":"ok"); var has=(e.request!==undefined||e.response!==undefined); var head=document.createElement(has?"button":"div"); if(has){ head.type="button"; head.setAttribute("aria-expanded","false"); } head.className="log__head"; var chev=document.createElement("span"); chev.className="chev"; chev.textContent=has?"▸":""; var m=document.createElement("span"); m.className="m "+e.status; m.textContent=e.method; var n=document.createElement("span"); n.className="log__sum"; n.textContent=(e.name?e.name+" ":"")+e.summary; var d=document.createElement("span"); d.className="d"; d.textContent=e.durationMs+"ms"; head.appendChild(chev); head.appendChild(m); head.appendChild(n); head.appendChild(d); var detail=document.createElement("div"); detail.className="log__detail"; if(has){ head.addEventListener("click", function(){ var open=li.classList.toggle("open"); head.setAttribute("aria-expanded",open?"true":"false"); chev.textContent=open?"▾":"▸"; if(open&&!detail.dataset.built){ if(e.request!==undefined) detail.appendChild(section("input",e.request)); if(e.response!==undefined) detail.appendChild(section("output",e.response)); detail.dataset.built="1"; } }); } li.appendChild(head); li.appendChild(detail); ol.insertBefore(li, ol.firstChild); }',
303
308
  'try{ var es=new EventSource("/rpc/log"); es.onmessage=function(ev){ try{ addLog(JSON.parse(ev.data)); }catch(e){} }; }catch(e){}',
304
- 'try{ var rs=new EventSource("/reload"); rs.onmessage=function(ev){ if(ev.data==="hard"){window.location.reload();return;} refreshTools(); if(current) loadWidget(current, currentArgs, currentResourceUri); }; }catch(e){}',
309
+ 'try{ var rs=new EventSource("/reload"); rs.onmessage=function(ev){ if(ev.data==="hard"||LOCAL_DELEGATED_EXCHANGE_REQUIRED){window.location.reload();return;} refreshTools(); if(current) loadWidget(current, currentArgs, currentResourceUri); }; }catch(e){}',
305
310
  // Preview | Chat | Design mode toggle.
306
311
  'var previewView=document.getElementById("preview-view"); var chatView=document.getElementById("chat-view"); var designView=document.getElementById("design-view");',
307
312
  'var modePreview=document.getElementById("mode-preview"); var modeChat=document.getElementById("mode-chat"); var modeDesign=document.getElementById("mode-design");',