@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.
Files changed (63) hide show
  1. package/evento-handler-manifest.js +2 -0
  2. package/evento-handler-manifest.js.map +1 -1
  3. package/intern/backend-notify-callback.js.map +1 -1
  4. package/intern/get-open-turn.js +19 -6
  5. package/intern/get-open-turn.js.map +1 -1
  6. package/intern/half-open-turn.d.ts +5 -2
  7. package/intern/half-open-turn.js +7 -3
  8. package/intern/half-open-turn.js.map +1 -1
  9. package/intern/is-app-participant.d.ts +4 -7
  10. package/intern/is-app-participant.js +3 -57
  11. package/intern/is-app-participant.js.map +1 -1
  12. package/intern/participants.d.ts +17 -0
  13. package/intern/participants.js +185 -0
  14. package/intern/participants.js.map +1 -0
  15. package/intern/render-vibe.d.ts +1 -0
  16. package/intern/render-vibe.js +9 -2
  17. package/intern/render-vibe.js.map +1 -1
  18. package/package.json +13 -12
  19. package/public/app-seq-allocation.js.map +1 -1
  20. package/public/chip-projection.d.ts +10 -0
  21. package/public/chip-projection.js +113 -0
  22. package/public/chip-projection.js.map +1 -0
  23. package/public/chip-stamp.d.ts +25 -0
  24. package/public/chip-stamp.js +57 -0
  25. package/public/chip-stamp.js.map +1 -0
  26. package/public/ensure-app-slug-item.js +18 -0
  27. package/public/ensure-app-slug-item.js.map +1 -1
  28. package/public/get-vibe-chips.js +23 -106
  29. package/public/get-vibe-chips.js.map +1 -1
  30. package/public/list-members.js +9 -0
  31. package/public/list-members.js.map +1 -1
  32. package/public/publish-app.js +8 -0
  33. package/public/publish-app.js.map +1 -1
  34. package/public/report-active-members.d.ts +2 -0
  35. package/public/report-active-members.js +14 -21
  36. package/public/report-active-members.js.map +1 -1
  37. package/public/report-top-vibes-by-members.d.ts +2 -0
  38. package/public/report-top-vibes-by-members.js +13 -19
  39. package/public/report-top-vibes-by-members.js.map +1 -1
  40. package/public/seed-starter-chips-handler.js +12 -0
  41. package/public/seed-starter-chips-handler.js.map +1 -1
  42. package/public/select-app.d.ts +29 -0
  43. package/public/select-app.js +38 -0
  44. package/public/select-app.js.map +1 -1
  45. package/public/serv-entry-point.js +2 -1
  46. package/public/serv-entry-point.js.map +1 -1
  47. package/public/set-version-lock.js +8 -0
  48. package/public/set-version-lock.js.map +1 -1
  49. package/public/set-vibe-chips.d.ts +3 -0
  50. package/public/set-vibe-chips.js +90 -0
  51. package/public/set-vibe-chips.js.map +1 -0
  52. package/public/viewer-capabilities.d.ts +12 -0
  53. package/public/viewer-capabilities.js +8 -0
  54. package/public/viewer-capabilities.js.map +1 -0
  55. package/public/who-am-i.d.ts +2 -0
  56. package/public/who-am-i.js +26 -14
  57. package/public/who-am-i.js.map +1 -1
  58. package/usage-report/backfill-published-chips-util.d.ts +43 -0
  59. package/usage-report/backfill-published-chips-util.js +120 -0
  60. package/usage-report/backfill-published-chips-util.js.map +1 -0
  61. package/usage-report/backfill-published-chips.d.ts +1 -0
  62. package/usage-report/backfill-published-chips.js +97 -0
  63. 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"}
@@ -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[];
@@ -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 { access } = viewerUserId
86
- ? await checkDocAccess(vctx, viewerUserId, appSlug, ownerUserSlug, args.adminMode)
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
- if (!auth) {
97
- const grants = await resolveGrants(vctx, ownerUserSlug, appSlug, undefined, args.accessFnBindings);
98
- return Result.Ok({ viewer: null, access, isOwner: false, grants });
99
- }
100
- if (!viewerUserId) {
101
- const grants = await resolveGrants(vctx, ownerUserSlug, appSlug, undefined, args.accessFnBindings);
102
- return Result.Ok({ viewer: null, access, isOwner: false, grants });
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, args.accessFnBindings);
121
- return Result.Ok({ viewer: null, access, isOwner: false, grants, needsHandle: true });
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, args.accessFnBindings);
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);
@@ -1 +1 @@
1
- {"version":3,"file":"who-am-i.js","sourceRoot":"","sources":["../../jsr/public/who-am-i.ts"],"names":[],"mappings":"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"}
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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"}