@snagset/server 0.0.3 → 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 (139) hide show
  1. package/README.md +4 -3
  2. package/dist/app.js +167 -30
  3. package/dist/app.js.map +1 -1
  4. package/dist/bin.js +46 -9
  5. package/dist/bin.js.map +1 -1
  6. package/dist/boot.js +105 -54
  7. package/dist/boot.js.map +1 -1
  8. package/dist/config.generated.js +5 -2
  9. package/dist/config.generated.js.map +1 -1
  10. package/dist/db/connect.js +7 -0
  11. package/dist/db/connect.js.map +1 -1
  12. package/dist/db/migrations/0005_studio_reviewers.sql +45 -0
  13. package/dist/db/migrations/0006_instance_settings.sql +69 -0
  14. package/dist/db/migrations/0007_jira_provider.no-txn.sql +13 -0
  15. package/dist/domain.js +129 -0
  16. package/dist/domain.js.map +1 -0
  17. package/dist/instance/settings.js +54 -0
  18. package/dist/instance/settings.js.map +1 -0
  19. package/dist/integrations/github.js +112 -0
  20. package/dist/integrations/github.js.map +1 -0
  21. package/dist/integrations/inbound.js +88 -0
  22. package/dist/integrations/inbound.js.map +1 -0
  23. package/dist/integrations/jira.js +129 -0
  24. package/dist/integrations/jira.js.map +1 -0
  25. package/dist/integrations/linear.js +111 -0
  26. package/dist/integrations/linear.js.map +1 -0
  27. package/dist/integrations/outbox.js +305 -0
  28. package/dist/integrations/outbox.js.map +1 -0
  29. package/dist/integrations/slack.js +135 -0
  30. package/dist/integrations/slack.js.map +1 -0
  31. package/dist/integrations/store.js +101 -0
  32. package/dist/integrations/store.js.map +1 -0
  33. package/dist/mail/index.js +21 -11
  34. package/dist/mail/index.js.map +1 -1
  35. package/dist/mail/resolve.js +80 -0
  36. package/dist/mail/resolve.js.map +1 -0
  37. package/dist/projectCache.js +3 -2
  38. package/dist/projectCache.js.map +1 -1
  39. package/dist/projects.js +8 -2
  40. package/dist/projects.js.map +1 -1
  41. package/dist/routes/account.js +59 -0
  42. package/dist/routes/account.js.map +1 -0
  43. package/dist/routes/activity.js +111 -0
  44. package/dist/routes/activity.js.map +1 -0
  45. package/dist/routes/anchorReports.js +196 -0
  46. package/dist/routes/anchorReports.js.map +1 -0
  47. package/dist/routes/assignees.js +139 -0
  48. package/dist/routes/assignees.js.map +1 -0
  49. package/dist/routes/attachments.js +2 -2
  50. package/dist/routes/attachments.js.map +1 -1
  51. package/dist/routes/bodyLimit.js +60 -0
  52. package/dist/routes/bodyLimit.js.map +1 -0
  53. package/dist/routes/comments.js +27 -17
  54. package/dist/routes/comments.js.map +1 -1
  55. package/dist/routes/cors.js +10 -1
  56. package/dist/routes/cors.js.map +1 -1
  57. package/dist/routes/instance.js +164 -0
  58. package/dist/routes/instance.js.map +1 -0
  59. package/dist/routes/integrations.js +610 -0
  60. package/dist/routes/integrations.js.map +1 -0
  61. package/dist/routes/jobs.js +15 -3
  62. package/dist/routes/jobs.js.map +1 -1
  63. package/dist/routes/mcpTokens.js +119 -0
  64. package/dist/routes/mcpTokens.js.map +1 -0
  65. package/dist/routes/members.js +177 -0
  66. package/dist/routes/members.js.map +1 -0
  67. package/dist/routes/owner.js +64 -7
  68. package/dist/routes/owner.js.map +1 -1
  69. package/dist/routes/sites.js +181 -8
  70. package/dist/routes/sites.js.map +1 -1
  71. package/dist/routes/threads.js +276 -9
  72. package/dist/routes/threads.js.map +1 -1
  73. package/dist/serverless.js +39 -6
  74. package/dist/serverless.js.map +1 -1
  75. package/dist/studioReviewers.js +67 -0
  76. package/dist/studioReviewers.js.map +1 -0
  77. package/dist/vendor/adapters/outbound/sanitise.js +18 -3
  78. package/dist/vendor/types/brief.js +121 -0
  79. package/package.json +1 -1
  80. package/static/dashboard/assets/CompositeItem-CoPuxIvr.js +1 -0
  81. package/static/dashboard/assets/ConfirmDialog-DkCcJwll.js +1 -0
  82. package/static/dashboard/assets/CopyButton-BNa2pLLv.js +1 -0
  83. package/static/dashboard/assets/FieldItemContext-DQXjpFtW.js +1 -0
  84. package/static/dashboard/assets/InstallTag-SOlWl7Hx.js +1 -0
  85. package/static/dashboard/assets/SaveState-CmxB4XyX.js +6 -0
  86. package/static/dashboard/assets/_app-DNkv3HBi.js +1 -0
  87. package/static/dashboard/assets/_app-xVQe811c.js +56 -0
  88. package/static/dashboard/assets/activity-DsMa5Ja6.js +1 -0
  89. package/static/dashboard/assets/arrow-left-vQV4xhAD.js +6 -0
  90. package/static/dashboard/assets/avatar-DuPL6QD_.js +1 -0
  91. package/static/dashboard/assets/badge-BWjiIc8T.js +1 -0
  92. package/static/dashboard/assets/card-BIBfCno8.js +1 -0
  93. package/static/dashboard/assets/check-Dpx6GTdT.js +6 -0
  94. package/static/dashboard/assets/chevron-right-DKIlBUGN.js +6 -0
  95. package/static/dashboard/assets/copy-DCbhEe2L.js +6 -0
  96. package/static/dashboard/assets/createBaseUIEventDetails-C_ZVkrgp.js +1 -0
  97. package/static/dashboard/assets/createLucideIcon-C_IGE4WD.js +36 -0
  98. package/static/dashboard/assets/dialog-BT2uWf4e.js +6 -0
  99. package/static/dashboard/assets/dropdown-menu-DSXzPAwB.js +11 -0
  100. package/static/dashboard/assets/image-off-DGWejLDG.js +6 -0
  101. package/static/dashboard/assets/index-BRTBtV91.css +1 -0
  102. package/static/dashboard/assets/index-D6FWZoJT.js +129 -0
  103. package/static/dashboard/assets/label-9QsSpLMA.js +1 -0
  104. package/static/dashboard/assets/labels--UUyt9uB.js +1 -0
  105. package/static/dashboard/assets/layout-grid-UPGEmEw-.js +6 -0
  106. package/static/dashboard/assets/me-0HQsBXLU.js +1 -0
  107. package/static/dashboard/assets/parts-C29uZ5zo.js +1 -0
  108. package/static/dashboard/assets/plus-BFNS5LcY.js +6 -0
  109. package/static/dashboard/assets/s._site-D6Ep2tdc.js +1 -0
  110. package/static/dashboard/assets/s._site.comments-BRVI5gpJ.js +39 -0
  111. package/static/dashboard/assets/s._site.reviewers-CiEkZnnp.js +1 -0
  112. package/static/dashboard/assets/s._site.settings-BqLGyfEd.js +1 -0
  113. package/static/dashboard/assets/setup-dUMCPWdf.js +1 -0
  114. package/static/dashboard/assets/sign-in-CdRa-bio.js +1 -0
  115. package/static/dashboard/assets/sites-CmbtFKoo.js +1 -0
  116. package/static/dashboard/assets/studio-BHuVXWZh.js +1 -0
  117. package/static/dashboard/assets/studio-BjeTOKda.js +1 -0
  118. package/static/dashboard/assets/studio.index--kuzOs7w.js +1 -0
  119. package/static/dashboard/assets/studio.integrations-Bq6HP80a.js +1 -0
  120. package/static/dashboard/assets/studio.members-8AB1KYsw.js +1 -0
  121. package/static/dashboard/assets/sun-BCiTcgnh.js +16 -0
  122. package/static/dashboard/assets/table-BXmeI_yA.js +1 -0
  123. package/static/dashboard/assets/update-duXzIzFS.js +1 -0
  124. package/static/dashboard/assets/useBaseQuery-Cp9wivVR.js +1 -0
  125. package/static/dashboard/assets/useQuery-BZXZlOqO.js +1 -0
  126. package/static/dashboard/assets/useRender-CO8aPW06.js +1 -0
  127. package/static/dashboard/assets/users-Dvw2FCKM.js +6 -0
  128. package/static/dashboard/assets/welcome-BHKjw20b.js +11 -0
  129. package/static/dashboard/assets/you-RBpAfUMU.js +1 -0
  130. package/static/dashboard/assets/zod-BpyjQIvb.js +1 -0
  131. package/static/dashboard/index.html +17 -2
  132. package/static/widget/snag.capture.js +1 -1
  133. package/static/widget/snag.dock.js +1 -1
  134. package/static/widget/snag.panels.js +1 -1
  135. package/static/widget/snag.runtime.js +2 -2
  136. package/static/widget/snag.text.js +1 -1
  137. package/vercel.json +4 -0
  138. package/static/dashboard/assets/index-DsUJ96yc.css +0 -1
  139. package/static/dashboard/assets/index-DultqpS7.js +0 -1
package/README.md CHANGED
@@ -10,7 +10,8 @@ DATABASE_URL=postgres://… npx snagset
10
10
  ```
11
11
 
12
12
  That is the whole install. The bin migrates its own schema under an advisory
13
- lock, generates a signing key if it has none, prints a claim URL, and serves.
13
+ lock, generates a signing key if it has none, and serves. An instance with no
14
+ owner shows a setup screen; the first person to fill it in becomes the owner.
14
15
  Postgres is the only requirement — [A9a, LOCK L6](../../specs/00-foundations.md):
15
16
  no Redis, no S3, no queue, no extensions.
16
17
 
@@ -18,7 +19,7 @@ no Redis, no S3, no queue, no extensions.
18
19
  |---|---|
19
20
  | `snagset` | migrate, then serve (the default) |
20
21
  | `snagset migrate` | migrate and exit — for a deploy step |
21
- | `snagset bootstrap` | mint a fresh claim URL, voiding any outstanding one |
22
+ | `snagset bootstrap` | claim the instance headlessly, from `SNAGSET_BOOTSTRAP_*` |
22
23
  | `snagset origins <uid>` | what may write to a project, and what has asked to |
23
24
  | `snagset allow-origin <uid> <origin>` | approve one |
24
25
 
@@ -29,7 +30,7 @@ Exit codes: `2` bad config, `3` database unreachable, `4` a migration refused
29
30
 
30
31
  `orgs` is empty, so the instance is **CLAIMABLE**: every route but `/healthz`,
31
32
  `/readyz`, `/api/v1/meta` and `/api/v1/setup` answers `409 instance_unclaimed`,
32
- and the claim URL is printed to stdout and to `<data>/bootstrap.txt`.
33
+ and `<data>/secret.key` is the only thing written there — back it up.
33
34
 
34
35
  409 and not 503 is deliberate ([08 §3.4](../../specs/08-deployment.md)): a 503
35
36
  tells every proxy in the path that a healthy instance is unhealthy, and a
package/dist/app.js CHANGED
@@ -3,12 +3,22 @@ import { randomUUID, randomBytes, timingSafeEqual } from "node:crypto";
3
3
  import { readFileSync, existsSync, statSync } from "node:fs";
4
4
  import { dirname, join, resolve } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
- import { tokenHash } from "./boot.js";
7
- import { selectMailer } from "./mail/index.js";
6
+ import { isClaimed, isClaimedFast, tokenHash } from "./boot.js";
7
+ import { isConfigured } from "./mail/index.js";
8
+ import { resolveMailer } from "./mail/resolve.js";
9
+ import { instanceRoutes } from "./routes/instance.js";
10
+ import { integrationRoutes } from "./routes/integrations.js";
11
+ import { mcpTokenRoutes } from "./routes/mcpTokens.js";
12
+ import { activityRoutes } from "./routes/activity.js";
13
+ import { isTracker, listIntegrations } from "./integrations/store.js";
8
14
  import { widgetRoutes } from "./routes/widget.js";
9
15
  import { jobsRoutes } from "./routes/jobs.js";
16
+ import { memberRoutes } from "./routes/members.js";
17
+ import { accountRoutes } from "./routes/account.js";
10
18
  import { rlsStatus } from "./db/rls.js";
11
19
  import { threadRoutes } from "./routes/threads.js";
20
+ import { bodyLimit } from "./routes/bodyLimit.js";
21
+ import { anchorReportRoutes } from "./routes/anchorReports.js";
12
22
  import { commentRoutes } from "./routes/comments.js";
13
23
  import { commentEditRoutes } from "./routes/commentEdit.js";
14
24
  import { corsForProjects } from "./routes/cors.js";
@@ -18,6 +28,7 @@ import { attachmentRoutes, features } from "./routes/attachments.js";
18
28
  import { sessionRoutes } from "./routes/sessions.js";
19
29
  import { reviewLinkRoutes } from "./routes/reviewLinks.js";
20
30
  import { roundRoutes } from "./routes/rounds.js";
31
+ import { assigneeRoutes } from "./routes/assignees.js";
21
32
  import { siteRoutes } from "./routes/sites.js";
22
33
  import { mcpAuth } from "./routes/mcpAuth.js";
23
34
  import { createKeyring } from "./keys.js";
@@ -79,6 +90,12 @@ export function createApp(deps) {
79
90
  c.header(header("server"), deps.version);
80
91
  c.header(header("time"), new Date().toISOString());
81
92
  });
93
+ /**
94
+ * 05 §9.3's body cap, mounted directly after the request-id middleware so a
95
+ * `413` still carries an id an operator can grep for — and BEFORE every
96
+ * route, because the point is to refuse a body rather than to read one.
97
+ */
98
+ app.use("*", bodyLimit(() => cfg.int("SNAGSET_MAX_BODY_BYTES")));
82
99
  app.onError((err, c) => {
83
100
  console.error(`error [${c.get("requestId")}]`, err);
84
101
  return fail(c, 500, "internal_error", "Something went wrong on the server.");
@@ -131,19 +148,38 @@ export function createApp(deps) {
131
148
  serverTime: new Date().toISOString(),
132
149
  });
133
150
  });
151
+ /**
152
+ * 05 §6.10 — the claim. Single-use, and the transaction either creates an
153
+ * entire working instance or none of it.
154
+ */
155
+ /**
156
+ * Does this instance have an owner yet? Public, and it has to be: the setup
157
+ * screen is what an unclaimed instance shows instead of a sign-in form for
158
+ * an account that does not exist, and it cannot know which to draw without
159
+ * asking. It leaks exactly one bit, and that bit is inherent to first-run
160
+ * setup being open at all.
161
+ */
162
+ app.get("/api/v1/setup", async (c) => c.json({ claimed: await isClaimedFast(sql) }));
134
163
  /**
135
164
  * 05 §6.10 — the claim. Single-use, and the transaction either creates an
136
165
  * entire working instance or none of it.
137
166
  */
138
167
  app.post("/api/v1/setup", async (c) => {
139
- if (deps.state === "READY") {
168
+ // ASKED OF THE DATABASE, not of this process. `deps.state` is per-process
169
+ // and `serverless.ts` hardcodes it READY — because a function instance
170
+ // cannot run the boot state machine — so this endpoint answered 409 to
171
+ // every request on the blessed deploy and the instance could not be
172
+ // claimed AT ALL. The logs it told people to read for a claim URL never
173
+ // printed one either: serverless never mints a token.
174
+ if (await isClaimed(sql)) {
140
175
  return fail(c, 409, "already_claimed", "This instance has already been claimed.");
141
176
  }
142
177
  const body = (await c.req.json().catch(() => null));
143
178
  const str = (k) => (typeof body?.[k] === "string" ? body[k] : "");
144
179
  const [token, orgName, email, password] = ["token", "orgName", "email", "password"].map(str);
145
180
  const projectName = str("projectName");
146
- for (const [k, v] of Object.entries({ token, orgName, email, password })) {
181
+ // `token` is NOT in this list any more — see the claim check below.
182
+ for (const [k, v] of Object.entries({ orgName, email, password })) {
147
183
  if (!v)
148
184
  return fail(c, 400, "validation_failed", `${k} is required.`, { field: k });
149
185
  }
@@ -152,21 +188,50 @@ export function createApp(deps) {
152
188
  field: "password",
153
189
  });
154
190
  }
155
- // Step 1 — constant-time compare. The row is found by hash rather than
156
- // fetched-then-compared so a wrong token and an unknown token take the
157
- // same path; `timingSafeEqual` then covers the compare itself.
158
- const want = tokenHash(token);
159
- const rows = await sql `
160
- SELECT id, token_hash FROM setup_tokens
161
- WHERE consumed_at IS NULL AND (expires_at IS NULL OR expires_at > now())
162
- `;
163
- const match = rows.find((r) => r.token_hash.length === want.length && timingSafeEqual(r.token_hash, want));
164
- // §6.10 step 1 and 08 §3.4 step 6: unknown or consumed is 409
165
- // already_claimed, NOT 403. Same code for both, so a guesser learns
166
- // nothing from the difference.
167
- if (!match) {
168
- return fail(c, 409, "already_claimed", "That claim token is not valid. If the instance is already set up, sign in instead; " +
169
- "otherwise run `npx snagset bootstrap` for a fresh one.");
191
+ /**
192
+ * THE CLAIM, and the decision it encodes (Eurico, 2026-09-01).
193
+ *
194
+ * An unclaimed instance is claimable by whoever asks first — the model
195
+ * Strapi, Ghost and Gitea all use. The token stops being a requirement and
196
+ * becomes an optional extra: supply one and it is still checked, supply
197
+ * none and the first person through the door becomes the owner.
198
+ *
199
+ * WHAT THAT BUYS. The old rule was "hold a token minted at boot", which
200
+ * assumed someone was watching a terminal. Nobody is, on a platform — and
201
+ * serverless never minted one in the first place, so the requirement was
202
+ * not strict, it was impossible. It also dissolves the reason serverless
203
+ * hardcodes `state: "READY"`: with nothing to mint, there is nothing for
204
+ * concurrent function instances to race over.
205
+ *
206
+ * WHAT IT COSTS, stated rather than discovered. Between the moment an
207
+ * instance first answers and the moment someone claims it, anyone who
208
+ * reaches the URL can take it. That window is real on a public, guessable
209
+ * hostname. It closes permanently at the first claim, and `isClaimed`
210
+ * above is what makes "permanently" true on a deployment whose role does
211
+ * not bypass RLS — which is precisely the bug that made this endpoint
212
+ * worth reading twice.
213
+ *
214
+ * A token that IS presented must still be valid. Ignoring a wrong one
215
+ * would be friendlier and worse: it would mean an operator pasting a stale
216
+ * token from an old boot silently claims the instance anyway, and never
217
+ * learns their token was junk.
218
+ */
219
+ let match = null;
220
+ if (token) {
221
+ // Constant-time compare. The row is found by hash rather than
222
+ // fetched-then-compared so a wrong token and an unknown token take the
223
+ // same path; `timingSafeEqual` then covers the compare itself.
224
+ const want = tokenHash(token);
225
+ const rows = await sql `
226
+ SELECT id, token_hash FROM setup_tokens
227
+ WHERE consumed_at IS NULL AND (expires_at IS NULL OR expires_at > now())
228
+ `;
229
+ match =
230
+ rows.find((r) => r.token_hash.length === want.length && timingSafeEqual(r.token_hash, want)) ?? null;
231
+ if (!match) {
232
+ return fail(c, 409, "already_claimed", "That claim token is not valid. If the instance is already set up, sign in instead; " +
233
+ "otherwise leave the token out — an unclaimed instance can be claimed without one.");
234
+ }
170
235
  }
171
236
  const orgId = randomUUID();
172
237
  const userId = randomUUID();
@@ -181,7 +246,10 @@ export function createApp(deps) {
181
246
  await tx `INSERT INTO orgs (id, name, slug) VALUES (${orgId}, ${orgName}, ${slugify(orgName)})`;
182
247
  await tx `
183
248
  INSERT INTO users (id, org_id, email, name, password_hash, email_verified)
184
- VALUES (${userId}, ${orgId}, ${email}, ${orgName}, ${hashPassword(password)}, true)
249
+ -- name is '', not the studio's: setup asks for a studio name and an
250
+ -- email, never for the person's name, and the rail introduced the
251
+ -- owner as their own studio. Empty falls back to the email everywhere.
252
+ VALUES (${userId}, ${orgId}, ${email}, '', ${hashPassword(password)}, true)
185
253
  `;
186
254
  await tx `
187
255
  INSERT INTO memberships (org_id, user_id, role) VALUES (${orgId}, ${userId}, 'owner')
@@ -199,10 +267,13 @@ export function createApp(deps) {
199
267
  VALUES (${randomUUID()}, ${orgId}, ${userId}, ${tokenHash(sessionToken)},
200
268
  now() + interval '30 days')
201
269
  `;
202
- await tx `UPDATE setup_tokens SET consumed_at = now() WHERE id = ${match.id}`;
270
+ if (match)
271
+ await tx `UPDATE setup_tokens SET consumed_at = now() WHERE id = ${match.id}`;
203
272
  // Step 2's last clause. Any other outstanding token is now a second key
204
- // to a door that has been opened; there is no reason for one to survive.
205
- await tx `DELETE FROM setup_tokens WHERE id <> ${match.id} AND consumed_at IS NULL`;
273
+ // to a door that has been opened; there is no reason for one to survive
274
+ // — and that holds whether or not a token was the thing that opened it,
275
+ // so a tokenless claim sweeps them too.
276
+ await tx `DELETE FROM setup_tokens WHERE consumed_at IS NULL`;
206
277
  return { projectUid: created.uid };
207
278
  });
208
279
  deps.state = "READY";
@@ -238,7 +309,18 @@ export function createApp(deps) {
238
309
  * route group because the last time a credential middleware lived inside one
239
310
  * group, the route registered before it answered without protection.
240
311
  */
241
- app.use("*", ownerAuth(ownerDeps));
312
+ //
313
+ // ON /api/* AND /auth/* — not "*". The mount POINT is unchanged (first,
314
+ // before any route that reads the owner), which is what the paragraph
315
+ // above is protecting; the mount PATH is narrowed to the only two prefixes
316
+ // where c.get("owner") is ever read. Measured before this in a clean
317
+ // Chromium with a stale session cookie: GET / 554 ms, the bundle 545 ms,
318
+ // the stylesheet 562 ms, then /api/v1/me 528 ms — sign-in at 1.9 s, every
319
+ // request paying a user_sessions lookup against Neon for a credential a
320
+ // static file cannot use. Without the cookie the same load took 97 ms. A
321
+ // signed-in operator paid the same trip per asset, silently, all day.
322
+ app.use("/api/*", ownerAuth(ownerDeps));
323
+ app.use("/auth/*", ownerAuth(ownerDeps));
242
324
  app.route("/", ownerRoutes(ownerDeps));
243
325
  /**
244
326
  * MCP bearer auth (07 §8.2), app-wide for the same reason `ownerAuth` is:
@@ -271,13 +353,20 @@ export function createApp(deps) {
271
353
  */
272
354
  app.use("/api/v1/projects/:uid/*", corsForProjects(sql, async (uid) => {
273
355
  const p = await projects.get(uid).catch(() => null);
274
- return p ? { id: p.id, org_id: p.org_id } : null;
356
+ return p ? { id: p.id, org_id: p.org_id, domain: p.domain } : null;
275
357
  }));
276
358
  // After CORS, before the routes: a session is ATTACHED when one verifies and
277
359
  // the route decides whether it needed one. `/sessions` is excluded — it is
278
360
  // where a bearer is exchanged, not presented.
361
+ // §6.7's telemetry travels on the reviewer's own session, like every other
362
+ // widget write — it is reported BY a reviewer about a pin they are looking
363
+ // at, so it needs no permission of its own beyond being signed in.
364
+ app.use("/api/v1/projects/:uid/anchor-reports", bearerAuth(keys, projects, ttls.absoluteS, reviewers));
279
365
  app.use("/api/v1/projects/:uid/threads", bearerAuth(keys, projects, ttls.absoluteS, reviewers));
280
366
  app.use("/api/v1/projects/:uid/threads/*", bearerAuth(keys, projects, ttls.absoluteS, reviewers));
367
+ // The assignee pool (05 §6.4b) answers a review-link session too — a client
368
+ // reads who can be assigned, and a team link assigns.
369
+ app.use("/api/v1/projects/:uid/assignees", bearerAuth(keys, projects, ttls.absoluteS, reviewers));
281
370
  // The dashboard's unscoped form, `/api/v1/threads/{id}/comments` — no `:uid`
282
371
  // segment for `bearerAuth` to read, so this mount is a no-op today (it
283
372
  // returns immediately whenever its own `uid` param is absent). Added anyway
@@ -289,8 +378,26 @@ export function createApp(deps) {
289
378
  // Whether to QUEUE a notification at all — see CommentDeps.notifications.
290
379
  // Computed once at construction: the transport cannot change without a
291
380
  // config change, and a config change means a restart.
292
- const notifications = selectMailer(cfg).kind !== "none";
293
- app.route("/", threadRoutes(sql, projects, () => features(sql, keys), notifications));
381
+ const env = deps.env ?? process.env;
382
+ // Asked per write rather than computed once (D89): a transport connected on
383
+ // Studio › General counts from its next send, with no restart.
384
+ const notifications = async () => isConfigured((await resolveMailer(sql, keys, cfg)).status);
385
+ // D95/D97: the site's tracker connections, read without opening a token.
386
+ const trackers = async (orgId, projectId) => (await listIntegrations(sql, keys, orgId))
387
+ .filter((i) => i.projectId === projectId && i.enabled && isTracker(i.provider))
388
+ .map((i) => ({ id: i.id, provider: i.provider, createOn: (i.config.createOn === "thread.created" ? "thread.created" : "manual") }));
389
+ const githubApiBase = deps.githubApiBase ?? cfg.get("SNAGSET_GITHUB_API_BASE");
390
+ const linearApiBase = deps.linearApiBase ?? cfg.get("SNAGSET_LINEAR_API_BASE");
391
+ const slackApiBase = deps.slackApiBase ?? cfg.get("SNAGSET_SLACK_API_BASE");
392
+ const push = {
393
+ keys,
394
+ baseUrl: baseUrl.origin,
395
+ ...(githubApiBase ? { githubApiBase } : {}),
396
+ ...(linearApiBase ? { linearApiBase } : {}),
397
+ ...(slackApiBase ? { slackApiBase } : {}),
398
+ };
399
+ app.route("/", threadRoutes(sql, projects, () => features(sql, keys, env), notifications, baseUrl.origin, trackers));
400
+ app.route("/", anchorReportRoutes(sql, projects, () => cfg.int("SNAGSET_RATE_LIMIT_ANCHOR_REPORTS_PER_MIN")));
294
401
  app.route("/", commentRoutes({ sql, projects, notifications }));
295
402
  /**
296
403
  * Editing and deleting a comment (endpoints 12 and 13). Mounted here, beside
@@ -339,8 +446,8 @@ export function createApp(deps) {
339
446
  */
340
447
  const unclaimedFirst = async (c, next) => {
341
448
  if (deps.state !== "READY") {
342
- return fail(c, 409, "instance_unclaimed", "This instance has not been claimed yet. Open the claim URL from the server logs, " +
343
- "or run `snagset bootstrap`.");
449
+ return fail(c, 409, "instance_unclaimed", "This instance has not been claimed yet. Open it in a browser to create the first " +
450
+ "owner, or run `snagset bootstrap` to claim it from the command line.");
344
451
  }
345
452
  return next();
346
453
  };
@@ -358,7 +465,35 @@ export function createApp(deps) {
358
465
  * who can stop the mail are the ones still able to log in.
359
466
  */
360
467
  app.route("/", unsubscribeRoutes({ sql, keys }));
361
- app.route("/", siteRoutes({ sql, graceHours: cfg.int("SNAGSET_WRITE_MODE_GRACE_HOURS") }));
468
+ app.route("/", siteRoutes({ sql, projects, graceHours: cfg.int("SNAGSET_WRITE_MODE_GRACE_HOURS") }));
469
+ // Members — a signed-in cookie for everything, and the route itself decides
470
+ // what an admin may do (see members.ts: owners change the list, admins read it).
471
+ app.use("/api/v1/members", requireOwner());
472
+ app.use("/api/v1/members/*", requireOwner());
473
+ // D89 — what the instance is connected to. Dashboard-class: cookie and CSRF.
474
+ app.use("/api/v1/instance", requireOwner());
475
+ app.use("/api/v1/instance/*", requireOwner());
476
+ app.route("/", instanceRoutes({ sql, keys, cfg, env }));
477
+ // D95 — the trackers. Dashboard-class, owners write.
478
+ app.use("/api/v1/integrations", requireOwner());
479
+ // D102: the studio's own feed across every site. Any signed-in member.
480
+ app.use("/api/v1/activity", requireOwner());
481
+ app.route("/", activityRoutes(sql));
482
+ // D100: the agent tokens — owners mint and revoke, admins see.
483
+ app.use("/api/v1/mcp-tokens", requireOwner());
484
+ app.use("/api/v1/mcp-tokens/*", requireOwner());
485
+ app.route("/", mcpTokenRoutes({ sql, projects }));
486
+ app.use("/api/v1/projects/:uid/integrations/*", requireOwner());
487
+ app.use("/api/v1/projects/:uid/threads/:id/integrations/*", requireOwner());
488
+ app.route("/", integrationRoutes({ sql, keys, projects, push, baseUrl: baseUrl.origin, notifications }));
489
+ app.route("/", memberRoutes({ sql }));
490
+ // The studio's name, your name, your password (account.ts). requireOwner
491
+ // on /api/v1/me adds nothing to the GET it already guards itself, and puts
492
+ // the CSRF check in front of the PATCH and the POST.
493
+ app.use("/api/v1/org", requireOwner());
494
+ app.use("/api/v1/me", requireOwner());
495
+ app.use("/api/v1/me/*", requireOwner());
496
+ app.route("/", accountRoutes({ sql }));
362
497
  app.use("/api/v1/projects/:uid/review-links", requireOwner());
363
498
  app.use("/api/v1/review-links/*", requireOwner());
364
499
  // Rounds are a STUDIO act (D2, and `rounds.created_by` references `users`
@@ -367,6 +502,8 @@ export function createApp(deps) {
367
502
  app.use("/api/v1/projects/:uid/rounds", requireOwner());
368
503
  app.use("/api/v1/rounds/*", requireOwner());
369
504
  app.route("/", roundRoutes({ sql, projects }));
505
+ // 05 §6.4b — the assignee pool and the placeholder person (D90).
506
+ app.route("/", assigneeRoutes({ sql, projects }));
370
507
  app.route("/", reviewLinkRoutes({
371
508
  sql,
372
509
  projects,
package/dist/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
package/dist/bin.js CHANGED
@@ -10,7 +10,7 @@ import { ID_PREFIX } from "./vendor/types/names.js";
10
10
  import { connect } from "./db/connect.js";
11
11
  import { loadConfig, ConfigError } from "./config.js";
12
12
  import { migrate, MigrationError } from "./db/migrate.js";
13
- import { boot, bootstrapFromEnv, claimBanner, mintClaim, resolveSecretKey } from "./boot.js";
13
+ import { boot, bootstrapFromEnv, resolveSecretKey, unclaimedBanner } from "./boot.js";
14
14
  import { REGISTRY } from "./config.generated.js";
15
15
  import { createProject } from "./projects.js";
16
16
  import { createApp } from "./app.js";
@@ -151,7 +151,12 @@ async function main() {
151
151
  // so a support paste of this output does not carry an API key.
152
152
  const state = set
153
153
  ? row.secret
154
- ? "set (hidden)"
154
+ // A URL hides its CREDENTIAL, not itself. `set (hidden)` on the one
155
+ // required variable turns the diagnostic command into a coin flip —
156
+ // the operator still cannot tell whether they pasted the pooled
157
+ // string or the direct one, or which database it points at. So the
158
+ // password goes and everything you would actually check stays.
159
+ ? redactUrlish(process.env[row.name])
155
160
  : `set — ${process.env[row.name]}`
156
161
  : row.default !== null
157
162
  ? `default ${row.default}`
@@ -823,12 +828,14 @@ async function main() {
823
828
  await sql.end({ timeout: 5 });
824
829
  return 0;
825
830
  }
826
- const url = await mintClaim(sql, cfg, cfg.required("SNAGSET_DATA_DIR"));
827
- console.log("\n" + claimBanner(url));
828
- console.log("\nAny previous claim URL is now void.");
831
+ // NOTHING TO MINT — D82. There is no claim URL to hand back, because an
832
+ // unclaimed instance no longer needs one: open it and create the owner.
833
+ // This command still earns its place for the branch above, which is the
834
+ // headless path and the only one a deploy script can take.
835
+ console.log("\n" + unclaimedBanner(cfg.required("SNAGSET_BASE_URL").replace(/\/+$/, "")));
829
836
  // Named here rather than left to the docs: an operator running `bootstrap`
830
837
  // by hand is, by definition, at a shell — which is where the scripted path
831
- // is available and the URL is not needed.
838
+ // is available and a browser may not be.
832
839
  console.log("\nPrefer no browser? Set SNAGSET_BOOTSTRAP_OWNER_EMAIL, " +
833
840
  "SNAGSET_BOOTSTRAP_OWNER_PASSWORD_FILE, SNAGSET_BOOTSTRAP_PROJECT_NAME and " +
834
841
  "SNAGSET_BOOTSTRAP_PROJECT_ORIGINS, then run this again — `snagset env` lists them.");
@@ -894,14 +901,25 @@ function startJobTicker(sql, cfg, dataDir) {
894
901
  const { l1Jobs } = await import("./jobs/reaper.js");
895
902
  const { getBucket } = await import("./storage/settings.js");
896
903
  const { createKeyring } = await import("./keys.js");
897
- const { selectMailer } = await import("./mail/index.js");
898
904
  const { deliverEmail } = await import("./mail/notify.js");
899
905
  const keys = createKeyring(resolveSecretKey(cfg, dataDir, () => { }), cfg.get("SNAGSET_SECRET_KEY_PREVIOUS"));
900
906
  const bucket = await getBucket(sql, keys).catch(() => null);
901
907
  // Resolved per tick for the same reason as the bucket: an operator who
902
908
  // sets a mail key and restarts nothing should still get their mail.
903
- const mailer = selectMailer(cfg);
904
- const jobs = [...l1Jobs(bucket), deliverEmail(mailer, cfg.get("SNAGSET_BASE_URL") ?? "", keys)];
909
+ const { resolveMailer } = await import("./mail/resolve.js");
910
+ const mailer = (await resolveMailer(sql, keys, cfg)).status;
911
+ const { pushToTrackers } = await import("./integrations/outbox.js");
912
+ const jobs = [
913
+ ...l1Jobs(bucket),
914
+ deliverEmail(mailer, cfg.get("SNAGSET_BASE_URL") ?? "", keys),
915
+ pushToTrackers(sql, {
916
+ keys,
917
+ baseUrl: cfg.get("SNAGSET_BASE_URL") ?? "",
918
+ ...(cfg.get("SNAGSET_GITHUB_API_BASE") ? { githubApiBase: cfg.get("SNAGSET_GITHUB_API_BASE") } : {}),
919
+ ...(cfg.get("SNAGSET_LINEAR_API_BASE") ? { linearApiBase: cfg.get("SNAGSET_LINEAR_API_BASE") } : {}),
920
+ ...(cfg.get("SNAGSET_SLACK_API_BASE") ? { slackApiBase: cfg.get("SNAGSET_SLACK_API_BASE") } : {}),
921
+ }),
922
+ ];
905
923
  const summary = await runDueJobs(sql, jobs, {
906
924
  // Well under the interval, so a tick can never overrun into the next
907
925
  // one even when every job has work.
@@ -949,4 +967,23 @@ main()
949
967
  const msg = `${e instanceof Error ? e.message : String(e)} ${errCode(e) ?? ""}`;
950
968
  process.exit(/ECONNREFUSED|ENOTFOUND|ETIMEDOUT|password|SASL|SSL/i.test(msg) ? 3 : 1);
951
969
  });
970
+ /**
971
+ * `set (hidden)`, unless the value is a URL — then show it with the password
972
+ * replaced. 08 §4.11: a secret in a `.env` reaches every backup and CI log,
973
+ * and that is as true of `DATABASE_URL` as of an API key. But hiding the whole
974
+ * string helps nobody diagnose "is my connection string the pooled one", which
975
+ * is the question this command exists to answer.
976
+ */
977
+ function redactUrlish(value) {
978
+ try {
979
+ const u = new URL(value);
980
+ if (!u.password)
981
+ return `set — ${value}`;
982
+ u.password = "***";
983
+ return `set — ${u.toString()}`;
984
+ }
985
+ catch {
986
+ return "set (hidden)";
987
+ }
988
+ }
952
989
  //# sourceMappingURL=bin.js.map