@vibes.diy/api-svc 4.5.4 → 5.0.1
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/autumn.config.d.ts +4 -2
- package/autumn.config.js +12 -7
- package/autumn.config.js.map +1 -1
- package/billing.d.ts +77 -1
- package/billing.js +264 -3
- package/billing.js.map +1 -1
- package/evento-handler-manifest.js +11 -0
- package/evento-handler-manifest.js.map +1 -1
- package/index.d.ts +9 -0
- package/index.js +9 -0
- package/index.js.map +1 -1
- package/intern/components/vibe-page.js +5 -1
- package/intern/components/vibe-page.js.map +1 -1
- package/intern/emit-notification.d.ts +20 -0
- package/intern/emit-notification.js +42 -0
- package/intern/emit-notification.js.map +1 -0
- package/intern/notify-comment-posted.d.ts +8 -0
- package/intern/notify-comment-posted.js +24 -0
- package/intern/notify-comment-posted.js.map +1 -0
- package/intern/notify-dm-received.d.ts +9 -0
- package/intern/notify-dm-received.js +25 -0
- package/intern/notify-dm-received.js.map +1 -0
- package/intern/notify-member-joined.d.ts +11 -0
- package/intern/notify-member-joined.js +16 -0
- package/intern/notify-member-joined.js.map +1 -0
- package/intern/notify-remix-clone.d.ts +6 -0
- package/intern/notify-remix-clone.js +21 -0
- package/intern/notify-remix-clone.js.map +1 -0
- package/intern/notify-remix.d.ts +8 -0
- package/intern/notify-remix.js +23 -0
- package/intern/notify-remix.js.map +1 -0
- package/intern/notify-request-grant.d.ts +9 -0
- package/intern/notify-request-grant.js +18 -0
- package/intern/notify-request-grant.js.map +1 -0
- package/intern/notify-vibe-published.d.ts +7 -0
- package/intern/notify-vibe-published.js +22 -0
- package/intern/notify-vibe-published.js.map +1 -0
- package/intern/vibe-curation-decision.d.ts +18 -0
- package/intern/vibe-curation-decision.js +46 -0
- package/intern/vibe-curation-decision.js.map +1 -0
- package/package.json +11 -11
- package/public/access-helpers.js +5 -1
- package/public/access-helpers.js.map +1 -1
- package/public/app-documents-read-eventos.js +1 -1
- package/public/app-documents-read-eventos.js.map +1 -1
- package/public/app-documents-write-eventos.js +4 -3
- package/public/app-documents-write-eventos.js.map +1 -1
- package/public/billing-msg.d.ts +5 -0
- package/public/billing-msg.js +143 -0
- package/public/billing-msg.js.map +1 -0
- package/public/curated-new-vibes.d.ts +3 -0
- package/public/curated-new-vibes.js +64 -0
- package/public/curated-new-vibes.js.map +1 -0
- package/public/email-unsubscribe.d.ts +7 -0
- package/public/email-unsubscribe.js +41 -0
- package/public/email-unsubscribe.js.map +1 -0
- package/public/ensure-user-settings.js +9 -1
- package/public/ensure-user-settings.js.map +1 -1
- package/public/fork-app.js +24 -1
- package/public/fork-app.js.map +1 -1
- package/public/home-feed-common.d.ts +18 -0
- package/public/home-feed-common.js +46 -0
- package/public/home-feed-common.js.map +1 -0
- package/public/home-leaderboard.d.ts +3 -0
- package/public/home-leaderboard.js +64 -0
- package/public/home-leaderboard.js.map +1 -0
- package/public/image-gen.js +9 -0
- package/public/image-gen.js.map +1 -1
- package/public/list-notifications.d.ts +4 -0
- package/public/list-notifications.js +157 -0
- package/public/list-notifications.js.map +1 -0
- package/usage-report/billing-reconcile-util.d.ts +7 -5
- package/usage-report/billing-reconcile-util.js +32 -17
- package/usage-report/billing-reconcile-util.js.map +1 -1
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../jsr/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC;AAC3B,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yCAAyC,CAAC;AACxD,cAAc,oCAAoC,CAAC;AACnD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,cAAc,iBAAiB,CAAC;AAChC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mCAAmC,CAAC;AAClD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../jsr/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC;AAC3B,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yCAAyC,CAAC;AACxD,cAAc,oCAAoC,CAAC;AACnD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,cAAc,iBAAiB,CAAC;AAChC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mCAAmC,CAAC;AAClD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC"}
|
|
@@ -13,9 +13,13 @@ function ModuleHints({ importMap, preloadModules }) {
|
|
|
13
13
|
const port = u.port && u.port !== "80" && u.port !== "443" ? `:${u.port}` : "";
|
|
14
14
|
origins.add(`${u.protocol}//${u.hostname}${port}`);
|
|
15
15
|
}
|
|
16
|
+
const preloads = preloadModules ?? [];
|
|
17
|
+
const preloadJs = preloads.length === 0
|
|
18
|
+
? undefined
|
|
19
|
+
: `for(const h of ${JSON.stringify(preloads)}){const l=document.createElement("link");l.rel="modulepreload";l.href=h;document.head.appendChild(l)}`.replace(/</g, "\\u003c");
|
|
16
20
|
return (React.createElement(React.Fragment, null,
|
|
17
21
|
[...origins].map((origin) => (React.createElement("link", { key: origin, rel: "preconnect", href: origin, crossOrigin: "anonymous" }))),
|
|
18
|
-
|
|
22
|
+
preloadJs !== undefined && React.createElement("script", { dangerouslySetInnerHTML: { __html: preloadJs } })));
|
|
19
23
|
}
|
|
20
24
|
export function Links() {
|
|
21
25
|
return (React.createElement(React.Fragment, null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vibe-page.js","sourceRoot":"","sources":["../../../jsr/intern/components/vibe-page.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAG5F,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,SAAS,CAAC,IAAqB;IAC7C,OAAO,gCAAQ,IAAI,EAAC,WAAW,EAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,GAAI,CAAC;AACnH,CAAC;
|
|
1
|
+
{"version":3,"file":"vibe-page.js","sourceRoot":"","sources":["../../../jsr/intern/components/vibe-page.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { EmitNotificationInput, NotificationType } from "@vibes.diy/api-types";
|
|
2
|
+
import type { cfDrizzle, VibesApiTables } from "@vibes.diy/api-sql";
|
|
3
|
+
import type { SuperThis } from "@vibes.diy/identity";
|
|
4
|
+
export interface EmitNotificationCtx {
|
|
5
|
+
readonly sthis: SuperThis;
|
|
6
|
+
readonly sql: {
|
|
7
|
+
db: ReturnType<typeof cfDrizzle>["db"];
|
|
8
|
+
tables: VibesApiTables;
|
|
9
|
+
};
|
|
10
|
+
notifyUser?: (userId: string, evt: {
|
|
11
|
+
type: "vibes.diy.evt-user-notification";
|
|
12
|
+
notificationType: NotificationType;
|
|
13
|
+
ownerHandle: string;
|
|
14
|
+
appSlug: string;
|
|
15
|
+
}, senderConnId: string) => Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export declare function emitNotification(qctx: EmitNotificationCtx, input: EmitNotificationInput): Promise<{
|
|
18
|
+
inserted: boolean;
|
|
19
|
+
id: string;
|
|
20
|
+
}>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { and, eq } from "drizzle-orm/sql/expressions";
|
|
2
|
+
export async function emitNotification(qctx, input) {
|
|
3
|
+
const t = qctx.sql.tables.notifications;
|
|
4
|
+
const id = qctx.sthis.nextId().str;
|
|
5
|
+
const created = new Date().toISOString();
|
|
6
|
+
const returned = await qctx.sql.db
|
|
7
|
+
.insert(t)
|
|
8
|
+
.values({
|
|
9
|
+
id,
|
|
10
|
+
userId: input.userId,
|
|
11
|
+
notificationType: input.notificationType,
|
|
12
|
+
ownerHandle: input.ownerHandle,
|
|
13
|
+
appSlug: input.appSlug,
|
|
14
|
+
body: input.body,
|
|
15
|
+
actorHandle: input.actorHandle ?? null,
|
|
16
|
+
actorUserId: input.actorUserId ?? null,
|
|
17
|
+
targetRef: input.targetRef ?? null,
|
|
18
|
+
dedupeKey: input.dedupeKey,
|
|
19
|
+
created,
|
|
20
|
+
readAt: null,
|
|
21
|
+
})
|
|
22
|
+
.onConflictDoNothing({ target: [t.userId, t.dedupeKey] })
|
|
23
|
+
.returning({ id: t.id });
|
|
24
|
+
const inserted = returned.length > 0;
|
|
25
|
+
if (!inserted) {
|
|
26
|
+
const existing = await qctx.sql.db
|
|
27
|
+
.select({ id: t.id })
|
|
28
|
+
.from(t)
|
|
29
|
+
.where(and(eq(t.userId, input.userId), eq(t.dedupeKey, input.dedupeKey)))
|
|
30
|
+
.limit(1)
|
|
31
|
+
.then((r) => r[0]);
|
|
32
|
+
return { inserted: false, id: existing?.id ?? id };
|
|
33
|
+
}
|
|
34
|
+
await qctx.notifyUser?.(input.userId, {
|
|
35
|
+
type: "vibes.diy.evt-user-notification",
|
|
36
|
+
notificationType: input.notificationType,
|
|
37
|
+
ownerHandle: input.ownerHandle,
|
|
38
|
+
appSlug: input.appSlug,
|
|
39
|
+
}, "");
|
|
40
|
+
return { inserted: true, id };
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=emit-notification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-notification.js","sourceRoot":"","sources":["../../jsr/intern/emit-notification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC;AA+CtD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAyB,EACzB,KAA4B;IAE5B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC;IACxC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAEzC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;SAC/B,MAAM,CAAC,CAAC,CAAC;SACT,MAAM,CAAC;QACN,EAAE;QACF,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI;QACtC,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI;QACtC,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;QAClC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,OAAO;QACP,MAAM,EAAE,IAAI;KACb,CAAC;SACD,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;SACxD,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE3B,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAGd,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;aAC/B,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;aACpB,IAAI,CAAC,CAAC,CAAC;aACP,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;aACxE,KAAK,CAAC,CAAC,CAAC;aACR,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;IACrD,CAAC;IAKD,MAAM,IAAI,CAAC,UAAU,EAAE,CACrB,KAAK,CAAC,MAAM,EACZ;QACE,IAAI,EAAE,iCAAiC;QACvC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,EACD,EAAE,CACH,CAAC;IAEF,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { EmitNotificationCtx } from "./emit-notification.js";
|
|
2
|
+
export interface CommentNotifyInput {
|
|
3
|
+
readonly ownerHandle: string;
|
|
4
|
+
readonly appSlug: string;
|
|
5
|
+
readonly docId: string;
|
|
6
|
+
readonly userId?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function notifyCommentPosted(qctx: EmitNotificationCtx, payload: CommentNotifyInput): Promise<void>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { eq } from "drizzle-orm/sql/expressions";
|
|
2
|
+
import { emitNotification } from "./emit-notification.js";
|
|
3
|
+
export async function notifyCommentPosted(qctx, payload) {
|
|
4
|
+
const usb = qctx.sql.tables.handleBinding;
|
|
5
|
+
const ownerRow = await qctx.sql.db
|
|
6
|
+
.select({ userId: usb.userId })
|
|
7
|
+
.from(usb)
|
|
8
|
+
.where(eq(usb.handle, payload.ownerHandle))
|
|
9
|
+
.limit(1)
|
|
10
|
+
.then((r) => r[0] ?? null);
|
|
11
|
+
if (!ownerRow?.userId)
|
|
12
|
+
return;
|
|
13
|
+
await emitNotification(qctx, {
|
|
14
|
+
userId: ownerRow.userId,
|
|
15
|
+
notificationType: "comment-posted",
|
|
16
|
+
ownerHandle: payload.ownerHandle,
|
|
17
|
+
appSlug: payload.appSlug,
|
|
18
|
+
body: `New comment on ${payload.ownerHandle}/${payload.appSlug}.`,
|
|
19
|
+
actorUserId: payload.userId,
|
|
20
|
+
targetRef: { docId: payload.docId },
|
|
21
|
+
dedupeKey: `comment-posted:${payload.docId}`,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=notify-comment-posted.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify-comment-posted.js","sourceRoot":"","sources":["../../jsr/intern/notify-comment-posted.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAuB,MAAM,wBAAwB,CAAC;AAsB/E,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAyB,EAAE,OAA2B;IAC9F,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC;IAC1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;SAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;SAC9B,IAAI,CAAC,GAAG,CAAC;SACT,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;SAC1C,KAAK,CAAC,CAAC,CAAC;SACR,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAE7B,IAAI,CAAC,QAAQ,EAAE,MAAM;QAAE,OAAO;IAE9B,MAAM,gBAAgB,CAAC,IAAI,EAAE;QAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,gBAAgB,EAAE,gBAAgB;QAClC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,kBAAkB,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,GAAG;QACjE,WAAW,EAAE,OAAO,CAAC,MAAM;QAC3B,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE;QACnC,SAAS,EAAE,kBAAkB,OAAO,CAAC,KAAK,EAAE;KAC7C,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { EmitNotificationCtx } from "./emit-notification.js";
|
|
2
|
+
export interface DmNotifyInput {
|
|
3
|
+
readonly senderUserId: string;
|
|
4
|
+
readonly senderUserSlug: string;
|
|
5
|
+
readonly recipientUserSlug: string;
|
|
6
|
+
readonly channelUserSlug: string;
|
|
7
|
+
readonly docId: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function notifyDmReceived(qctx: EmitNotificationCtx, payload: DmNotifyInput): Promise<void>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { eq } from "drizzle-orm/sql/expressions";
|
|
2
|
+
import { emitNotification } from "./emit-notification.js";
|
|
3
|
+
export async function notifyDmReceived(qctx, payload) {
|
|
4
|
+
const usb = qctx.sql.tables.handleBinding;
|
|
5
|
+
const recipientRow = await qctx.sql.db
|
|
6
|
+
.select({ userId: usb.userId })
|
|
7
|
+
.from(usb)
|
|
8
|
+
.where(eq(usb.handle, payload.recipientUserSlug))
|
|
9
|
+
.limit(1)
|
|
10
|
+
.then((r) => r[0] ?? null);
|
|
11
|
+
if (!recipientRow?.userId)
|
|
12
|
+
return;
|
|
13
|
+
await emitNotification(qctx, {
|
|
14
|
+
userId: recipientRow.userId,
|
|
15
|
+
notificationType: "dm-received",
|
|
16
|
+
ownerHandle: payload.recipientUserSlug,
|
|
17
|
+
appSlug: payload.channelUserSlug,
|
|
18
|
+
body: `New message from ${payload.senderUserSlug}.`,
|
|
19
|
+
actorHandle: payload.senderUserSlug,
|
|
20
|
+
actorUserId: payload.senderUserId,
|
|
21
|
+
targetRef: { threadHandle: payload.channelUserSlug, docId: payload.docId },
|
|
22
|
+
dedupeKey: `dm-received:${payload.channelUserSlug}:${payload.docId}`,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=notify-dm-received.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify-dm-received.js","sourceRoot":"","sources":["../../jsr/intern/notify-dm-received.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAuB,MAAM,wBAAwB,CAAC;AA4B/E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAyB,EAAE,OAAsB;IACtF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC;IAC1C,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;SACnC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;SAC9B,IAAI,CAAC,GAAG,CAAC;SACT,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;SAChD,KAAK,CAAC,CAAC,CAAC;SACR,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAE7B,IAAI,CAAC,YAAY,EAAE,MAAM;QAAE,OAAO;IAElC,MAAM,gBAAgB,CAAC,IAAI,EAAE;QAC3B,MAAM,EAAE,YAAY,CAAC,MAAM;QAC3B,gBAAgB,EAAE,aAAa;QAC/B,WAAW,EAAE,OAAO,CAAC,iBAAiB;QACtC,OAAO,EAAE,OAAO,CAAC,eAAe;QAChC,IAAI,EAAE,oBAAoB,OAAO,CAAC,cAAc,GAAG;QACnD,WAAW,EAAE,OAAO,CAAC,cAAc;QACnC,WAAW,EAAE,OAAO,CAAC,YAAY;QACjC,SAAS,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,eAAe,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE;QAC1E,SAAS,EAAE,eAAe,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,KAAK,EAAE;KACrE,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EmitNotificationCtx } from "./emit-notification.js";
|
|
2
|
+
export interface MemberJoinedNotifyInput {
|
|
3
|
+
readonly ownerUserId: string;
|
|
4
|
+
readonly ownerHandle: string;
|
|
5
|
+
readonly appSlug: string;
|
|
6
|
+
readonly memberUserId: string;
|
|
7
|
+
readonly memberLabel?: string;
|
|
8
|
+
readonly role: string;
|
|
9
|
+
readonly updated: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function notifyMemberJoined(qctx: EmitNotificationCtx, input: MemberJoinedNotifyInput): Promise<void>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { emitNotification } from "./emit-notification.js";
|
|
2
|
+
export async function notifyMemberJoined(qctx, input) {
|
|
3
|
+
if (input.memberUserId === input.ownerUserId)
|
|
4
|
+
return;
|
|
5
|
+
const label = input.memberLabel?.trim() ? input.memberLabel.trim() : "Someone";
|
|
6
|
+
await emitNotification(qctx, {
|
|
7
|
+
userId: input.ownerUserId,
|
|
8
|
+
notificationType: "member-joined",
|
|
9
|
+
ownerHandle: input.ownerHandle,
|
|
10
|
+
appSlug: input.appSlug,
|
|
11
|
+
body: `${label} joined ${input.ownerHandle}/${input.appSlug} as ${input.role}.`,
|
|
12
|
+
actorUserId: input.memberUserId,
|
|
13
|
+
dedupeKey: `member-joined:${input.ownerHandle}:${input.appSlug}:${input.memberUserId}:${input.updated}`,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=notify-member-joined.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify-member-joined.js","sourceRoot":"","sources":["../../jsr/intern/notify-member-joined.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAuB,MAAM,wBAAwB,CAAC;AA+B/E,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAyB,EAAE,KAA8B;IAChG,IAAI,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,WAAW;QAAE,OAAO;IAErD,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,MAAM,gBAAgB,CAAC,IAAI,EAAE;QAC3B,MAAM,EAAE,KAAK,CAAC,WAAW;QACzB,gBAAgB,EAAE,eAAe;QACjC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,GAAG,KAAK,WAAW,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,OAAO,OAAO,KAAK,CAAC,IAAI,GAAG;QAC/E,WAAW,EAAE,KAAK,CAAC,YAAY;QAC/B,SAAS,EAAE,iBAAiB,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,OAAO,EAAE;KACxG,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { EmitNotificationCtx } from "./emit-notification.js";
|
|
2
|
+
export interface RemixCloneNotifyInput {
|
|
3
|
+
readonly ownerHandle: string;
|
|
4
|
+
readonly appSlug: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function notifyRemixCloneOwner(qctx: EmitNotificationCtx, payload: RemixCloneNotifyInput): Promise<void>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { and, desc, eq } from "drizzle-orm/sql/expressions";
|
|
2
|
+
import { notifyRemixSourceOwner } from "./notify-remix.js";
|
|
3
|
+
export async function notifyRemixCloneOwner(qctx, payload) {
|
|
4
|
+
const t = qctx.sql.tables.apps;
|
|
5
|
+
const row = await qctx.sql.db
|
|
6
|
+
.select({
|
|
7
|
+
userId: t.userId,
|
|
8
|
+
ownerHandle: t.ownerHandle,
|
|
9
|
+
appSlug: t.appSlug,
|
|
10
|
+
meta: t.meta,
|
|
11
|
+
})
|
|
12
|
+
.from(t)
|
|
13
|
+
.where(and(eq(t.ownerHandle, payload.ownerHandle), eq(t.appSlug, payload.appSlug)))
|
|
14
|
+
.orderBy(desc(t.releaseSeq))
|
|
15
|
+
.limit(1)
|
|
16
|
+
.then((r) => r[0] ?? null);
|
|
17
|
+
if (!row)
|
|
18
|
+
return;
|
|
19
|
+
await notifyRemixSourceOwner(qctx, row);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=notify-remix-clone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify-remix-clone.js","sourceRoot":"","sources":["../../jsr/intern/notify-remix-clone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC;AAE5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAsB3D,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAyB,EAAE,OAA8B;IACnG,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;IAC/B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;SAC1B,MAAM,CAAC;QACN,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,IAAI,EAAE,CAAC,CAAC,IAAI;KACb,CAAC;SACD,IAAI,CAAC,CAAC,CAAC;SACP,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;SAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;SAC3B,KAAK,CAAC,CAAC,CAAC;SACR,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAE7B,IAAI,CAAC,GAAG;QAAE,OAAO;IAEjB,MAAM,sBAAsB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { EmitNotificationCtx } from "./emit-notification.js";
|
|
2
|
+
export interface RemixAppRow {
|
|
3
|
+
readonly userId: string;
|
|
4
|
+
readonly ownerHandle: string;
|
|
5
|
+
readonly appSlug: string;
|
|
6
|
+
readonly meta: unknown;
|
|
7
|
+
}
|
|
8
|
+
export declare function notifyRemixSourceOwner(qctx: EmitNotificationCtx, remixApp: RemixAppRow): Promise<void>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { emitNotification } from "./emit-notification.js";
|
|
2
|
+
export async function notifyRemixSourceOwner(qctx, remixApp) {
|
|
3
|
+
const meta = remixApp.meta ?? [];
|
|
4
|
+
const remixOf = meta.find((m) => m.type === "remix-of");
|
|
5
|
+
if (!remixOf)
|
|
6
|
+
return;
|
|
7
|
+
const { srcUserId, srcOwnerHandle, srcAppSlug } = remixOf;
|
|
8
|
+
if (!srcUserId || !srcOwnerHandle || !srcAppSlug)
|
|
9
|
+
return;
|
|
10
|
+
if (srcUserId === remixApp.userId)
|
|
11
|
+
return;
|
|
12
|
+
await emitNotification(qctx, {
|
|
13
|
+
userId: srcUserId,
|
|
14
|
+
notificationType: "vibe-remixed",
|
|
15
|
+
ownerHandle: srcOwnerHandle,
|
|
16
|
+
appSlug: srcAppSlug,
|
|
17
|
+
actorHandle: remixApp.ownerHandle,
|
|
18
|
+
body: `@${remixApp.ownerHandle} remixed your vibe ${srcAppSlug}`,
|
|
19
|
+
targetRef: { remixOwnerHandle: remixApp.ownerHandle, remixAppSlug: remixApp.appSlug },
|
|
20
|
+
dedupeKey: `vibe-remixed:${remixApp.ownerHandle}/${remixApp.appSlug}`,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=notify-remix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify-remix.js","sourceRoot":"","sources":["../../jsr/intern/notify-remix.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAuB,MAAM,wBAAwB,CAAC;AA+B/E,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAyB,EAAE,QAAqB;IAC3F,MAAM,IAAI,GAAI,QAAQ,CAAC,IAA+B,IAAI,EAAE,CAAC;IAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAgD,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IACtG,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAC1D,IAAI,CAAC,SAAS,IAAI,CAAC,cAAc,IAAI,CAAC,UAAU;QAAE,OAAO;IACzD,IAAI,SAAS,KAAK,QAAQ,CAAC,MAAM;QAAE,OAAO;IAE1C,MAAM,gBAAgB,CAAC,IAAI,EAAE;QAC3B,MAAM,EAAE,SAAS;QACjB,gBAAgB,EAAE,cAAc;QAChC,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE,UAAU;QACnB,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,IAAI,EAAE,IAAI,QAAQ,CAAC,WAAW,sBAAsB,UAAU,EAAE;QAChE,SAAS,EAAE,EAAE,gBAAgB,EAAE,QAAQ,CAAC,WAAW,EAAE,YAAY,EAAE,QAAQ,CAAC,OAAO,EAAE;QACrF,SAAS,EAAE,gBAAgB,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,OAAO,EAAE;KACtE,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { EmitNotificationCtx } from "./emit-notification.js";
|
|
2
|
+
export interface RequestGrantNotifyInput {
|
|
3
|
+
readonly state: "pending" | "approved" | "revoked";
|
|
4
|
+
readonly ownerHandle: string;
|
|
5
|
+
readonly appSlug: string;
|
|
6
|
+
readonly foreignUserId: string;
|
|
7
|
+
readonly updated: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function notifyRequestGrant(qctx: EmitNotificationCtx, grant: RequestGrantNotifyInput): Promise<void>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { emitNotification } from "./emit-notification.js";
|
|
2
|
+
export async function notifyRequestGrant(qctx, grant) {
|
|
3
|
+
if (grant.state !== "approved" && grant.state !== "revoked")
|
|
4
|
+
return;
|
|
5
|
+
const notificationType = grant.state === "approved" ? "request-approved" : "request-revoked";
|
|
6
|
+
const body = grant.state === "approved"
|
|
7
|
+
? `Access to ${grant.ownerHandle}/${grant.appSlug} approved.`
|
|
8
|
+
: `Access to ${grant.ownerHandle}/${grant.appSlug} was revoked.`;
|
|
9
|
+
await emitNotification(qctx, {
|
|
10
|
+
userId: grant.foreignUserId,
|
|
11
|
+
notificationType,
|
|
12
|
+
ownerHandle: grant.ownerHandle,
|
|
13
|
+
appSlug: grant.appSlug,
|
|
14
|
+
body,
|
|
15
|
+
dedupeKey: `${notificationType}:${grant.ownerHandle}:${grant.appSlug}:${grant.foreignUserId}:${grant.updated}`,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=notify-request-grant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify-request-grant.js","sourceRoot":"","sources":["../../jsr/intern/notify-request-grant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAuB,MAAM,wBAAwB,CAAC;AAuB/E,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAyB,EAAE,KAA8B;IAChG,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO;IAEpE,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,CAAC;IAC7F,MAAM,IAAI,GACR,KAAK,CAAC,KAAK,KAAK,UAAU;QACxB,CAAC,CAAC,aAAa,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,OAAO,YAAY;QAC7D,CAAC,CAAC,aAAa,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,OAAO,eAAe,CAAC;IAErE,MAAM,gBAAgB,CAAC,IAAI,EAAE;QAC3B,MAAM,EAAE,KAAK,CAAC,aAAa;QAC3B,gBAAgB;QAChB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI;QACJ,SAAS,EAAE,GAAG,gBAAgB,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,OAAO,EAAE;KAC/G,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { EmitNotificationCtx } from "./emit-notification.js";
|
|
2
|
+
export interface PublishNotifyInput {
|
|
3
|
+
readonly ownerHandle: string;
|
|
4
|
+
readonly appSlug: string;
|
|
5
|
+
readonly fsId: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function notifyVibePublished(qctx: EmitNotificationCtx, payload: PublishNotifyInput): Promise<void>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { eq } from "drizzle-orm/sql/expressions";
|
|
2
|
+
import { emitNotification } from "./emit-notification.js";
|
|
3
|
+
export async function notifyVibePublished(qctx, payload) {
|
|
4
|
+
const usb = qctx.sql.tables.handleBinding;
|
|
5
|
+
const ownerRow = await qctx.sql.db
|
|
6
|
+
.select({ userId: usb.userId })
|
|
7
|
+
.from(usb)
|
|
8
|
+
.where(eq(usb.handle, payload.ownerHandle))
|
|
9
|
+
.limit(1)
|
|
10
|
+
.then((r) => r[0] ?? null);
|
|
11
|
+
if (!ownerRow?.userId)
|
|
12
|
+
return;
|
|
13
|
+
await emitNotification(qctx, {
|
|
14
|
+
userId: ownerRow.userId,
|
|
15
|
+
notificationType: "vibe-published",
|
|
16
|
+
ownerHandle: payload.ownerHandle,
|
|
17
|
+
appSlug: payload.appSlug,
|
|
18
|
+
body: `${payload.ownerHandle}/${payload.appSlug} was published.`,
|
|
19
|
+
dedupeKey: `vibe-published:${payload.ownerHandle}/${payload.appSlug}:${payload.fsId}`,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=notify-vibe-published.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify-vibe-published.js","sourceRoot":"","sources":["../../jsr/intern/notify-vibe-published.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAuB,MAAM,wBAAwB,CAAC;AAuB/E,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAyB,EAAE,OAA2B;IAC9F,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC;IAC1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;SAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;SAC9B,IAAI,CAAC,GAAG,CAAC;SACT,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;SAC1C,KAAK,CAAC,CAAC,CAAC;SACR,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAE7B,IAAI,CAAC,QAAQ,EAAE,MAAM;QAAE,OAAO;IAE9B,MAAM,gBAAgB,CAAC,IAAI,EAAE;QAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,gBAAgB,EAAE,gBAAgB;QAClC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,iBAAiB;QAChE,SAAS,EAAE,kBAAkB,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE;KACtF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Result } from "@adviser/cement";
|
|
2
|
+
import { CFEnv, VibeCurationState } from "@vibes.diy/api-types";
|
|
3
|
+
import { cfDrizzle, VibesApiTables } from "@vibes.diy/api-sql";
|
|
4
|
+
export interface CurationDecision {
|
|
5
|
+
readonly action: "approve" | "skip";
|
|
6
|
+
readonly ownerHandle: string;
|
|
7
|
+
readonly appSlug: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function parseCurationCustomId(customId: string | undefined): CurationDecision | undefined;
|
|
10
|
+
export interface CurationOutcome {
|
|
11
|
+
readonly state: VibeCurationState;
|
|
12
|
+
readonly decidedBy: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function applyCurationDecision(env: Pick<CFEnv, "DB" | "DB_FLAVOUR" | "NEON_DATABASE_URL">, decision: CurationDecision, decidedBy: string): Promise<Result<CurationOutcome | undefined>>;
|
|
15
|
+
export declare function applyCurationDecisionDb(sql: {
|
|
16
|
+
db: ReturnType<typeof cfDrizzle>["db"];
|
|
17
|
+
tables: VibesApiTables;
|
|
18
|
+
}, decision: CurationDecision, decidedBy: string): Promise<Result<CurationOutcome | undefined>>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Result, exception2Result } from "@adviser/cement";
|
|
2
|
+
import { VIBE_CURATION_CUSTOM_ID_PREFIX } from "@vibes.diy/api-types";
|
|
3
|
+
import { cfDrizzle, createVibesApiTables, toDBFlavour } from "@vibes.diy/api-sql";
|
|
4
|
+
import { and, eq } from "drizzle-orm/sql/expressions";
|
|
5
|
+
export function parseCurationCustomId(customId) {
|
|
6
|
+
if (!customId)
|
|
7
|
+
return undefined;
|
|
8
|
+
const parts = customId.split(":");
|
|
9
|
+
if (parts.length !== 4 || parts[0] !== VIBE_CURATION_CUSTOM_ID_PREFIX)
|
|
10
|
+
return undefined;
|
|
11
|
+
const [, action, ownerHandle, appSlug] = parts;
|
|
12
|
+
if ((action !== "approve" && action !== "skip") || ownerHandle.length === 0 || appSlug.length === 0)
|
|
13
|
+
return undefined;
|
|
14
|
+
return { action, ownerHandle, appSlug };
|
|
15
|
+
}
|
|
16
|
+
export async function applyCurationDecision(env, decision, decidedBy) {
|
|
17
|
+
const { db } = cfDrizzle(env, env.DB);
|
|
18
|
+
const tables = createVibesApiTables(toDBFlavour(env.DB_FLAVOUR));
|
|
19
|
+
return applyCurationDecisionDb({ db, tables }, decision, decidedBy);
|
|
20
|
+
}
|
|
21
|
+
export async function applyCurationDecisionDb(sql, decision, decidedBy) {
|
|
22
|
+
const { db } = sql;
|
|
23
|
+
const t = sql.tables.vibeCuration;
|
|
24
|
+
const target = decision.action === "approve" ? "approved" : "skipped";
|
|
25
|
+
const rUpdate = await exception2Result(() => db
|
|
26
|
+
.update(t)
|
|
27
|
+
.set({ state: target, decidedAt: new Date().toISOString(), decidedBy })
|
|
28
|
+
.where(and(eq(t.ownerHandle, decision.ownerHandle), eq(t.appSlug, decision.appSlug), eq(t.state, "proposed")))
|
|
29
|
+
.returning({ state: t.state }));
|
|
30
|
+
if (rUpdate.isErr())
|
|
31
|
+
return Result.Err(rUpdate);
|
|
32
|
+
if (rUpdate.Ok().length > 0)
|
|
33
|
+
return Result.Ok({ state: target, decidedBy });
|
|
34
|
+
const rRow = await exception2Result(() => db
|
|
35
|
+
.select({ state: t.state, decidedBy: t.decidedBy })
|
|
36
|
+
.from(t)
|
|
37
|
+
.where(and(eq(t.ownerHandle, decision.ownerHandle), eq(t.appSlug, decision.appSlug)))
|
|
38
|
+
.limit(1));
|
|
39
|
+
if (rRow.isErr())
|
|
40
|
+
return Result.Err(rRow);
|
|
41
|
+
const row = rRow.Ok()[0];
|
|
42
|
+
if (row === undefined)
|
|
43
|
+
return Result.Ok(undefined);
|
|
44
|
+
return Result.Ok({ state: row.state, decidedBy: row.decidedBy });
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=vibe-curation-decision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vibe-curation-decision.js","sourceRoot":"","sources":["../../jsr/intern/vibe-curation-decision.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibes.diy/api-svc",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -18,18 +18,18 @@
|
|
|
18
18
|
"@libsql/client": "~0.17.4",
|
|
19
19
|
"@neondatabase/serverless": "~1.1.0",
|
|
20
20
|
"@noble/hashes": "~2.2.0",
|
|
21
|
-
"@vibes.diy/api-pkg": "
|
|
22
|
-
"@vibes.diy/api-sql": "
|
|
23
|
-
"@vibes.diy/api-types": "
|
|
24
|
-
"@vibes.diy/call-ai-v2": "
|
|
25
|
-
"@vibes.diy/identity": "
|
|
26
|
-
"@vibes.diy/prompts": "
|
|
27
|
-
"@vibes.diy/vibe-db-explorer": "
|
|
28
|
-
"@vibes.diy/vibe-runtime": "
|
|
29
|
-
"@vibes.diy/vibe-types": "
|
|
21
|
+
"@vibes.diy/api-pkg": "5.0.1",
|
|
22
|
+
"@vibes.diy/api-sql": "5.0.1",
|
|
23
|
+
"@vibes.diy/api-types": "5.0.1",
|
|
24
|
+
"@vibes.diy/call-ai-v2": "5.0.1",
|
|
25
|
+
"@vibes.diy/identity": "5.0.1",
|
|
26
|
+
"@vibes.diy/prompts": "5.0.1",
|
|
27
|
+
"@vibes.diy/vibe-db-explorer": "5.0.1",
|
|
28
|
+
"@vibes.diy/vibe-runtime": "5.0.1",
|
|
29
|
+
"@vibes.diy/vibe-types": "5.0.1",
|
|
30
30
|
"acorn": "~8.17.0",
|
|
31
31
|
"arktype": "~2.2.2",
|
|
32
|
-
"call-ai": "
|
|
32
|
+
"call-ai": "5.0.1",
|
|
33
33
|
"cookie": "~1.1.1",
|
|
34
34
|
"drizzle-orm": "~0.45.2",
|
|
35
35
|
"jose": "~6.2.2",
|
package/public/access-helpers.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { eq } from "drizzle-orm";
|
|
2
|
-
import { isResHasAccessInviteAccepted, isResHasAccessRequestApproved, isResHasAccessRequestNotFound, } from "@vibes.diy/api-types";
|
|
2
|
+
import { isDirectChannel, isResHasAccessInviteAccepted, isResHasAccessRequestApproved, isResHasAccessRequestNotFound, } from "@vibes.diy/api-types";
|
|
3
3
|
import { hasAccessInvite } from "./invite-flow.js";
|
|
4
4
|
import { hasAccessRequest } from "./request-flow.js";
|
|
5
|
+
import { adminUserIdSet } from "./app-settings-suggestion-bless.js";
|
|
5
6
|
import { ensureAppSettings } from "./ensure-app-settings.js";
|
|
6
7
|
export { canRead, canWrite } from "@vibes.diy/vibe-types";
|
|
7
8
|
export async function checkDocAccess(vctx, userId, appSlug, ownerHandle, adminMode) {
|
|
@@ -13,6 +14,9 @@ export async function checkDocAccess(vctx, userId, appSlug, ownerHandle, adminMo
|
|
|
13
14
|
.then((r) => r[0]);
|
|
14
15
|
if (binding?.userId === userId)
|
|
15
16
|
return { access: adminMode ? "override" : "editor", isOwner: true };
|
|
17
|
+
if (adminMode === true && !isDirectChannel(ownerHandle) && adminUserIdSet(vctx).has(userId)) {
|
|
18
|
+
return { access: "override", isOwner: true };
|
|
19
|
+
}
|
|
16
20
|
const rInvite = await hasAccessInvite(vctx, { grantUserId: userId, appSlug, ownerHandle });
|
|
17
21
|
if (rInvite.isOk()) {
|
|
18
22
|
const invite = rInvite.Ok();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access-helpers.js","sourceRoot":"","sources":["../../jsr/public/access-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAEL,4BAA4B,EAC5B,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAO7D,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAoB,EACpB,MAAc,EACd,OAAe,EACf,WAAmB,EACnB,SAAmB;IAEnB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;SAC9B,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;SACxD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC;SACnC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;SAC5D,KAAK,CAAC,CAAC,CAAC;SACR,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAErB,IAAI,OAAO,EAAE,MAAM,KAAK,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"access-helpers.js","sourceRoot":"","sources":["../../jsr/public/access-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -356,7 +356,7 @@ export const listDbNamesEvento = {
|
|
|
356
356
|
const req = ctx.validated.payload;
|
|
357
357
|
const vctx = ctx.ctx.getOrThrow("vibesApiCtx");
|
|
358
358
|
const userId = req._auth.verifiedAuth.claims.userId;
|
|
359
|
-
const { isOwner } = await checkDocAccess(vctx, userId, req.appSlug, req.ownerHandle, connectionAdminMode(ctx));
|
|
359
|
+
const { isOwner } = await checkDocAccess(vctx, userId, req.appSlug, req.ownerHandle, connectionAdminMode(ctx) || req.adminMode === true);
|
|
360
360
|
if (!isOwner) {
|
|
361
361
|
await ctx.send.send(ctx, { type: "vibes.diy.res-error", error: { message: "Access denied" } });
|
|
362
362
|
return Result.Ok(EventoResult.Continue);
|