@vibes.diy/prompts 4.2.2 → 4.3.0

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/llms/backend.md CHANGED
@@ -69,6 +69,7 @@ ctx.secrets; // Record<string,string> — the owner's per-vibe secrets; frozen,
69
69
  await ctx.db.put(doc, { db: "notes", id: "optional-id" }); // resolves to the doc id AFTER commit
70
70
  await ctx.db.delete(docId, { db: "notes" });
71
71
  const docs = await ctx.db.query({ db: "notes" }); // latest non-deleted docs (each with _id)
72
+ const text = await ctx.callAI("prompt", { model: "openrouter/auto", max_tokens: 500 }); // server-side AI call
72
73
  ```
73
74
 
74
75
  - `{ db }` names the Fireproof database (same names `App.jsx` uses with
@@ -101,8 +102,22 @@ const docs = await ctx.db.query({ db: "notes" }); // latest non-deleted docs (ea
101
102
  on port 443 only, 15s per request, 10MB responses, per-vibe rate caps
102
103
  (30/10s, 300/min). Make all outbound calls **before returning** the Response —
103
104
  a `fetch()` fired while a streamed body is still being pulled after the
104
- handler returned is unsupported and gets denied. Frontend AI calls stay in
105
- `App.jsx` via `callAI`.
105
+ handler returned is unsupported and gets denied. Interactive frontend AI
106
+ calls stay in `App.jsx` via `callAI`; server-side AI belongs to `ctx.callAI`.
107
+ - **`ctx.callAI(prompt, options?)` is the server-side AI call.** It resolves to
108
+ the completion **text** (a plain string) — no API key needed and none exists
109
+ in the handler; the platform makes the call and meters the cost against the
110
+ account of the user who triggered the handler (the writer in `onChange`, the
111
+ signed-in caller in `fetch`), or the app owner when no user is involved
112
+ (`scheduled` ticks, anonymous webhooks). Options: `model` (default
113
+ `"openrouter/auto"`), `max_tokens`, `temperature`. No streaming and no schema
114
+ mode — for structured output, ask for JSON in the prompt and `JSON.parse`
115
+ defensively. Budget: a handful of calls per invocation (currently 5) and
116
+ ~64k prompt chars; a denied or failed call **throws** — catch it and degrade
117
+ (e.g. write the doc back with an error field) rather than losing the event.
118
+ Keep interactive/streaming AI in `App.jsx` via `callAI`; use `ctx.callAI`
119
+ when the result must be server-authoritative (moderation, digests,
120
+ summaries users shouldn't be able to forge).
106
121
 
107
122
  ## fetch — the app's HTTP endpoint
108
123
 
@@ -0,0 +1,2 @@
1
+ import type { LlmConfig } from "./types.js";
2
+ export declare const calendarConfig: LlmConfig;
@@ -0,0 +1,6 @@
1
+ export const calendarConfig = {
2
+ name: "calendar",
3
+ label: "calendar-ics",
4
+ description: "live calendar subscriptions (webcal/.ics): serve each user's dated items — favorites, RSVPs, picks, bookings — as a phone-calendar feed that updates automatically as they add more; includes the backend.js aggregation recipe and the iOS-proof ICS format rules",
5
+ };
6
+ //# sourceMappingURL=calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../jsr/llms/calendar.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,cAAc,GAAc;IACvC,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,cAAc;IACrB,WAAW,EACT,oQAAoQ;CACvQ,CAAC"}
@@ -0,0 +1,252 @@
1
+ # Calendar subscriptions — a live .ics feed of each user's items
2
+
3
+ When an app has per-user dated items — favorited events, RSVPs, picks,
4
+ bookings, shifts — offer a **calendar subscription**: a `webcal://` link that
5
+ puts the user's items on their phone calendar and keeps them updated as they
6
+ add more. This is a `backend.js` feature (see the backend docs for the general
7
+ handler contract); this page is the recipe that makes subscriptions actually
8
+ work on real devices.
9
+
10
+ ## The architecture (each piece is load-bearing)
11
+
12
+ Calendar clients (iPhone, Google) refresh subscriptions with **anonymous
13
+ GETs** — no login, no headers you control. An anonymous `fetch` handler cannot
14
+ read the app's databases (anonymous `ctx.db.query` is denied, and the `fetch`
15
+ lane can't query access-fn-bound databases at all). So:
16
+
17
+ 1. **A `scheduled` tick aggregates; the `fetch` lane serves.** `scheduled`
18
+ runs as the owner in admin mode and CAN read everything. Every minute it
19
+ builds `handle → items` into a module-level variable. All handlers share
20
+ one isolate, so the anonymous GET reads that cache. Use `interval: "1m"` —
21
+ every deploy replaces the isolate (empty cache), and the window must stay
22
+ short.
23
+ 2. **The URL carries a per-user RANDOM TOKEN — a capability, not a handle.**
24
+ Subscription URLs are unauthenticated and long-lived; a handle-keyed URL
25
+ (`?u=<handle>`) is guessable, which silently makes every user's items
26
+ world-readable. Instead, MINT the token LOCALLY: the first time the
27
+ user opens the calendar surface with subscribable content, generate a
28
+ `crypto.getRandomValues` token client-side and put a `caltoken` doc
29
+ `{ type: "caltoken", userId, token }`, kept PRIVATE by the access function
30
+ (owner-only channel, like notes — the token IS the secret; the scheduled
31
+ lane reads it regardless). Local minting makes the URL available instantly
32
+ (the optimistic write reaches the live query before the click finishes),
33
+ and it stays **opt-in**: users who never open that surface get no token
34
+ and no ics aggregate — the scheduled tick must skip aggregating any user
35
+ without a token. The URL is `?t=<token>&n=<handle>` (`n` is a validated
36
+ DISPLAY label only — iOS captures the calendar name at subscribe time,
37
+ often before the tick has learned a fresh token; the token alone gates
38
+ data): unguessable, shareable on purpose (handing out the link is the
39
+ sharing feature), and revocable — delete the token doc and the feed drains
40
+ on the next refresh. Because the token maps to the user (not to item ids),
41
+ the feed is still LIVE: new items reach every subscriber automatically.
42
+ Never let private types (notes, drafts) enter the aggregation.
43
+ 3. **Never answer a subscription GET with an error or emptiness you can
44
+ avoid.** iOS validates a new subscription by fetching the URL at add time
45
+ and shows "Validation failed" on ANY failure — including 503. A cold cache
46
+ (isolate just booted, tick hasn't run) must return a **valid** calendar
47
+ (empty, or a hard-coded real anchor event like the festival's "Gates
48
+ Open") with `cache-control: no-store`. Reserve error statuses
49
+ (`503` + `Retry-After: 300`) for an upstream-join failure where ANY item
50
+ would have no fallback data — an empty or partial 200 there would wipe or
51
+ shrink the subscriber's previously-synced events, while an error makes
52
+ clients keep them and retry.
53
+ 4. **Validate per item when serving, all-or-nothing never.** One malformed
54
+ legacy doc must drop out of the feed, not 400 it.
55
+ 5. **The URL is the subscription's identity — freeze it at first ship.**
56
+ Subscribers hold the exact URL; changing the path or parameter shape later
57
+ strands every existing subscription. Renames go in `X-WR-CALNAME` only —
58
+ and even those reach only NEW subscribers, because clients capture the
59
+ calendar name at subscribe time (same reason the `n=` label exists).
60
+ Choose the path and display name like you can never change them.
61
+ 6. If items mirror an external events API, **re-join it on each refresh** so
62
+ times stay current and cancellations drop off. Call it as
63
+ `globalThis.fetch(...)` — inside `backend.js`, bare `fetch` is your own
64
+ exported handler. Treat a 200 whose body isn't the expected shape as a
65
+ FAILURE (some APIs return `200 {"error": …}`), and fall back to stored
66
+ item data rather than erroring when you have it.
67
+
68
+ ## ICS format rules (calendar clients are strict)
69
+
70
+ - **CRLF** (`\r\n`) line endings; final line too.
71
+ - **Fold lines at 75 octets** (bytes, not characters — never split a
72
+ multibyte character); continuation lines start with one space that counts
73
+ toward their own 75.
74
+ - **Escape TEXT values** (SUMMARY/LOCATION/DESCRIPTION/X-WR-CALNAME):
75
+ backslash first, then `;`, `,`, and newlines → `\n`.
76
+ - **URL is URI-valued, not TEXT** — emit it verbatim (escaping commas corrupts
77
+ links), which means you must reject URLs containing whitespace or control
78
+ characters (an embedded CRLF would inject calendar lines).
79
+ - **DTEND must be strictly after DTSTART.** Reject zero-duration items; treat
80
+ same-day end-before-start as an overnight item and add 24h; default a
81
+ missing end to start + 2h.
82
+ - **All times in UTC** (`20260731T200000Z`), converted from the app's local
83
+ timezone with an `Intl.DateTimeFormat` offset probe (handles DST — never
84
+ hardcode an offset).
85
+ - **Stable UIDs** keyed by item identity (`item-<id>@<app>.vibes.diy`) so a
86
+ refresh updates events instead of duplicating them.
87
+ - Include `X-WR-CALNAME:@<handle> — <App Name>` and refresh hints
88
+ (`REFRESH-INTERVAL;VALUE=DURATION:PT6H` + `X-PUBLISHED-TTL:PT6H`).
89
+
90
+ ## The UI
91
+
92
+ The token is auto-minted when the calendar surface opens, so the Subscribe
93
+ button is simply there once the user has subscribable content.
94
+
95
+ ⚠️ Read the token from its OWN live query on `type: "caltoken"` (as below). A
96
+ `caltoken` doc never appears in your items/favorites query — looking for it
97
+ there means the Subscribe link never renders, even though the mint effect and
98
+ the feed itself work.
99
+
100
+ ```jsx
101
+ // access.js needs a `caltoken` branch routing the doc to the owner's PRIVATE
102
+ // channel (like notes) — the token is the secret.
103
+ const { docs: calTokens } = useLiveQuery(byTypeUser, { key: ["caltoken", me.userHandle] });
104
+ const calToken = calTokens[0]?.token || null;
105
+ useEffect(() => {
106
+ // Local minting on first visit to this view with content: the URL is ready
107
+ // instantly (optimistic write), and users who never come here never get a
108
+ // token. Until the backend tick learns the token (≤1m), the endpoint serves
109
+ // a valid placeholder calendar, so even an immediate subscribe can't fail.
110
+ if (!signedIn || myItems.length === 0 || calToken) return;
111
+ const b = new Uint8Array(16);
112
+ crypto.getRandomValues(b);
113
+ let bin = "";
114
+ for (const x of b) bin += String.fromCharCode(x);
115
+ const token = btoa(bin).replace(/[+]/g, "-").replace(/[/]/g, "_").replace(/=+$/, "");
116
+ database.put({ _id: `caltoken-${me.userHandle}`, type: "caltoken", userId: me.userHandle, token, createdAt: Date.now() }).catch(() => {});
117
+ }, [signedIn, myItems.length, calToken]);
118
+ const icsPath = signedIn && calToken
119
+ ? `/_api/faves.ics?t=${encodeURIComponent(calToken)}&n=${encodeURIComponent(me.userHandle)}`
120
+ : null;
121
+ {icsPath && (
122
+ <a href={`webcal://${window.location.host}${icsPath}`} target="_blank" rel="noopener noreferrer"
123
+ title="Subscribe in your phone's calendar — it follows your picks live. iOS may warn about an insecure connection; tap Continue. Share the link and friends can follow your picks.">
124
+ 📆 Subscribe on iPhone
125
+ </a>
126
+ )}
127
+ // Plus a copy button that copies `https://${window.location.host}${icsPath}` —
128
+ // that form pastes into Google Calendar (From URL) and into iOS Settings →
129
+ // Calendar → Add Subscribed Calendar (which skips the warning entirely).
130
+ ```
131
+
132
+ Use `webcal://`, **never `webcals://`** — iOS Safari rejects the secure-scheme
133
+ variant as an invalid address. The one-time "Insecure Connection" prompt is
134
+ expected; Continue works (fetches ride the https redirect). Tell the user in
135
+ the button tooltip.
136
+
137
+ ## Complete backend.js
138
+
139
+ `favorite` docs look like `{ type: "favorite", userId, itemId, event: { date:
140
+ "2026-07-31", time: "18:00:00", endtime: "", title, venue, url } }` — adapt
141
+ the doc shape, db name, and timezone to the app.
142
+
143
+ ```js
144
+ export const config = { scheduled: { interval: "1m" } };
145
+
146
+ const TZ = "America/Los_Angeles"; // the app's local timezone
147
+ const fmt = new Intl.DateTimeFormat("en-US", { timeZone: TZ, hourCycle: "h23",
148
+ year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit" });
149
+ const tzOffsetMin = (d) => {
150
+ const p = Object.fromEntries(fmt.formatToParts(d).map((x) => [x.type, x.value]));
151
+ return (Date.UTC(+p.year, +p.month - 1, +p.day, +p.hour, +p.minute, +p.second) - d.getTime()) / 60000;
152
+ };
153
+ const parseLocal = (s) => {
154
+ if (typeof s !== "string" || !s) return null;
155
+ if (/([+-]\d\d:\d\d|Z)$/.test(s)) { const d = new Date(s); return isNaN(d) ? null : d; }
156
+ const guess = new Date(s.replace(" ", "T") + "Z");
157
+ if (isNaN(guess)) return null;
158
+ return new Date(guess.getTime() - tzOffsetMin(guess) * 60000);
159
+ };
160
+ const utc = (ms) => new Date(ms).toISOString().replace(/[-:]/g, "").slice(0, 15) + "Z";
161
+ const esc = (s) => String(s).replace(/\\/g, "\\\\").replace(/;/g, "\\;").replace(/,/g, "\\,").replace(/\r\n|\r|\n/g, "\\n");
162
+ const octets = (ch) => { const c = ch.codePointAt(0); return c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; };
163
+ const fold = (line) => {
164
+ const parts = []; let cur = "", bytes = 0, budget = 75;
165
+ for (const ch of line) { const n = octets(ch);
166
+ if (bytes + n > budget) { parts.push(cur); cur = ""; bytes = 0; budget = 74; }
167
+ cur += ch; bytes += n; }
168
+ parts.push(cur); return parts.join("\r\n ");
169
+ };
170
+
171
+ // event snapshot → validated item, or null (bad rows drop out per item).
172
+ const toItem = (itemId, ev) => {
173
+ if (!ev || !ev.date || !ev.time || !ev.title) return null;
174
+ const start = parseLocal(`${ev.date}T${ev.time}`);
175
+ if (!start) return null;
176
+ let end = ev.endtime && ev.endtime !== ev.time ? parseLocal(`${ev.date}T${ev.endtime}`) : null;
177
+ let endMs = end ? end.getTime() : start.getTime() + 2 * 3600_000; // default 2h
178
+ if (endMs < start.getTime()) endMs += 24 * 3600_000; // overnight (end before start, same-day form)
179
+ if (endMs <= start.getTime()) return null;
180
+ const url = typeof ev.url === "string" && /^https?:\/\/[^\s\x00-\x1f\x7f]+$/i.test(ev.url) ? ev.url : null;
181
+ return { id: itemId, title: ev.title, start: utc(start.getTime()), end: utc(endMs), venue: ev.venue, url };
182
+ };
183
+
184
+ const buildIcs = (handle, items) => {
185
+ const stamp = utc(Date.now());
186
+ const lines = ["BEGIN:VCALENDAR", "VERSION:2.0", "PRODID:-//vibes.diy//app//EN", "CALSCALE:GREGORIAN",
187
+ "METHOD:PUBLISH", `X-WR-CALNAME:${esc(`@${handle} — My Picks`)}`, `X-WR-TIMEZONE:${TZ}`,
188
+ "REFRESH-INTERVAL;VALUE=DURATION:PT6H", "X-PUBLISHED-TTL:PT6H"];
189
+ for (const it of [...items].sort((a, b) => (a.start < b.start ? -1 : 1))) {
190
+ lines.push("BEGIN:VEVENT", `UID:item-${it.id.replace(/[^A-Za-z0-9._-]/g, "-")}@app.vibes.diy`,
191
+ `DTSTAMP:${stamp}`, `DTSTART:${it.start}`, `DTEND:${it.end}`, `SUMMARY:${esc(it.title)}`);
192
+ if (it.venue) lines.push(`LOCATION:${esc(it.venue)}`);
193
+ if (it.url) lines.push(`URL:${it.url}`); // URI-valued: verbatim, pre-validated
194
+ lines.push("END:VEVENT");
195
+ }
196
+ lines.push("END:VCALENDAR");
197
+ return lines.map(fold).join("\r\n") + "\r\n";
198
+ };
199
+
200
+ let cache = null; // { users: handle → [{itemId, event}], tokens: token → handle }
201
+
202
+ export async function scheduled(event, ctx) {
203
+ const docs = await ctx.db.query({ db: "items" }); // admin-mode read
204
+ const users = new Map();
205
+ const tokens = new Map();
206
+ for (const d of docs) {
207
+ if (d.type === "caltoken" && typeof d.token === "string" && /^[A-Za-z0-9_-]{16,64}$/.test(d.token) && d.userId) {
208
+ tokens.set(d.token, String(d.userId).toLowerCase()); // the opt-in capability
209
+ continue;
210
+ }
211
+ if (d.type !== "favorite" || !d.userId || d.itemId == null) continue; // ONLY shared types
212
+ const k = String(d.userId).toLowerCase();
213
+ if (!users.has(k)) users.set(k, []);
214
+ users.get(k).push({ itemId: String(d.itemId), event: d.event });
215
+ }
216
+ // Opt-in means opt-in: drop aggregates for users without a token.
217
+ const optedIn = new Set(tokens.values());
218
+ for (const h of [...users.keys()]) if (!optedIn.has(h)) users.delete(h);
219
+ cache = { users, tokens };
220
+ }
221
+
222
+ export async function fetch(request, ctx) {
223
+ const url = new URL(request.url);
224
+ if (url.pathname !== "/faves.ics") return new Response("not found", { status: 404 });
225
+ if (request.method !== "GET" && request.method !== "HEAD")
226
+ return new Response("method not allowed", { status: 405, headers: { allow: "GET" } });
227
+ const t = url.searchParams.get("t") ?? "";
228
+ if (!/^[A-Za-z0-9_-]{16,64}$/.test(t)) return new Response("pass t=<calendar token>", { status: 400 });
229
+ // Display label only (token gates the data): iOS captures the calendar name
230
+ // at subscribe time, often before the tick knows a freshly-minted token.
231
+ const nRaw = (url.searchParams.get("n") ?? "").toLowerCase();
232
+ const displayName = /^[a-z0-9][a-z0-9_-]{0,39}$/.test(nRaw) ? nRaw : null;
233
+ const cold = cache === null; // tick hasn't run yet: serve VALID + empty, never 503
234
+ // Unknown token → EMPTY valid calendar too: a just-created token can beat
235
+ // the next tick (a 404 there fails iOS's add-time validation), and a
236
+ // revoked token draining to empty is exactly what revocation should do.
237
+ const handle = cold ? undefined : cache.tokens.get(t);
238
+ const faves = (handle && cache.users.get(handle)) || [];
239
+ const items = faves.map((f) => toItem(f.itemId, f.event)).filter(Boolean);
240
+ return new Response(buildIcs(handle ?? displayName ?? "my", items), {
241
+ status: 200,
242
+ headers: { "content-type": "text/calendar; charset=utf-8",
243
+ "cache-control": cold || !handle ? "no-store" : "public, max-age=300" },
244
+ });
245
+ }
246
+ ```
247
+
248
+ If items should track a live external events API, add the join inside `fetch`:
249
+ fetch the API window with `globalThis.fetch`, key rows by the same item id,
250
+ prefer the live row over the stored snapshot, skip items the API marks
251
+ cancelled, and keep the snapshot path as the fallback when the API is down or
252
+ the row is past the window.
package/llms/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { backendConfig } from "./backend.js";
2
+ export { calendarConfig } from "./calendar.js";
2
3
  export { callaiConfig } from "./callai.js";
3
4
  export { fireproofConfig } from "./fireproof.js";
4
5
  export { imageGenConfig } from "./image-gen.js";
@@ -10,4 +11,4 @@ export { useViewerConfig } from "./use-viewer.js";
10
11
  export { useVibeConfig } from "./use-vibe.js";
11
12
  export { createVibeConfig } from "./create-vibe.js";
12
13
  export type { LlmConfig } from "./types.js";
13
- export declare const allConfigs: readonly [import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig];
14
+ export declare const allConfigs: readonly [import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig];
package/llms/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { backendConfig } from "./backend.js";
2
+ import { calendarConfig } from "./calendar.js";
2
3
  import { callaiConfig } from "./callai.js";
3
4
  import { fireproofConfig } from "./fireproof.js";
4
5
  import { imageGenConfig } from "./image-gen.js";
@@ -10,6 +11,7 @@ import { useViewerConfig } from "./use-viewer.js";
10
11
  import { useVibeConfig } from "./use-vibe.js";
11
12
  import { createVibeConfig } from "./create-vibe.js";
12
13
  export { backendConfig } from "./backend.js";
14
+ export { calendarConfig } from "./calendar.js";
13
15
  export { callaiConfig } from "./callai.js";
14
16
  export { fireproofConfig } from "./fireproof.js";
15
17
  export { imageGenConfig } from "./image-gen.js";
@@ -32,5 +34,6 @@ export const allConfigs = [
32
34
  useVibeConfig,
33
35
  createVibeConfig,
34
36
  backendConfig,
37
+ calendarConfig,
35
38
  ];
36
39
  //# sourceMappingURL=index.js.map
package/llms/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../jsr/llms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAIpD,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,YAAY;IACZ,cAAc;IACd,cAAc;IACd,QAAQ;IACR,aAAa;IACb,eAAe;IACf,WAAW;IACX,eAAe;IACf,aAAa;IACb,gBAAgB;IAChB,aAAa;CACL,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../jsr/llms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAIpD,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,YAAY;IACZ,cAAc;IACd,cAAc;IACd,QAAQ;IACR,aAAa;IACb,eAAe;IACf,WAAW;IACX,eAAe;IACf,aAAa;IACb,gBAAgB;IAChB,aAAa;IACb,cAAc;CACN,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibes.diy/prompts",
3
- "version": "4.2.2",
3
+ "version": "4.3.0",
4
4
  "type": "module",
5
5
  "main": "./index.js",
6
6
  "description": "",
@@ -24,9 +24,9 @@
24
24
  "license": "Apache-2.0",
25
25
  "dependencies": {
26
26
  "@adviser/cement": "~0.5.34",
27
- "@vibes.diy/call-ai-v2": "^4.2.2",
28
- "@vibes.diy/identity": "^4.2.2",
29
- "@vibes.diy/use-vibes-types": "^4.2.2",
27
+ "@vibes.diy/call-ai-v2": "^4.3.0",
28
+ "@vibes.diy/identity": "^4.3.0",
29
+ "@vibes.diy/use-vibes-types": "^4.3.0",
30
30
  "arktype": "~2.2.2",
31
31
  "json-schema-faker": "~0.6.2"
32
32
  },