@vibes.diy/api-svc 12.3.1 → 12.3.3
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/evento-handler-manifest.js +2 -0
- package/evento-handler-manifest.js.map +1 -1
- package/intern/backend-notify-callback.js.map +1 -1
- package/intern/get-open-turn.js +19 -6
- package/intern/get-open-turn.js.map +1 -1
- package/intern/half-open-turn.d.ts +5 -2
- package/intern/half-open-turn.js +7 -3
- package/intern/half-open-turn.js.map +1 -1
- package/intern/is-app-participant.d.ts +4 -7
- package/intern/is-app-participant.js +3 -57
- package/intern/is-app-participant.js.map +1 -1
- package/intern/participants.d.ts +17 -0
- package/intern/participants.js +185 -0
- package/intern/participants.js.map +1 -0
- package/intern/render-vibe.d.ts +1 -0
- package/intern/render-vibe.js +9 -2
- package/intern/render-vibe.js.map +1 -1
- package/package.json +13 -12
- package/public/app-seq-allocation.js.map +1 -1
- package/public/chip-projection.d.ts +10 -0
- package/public/chip-projection.js +113 -0
- package/public/chip-projection.js.map +1 -0
- package/public/chip-stamp.d.ts +25 -0
- package/public/chip-stamp.js +57 -0
- package/public/chip-stamp.js.map +1 -0
- package/public/ensure-app-slug-item.js +18 -0
- package/public/ensure-app-slug-item.js.map +1 -1
- package/public/get-vibe-chips.js +23 -106
- package/public/get-vibe-chips.js.map +1 -1
- package/public/list-members.js +9 -0
- package/public/list-members.js.map +1 -1
- package/public/publish-app.js +8 -0
- package/public/publish-app.js.map +1 -1
- package/public/report-active-members.d.ts +2 -0
- package/public/report-active-members.js +14 -21
- package/public/report-active-members.js.map +1 -1
- package/public/report-top-vibes-by-members.d.ts +2 -0
- package/public/report-top-vibes-by-members.js +13 -19
- package/public/report-top-vibes-by-members.js.map +1 -1
- package/public/seed-starter-chips-handler.js +12 -0
- package/public/seed-starter-chips-handler.js.map +1 -1
- package/public/select-app.d.ts +29 -0
- package/public/select-app.js +38 -0
- package/public/select-app.js.map +1 -1
- package/public/serv-entry-point.js +2 -1
- package/public/serv-entry-point.js.map +1 -1
- package/public/set-version-lock.js +8 -0
- package/public/set-version-lock.js.map +1 -1
- package/public/set-vibe-chips.d.ts +3 -0
- package/public/set-vibe-chips.js +90 -0
- package/public/set-vibe-chips.js.map +1 -0
- package/public/viewer-capabilities.d.ts +12 -0
- package/public/viewer-capabilities.js +8 -0
- package/public/viewer-capabilities.js.map +1 -0
- package/public/who-am-i.d.ts +2 -0
- package/public/who-am-i.js +26 -14
- package/public/who-am-i.js.map +1 -1
- package/usage-report/backfill-published-chips-util.d.ts +43 -0
- package/usage-report/backfill-published-chips-util.js +120 -0
- package/usage-report/backfill-published-chips-util.js.map +1 -0
- package/usage-report/backfill-published-chips.d.ts +1 -0
- package/usage-report/backfill-published-chips.js +97 -0
- package/usage-report/backfill-published-chips.js.map +1 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { Result, Option, EventoResult } from "@adviser/cement";
|
|
2
|
+
import { capChips, reqSetVibeChips, } from "@vibes.diy/api-types";
|
|
3
|
+
import { type } from "arktype";
|
|
4
|
+
import { unwrapMsgBase } from "../unwrap-msg-base.js";
|
|
5
|
+
import { checkAuth } from "../check-auth.js";
|
|
6
|
+
import { logAdminWriteOverride } from "./platform-admin.js";
|
|
7
|
+
import { authorizeSlugOwner } from "./authorize-slug-owner.js";
|
|
8
|
+
import { selectReleaseByFsId } from "./select-app.js";
|
|
9
|
+
import { stampLiveRelease, writeChipStamp } from "./chip-stamp.js";
|
|
10
|
+
export const setVibeChipsEvento = {
|
|
11
|
+
hash: "set-vibe-chips",
|
|
12
|
+
validate: unwrapMsgBase(async (msg) => {
|
|
13
|
+
const ret = reqSetVibeChips(msg.payload);
|
|
14
|
+
if (ret instanceof type.errors) {
|
|
15
|
+
return Result.Ok(Option.None());
|
|
16
|
+
}
|
|
17
|
+
return Result.Ok(Option.Some({ ...msg, payload: ret }));
|
|
18
|
+
}),
|
|
19
|
+
handle: checkAuth(async (ctx) => {
|
|
20
|
+
const req = ctx.validated.payload;
|
|
21
|
+
const vctx = ctx.ctx.getOrThrow("vibesApiCtx");
|
|
22
|
+
const userId = req._auth.verifiedAuth.claims.userId;
|
|
23
|
+
const notAuthorized = async () => {
|
|
24
|
+
await ctx.send.send(ctx, {
|
|
25
|
+
type: "vibes.diy.res-error",
|
|
26
|
+
error: {
|
|
27
|
+
message: `not found or not authorized to set the chips of ${req.ownerHandle}/${req.appSlug}`,
|
|
28
|
+
code: "set-vibe-chips-not-found",
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
return Result.Ok(EventoResult.Continue);
|
|
32
|
+
};
|
|
33
|
+
const auth = await authorizeSlugOwner(vctx, { ownerHandle: req.ownerHandle, appSlug: req.appSlug, userId });
|
|
34
|
+
if (auth === undefined) {
|
|
35
|
+
return notAuthorized();
|
|
36
|
+
}
|
|
37
|
+
const isAdmin = auth.isOwner === false && auth.isAdmin;
|
|
38
|
+
if (auth.isOwner === false && isAdmin === false) {
|
|
39
|
+
return notAuthorized();
|
|
40
|
+
}
|
|
41
|
+
if (isAdmin) {
|
|
42
|
+
logAdminWriteOverride(vctx, {
|
|
43
|
+
op: "set-chips",
|
|
44
|
+
actingUserId: userId,
|
|
45
|
+
ownerHandle: req.ownerHandle,
|
|
46
|
+
appSlug: req.appSlug,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
const chips = capChips(req.chips);
|
|
50
|
+
const writeTo = (release) => writeChipStamp(vctx, {
|
|
51
|
+
appSlug: req.appSlug,
|
|
52
|
+
userId: release.userId,
|
|
53
|
+
releaseSeq: release.releaseSeq,
|
|
54
|
+
chips,
|
|
55
|
+
});
|
|
56
|
+
let release;
|
|
57
|
+
if (req.fsId) {
|
|
58
|
+
const row = await selectReleaseByFsId(vctx, { ownerHandle: req.ownerHandle, appSlug: req.appSlug, fsId: req.fsId });
|
|
59
|
+
if (row !== undefined) {
|
|
60
|
+
await writeTo(row);
|
|
61
|
+
release = row;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
release = await stampLiveRelease(vctx, { ownerHandle: req.ownerHandle, appSlug: req.appSlug, stamp: writeTo });
|
|
66
|
+
}
|
|
67
|
+
if (release === undefined) {
|
|
68
|
+
await ctx.send.send(ctx, {
|
|
69
|
+
type: "vibes.diy.res-error",
|
|
70
|
+
error: {
|
|
71
|
+
message: req.fsId
|
|
72
|
+
? `set-vibe-chips: ${req.ownerHandle}/${req.appSlug} has no published release for ${req.fsId}`
|
|
73
|
+
: `set-vibe-chips: ${req.ownerHandle}/${req.appSlug} has no published release (publish the vibe first)`,
|
|
74
|
+
code: "set-vibe-chips-not-published",
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
return Result.Ok(EventoResult.Continue);
|
|
78
|
+
}
|
|
79
|
+
await ctx.send.send(ctx, {
|
|
80
|
+
type: "vibes.diy.res-set-vibe-chips",
|
|
81
|
+
ownerHandle: req.ownerHandle,
|
|
82
|
+
appSlug: req.appSlug,
|
|
83
|
+
fsId: release.fsId,
|
|
84
|
+
releaseSeq: release.releaseSeq,
|
|
85
|
+
chips: [...chips],
|
|
86
|
+
});
|
|
87
|
+
return Result.Ok(EventoResult.Continue);
|
|
88
|
+
}),
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=set-vibe-chips.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-vibe-chips.js","sourceRoot":"","sources":["../../jsr/public/set-vibe-chips.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AclCaller, DbAcl } from "@vibes.diy/api-types";
|
|
2
|
+
export interface ViewerCapabilities {
|
|
3
|
+
readonly read: boolean;
|
|
4
|
+
readonly write: boolean;
|
|
5
|
+
readonly delete: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface ViewerCapabilitiesArgs {
|
|
8
|
+
readonly wildcard: DbAcl | undefined;
|
|
9
|
+
readonly caller: AclCaller;
|
|
10
|
+
readonly appBindsAccessFn: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function viewerCapabilitiesFor({ wildcard, caller, appBindsAccessFn, }: ViewerCapabilitiesArgs): ViewerCapabilities | undefined;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { aclAllows } from "@vibes.diy/vibe-types";
|
|
2
|
+
export function viewerCapabilitiesFor({ wildcard, caller, appBindsAccessFn, }) {
|
|
3
|
+
if (wildcard === undefined)
|
|
4
|
+
return undefined;
|
|
5
|
+
const write = aclAllows(wildcard, "write", caller) && (caller.authenticated || appBindsAccessFn);
|
|
6
|
+
return { read: aclAllows(wildcard, "read", caller), write, delete: write && caller.authenticated };
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=viewer-capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewer-capabilities.js","sourceRoot":"","sources":["../../jsr/public/viewer-capabilities.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AA6ClD,MAAM,UAAU,qBAAqB,CAAC,EACpC,QAAQ,EACR,MAAM,EACN,gBAAgB,GACO;IACvB,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC7C,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,gBAAgB,CAAC,CAAC;IAIjG,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;AACrG,CAAC"}
|
package/public/who-am-i.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { EventoHandler, Result } from "@adviser/cement";
|
|
|
2
2
|
import { MsgBase, VibesDiyError, W3CWebSocketEvent } from "@vibes.diy/api-types";
|
|
3
3
|
import { ReqVibeWhoAmI, ResVibeWhoAmI, ViewerPayload, DocAccessLevel } from "@vibes.diy/vibe-types";
|
|
4
4
|
import { VibesApiSQLCtx } from "../types.js";
|
|
5
|
+
import { type ViewerCapabilities } from "./viewer-capabilities.js";
|
|
5
6
|
import { VerifiedResult } from "@vibes.diy/identity";
|
|
6
7
|
export interface ResolveWhoAmIArgs {
|
|
7
8
|
auth: VerifiedResult | undefined;
|
|
@@ -14,6 +15,7 @@ export interface ResolvedWhoAmI {
|
|
|
14
15
|
viewer: ViewerPayload | null;
|
|
15
16
|
access: DocAccessLevel;
|
|
16
17
|
isOwner: boolean;
|
|
18
|
+
capabilities?: ViewerCapabilities;
|
|
17
19
|
needsHandle?: boolean;
|
|
18
20
|
grants: Record<string, {
|
|
19
21
|
channels: string[];
|
package/public/who-am-i.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Result, Option, EventoResult } from "@adviser/cement";
|
|
2
2
|
import { WSSendProvider } from "../svc-ws-send-provider.js";
|
|
3
3
|
import { isUserSettingProfile, } from "@vibes.diy/api-types";
|
|
4
|
-
import { isReqVibeWhoAmI } from "@vibes.diy/vibe-types";
|
|
4
|
+
import { ANON_CALLER, isReqVibeWhoAmI } from "@vibes.diy/vibe-types";
|
|
5
5
|
import { and, eq } from "drizzle-orm";
|
|
6
6
|
import { extractContribution, newSeededReduce } from "./grant-reduce.js";
|
|
7
7
|
import { resolveDeveloperHandles } from "./developer-grants.js";
|
|
@@ -9,6 +9,7 @@ import { unwrapMsgBase } from "../unwrap-msg-base.js";
|
|
|
9
9
|
import { optAuth } from "../check-auth.js";
|
|
10
10
|
import { checkDocAccess } from "./access-helpers.js";
|
|
11
11
|
import { ensureAppSettings } from "./ensure-app-settings.js";
|
|
12
|
+
import { viewerCapabilitiesFor } from "./viewer-capabilities.js";
|
|
12
13
|
import { resolveActiveHandle } from "./resolve-active-handle.js";
|
|
13
14
|
import { deriveDisplayName } from "./derive-display-name.js";
|
|
14
15
|
export function selectAccessFnBindings(vctx, ownerUserSlug, appSlug) {
|
|
@@ -82,9 +83,8 @@ async function resolveGrants(vctx, ownerUserSlug, appSlug, viewerSlug, prefetche
|
|
|
82
83
|
export async function resolveWhoAmI(vctx, args) {
|
|
83
84
|
const { auth, appSlug, ownerUserSlug } = args;
|
|
84
85
|
const viewerUserId = auth?.verifiedAuth.claims.userId;
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
: { access: "none" };
|
|
86
|
+
const docAccess = viewerUserId ? await checkDocAccess(vctx, viewerUserId, appSlug, ownerUserSlug, args.adminMode) : undefined;
|
|
87
|
+
const access = docAccess?.access ?? "none";
|
|
88
88
|
const rSettings = await ensureAppSettings(vctx, {
|
|
89
89
|
type: "vibes.diy.req-ensure-app-settings",
|
|
90
90
|
appSlug,
|
|
@@ -93,13 +93,16 @@ export async function resolveWhoAmI(vctx, args) {
|
|
|
93
93
|
});
|
|
94
94
|
if (rSettings.isErr())
|
|
95
95
|
return Result.Err(rSettings.Err());
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
96
|
+
const envelope = rSettings.Ok().envelope;
|
|
97
|
+
const bindings = args.accessFnBindings ?? selectAccessFnBindings(vctx, ownerUserSlug, appSlug);
|
|
98
|
+
const capabilitiesFor = async (caller) => viewerCapabilitiesFor({ wildcard: envelope?.wildcard, caller, appBindsAccessFn: (await bindings).length > 0 });
|
|
99
|
+
const withCapabilities = async (caller) => {
|
|
100
|
+
const capabilities = await capabilitiesFor(caller);
|
|
101
|
+
return capabilities === undefined ? {} : { capabilities };
|
|
102
|
+
};
|
|
103
|
+
if (!auth || !viewerUserId) {
|
|
104
|
+
const grants = await resolveGrants(vctx, ownerUserSlug, appSlug, undefined, bindings);
|
|
105
|
+
return Result.Ok({ viewer: null, access, isOwner: false, grants, ...(await withCapabilities(ANON_CALLER)) });
|
|
103
106
|
}
|
|
104
107
|
const userSettingsRow = await vctx.sql.db
|
|
105
108
|
.select({ settings: vctx.sql.tables.userSettings.settings })
|
|
@@ -117,14 +120,22 @@ export async function resolveWhoAmI(vctx, args) {
|
|
|
117
120
|
}
|
|
118
121
|
const viewerSlug = await resolveActiveHandle(vctx, viewerUserId, items);
|
|
119
122
|
if (viewerSlug === undefined) {
|
|
120
|
-
const grants = await resolveGrants(vctx, ownerUserSlug, appSlug, undefined,
|
|
121
|
-
return Result.Ok({
|
|
123
|
+
const grants = await resolveGrants(vctx, ownerUserSlug, appSlug, undefined, bindings);
|
|
124
|
+
return Result.Ok({
|
|
125
|
+
viewer: null,
|
|
126
|
+
access,
|
|
127
|
+
isOwner: false,
|
|
128
|
+
grants,
|
|
129
|
+
needsHandle: true,
|
|
130
|
+
...(await withCapabilities(ANON_CALLER)),
|
|
131
|
+
});
|
|
122
132
|
}
|
|
123
133
|
const displayName = displayOverride ?? deriveDisplayName(auth.verifiedAuth.claims);
|
|
124
|
-
const grants = await resolveGrants(vctx, ownerUserSlug, appSlug, viewerSlug,
|
|
134
|
+
const grants = await resolveGrants(vctx, ownerUserSlug, appSlug, viewerSlug, bindings);
|
|
125
135
|
return Result.Ok({
|
|
126
136
|
viewer: { userHandle: viewerSlug, displayName },
|
|
127
137
|
access,
|
|
138
|
+
...(await withCapabilities({ access, authenticated: true, blocked: docAccess?.blocked === true })),
|
|
128
139
|
isOwner: viewerSlug === ownerUserSlug,
|
|
129
140
|
grants,
|
|
130
141
|
});
|
|
@@ -168,6 +179,7 @@ export const whoAmIEvento = {
|
|
|
168
179
|
...(r.needsHandle === true ? { needsHandle: true } : {}),
|
|
169
180
|
...(r.isOwner ? { isOwner: r.isOwner } : {}),
|
|
170
181
|
...(r.grants !== undefined ? { grants: r.grants } : {}),
|
|
182
|
+
...(r.capabilities !== undefined ? { capabilities: r.capabilities } : {}),
|
|
171
183
|
...(adminMode === true && r.access === "override" ? { adminMode: true } : {}),
|
|
172
184
|
});
|
|
173
185
|
return Result.Ok(EventoResult.Continue);
|
package/public/who-am-i.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"who-am-i.js","sourceRoot":"","sources":["../../jsr/public/who-am-i.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,MAAM,EAAE,MAAM,EAAsC,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAClH,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAML,oBAAoB,
|
|
1
|
+
{"version":3,"file":"who-am-i.js","sourceRoot":"","sources":["../../jsr/public/who-am-i.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Result } from "@adviser/cement";
|
|
2
|
+
import { VibesApiSQLCtx } from "../types.js";
|
|
3
|
+
export interface ChipBackfillCandidate {
|
|
4
|
+
readonly ownerHandle: string;
|
|
5
|
+
readonly appSlug: string;
|
|
6
|
+
readonly releaseSeq: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function parsePositiveIntFlag(args: readonly string[], flag: string): Result<number | undefined>;
|
|
9
|
+
export type ChipBackfillOutcome = "stamped" | "stamped-empty" | "skipped" | "planned" | "failed";
|
|
10
|
+
export interface ChipBackfillRow {
|
|
11
|
+
readonly ownerHandle: string;
|
|
12
|
+
readonly appSlug: string;
|
|
13
|
+
readonly outcome: ChipBackfillOutcome;
|
|
14
|
+
readonly releaseSeq?: number;
|
|
15
|
+
readonly chips?: readonly string[];
|
|
16
|
+
readonly reason?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ChipBackfillSummary {
|
|
19
|
+
readonly candidates: number;
|
|
20
|
+
readonly stamped: number;
|
|
21
|
+
readonly stampedEmpty: number;
|
|
22
|
+
readonly skipped: number;
|
|
23
|
+
readonly planned: number;
|
|
24
|
+
readonly failed: number;
|
|
25
|
+
readonly rows: readonly ChipBackfillRow[];
|
|
26
|
+
}
|
|
27
|
+
export interface ChipBackfillOptions {
|
|
28
|
+
readonly apply: boolean;
|
|
29
|
+
readonly limit?: number;
|
|
30
|
+
readonly concurrency?: number;
|
|
31
|
+
readonly ownerHandle?: string;
|
|
32
|
+
readonly onRow?: (row: ChipBackfillRow, done: number, total: number) => void;
|
|
33
|
+
}
|
|
34
|
+
export declare const DEFAULT_CHIP_BACKFILL_CONCURRENCY = 2;
|
|
35
|
+
export declare function discoverUnstampedApps(vctx: VibesApiSQLCtx, opts?: {
|
|
36
|
+
readonly limit?: number;
|
|
37
|
+
readonly ownerHandle?: string;
|
|
38
|
+
}): Promise<ChipBackfillCandidate[]>;
|
|
39
|
+
export declare function processApp(vctx: VibesApiSQLCtx, app: {
|
|
40
|
+
readonly ownerHandle: string;
|
|
41
|
+
readonly appSlug: string;
|
|
42
|
+
}, apply: boolean): Promise<ChipBackfillRow>;
|
|
43
|
+
export declare function runChipBackfill(vctx: VibesApiSQLCtx, opts: ChipBackfillOptions): Promise<ChipBackfillSummary>;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { and, desc, eq, isNull } from "drizzle-orm/sql/expressions";
|
|
2
|
+
import { Result } from "@adviser/cement";
|
|
3
|
+
import { readChipStamp, stampReleaseChips } from "../public/chip-stamp.js";
|
|
4
|
+
import { selectLatestAppPerSlug } from "../public/select-app.js";
|
|
5
|
+
export function parsePositiveIntFlag(args, flag) {
|
|
6
|
+
const i = args.indexOf(flag);
|
|
7
|
+
if (i < 0)
|
|
8
|
+
return Result.Ok(undefined);
|
|
9
|
+
const raw = args[i + 1];
|
|
10
|
+
if (raw === undefined || raw.startsWith("--")) {
|
|
11
|
+
return Result.Err(`${flag} requires a positive integer value (got ${raw === undefined ? "nothing" : `"${raw}"`})`);
|
|
12
|
+
}
|
|
13
|
+
const n = Number(raw);
|
|
14
|
+
if (Number.isFinite(n) === false || Number.isInteger(n) === false || n <= 0) {
|
|
15
|
+
return Result.Err(`${flag} requires a positive integer value (got "${raw}")`);
|
|
16
|
+
}
|
|
17
|
+
return Result.Ok(n);
|
|
18
|
+
}
|
|
19
|
+
export const DEFAULT_CHIP_BACKFILL_CONCURRENCY = 2;
|
|
20
|
+
export async function discoverUnstampedApps(vctx, opts) {
|
|
21
|
+
const t = vctx.sql.tables.apps;
|
|
22
|
+
const ownerScope = opts?.ownerHandle;
|
|
23
|
+
const rows = await vctx.sql.db
|
|
24
|
+
.select({ ownerHandle: t.ownerHandle, appSlug: t.appSlug, releaseSeq: t.releaseSeq })
|
|
25
|
+
.from(t)
|
|
26
|
+
.where(ownerScope === undefined
|
|
27
|
+
? and(eq(t.mode, "production"), isNull(t.publishedChips))
|
|
28
|
+
: and(eq(t.mode, "production"), isNull(t.publishedChips), eq(t.ownerHandle, ownerScope)))
|
|
29
|
+
.orderBy(t.ownerHandle, t.appSlug, desc(t.releaseSeq));
|
|
30
|
+
const seen = new Set();
|
|
31
|
+
const out = [];
|
|
32
|
+
for (const r of rows) {
|
|
33
|
+
const key = `${r.ownerHandle}/${r.appSlug}`;
|
|
34
|
+
if (seen.has(key))
|
|
35
|
+
continue;
|
|
36
|
+
seen.add(key);
|
|
37
|
+
out.push({ ownerHandle: r.ownerHandle, appSlug: r.appSlug, releaseSeq: r.releaseSeq });
|
|
38
|
+
if (opts?.limit !== undefined && out.length >= opts.limit)
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
async function readStampAt(vctx, p) {
|
|
44
|
+
const t = vctx.sql.tables.apps;
|
|
45
|
+
const rows = await vctx.sql.db
|
|
46
|
+
.select({ publishedChips: t.publishedChips })
|
|
47
|
+
.from(t)
|
|
48
|
+
.where(and(eq(t.appSlug, p.appSlug), eq(t.userId, p.userId), eq(t.releaseSeq, p.releaseSeq)))
|
|
49
|
+
.limit(1);
|
|
50
|
+
if (rows[0] === undefined)
|
|
51
|
+
return undefined;
|
|
52
|
+
return readChipStamp(rows[0].publishedChips);
|
|
53
|
+
}
|
|
54
|
+
export async function processApp(vctx, app, apply) {
|
|
55
|
+
const base = { ownerHandle: app.ownerHandle, appSlug: app.appSlug };
|
|
56
|
+
try {
|
|
57
|
+
const live = await selectLatestAppPerSlug(vctx, app);
|
|
58
|
+
if (live === undefined)
|
|
59
|
+
return { ...base, outcome: "skipped", reason: "no app row" };
|
|
60
|
+
if (live.mode !== "production")
|
|
61
|
+
return { ...base, outcome: "skipped", reason: "live release is not production" };
|
|
62
|
+
if (readChipStamp(live.publishedChips) !== undefined) {
|
|
63
|
+
return { ...base, outcome: "skipped", releaseSeq: live.releaseSeq, reason: "already stamped" };
|
|
64
|
+
}
|
|
65
|
+
if (apply === false)
|
|
66
|
+
return { ...base, outcome: "planned", releaseSeq: live.releaseSeq };
|
|
67
|
+
await stampReleaseChips(vctx, {
|
|
68
|
+
ownerHandle: app.ownerHandle,
|
|
69
|
+
appSlug: app.appSlug,
|
|
70
|
+
userId: live.userId,
|
|
71
|
+
releaseSeq: live.releaseSeq,
|
|
72
|
+
fsId: live.fsId,
|
|
73
|
+
});
|
|
74
|
+
const written = await readStampAt(vctx, { appSlug: app.appSlug, userId: live.userId, releaseSeq: live.releaseSeq });
|
|
75
|
+
if (written === undefined) {
|
|
76
|
+
return { ...base, outcome: "failed", releaseSeq: live.releaseSeq, reason: "row still unstamped after stampReleaseChips" };
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
...base,
|
|
80
|
+
outcome: written.length === 0 ? "stamped-empty" : "stamped",
|
|
81
|
+
releaseSeq: live.releaseSeq,
|
|
82
|
+
chips: written,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
return { ...base, outcome: "failed", reason: e instanceof Error ? e.message : String(e) };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export async function runChipBackfill(vctx, opts) {
|
|
90
|
+
const candidates = await discoverUnstampedApps(vctx, { limit: opts.limit, ownerHandle: opts.ownerHandle });
|
|
91
|
+
const rows = new Array(candidates.length);
|
|
92
|
+
const concurrency = Math.max(1, opts.concurrency ?? DEFAULT_CHIP_BACKFILL_CONCURRENCY);
|
|
93
|
+
let next = 0;
|
|
94
|
+
let done = 0;
|
|
95
|
+
async function worker() {
|
|
96
|
+
for (;;) {
|
|
97
|
+
const i = next;
|
|
98
|
+
next += 1;
|
|
99
|
+
const app = candidates[i];
|
|
100
|
+
if (app === undefined)
|
|
101
|
+
return;
|
|
102
|
+
const row = await processApp(vctx, app, opts.apply);
|
|
103
|
+
rows[i] = row;
|
|
104
|
+
done += 1;
|
|
105
|
+
opts.onRow?.(row, done, candidates.length);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, candidates.length) }, () => worker()));
|
|
109
|
+
const count = (o) => rows.filter((r) => r.outcome === o).length;
|
|
110
|
+
return {
|
|
111
|
+
candidates: candidates.length,
|
|
112
|
+
stamped: count("stamped"),
|
|
113
|
+
stampedEmpty: count("stamped-empty"),
|
|
114
|
+
skipped: count("skipped"),
|
|
115
|
+
planned: count("planned"),
|
|
116
|
+
failed: count("failed"),
|
|
117
|
+
rows,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=backfill-published-chips-util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backfill-published-chips-util.js","sourceRoot":"","sources":["../../jsr/usage-report/backfill-published-chips-util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Pool } from "@neondatabase/serverless";
|
|
2
|
+
import { drizzle as drizzleNeon } from "drizzle-orm/neon-serverless";
|
|
3
|
+
import { Result, exception2Result } from "@adviser/cement";
|
|
4
|
+
import { ensureSuperThis } from "@vibes.diy/identity";
|
|
5
|
+
import { createVibesApiTables } from "@vibes.diy/api-sql";
|
|
6
|
+
import { DEFAULT_CHIP_BACKFILL_CONCURRENCY, parsePositiveIntFlag, runChipBackfill, } from "./backfill-published-chips-util.js";
|
|
7
|
+
import { formatError, loadDevVars } from "./usage-report-util.js";
|
|
8
|
+
const PROGRESS_EVERY = 25;
|
|
9
|
+
function printUsage() {
|
|
10
|
+
console.log(`
|
|
11
|
+
Usage:
|
|
12
|
+
pnpm --dir vibes.diy/api/svc run admin:backfill-published-chips # dry run (read-only)
|
|
13
|
+
pnpm --dir vibes.diy/api/svc run admin:backfill-published-chips -- --apply # write pass
|
|
14
|
+
... -- --apply --limit 50 # cap for a controlled batch
|
|
15
|
+
... -- --apply --concurrency 4 # default ${DEFAULT_CHIP_BACKFILL_CONCURRENCY}
|
|
16
|
+
|
|
17
|
+
--limit and --concurrency take a POSITIVE INTEGER. A bad value is an error, not
|
|
18
|
+
a fallback — an unusable --limit must never quietly mean "sweep everything".
|
|
19
|
+
|
|
20
|
+
Environment:
|
|
21
|
+
NEON_DATABASE_URL read/discovery connection (dry run)
|
|
22
|
+
NEON_DATABASE_ADMIN_URL write connection (required for --apply)
|
|
23
|
+
`.trim());
|
|
24
|
+
}
|
|
25
|
+
function describe(row) {
|
|
26
|
+
const label = `@${row.ownerHandle}/${row.appSlug}`;
|
|
27
|
+
const seq = row.releaseSeq === undefined ? "" : ` seq=${row.releaseSeq}`;
|
|
28
|
+
const chips = row.chips === undefined ? "" : ` ${JSON.stringify(row.chips)}`;
|
|
29
|
+
const reason = row.reason === undefined ? "" : ` (${row.reason})`;
|
|
30
|
+
return `${row.outcome.toUpperCase().padEnd(14)}${label}${seq}${chips}${reason}`;
|
|
31
|
+
}
|
|
32
|
+
async function run() {
|
|
33
|
+
loadDevVars();
|
|
34
|
+
const args = process.argv.slice(2);
|
|
35
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
36
|
+
printUsage();
|
|
37
|
+
return Result.Ok(undefined);
|
|
38
|
+
}
|
|
39
|
+
const apply = args.includes("--apply");
|
|
40
|
+
const rLimit = parsePositiveIntFlag(args, "--limit");
|
|
41
|
+
if (rLimit.isErr()) {
|
|
42
|
+
printUsage();
|
|
43
|
+
return Result.Err(rLimit.Err());
|
|
44
|
+
}
|
|
45
|
+
const rConcurrency = parsePositiveIntFlag(args, "--concurrency");
|
|
46
|
+
if (rConcurrency.isErr()) {
|
|
47
|
+
printUsage();
|
|
48
|
+
return Result.Err(rConcurrency.Err());
|
|
49
|
+
}
|
|
50
|
+
const limit = rLimit.Ok();
|
|
51
|
+
const concurrency = rConcurrency.Ok() ?? DEFAULT_CHIP_BACKFILL_CONCURRENCY;
|
|
52
|
+
const connectionString = apply ? process.env["NEON_DATABASE_ADMIN_URL"] : process.env["NEON_DATABASE_URL"];
|
|
53
|
+
if (connectionString === undefined) {
|
|
54
|
+
printUsage();
|
|
55
|
+
return Result.Err(`${apply ? "NEON_DATABASE_ADMIN_URL" : "NEON_DATABASE_URL"} is required (set in .dev.vars or env)`);
|
|
56
|
+
}
|
|
57
|
+
const pool = new Pool({ connectionString });
|
|
58
|
+
const db = drizzleNeon(pool);
|
|
59
|
+
const vctx = {
|
|
60
|
+
sthis: ensureSuperThis(),
|
|
61
|
+
sql: { db, tables: createVibesApiTables("pg"), flavour: "pg" },
|
|
62
|
+
};
|
|
63
|
+
const result = await exception2Result(async () => {
|
|
64
|
+
const summary = await runChipBackfill(vctx, {
|
|
65
|
+
apply,
|
|
66
|
+
...(limit === undefined ? {} : { limit }),
|
|
67
|
+
concurrency,
|
|
68
|
+
onRow: (row, done, total) => {
|
|
69
|
+
if (row.outcome === "failed" || row.outcome === "skipped")
|
|
70
|
+
console.log(describe(row));
|
|
71
|
+
if (done % PROGRESS_EVERY === 0 || done === total)
|
|
72
|
+
console.log(` … ${done}/${total}`);
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
console.log(`\ncandidates=${summary.candidates} (apps with at least one unstamped production release)`);
|
|
76
|
+
if (apply === false) {
|
|
77
|
+
console.log(`planned=${summary.planned} skipped=${summary.skipped} (skipped = live release already stamped or not production — nothing to do)\nDry run — nothing written. Re-run with --apply (concurrency ${concurrency}).`);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
console.log(`stamped=${summary.stamped} stamped-empty=${summary.stampedEmpty} skipped=${summary.skipped} failed=${summary.failed}\n` +
|
|
81
|
+
`skipped = live release already stamped or not production (nothing to do); only failed leaves an app on the expensive path.`);
|
|
82
|
+
if (summary.failed > 0) {
|
|
83
|
+
throw new Error(`sweep finished with ${summary.failed} failed app(s) — re-run to retry (already-stamped rows are skipped)`);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
await pool.end();
|
|
87
|
+
if (result.isErr())
|
|
88
|
+
return Result.Err(result.Err());
|
|
89
|
+
return Result.Ok(undefined);
|
|
90
|
+
}
|
|
91
|
+
run().then((r) => {
|
|
92
|
+
if (r.isErr()) {
|
|
93
|
+
console.error(formatError(r.Err()));
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=backfill-published-chips.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backfill-published-chips.js","sourceRoot":"","sources":["../../jsr/usage-report/backfill-published-chips.ts"],"names":[],"mappings":"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"}
|