@vibes.diy/api-svc 14.0.21 → 14.0.22

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 (94) hide show
  1. package/create-handler.js +12 -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/agent-assembly.d.ts +1 -0
  6. package/intern/agent-assembly.js +6 -1
  7. package/intern/agent-assembly.js.map +1 -1
  8. package/intern/agent-belt.d.ts +4 -1
  9. package/intern/agent-belt.js +12 -3
  10. package/intern/agent-belt.js.map +1 -1
  11. package/intern/agent-build-tools.d.ts +4 -0
  12. package/intern/agent-build-tools.js +6 -0
  13. package/intern/agent-build-tools.js.map +1 -1
  14. package/intern/agent-dispatcher.d.ts +1 -1
  15. package/intern/agent-dispatcher.js +4 -4
  16. package/intern/agent-dispatcher.js.map +1 -1
  17. package/intern/agent-evidence.d.ts +12 -0
  18. package/intern/agent-evidence.js +70 -0
  19. package/intern/agent-evidence.js.map +1 -0
  20. package/intern/agent-file-tools.d.ts +12 -0
  21. package/intern/agent-file-tools.js +162 -0
  22. package/intern/agent-file-tools.js.map +1 -0
  23. package/intern/agent-file-validation.d.ts +9 -0
  24. package/intern/agent-file-validation.js +81 -0
  25. package/intern/agent-file-validation.js.map +1 -0
  26. package/intern/agent-instruction.d.ts +1 -1
  27. package/intern/agent-instruction.js +1 -1
  28. package/intern/agent-lane-flag.d.ts +7 -0
  29. package/intern/agent-lane-flag.js +3 -0
  30. package/intern/agent-lane-flag.js.map +1 -1
  31. package/intern/agent-session-instruction.d.ts +1 -0
  32. package/intern/agent-session-instruction.js +43 -0
  33. package/intern/agent-session-instruction.js.map +1 -0
  34. package/intern/agent-session-runtime.d.ts +39 -0
  35. package/intern/agent-session-runtime.js +247 -0
  36. package/intern/agent-session-runtime.js.map +1 -0
  37. package/intern/agent-session-store.d.ts +6 -0
  38. package/intern/agent-session-store.js +52 -0
  39. package/intern/agent-session-store.js.map +1 -0
  40. package/intern/agent-session.d.ts +193 -0
  41. package/intern/agent-session.js +180 -0
  42. package/intern/agent-session.js.map +1 -0
  43. package/intern/agent-turn.d.ts +5 -1
  44. package/intern/agent-turn.js +7 -3
  45. package/intern/agent-turn.js.map +1 -1
  46. package/intern/agent-wake.d.ts +10 -6
  47. package/intern/agent-wake.js +3 -1
  48. package/intern/agent-wake.js.map +1 -1
  49. package/intern/llm-tool-loop.d.ts +11 -1
  50. package/intern/llm-tool-loop.js +79 -7
  51. package/intern/llm-tool-loop.js.map +1 -1
  52. package/intern/mint-fire-core.js +3 -3
  53. package/intern/mint-fire-core.js.map +1 -1
  54. package/intern/open-turn-store.js +2 -2
  55. package/intern/open-turn-store.js.map +1 -1
  56. package/intern/process-access-bindings.d.ts +1 -0
  57. package/intern/process-access-bindings.js +1 -1
  58. package/intern/process-access-bindings.js.map +1 -1
  59. package/intern/prompt-dispatch-context.d.ts +4 -0
  60. package/intern/prompt-dispatch-context.js +19 -0
  61. package/intern/prompt-dispatch-context.js.map +1 -0
  62. package/intern/work-tools.d.ts +1 -0
  63. package/intern/work-tools.js +1 -1
  64. package/intern/work-tools.js.map +1 -1
  65. package/package.json +12 -11
  66. package/public/fork-app.js +24 -26
  67. package/public/fork-app.js.map +1 -1
  68. package/public/fs-prompt.d.ts +2 -1
  69. package/public/fs-prompt.js +57 -2
  70. package/public/fs-prompt.js.map +1 -1
  71. package/public/llm-dispatch.d.ts +2 -2
  72. package/public/llm-dispatch.js +26 -1
  73. package/public/llm-dispatch.js.map +1 -1
  74. package/public/open-chat.d.ts +2 -2
  75. package/public/open-chat.js +25 -0
  76. package/public/open-chat.js.map +1 -1
  77. package/public/prompt-chat-section.js +302 -12
  78. package/public/prompt-chat-section.js.map +1 -1
  79. package/public/report-top-vibes-by-traffic.d.ts +5 -0
  80. package/public/report-top-vibes-by-traffic.js +69 -0
  81. package/public/report-top-vibes-by-traffic.js.map +1 -0
  82. package/public/vibe-traffic-source.d.ts +114 -0
  83. package/public/vibe-traffic-source.js +322 -0
  84. package/public/vibe-traffic-source.js.map +1 -0
  85. package/types.d.ts +5 -0
  86. package/types.js.map +1 -1
  87. package/usage-report/codegen-delivery-alert.js +2 -2
  88. package/usage-report/codegen-delivery-alert.js.map +1 -1
  89. package/usage-report/vibe-traffic-alert-util.d.ts +74 -0
  90. package/usage-report/vibe-traffic-alert-util.js +237 -0
  91. package/usage-report/vibe-traffic-alert-util.js.map +1 -0
  92. package/usage-report/vibe-traffic-alert.d.ts +2 -0
  93. package/usage-report/vibe-traffic-alert.js +99 -0
  94. package/usage-report/vibe-traffic-alert.js.map +1 -0
@@ -0,0 +1,237 @@
1
+ const DISCORD_MARKUP_RE = /[\\`*_~|>#[\]()]/g;
2
+ export function sanitizeForDiscord(value) {
3
+ return value.replaceAll(DISCORD_MARKUP_RE, (c) => `\\${c}`);
4
+ }
5
+ export const DEFAULT_PEOPLE_THRESHOLD = 10;
6
+ export const DEFAULT_SURGE_MULTIPLE = 3;
7
+ export const DEFAULT_SURGE_FLOOR = 100;
8
+ export const DEFAULT_LOOKBACK_DAYS = 7;
9
+ export const MAX_LISTED = 10;
10
+ const COLOR_CROSSED = 5763719;
11
+ const COLOR_QUIET = 3447003;
12
+ const COLOR_DARK = 16776960;
13
+ export const VIBE_TRAFFIC_ALERT_ENV_VARS = [
14
+ "CLOUDFLARE_ANALYTICS_TOKEN",
15
+ "CLOUDFLARE_ZONE_TAG",
16
+ "POSTHOG_QUERY_API_KEY",
17
+ "POSTHOG_PROJECT_ID",
18
+ "POSTHOG_QUERY_HOST",
19
+ "DISCORD_WEBHOOK_URL",
20
+ "VIBE_TRAFFIC_ALERT_PEOPLE_THRESHOLD",
21
+ "VIBE_TRAFFIC_ALERT_SURGE_MULTIPLE",
22
+ "VIBE_TRAFFIC_ALERT_SURGE_FLOOR",
23
+ "ALERT_EXCLUDE_HANDLES",
24
+ ];
25
+ function num(raw, fallback) {
26
+ if (raw === undefined || raw.trim() === "")
27
+ return fallback;
28
+ const parsed = Number(raw);
29
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
30
+ }
31
+ export function resolveTrafficThresholds(env) {
32
+ return {
33
+ peopleThreshold: num(env.VIBE_TRAFFIC_ALERT_PEOPLE_THRESHOLD, DEFAULT_PEOPLE_THRESHOLD),
34
+ surgeMultiple: num(env.VIBE_TRAFFIC_ALERT_SURGE_MULTIPLE, DEFAULT_SURGE_MULTIPLE),
35
+ surgeFloor: num(env.VIBE_TRAFFIC_ALERT_SURGE_FLOOR, DEFAULT_SURGE_FLOOR),
36
+ lookbackDays: DEFAULT_LOOKBACK_DAYS,
37
+ };
38
+ }
39
+ export function alertDayRefusal(day, readableDays) {
40
+ if (/^\d{4}-\d{2}-\d{2}$/.test(day) === false) {
41
+ return `--day ${day} is not a YYYY-MM-DD date`;
42
+ }
43
+ const today = readableDays[0];
44
+ if (today === undefined)
45
+ return "the read window is empty";
46
+ if (day >= today) {
47
+ return `--day ${day} is not a completed UTC day (today is ${today}) — a partial day understates every count`;
48
+ }
49
+ if (readableDays.includes(day) === false) {
50
+ return `--day ${day} is outside the ${readableDays.length}-day read window (${readableDays[readableDays.length - 1]}..${today}) — nothing older is retained, so nothing could be measured`;
51
+ }
52
+ return undefined;
53
+ }
54
+ export function splitHandleList(raw) {
55
+ return (raw ?? "")
56
+ .split(",")
57
+ .map((s) => s.trim())
58
+ .filter((s) => s !== "");
59
+ }
60
+ export function median(values) {
61
+ if (values.length === 0)
62
+ return 0;
63
+ const s = [...values].sort((a, b) => a - b);
64
+ const mid = Math.floor(s.length / 2);
65
+ return s.length % 2 === 1 ? s[mid] : (s[mid - 1] + s[mid]) / 2;
66
+ }
67
+ function seriesLookup(days) {
68
+ return new Map(days.map((d) => [d.day, d.n]));
69
+ }
70
+ export const MIN_BASELINE_READ_DAYS = 2;
71
+ export function detectCrossings(series, day, thresholds, coverage) {
72
+ const out = [];
73
+ const priorDays = priorDayStrings(day, thresholds.lookbackDays);
74
+ const visitRead = coverage === undefined ? undefined : new Set(coverage.visitDays);
75
+ const peopleRead = coverage === undefined ? undefined : new Set(coverage.peopleDays);
76
+ const priorRead = visitRead === undefined ? MIN_BASELINE_READ_DAYS : priorDays.filter((d) => visitRead.has(d)).length;
77
+ const baselineIsTrustworthy = priorRead >= MIN_BASELINE_READ_DAYS;
78
+ const valueOn = (byDay, read, d) => {
79
+ const v = byDay.get(d);
80
+ if (v !== undefined)
81
+ return v;
82
+ if (read === undefined)
83
+ return 0;
84
+ return read.has(d) ? 0 : undefined;
85
+ };
86
+ for (const s of series) {
87
+ const visits = seriesLookup(s.visitsByDay);
88
+ const people = seriesLookup(s.peopleByDay);
89
+ const peopleToday = valueOn(people, peopleRead, day);
90
+ const visitsToday = valueOn(visits, visitRead, day);
91
+ const peopleThatDay = peopleToday ?? 0;
92
+ const visitsThatDay = visitsToday ?? 0;
93
+ if (peopleToday !== undefined && peopleThatDay >= thresholds.peopleThreshold) {
94
+ const crossedBefore = priorDays.some((d) => {
95
+ const v = valueOn(people, peopleRead, d);
96
+ return v !== undefined && v >= thresholds.peopleThreshold;
97
+ });
98
+ if (!crossedBefore) {
99
+ out.push({
100
+ ownerHandle: s.ownerHandle,
101
+ appSlug: s.appSlug,
102
+ kind: "audience",
103
+ day,
104
+ value: peopleThatDay,
105
+ peopleThatDay,
106
+ visitsThatDay,
107
+ });
108
+ }
109
+ }
110
+ if (visitsToday !== undefined && visitsThatDay >= thresholds.surgeFloor) {
111
+ const priorVisits = priorDays.map((d) => valueOn(visits, visitRead, d)).filter((v) => v !== undefined);
112
+ const baseline = median(priorVisits);
113
+ const surged = baseline === 0 ? baselineIsTrustworthy : visitsThatDay >= baseline * thresholds.surgeMultiple;
114
+ const surgedBefore = priorVisits.some((v) => v >= thresholds.surgeFloor && (baseline === 0 || v >= baseline * thresholds.surgeMultiple));
115
+ if (surged && !surgedBefore) {
116
+ out.push({
117
+ ownerHandle: s.ownerHandle,
118
+ appSlug: s.appSlug,
119
+ kind: "surge",
120
+ day,
121
+ value: visitsThatDay,
122
+ baseline,
123
+ peopleThatDay,
124
+ visitsThatDay,
125
+ });
126
+ }
127
+ }
128
+ }
129
+ return out.sort((a, b) => {
130
+ if (a.kind !== b.kind)
131
+ return a.kind === "audience" ? -1 : 1;
132
+ if (a.value !== b.value)
133
+ return b.value - a.value;
134
+ if (a.ownerHandle !== b.ownerHandle)
135
+ return a.ownerHandle < b.ownerHandle ? -1 : 1;
136
+ return a.appSlug < b.appSlug ? -1 : a.appSlug > b.appSlug ? 1 : 0;
137
+ });
138
+ }
139
+ export function priorDayStrings(day, lookbackDays) {
140
+ const base = Date.parse(`${day}T00:00:00Z`);
141
+ if (!Number.isFinite(base))
142
+ return [];
143
+ const out = [];
144
+ for (let i = 1; i <= lookbackDays; i++) {
145
+ out.push(new Date(base - i * 86_400_000).toISOString().slice(0, 10));
146
+ }
147
+ return out;
148
+ }
149
+ export function vibeTrafficUrl(ownerHandle, appSlug) {
150
+ return `https://vibes.diy/vibe/${ownerHandle}/${appSlug}`;
151
+ }
152
+ const SOURCE_NOTE = [
153
+ "_Cloudflare counts traffic (every request, bots included); PostHog counts people (US-only, needs JavaScript, ad-blocker-lossy — a floor, correct by roughly 1.2-1.5x)._",
154
+ "_An app with visits and no people is a scraper wave, not an audience. Both numbers are shown so you can tell which one you are looking at._",
155
+ ].join("\n");
156
+ export function buildTrafficAlertEmbed(input) {
157
+ const { crossings, day, thresholds } = input;
158
+ if (!input.cfAvailable && !input.phAvailable) {
159
+ return {
160
+ content: `🕳️ Vibe traffic: neither feed could be read for ${day}`,
161
+ allowed_mentions: { parse: [] },
162
+ embeds: [
163
+ {
164
+ title: `Vibe traffic (${day})`,
165
+ description: [
166
+ `Both Cloudflare and PostHog reads failed or are unconfigured, so NOTHING was measured — this is not a quiet day.`,
167
+ ...(input.sourceErrors.length > 0 ? [``, input.sourceErrors.map((e) => `· ${e}`).join("\n")] : []),
168
+ ``,
169
+ `A missing credential here is a one-action provisioning fix, not a condition to wait out.`,
170
+ ].join("\n"),
171
+ color: COLOR_DARK,
172
+ },
173
+ ],
174
+ };
175
+ }
176
+ const partial = !input.cfAvailable || !input.phAvailable;
177
+ const blindHalf = !input.cfAvailable
178
+ ? `⚠️ Cloudflare is unreadable, so the traffic-surge rule did not run — and that is the rule that would catch a scraper-shaped arrival like \`og/satie-trumpet-8293\`, which has never registered a single PostHog person.`
179
+ : `⚠️ PostHog is unreadable, so the ${thresholds.peopleThreshold}-people rule did not run. Only traffic was checked.`;
180
+ const rules = [
181
+ `Rules: **${thresholds.peopleThreshold}+ people in a day** (PostHog), or **${thresholds.surgeMultiple}x the app's own trailing ${thresholds.lookbackDays}-day median visits** with a floor of ${thresholds.surgeFloor} (Cloudflare).`,
182
+ `Each app alerts once per crossing — a vibe that stays above a line does not post again until it has spent a full ${thresholds.lookbackDays} days below it.`,
183
+ ].join("\n");
184
+ if (crossings.length === 0) {
185
+ return {
186
+ content: `✅ Vibe traffic: nothing crossed on ${day}`,
187
+ allowed_mentions: { parse: [] },
188
+ embeds: [
189
+ {
190
+ title: `Vibe traffic (${day})`,
191
+ description: [
192
+ ...(partial ? [blindHalf, ``] : []),
193
+ `${input.vibesMeasured} vibe${input.vibesMeasured === 1 ? "" : "s"} measured; none crossed a threshold it had not already crossed this week.`,
194
+ ``,
195
+ rules,
196
+ ...(input.sourceErrors.length > 0 ? [``, input.sourceErrors.map((e) => `· ${e}`).join("\n")] : []),
197
+ ``,
198
+ SOURCE_NOTE,
199
+ ].join("\n"),
200
+ color: COLOR_QUIET,
201
+ },
202
+ ],
203
+ };
204
+ }
205
+ const line = (c) => {
206
+ const url = vibeTrafficUrl(c.ownerHandle, c.appSlug);
207
+ const who = c.kind === "audience"
208
+ ? `**${c.value} people** in one day (${c.visitsThatDay} visits)`
209
+ : c.baseline === 0
210
+ ? `**${c.value} visits** in one day, its first day over the floor${c.peopleThatDay === 0 ? " — and zero PostHog people, so this is traffic, not audience" : ` (${c.peopleThatDay} people)`}`
211
+ : `**${c.value} visits** vs a ${c.baseline}/day trailing median${c.peopleThatDay === 0 ? " — and zero PostHog people, so this is traffic, not audience" : ` (${c.peopleThatDay} people)`}`;
212
+ return ` ${url} — ${who}`;
213
+ };
214
+ const audience = crossings.filter((c) => c.kind === "audience");
215
+ const surge = crossings.filter((c) => c.kind === "surge");
216
+ const listed = (rows) => [...rows.slice(0, MAX_LISTED).map(line), ...(rows.length > MAX_LISTED ? [` …and ${rows.length - MAX_LISTED} more`] : [])].join("\n");
217
+ return {
218
+ content: `📈 Vibe traffic: ${crossings.length} vibe${crossings.length === 1 ? "" : "s"} crossed a threshold on ${day}`,
219
+ allowed_mentions: { parse: [] },
220
+ embeds: [
221
+ {
222
+ title: `Vibe traffic (${day})`,
223
+ description: [
224
+ ...(partial ? [blindHalf, ``] : []),
225
+ ...(audience.length === 0 ? [] : [`**Reached ${thresholds.peopleThreshold}+ people in a day**`, listed(audience), ``]),
226
+ ...(surge.length === 0 ? [] : [`**Traffic surge against their own baseline**`, listed(surge), ``]),
227
+ rules,
228
+ ...(input.sourceErrors.length > 0 ? [``, input.sourceErrors.map((e) => `· ${e}`).join("\n")] : []),
229
+ ``,
230
+ SOURCE_NOTE,
231
+ ].join("\n"),
232
+ color: COLOR_CROSSED,
233
+ },
234
+ ],
235
+ };
236
+ }
237
+ //# sourceMappingURL=vibe-traffic-alert-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vibe-traffic-alert-util.js","sourceRoot":"","sources":["../../jsr/usage-report/vibe-traffic-alert-util.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Result } from "@adviser/cement";
2
+ export declare function run(): Promise<Result<void>>;
@@ -0,0 +1,99 @@
1
+ import { Result, exception2Result } from "@adviser/cement";
2
+ import { arg, flag, formatError, loadDevVars } from "./usage-report-util.js";
3
+ import { CF_RETENTION_DAYS, posthogHealth, utcDayBuckets, fetchCloudflareVibeVisits, fetchPostHogVibePeople, rollupVibeTraffic, } from "../public/vibe-traffic-source.js";
4
+ import { alertDayRefusal, buildTrafficAlertEmbed, detectCrossings, resolveTrafficThresholds, splitHandleList, } from "./vibe-traffic-alert-util.js";
5
+ const READ_DAYS = CF_RETENTION_DAYS;
6
+ function yesterdayUtc(now) {
7
+ return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()) - 86_400_000).toISOString().slice(0, 10);
8
+ }
9
+ export async function run() {
10
+ loadDevVars();
11
+ const now = new Date();
12
+ const dayRaw = arg("--day");
13
+ const day = dayRaw === undefined ? yesterdayUtc(now) : dayRaw;
14
+ const readableDays = utcDayBuckets(now, READ_DAYS).map((b) => b.day);
15
+ const refusal = alertDayRefusal(day, readableDays);
16
+ if (refusal !== undefined) {
17
+ return Result.Err(`${refusal}\nusage: pnpm --dir vibes.diy/api/svc run vibe-traffic-alert [--day YYYY-MM-DD] [--dry-run]`);
18
+ }
19
+ const cfToken = process.env["CLOUDFLARE_ANALYTICS_TOKEN"];
20
+ const cfZone = process.env["CLOUDFLARE_ZONE_TAG"];
21
+ const phKey = process.env["POSTHOG_QUERY_API_KEY"];
22
+ const phProject = process.env["POSTHOG_PROJECT_ID"];
23
+ const phHost = process.env["POSTHOG_QUERY_HOST"];
24
+ const webhookUrl = process.env["DISCORD_WEBHOOK_URL"];
25
+ const excludeHandles = splitHandleList(process.env["ALERT_EXCLUDE_HANDLES"]);
26
+ const thresholds = resolveTrafficThresholds({
27
+ VIBE_TRAFFIC_ALERT_PEOPLE_THRESHOLD: process.env["VIBE_TRAFFIC_ALERT_PEOPLE_THRESHOLD"],
28
+ VIBE_TRAFFIC_ALERT_SURGE_MULTIPLE: process.env["VIBE_TRAFFIC_ALERT_SURGE_MULTIPLE"],
29
+ VIBE_TRAFFIC_ALERT_SURGE_FLOOR: process.env["VIBE_TRAFFIC_ALERT_SURGE_FLOOR"],
30
+ });
31
+ const cfConfigured = cfToken !== undefined && cfToken !== "";
32
+ const phConfigured = phKey !== undefined && phKey !== "" && phProject !== undefined && phProject !== "";
33
+ if (!cfConfigured && !phConfigured) {
34
+ return Result.Err("neither CLOUDFLARE_ANALYTICS_TOKEN nor POSTHOG_QUERY_API_KEY/POSTHOG_PROJECT_ID is set — nothing was measured");
35
+ }
36
+ const [cf, ph] = await Promise.all([
37
+ fetchCloudflareVibeVisits({
38
+ token: cfToken,
39
+ ...(cfZone === undefined || cfZone === "" ? {} : { zoneTag: cfZone }),
40
+ days: READ_DAYS,
41
+ now,
42
+ fetchImpl: (input, init) => fetch(input, init),
43
+ }),
44
+ fetchPostHogVibePeople({
45
+ apiKey: phKey,
46
+ projectId: phProject,
47
+ ...(phHost === undefined || phHost === "" ? {} : { host: phHost }),
48
+ days: READ_DAYS,
49
+ fetchImpl: (input, init) => fetch(input, init),
50
+ }),
51
+ ]);
52
+ const series = rollupVibeTraffic({
53
+ cf: cf.rows,
54
+ cfAvailable: cf.health.available,
55
+ phPerDay: ph.perDay,
56
+ phWindow: [],
57
+ phAvailable: ph.perDayAvailable,
58
+ excludeHandles,
59
+ });
60
+ const crossings = detectCrossings(series, day, thresholds, {
61
+ visitDays: cf.readDays,
62
+ peopleDays: ph.perDayAvailable ? readableDays : [],
63
+ });
64
+ const phHealth = posthogHealth(ph, "perDay");
65
+ const sourceErrors = [cf.health, phHealth].flatMap((h) => [
66
+ ...(h.error === undefined ? [] : [`${h.label}: ${h.error}`]),
67
+ ...(h.truncated === true ? [`${h.label}: read hit its row cap, so the day is a slice rather than the whole of it`] : []),
68
+ ]);
69
+ const body = buildTrafficAlertEmbed({
70
+ crossings,
71
+ day,
72
+ thresholds,
73
+ vibesMeasured: series.length,
74
+ cfAvailable: cf.health.available,
75
+ phAvailable: ph.perDayAvailable,
76
+ sourceErrors,
77
+ });
78
+ const dryRun = flag("--dry-run") || webhookUrl === undefined || webhookUrl === "";
79
+ console.log(`[vibe-traffic-alert] day=${day} vibes=${series.length} crossings=${crossings.length} cf=${cf.health.available} posthog=${ph.perDayAvailable} posted=${!dryRun}`);
80
+ for (const e of sourceErrors)
81
+ console.log(`[vibe-traffic-alert] ${e}`);
82
+ if (dryRun) {
83
+ console.log(JSON.stringify(body, null, 2));
84
+ return Result.Ok();
85
+ }
86
+ const res = await exception2Result(() => fetch(webhookUrl, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body) }));
87
+ if (res.isErr())
88
+ return Result.Err(res);
89
+ if (res.Ok().status !== 204)
90
+ return Result.Err(new Error(`discord post returned ${res.Ok().status}`));
91
+ return Result.Ok();
92
+ }
93
+ run().then((result) => {
94
+ if (result.isErr()) {
95
+ console.error(formatError(result.Err()));
96
+ process.exitCode = 1;
97
+ }
98
+ });
99
+ //# sourceMappingURL=vibe-traffic-alert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vibe-traffic-alert.js","sourceRoot":"","sources":["../../jsr/usage-report/vibe-traffic-alert.ts"],"names":[],"mappings":"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"}