@snagset/server 0.1.2 → 0.1.4

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 (140) hide show
  1. package/dist/app.js +45 -6
  2. package/dist/app.js.map +1 -1
  3. package/dist/bin.js +1 -1
  4. package/dist/db/scope.js +23 -0
  5. package/dist/db/scope.js.map +1 -0
  6. package/dist/instance/mcpHttp.js +42 -0
  7. package/dist/instance/mcpHttp.js.map +1 -0
  8. package/dist/mail/unsubscribe.js +5 -4
  9. package/dist/mail/unsubscribe.js.map +1 -1
  10. package/dist/orgs.js +87 -0
  11. package/dist/orgs.js.map +1 -0
  12. package/dist/plan.js +82 -0
  13. package/dist/plan.js.map +1 -0
  14. package/dist/projectCache.js +3 -2
  15. package/dist/projectCache.js.map +1 -1
  16. package/dist/reviewerCache.js +3 -2
  17. package/dist/reviewerCache.js.map +1 -1
  18. package/dist/routes/account.js +5 -4
  19. package/dist/routes/account.js.map +1 -1
  20. package/dist/routes/anchorReports.js +3 -2
  21. package/dist/routes/anchorReports.js.map +1 -1
  22. package/dist/routes/attachments.js +17 -6
  23. package/dist/routes/attachments.js.map +1 -1
  24. package/dist/routes/commentEdit.js +3 -2
  25. package/dist/routes/commentEdit.js.map +1 -1
  26. package/dist/routes/comments.js +7 -6
  27. package/dist/routes/comments.js.map +1 -1
  28. package/dist/routes/cors.js +5 -4
  29. package/dist/routes/cors.js.map +1 -1
  30. package/dist/routes/instance.js +29 -0
  31. package/dist/routes/instance.js.map +1 -1
  32. package/dist/routes/integrations.js +10 -5
  33. package/dist/routes/integrations.js.map +1 -1
  34. package/dist/routes/mcp.js +45 -0
  35. package/dist/routes/mcp.js.map +1 -0
  36. package/dist/routes/mcpAuth.js +59 -3
  37. package/dist/routes/mcpAuth.js.map +1 -1
  38. package/dist/routes/mcpToken.js +10 -9
  39. package/dist/routes/mcpToken.js.map +1 -1
  40. package/dist/routes/mcpTokens.js +10 -3
  41. package/dist/routes/mcpTokens.js.map +1 -1
  42. package/dist/routes/members.js +11 -0
  43. package/dist/routes/members.js.map +1 -1
  44. package/dist/routes/orgs.js +128 -0
  45. package/dist/routes/orgs.js.map +1 -0
  46. package/dist/routes/owner.js +34 -12
  47. package/dist/routes/owner.js.map +1 -1
  48. package/dist/routes/reviewLinks.js +11 -10
  49. package/dist/routes/reviewLinks.js.map +1 -1
  50. package/dist/routes/rounds.js +7 -6
  51. package/dist/routes/rounds.js.map +1 -1
  52. package/dist/routes/sessions.js +16 -15
  53. package/dist/routes/sessions.js.map +1 -1
  54. package/dist/routes/sites.js +45 -26
  55. package/dist/routes/sites.js.map +1 -1
  56. package/dist/routes/threads.js +7 -11
  57. package/dist/routes/threads.js.map +1 -1
  58. package/dist/serverless.js +86 -120
  59. package/dist/serverless.js.map +1 -1
  60. package/dist/storage/settings.js +8 -7
  61. package/dist/storage/settings.js.map +1 -1
  62. package/dist/vendor/mcp/bin.js +72 -0
  63. package/dist/vendor/mcp/client.js +107 -0
  64. package/dist/vendor/mcp/server.js +242 -0
  65. package/dist/vendor/mcp/source.js +284 -0
  66. package/dist/vendor/mcp/view.js +199 -0
  67. package/dist/vendor/types/names.js +1 -0
  68. package/package.json +4 -2
  69. package/static/dashboard/assets/CompositeItem-DooiJvYh.js +1 -0
  70. package/static/dashboard/assets/{ConfirmDialog-CfUnmf4e.js → ConfirmDialog-B5Kq--VU.js} +1 -1
  71. package/static/dashboard/assets/{CopyButton-0ANrU8mS.js → CopyButton-BX1ldjjz.js} +1 -1
  72. package/static/dashboard/assets/FieldItemContext-DkOlIwHg.js +1 -0
  73. package/static/dashboard/assets/{InstallTag-CFvRuiwX.js → InstallTag-DahspVU0.js} +1 -1
  74. package/static/dashboard/assets/{SaveState-RDbpfaEm.js → SaveState-Q9xJjbqL.js} +1 -1
  75. package/static/dashboard/assets/_app-CRQzX614.js +56 -0
  76. package/static/dashboard/assets/{_app-DpPrYyh8.js → _app-Cd9_WR6L.js} +1 -1
  77. package/static/dashboard/assets/{activity-DwTWlcUi.js → activity-B-59HYua.js} +1 -1
  78. package/static/dashboard/assets/{arrow-left-2PKG3ITQ.js → arrow-left-aeWIKOlS.js} +1 -1
  79. package/static/dashboard/assets/{avatar-AfucjvZ4.js → avatar-KLKmXBKs.js} +1 -1
  80. package/static/dashboard/assets/{badge-CErha5Qd.js → badge-Dly0Vqky.js} +1 -1
  81. package/static/dashboard/assets/{card-DxFqxFQf.js → card-D3S4369l.js} +1 -1
  82. package/static/dashboard/assets/{check-Yc6VFTfm.js → check-CjehM7M4.js} +1 -1
  83. package/static/dashboard/assets/{chevron-right-Go23FN_b.js → chevron-right-CtWPB3ox.js} +1 -1
  84. package/static/dashboard/assets/{copy-BjvQHEe0.js → copy-DbrG17rp.js} +1 -1
  85. package/static/dashboard/assets/{createLucideIcon-DwbZIZsa.js → createLucideIcon-CJO80vPf.js} +1 -1
  86. package/static/dashboard/assets/{dialog-CgkCHO0g.js → dialog-GyPeOagK.js} +1 -1
  87. package/static/dashboard/assets/{dropdown-menu-DRa3ikv4.js → dropdown-menu-BOoXJZ3W.js} +3 -3
  88. package/static/dashboard/assets/{image-off-ByN_ZOK_.js → image-off-BYE-vNh9.js} +1 -1
  89. package/static/dashboard/assets/{index-BRTBtV91.css → index-BR4Mnw-o.css} +1 -1
  90. package/static/dashboard/assets/{index-DG2IWFx-.js → index-D4yHhKPM.js} +30 -30
  91. package/static/dashboard/assets/label-BGuYH_Ll.js +1 -0
  92. package/static/dashboard/assets/{layout-grid-Dj0cm_PO.js → layout-grid-DJ_OjGVc.js} +1 -1
  93. package/static/dashboard/assets/me-B-0XXdLF.js +1 -0
  94. package/static/dashboard/assets/{parts-B3hL1LIW.js → parts-DJaBw8EG.js} +1 -1
  95. package/static/dashboard/assets/{plus-CRLkl9fr.js → plus-x0wkLget.js} +1 -1
  96. package/static/dashboard/assets/s._site-s4IRnE6u.js +1 -0
  97. package/static/dashboard/assets/{s._site.comments-DCpM8f18.js → s._site.comments-Bt0AsQ8j.js} +3 -3
  98. package/static/dashboard/assets/s._site.reviewers-BzJsotII.js +1 -0
  99. package/static/dashboard/assets/s._site.settings-C6ei77kQ.js +1 -0
  100. package/static/dashboard/assets/setup-DTi8FBnt.js +1 -0
  101. package/static/dashboard/assets/sign-in-CGOMDkYg.js +1 -0
  102. package/static/dashboard/assets/sign-up-CfU4RCfo.js +1 -0
  103. package/static/dashboard/assets/sites-zZ5gTDCZ.js +1 -0
  104. package/static/dashboard/assets/studio-DaMq1jOg.js +1 -0
  105. package/static/dashboard/assets/{studio-BIDpGywS.js → studio-r6xIIciH.js} +1 -1
  106. package/static/dashboard/assets/studio.index-CsF3xaoh.js +1 -0
  107. package/static/dashboard/assets/studio.integrations-BnPEkEA3.js +1 -0
  108. package/static/dashboard/assets/studio.members-DegH-I8c.js +1 -0
  109. package/static/dashboard/assets/{sun-CyU37by7.js → sun-BLhaKyhb.js} +1 -1
  110. package/static/dashboard/assets/switch-En3PhTzh.js +1 -0
  111. package/static/dashboard/assets/{table-DEYsEr1D.js → table-DuU_ZP-u.js} +1 -1
  112. package/static/dashboard/assets/useAriaLabelledBy-C3DXCwhM.js +1 -0
  113. package/static/dashboard/assets/{useBaseQuery-Cyp8ADaN.js → useBaseQuery-B_iu1J2b.js} +1 -1
  114. package/static/dashboard/assets/useQuery-yeUPHKKg.js +1 -0
  115. package/static/dashboard/assets/useRender-Bl1M9SFS.js +1 -0
  116. package/static/dashboard/assets/useValueChanged-BwMBSSVy.js +1 -0
  117. package/static/dashboard/assets/{users-CcRaZGiI.js → users-c6wDSgLD.js} +1 -1
  118. package/static/dashboard/assets/{welcome-DFcmcB5m.js → welcome-Ddm5B8Xh.js} +2 -2
  119. package/static/dashboard/assets/you-BmjZYMtz.js +1 -0
  120. package/static/dashboard/assets/{zod-qEjeM9Eg.js → zod-CBoGbUzv.js} +1 -1
  121. package/static/dashboard/index.html +2 -2
  122. package/static/dashboard/assets/CompositeItem-CrOf38Oz.js +0 -1
  123. package/static/dashboard/assets/FieldItemContext-CFDZff0c.js +0 -1
  124. package/static/dashboard/assets/_app-CyFpAeiD.js +0 -56
  125. package/static/dashboard/assets/createBaseUIEventDetails-BWJgXhnd.js +0 -1
  126. package/static/dashboard/assets/label-Bombrpc6.js +0 -1
  127. package/static/dashboard/assets/me-Bno2H07j.js +0 -1
  128. package/static/dashboard/assets/s._site-CP12hsxz.js +0 -1
  129. package/static/dashboard/assets/s._site.reviewers-WT9D4fr3.js +0 -1
  130. package/static/dashboard/assets/s._site.settings-DaxVWDmT.js +0 -1
  131. package/static/dashboard/assets/setup-Ch-Vt7_T.js +0 -1
  132. package/static/dashboard/assets/sign-in-CdGjL0Ha.js +0 -1
  133. package/static/dashboard/assets/sites-8S1PAUfv.js +0 -1
  134. package/static/dashboard/assets/studio-DREMbrco.js +0 -1
  135. package/static/dashboard/assets/studio.index-B4-MAfEP.js +0 -1
  136. package/static/dashboard/assets/studio.integrations-D1bP5fqp.js +0 -1
  137. package/static/dashboard/assets/studio.members-DKl8oRd9.js +0 -1
  138. package/static/dashboard/assets/useQuery-DuAHuwx9.js +0 -1
  139. package/static/dashboard/assets/useRender-BCvsiXRL.js +0 -1
  140. package/static/dashboard/assets/you-ClBoja9X.js +0 -1
@@ -0,0 +1,128 @@
1
+ import { Hono } from "hono";
2
+ import { randomUUID } from "node:crypto";
3
+ import { THREAD_REF_PREFIX } from "../vendor/types/names.js";
4
+ import { csrfOk, hashPassword, setSessionCookies } from "./owner.js";
5
+ import { addOwner, createFirstProject, createOrg, createOwner, openSession, SESSION_S, studiosOf } from "../orgs.js";
6
+ const WINDOW_MS = 60 * 60 * 1000;
7
+ const PER_WINDOW = 10;
8
+ const EMAIL = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
9
+ function fail(c, status, code, message, details) {
10
+ return c.json({ error: { code, message, ...(details ? { details } : {}), requestId: c.get("requestId") } }, status);
11
+ }
12
+ const CLOSED = "This instance does not take sign-ups. Ask its owner to add you, or run your own — npx snagset.";
13
+ export function orgRoutes(deps) {
14
+ const { sql } = deps;
15
+ const now = deps.now ?? (() => Date.now());
16
+ const app = new Hono();
17
+ const attempts = new Map();
18
+ /** True when this address has used its ten. Counted before any work, so a flood of bad bodies costs a Map lookup. */
19
+ const overLimit = (c) => {
20
+ const ip = c.req.header("x-forwarded-for")?.split(",")[0]?.trim() || c.req.header("x-real-ip")?.trim() || "local";
21
+ const t = now();
22
+ const recent = (attempts.get(ip) ?? []).filter((at) => t - at < WINDOW_MS);
23
+ recent.push(t);
24
+ attempts.set(ip, recent);
25
+ if (attempts.size > 10_000)
26
+ attempts.clear();
27
+ return recent.length > PER_WINDOW;
28
+ };
29
+ const foreign = (c) => {
30
+ const origin = c.req.header("Origin");
31
+ const host = c.req.header("Host");
32
+ const ours = new Set([deps.origin, host ? `http://${host}` : "", host ? `https://${host}` : ""]);
33
+ return !!origin && !ours.has(origin);
34
+ };
35
+ const project = (p) => ({ uid: p.uid, name: p.name, keyPrefix: THREAD_REF_PREFIX.replace("-", "") });
36
+ app.post("/auth/register", async (c) => {
37
+ if (!deps.signupOpen())
38
+ return fail(c, 403, "registration_closed", CLOSED);
39
+ if (foreign(c))
40
+ return fail(c, 403, "forbidden", "That sign-up request came from another site.");
41
+ if (overLimit(c))
42
+ return fail(c, 429, "quota_exceeded", "Too many sign-ups from this address. Try again in an hour.");
43
+ const body = (await c.req.json().catch(() => null));
44
+ const str = (k) => (typeof body?.[k] === "string" ? body[k].trim() : "");
45
+ const email = str("email").toLowerCase();
46
+ const password = typeof body?.["password"] === "string" ? body["password"] : "";
47
+ const name = str("name").slice(0, 120);
48
+ const orgName = (str("orgName") || "My studio").slice(0, 120);
49
+ if (!EMAIL.test(email))
50
+ return fail(c, 400, "validation_failed", "That does not look like an email address.", { field: "email" });
51
+ if (password.length < 12)
52
+ return fail(c, 400, "validation_failed", "The password must be at least 12 characters.", { field: "password" });
53
+ const taken = await sql.begin(async (tx) => {
54
+ await tx `SET LOCAL app.maintenance = 'on'`;
55
+ return tx `SELECT count(*)::int AS n FROM users WHERE email = ${email} AND deleted_at IS NULL`;
56
+ });
57
+ if ((taken[0]?.n ?? 0) > 0)
58
+ return fail(c, 409, "email_taken", "An account with that email already exists. Sign in instead.", { field: "email" });
59
+ const orgId = randomUUID();
60
+ const userId = randomUUID();
61
+ const passwordHash = hashPassword(password);
62
+ let out;
63
+ try {
64
+ out = await sql.begin(async (tx) => {
65
+ await tx `SET LOCAL app.maintenance = 'on'`;
66
+ const [count] = await tx `SELECT count(*)::int AS n FROM orgs`;
67
+ const { slug } = await createOrg(tx, { orgId, name: orgName });
68
+ await createOwner(tx, { orgId, userId, email, name, passwordHash });
69
+ const made = await createFirstProject(tx, { orgId, userId, name: "", graceHours: deps.graceHours });
70
+ const session = await openSession(tx, { orgId, userId, userAgent: c.req.header("User-Agent") ?? "" });
71
+ return { slug, first: (count?.n ?? 0) === 0, project: made, session };
72
+ });
73
+ }
74
+ catch (e) {
75
+ // users_email_uniq — two sign-ups for one address in the same second.
76
+ if (e?.code === "23505")
77
+ return fail(c, 409, "email_taken", "An account with that email already exists. Sign in instead.", { field: "email" });
78
+ throw e;
79
+ }
80
+ if (out.first)
81
+ deps.onFirstOrg?.();
82
+ setSessionCookies(c, out.session.token, out.session.csrf, deps.secure, SESSION_S);
83
+ return c.json({ org: { name: orgName, slug: out.slug }, user: { email, name }, project: project(out.project), csrfToken: out.session.csrf }, 201);
84
+ });
85
+ app.post("/auth/switch", async (c) => {
86
+ const owner = c.get("owner");
87
+ if (!owner)
88
+ return fail(c, 401, "unauthorized", "Sign in to the dashboard first.");
89
+ if (!csrfOk(c))
90
+ return fail(c, 403, "csrf_failed", "That request could not be verified. Reload the dashboard and try again.");
91
+ const body = (await c.req.json().catch(() => null));
92
+ const slug = typeof body?.["slug"] === "string" ? body["slug"].trim() : "";
93
+ const target = (await studiosOf(sql, owner.userId)).find((s) => s.slug === slug);
94
+ if (!target)
95
+ return fail(c, 404, "not_a_member", "You are not a member of a studio with that address.");
96
+ const session = await sql.begin(async (tx) => {
97
+ await tx `SELECT set_config('app.org_id', ${owner.orgId}, true)`;
98
+ await tx `UPDATE user_sessions SET revoked_at = now() WHERE id = ${owner.sessionId}`;
99
+ return openSession(tx, { orgId: target.id, userId: owner.userId, userAgent: c.req.header("User-Agent") ?? "" });
100
+ });
101
+ setSessionCookies(c, session.token, session.csrf, deps.secure, SESSION_S);
102
+ return c.json({ org: { name: target.name, slug: target.slug }, role: target.role, csrfToken: session.csrf });
103
+ });
104
+ app.post("/api/v1/orgs", async (c) => {
105
+ const owner = c.get("owner");
106
+ if (!owner)
107
+ return fail(c, 401, "unauthorized", "Sign in to the dashboard first.");
108
+ if (!deps.signupOpen())
109
+ return fail(c, 403, "registration_closed", "This instance does not take new studios. Ask its operator to open sign-up, or run your own — npx snagset.");
110
+ const body = (await c.req.json().catch(() => null));
111
+ const name = (typeof body?.["name"] === "string" ? body["name"].trim() : "").slice(0, 120) || "My studio";
112
+ const orgId = randomUUID();
113
+ const out = await sql.begin(async (tx) => {
114
+ await tx `SET LOCAL app.maintenance = 'on'`;
115
+ const { slug } = await createOrg(tx, { orgId, name });
116
+ await addOwner(tx, orgId, owner.userId);
117
+ const made = await createFirstProject(tx, { orgId, userId: owner.userId, name: "", graceHours: deps.graceHours });
118
+ await tx `SELECT set_config('app.org_id', ${owner.orgId}, true)`;
119
+ await tx `UPDATE user_sessions SET revoked_at = now() WHERE id = ${owner.sessionId}`;
120
+ const session = await openSession(tx, { orgId, userId: owner.userId, userAgent: c.req.header("User-Agent") ?? "" });
121
+ return { slug, project: made, session };
122
+ });
123
+ setSessionCookies(c, out.session.token, out.session.csrf, deps.secure, SESSION_S);
124
+ return c.json({ org: { name, slug: out.slug }, project: project(out.project), csrfToken: out.session.csrf }, 201);
125
+ });
126
+ return app;
127
+ }
128
+ //# sourceMappingURL=orgs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orgs.js","sourceRoot":"","sources":["../../src/routes/orgs.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,9 @@
1
1
  import { Hono } from "hono";
2
2
  import { randomUUID, randomBytes, createHash, timingSafeEqual, scryptSync } from "node:crypto";
3
3
  import { DASHBOARD_SESSION_COOKIE, DASHBOARD_CSRF_COOKIE, HTTP_HEADER, ID_PREFIX } from "../vendor/types/names.js";
4
+ import { usage } from "../plan.js";
5
+ import { studiosOf } from "../orgs.js";
6
+ import { inOrg, maintenance } from "../db/scope.js";
4
7
  /** 05 §4.7: 30-day absolute, 7-day idle, rolling refresh on use. */
5
8
  const ABSOLUTE_MS = 30 * 24 * 60 * 60 * 1000;
6
9
  const IDLE_MS = 7 * 24 * 60 * 60 * 1000;
@@ -89,7 +92,7 @@ export function ownerAuth(deps) {
89
92
  if (!token)
90
93
  return next();
91
94
  const at = now();
92
- const [row] = await sql `
95
+ const [row] = await maintenance(sql, (tx) => tx `
93
96
  SELECT s.id, s.org_id, s.user_id, u.email, u.name, s.last_seen_at, m.role
94
97
  FROM user_sessions s
95
98
  JOIN users u ON u.id = s.user_id AND u.deleted_at IS NULL
@@ -100,7 +103,7 @@ export function ownerAuth(deps) {
100
103
  AND s.revoked_at IS NULL
101
104
  AND s.expires_at > ${at}
102
105
  AND s.last_seen_at > ${new Date(at.getTime() - IDLE_MS)}
103
- `;
106
+ `);
104
107
  if (!row) {
105
108
  // The cookie names no live session — expired, revoked, or minted under
106
109
  // a key this instance no longer has. Left alone it is presented on every
@@ -124,7 +127,7 @@ export function ownerAuth(deps) {
124
127
  // needs to be accurate to within the idle window, and a write per request
125
128
  // turns a read-only dashboard page into a write on the hot path.
126
129
  if (at.getTime() - row.last_seen_at.getTime() > 60 * 60 * 1000) {
127
- void sql `UPDATE user_sessions SET last_seen_at = ${at} WHERE id = ${row.id}`.catch(() => { });
130
+ void inOrg(sql, row.org_id, (tx) => tx `UPDATE user_sessions SET last_seen_at = ${at} WHERE id = ${row.id}`).catch(() => { });
128
131
  }
129
132
  return next();
130
133
  };
@@ -223,10 +226,10 @@ export function ownerRoutes(deps) {
223
226
  if (!email || !password) {
224
227
  return fail(c, 400, "validation_failed", "Both an email address and a password are required.");
225
228
  }
226
- const [user] = await sql `
229
+ const [user] = await maintenance(sql, (tx) => tx `
227
230
  SELECT id, org_id, email, name, password_hash
228
231
  FROM users WHERE email = ${email} AND deleted_at IS NULL
229
- `;
232
+ `);
230
233
  // `verifyPassword` spends the same work on a missing row as on a wrong
231
234
  // password, so this branch costs what the real one costs.
232
235
  if (!verifyPassword(password, user?.password_hash ?? null)) {
@@ -235,11 +238,11 @@ export function ownerRoutes(deps) {
235
238
  const token = randomBytes(32).toString("base64url");
236
239
  const csrf = randomBytes(32).toString("base64url");
237
240
  const expires = new Date(now().getTime() + ABSOLUTE_MS);
238
- await sql `
241
+ await inOrg(sql, user.org_id, (tx) => tx `
239
242
  INSERT INTO user_sessions (id, org_id, user_id, token_hash, user_agent, expires_at)
240
243
  VALUES (${randomUUID()}, ${user.org_id}, ${user.id}, ${sha256(token)},
241
244
  ${(c.req.header("User-Agent") ?? "").slice(0, 400)}, ${expires})
242
- `;
245
+ `);
243
246
  setSessionCookies(c, token, csrf, deps.secure, Math.floor(ABSOLUTE_MS / 1000));
244
247
  // No id, for the reason `/api/v1/me` gives: nothing outside the database
245
248
  // needs it, and an internal id put on the wire because it was to hand is
@@ -250,7 +253,7 @@ export function ownerRoutes(deps) {
250
253
  app.post("/auth/logout", async (c) => {
251
254
  const owner = c.get("owner");
252
255
  if (owner)
253
- await sql `UPDATE user_sessions SET revoked_at = now() WHERE id = ${owner.sessionId}`;
256
+ await inOrg(sql, owner.orgId, (tx) => tx `UPDATE user_sessions SET revoked_at = now() WHERE id = ${owner.sessionId}`);
254
257
  clearSessionCookies(c, deps.secure);
255
258
  return c.json({ ok: true });
256
259
  });
@@ -264,9 +267,9 @@ export function ownerRoutes(deps) {
264
267
  const owner = c.get("owner");
265
268
  if (!owner)
266
269
  return fail(c, 401, "unauthorized", "Sign in to the dashboard first.");
267
- const [org] = await sql `
270
+ const [org] = await inOrg(sql, owner.orgId, (tx) => tx `
268
271
  SELECT name, slug FROM orgs WHERE id = ${owner.orgId}
269
- `;
272
+ `);
270
273
  /*
271
274
  * `shot` and `last_activity` are here rather than in a per-card request,
272
275
  * for the same reason the counts are: the Sites screen draws every project
@@ -283,7 +286,7 @@ export function ownerRoutes(deps) {
283
286
  * can attach a photo to a comment, and a client's holiday snap is not what
284
287
  * their site looks like.
285
288
  */
286
- const projects = await sql `
289
+ const projects = await inOrg(sql, owner.orgId, (tx) => tx `
287
290
  SELECT p.uid, p.name, p.key_prefix, p.write_mode, p.status,
288
291
  p.settings->>'domain' AS domain,
289
292
  count(t.id)::int AS threads,
@@ -312,8 +315,25 @@ export function ownerRoutes(deps) {
312
315
  WHERE p.org_id = ${owner.orgId} AND p.deleted_at IS NULL
313
316
  GROUP BY p.id, p.uid, p.name, p.key_prefix, p.write_mode, p.status, p.settings, s.id
314
317
  ORDER BY p.created_at
315
- `;
318
+ `);
319
+ // The plan's numbers and how far along them the studio is (plan/09) —
320
+ // shown where a limit exists, silent where there is none.
321
+ // Every studio this person belongs to, for the switcher; the current one is marked.
322
+ const studios = await studiosOf(sql, owner.userId);
323
+ const l = await deps.limits(owner.orgId);
324
+ const used = await sql.begin(async (tx) => {
325
+ await tx `SELECT set_config('app.org_id', ${owner.orgId}, true)`;
326
+ return usage(tx, owner.orgId);
327
+ });
316
328
  return c.json({
329
+ limits: {
330
+ projects: { limit: l.projects, used: used.projects },
331
+ members: { limit: l.members, used: used.members },
332
+ storage: { limit: l.storageBytes, used: used.storageBytes },
333
+ screenshots: l.screenshots,
334
+ integrations: l.integrations,
335
+ source: l.source,
336
+ },
317
337
  // NO id. Foundations §2.10 mints no `usr_` prefix, and the dashboard has
318
338
  // no use for one: it renders a name and an email. AC-1-9 is about
319
339
  // project uuids specifically, but the habit is the point — an internal
@@ -321,6 +341,8 @@ export function ownerRoutes(deps) {
321
341
  // gets out.
322
342
  user: { email: owner.email, name: owner.name, role: owner.role },
323
343
  org: { name: org?.name ?? "", slug: org?.slug ?? "" },
344
+ orgs: studios.map((s) => ({ slug: s.slug, name: s.name, role: s.role, current: s.id === owner.orgId })),
345
+ signupOpen: deps.signupOpen?.() ?? false,
324
346
  projects: projects.map((p) => ({
325
347
  uid: p.uid,
326
348
  name: p.name,
@@ -1 +1 @@
1
- {"version":3,"file":"owner.js","sourceRoot":"","sources":["../../src/routes/owner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"owner.js","sourceRoot":"","sources":["../../src/routes/owner.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { Hono } from "hono";
2
2
  import { randomUUID, randomBytes, createHash } from "node:crypto";
3
3
  import { ID_PREFIX } from "../vendor/types/names.js";
4
+ import { inOrg } from "../db/scope.js";
4
5
  function fail(c, status, code, message) {
5
6
  return c.json({ error: { code, message, requestId: c.get("requestId") } }, status);
6
7
  }
@@ -89,9 +90,9 @@ export function reviewLinkRoutes(deps) {
89
90
  roundId = rowId(body.roundId, ID_PREFIX.round);
90
91
  if (!roundId)
91
92
  return fail(c, 400, "validation_failed", "roundId is not a valid id.");
92
- const [round] = await sql `
93
+ const [round] = await inOrg(sql, project.org_id, (tx) => tx `
93
94
  SELECT id FROM rounds WHERE id = ${roundId} AND project_id = ${project.id} AND deleted_at IS NULL
94
- `;
95
+ `);
95
96
  if (!round)
96
97
  return fail(c, 404, "not_found", "That round is not in this project.");
97
98
  }
@@ -99,21 +100,21 @@ export function reviewLinkRoutes(deps) {
99
100
  // sha256 only, which is why this response is the token's one appearance.
100
101
  const token = randomBytes(32).toString("base64url");
101
102
  const id = randomUUID();
102
- const [row] = await sql `
103
+ const [row] = await inOrg(sql, project.org_id, (tx) => tx `
103
104
  INSERT INTO review_links
104
105
  (id, org_id, project_id, round_id, token_hash, name, email, environments, permissions,
105
106
  allow_name_override, max_uses, expires_at)
106
107
  VALUES
107
108
  (${id}, ${project.org_id}, ${project.id}, ${roundId}, ${sha256(token)}, ${name},
108
109
  ${typeof body?.email === "string" ? body.email : null},
109
- ${sql.array(Array.isArray(body?.environments) && body.environments.length ? body.environments : ["*"])},
110
- ${sql.array(permissions)},
110
+ ${tx.array(Array.isArray(body?.environments) && body.environments.length ? body.environments : ["*"])},
111
+ ${tx.array(permissions)},
111
112
  ${body?.allowNameOverride === false ? false : true},
112
113
  ${Number.isInteger(body?.maxUses) && body?.maxUses > 0 ? body.maxUses : null},
113
114
  ${expiresAt})
114
115
  RETURNING id, round_id, name, email, environments, permissions, allow_name_override,
115
116
  max_uses, use_count, created_at, expires_at, revoked_at, last_used_at
116
- `;
117
+ `);
117
118
  c.header("Location", `/api/v1/review-links/${ID_PREFIX.link}${id}`);
118
119
  return c.json({
119
120
  ...shape(row),
@@ -127,11 +128,11 @@ export function reviewLinkRoutes(deps) {
127
128
  const project = await owned(c);
128
129
  if (!project)
129
130
  return fail(c, 404, "project_not_found", "No project with that uid.");
130
- const rows = await sql `
131
+ const rows = await inOrg(sql, project.org_id, (tx) => tx `
131
132
  SELECT id, round_id, name, email, environments, permissions, allow_name_override,
132
133
  max_uses, use_count, created_at, expires_at, revoked_at, last_used_at
133
134
  FROM review_links WHERE project_id = ${project.id} ORDER BY created_at DESC
134
- `;
135
+ `);
135
136
  return c.json({ data: rows.map(shape), nextCursor: null });
136
137
  });
137
138
  app.delete("/api/v1/review-links/:id", async (c) => {
@@ -144,11 +145,11 @@ export function reviewLinkRoutes(deps) {
144
145
  // guessing/enumerating a `lnk_` id. `review_links.org_id` is denormalised
145
146
  // onto the row for exactly this filter.
146
147
  const owner = c.get("owner");
147
- const [link] = await sql `
148
+ const [link] = await inOrg(sql, owner.orgId, (tx) => tx `
148
149
  SELECT rl.id, rl.project_id, p.uid, rl.revoked_at
149
150
  FROM review_links rl JOIN projects p ON p.id = rl.project_id
150
151
  WHERE rl.id = ${id} AND rl.org_id = ${owner.orgId}
151
- `;
152
+ `);
152
153
  if (!link)
153
154
  return fail(c, 404, "not_found", "No such review link.");
154
155
  // BOTH, in one transaction. `revoked_at` stops further exchanges; the epoch
@@ -1 +1 @@
1
- {"version":3,"file":"reviewLinks.js","sourceRoot":"","sources":["../../src/routes/reviewLinks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reviewLinks.js","sourceRoot":"","sources":["../../src/routes/reviewLinks.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { Hono } from "hono";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { ID_PREFIX } from "../vendor/types/names.js";
4
+ import { inOrg } from "../db/scope.js";
4
5
  function fail(c, status, code, message) {
5
6
  return c.json({ error: { code, message, requestId: c.get("requestId") } }, status);
6
7
  }
@@ -41,7 +42,7 @@ export function roundRoutes(deps) {
41
42
  const p = await owned(c);
42
43
  if (!p)
43
44
  return fail(c, 404, "project_not_found", "No project with that uid.");
44
- const rows = await sql `
45
+ const rows = await inOrg(sql, p.org_id, (tx) => tx `
45
46
  SELECT r.id, r.number, r.name, r.closed_at, r.created_at,
46
47
  count(t.id)::int AS threads,
47
48
  count(t.id) FILTER (WHERE t.status <> 'resolved')::int AS unresolved
@@ -50,7 +51,7 @@ export function roundRoutes(deps) {
50
51
  WHERE r.project_id = ${p.id} AND r.deleted_at IS NULL
51
52
  GROUP BY r.id
52
53
  ORDER BY r.number DESC
53
- `;
54
+ `);
54
55
  return c.json({ data: rows.map(shape) });
55
56
  });
56
57
  /**
@@ -113,11 +114,11 @@ export function roundRoutes(deps) {
113
114
  }
114
115
  if (name !== null && !name)
115
116
  return fail(c, 400, "validation_failed", "A round needs a name.");
116
- const [row] = await sql `
117
+ const [row] = await inOrg(sql, owner.orgId, (tx) => tx `
117
118
  WITH upd AS (
118
119
  UPDATE rounds SET
119
- name = ${name ?? sql `name`},
120
- closed_at = ${closed === null ? sql `closed_at` : closed ? sql `now()` : sql `NULL`},
120
+ name = ${name ?? tx `name`},
121
+ closed_at = ${closed === null ? tx `closed_at` : closed ? tx `now()` : tx `NULL`},
121
122
  updated_at = now()
122
123
  WHERE id = ${id}::uuid AND org_id = ${owner.orgId}::uuid AND deleted_at IS NULL
123
124
  RETURNING id, number, name, closed_at, created_at
@@ -127,7 +128,7 @@ export function roundRoutes(deps) {
127
128
  (SELECT count(*)::int FROM threads t
128
129
  WHERE t.round_id = upd.id AND t.deleted_at IS NULL AND t.status <> 'resolved') AS unresolved
129
130
  FROM upd
130
- `;
131
+ `);
131
132
  if (!row)
132
133
  return fail(c, 404, "not_found", "No such round.");
133
134
  return c.json(shape(row));
@@ -1 +1 @@
1
- {"version":3,"file":"rounds.js","sourceRoot":"","sources":["../../src/routes/rounds.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rounds.js","sourceRoot":"","sources":["../../src/routes/rounds.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import { randomUUID, randomBytes, createHash } from "node:crypto";
3
3
  import { ID_PREFIX } from "../vendor/types/names.js";
4
4
  import { ProjectUnavailable } from "../projectCache.js";
5
5
  import { mintSession, verifySession, withinRefreshWindow } from "../session.js";
6
+ import { inOrg } from "../db/scope.js";
6
7
  function fail(c, status, code, message) {
7
8
  return c.json({ error: { code, message, requestId: c.get("requestId") } }, status);
8
9
  }
@@ -123,9 +124,9 @@ export function sessionRoutes(deps) {
123
124
  // a revoked link keeps working to one sliding window.
124
125
  let linkExpiresAt;
125
126
  if (v.claims.lnk) {
126
- const [link] = await sql `
127
+ const [link] = await inOrg(sql, project.org_id, (tx) => tx `
127
128
  SELECT expires_at, revoked_at FROM review_links WHERE id = ${v.claims.lnk}
128
- `;
129
+ `);
129
130
  if (!link || link.revoked_at || link.expires_at <= now()) {
130
131
  return fail(c, 401, "token_revoked", "This review link has been turned off.");
131
132
  }
@@ -134,9 +135,9 @@ export function sessionRoutes(deps) {
134
135
  if (!withinRefreshWindow(v.claims, ttls, linkExpiresAt, now)) {
135
136
  return fail(c, 401, "session_expired", "This review session has reached its limit. Re-open your review link.");
136
137
  }
137
- const [reviewer] = await sql `
138
+ const [reviewer] = await inOrg(sql, project.org_id, (tx) => tx `
138
139
  SELECT identity_valid_after FROM reviewers WHERE id = ${v.claims.sub}
139
- `;
140
+ `);
140
141
  if (reviewer?.identity_valid_after && v.claims.iat * 1000 < reviewer.identity_valid_after.getTime()) {
141
142
  return fail(c, 401, "session_revoked", "This reviewer has been signed out.");
142
143
  }
@@ -194,12 +195,12 @@ export function sessionRoutes(deps) {
194
195
  // ── The environment. Absent means the project's default (the widget only
195
196
  // knows a name if the host put one on the script tag).
196
197
  const envKey = typeof body.environment === "string" && body.environment ? body.environment : null;
197
- const [environment] = await sql `
198
+ const [environment] = await inOrg(sql, project.org_id, (tx) => tx `
198
199
  SELECT id, key, label FROM environments
199
200
  WHERE project_id = ${project.id} AND deleted_at IS NULL
200
- AND ${envKey ? sql `key = ${envKey}` : sql `is_default`}
201
+ AND ${envKey ? tx `key = ${envKey}` : tx `is_default`}
201
202
  LIMIT 1
202
- `;
203
+ `);
203
204
  if (!environment) {
204
205
  return fail(c, 400, "environment_not_found", envKey ? `This project has no environment called "${envKey}".` : "This project has no default environment.");
205
206
  }
@@ -215,14 +216,14 @@ export function sessionRoutes(deps) {
215
216
  // T8: LEFT JOIN rounds so a round-pinned link can report the round
216
217
  // NUMBER (what a reviewer and the widget both mean by "round"), not
217
218
  // just its opaque id -- rounds.id never left the server before this.
218
- const [found] = await sql `
219
+ const [found] = await inOrg(sql, project.org_id, (tx) => tx `
219
220
  SELECT rl.id, rl.round_id, rd.number AS round_number, rl.permissions, rl.environments,
220
221
  rl.allow_name_override, rl.name, rl.email,
221
222
  rl.max_uses, rl.use_count, rl.expires_at, rl.revoked_at
222
223
  FROM review_links rl
223
224
  LEFT JOIN rounds rd ON rd.id = rl.round_id
224
225
  WHERE rl.project_id = ${project.id} AND rl.token_hash = ${sha256(identity.token)}
225
- `;
226
+ `);
226
227
  if (!found)
227
228
  return fail(c, 401, "token_invalid", "That review link is not valid.");
228
229
  if (found.revoked_at)
@@ -250,22 +251,22 @@ export function sessionRoutes(deps) {
250
251
  const typedName = typeof identity.name === "string" ? identity.name.trim().slice(0, 80) : "";
251
252
  reviewerName = link && !link.allow_name_override ? link.name : typedName || link?.name || "Anonymous";
252
253
  if (presented && presentedId) {
253
- const [existing] = await sql `
254
+ const [existing] = await inOrg(sql, project.org_id, (tx) => tx `
254
255
  SELECT id, name FROM reviewers
255
256
  WHERE id = ${presentedId} AND project_id = ${project.id}
256
257
  AND holder_secret_hash = ${sha256(presented)}
257
258
  AND blocked_at IS NULL AND erased_at IS NULL
258
- `;
259
+ `);
259
260
  // §4.4.1: "a mismatch does NOT error — it silently mints a new guest
260
261
  // identity, because a stale storage entry must never lock a reviewer
261
262
  // out." So this is an `if`, not a guard clause.
262
263
  if (existing) {
263
264
  reviewerId = existing.id;
264
265
  if (typedName && (!link || link.allow_name_override)) {
265
- await sql `UPDATE reviewers SET name = ${reviewerName}, last_seen_at = now() WHERE id = ${reviewerId}`;
266
+ await inOrg(sql, project.org_id, (tx) => tx `UPDATE reviewers SET name = ${reviewerName}, last_seen_at = now() WHERE id = ${reviewerId}`);
266
267
  }
267
268
  else {
268
- await sql `UPDATE reviewers SET last_seen_at = now() WHERE id = ${reviewerId}`;
269
+ await inOrg(sql, project.org_id, (tx) => tx `UPDATE reviewers SET last_seen_at = now() WHERE id = ${reviewerId}`);
269
270
  }
270
271
  }
271
272
  }
@@ -304,11 +305,11 @@ export function sessionRoutes(deps) {
304
305
  reviewerId = inserted;
305
306
  if (!reviewerId) {
306
307
  // The conflict fired: this holder already has a row on this link.
307
- const [again] = await sql `
308
+ const [again] = await inOrg(sql, project.org_id, (tx) => tx `
308
309
  SELECT id FROM reviewers
309
310
  WHERE project_id = ${project.id} AND review_link_id = ${link?.id ?? null}
310
311
  AND holder_secret_hash = ${sha256(holderSecret)} AND kind = 'link'
311
- `;
312
+ `);
312
313
  reviewerId = again?.id ?? null;
313
314
  holderSecret = null;
314
315
  }