@vibes.diy/api-svc 13.0.2 → 13.0.4

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 (59) hide show
  1. package/create-handler.js +2 -0
  2. package/create-handler.js.map +1 -1
  3. package/evento-handler-manifest.js +2 -0
  4. package/evento-handler-manifest.js.map +1 -1
  5. package/intern/attach-draft-handle.js +1 -0
  6. package/intern/attach-draft-handle.js.map +1 -1
  7. package/intern/components/vibe-page.d.ts +1 -0
  8. package/intern/components/vibe-page.js +13 -1
  9. package/intern/components/vibe-page.js.map +1 -1
  10. package/intern/delete-access-gate.js +9 -1
  11. package/intern/delete-access-gate.js.map +1 -1
  12. package/intern/draft-chat-store.d.ts +1 -0
  13. package/intern/draft-chat-store.js +1 -0
  14. package/intern/draft-chat-store.js.map +1 -1
  15. package/intern/ensure-app-metadata.js.map +1 -1
  16. package/intern/ensure-chat-id.d.ts +2 -1
  17. package/intern/ensure-chat-id.js +16 -4
  18. package/intern/ensure-chat-id.js.map +1 -1
  19. package/intern/first-message-embedding.js +0 -0
  20. package/intern/first-message-embedding.js.map +1 -1
  21. package/intern/pre-allocate.d.ts +3 -1
  22. package/intern/pre-allocate.js +10 -5
  23. package/intern/pre-allocate.js.map +1 -1
  24. package/intern/prompt-assembly.d.ts +1 -0
  25. package/intern/prompt-assembly.js +5 -2
  26. package/intern/prompt-assembly.js.map +1 -1
  27. package/intern/render-vibe.js +2 -8
  28. package/intern/render-vibe.js.map +1 -1
  29. package/package.json +13 -12
  30. package/public/access-helpers.js +7 -22
  31. package/public/access-helpers.js.map +1 -1
  32. package/public/app-settings-snapshot.d.ts +38 -0
  33. package/public/app-settings-snapshot.js +36 -0
  34. package/public/app-settings-snapshot.js.map +1 -0
  35. package/public/db-acl-resolver.js +3 -8
  36. package/public/db-acl-resolver.js.map +1 -1
  37. package/public/ensure-app-settings.js +2 -8
  38. package/public/ensure-app-settings.js.map +1 -1
  39. package/public/handle-profile-vibes.d.ts +6 -0
  40. package/public/handle-profile-vibes.js +82 -0
  41. package/public/handle-profile-vibes.js.map +1 -0
  42. package/public/prompt-chat-section.js +3 -0
  43. package/public/prompt-chat-section.js.map +1 -1
  44. package/public/serv-entry-point.js +29 -4
  45. package/public/serv-entry-point.js.map +1 -1
  46. package/public/social-store.d.ts +1 -0
  47. package/public/social-store.js +1 -1
  48. package/public/social-store.js.map +1 -1
  49. package/public/sync-eventos.js +1 -1
  50. package/public/sync-eventos.js.map +1 -1
  51. package/public/write-front-door.js +10 -0
  52. package/public/write-front-door.js.map +1 -1
  53. package/usage-report/backfill-release-tailwind-util.d.ts +42 -0
  54. package/usage-report/backfill-release-tailwind-util.js +178 -0
  55. package/usage-report/backfill-release-tailwind-util.js.map +1 -0
  56. package/usage-report/backfill-release-tailwind.d.ts +1 -0
  57. package/usage-report/backfill-release-tailwind.js +109 -0
  58. package/usage-report/backfill-release-tailwind.js.map +1 -0
  59. package/usage-report/check-env.sh +8 -3
@@ -0,0 +1,109 @@
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 { ensureStorage } from "@vibes.diy/api-pkg";
6
+ import { createSQLPeer, createVibesApiTables } from "@vibes.diy/api-sql";
7
+ import { DEFAULT_TAILWIND_BACKFILL_CONCURRENCY, runTailwindBackfill, } from "./backfill-release-tailwind-util.js";
8
+ import { parsePositiveIntFlag } from "./backfill-published-chips-util.js";
9
+ import { formatError, loadDevVars } from "./usage-report-util.js";
10
+ const PROGRESS_EVERY = 25;
11
+ function printUsage() {
12
+ console.log(`
13
+ Usage:
14
+ pnpm --dir vibes.diy/api/svc run admin:backfill-release-tailwind # dry run (read-only)
15
+ pnpm --dir vibes.diy/api/svc run admin:backfill-release-tailwind -- --apply # write pass
16
+ ... -- --apply --limit 50 # cap for a controlled batch
17
+ ... -- --apply --concurrency 4 # default ${DEFAULT_TAILWIND_BACKFILL_CONCURRENCY}
18
+
19
+ --limit and --concurrency take a POSITIVE INTEGER. A bad value is an error, not
20
+ a fallback — an unusable --limit must never quietly mean "sweep everything".
21
+
22
+ Environment:
23
+ NEON_DATABASE_URL read/discovery connection (dry run)
24
+ NEON_DATABASE_ADMIN_URL write connection (required for --apply)
25
+ `.trim());
26
+ }
27
+ function describe(row) {
28
+ const label = `@${row.ownerHandle}/${row.appSlug}`;
29
+ const seq = row.releaseSeq === undefined ? "" : ` seq=${row.releaseSeq}`;
30
+ const css = row.cssBytes === undefined ? "" : ` css=${row.cssBytes}B`;
31
+ const cands = row.candidates === undefined ? "" : ` cand=${row.candidates}`;
32
+ const reason = row.reason === undefined ? "" : ` (${row.reason})`;
33
+ return `${row.outcome.toUpperCase().padEnd(14)}${label}${seq}${cands}${css}${reason}`;
34
+ }
35
+ async function run() {
36
+ loadDevVars();
37
+ const args = process.argv.slice(2);
38
+ if (args.includes("--help") || args.includes("-h")) {
39
+ printUsage();
40
+ return Result.Ok(undefined);
41
+ }
42
+ const apply = args.includes("--apply");
43
+ const rLimit = parsePositiveIntFlag(args, "--limit");
44
+ if (rLimit.isErr()) {
45
+ printUsage();
46
+ return Result.Err(rLimit.Err());
47
+ }
48
+ const rConcurrency = parsePositiveIntFlag(args, "--concurrency");
49
+ if (rConcurrency.isErr()) {
50
+ printUsage();
51
+ return Result.Err(rConcurrency.Err());
52
+ }
53
+ const limit = rLimit.Ok();
54
+ const concurrency = rConcurrency.Ok() ?? DEFAULT_TAILWIND_BACKFILL_CONCURRENCY;
55
+ const connectionString = apply ? process.env["NEON_DATABASE_ADMIN_URL"] : process.env["NEON_DATABASE_URL"];
56
+ if (connectionString === undefined) {
57
+ printUsage();
58
+ return Result.Err(`${apply ? "NEON_DATABASE_ADMIN_URL" : "NEON_DATABASE_URL"} is required (set in .dev.vars or env)`);
59
+ }
60
+ const pool = new Pool({ connectionString });
61
+ const db = drizzleNeon(pool);
62
+ const tables = createVibesApiTables("pg");
63
+ const vctx = {
64
+ sthis: ensureSuperThis(),
65
+ sql: { db, tables, flavour: "pg" },
66
+ storage: ensureStorage({}, createSQLPeer({ flavour: "pg", db, assets: tables.assets })),
67
+ };
68
+ const result = await exception2Result(async () => {
69
+ const summary = await runTailwindBackfill(vctx, {
70
+ apply,
71
+ ...(limit === undefined ? {} : { limit }),
72
+ concurrency,
73
+ onRow: (row, done, total) => {
74
+ if (row.outcome === "failed" || row.outcome === "deferred")
75
+ console.log(describe(row));
76
+ if (done % PROGRESS_EVERY === 0 || done === total)
77
+ console.log(` … ${done}/${total}`);
78
+ },
79
+ });
80
+ console.log(`\ncandidates=${summary.candidates} (every published app — the artifact check happens per app)`);
81
+ if (apply === false) {
82
+ console.log(`planned=${summary.planned} skipped=${summary.skipped} no-candidates=${summary.noCandidates} deferred=${summary.deferred} failed=${summary.failed}\n` +
83
+ `skipped = live release already carries an artifact, or is not production — nothing to do.\n` +
84
+ `Dry run — nothing written. Re-run with --apply (concurrency ${concurrency}).`);
85
+ return undefined;
86
+ }
87
+ console.log(`compiled=${summary.compiled} skipped=${summary.skipped} no-candidates=${summary.noCandidates} deferred=${summary.deferred} failed=${summary.failed}\n` +
88
+ `no-candidates = the release really uses no utilities, so a deploy today would emit no artifact either.\n` +
89
+ `deferred = a source this context could not read (R2) — NOT "no utilities"; those releases still pay the per-request compile.`);
90
+ if (summary.failed > 0 || summary.deferred > 0) {
91
+ return `sweep finished with ${summary.failed} failed and ${summary.deferred} deferred app(s) — re-run to retry (covered releases are skipped)`;
92
+ }
93
+ return undefined;
94
+ });
95
+ await pool.end();
96
+ if (result.isErr())
97
+ return Result.Err(result.Err());
98
+ const partial = result.Ok();
99
+ if (partial !== undefined)
100
+ return Result.Err(partial);
101
+ return Result.Ok(undefined);
102
+ }
103
+ run().then((r) => {
104
+ if (r.isErr()) {
105
+ console.error(formatError(r.Err()));
106
+ process.exit(1);
107
+ }
108
+ });
109
+ //# sourceMappingURL=backfill-release-tailwind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfill-release-tailwind.js","sourceRoot":"","sources":["../../jsr/usage-report/backfill-release-tailwind.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,12 @@
18
18
 
19
19
  set -uo pipefail
20
20
 
21
+ # macOS ships bash 3.2, so this script must stay 3.2-compatible. Two traps:
22
+ # - a quoted heredoc inside $(...) mis-parses quotes on 3.2 (an apostrophe in
23
+ # the spec text below was enough to make the whole file a syntax error)
24
+ # - `associative arrays, ${var^^}, mapfile` are all 4.0+
25
+ # Keep new code inside that subset rather than raising the requirement.
26
+
21
27
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
22
28
  DEV_VARS="$SCRIPT_DIR/../.dev.vars"
23
29
 
@@ -39,7 +45,7 @@ done
39
45
  # The reference set. Each entry: NAME|TOOLS|SEVERITY|what breaks without it
40
46
  # SEVERITY: required = tool refuses to run · silent = tool runs and LIES · optional
41
47
  # ---------------------------------------------------------------------------
42
- SPEC=$(cat <<'SPEC_END'
48
+ IFS= read -r -d '' SPEC <<'SPEC_END'
43
49
  NEON_DATABASE_URL|journey,db-inspect|required|Prod Neon connection. Without it `journey` exits with "NEON_DATABASE_URL is required" and `db:inspect` cannot run at all. DATABASE_URL is accepted as a fallback. This is the one failure that is loud.
44
50
  AUTUMN_SECRET_KEY|journey|silent|THE BIG ONE. Billing plane (plan, credit balance, wall crossing, conversion). Missing key is INDISTINGUISHABLE in the output from a user Autumn never saw: the report prints "NOT in Autumn (customer_not_found) — no billing signal" and ">> VERDICT: no Autumn record | converted: none" for EVERY user. Every paywall casualty reads as never-walled and every subscriber reads as never-converted. If Meghan's reports say nobody converted, suspect this before believing it.
45
51
  CLERK_SECRET_KEY|journey,vibe-usage|silent|Identity plane (name, email, signup date). Missing key silently yields "identity: (no name) (none) signup=?" — the rest of the report renders normally, so it looks like a user with no profile rather than a broken env. Also required by vibe-usage.py for the sign-up funnel leg.
@@ -59,7 +65,6 @@ MAILCHIMP_API_KEY|legacy|optional|No script in either repo reads this. The newsl
59
65
  GA4_PROPERTY_ID|legacy|optional|STALE. Google Analytics was retired in favour of PostHog as the single analytics sink (#4257) and nothing in either repo reads this. Safe to delete from your env; if you are reaching for it, you want POSTHOG_API_KEY.
60
66
  GA4_SA_KEY|legacy|optional|STALE — same as GA4_PROPERTY_ID. A Google service-account key with no remaining consumer; worth deleting rather than carrying a live credential nothing uses.
61
67
  SPEC_END
62
- )
63
68
 
64
69
  # A var counts as present only if its EFFECTIVE value is non-empty. .dev.vars is
65
70
  # parsed exactly the way loadDevVars() does — first occurrence wins, surrounding
@@ -109,7 +114,7 @@ if [ "$MODE" = "diff" ]; then
109
114
  REF_NAMES=$(grep -oE '^[[:space:]]*(export[[:space:]]+)?[A-Za-z_][A-Za-z0-9_]*=' \
110
115
  | sed -E 's/^[[:space:]]*(export[[:space:]]+)?//; s/=$//' | sort -u)
111
116
  if [ -z "$REF_NAMES" ]; then
112
- echo "${RED}No VAR= lines found on stdin.${RST} Expected `env`-style output, e.g. pbpaste | $0 --diff" >&2
117
+ echo "${RED}No VAR= lines found on stdin.${RST} Expected env-style output, e.g. pbpaste | $0 --diff" >&2
113
118
  exit 2
114
119
  fi
115
120
  echo "${BLD}Names present in the reference env but not in yours${RST} ${DIM}(values never read)${RST}"