@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.
- package/README.md +4 -3
- package/dist/app.js +167 -30
- package/dist/app.js.map +1 -1
- package/dist/bin.js +46 -9
- package/dist/bin.js.map +1 -1
- package/dist/boot.js +105 -54
- package/dist/boot.js.map +1 -1
- package/dist/config.generated.js +5 -2
- package/dist/config.generated.js.map +1 -1
- package/dist/db/connect.js +7 -0
- package/dist/db/connect.js.map +1 -1
- package/dist/db/migrations/0005_studio_reviewers.sql +45 -0
- package/dist/db/migrations/0006_instance_settings.sql +69 -0
- package/dist/db/migrations/0007_jira_provider.no-txn.sql +13 -0
- package/dist/domain.js +129 -0
- package/dist/domain.js.map +1 -0
- package/dist/instance/settings.js +54 -0
- package/dist/instance/settings.js.map +1 -0
- package/dist/integrations/github.js +112 -0
- package/dist/integrations/github.js.map +1 -0
- package/dist/integrations/inbound.js +88 -0
- package/dist/integrations/inbound.js.map +1 -0
- package/dist/integrations/jira.js +129 -0
- package/dist/integrations/jira.js.map +1 -0
- package/dist/integrations/linear.js +111 -0
- package/dist/integrations/linear.js.map +1 -0
- package/dist/integrations/outbox.js +305 -0
- package/dist/integrations/outbox.js.map +1 -0
- package/dist/integrations/slack.js +135 -0
- package/dist/integrations/slack.js.map +1 -0
- package/dist/integrations/store.js +101 -0
- package/dist/integrations/store.js.map +1 -0
- package/dist/mail/index.js +21 -11
- package/dist/mail/index.js.map +1 -1
- package/dist/mail/resolve.js +80 -0
- package/dist/mail/resolve.js.map +1 -0
- package/dist/projectCache.js +3 -2
- package/dist/projectCache.js.map +1 -1
- package/dist/projects.js +8 -2
- package/dist/projects.js.map +1 -1
- package/dist/routes/account.js +59 -0
- package/dist/routes/account.js.map +1 -0
- package/dist/routes/activity.js +111 -0
- package/dist/routes/activity.js.map +1 -0
- package/dist/routes/anchorReports.js +196 -0
- package/dist/routes/anchorReports.js.map +1 -0
- package/dist/routes/assignees.js +139 -0
- package/dist/routes/assignees.js.map +1 -0
- package/dist/routes/attachments.js +2 -2
- package/dist/routes/attachments.js.map +1 -1
- package/dist/routes/bodyLimit.js +60 -0
- package/dist/routes/bodyLimit.js.map +1 -0
- package/dist/routes/comments.js +27 -17
- package/dist/routes/comments.js.map +1 -1
- package/dist/routes/cors.js +10 -1
- package/dist/routes/cors.js.map +1 -1
- package/dist/routes/instance.js +164 -0
- package/dist/routes/instance.js.map +1 -0
- package/dist/routes/integrations.js +610 -0
- package/dist/routes/integrations.js.map +1 -0
- package/dist/routes/jobs.js +15 -3
- package/dist/routes/jobs.js.map +1 -1
- package/dist/routes/mcpTokens.js +119 -0
- package/dist/routes/mcpTokens.js.map +1 -0
- package/dist/routes/members.js +177 -0
- package/dist/routes/members.js.map +1 -0
- package/dist/routes/owner.js +64 -7
- package/dist/routes/owner.js.map +1 -1
- package/dist/routes/sites.js +181 -8
- package/dist/routes/sites.js.map +1 -1
- package/dist/routes/threads.js +276 -9
- package/dist/routes/threads.js.map +1 -1
- package/dist/serverless.js +39 -6
- package/dist/serverless.js.map +1 -1
- package/dist/studioReviewers.js +67 -0
- package/dist/studioReviewers.js.map +1 -0
- package/dist/vendor/adapters/outbound/sanitise.js +18 -3
- package/dist/vendor/types/brief.js +121 -0
- package/package.json +1 -1
- package/static/dashboard/assets/CompositeItem-CoPuxIvr.js +1 -0
- package/static/dashboard/assets/ConfirmDialog-DkCcJwll.js +1 -0
- package/static/dashboard/assets/CopyButton-BNa2pLLv.js +1 -0
- package/static/dashboard/assets/FieldItemContext-DQXjpFtW.js +1 -0
- package/static/dashboard/assets/InstallTag-SOlWl7Hx.js +1 -0
- package/static/dashboard/assets/SaveState-CmxB4XyX.js +6 -0
- package/static/dashboard/assets/_app-DNkv3HBi.js +1 -0
- package/static/dashboard/assets/_app-xVQe811c.js +56 -0
- package/static/dashboard/assets/activity-DsMa5Ja6.js +1 -0
- package/static/dashboard/assets/arrow-left-vQV4xhAD.js +6 -0
- package/static/dashboard/assets/avatar-DuPL6QD_.js +1 -0
- package/static/dashboard/assets/badge-BWjiIc8T.js +1 -0
- package/static/dashboard/assets/card-BIBfCno8.js +1 -0
- package/static/dashboard/assets/check-Dpx6GTdT.js +6 -0
- package/static/dashboard/assets/chevron-right-DKIlBUGN.js +6 -0
- package/static/dashboard/assets/copy-DCbhEe2L.js +6 -0
- package/static/dashboard/assets/createBaseUIEventDetails-C_ZVkrgp.js +1 -0
- package/static/dashboard/assets/createLucideIcon-C_IGE4WD.js +36 -0
- package/static/dashboard/assets/dialog-BT2uWf4e.js +6 -0
- package/static/dashboard/assets/dropdown-menu-DSXzPAwB.js +11 -0
- package/static/dashboard/assets/image-off-DGWejLDG.js +6 -0
- package/static/dashboard/assets/index-BRTBtV91.css +1 -0
- package/static/dashboard/assets/index-D6FWZoJT.js +129 -0
- package/static/dashboard/assets/label-9QsSpLMA.js +1 -0
- package/static/dashboard/assets/labels--UUyt9uB.js +1 -0
- package/static/dashboard/assets/layout-grid-UPGEmEw-.js +6 -0
- package/static/dashboard/assets/me-0HQsBXLU.js +1 -0
- package/static/dashboard/assets/parts-C29uZ5zo.js +1 -0
- package/static/dashboard/assets/plus-BFNS5LcY.js +6 -0
- package/static/dashboard/assets/s._site-D6Ep2tdc.js +1 -0
- package/static/dashboard/assets/s._site.comments-BRVI5gpJ.js +39 -0
- package/static/dashboard/assets/s._site.reviewers-CiEkZnnp.js +1 -0
- package/static/dashboard/assets/s._site.settings-BqLGyfEd.js +1 -0
- package/static/dashboard/assets/setup-dUMCPWdf.js +1 -0
- package/static/dashboard/assets/sign-in-CdRa-bio.js +1 -0
- package/static/dashboard/assets/sites-CmbtFKoo.js +1 -0
- package/static/dashboard/assets/studio-BHuVXWZh.js +1 -0
- package/static/dashboard/assets/studio-BjeTOKda.js +1 -0
- package/static/dashboard/assets/studio.index--kuzOs7w.js +1 -0
- package/static/dashboard/assets/studio.integrations-Bq6HP80a.js +1 -0
- package/static/dashboard/assets/studio.members-8AB1KYsw.js +1 -0
- package/static/dashboard/assets/sun-BCiTcgnh.js +16 -0
- package/static/dashboard/assets/table-BXmeI_yA.js +1 -0
- package/static/dashboard/assets/update-duXzIzFS.js +1 -0
- package/static/dashboard/assets/useBaseQuery-Cp9wivVR.js +1 -0
- package/static/dashboard/assets/useQuery-BZXZlOqO.js +1 -0
- package/static/dashboard/assets/useRender-CO8aPW06.js +1 -0
- package/static/dashboard/assets/users-Dvw2FCKM.js +6 -0
- package/static/dashboard/assets/welcome-BHKjw20b.js +11 -0
- package/static/dashboard/assets/you-RBpAfUMU.js +1 -0
- package/static/dashboard/assets/zod-BpyjQIvb.js +1 -0
- package/static/dashboard/index.html +17 -2
- package/static/widget/snag.capture.js +1 -1
- package/static/widget/snag.dock.js +1 -1
- package/static/widget/snag.panels.js +1 -1
- package/static/widget/snag.runtime.js +2 -2
- package/static/widget/snag.text.js +1 -1
- package/vercel.json +4 -0
- package/static/dashboard/assets/index-DsUJ96yc.css +0 -1
- package/static/dashboard/assets/index-DultqpS7.js +0 -1
package/dist/routes/cors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cors.js","sourceRoot":"","sources":["../../src/routes/cors.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"cors.js","sourceRoot":"","sources":["../../src/routes/cors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { connectBucket, disconnectBucket, envBucketConfig, storageStatus } from "../storage/settings.js";
|
|
3
|
+
import { clearSetting, writeSetting } from "../instance/settings.js";
|
|
4
|
+
import { describeMailUrl, invalidateMailer, resolveMailer } from "../mail/resolve.js";
|
|
5
|
+
import { isConfigured, mailerFromUrl } from "../mail/index.js";
|
|
6
|
+
function fail(c, status, code, message, details) {
|
|
7
|
+
return c.json({ error: { code, message, ...(details ? { details } : {}), requestId: c.get("requestId") } }, status);
|
|
8
|
+
}
|
|
9
|
+
export function instanceRoutes(deps) {
|
|
10
|
+
const { sql, keys, cfg } = deps;
|
|
11
|
+
const env = deps.env ?? process.env;
|
|
12
|
+
const app = new Hono();
|
|
13
|
+
const mustBeOwner = (c) => {
|
|
14
|
+
const owner = c.get("owner");
|
|
15
|
+
if (!owner)
|
|
16
|
+
return fail(c, 401, "unauthorized", "Sign in to the dashboard first.");
|
|
17
|
+
if (owner.role !== "owner")
|
|
18
|
+
return fail(c, 403, "forbidden", "Only an owner can change what this instance is connected to.");
|
|
19
|
+
return owner;
|
|
20
|
+
};
|
|
21
|
+
const snapshot = async () => {
|
|
22
|
+
const st = await storageStatus(sql, keys, env);
|
|
23
|
+
const mail = await resolveMailer(sql, keys, cfg);
|
|
24
|
+
return {
|
|
25
|
+
storage: {
|
|
26
|
+
source: st.source ?? "none",
|
|
27
|
+
connected: st.connected,
|
|
28
|
+
...(st.config.endpoint ? { endpoint: st.config.endpoint } : {}),
|
|
29
|
+
...(st.config.bucket ? { bucket: st.config.bucket } : {}),
|
|
30
|
+
...(st.config.region ? { region: st.config.region } : {}),
|
|
31
|
+
...(st.config.publicBaseUrl ? { publicBaseUrl: st.config.publicBaseUrl } : {}),
|
|
32
|
+
connectedAt: st.connectedAt ? st.connectedAt.toISOString() : null,
|
|
33
|
+
...(st.unreadable ? { unreadable: true } : {}),
|
|
34
|
+
},
|
|
35
|
+
mail: {
|
|
36
|
+
source: mail.source,
|
|
37
|
+
configured: isConfigured(mail.status),
|
|
38
|
+
...(mail.scheme ? { scheme: mail.scheme } : {}),
|
|
39
|
+
...(mail.host ? { host: mail.host } : {}),
|
|
40
|
+
...(mail.from ? { from: mail.from } : {}),
|
|
41
|
+
updatedAt: mail.updatedAt ? mail.updatedAt.toISOString() : null,
|
|
42
|
+
...(mail.unreadable ? { unreadable: true } : {}),
|
|
43
|
+
...(!isConfigured(mail.status) ? { reason: mail.status.reason } : {}),
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
app.get("/api/v1/instance", async (c) => {
|
|
48
|
+
const owner = c.get("owner");
|
|
49
|
+
if (!owner)
|
|
50
|
+
return fail(c, 401, "unauthorized", "Sign in to the dashboard first.");
|
|
51
|
+
return c.json(await snapshot());
|
|
52
|
+
});
|
|
53
|
+
// ── storage ──────────────────────────────────────────────────────────
|
|
54
|
+
app.put("/api/v1/instance/storage", async (c) => {
|
|
55
|
+
const owner = mustBeOwner(c);
|
|
56
|
+
if (owner instanceof Response)
|
|
57
|
+
return owner;
|
|
58
|
+
if (envBucketConfig(env)) {
|
|
59
|
+
return fail(c, 409, "managed_by_environment", "Storage is set by the environment (SNAGSET_STORAGE_S3_*). Change it there.");
|
|
60
|
+
}
|
|
61
|
+
const body = (await c.req.json().catch(() => null));
|
|
62
|
+
const str = (k) => (typeof body?.[k] === "string" ? body[k].trim() : "");
|
|
63
|
+
const endpoint = str("endpoint");
|
|
64
|
+
const bucket = str("bucket");
|
|
65
|
+
const accessKeyId = str("accessKeyId");
|
|
66
|
+
const secretAccessKey = str("secretAccessKey");
|
|
67
|
+
const region = str("region") || "auto";
|
|
68
|
+
const publicBaseUrl = str("publicBaseUrl");
|
|
69
|
+
for (const [field, v] of [["endpoint", endpoint], ["bucket", bucket], ["accessKeyId", accessKeyId], ["secretAccessKey", secretAccessKey]]) {
|
|
70
|
+
if (!v)
|
|
71
|
+
return fail(c, 422, "validation_failed", `${field} is required.`, { field });
|
|
72
|
+
}
|
|
73
|
+
if (!/^https?:\/\//.test(endpoint)) {
|
|
74
|
+
return fail(c, 422, "validation_failed", "The endpoint is a URL, like https://ams3.digitaloceanspaces.com.", { field: "endpoint" });
|
|
75
|
+
}
|
|
76
|
+
const result = await connectBucket(sql, keys, { endpoint, bucket, region, ...(publicBaseUrl ? { publicBaseUrl } : {}) }, { accessKeyId, secretAccessKey });
|
|
77
|
+
if (!result.ok) {
|
|
78
|
+
return fail(c, 422, "validation_failed", `The ${result.step} probe failed: ${result.detail}`, {
|
|
79
|
+
step: result.step,
|
|
80
|
+
detail: result.detail,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return c.json(await snapshot());
|
|
84
|
+
});
|
|
85
|
+
app.delete("/api/v1/instance/storage", async (c) => {
|
|
86
|
+
const owner = mustBeOwner(c);
|
|
87
|
+
if (owner instanceof Response)
|
|
88
|
+
return owner;
|
|
89
|
+
if (envBucketConfig(env)) {
|
|
90
|
+
return fail(c, 409, "managed_by_environment", "Storage is set by the environment (SNAGSET_STORAGE_S3_*). Change it there.");
|
|
91
|
+
}
|
|
92
|
+
await disconnectBucket(sql);
|
|
93
|
+
return c.json(await snapshot());
|
|
94
|
+
});
|
|
95
|
+
// ── mail ─────────────────────────────────────────────────────────────
|
|
96
|
+
app.put("/api/v1/instance/mail", async (c) => {
|
|
97
|
+
const owner = mustBeOwner(c);
|
|
98
|
+
if (owner instanceof Response)
|
|
99
|
+
return owner;
|
|
100
|
+
if (cfg.get("SNAGSET_MAIL_URL")) {
|
|
101
|
+
return fail(c, 409, "managed_by_environment", "Mail is set by the environment (SNAGSET_MAIL_URL). Change it there.");
|
|
102
|
+
}
|
|
103
|
+
const body = (await c.req.json().catch(() => null));
|
|
104
|
+
const url = typeof body?.["url"] === "string" ? body["url"].trim() : "";
|
|
105
|
+
const from = typeof body?.["from"] === "string" ? body["from"].trim() : "";
|
|
106
|
+
if (!url)
|
|
107
|
+
return fail(c, 422, "validation_failed", "Give the transport: resend://<api-key>, or smtp://user:pass@host:587.", { field: "url" });
|
|
108
|
+
if (!from || !/^[^\s@<>]+@[^\s@<>]+\.[^\s@<>]+$/.test(from.replace(/^.*<([^>]+)>$/, "$1"))) {
|
|
109
|
+
return fail(c, 422, "validation_failed", "Give the From address every message is sent from.", { field: "from" });
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
// The same parse boot applies to the environment: an unsupported scheme
|
|
113
|
+
// or a key-less resend:// is refused HERE with the same sentence.
|
|
114
|
+
mailerFromUrl(url, from);
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
return fail(c, 422, "validation_failed", e instanceof Error ? e.message : String(e), { field: "url" });
|
|
118
|
+
}
|
|
119
|
+
await writeSetting(sql, keys, {
|
|
120
|
+
orgId: owner.orgId,
|
|
121
|
+
key: "mail",
|
|
122
|
+
value: { from, ...describeMailUrl(url) },
|
|
123
|
+
secret: url,
|
|
124
|
+
updatedBy: owner.userId,
|
|
125
|
+
});
|
|
126
|
+
invalidateMailer();
|
|
127
|
+
return c.json(await snapshot());
|
|
128
|
+
});
|
|
129
|
+
app.delete("/api/v1/instance/mail", async (c) => {
|
|
130
|
+
const owner = mustBeOwner(c);
|
|
131
|
+
if (owner instanceof Response)
|
|
132
|
+
return owner;
|
|
133
|
+
if (cfg.get("SNAGSET_MAIL_URL")) {
|
|
134
|
+
return fail(c, 409, "managed_by_environment", "Mail is set by the environment (SNAGSET_MAIL_URL). Change it there.");
|
|
135
|
+
}
|
|
136
|
+
await clearSetting(sql, owner.orgId, "mail");
|
|
137
|
+
invalidateMailer();
|
|
138
|
+
return c.json(await snapshot());
|
|
139
|
+
});
|
|
140
|
+
/** The proof: a message to the person who clicked, with the provider's sentence on failure. */
|
|
141
|
+
app.post("/api/v1/instance/mail/test", async (c) => {
|
|
142
|
+
const owner = mustBeOwner(c);
|
|
143
|
+
if (owner instanceof Response)
|
|
144
|
+
return owner;
|
|
145
|
+
const mail = await resolveMailer(sql, keys, cfg);
|
|
146
|
+
if (!isConfigured(mail.status)) {
|
|
147
|
+
return fail(c, 409, "integration_not_configured", "No mail transport is connected yet.");
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
const sent = await mail.status.send({
|
|
151
|
+
to: owner.email,
|
|
152
|
+
subject: "Snagset can send mail",
|
|
153
|
+
text: "This is the test message from Studio › General. If you are reading it, notifications " +
|
|
154
|
+
"from this instance will arrive the same way.\n",
|
|
155
|
+
});
|
|
156
|
+
return c.json({ to: owner.email, id: sent.id });
|
|
157
|
+
}
|
|
158
|
+
catch (e) {
|
|
159
|
+
return fail(c, 502, "mail_send_failed", e instanceof Error ? e.message : String(e));
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
return app;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=instance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance.js","sourceRoot":"","sources":["../../src/routes/instance.ts"],"names":[],"mappings":"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"}
|