@snagset/server 0.1.16 → 0.1.19

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 (201) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +9 -10
  3. package/dist/app.js +51 -47
  4. package/dist/app.js.map +1 -1
  5. package/dist/bin.js +31 -32
  6. package/dist/bin.js.map +1 -1
  7. package/dist/boot.js +21 -21
  8. package/dist/boot.js.map +1 -1
  9. package/dist/config.generated.js +5 -8
  10. package/dist/config.generated.js.map +1 -1
  11. package/dist/config.js +14 -14
  12. package/dist/config.js.map +1 -1
  13. package/dist/crypto.js +1 -1
  14. package/dist/crypto.js.map +1 -1
  15. package/dist/db/connect.js +1 -1
  16. package/dist/db/migrate.js +11 -11
  17. package/dist/db/migrations/0010_round_archive.sql +23 -0
  18. package/dist/db/rls.js +3 -3
  19. package/dist/db/rls.js.map +1 -1
  20. package/dist/domain.js +73 -5
  21. package/dist/domain.js.map +1 -1
  22. package/dist/explain.js +1 -1
  23. package/dist/instance/address.js +3 -3
  24. package/dist/instance/address.js.map +1 -1
  25. package/dist/instance/settings.js +1 -1
  26. package/dist/integrations/github.js +3 -3
  27. package/dist/integrations/github.js.map +1 -1
  28. package/dist/integrations/inbound.js +3 -3
  29. package/dist/integrations/inbound.js.map +1 -1
  30. package/dist/integrations/linear.js +1 -1
  31. package/dist/integrations/linear.js.map +1 -1
  32. package/dist/integrations/outbox.js +4 -4
  33. package/dist/integrations/outbox.js.map +1 -1
  34. package/dist/integrations/slack.js +2 -2
  35. package/dist/integrations/slack.js.map +1 -1
  36. package/dist/jobs/index.js +3 -3
  37. package/dist/jobs/reaper.js +11 -11
  38. package/dist/jobs/reaper.js.map +1 -1
  39. package/dist/jobs/set.js +3 -3
  40. package/dist/jobs/set.js.map +1 -1
  41. package/dist/jobs/soon.js +3 -3
  42. package/dist/keys.js +3 -3
  43. package/dist/keys.js.map +1 -1
  44. package/dist/listen.js +3 -3
  45. package/dist/listen.js.map +1 -1
  46. package/dist/mail/assigned.js +10 -10
  47. package/dist/mail/assigned.js.map +1 -1
  48. package/dist/mail/digest.js +3 -3
  49. package/dist/mail/digest.js.map +1 -1
  50. package/dist/mail/index.js +2 -2
  51. package/dist/mail/links.js +5 -5
  52. package/dist/mail/mailer.js +2 -2
  53. package/dist/mail/notify.js +22 -22
  54. package/dist/mail/notify.js.map +1 -1
  55. package/dist/mail/resend.js +1 -1
  56. package/dist/mail/resolve.js +1 -1
  57. package/dist/mail/resolve.js.map +1 -1
  58. package/dist/mail/smtp.js +1 -1
  59. package/dist/mail/unsubscribe.js +1 -1
  60. package/dist/net/publicFetch.js +1 -1
  61. package/dist/orgs.js +5 -5
  62. package/dist/orgs.js.map +1 -1
  63. package/dist/plan.js +1 -1
  64. package/dist/projects.js +4 -4
  65. package/dist/projects.js.map +1 -1
  66. package/dist/routes/account.js +1 -1
  67. package/dist/routes/account.js.map +1 -1
  68. package/dist/routes/activity.js +1 -1
  69. package/dist/routes/anchorReports.js +9 -9
  70. package/dist/routes/anchorReports.js.map +1 -1
  71. package/dist/routes/assignees.js +4 -4
  72. package/dist/routes/assignees.js.map +1 -1
  73. package/dist/routes/attachments.js +6 -6
  74. package/dist/routes/attachments.js.map +1 -1
  75. package/dist/routes/auth.js +4 -4
  76. package/dist/routes/bodyLimit.js +5 -5
  77. package/dist/routes/bodyLimit.js.map +1 -1
  78. package/dist/routes/commentEdit.js +5 -5
  79. package/dist/routes/commentEdit.js.map +1 -1
  80. package/dist/routes/comments.js +24 -24
  81. package/dist/routes/comments.js.map +1 -1
  82. package/dist/routes/cors.js +33 -15
  83. package/dist/routes/cors.js.map +1 -1
  84. package/dist/routes/instance.js +3 -3
  85. package/dist/routes/instance.js.map +1 -1
  86. package/dist/routes/integrations.js +14 -11
  87. package/dist/routes/integrations.js.map +1 -1
  88. package/dist/routes/invites.js +7 -7
  89. package/dist/routes/invites.js.map +1 -1
  90. package/dist/routes/mcpAuth.js +13 -13
  91. package/dist/routes/mcpAuth.js.map +1 -1
  92. package/dist/routes/mcpToken.js +4 -4
  93. package/dist/routes/mcpToken.js.map +1 -1
  94. package/dist/routes/mcpTokens.js +27 -14
  95. package/dist/routes/mcpTokens.js.map +1 -1
  96. package/dist/routes/members.js +9 -5
  97. package/dist/routes/members.js.map +1 -1
  98. package/dist/routes/owner.js +13 -13
  99. package/dist/routes/owner.js.map +1 -1
  100. package/dist/routes/reviewLinks.js +4 -4
  101. package/dist/routes/reviewLinks.js.map +1 -1
  102. package/dist/routes/rounds.js +131 -38
  103. package/dist/routes/rounds.js.map +1 -1
  104. package/dist/routes/sessions.js +190 -73
  105. package/dist/routes/sessions.js.map +1 -1
  106. package/dist/routes/sites.js +9 -9
  107. package/dist/routes/sites.js.map +1 -1
  108. package/dist/routes/threads.js +298 -141
  109. package/dist/routes/threads.js.map +1 -1
  110. package/dist/routes/widget.js +5 -5
  111. package/dist/routes/widget.js.map +1 -1
  112. package/dist/serverless.js +4 -4
  113. package/dist/serverless.js.map +1 -1
  114. package/dist/session.js +8 -8
  115. package/dist/session.js.map +1 -1
  116. package/dist/storage/bucket.js +4 -4
  117. package/dist/storage/bucket.js.map +1 -1
  118. package/dist/storage/settings.js +4 -4
  119. package/dist/storage/settings.js.map +1 -1
  120. package/dist/studioReviewers.js +4 -4
  121. package/dist/vendor/adapters/outbound/fence.js +2 -2
  122. package/dist/vendor/adapters/outbound/sanitise.js +14 -14
  123. package/dist/vendor/mcp/bin.js +4 -4
  124. package/dist/vendor/mcp/client.js +3 -3
  125. package/dist/vendor/mcp/server.js +3 -3
  126. package/dist/vendor/mcp/source.js +13 -13
  127. package/dist/vendor/mcp/view.js +15 -15
  128. package/dist/vendor/types/brief.js +2 -2
  129. package/dist/vendor/types/index.js +1 -1
  130. package/dist/vendor/types/names.js +20 -18
  131. package/dist/vendor/widget/object.js +3 -3
  132. package/dist/vendor/widget/predicates.js +38 -39
  133. package/package.json +1 -5
  134. package/static/dashboard/assets/{CompositeItem-DP7FLsIz.js → CompositeItem-wqcRki5s.js} +1 -1
  135. package/static/dashboard/assets/{ConfirmDialog-B-mNmk6U.js → ConfirmDialog-BqK5eJxB.js} +1 -1
  136. package/static/dashboard/assets/{CopyButton-bsaLPvqU.js → CopyButton-Cc4nF6JB.js} +1 -1
  137. package/static/dashboard/assets/{FieldItemContext-Cz9anwiZ.js → FieldItemContext-DVLVe_H8.js} +1 -1
  138. package/static/dashboard/assets/{InstallTag-DDMHFPFi.js → InstallTag-DCRj1B-Z.js} +1 -1
  139. package/static/dashboard/assets/{SaveState-rgq6rRHH.js → SaveState-B5TIvzLh.js} +1 -1
  140. package/static/dashboard/assets/{_app-B--Q2p1D.js → _app-BOhhOcC-.js} +1 -1
  141. package/static/dashboard/assets/{_app-C5aeP_jI.js → _app-DdvP8iZf.js} +1 -1
  142. package/static/dashboard/assets/{activity-CmpMwfWp.js → activity-CaCW3Nql.js} +1 -1
  143. package/static/dashboard/assets/{arrow-left-BN3lUG8m.js → arrow-left-B5Z7SkRz.js} +1 -1
  144. package/static/dashboard/assets/{avatar-4OkpxHzf.js → avatar-CFgdRtiV.js} +1 -1
  145. package/static/dashboard/assets/{badge-BGUQxxes.js → badge-BIVx2feC.js} +1 -1
  146. package/static/dashboard/assets/{card-BX32udhB.js → card-HwCaU_bv.js} +1 -1
  147. package/static/dashboard/assets/{check-DjkY9Lhe.js → check-CMqBU0e3.js} +1 -1
  148. package/static/dashboard/assets/{chevron-right-w26JMtvi.js → chevron-right-CY_sUg3i.js} +1 -1
  149. package/static/dashboard/assets/{copy-BtOpNPn3.js → copy-Cn6p0txj.js} +1 -1
  150. package/static/dashboard/assets/{dialog-Ca351GqX.js → dialog-_GPHTnXl.js} +2 -2
  151. package/static/dashboard/assets/{dropdown-menu-BdM8D0_i.js → dropdown-menu-BEcLmKR6.js} +1 -1
  152. package/static/dashboard/assets/{image-off-DBc5pfc8.js → image-off-CyXpcTZd.js} +1 -1
  153. package/static/dashboard/assets/{index-Bvmz5Xph.js → index-BZAfm4kX.js} +14 -14
  154. package/static/dashboard/assets/index-BzWDSuyB.css +1 -0
  155. package/static/dashboard/assets/{invite-b1vVPR4n.js → invite-iirWwB3z.js} +1 -1
  156. package/static/dashboard/assets/{label-CeHVAC98.js → label-C9GdL6JP.js} +1 -1
  157. package/static/dashboard/assets/{layout-grid-BJUJgcuD.js → layout-grid-3hfjyzci.js} +1 -1
  158. package/static/dashboard/assets/me-Bgw9jS9F.js +1 -0
  159. package/static/dashboard/assets/{parts-BU_5BLga.js → parts-BOtvDu_v.js} +1 -1
  160. package/static/dashboard/assets/{plus-DW3meZh8.js → plus-CTKInfcq.js} +1 -1
  161. package/static/dashboard/assets/s._site-Bi7roN7x.js +1 -0
  162. package/static/dashboard/assets/s._site.comments-DZBq2FkM.js +54 -0
  163. package/static/dashboard/assets/s._site.reviewers-YfizOkhz.js +1 -0
  164. package/static/dashboard/assets/s._site.settings-Dbua1pYa.js +1 -0
  165. package/static/dashboard/assets/{setup-B5fdtoM-.js → setup-4E2PxysX.js} +1 -1
  166. package/static/dashboard/assets/{sign-in-D9Bhw619.js → sign-in-Nda93fWo.js} +1 -1
  167. package/static/dashboard/assets/{sign-up-CK-LWLzn.js → sign-up-kWIqmM8W.js} +1 -1
  168. package/static/dashboard/assets/{sites-CLB6RzU6.js → sites-DbhDznKA.js} +1 -1
  169. package/static/dashboard/assets/studio-MNEmZ3n7.js +1 -0
  170. package/static/dashboard/assets/{studio-CVFUbJQb.js → studio-ml7KCROJ.js} +1 -1
  171. package/static/dashboard/assets/{studio.index-CUtMjh5_.js → studio.index-CZXgB0jx.js} +1 -1
  172. package/static/dashboard/assets/studio.integrations-OprNYBrJ.js +1 -0
  173. package/static/dashboard/assets/{studio.members-BcVrAT7r.js → studio.members-DT93LEwF.js} +1 -1
  174. package/static/dashboard/assets/{sun-BzCBfLxA.js → sun--lA9pLT9.js} +1 -1
  175. package/static/dashboard/assets/{switch-Djsy8JA6.js → switch-BCNx3nDC.js} +1 -1
  176. package/static/dashboard/assets/{table-Cnpowiv-.js → table-B1e35-OI.js} +1 -1
  177. package/static/dashboard/assets/{useAriaLabelledBy-D35XdVIh.js → useAriaLabelledBy-BLgC8mE_.js} +1 -1
  178. package/static/dashboard/assets/{useBaseQuery-DztMyAqa.js → useBaseQuery-CZkDX1tZ.js} +1 -1
  179. package/static/dashboard/assets/useQuery-C0BVsxqZ.js +1 -0
  180. package/static/dashboard/assets/useRender-P5Wj_Sbt.js +1 -0
  181. package/static/dashboard/assets/{useValueChanged-DY7n1sYE.js → useValueChanged-CCRl5Bf5.js} +1 -1
  182. package/static/dashboard/assets/{users-CR2o4PsB.js → users-DCeMsa2g.js} +1 -1
  183. package/static/dashboard/assets/{welcome-DJ_8xHTE.js → welcome-Il9zYmvM.js} +1 -1
  184. package/static/dashboard/assets/{widget-signin-BOulktuR.js → widget-signin-BLNsOS5K.js} +1 -1
  185. package/static/dashboard/assets/{you-DJGezimL.js → you-B2lWBXCD.js} +1 -1
  186. package/static/dashboard/assets/{zod-4RphBaVj.js → zod-DG4VLz0r.js} +1 -1
  187. package/static/dashboard/index.html +2 -2
  188. package/static/widget/snag.capture.js +1 -1
  189. package/static/widget/snag.dock.js +2 -2
  190. package/static/widget/snag.panels.js +2 -2
  191. package/static/widget/snag.runtime.js +2 -2
  192. package/static/dashboard/assets/index-DAgnfv_E.css +0 -1
  193. package/static/dashboard/assets/me-zNn3-t75.js +0 -1
  194. package/static/dashboard/assets/s._site-DP3hLlXp.js +0 -1
  195. package/static/dashboard/assets/s._site.comments-CyIqVrl3.js +0 -54
  196. package/static/dashboard/assets/s._site.reviewers-muaVzTtT.js +0 -1
  197. package/static/dashboard/assets/s._site.settings-Bow6VdXW.js +0 -1
  198. package/static/dashboard/assets/studio-CuiXjnSt.js +0 -1
  199. package/static/dashboard/assets/studio.integrations-CiQ83f7Q.js +0 -1
  200. package/static/dashboard/assets/useQuery-DCEPkmeo.js +0 -1
  201. package/static/dashboard/assets/useRender-C2NyqaXd.js +0 -1
@@ -6,6 +6,7 @@ import { mintSession, verifySession, withinRefreshWindow } from "../session.js";
6
6
  import { inOrg } from "../db/scope.js";
7
7
  import { studioReviewerId } from "../studioReviewers.js";
8
8
  import { allowedOrigins, originPermitted } from "./cors.js";
9
+ import { sameSite } from "../domain.js";
9
10
  function fail(c, status, code, message) {
10
11
  return c.json({ error: { code, message, requestId: c.get("requestId") } }, status);
11
12
  }
@@ -13,7 +14,7 @@ function fail(c, status, code, message) {
13
14
  * hash is taken over the string that arrived on the wire, never a re-decode. */
14
15
  const sha256 = (s) => createHash("sha256").update(s, "utf8").digest();
15
16
  const mintSecret = () => randomBytes(32).toString("base64url");
16
- /** `prj_…`/`rev_…` — the row id is bare, the wire form is prefixed (§2.10). */
17
+ /** `prj_…`/`rev_…` — the row id is bare, the wire form is prefixed. */
17
18
  const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
18
19
  function rowId(wire, prefix) {
19
20
  if (typeof wire !== "string")
@@ -21,13 +22,13 @@ function rowId(wire, prefix) {
21
22
  const bare = wire.startsWith(prefix) ? wire.slice(prefix.length) : wire;
22
23
  return UUID.test(bare) ? bare.toLowerCase() : null;
23
24
  }
24
- /** §3.4's default: what an ordinary client link may do. */
25
+ /** The default: what an ordinary client link may do. */
25
26
  const CLIENT_PERMISSIONS = ["thread:create", "comment:create", "thread:resolve", "thread:delete:own"];
26
27
  /**
27
- * 05 §4.2's read-time downgrade. There is no jobs engine yet (05 §3.11 item
28
- * 12, the reaper), so `write_mode = 'open'` past its `write_mode_downgrade_at`
28
+ * The read-time downgrade. There is no jobs engine yet (
29
+ * the reaper), so `write_mode = 'open'` past its `write_mode_downgrade_at`
29
30
  * is evaluated HERE, on every session mint, rather than flipped by a
30
- * background pass. When M2-31's `runDueJobs` lands it should ALSO persist the
31
+ * background pass. When the `runDueJobs` lands it should ALSO persist the
31
32
  * downgrade (`UPDATE projects SET write_mode = 'link-required', … WHERE …`) so
32
33
  * this stays a fallback rather than the only enforcement — but a session
33
34
  * request must never trust a `write_mode` column that could be 24 hours
@@ -42,14 +43,14 @@ export function effectiveWriteMode(row, at) {
42
43
  return row.write_mode;
43
44
  }
44
45
  /**
45
- * `perm` is computed ONCE, from the credential, here — §4.4's table.
46
+ * `perm` is computed ONCE, from the credential, here — the table.
46
47
  *
47
48
  * *"Nothing about visibility is ever taken from the request. Not a header, not
48
49
  * a query parameter, not a field on the body, not the reviewer's own claim
49
50
  * about themselves."* `thread:private` and `thread:assign` decide whether a
50
51
  * session sees team-only threads, so the only route by which a widget session
51
52
  * gets them is a review link whose stored `permissions` already contain them —
52
- * the "team link" of §3.4.
53
+ * the "team link".
53
54
  */
54
55
  function permissionsFor(kind, link) {
55
56
  if (kind === "guest")
@@ -61,12 +62,14 @@ function permissionsFor(kind, link) {
61
62
  return CLIENT_PERMISSIONS;
62
63
  }
63
64
  /**
64
- * What a studio member signed in from the widget may do (D122) — the team
65
- * link's set (§3.4), every permission there is. They are the studio: the
65
+ * What a studio member signed in from the widget may do — the team
66
+ * link's set, every permission there is. They are the studio: the
66
67
  * dashboard already shows them team-only threads and lets them assign, and a
67
68
  * widget that showed them less than the dashboard would be a second, smaller
68
69
  * idea of who they are.
69
70
  */
71
+ /** A silently-minted member session's absolute cap. */
72
+ const SILENT_CAP_S = 12 * 60 * 60;
70
73
  const MEMBER_PERMISSIONS = [
71
74
  "thread:create",
72
75
  "comment:create",
@@ -132,7 +135,7 @@ export function sessionRoutes(deps) {
132
135
  }
133
136
  if (!project)
134
137
  return fail(c, 404, "project_not_found", "No project with that uid.");
135
- // §6.9's codes, not §4.5.1's blanket 401: a paused project is 403 and a
138
+ // The codes, not the blanket 401: a paused project is 403 and a
136
139
  // disabled one 410 everywhere else in this API, and a client branches on
137
140
  // the status class. "Your token is wrong" and "this project is switched
138
141
  // off" are different problems with different next steps.
@@ -155,7 +158,7 @@ export function sessionRoutes(deps) {
155
158
  const body = (await c.req.json().catch(() => null));
156
159
  if (!body)
157
160
  return fail(c, 400, "validation_failed", "A JSON body is required.");
158
- // §4.4, and A31's shape of rule: a request that tries to grant itself
161
+ // And the shape of rule: a request that tries to grant itself
159
162
  // visibility is refused rather than ignored, because silently dropping the
160
163
  // field teaches the caller it worked.
161
164
  for (const forbidden of ["role", "isTeam", "includePrivate", "permissions", "perm"]) {
@@ -165,7 +168,7 @@ export function sessionRoutes(deps) {
165
168
  }
166
169
  const bearer = /^Bearer (.+)$/i.exec(c.req.header("Authorization") ?? "")?.[1];
167
170
  const identity = body.identity;
168
- // ── REFRESH: a bearer and no identity (§4.4). Silent, and the whole reason
171
+ // ── REFRESH: a bearer and no identity. Silent, and the whole reason
169
172
  // a reviewer is not asked to re-open their link four times an afternoon.
170
173
  if (bearer && !identity) {
171
174
  const v = await verifySession(keys, bearer, {
@@ -179,7 +182,7 @@ export function sessionRoutes(deps) {
179
182
  const code = v.reason === "session_revoked" ? "session_revoked" : "unauthorized";
180
183
  return fail(c, 401, code, "That session is no longer valid. Re-open your review link to continue.");
181
184
  }
182
- // A link session re-checks the link on refresh (§4.4): revocation is
185
+ // A link session re-checks the link on refresh: revocation is
183
186
  // instant at exchange AND on every refresh, which is what bounds how long
184
187
  // a revoked link keeps working to one sliding window.
185
188
  let linkExpiresAt;
@@ -196,7 +199,7 @@ export function sessionRoutes(deps) {
196
199
  return fail(c, 401, "session_expired", "This review session has reached its limit. Re-open your review link.");
197
200
  }
198
201
  /**
199
- * `in_studio` is D122's re-check, in the same round trip. A STUDIO
202
+ * `in_studio` is the re-check, in the same round trip. A STUDIO
200
203
  * MEMBER'S widget session (`sub` a reviewer row with `user_id` set) is
201
204
  * only as good as the membership it was minted from: removed from the
202
205
  * studio, made a viewer, or their account deleted, and the next refresh
@@ -243,21 +246,21 @@ export function sessionRoutes(deps) {
243
246
  return fail(c, 400, "validation_failed", "identity.kind is required (guest or link).");
244
247
  }
245
248
  if (identity.kind === "verified") {
246
- // §4.6's HMAC handshake is M2-19. Saying so beats a 500.
249
+ // The HMAC handshake is. Saying so beats a 500.
247
250
  return fail(c, 501, "not_implemented", "Verified identity is not available on this build yet.");
248
251
  }
249
252
  if (identity.kind !== "guest" && identity.kind !== "link") {
250
253
  return fail(c, 400, "validation_failed", `Unknown identity kind "${identity.kind}".`);
251
254
  }
252
- // ── §4.2's write-mode gate. This is what closed the hole: a project past
255
+ // ── the write-mode gate. This is what closed the hole: a project past
253
256
  // `open`'s grace window (or minted `link-required`/`verified-only`)
254
257
  // used to mint a guest session anyway, because nothing here ever read
255
258
  // `write_mode`. `verified-only` is checked FIRST: neither a `guest`
256
259
  // identity (no credential at all) nor a `link` identity is ever
257
260
  // `verified`, so both must be refused before the guest/link check
258
261
  // below gets a chance to mislabel a verified-only rejection as
259
- // "get a link" (specs/05-api-data.md §6.9 registers the two codes
260
- // this way, and §4.2's table maps mode -> code the same way; a
262
+ // "get a link" (registers the two codes
263
+ // this way, and the table maps mode -> code the same way; a
261
264
  // guest-first ordering here made a verified-only project answer
262
265
  // guests with 403 link_required instead of verified_identity_required
263
266
  // — a link would not have helped them). Only once verified-only is
@@ -276,7 +279,7 @@ export function sessionRoutes(deps) {
276
279
  if (!environment) {
277
280
  return fail(c, 400, "environment_not_found", envKey ? `This project has no environment called "${envKey}".` : "This project has no default environment.");
278
281
  }
279
- // ── §4.5.1's validation table, IN ORDER.
282
+ // ── the validation table, IN ORDER.
280
283
  let link = null;
281
284
  if (identity.kind === "link") {
282
285
  if (typeof identity.token !== "string" || !identity.token) {
@@ -285,7 +288,7 @@ export function sessionRoutes(deps) {
285
288
  // Looked up BY HASH, so an unknown token and a wrong one take the same
286
289
  // path — there is no row to compare against and therefore nothing to
287
290
  // compare in variable time.
288
- // T8: LEFT JOIN rounds so a round-pinned link can report the round
291
+ // LEFT JOIN rounds so a round-pinned link can report the round
289
292
  // NUMBER (what a reviewer and the widget both mean by "round"), not
290
293
  // just its opaque id -- rounds.id never left the server before this.
291
294
  const [found] = await inOrg(sql, project.org_id, (tx) => tx `
@@ -293,7 +296,9 @@ export function sessionRoutes(deps) {
293
296
  rl.allow_name_override, rl.name, rl.email,
294
297
  rl.max_uses, rl.use_count, rl.expires_at, rl.revoked_at
295
298
  FROM review_links rl
296
- LEFT JOIN rounds rd ON rd.id = rl.round_id
299
+ -- An archived or deleted round pins nothing: the link widens
300
+ -- to the default, as it does when the round row is gone.
301
+ LEFT JOIN rounds rd ON rd.id = rl.round_id AND rd.deleted_at IS NULL AND rd.archived_at IS NULL
297
302
  WHERE rl.project_id = ${project.id} AND rl.token_hash = ${sha256(identity.token)}
298
303
  `);
299
304
  if (!found)
@@ -310,7 +315,7 @@ export function sessionRoutes(deps) {
310
315
  }
311
316
  const kind = identity.kind;
312
317
  const permissions = permissionsFor(kind, link);
313
- // ── The reviewer. §4.4.1: the SERVER mints the holder secret and returns
318
+ // ── The reviewer.: the SERVER mints the holder secret and returns
314
319
  // it once; later exchanges present it back.
315
320
  const presented = typeof identity.holderSecret === "string" ? identity.holderSecret : null;
316
321
  const presentedId = rowId(identity.holderId, ID_PREFIX.reviewer);
@@ -329,7 +334,7 @@ export function sessionRoutes(deps) {
329
334
  AND holder_secret_hash = ${sha256(presented)}
330
335
  AND blocked_at IS NULL AND erased_at IS NULL
331
336
  `);
332
- // §4.4.1: "a mismatch does NOT error — it silently mints a new guest
337
+ // "a mismatch does NOT error — it silently mints a new guest
333
338
  // identity, because a stale storage entry must never lock a reviewer
334
339
  // out." So this is an `if`, not a guard clause.
335
340
  if (existing) {
@@ -343,7 +348,7 @@ export function sessionRoutes(deps) {
343
348
  }
344
349
  }
345
350
  if (!reviewerId) {
346
- // §4.5.1's `max_uses` check happens HERE, not above, because it counts
351
+ // The `max_uses` check happens HERE, not above, because it counts
347
352
  // PEOPLE: a holder who already has a row is readmitted even on an
348
353
  // exhausted link, and only a genuinely new person is refused.
349
354
  if (link && link.max_uses !== null && link.use_count >= link.max_uses) {
@@ -361,7 +366,7 @@ export function sessionRoutes(deps) {
361
366
  DO NOTHING
362
367
  RETURNING id
363
368
  `;
364
- // §4.5: use_count increments ONLY on a returned id — that is what makes
369
+ // Use_count increments ONLY on a returned id — that is what makes
365
370
  // it count people rather than exchanges. `last_used_at` rides along, so
366
371
  // an exchange is one extra statement rather than two.
367
372
  if (rows[0] && link) {
@@ -404,21 +409,76 @@ export function sessionRoutes(deps) {
404
409
  expiresAt: minted.expiresAt.toISOString(),
405
410
  refreshableUntil: minted.refreshableUntil.toISOString(),
406
411
  reviewer: { id: ID_PREFIX.reviewer + reviewerId, name: reviewerName, kind },
407
- // Returned ONCE, on first creation of this person (§4.4.1). Absent on
412
+ // Returned ONCE, on first creation of this person. Absent on
408
413
  // every later exchange, which is how the client knows to keep the one
409
414
  // it has.
410
415
  ...(holderSecret ? { holderSecret } : {}),
411
416
  environment,
412
417
  permissions,
413
- // T8: `number` alongside `id` -- the widget stores the NUMBER beside
418
+ // `number` alongside `id` -- the widget stores the NUMBER beside
414
419
  // the bearer and passes `?round=<number>` on `GET …/threads`; the
415
420
  // internal `rounds.id` is never a query param anywhere in 05.
416
- ...(link?.round_id ? { round: { id: link.round_id, number: link.round_number } } : {}),
421
+ ...(link?.round_id && link.round_number ? { round: { id: link.round_id, number: link.round_number } } : {}),
417
422
  serverTime: now().toISOString(),
418
423
  }, 201);
419
424
  });
420
425
  /**
421
- * `POST /api/v1/projects/{uid}/sessions/member` — D122, "Sign in with
426
+ * The member session itself, for an owner whose studio, role and origin the
427
+ * caller has already checked — shared by the popup's route and the silent
428
+ * one, so the two cannot drift into two ideas of what a member's
429
+ * session is.
430
+ */
431
+ const mintMember = async (c, owner, project, uid, origin, envKey,
432
+ /** The absolute cap for this session; the instance's, unless shorter. */
433
+ capS = ttls.absoluteS) => {
434
+ const environment = await environmentOf(project, envKey);
435
+ if (!environment) {
436
+ return fail(c, 400, "environment_not_found", envKey ? `This project has no environment called "${envKey}".` : "This project has no default environment.");
437
+ }
438
+ const reviewer = await inOrg(sql, project.org_id, async (tx) => {
439
+ const id = await studioReviewerId(tx, {
440
+ orgId: project.org_id,
441
+ projectId: project.id,
442
+ userId: owner.userId,
443
+ name: owner.name,
444
+ email: owner.email,
445
+ });
446
+ const [row] = await tx `
447
+ UPDATE reviewers SET last_seen_at = now() WHERE id = ${id}::uuid RETURNING id, name
448
+ `;
449
+ return row;
450
+ });
451
+ const nowS = Math.floor(now().getTime() / 1000);
452
+ const minted = await mintSession(keys, {
453
+ projectUid: uid,
454
+ reviewerId: reviewer.id,
455
+ environmentKey: environment.key,
456
+ kind: "verified",
457
+ reviewLinkId: null,
458
+ permissions: MEMBER_PERMISSIONS,
459
+ sessionEpoch: project.session_epoch,
460
+ iex: nowS + Math.min(capS, ttls.absoluteS),
461
+ }, ttls, now);
462
+ // The exchange's shape, so the widget stores it with the code it already
463
+ // has — plus `origin`, the one the dashboard must post to, echoed from
464
+ // the check above rather than re-derived on the page.
465
+ return c.json({
466
+ sessionToken: minted.token,
467
+ expiresAt: minted.expiresAt.toISOString(),
468
+ refreshableUntil: minted.refreshableUntil.toISOString(),
469
+ reviewer: { id: ID_PREFIX.reviewer + reviewer.id, name: reviewer.name, kind: "verified" },
470
+ environment,
471
+ permissions: MEMBER_PERMISSIONS,
472
+ // Owners and admins may delete anyone's comment from the widget, as in
473
+ // the dashboard — a hint for which controls to draw; the delete routes
474
+ // read the membership themselves (isStudioModerator).
475
+ moderator: owner.role === "owner" || owner.role === "admin",
476
+ origin,
477
+ serverTime: now().toISOString(),
478
+ }, 201);
479
+ };
480
+ /**
481
+ * `POST /api/v1/projects/{uid}/sessions/member`, "Sign in with
422
482
  * Snagset".
423
483
  *
424
484
  * A studio member reviewing a client's site from the widget was asked for
@@ -480,51 +540,108 @@ export function sessionRoutes(deps) {
480
540
  return fail(c, 403, "origin_not_allowed", `${origin} is not one of this site's addresses. Add it in the site's settings first.`);
481
541
  }
482
542
  const envKey = typeof body?.environment === "string" && body.environment ? body.environment : null;
483
- const environment = await environmentOf(project, envKey);
484
- if (!environment) {
485
- return fail(c, 400, "environment_not_found", envKey ? `This project has no environment called "${envKey}".` : "This project has no default environment.");
543
+ return mintMember(c, owner, project, uid, origin, envKey);
544
+ });
545
+ /**
546
+ * `POST /api/v1/projects/{uid}/sessions/member/silent`, the silent
547
+ * member sign-in for a client page on the SAME SITE as the dashboard.
548
+ *
549
+ * The studio's real setup is `snagset.studio.dev` for the dashboard and
550
+ * `acme.studio.dev` for the client's staging site: two origins, ONE site.
551
+ * A `SameSite=Lax` cookie is sent on any same-site request, credentialed
552
+ * fetches included, so the widget on acme.… can simply ask "am I a
553
+ * member?" with the dashboard cookie riding along — no popup, no click.
554
+ * On an unrelated client domain the browser sends nothing (cross-site), the
555
+ * answer is a cheap 401, and the popup stays the way in.
556
+ *
557
+ * WHY THE CLICK IS NOT NEEDED HERE, when the decision says it is not a courtesy:
558
+ * The click guards against a page that opens the popup and receives a
559
+ * token by `postMessage` without the member knowing. Here the token goes
560
+ * nowhere but the response body, and the browser lets only an origin this
561
+ * response names (`Access-Control-Allow-Origin` + credentials, cors.ts)
562
+ * read it — and every such origin is, by the checks below, one of the
563
+ * site's own addresses on the studio's own registrable domain. A page that
564
+ * can read this response is a page the widget is installed on, under a
565
+ * domain the studio controls.
566
+ *
567
+ * NO CSRF PAIR — the widget cannot read the dashboard's CSRF cookie (it is
568
+ * host-only on the server's host), so this route is NOT behind
569
+ * `requireOwner()` (app.ts mounts that on `…/sessions/member` exactly,
570
+ * which does not match this path). It is protected by three checks, and
571
+ * every one of them must pass:
572
+ *
573
+ * 1. `Sec-Fetch-Site` is `same-site` or `same-origin`. A Fetch Metadata
574
+ * header: set by the browser, not settable by page script, so a
575
+ * cross-site page cannot claim to be a neighbour. MISSING is a refusal
576
+ * — an old browser that does not send it uses the popup, as it always
577
+ * could.
578
+ * 2. `Origin` is exactly an origin, `originPermitted` accepts it for this
579
+ * site (the CORS layer's and the popup route's own verdict), AND it is
580
+ * the same site as this server's own host (`sameSite`, domain.ts:
581
+ * last two labels equal and not a shared hosting or registry suffix —
582
+ * two customers' `*.vercel.app` apps are NOT one site). Localhost
583
+ * only when the server is on localhost too.
584
+ * 3. A dashboard cookie session for a member of the site's studio whose
585
+ * role is not `viewer` — the popup route's own rule.
586
+ *
587
+ * The order is the cheap one: the two header checks touch nothing, and a
588
+ * page with no cookie (a CLIENT on a same-site staging page, which is most
589
+ * callers) gets its 401 before any query of this route's own — `ownerAuth`
590
+ * only queries when a cookie is present, and the project lookup the CORS
591
+ * layer did is cached.
592
+ *
593
+ * The body is optional and `text/plain` if present (`{"environment":"…"}`):
594
+ * a POST with no custom header and a safelisted content type is a CORS
595
+ * SIMPLE request, so there is no preflight round trip on every page load.
596
+ * (cors.ts answers a preflight correctly anyway.)
597
+ */
598
+ app.post("/api/v1/projects/:uid/sessions/member/silent", async (c) => {
599
+ const fetchSite = c.req.header("Sec-Fetch-Site");
600
+ if (fetchSite !== "same-site" && fetchSite !== "same-origin") {
601
+ return fail(c, 403, "forbidden", "Silent sign-in only answers a page on the dashboard's own site.");
486
602
  }
487
- const reviewer = await inOrg(sql, project.org_id, async (tx) => {
488
- const id = await studioReviewerId(tx, {
489
- orgId: project.org_id,
490
- projectId: project.id,
491
- userId: owner.userId,
492
- name: owner.name,
493
- email: owner.email,
494
- });
495
- const [row] = await tx `
496
- UPDATE reviewers SET last_seen_at = now() WHERE id = ${id}::uuid RETURNING id, name
497
- `;
498
- return row;
499
- });
500
- const nowS = Math.floor(now().getTime() / 1000);
501
- const minted = await mintSession(keys, {
502
- projectUid: uid,
503
- reviewerId: reviewer.id,
504
- environmentKey: environment.key,
505
- kind: "verified",
506
- reviewLinkId: null,
507
- permissions: MEMBER_PERMISSIONS,
508
- sessionEpoch: project.session_epoch,
509
- iex: nowS + ttls.absoluteS,
510
- }, ttls, now);
511
- // The exchange's shape, so the widget stores it with the code it already
512
- // has — plus `origin`, the one the dashboard must post to, echoed from
513
- // the check above rather than re-derived on the page.
514
- return c.json({
515
- sessionToken: minted.token,
516
- expiresAt: minted.expiresAt.toISOString(),
517
- refreshableUntil: minted.refreshableUntil.toISOString(),
518
- reviewer: { id: ID_PREFIX.reviewer + reviewer.id, name: reviewer.name, kind: "verified" },
519
- environment,
520
- permissions: MEMBER_PERMISSIONS,
521
- // Owners and admins may delete anyone's comment from the widget, as in
522
- // the dashboard — a hint for which controls to draw; the delete routes
523
- // read the membership themselves (isStudioModerator).
524
- moderator: owner.role === "owner" || owner.role === "admin",
525
- origin,
526
- serverTime: now().toISOString(),
527
- }, 201);
603
+ const origin = canonicalOrigin(c.req.header("Origin"));
604
+ // The server's own host as the browser addressed it — the same reading
605
+ // `/auth/login`'s origin check makes, and the host `Sec-Fetch-Site` was
606
+ // computed against. Port dropped: a site has no port.
607
+ const serverHost = (c.req.header("Host") ?? new URL(c.req.url).host).replace(/:\d+$/, "");
608
+ if (!origin || !sameSite(new URL(origin).hostname, serverHost)) {
609
+ return fail(c, 403, "forbidden", "Silent sign-in only answers a page on the dashboard's own site.");
610
+ }
611
+ const owner = c.get("owner");
612
+ if (!owner)
613
+ return fail(c, 401, "unauthorized", "Sign in to the dashboard first.");
614
+ const uid = c.req.param("uid");
615
+ const project = await live(c, uid);
616
+ if (project instanceof Response)
617
+ return project;
618
+ if (project.org_id !== owner.orgId)
619
+ return fail(c, 404, "project_not_found", "No project with that uid.");
620
+ if (owner.role === "viewer") {
621
+ return fail(c, 403, "forbidden", "Your role in this studio cannot comment.");
622
+ }
623
+ if (!originPermitted(await allowedOrigins(sql, project.id), project.domain, origin)) {
624
+ return fail(c, 403, "origin_not_allowed", `${origin} is not one of this site's addresses. Add it in the site's settings first.`);
625
+ }
626
+ const raw = await c.req.text().catch(() => "");
627
+ let body = null;
628
+ try {
629
+ body = raw ? JSON.parse(raw) : null;
630
+ }
631
+ catch {
632
+ body = null;
633
+ }
634
+ const envKey = typeof body?.environment === "string" && body.environment ? body.environment : null;
635
+ /**
636
+ * TWELVE HOURS, whatever SNAGSET_SESSION_ABSOLUTE_TTL_S says. Nobody
637
+ * clicked for this session: any script on a permitted same-site page —
638
+ * an XSS on a client's staging site, a dangling subdomain taken over —
639
+ * can obtain one while a member visits. Renewal is silent too, so the
640
+ * short cap costs the member nothing; it only bounds how long a session
641
+ * lifted that way stays good. The popup, approved with a click, keeps
642
+ * the instance's cap (a studio may raise it to 30 days).
643
+ */
644
+ return mintMember(c, owner, project, uid, origin, envKey, SILENT_CAP_S);
528
645
  });
529
646
  return app;
530
647
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/routes/sessions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/routes/sessions.ts"],"names":[],"mappings":"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"}
@@ -55,7 +55,7 @@ export function siteRoutes(deps) {
55
55
  catch (e) {
56
56
  return fail(c, 400, "validation_failed", e instanceof Error ? e.message : String(e));
57
57
  }
58
- // D92 — the site's DOMAIN, the one field most sites need: its host, every
58
+ // The site's DOMAIN, the one field most sites need: its host, every
59
59
  // subdomain, any scheme and port, and localhost. Exact origins stay for
60
60
  // the addresses a domain cannot say.
61
61
  const rawDomain = body?.["domain"];
@@ -163,7 +163,7 @@ export function siteRoutes(deps) {
163
163
  return c.json({ origins: all.map((r) => r.pattern) }, 201);
164
164
  });
165
165
  /**
166
- * `PATCH /api/v1/projects/:uid` — who sees the toolbar. D66.
166
+ * `PATCH /api/v1/projects/:uid` — who sees the toolbar.
167
167
  *
168
168
  * ONE knob, and it is the knob that already existed: `write_mode`. Who can
169
169
  * WRITE is who the toolbar is for — showing a comment bar to somebody whose
@@ -172,7 +172,7 @@ export function siteRoutes(deps) {
172
172
  * comment; `link-required` = only somebody who opened a review link (and,
173
173
  * thereafter, whenever they come back).
174
174
  *
175
- * Choosing `open` here CLEARS the D1 grace timer. The 24-hour downgrade
175
+ * Choosing `open` here CLEARS the grace timer. The 24-hour downgrade
176
176
  * exists so a site somebody set up and forgot does not stay a public comment
177
177
  * box; an owner choosing "everyone" in the dashboard is the opposite of
178
178
  * forgetting, and having the toolbar silently vanish a day later would be
@@ -191,10 +191,10 @@ export function siteRoutes(deps) {
191
191
  }
192
192
  const body = (await c.req.json().catch(() => null));
193
193
  /**
194
- * THREE FIELDS NOW, NOT ONE. D66 mounted this route for `writeMode` alone,
194
+ * THREE FIELDS NOW, NOT ONE. Mounted this route for `writeMode` alone,
195
195
  * and a site was create-once ever after: a typo in the name was permanent
196
196
  * and a staging URL that moved could only be ADDED to, never corrected.
197
- * Eurico, using it: *"the sites we should be able to edit the url and name
197
+ * The maintainer, using it: *"the sites we should be able to edit the url and name
198
198
  * and delete or edit it, right now is just one time."*
199
199
  *
200
200
  * Each is optional and absent means unchanged, so the existing
@@ -224,7 +224,7 @@ export function siteRoutes(deps) {
224
224
  return fail(c, 400, "validation_failed", "That name is longer than 120 characters.");
225
225
  }
226
226
  }
227
- // D92 — the domain: a string to set, null (or empty) to clear.
227
+ // The domain: a string to set, null (or empty) to clear.
228
228
  let domain;
229
229
  if (rawDomain !== undefined) {
230
230
  if (rawDomain === null || (typeof rawDomain === "string" && !rawDomain.trim())) {
@@ -240,7 +240,7 @@ export function siteRoutes(deps) {
240
240
  return fail(c, 400, "validation_failed", "domain must be a string, or null to clear it.");
241
241
  }
242
242
  }
243
- // D91 — the switch, 05 §4.9 layer 6's kill switch with a dashboard
243
+ // The switch, layer 6's kill switch with a dashboard
244
244
  // control: paused refuses the widget's writes and hides the toolbar;
245
245
  // reads and the studio's own triage go on.
246
246
  let status;
@@ -323,7 +323,7 @@ export function siteRoutes(deps) {
323
323
  return c.json({
324
324
  uid: c.req.param("uid"),
325
325
  name: row?.name,
326
- // What the widget enforces, as the sites list says it (D119).
326
+ // What the widget enforces, as the sites list says it.
327
327
  writeMode: row ? effectiveWriteMode(row, new Date()) : undefined,
328
328
  status: row?.status,
329
329
  domain: row?.domain ?? null,
@@ -378,7 +378,7 @@ export function siteRoutes(deps) {
378
378
  const all = await inOrg(sql, project.org_id, (tx) => tx `
379
379
  SELECT pattern FROM project_origins WHERE project_id = ${project.id} ORDER BY pattern
380
380
  `);
381
- // D92: where the widget may run is the domain AND the exact addresses.
381
+ // Where the widget may run is the domain AND the exact addresses.
382
382
  return c.json({ domain: project.domain, origins: all.map((r) => r.pattern) });
383
383
  });
384
384
  return app;