@parlor/auth 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +25 -2
  3. package/dist/account.d.ts +52 -0
  4. package/dist/account.d.ts.map +1 -0
  5. package/dist/account.js +114 -0
  6. package/dist/account.js.map +1 -0
  7. package/dist/audit.d.ts +10 -0
  8. package/dist/audit.d.ts.map +1 -0
  9. package/dist/audit.js +130 -0
  10. package/dist/audit.js.map +1 -0
  11. package/dist/better-auth.d.ts +41 -0
  12. package/dist/better-auth.d.ts.map +1 -0
  13. package/dist/better-auth.js +118 -0
  14. package/dist/better-auth.js.map +1 -0
  15. package/dist/client/index.d.ts +43 -0
  16. package/dist/client/index.d.ts.map +1 -0
  17. package/dist/client/index.js +465 -0
  18. package/dist/client/index.js.map +1 -0
  19. package/dist/database.d.ts +7 -0
  20. package/dist/database.d.ts.map +1 -0
  21. package/dist/database.js +11 -0
  22. package/dist/database.js.map +1 -0
  23. package/dist/devices.d.ts +157 -0
  24. package/dist/devices.d.ts.map +1 -0
  25. package/dist/devices.js +398 -0
  26. package/dist/devices.js.map +1 -0
  27. package/dist/es256.d.ts +4 -0
  28. package/dist/es256.d.ts.map +1 -0
  29. package/dist/es256.js +44 -0
  30. package/dist/es256.js.map +1 -0
  31. package/dist/grants.d.ts +4 -0
  32. package/dist/grants.d.ts.map +1 -0
  33. package/dist/grants.js +6 -0
  34. package/dist/grants.js.map +1 -0
  35. package/dist/hosts.d.ts +116 -0
  36. package/dist/hosts.d.ts.map +1 -0
  37. package/dist/hosts.js +530 -0
  38. package/dist/hosts.js.map +1 -0
  39. package/dist/index.d.ts +9 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +9 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/migrations.d.ts +3 -0
  44. package/dist/migrations.d.ts.map +1 -0
  45. package/dist/migrations.js +17 -0
  46. package/dist/migrations.js.map +1 -0
  47. package/dist/pages.d.ts +4 -0
  48. package/dist/pages.d.ts.map +1 -0
  49. package/dist/pages.js +53 -0
  50. package/dist/pages.js.map +1 -0
  51. package/dist/provider.d.ts +74 -0
  52. package/dist/provider.d.ts.map +1 -0
  53. package/dist/provider.js +286 -0
  54. package/dist/provider.js.map +1 -0
  55. package/dist/revocation.d.ts +51 -0
  56. package/dist/revocation.d.ts.map +1 -0
  57. package/dist/revocation.js +233 -0
  58. package/dist/revocation.js.map +1 -0
  59. package/dist/routes.d.ts +15 -0
  60. package/dist/routes.d.ts.map +1 -0
  61. package/dist/routes.js +116 -0
  62. package/dist/routes.js.map +1 -0
  63. package/dist/schema.d.ts +2970 -0
  64. package/dist/schema.d.ts.map +1 -0
  65. package/dist/schema.js +308 -0
  66. package/dist/schema.js.map +1 -0
  67. package/dist/statements.d.ts +92 -0
  68. package/dist/statements.d.ts.map +1 -0
  69. package/dist/statements.js +199 -0
  70. package/dist/statements.js.map +1 -0
  71. package/dist/tokens.d.ts +69 -0
  72. package/dist/tokens.d.ts.map +1 -0
  73. package/dist/tokens.js +134 -0
  74. package/dist/tokens.js.map +1 -0
  75. package/dist/turn-keys.d.ts +16 -0
  76. package/dist/turn-keys.d.ts.map +1 -0
  77. package/dist/turn-keys.js +108 -0
  78. package/dist/turn-keys.js.map +1 -0
  79. package/package.json +57 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
package/dist/schema.js ADDED
@@ -0,0 +1,308 @@
1
+ // The Better Auth tables for parlorAuth() defaults, as `auth generate` writes them for better-auth 1.7.7.
2
+ // `schema.spec.ts` regenerates them and fails on any difference, so a Better Auth bump updates this file.
3
+ import { relations } from "drizzle-orm";
4
+ import { pgTable, text, timestamp, boolean, integer, jsonb, index, uniqueIndex, } from "drizzle-orm/pg-core";
5
+ export const user = pgTable("user", {
6
+ id: text("id").primaryKey(),
7
+ name: text("name").notNull(),
8
+ email: text("email").notNull().unique(),
9
+ emailVerified: boolean("email_verified").default(false).notNull(),
10
+ image: text("image"),
11
+ createdAt: timestamp("created_at").defaultNow().notNull(),
12
+ updatedAt: timestamp("updated_at")
13
+ .defaultNow()
14
+ .$onUpdate(() => /* @__PURE__ */ new Date())
15
+ .notNull(),
16
+ });
17
+ export const session = pgTable("session", {
18
+ id: text("id").primaryKey(),
19
+ expiresAt: timestamp("expires_at").notNull(),
20
+ token: text("token").notNull().unique(),
21
+ createdAt: timestamp("created_at").defaultNow().notNull(),
22
+ updatedAt: timestamp("updated_at")
23
+ .$onUpdate(() => /* @__PURE__ */ new Date())
24
+ .notNull(),
25
+ ipAddress: text("ip_address"),
26
+ userAgent: text("user_agent"),
27
+ userId: text("user_id")
28
+ .notNull()
29
+ .references(() => user.id, { onDelete: "cascade" }),
30
+ }, (table) => [index("session_userId_idx").on(table.userId)]);
31
+ export const account = pgTable("account", {
32
+ id: text("id").primaryKey(),
33
+ accountId: text("account_id").notNull(),
34
+ providerId: text("provider_id").notNull(),
35
+ userId: text("user_id")
36
+ .notNull()
37
+ .references(() => user.id, { onDelete: "cascade" }),
38
+ accessToken: text("access_token"),
39
+ refreshToken: text("refresh_token"),
40
+ idToken: text("id_token"),
41
+ accessTokenExpiresAt: timestamp("access_token_expires_at"),
42
+ refreshTokenExpiresAt: timestamp("refresh_token_expires_at"),
43
+ scope: text("scope"),
44
+ password: text("password"),
45
+ createdAt: timestamp("created_at").defaultNow().notNull(),
46
+ updatedAt: timestamp("updated_at")
47
+ .$onUpdate(() => /* @__PURE__ */ new Date())
48
+ .notNull(),
49
+ }, (table) => [index("account_userId_idx").on(table.userId)]);
50
+ export const verification = pgTable("verification", {
51
+ id: text("id").primaryKey(),
52
+ identifier: text("identifier").notNull(),
53
+ value: text("value").notNull(),
54
+ expiresAt: timestamp("expires_at").notNull(),
55
+ createdAt: timestamp("created_at").defaultNow().notNull(),
56
+ updatedAt: timestamp("updated_at")
57
+ .defaultNow()
58
+ .$onUpdate(() => /* @__PURE__ */ new Date())
59
+ .notNull(),
60
+ }, (table) => [index("verification_identifier_idx").on(table.identifier)]);
61
+ export const jwks = pgTable("jwks", {
62
+ id: text("id").primaryKey(),
63
+ publicKey: text("public_key").notNull(),
64
+ privateKey: text("private_key").notNull(),
65
+ createdAt: timestamp("created_at").notNull(),
66
+ expiresAt: timestamp("expires_at"),
67
+ alg: text("alg"),
68
+ crv: text("crv"),
69
+ });
70
+ export const oauthClient = pgTable("oauth_client", {
71
+ id: text("id").primaryKey(),
72
+ clientId: text("client_id").notNull().unique(),
73
+ clientSecret: text("client_secret"),
74
+ clientDiscoveryId: text("client_discovery_id"),
75
+ disabled: boolean("disabled").default(false),
76
+ skipConsent: boolean("skip_consent"),
77
+ enableEndSession: boolean("enable_end_session"),
78
+ subjectType: text("subject_type"),
79
+ scopes: text("scopes").array(),
80
+ clientCredentialsScopes: text("client_credentials_scopes").array().default([]),
81
+ userId: text("user_id").references(() => user.id, { onDelete: "cascade" }),
82
+ createdAt: timestamp("created_at"),
83
+ updatedAt: timestamp("updated_at"),
84
+ name: text("name"),
85
+ uri: text("uri"),
86
+ icon: text("icon"),
87
+ contacts: text("contacts").array(),
88
+ tos: text("tos"),
89
+ policy: text("policy"),
90
+ softwareId: text("software_id"),
91
+ softwareVersion: text("software_version"),
92
+ softwareStatement: text("software_statement"),
93
+ redirectUris: text("redirect_uris").array().notNull(),
94
+ postLogoutRedirectUris: text("post_logout_redirect_uris").array(),
95
+ backchannelLogoutUri: text("backchannel_logout_uri"),
96
+ backchannelLogoutSessionRequired: boolean("backchannel_logout_session_required"),
97
+ tokenEndpointAuthMethod: text("token_endpoint_auth_method"),
98
+ applicationType: text("application_type"),
99
+ jwks: text("jwks"),
100
+ jwksUri: text("jwks_uri"),
101
+ grantTypes: text("grant_types").array(),
102
+ responseTypes: text("response_types").array(),
103
+ requirePKCE: boolean("require_pkce"),
104
+ dpopBoundAccessTokens: boolean("dpop_bound_access_tokens").default(false),
105
+ referenceId: text("reference_id"),
106
+ metadata: jsonb("metadata"),
107
+ }, (table) => [index("oauthClient_userId_idx").on(table.userId)]);
108
+ export const oauthResource = pgTable("oauth_resource", {
109
+ id: text("id").primaryKey(),
110
+ identifier: text("identifier").notNull().unique(),
111
+ name: text("name").notNull(),
112
+ accessTokenTtl: integer("access_token_ttl"),
113
+ refreshTokenTtl: integer("refresh_token_ttl"),
114
+ signingAlgorithm: text("signing_algorithm"),
115
+ signingKeyId: text("signing_key_id"),
116
+ allowedScopes: text("allowed_scopes").array(),
117
+ customClaims: jsonb("custom_claims"),
118
+ dpopBoundAccessTokensRequired: boolean("dpop_bound_access_tokens_required").default(false),
119
+ disabled: boolean("disabled").default(false),
120
+ createdAt: timestamp("created_at"),
121
+ updatedAt: timestamp("updated_at"),
122
+ policyVersion: integer("policy_version").default(1),
123
+ metadata: jsonb("metadata"),
124
+ });
125
+ export const oauthClientResource = pgTable("oauth_client_resource", {
126
+ id: text("id").primaryKey(),
127
+ clientId: text("client_id")
128
+ .notNull()
129
+ .references(() => oauthClient.clientId, { onDelete: "cascade" }),
130
+ resourceId: text("resource_id")
131
+ .notNull()
132
+ .references(() => oauthResource.identifier, { onDelete: "cascade" }),
133
+ metadata: jsonb("metadata"),
134
+ createdAt: timestamp("created_at"),
135
+ }, (table) => [
136
+ uniqueIndex("oauthClientResource_clientId_resourceId_uidx").on(table.clientId, table.resourceId),
137
+ index("oauthClientResource_clientId_idx").on(table.clientId),
138
+ index("oauthClientResource_resourceId_idx").on(table.resourceId),
139
+ ]);
140
+ export const oauthRefreshToken = pgTable("oauth_refresh_token", {
141
+ id: text("id").primaryKey(),
142
+ token: text("token").notNull().unique(),
143
+ clientId: text("client_id")
144
+ .notNull()
145
+ .references(() => oauthClient.clientId, { onDelete: "cascade" }),
146
+ sessionId: text("session_id").references(() => session.id, {
147
+ onDelete: "set null",
148
+ }),
149
+ userId: text("user_id")
150
+ .notNull()
151
+ .references(() => user.id, { onDelete: "cascade" }),
152
+ referenceId: text("reference_id"),
153
+ authorizationCodeId: text("authorization_code_id"),
154
+ resources: text("resources").array(),
155
+ requestedUserInfoClaims: text("requested_user_info_claims").array(),
156
+ expiresAt: timestamp("expires_at").notNull(),
157
+ createdAt: timestamp("created_at").notNull(),
158
+ revoked: timestamp("revoked"),
159
+ rotatedAt: timestamp("rotated_at"),
160
+ rotationReplayResponse: text("rotation_replay_response"),
161
+ rotationReplayExpiresAt: timestamp("rotation_replay_expires_at"),
162
+ authTime: timestamp("auth_time"),
163
+ confirmation: jsonb("confirmation"),
164
+ scopes: text("scopes").array().notNull(),
165
+ }, (table) => [
166
+ index("oauthRefreshToken_clientId_idx").on(table.clientId),
167
+ index("oauthRefreshToken_sessionId_idx").on(table.sessionId),
168
+ index("oauthRefreshToken_userId_idx").on(table.userId),
169
+ index("oauthRefreshToken_authorizationCodeId_idx").on(table.authorizationCodeId),
170
+ ]);
171
+ export const oauthAccessToken = pgTable("oauth_access_token", {
172
+ id: text("id").primaryKey(),
173
+ token: text("token").notNull().unique(),
174
+ clientId: text("client_id")
175
+ .notNull()
176
+ .references(() => oauthClient.clientId, { onDelete: "cascade" }),
177
+ sessionId: text("session_id").references(() => session.id, {
178
+ onDelete: "set null",
179
+ }),
180
+ userId: text("user_id").references(() => user.id, { onDelete: "cascade" }),
181
+ referenceId: text("reference_id"),
182
+ authorizationCodeId: text("authorization_code_id"),
183
+ resources: text("resources").array(),
184
+ requestedUserInfoClaims: text("requested_user_info_claims").array(),
185
+ refreshId: text("refresh_id").references(() => oauthRefreshToken.id, {
186
+ onDelete: "cascade",
187
+ }),
188
+ expiresAt: timestamp("expires_at").notNull(),
189
+ createdAt: timestamp("created_at").notNull(),
190
+ revoked: timestamp("revoked"),
191
+ confirmation: jsonb("confirmation"),
192
+ scopes: text("scopes").array().notNull(),
193
+ }, (table) => [
194
+ index("oauthAccessToken_clientId_idx").on(table.clientId),
195
+ index("oauthAccessToken_sessionId_idx").on(table.sessionId),
196
+ index("oauthAccessToken_userId_idx").on(table.userId),
197
+ index("oauthAccessToken_authorizationCodeId_idx").on(table.authorizationCodeId),
198
+ index("oauthAccessToken_refreshId_idx").on(table.refreshId),
199
+ ]);
200
+ export const oauthConsent = pgTable("oauth_consent", {
201
+ id: text("id").primaryKey(),
202
+ clientId: text("client_id")
203
+ .notNull()
204
+ .references(() => oauthClient.clientId, { onDelete: "cascade" }),
205
+ userId: text("user_id").references(() => user.id, { onDelete: "cascade" }),
206
+ referenceId: text("reference_id"),
207
+ resources: text("resources").array(),
208
+ requestedUserInfoClaims: text("requested_user_info_claims").array(),
209
+ scopes: text("scopes").array().notNull(),
210
+ createdAt: timestamp("created_at").notNull(),
211
+ updatedAt: timestamp("updated_at").notNull(),
212
+ }, (table) => [
213
+ index("oauthConsent_clientId_idx").on(table.clientId),
214
+ index("oauthConsent_userId_idx").on(table.userId),
215
+ ]);
216
+ export const oauthClientAssertion = pgTable("oauth_client_assertion", {
217
+ id: text("id").primaryKey(),
218
+ expiresAt: timestamp("expires_at").notNull(),
219
+ });
220
+ export const userRelations = relations(user, ({ many }) => ({
221
+ sessions: many(session),
222
+ accounts: many(account),
223
+ oauthClients: many(oauthClient),
224
+ oauthRefreshTokens: many(oauthRefreshToken),
225
+ oauthAccessTokens: many(oauthAccessToken),
226
+ oauthConsents: many(oauthConsent),
227
+ }));
228
+ export const sessionRelations = relations(session, ({ one, many }) => ({
229
+ user: one(user, {
230
+ fields: [session.userId],
231
+ references: [user.id],
232
+ }),
233
+ oauthRefreshTokens: many(oauthRefreshToken),
234
+ oauthAccessTokens: many(oauthAccessToken),
235
+ }));
236
+ export const accountRelations = relations(account, ({ one }) => ({
237
+ user: one(user, {
238
+ fields: [account.userId],
239
+ references: [user.id],
240
+ }),
241
+ }));
242
+ export const oauthClientRelations = relations(oauthClient, ({ one, many }) => ({
243
+ user: one(user, {
244
+ fields: [oauthClient.userId],
245
+ references: [user.id],
246
+ }),
247
+ oauthClientResources: many(oauthClientResource),
248
+ oauthRefreshTokens: many(oauthRefreshToken),
249
+ oauthAccessTokens: many(oauthAccessToken),
250
+ oauthConsents: many(oauthConsent),
251
+ }));
252
+ export const oauthResourceRelations = relations(oauthResource, ({ many }) => ({
253
+ oauthClientResources: many(oauthClientResource),
254
+ }));
255
+ export const oauthClientResourceRelations = relations(oauthClientResource, ({ one }) => ({
256
+ oauthClient: one(oauthClient, {
257
+ fields: [oauthClientResource.clientId],
258
+ references: [oauthClient.clientId],
259
+ }),
260
+ oauthResource: one(oauthResource, {
261
+ fields: [oauthClientResource.resourceId],
262
+ references: [oauthResource.identifier],
263
+ }),
264
+ }));
265
+ export const oauthRefreshTokenRelations = relations(oauthRefreshToken, ({ one, many }) => ({
266
+ oauthClient: one(oauthClient, {
267
+ fields: [oauthRefreshToken.clientId],
268
+ references: [oauthClient.clientId],
269
+ }),
270
+ session: one(session, {
271
+ fields: [oauthRefreshToken.sessionId],
272
+ references: [session.id],
273
+ }),
274
+ user: one(user, {
275
+ fields: [oauthRefreshToken.userId],
276
+ references: [user.id],
277
+ }),
278
+ oauthAccessTokens: many(oauthAccessToken),
279
+ }));
280
+ export const oauthAccessTokenRelations = relations(oauthAccessToken, ({ one }) => ({
281
+ oauthClient: one(oauthClient, {
282
+ fields: [oauthAccessToken.clientId],
283
+ references: [oauthClient.clientId],
284
+ }),
285
+ session: one(session, {
286
+ fields: [oauthAccessToken.sessionId],
287
+ references: [session.id],
288
+ }),
289
+ user: one(user, {
290
+ fields: [oauthAccessToken.userId],
291
+ references: [user.id],
292
+ }),
293
+ oauthRefreshToken: one(oauthRefreshToken, {
294
+ fields: [oauthAccessToken.refreshId],
295
+ references: [oauthRefreshToken.id],
296
+ }),
297
+ }));
298
+ export const oauthConsentRelations = relations(oauthConsent, ({ one }) => ({
299
+ oauthClient: one(oauthClient, {
300
+ fields: [oauthConsent.clientId],
301
+ references: [oauthClient.clientId],
302
+ }),
303
+ user: one(user, {
304
+ fields: [oauthConsent.userId],
305
+ references: [user.id],
306
+ }),
307
+ }));
308
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import type { DeviceSignature, PresenceSignature } from "@parlor/capabilities";
2
+ import type { AnswerToSign, LoggedItem, PromptToSign } from "@parlor/chat";
3
+ import type { DeviceId } from "@parlor/core";
4
+ import type { PresenceKey } from "@parlor/server";
5
+ export interface PromptStatement {
6
+ readonly v: 1;
7
+ readonly kind: "prompt";
8
+ /** The app's origin: a statement for one app is worthless to another. */
9
+ readonly app: string;
10
+ readonly threadId: string;
11
+ readonly turnId: string;
12
+ /** `<hostId>/<agentId>`: a prompt cannot be replayed to another agent. */
13
+ readonly agent: string;
14
+ /** base64url SHA-256 of the prompt text */
15
+ readonly digest: string;
16
+ readonly at: number;
17
+ }
18
+ export interface AnswerStatement {
19
+ readonly v: 1;
20
+ readonly kind: "answer";
21
+ readonly app: string;
22
+ readonly threadId: string;
23
+ readonly askId: string;
24
+ /** An option id, `"declined"`, or the digest of a form's values. */
25
+ readonly choice: string;
26
+ readonly at: number;
27
+ }
28
+ /** A linked device's word that the device behind `commitment` is the user's. */
29
+ export interface VouchStatement {
30
+ readonly v: 1;
31
+ readonly kind: "vouch";
32
+ readonly app: string;
33
+ readonly voucher: string;
34
+ readonly device: string;
35
+ /** `deviceCommitment` of the new device's keys, as the voucher checked it. */
36
+ readonly commitment: string;
37
+ readonly at: number;
38
+ }
39
+ /** A linked device's word, with presence, that `device` should no longer use the user's agents. */
40
+ export interface RemoveStatement {
41
+ readonly v: 1;
42
+ readonly kind: "remove";
43
+ readonly app: string;
44
+ readonly actor: string;
45
+ readonly device: string;
46
+ readonly at: number;
47
+ }
48
+ export type Statement = PromptStatement | AnswerStatement | VouchStatement | RemoveStatement;
49
+ export interface Signed<S extends Statement> {
50
+ readonly statement: S;
51
+ readonly deviceId: DeviceId;
52
+ readonly signature: S extends AnswerStatement ? DeviceSignature | PresenceSignature : S extends VouchStatement | RemoveStatement ? PresenceSignature : DeviceSignature;
53
+ }
54
+ /** A device key the verifier pinned itself, never one that travelled with the statement. */
55
+ export interface PinnedDevice {
56
+ readonly deviceId: DeviceId;
57
+ readonly signingKey: JsonWebKey;
58
+ readonly presenceKey?: PresenceKey | undefined;
59
+ }
60
+ export type VerifyOutcome = "valid" | "invalid" | "stale" | "presence_required";
61
+ export interface VerifyOptions {
62
+ readonly requirePresence: boolean;
63
+ readonly now: number;
64
+ readonly maxAgeMs: number;
65
+ }
66
+ export declare function promptStatement(app: string, prompt: PromptToSign, at: number): Promise<PromptStatement>;
67
+ export declare function answerStatement(app: string, answer: AnswerToSign, at: number): Promise<AnswerStatement>;
68
+ export declare function signedPrompt(app: string, item: LoggedItem<"prompt">): Promise<Signed<PromptStatement> | undefined>;
69
+ export declare function statementBytes(statement: Statement): Uint8Array;
70
+ export declare const LINK_CODE_LENGTH = 10;
71
+ /**
72
+ * What a new device shows to be linked: a hash of its keys, so whoever links it checks the
73
+ * keys the backend hands over are the ones this device holds.
74
+ */
75
+ export declare function deviceCommitment(app: string, deviceId: string, signingKey: JsonWebKey, presenceKey: JsonWebKey | undefined): Promise<string>;
76
+ /** The commitment's first 50 bits in Crockford base32, short enough to type. */
77
+ export declare function linkCode(commitment: string): string;
78
+ /** Upper case, no separators, the letters Crockford reads as digits mapped back. */
79
+ export declare function normalizeLinkCode(typed: string): string;
80
+ export declare function formatLinkCode(code: string): string;
81
+ export declare function vouchStatement(app: string, voucher: string, device: string, commitment: string, at: number): VouchStatement;
82
+ export declare function removeStatement(app: string, actor: string, device: string, at: number): RemoveStatement;
83
+ /** The fragment Parlor Host's loopback redirect carries back to the browser that approved `connect`. */
84
+ export declare const HOST_PAIRING_FRAGMENT = "parlor-host-pairing";
85
+ /**
86
+ * The browser that approved `connect` gets the host's pairing secret through the loopback
87
+ * redirect, never through the app; this binds it to one device's keys.
88
+ */
89
+ export declare function pairingProof(secret: string, deviceId: string, signingKey: JsonWebKey): Promise<string>;
90
+ export declare function checkPairingProof(secret: string, proof: string, deviceId: string, signingKey: JsonWebKey): Promise<boolean>;
91
+ export declare function verifyStatement(signed: Signed<Statement>, pinned: PinnedDevice, options: VerifyOptions): Promise<VerifyOutcome>;
92
+ //# sourceMappingURL=statements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statements.d.ts","sourceRoot":"","sources":["../src/statements.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,199 @@
1
+ import { canonicalBytes, decodeBase64url, encodeBase64url, } from "@parlor/capabilities/encoding";
2
+ import { derToRaw, verifyEs256 } from "./es256.js";
3
+ const FUTURE_SKEW_MS = 5 * 60_000;
4
+ const USER_PRESENT = 0x01;
5
+ const USER_VERIFIED = 0x04;
6
+ const AUTH_DATA_MIN_BYTES = 37;
7
+ const sha256 = async (bytes) => new Uint8Array(await crypto.subtle.digest("SHA-256", new Uint8Array(bytes)));
8
+ const digestOf = async (bytes) => encodeBase64url(await sha256(bytes));
9
+ export async function promptStatement(app, prompt, at) {
10
+ return {
11
+ v: 1,
12
+ kind: "prompt",
13
+ app,
14
+ threadId: prompt.threadId,
15
+ turnId: prompt.turnId,
16
+ agent: `${prompt.agent.hostId}/${prompt.agent.agentId}`,
17
+ digest: await digestOf(new TextEncoder().encode(prompt.text)),
18
+ at,
19
+ };
20
+ }
21
+ export async function answerStatement(app, answer, at) {
22
+ return {
23
+ v: 1,
24
+ kind: "answer",
25
+ app,
26
+ threadId: answer.threadId,
27
+ askId: answer.askId,
28
+ choice: answer.values === undefined
29
+ ? answer.choice
30
+ : await digestOf(canonicalBytes({ choice: answer.choice, values: answer.values })),
31
+ at,
32
+ };
33
+ }
34
+ export async function signedPrompt(app, item) {
35
+ const { signed, agent, text } = item.body;
36
+ if (!signed)
37
+ return undefined;
38
+ return {
39
+ statement: await promptStatement(app, { threadId: item.threadId, turnId: item.turnId, agent, text }, signed.at),
40
+ deviceId: signed.deviceId,
41
+ signature: signed.signature,
42
+ };
43
+ }
44
+ export function statementBytes(statement) {
45
+ return canonicalBytes(statement);
46
+ }
47
+ const CROCKFORD = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
48
+ export const LINK_CODE_LENGTH = 10;
49
+ /**
50
+ * What a new device shows to be linked: a hash of its keys, so whoever links it checks the
51
+ * keys the backend hands over are the ones this device holds.
52
+ */
53
+ export async function deviceCommitment(app, deviceId, signingKey, presenceKey) {
54
+ const point = (key) => ({ crv: key.crv, kty: key.kty, x: key.x, y: key.y });
55
+ return digestOf(canonicalBytes({
56
+ v: 1,
57
+ kind: "device",
58
+ app: new URL(app).origin,
59
+ deviceId,
60
+ signing: point(signingKey),
61
+ presence: presenceKey ? point(presenceKey) : null,
62
+ }));
63
+ }
64
+ /** The commitment's first 50 bits in Crockford base32, short enough to type. */
65
+ export function linkCode(commitment) {
66
+ const bytes = decodeBase64url(commitment);
67
+ let bits = 0n;
68
+ for (let index = 0; index < 7; index += 1)
69
+ bits = (bits << 8n) | BigInt(bytes[index]);
70
+ bits >>= 6n;
71
+ let code = "";
72
+ for (let index = 0; index < LINK_CODE_LENGTH; index += 1) {
73
+ code = CROCKFORD[Number(bits & 31n)] + code;
74
+ bits >>= 5n;
75
+ }
76
+ return code;
77
+ }
78
+ /** Upper case, no separators, the letters Crockford reads as digits mapped back. */
79
+ export function normalizeLinkCode(typed) {
80
+ return typed
81
+ .toUpperCase()
82
+ .replace(/[\s-]/g, "")
83
+ .replace(/O/g, "0")
84
+ .replace(/[IL]/g, "1");
85
+ }
86
+ export function formatLinkCode(code) {
87
+ return `${code.slice(0, 4)}-${code.slice(4, 8)}-${code.slice(8)}`;
88
+ }
89
+ export function vouchStatement(app, voucher, device, commitment, at) {
90
+ return {
91
+ v: 1,
92
+ kind: "vouch",
93
+ app: new URL(app).origin,
94
+ voucher,
95
+ device,
96
+ commitment,
97
+ at,
98
+ };
99
+ }
100
+ export function removeStatement(app, actor, device, at) {
101
+ return { v: 1, kind: "remove", app: new URL(app).origin, actor, device, at };
102
+ }
103
+ /** The fragment Parlor Host's loopback redirect carries back to the browser that approved `connect`. */
104
+ export const HOST_PAIRING_FRAGMENT = "parlor-host-pairing";
105
+ const pairingKey = (secret) => crypto.subtle.importKey("raw", new Uint8Array(decodeBase64url(secret)), { name: "HMAC", hash: "SHA-256" }, false, ["sign", "verify"]);
106
+ const pairingBytes = (deviceId, signingKey) => canonicalBytes({
107
+ v: 1,
108
+ kind: "pairing",
109
+ deviceId,
110
+ signingKey: {
111
+ crv: signingKey.crv,
112
+ kty: signingKey.kty,
113
+ x: signingKey.x,
114
+ y: signingKey.y,
115
+ },
116
+ });
117
+ /**
118
+ * The browser that approved `connect` gets the host's pairing secret through the loopback
119
+ * redirect, never through the app; this binds it to one device's keys.
120
+ */
121
+ export async function pairingProof(secret, deviceId, signingKey) {
122
+ const mac = await crypto.subtle.sign("HMAC", await pairingKey(secret), new Uint8Array(pairingBytes(deviceId, signingKey)));
123
+ return encodeBase64url(new Uint8Array(mac));
124
+ }
125
+ export async function checkPairingProof(secret, proof, deviceId, signingKey) {
126
+ try {
127
+ return await crypto.subtle.verify("HMAC", await pairingKey(secret), new Uint8Array(decodeBase64url(proof)), new Uint8Array(pairingBytes(deviceId, signingKey)));
128
+ }
129
+ catch {
130
+ return false;
131
+ }
132
+ }
133
+ async function assertionHolds(statement, signature, presenceKey) {
134
+ if (presenceKey?.format !== "webauthn" || signature.presence !== "user")
135
+ return false;
136
+ if (signature.authenticatorData === undefined ||
137
+ signature.clientDataJSON === undefined) {
138
+ return false;
139
+ }
140
+ if (signature.keyId !== presenceKey.credentialId)
141
+ return false;
142
+ if (new URL(statement.app).hostname !== presenceKey.rpId)
143
+ return false;
144
+ const clientDataBytes = decodeBase64url(signature.clientDataJSON);
145
+ const clientData = JSON.parse(new TextDecoder().decode(clientDataBytes));
146
+ const challenge = await digestOf(statementBytes(statement));
147
+ if (clientData.type !== "webauthn.get" ||
148
+ clientData.challenge !== challenge ||
149
+ clientData.origin !== statement.app ||
150
+ clientData.crossOrigin === true) {
151
+ return false;
152
+ }
153
+ const authData = decodeBase64url(signature.authenticatorData);
154
+ const flags = authData[32];
155
+ if (authData.length < AUTH_DATA_MIN_BYTES || flags === undefined)
156
+ return false;
157
+ if ((flags & USER_PRESENT) === 0 || (flags & USER_VERIFIED) === 0)
158
+ return false;
159
+ const rpIdHash = await sha256(new TextEncoder().encode(presenceKey.rpId));
160
+ if (encodeBase64url(authData.slice(0, 32)) !== encodeBase64url(rpIdHash))
161
+ return false;
162
+ const raw = derToRaw(decodeBase64url(signature.signature));
163
+ if (!raw)
164
+ return false;
165
+ const signed = new Uint8Array([...authData, ...(await sha256(clientDataBytes))]);
166
+ return verifyEs256(presenceKey.publicKey, raw, signed);
167
+ }
168
+ async function signatureHolds(statement, signature, pinned) {
169
+ if (signature.format === "webauthn") {
170
+ return assertionHolds(statement, signature, pinned.presenceKey);
171
+ }
172
+ const bytes = statementBytes(statement);
173
+ const raw = decodeBase64url(signature.signature);
174
+ if (signature.presence === "none")
175
+ return verifyEs256(pinned.signingKey, raw, bytes);
176
+ const { presenceKey } = pinned;
177
+ return presenceKey?.format === "es256-raw"
178
+ ? verifyEs256(presenceKey.publicKey, raw, bytes)
179
+ : false;
180
+ }
181
+ export async function verifyStatement(signed, pinned, options) {
182
+ const { statement, signature } = signed;
183
+ if (signed.deviceId !== pinned.deviceId)
184
+ return "invalid";
185
+ if (options.now - statement.at > options.maxAgeMs)
186
+ return "stale";
187
+ if (statement.at - options.now > FUTURE_SKEW_MS)
188
+ return "invalid";
189
+ if (options.requirePresence && signature.presence !== "user") {
190
+ return "presence_required";
191
+ }
192
+ try {
193
+ return (await signatureHolds(statement, signature, pinned)) ? "valid" : "invalid";
194
+ }
195
+ catch {
196
+ return "invalid";
197
+ }
198
+ }
199
+ //# sourceMappingURL=statements.js.map