@portel/photon 1.22.1 → 1.23.1

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 (214) hide show
  1. package/README.md +19 -8
  2. package/dist/a2ui/mapper.d.ts +40 -0
  3. package/dist/a2ui/mapper.d.ts.map +1 -0
  4. package/dist/a2ui/mapper.js +286 -0
  5. package/dist/a2ui/mapper.js.map +1 -0
  6. package/dist/a2ui/types.d.ts +129 -0
  7. package/dist/a2ui/types.d.ts.map +1 -0
  8. package/dist/a2ui/types.js +20 -0
  9. package/dist/a2ui/types.js.map +1 -0
  10. package/dist/ag-ui/adapter.d.ts +9 -1
  11. package/dist/ag-ui/adapter.d.ts.map +1 -1
  12. package/dist/ag-ui/adapter.js +33 -16
  13. package/dist/ag-ui/adapter.js.map +1 -1
  14. package/dist/auto-ui/beam/routes/api-daemon.d.ts +18 -0
  15. package/dist/auto-ui/beam/routes/api-daemon.d.ts.map +1 -0
  16. package/dist/auto-ui/beam/routes/api-daemon.js +118 -0
  17. package/dist/auto-ui/beam/routes/api-daemon.js.map +1 -0
  18. package/dist/auto-ui/beam.d.ts.map +1 -1
  19. package/dist/auto-ui/beam.js +34 -34
  20. package/dist/auto-ui/beam.js.map +1 -1
  21. package/dist/auto-ui/bridge/renderers.d.ts.map +1 -1
  22. package/dist/auto-ui/bridge/renderers.js +371 -0
  23. package/dist/auto-ui/bridge/renderers.js.map +1 -1
  24. package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -1
  25. package/dist/auto-ui/streamable-http-transport.js +38 -1
  26. package/dist/auto-ui/streamable-http-transport.js.map +1 -1
  27. package/dist/auto-ui/types.d.ts +19 -0
  28. package/dist/auto-ui/types.d.ts.map +1 -1
  29. package/dist/auto-ui/types.js.map +1 -1
  30. package/dist/beam.bundle.js +757 -107
  31. package/dist/beam.bundle.js.map +4 -4
  32. package/dist/cli/commands/beam.d.ts.map +1 -1
  33. package/dist/cli/commands/beam.js +2 -0
  34. package/dist/cli/commands/beam.js.map +1 -1
  35. package/dist/cli/commands/build.d.ts.map +1 -1
  36. package/dist/cli/commands/build.js +2 -0
  37. package/dist/cli/commands/build.js.map +1 -1
  38. package/dist/cli/commands/doctor.d.ts.map +1 -1
  39. package/dist/cli/commands/doctor.js +92 -3
  40. package/dist/cli/commands/doctor.js.map +1 -1
  41. package/dist/cli/commands/host.d.ts.map +1 -1
  42. package/dist/cli/commands/host.js +9 -1
  43. package/dist/cli/commands/host.js.map +1 -1
  44. package/dist/cli/commands/info.d.ts.map +1 -1
  45. package/dist/cli/commands/info.js +7 -3
  46. package/dist/cli/commands/info.js.map +1 -1
  47. package/dist/cli/commands/init.d.ts.map +1 -1
  48. package/dist/cli/commands/init.js +4 -0
  49. package/dist/cli/commands/init.js.map +1 -1
  50. package/dist/cli/commands/maker.d.ts +8 -0
  51. package/dist/cli/commands/maker.d.ts.map +1 -1
  52. package/dist/cli/commands/maker.js +113 -46
  53. package/dist/cli/commands/maker.js.map +1 -1
  54. package/dist/cli/commands/marketplace.d.ts.map +1 -1
  55. package/dist/cli/commands/marketplace.js +7 -1
  56. package/dist/cli/commands/marketplace.js.map +1 -1
  57. package/dist/cli/commands/mcp.d.ts +10 -0
  58. package/dist/cli/commands/mcp.d.ts.map +1 -1
  59. package/dist/cli/commands/mcp.js +215 -4
  60. package/dist/cli/commands/mcp.js.map +1 -1
  61. package/dist/cli/commands/package.d.ts.map +1 -1
  62. package/dist/cli/commands/package.js +33 -15
  63. package/dist/cli/commands/package.js.map +1 -1
  64. package/dist/cli/commands/ps.d.ts +16 -0
  65. package/dist/cli/commands/ps.d.ts.map +1 -0
  66. package/dist/cli/commands/ps.js +267 -0
  67. package/dist/cli/commands/ps.js.map +1 -0
  68. package/dist/cli/commands/run.d.ts.map +1 -1
  69. package/dist/cli/commands/run.js +7 -0
  70. package/dist/cli/commands/run.js.map +1 -1
  71. package/dist/cli/commands/update.d.ts.map +1 -1
  72. package/dist/cli/commands/update.js +14 -4
  73. package/dist/cli/commands/update.js.map +1 -1
  74. package/dist/cli/index.d.ts.map +1 -1
  75. package/dist/cli/index.js +9 -4
  76. package/dist/cli/index.js.map +1 -1
  77. package/dist/context-store.d.ts +4 -4
  78. package/dist/context-store.d.ts.map +1 -1
  79. package/dist/context-store.js +20 -17
  80. package/dist/context-store.js.map +1 -1
  81. package/dist/context.d.ts +5 -4
  82. package/dist/context.d.ts.map +1 -1
  83. package/dist/context.js +68 -14
  84. package/dist/context.js.map +1 -1
  85. package/dist/daemon/client.d.ts +60 -0
  86. package/dist/daemon/client.d.ts.map +1 -1
  87. package/dist/daemon/client.js +76 -0
  88. package/dist/daemon/client.js.map +1 -1
  89. package/dist/daemon/execution-history-sqlite.d.ts +50 -0
  90. package/dist/daemon/execution-history-sqlite.d.ts.map +1 -0
  91. package/dist/daemon/execution-history-sqlite.js +165 -0
  92. package/dist/daemon/execution-history-sqlite.js.map +1 -0
  93. package/dist/daemon/execution-history.d.ts +78 -0
  94. package/dist/daemon/execution-history.d.ts.map +1 -0
  95. package/dist/daemon/execution-history.js +246 -0
  96. package/dist/daemon/execution-history.js.map +1 -0
  97. package/dist/daemon/hot-reload-state.d.ts +27 -0
  98. package/dist/daemon/hot-reload-state.d.ts.map +1 -0
  99. package/dist/daemon/hot-reload-state.js +48 -0
  100. package/dist/daemon/hot-reload-state.js.map +1 -0
  101. package/dist/daemon/protocol.d.ts +5 -1
  102. package/dist/daemon/protocol.d.ts.map +1 -1
  103. package/dist/daemon/protocol.js +13 -0
  104. package/dist/daemon/protocol.js.map +1 -1
  105. package/dist/daemon/registry-keys.d.ts +88 -0
  106. package/dist/daemon/registry-keys.d.ts.map +1 -0
  107. package/dist/daemon/registry-keys.js +91 -0
  108. package/dist/daemon/registry-keys.js.map +1 -0
  109. package/dist/daemon/server.js +1521 -186
  110. package/dist/daemon/server.js.map +1 -1
  111. package/dist/daemon/session-resolver.d.ts +28 -0
  112. package/dist/daemon/session-resolver.d.ts.map +1 -0
  113. package/dist/daemon/session-resolver.js +41 -0
  114. package/dist/daemon/session-resolver.js.map +1 -0
  115. package/dist/data-migration.js +20 -9
  116. package/dist/data-migration.js.map +1 -1
  117. package/dist/loader.d.ts +22 -8
  118. package/dist/loader.d.ts.map +1 -1
  119. package/dist/loader.js +214 -94
  120. package/dist/loader.js.map +1 -1
  121. package/dist/marketplace-manager.d.ts.map +1 -1
  122. package/dist/marketplace-manager.js +9 -5
  123. package/dist/marketplace-manager.js.map +1 -1
  124. package/dist/namespace-migration.d.ts.map +1 -1
  125. package/dist/namespace-migration.js +28 -23
  126. package/dist/namespace-migration.js.map +1 -1
  127. package/dist/photon-cli-runner.d.ts.map +1 -1
  128. package/dist/photon-cli-runner.js +57 -8
  129. package/dist/photon-cli-runner.js.map +1 -1
  130. package/dist/serv/auth/auth-store.d.ts +155 -0
  131. package/dist/serv/auth/auth-store.d.ts.map +1 -0
  132. package/dist/serv/auth/auth-store.js +240 -0
  133. package/dist/serv/auth/auth-store.js.map +1 -0
  134. package/dist/serv/auth/endpoints.d.ts +113 -0
  135. package/dist/serv/auth/endpoints.d.ts.map +1 -0
  136. package/dist/serv/auth/endpoints.js +1005 -0
  137. package/dist/serv/auth/endpoints.js.map +1 -0
  138. package/dist/serv/auth/http-adapter.d.ts +60 -0
  139. package/dist/serv/auth/http-adapter.d.ts.map +1 -0
  140. package/dist/serv/auth/http-adapter.js +235 -0
  141. package/dist/serv/auth/http-adapter.js.map +1 -0
  142. package/dist/serv/auth/jwt.d.ts +92 -6
  143. package/dist/serv/auth/jwt.d.ts.map +1 -1
  144. package/dist/serv/auth/jwt.js +226 -24
  145. package/dist/serv/auth/jwt.js.map +1 -1
  146. package/dist/serv/auth/oauth-sqlite-stores.d.ts +48 -0
  147. package/dist/serv/auth/oauth-sqlite-stores.d.ts.map +1 -0
  148. package/dist/serv/auth/oauth-sqlite-stores.js +212 -0
  149. package/dist/serv/auth/oauth-sqlite-stores.js.map +1 -0
  150. package/dist/serv/auth/sqlite-stores.d.ts +85 -0
  151. package/dist/serv/auth/sqlite-stores.d.ts.map +1 -0
  152. package/dist/serv/auth/sqlite-stores.js +446 -0
  153. package/dist/serv/auth/sqlite-stores.js.map +1 -0
  154. package/dist/serv/auth/well-known.d.ts +54 -1
  155. package/dist/serv/auth/well-known.d.ts.map +1 -1
  156. package/dist/serv/auth/well-known.js +166 -17
  157. package/dist/serv/auth/well-known.js.map +1 -1
  158. package/dist/serv/index.d.ts +45 -2
  159. package/dist/serv/index.d.ts.map +1 -1
  160. package/dist/serv/index.js +65 -1
  161. package/dist/serv/index.js.map +1 -1
  162. package/dist/serv/types/index.d.ts +80 -0
  163. package/dist/serv/types/index.d.ts.map +1 -1
  164. package/dist/serv/types/index.js.map +1 -1
  165. package/dist/server.d.ts.map +1 -1
  166. package/dist/server.js +61 -6
  167. package/dist/server.js.map +1 -1
  168. package/dist/shared/announce-context.d.ts +51 -0
  169. package/dist/shared/announce-context.d.ts.map +1 -0
  170. package/dist/shared/announce-context.js +73 -0
  171. package/dist/shared/announce-context.js.map +1 -0
  172. package/dist/shared/audit-sqlite.d.ts +63 -0
  173. package/dist/shared/audit-sqlite.d.ts.map +1 -0
  174. package/dist/shared/audit-sqlite.js +187 -0
  175. package/dist/shared/audit-sqlite.js.map +1 -0
  176. package/dist/shared/audit.d.ts +25 -3
  177. package/dist/shared/audit.d.ts.map +1 -1
  178. package/dist/shared/audit.js +97 -3
  179. package/dist/shared/audit.js.map +1 -1
  180. package/dist/shared/error-handler.d.ts +10 -1
  181. package/dist/shared/error-handler.d.ts.map +1 -1
  182. package/dist/shared/error-handler.js +17 -2
  183. package/dist/shared/error-handler.js.map +1 -1
  184. package/dist/shared/security.d.ts +12 -0
  185. package/dist/shared/security.d.ts.map +1 -1
  186. package/dist/shared/security.js +80 -0
  187. package/dist/shared/security.js.map +1 -1
  188. package/dist/shared/sqlite-runtime.d.ts +46 -0
  189. package/dist/shared/sqlite-runtime.d.ts.map +1 -0
  190. package/dist/shared/sqlite-runtime.js +120 -0
  191. package/dist/shared/sqlite-runtime.js.map +1 -0
  192. package/dist/tasks/store.d.ts +1 -1
  193. package/dist/tasks/store.d.ts.map +1 -1
  194. package/dist/tasks/store.js +29 -15
  195. package/dist/tasks/store.js.map +1 -1
  196. package/dist/telemetry/metrics.d.ts +26 -0
  197. package/dist/telemetry/metrics.d.ts.map +1 -1
  198. package/dist/telemetry/metrics.js +31 -0
  199. package/dist/telemetry/metrics.js.map +1 -1
  200. package/dist/test-runner.d.ts.map +1 -1
  201. package/dist/test-runner.js +3 -3
  202. package/dist/test-runner.js.map +1 -1
  203. package/dist/tsx-compiler.d.ts.map +1 -1
  204. package/dist/tsx-compiler.js +18 -1
  205. package/dist/tsx-compiler.js.map +1 -1
  206. package/dist/version-checker.d.ts.map +1 -1
  207. package/dist/version-checker.js +7 -14
  208. package/dist/version-checker.js.map +1 -1
  209. package/dist/version.d.ts +12 -0
  210. package/dist/version.d.ts.map +1 -1
  211. package/dist/version.js +103 -1
  212. package/dist/version.js.map +1 -1
  213. package/package.json +10 -2
  214. package/templates/photon.template.ts +7 -13
@@ -4,22 +4,103 @@
4
4
  * Handles JWT generation and validation for SERV sessions
5
5
  * Uses HMAC-SHA256 for simplicity; can be upgraded to RSA/EC for production
6
6
  */
7
- import { createHmac, randomBytes, timingSafeEqual } from 'crypto';
7
+ import { createHash, createHmac, createSign, createVerify, createPrivateKey, createPublicKey, randomBytes, timingSafeEqual, } from 'crypto';
8
8
  const DEFAULT_CONFIG = {
9
9
  expirySeconds: 15 * 60, // 15 minutes
10
10
  algorithm: 'HS256',
11
11
  };
12
+ function isAsymmetric(alg) {
13
+ return alg === 'RS256' || alg === 'ES256';
14
+ }
12
15
  // ============================================================================
13
16
  // JWT Implementation
14
17
  // ============================================================================
15
18
  export class JwtService {
16
19
  config;
20
+ privateKey;
21
+ publicKey;
17
22
  constructor(config) {
18
- this.config = { ...DEFAULT_CONFIG, ...config };
19
- if (this.config.secret.length < 32) {
23
+ this.config = { ...DEFAULT_CONFIG, ...config, secret: config.secret ?? '' };
24
+ if (isAsymmetric(this.config.algorithm)) {
25
+ if (!this.config.privateKey) {
26
+ throw new Error(`JWT algorithm ${this.config.algorithm} requires a privateKey`);
27
+ }
28
+ this.privateKey = createPrivateKey(this.config.privateKey);
29
+ this.publicKey = this.config.publicKey
30
+ ? createPublicKey(this.config.publicKey)
31
+ : createPublicKey(this.privateKey);
32
+ }
33
+ else if (this.config.secret.length < 32) {
20
34
  console.warn('JWT secret is less than 32 characters. Consider using a stronger secret.');
21
35
  }
22
36
  }
37
+ /**
38
+ * Export the public JWK for publication at `/.well-known/jwks.json`.
39
+ * Only meaningful for asymmetric algorithms.
40
+ */
41
+ exportJwk() {
42
+ if (!this.publicKey)
43
+ return null;
44
+ const jwk = this.publicKey.export({ format: 'jwk' });
45
+ jwk.alg = this.config.algorithm;
46
+ jwk.use = 'sig';
47
+ if (this.config.kid)
48
+ jwk.kid = this.config.kid;
49
+ return jwk;
50
+ }
51
+ /**
52
+ * Generate an OAuth access token JWT for the token endpoint.
53
+ *
54
+ * This is a lower-level variant of `generateSessionToken` that accepts
55
+ * the minimal fields needed for an OAuth 2.1 bearer token: `sub`, `scope`,
56
+ * `client_id`, `tenant_id`, plus a TTL. No `Session` object required.
57
+ */
58
+ generateAccessToken(args) {
59
+ const nowSec = Math.floor((args.now?.getTime() ?? Date.now()) / 1000);
60
+ const payload = {
61
+ iss: this.config.issuer,
62
+ sub: args.sub,
63
+ aud: `${this.config.issuer}/mcp`,
64
+ exp: nowSec + args.expiresInSeconds,
65
+ iat: nowSec,
66
+ jti: args.jti ?? randomBytes(16).toString('base64url'),
67
+ tenant_id: args.tenantId,
68
+ client_id: args.clientId,
69
+ scope: args.scope,
70
+ };
71
+ return this.sign(payload);
72
+ }
73
+ /**
74
+ * Sign a custom payload (used by RFC 8693 token exchange, where the
75
+ * caller fully controls the claim set including `aud`, `act`, etc.).
76
+ * Caller is responsible for including `iss`, `exp`, `iat`.
77
+ */
78
+ exchangeSign(payload) {
79
+ return this.sign(payload);
80
+ }
81
+ /**
82
+ * Generate an OpenID Connect id_token per OIDC Core §3.1.3.7.
83
+ *
84
+ * Identity assertion about the end-user. Issued when `openid` scope is
85
+ * granted at /token. Signed with the same key/algorithm as access tokens.
86
+ * `azp` (authorized party) claim identifies the client that requested it.
87
+ */
88
+ generateIdToken(args) {
89
+ const nowSec = Math.floor((args.now?.getTime() ?? Date.now()) / 1000);
90
+ const payload = {
91
+ iss: this.config.issuer,
92
+ sub: args.sub,
93
+ aud: args.clientId, // RFC: id_token audience is the client, not the resource
94
+ azp: args.clientId,
95
+ exp: nowSec + args.expiresInSeconds,
96
+ iat: nowSec,
97
+ tenant_id: args.tenantId,
98
+ ...(args.profile ?? {}),
99
+ };
100
+ if (args.nonce)
101
+ payload.nonce = args.nonce;
102
+ return this.sign(payload);
103
+ }
23
104
  /**
24
105
  * Generate a session token
25
106
  */
@@ -103,6 +184,8 @@ export class JwtService {
103
184
  alg: this.config.algorithm,
104
185
  typ: 'JWT',
105
186
  };
187
+ if (this.config.kid)
188
+ header.kid = this.config.kid;
106
189
  const headerB64 = base64UrlEncode(JSON.stringify(header));
107
190
  const payloadB64 = base64UrlEncode(JSON.stringify(payload));
108
191
  const signatureInput = `${headerB64}.${payloadB64}`;
@@ -117,39 +200,83 @@ export class JwtService {
117
200
  if (parts.length !== 3)
118
201
  return null;
119
202
  const [headerB64, payloadB64, signatureB64] = parts;
120
- // Verify signature
121
203
  const signatureInput = `${headerB64}.${payloadB64}`;
122
- const expectedSignature = this.createSignature(signatureInput);
123
- // Timing-safe comparison
124
- const signatureBuffer = Buffer.from(signatureB64, 'base64url');
125
- const expectedBuffer = Buffer.from(expectedSignature, 'base64url');
126
- if (signatureBuffer.length !== expectedBuffer.length) {
127
- return null;
204
+ if (isAsymmetric(this.config.algorithm)) {
205
+ if (!this.publicKey)
206
+ return null;
207
+ try {
208
+ const verifier = createVerify(this.hashName());
209
+ verifier.update(signatureInput);
210
+ verifier.end();
211
+ const raw = Buffer.from(signatureB64, 'base64url');
212
+ // ES256/384/512 carry IEEE-P1363 r||s per RFC 7518 §3.4. Node's verifier
213
+ // expects DER internally on some runtimes (Bun in particular), so we
214
+ // convert P1363→DER before calling verify. `dsaEncoding: 'ieee-p1363'`
215
+ // option is Node-only and errors on Bun.
216
+ const signature = this.config.algorithm === 'ES256' ? p1363ToDer(raw) : raw;
217
+ const ok = verifier.verify(this.publicKey, signature);
218
+ if (!ok)
219
+ return null;
220
+ }
221
+ catch {
222
+ return null;
223
+ }
128
224
  }
129
- if (!timingSafeEqual(signatureBuffer, expectedBuffer)) {
130
- return null;
225
+ else {
226
+ const expectedSignature = this.createSignature(signatureInput);
227
+ const signatureBuffer = Buffer.from(signatureB64, 'base64url');
228
+ const expectedBuffer = Buffer.from(expectedSignature, 'base64url');
229
+ if (signatureBuffer.length !== expectedBuffer.length)
230
+ return null;
231
+ if (!timingSafeEqual(signatureBuffer, expectedBuffer))
232
+ return null;
131
233
  }
132
- // Parse payload
133
234
  try {
134
235
  return JSON.parse(base64UrlDecode(payloadB64));
135
236
  }
136
237
  catch {
137
- return null; // malformed payload
238
+ return null;
138
239
  }
139
240
  }
140
241
  /**
141
- * Create HMAC signature
242
+ * Create JWS signature. HMAC for symmetric algs, RSA-PSS / ECDSA for asymmetric.
142
243
  */
143
244
  createSignature(input) {
144
- const algorithm = this.config.algorithm === 'HS256'
145
- ? 'sha256'
146
- : this.config.algorithm === 'HS384'
147
- ? 'sha384'
148
- : 'sha512';
149
- const hmac = createHmac(algorithm, this.config.secret);
245
+ if (isAsymmetric(this.config.algorithm)) {
246
+ if (!this.privateKey) {
247
+ throw new Error('asymmetric JWT signing requires privateKey');
248
+ }
249
+ const signer = createSign(this.hashName());
250
+ signer.update(input);
251
+ signer.end();
252
+ // Node.js signs ECDSA with DER by default. RFC 7518 §3.4 requires
253
+ // the IEEE-P1363 r||s concatenation for JWS, so we convert after
254
+ // signing. The `dsaEncoding: 'ieee-p1363'` sign option would work
255
+ // on Node but throws on Bun ("Length out of range"), so we do the
256
+ // conversion manually for runtime-agnosticism.
257
+ const der = signer.sign(this.privateKey);
258
+ if (this.config.algorithm === 'ES256') {
259
+ return derToP1363(der, 32).toString('base64url');
260
+ }
261
+ return der.toString('base64url');
262
+ }
263
+ const hmac = createHmac(this.hashName(), this.config.secret);
150
264
  hmac.update(input);
151
265
  return hmac.digest('base64url');
152
266
  }
267
+ hashName() {
268
+ switch (this.config.algorithm) {
269
+ case 'HS384':
270
+ return 'sha384';
271
+ case 'HS512':
272
+ return 'sha512';
273
+ case 'HS256':
274
+ case 'RS256':
275
+ case 'ES256':
276
+ default:
277
+ return 'sha256';
278
+ }
279
+ }
153
280
  }
154
281
  // ============================================================================
155
282
  // PKCE Utilities
@@ -161,11 +288,11 @@ export function generateCodeVerifier() {
161
288
  return randomBytes(32).toString('base64url');
162
289
  }
163
290
  /**
164
- * Generate a code challenge from a verifier
291
+ * Generate a code challenge from a verifier (RFC 7636 §4.2, S256 method)
292
+ * code_challenge = BASE64URL-ENCODE(SHA256(code_verifier))
165
293
  */
166
294
  export function generateCodeChallenge(verifier) {
167
- const hash = createHmac('sha256', '').update(verifier).digest();
168
- return hash.toString('base64url');
295
+ return createHash('sha256').update(verifier).digest('base64url');
169
296
  }
170
297
  /**
171
298
  * Verify a code verifier against a challenge
@@ -220,6 +347,81 @@ function base64UrlDecode(str) {
220
347
  return Buffer.from(str, 'base64url').toString('utf-8');
221
348
  }
222
349
  // ============================================================================
350
+ // ECDSA signature encoding (DER ↔ IEEE-P1363)
351
+ // ============================================================================
352
+ /**
353
+ * Convert a DER-encoded ECDSA signature (Node's default output from
354
+ * `createSign().sign()`) into the IEEE-P1363 r||s encoding required by
355
+ * RFC 7518 §3.4 for JWS ES256/ES384/ES512.
356
+ *
357
+ * DER layout: 0x30 [totalLen] 0x02 [rLen] [r...] 0x02 [sLen] [s...]
358
+ * r and s are encoded as signed integers — DER prepends 0x00 if the high
359
+ * bit of the first byte would otherwise make them negative. P1363 strips
360
+ * that padding and left-zero-pads each component to `componentLen` bytes.
361
+ */
362
+ function derToP1363(der, componentLen) {
363
+ if (der[0] !== 0x30) {
364
+ throw new Error('invalid DER signature: missing SEQUENCE');
365
+ }
366
+ // Skip SEQUENCE header (1-byte length for signatures we produce).
367
+ let offset = 2;
368
+ if ((der[1] & 0x80) !== 0) {
369
+ offset += der[1] & 0x7f;
370
+ }
371
+ const readInt = () => {
372
+ if (der[offset] !== 0x02) {
373
+ throw new Error('invalid DER signature: expected INTEGER');
374
+ }
375
+ const len = der[offset + 1];
376
+ const start = offset + 2;
377
+ let value = der.subarray(start, start + len);
378
+ offset = start + len;
379
+ // Strip leading 0x00 padding that keeps DER integers positive.
380
+ while (value.length > 1 && value[0] === 0x00) {
381
+ value = value.subarray(1);
382
+ }
383
+ if (value.length > componentLen) {
384
+ throw new Error(`ECDSA component overflow: ${value.length} > ${componentLen}`);
385
+ }
386
+ return value;
387
+ };
388
+ const r = readInt();
389
+ const s = readInt();
390
+ const out = Buffer.alloc(componentLen * 2);
391
+ r.copy(out, componentLen - r.length);
392
+ s.copy(out, componentLen * 2 - s.length);
393
+ return out;
394
+ }
395
+ /**
396
+ * Convert a P1363 r||s signature into DER for Node's `verifier.verify()`.
397
+ * Inverse of `derToP1363`. Used on the verify path so signatures received
398
+ * in spec-compliant JWS form can still be handed to Node's DER-only API.
399
+ */
400
+ function p1363ToDer(p1363) {
401
+ if (p1363.length % 2 !== 0) {
402
+ throw new Error('invalid P1363 signature: odd length');
403
+ }
404
+ const half = p1363.length / 2;
405
+ const encodeInt = (value) => {
406
+ // Strip leading zeros (but leave at least one byte).
407
+ let v = value;
408
+ while (v.length > 1 && v[0] === 0x00) {
409
+ v = v.subarray(1);
410
+ }
411
+ // If high bit is set, prepend 0x00 so DER reads it as positive.
412
+ if ((v[0] & 0x80) !== 0) {
413
+ v = Buffer.concat([Buffer.from([0x00]), v]);
414
+ }
415
+ return Buffer.concat([Buffer.from([0x02, v.length]), v]);
416
+ };
417
+ const r = encodeInt(p1363.subarray(0, half));
418
+ const s = encodeInt(p1363.subarray(half));
419
+ const body = Buffer.concat([r, s]);
420
+ return Buffer.concat([Buffer.from([0x30, body.length]), body]);
421
+ }
422
+ /** Internal exports for tests only. */
423
+ export const __test_ecdsa__ = { derToP1363, p1363ToDer };
424
+ // ============================================================================
223
425
  // Factory Function
224
426
  // ============================================================================
225
427
  let jwtServiceInstance = null;
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../../src/serv/auth/jwt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../../src/serv/auth/jwt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * SQLite-backed implementations of `ElicitationStore` and `GrantStore`.
3
+ *
4
+ * These hold OAuth state that currently goes through `MemoryElicitationStore`
5
+ * and `MemoryGrantStore` in `oauth.ts` — elicitation requests (short-lived,
6
+ * waiting for a user to complete the upstream OAuth flow) and photon grants
7
+ * (long-lived, encrypted refresh tokens for upstream APIs like Stripe/GitHub).
8
+ *
9
+ * Without persistent storage, every daemon restart forces users to re-auth
10
+ * against every upstream provider because the grants live in memory only.
11
+ * Moving grants to SQLite fixes that; elicitations benefit because pending
12
+ * approvals survive a crash of the daemon during the redirect window.
13
+ *
14
+ * Runtime-agnostic via `src/shared/sqlite-runtime.ts`:
15
+ * - Under Bun: uses built-in `bun:sqlite`
16
+ * - Under Node: falls back to `better-sqlite3`
17
+ */
18
+ import type { ElicitationRequest, PhotonGrant } from '../types/index.js';
19
+ import type { ElicitationStore, GrantStore } from './oauth.js';
20
+ import { type SqliteDatabase } from '../../shared/sqlite-runtime.js';
21
+ export declare function openOauthDatabase(path: string): Promise<SqliteDatabase>;
22
+ export declare class SqliteElicitationStore implements ElicitationStore {
23
+ private insert;
24
+ private select;
25
+ private updateStmt;
26
+ private remove;
27
+ private sweepStmt;
28
+ constructor(db: SqliteDatabase);
29
+ create(data: Omit<ElicitationRequest, 'id' | 'createdAt'>): Promise<ElicitationRequest>;
30
+ get(id: string): Promise<ElicitationRequest | null>;
31
+ update(id: string, data: Partial<ElicitationRequest>): Promise<void>;
32
+ delete(id: string): Promise<void>;
33
+ cleanup(): Promise<number>;
34
+ }
35
+ export declare class SqliteGrantStore implements GrantStore {
36
+ private insert;
37
+ private selectByKey;
38
+ private selectByUser;
39
+ private updateStmt;
40
+ private remove;
41
+ constructor(db: SqliteDatabase);
42
+ find(tenantId: string, photonId: string, provider: string, userId?: string): Promise<PhotonGrant | null>;
43
+ create(data: Omit<PhotonGrant, 'id' | 'createdAt' | 'updatedAt'>): Promise<PhotonGrant>;
44
+ update(id: string, data: Partial<PhotonGrant>): Promise<void>;
45
+ delete(id: string): Promise<void>;
46
+ findByUser(tenantId: string, userId: string): Promise<PhotonGrant[]>;
47
+ }
48
+ //# sourceMappingURL=oauth-sqlite-stores.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-sqlite-stores.d.ts","sourceRoot":"","sources":["../../../src/serv/auth/oauth-sqlite-stores.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,gCAAgC,CAAC;AA0CxC,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAE7E;AAMD,qBAAa,sBAAuB,YAAW,gBAAgB;IAC7D,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAkB;gBAEvB,EAAE,EAAE,cAAc;IAmBxB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAqBvF,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAWnD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAIjC;AAqBD,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,MAAM,CAAkB;gBAEpB,EAAE,EAAE,cAAc;IA6BxB,IAAI,CACR,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAWxB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IAwBvF,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAY7D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CAI3E"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * SQLite-backed implementations of `ElicitationStore` and `GrantStore`.
3
+ *
4
+ * These hold OAuth state that currently goes through `MemoryElicitationStore`
5
+ * and `MemoryGrantStore` in `oauth.ts` — elicitation requests (short-lived,
6
+ * waiting for a user to complete the upstream OAuth flow) and photon grants
7
+ * (long-lived, encrypted refresh tokens for upstream APIs like Stripe/GitHub).
8
+ *
9
+ * Without persistent storage, every daemon restart forces users to re-auth
10
+ * against every upstream provider because the grants live in memory only.
11
+ * Moving grants to SQLite fixes that; elicitations benefit because pending
12
+ * approvals survive a crash of the daemon during the redirect window.
13
+ *
14
+ * Runtime-agnostic via `src/shared/sqlite-runtime.ts`:
15
+ * - Under Bun: uses built-in `bun:sqlite`
16
+ * - Under Node: falls back to `better-sqlite3`
17
+ */
18
+ import { randomBytes } from 'crypto';
19
+ import { openSqlite, } from '../../shared/sqlite-runtime.js';
20
+ // ============================================================================
21
+ // Schema + open
22
+ // ============================================================================
23
+ function initSchema(db) {
24
+ db.exec(`
25
+ CREATE TABLE IF NOT EXISTS elicitations (
26
+ id TEXT PRIMARY KEY,
27
+ session_id TEXT NOT NULL,
28
+ photon_id TEXT NOT NULL,
29
+ provider TEXT NOT NULL,
30
+ required_scopes TEXT NOT NULL,
31
+ status TEXT NOT NULL,
32
+ redirect_uri TEXT NOT NULL,
33
+ code_verifier TEXT,
34
+ created_at INTEGER NOT NULL,
35
+ expires_at INTEGER NOT NULL
36
+ );
37
+ CREATE INDEX IF NOT EXISTS idx_elicitations_session ON elicitations(session_id);
38
+ CREATE INDEX IF NOT EXISTS idx_elicitations_expires ON elicitations(expires_at);
39
+
40
+ CREATE TABLE IF NOT EXISTS photon_grants (
41
+ id TEXT PRIMARY KEY,
42
+ tenant_id TEXT NOT NULL,
43
+ user_id TEXT,
44
+ photon_id TEXT NOT NULL,
45
+ provider TEXT NOT NULL,
46
+ scopes TEXT NOT NULL,
47
+ access_token_encrypted TEXT NOT NULL,
48
+ refresh_token_encrypted TEXT,
49
+ token_expires_at INTEGER NOT NULL,
50
+ created_at INTEGER NOT NULL,
51
+ updated_at INTEGER NOT NULL,
52
+ UNIQUE (tenant_id, photon_id, provider, user_id)
53
+ );
54
+ CREATE INDEX IF NOT EXISTS idx_grants_user ON photon_grants(tenant_id, user_id);
55
+ CREATE INDEX IF NOT EXISTS idx_grants_expires ON photon_grants(token_expires_at);
56
+ `);
57
+ }
58
+ export async function openOauthDatabase(path) {
59
+ return openSqlite(path, initSchema);
60
+ }
61
+ // ============================================================================
62
+ // SqliteElicitationStore
63
+ // ============================================================================
64
+ export class SqliteElicitationStore {
65
+ insert;
66
+ select;
67
+ updateStmt;
68
+ remove;
69
+ sweepStmt;
70
+ constructor(db) {
71
+ this.insert = db.prepare(`
72
+ INSERT INTO elicitations
73
+ (id, session_id, photon_id, provider, required_scopes, status,
74
+ redirect_uri, code_verifier, created_at, expires_at)
75
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
76
+ `);
77
+ this.select = db.prepare('SELECT * FROM elicitations WHERE id = ?');
78
+ this.updateStmt = db.prepare(`
79
+ UPDATE elicitations
80
+ SET status = COALESCE(?, status),
81
+ code_verifier = COALESCE(?, code_verifier),
82
+ expires_at = COALESCE(?, expires_at)
83
+ WHERE id = ?
84
+ `);
85
+ this.remove = db.prepare('DELETE FROM elicitations WHERE id = ?');
86
+ this.sweepStmt = db.prepare('DELETE FROM elicitations WHERE expires_at < ?');
87
+ }
88
+ async create(data) {
89
+ const request = {
90
+ ...data,
91
+ id: randomBytes(16).toString('hex'),
92
+ createdAt: new Date(),
93
+ };
94
+ this.insert.run(request.id, request.sessionId, request.photonId, request.provider, JSON.stringify(request.requiredScopes), request.status, request.redirectUri, request.codeVerifier ?? null, request.createdAt.getTime(), request.expiresAt.getTime());
95
+ return request;
96
+ }
97
+ async get(id) {
98
+ const row = this.select.get(id);
99
+ if (!row)
100
+ return null;
101
+ const expiresAt = new Date(row.expires_at);
102
+ if (expiresAt.getTime() < Date.now()) {
103
+ this.remove.run(id);
104
+ return null;
105
+ }
106
+ return rowToElicitation(row);
107
+ }
108
+ async update(id, data) {
109
+ // Only status / codeVerifier / expiresAt are mutated in practice
110
+ const expiresAt = data.expiresAt ? data.expiresAt.getTime() : null;
111
+ this.updateStmt.run(data.status ?? null, data.codeVerifier ?? null, expiresAt, id);
112
+ }
113
+ async delete(id) {
114
+ this.remove.run(id);
115
+ }
116
+ async cleanup() {
117
+ const result = this.sweepStmt.run(Date.now());
118
+ return result.changes ?? 0;
119
+ }
120
+ }
121
+ function rowToElicitation(row) {
122
+ return {
123
+ id: row.id,
124
+ sessionId: row.session_id,
125
+ photonId: row.photon_id,
126
+ provider: row.provider,
127
+ requiredScopes: JSON.parse(row.required_scopes),
128
+ status: row.status,
129
+ redirectUri: row.redirect_uri,
130
+ codeVerifier: row.code_verifier ?? undefined,
131
+ createdAt: new Date(row.created_at),
132
+ expiresAt: new Date(row.expires_at),
133
+ };
134
+ }
135
+ // ============================================================================
136
+ // SqliteGrantStore
137
+ // ============================================================================
138
+ export class SqliteGrantStore {
139
+ insert;
140
+ selectByKey;
141
+ selectByUser;
142
+ updateStmt;
143
+ remove;
144
+ constructor(db) {
145
+ this.insert = db.prepare(`
146
+ INSERT OR REPLACE INTO photon_grants
147
+ (id, tenant_id, user_id, photon_id, provider, scopes,
148
+ access_token_encrypted, refresh_token_encrypted, token_expires_at,
149
+ created_at, updated_at)
150
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
151
+ `);
152
+ this.selectByKey = db.prepare(`
153
+ SELECT * FROM photon_grants
154
+ WHERE tenant_id = ? AND photon_id = ? AND provider = ?
155
+ AND (user_id = ? OR (user_id IS NULL AND ? IS NULL))
156
+ LIMIT 1
157
+ `);
158
+ this.selectByUser = db.prepare('SELECT * FROM photon_grants WHERE tenant_id = ? AND user_id = ?');
159
+ this.updateStmt = db.prepare(`
160
+ UPDATE photon_grants
161
+ SET access_token_encrypted = COALESCE(?, access_token_encrypted),
162
+ refresh_token_encrypted = COALESCE(?, refresh_token_encrypted),
163
+ scopes = COALESCE(?, scopes),
164
+ token_expires_at = COALESCE(?, token_expires_at),
165
+ updated_at = ?
166
+ WHERE id = ?
167
+ `);
168
+ this.remove = db.prepare('DELETE FROM photon_grants WHERE id = ?');
169
+ }
170
+ async find(tenantId, photonId, provider, userId) {
171
+ const row = this.selectByKey.get(tenantId, photonId, provider, userId ?? null, userId ?? null);
172
+ return row ? rowToGrant(row) : null;
173
+ }
174
+ async create(data) {
175
+ const now = new Date();
176
+ const grant = {
177
+ ...data,
178
+ id: randomBytes(16).toString('hex'),
179
+ createdAt: now,
180
+ updatedAt: now,
181
+ };
182
+ this.insert.run(grant.id, grant.tenantId, grant.userId ?? null, grant.photonId, grant.provider, JSON.stringify(grant.scopes), grant.accessTokenEncrypted, grant.refreshTokenEncrypted ?? null, grant.tokenExpiresAt.getTime(), grant.createdAt.getTime(), grant.updatedAt.getTime());
183
+ return grant;
184
+ }
185
+ async update(id, data) {
186
+ const expiresAt = data.tokenExpiresAt ? data.tokenExpiresAt.getTime() : null;
187
+ this.updateStmt.run(data.accessTokenEncrypted ?? null, data.refreshTokenEncrypted ?? null, data.scopes ? JSON.stringify(data.scopes) : null, expiresAt, Date.now(), id);
188
+ }
189
+ async delete(id) {
190
+ this.remove.run(id);
191
+ }
192
+ async findByUser(tenantId, userId) {
193
+ const rows = this.selectByUser.all(tenantId, userId);
194
+ return rows.map((r) => rowToGrant(r));
195
+ }
196
+ }
197
+ function rowToGrant(row) {
198
+ return {
199
+ id: row.id,
200
+ tenantId: row.tenant_id,
201
+ userId: row.user_id ?? undefined,
202
+ photonId: row.photon_id,
203
+ provider: row.provider,
204
+ scopes: JSON.parse(row.scopes),
205
+ accessTokenEncrypted: row.access_token_encrypted,
206
+ refreshTokenEncrypted: row.refresh_token_encrypted ?? undefined,
207
+ tokenExpiresAt: new Date(row.token_expires_at),
208
+ createdAt: new Date(row.created_at),
209
+ updatedAt: new Date(row.updated_at),
210
+ };
211
+ }
212
+ //# sourceMappingURL=oauth-sqlite-stores.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-sqlite-stores.js","sourceRoot":"","sources":["../../../src/serv/auth/oauth-sqlite-stores.ts"],"names":[],"mappings":"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"}