@vibes.diy/prompts 4.1.2 → 4.2.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/llms/calendar.d.ts +2 -0
- package/llms/calendar.js +6 -0
- package/llms/calendar.js.map +1 -0
- package/llms/calendar.md +247 -0
- package/llms/index.d.ts +2 -1
- package/llms/index.js +3 -0
- package/llms/index.js.map +1 -1
- package/package.json +4 -4
package/llms/calendar.js
ADDED
|
@@ -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"}
|
package/llms/calendar.md
ADDED
|
@@ -0,0 +1,247 @@
|
|
|
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
|
+
```jsx
|
|
96
|
+
// access.js needs a `caltoken` branch routing the doc to the owner's PRIVATE
|
|
97
|
+
// channel (like notes) — the token is the secret.
|
|
98
|
+
const { docs: calTokens } = useLiveQuery(byTypeUser, { key: ["caltoken", me.userHandle] });
|
|
99
|
+
const calToken = calTokens[0]?.token || null;
|
|
100
|
+
useEffect(() => {
|
|
101
|
+
// Local minting on first visit to this view with content: the URL is ready
|
|
102
|
+
// instantly (optimistic write), and users who never come here never get a
|
|
103
|
+
// token. Until the backend tick learns the token (≤1m), the endpoint serves
|
|
104
|
+
// a valid placeholder calendar, so even an immediate subscribe can't fail.
|
|
105
|
+
if (!signedIn || myItems.length === 0 || calToken) return;
|
|
106
|
+
const b = new Uint8Array(16);
|
|
107
|
+
crypto.getRandomValues(b);
|
|
108
|
+
let bin = "";
|
|
109
|
+
for (const x of b) bin += String.fromCharCode(x);
|
|
110
|
+
const token = btoa(bin).replace(/[+]/g, "-").replace(/[/]/g, "_").replace(/=+$/, "");
|
|
111
|
+
database.put({ _id: `caltoken-${me.userHandle}`, type: "caltoken", userId: me.userHandle, token, createdAt: Date.now() }).catch(() => {});
|
|
112
|
+
}, [signedIn, myItems.length, calToken]);
|
|
113
|
+
const icsPath = signedIn && calToken
|
|
114
|
+
? `/_api/faves.ics?t=${encodeURIComponent(calToken)}&n=${encodeURIComponent(me.userHandle)}`
|
|
115
|
+
: null;
|
|
116
|
+
{icsPath && (
|
|
117
|
+
<a href={`webcal://${window.location.host}${icsPath}`} target="_blank" rel="noopener noreferrer"
|
|
118
|
+
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.">
|
|
119
|
+
📆 Subscribe on iPhone
|
|
120
|
+
</a>
|
|
121
|
+
)}
|
|
122
|
+
// Plus a copy button that copies `https://${window.location.host}${icsPath}` —
|
|
123
|
+
// that form pastes into Google Calendar (From URL) and into iOS Settings →
|
|
124
|
+
// Calendar → Add Subscribed Calendar (which skips the warning entirely).
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Use `webcal://`, **never `webcals://`** — iOS Safari rejects the secure-scheme
|
|
128
|
+
variant as an invalid address. The one-time "Insecure Connection" prompt is
|
|
129
|
+
expected; Continue works (fetches ride the https redirect). Tell the user in
|
|
130
|
+
the button tooltip.
|
|
131
|
+
|
|
132
|
+
## Complete backend.js
|
|
133
|
+
|
|
134
|
+
`favorite` docs look like `{ type: "favorite", userId, itemId, event: { date:
|
|
135
|
+
"2026-07-31", time: "18:00:00", endtime: "", title, venue, url } }` — adapt
|
|
136
|
+
the doc shape, db name, and timezone to the app.
|
|
137
|
+
|
|
138
|
+
```js
|
|
139
|
+
export const config = { scheduled: { interval: "1m" } };
|
|
140
|
+
|
|
141
|
+
const TZ = "America/Los_Angeles"; // the app's local timezone
|
|
142
|
+
const fmt = new Intl.DateTimeFormat("en-US", { timeZone: TZ, hourCycle: "h23",
|
|
143
|
+
year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit" });
|
|
144
|
+
const tzOffsetMin = (d) => {
|
|
145
|
+
const p = Object.fromEntries(fmt.formatToParts(d).map((x) => [x.type, x.value]));
|
|
146
|
+
return (Date.UTC(+p.year, +p.month - 1, +p.day, +p.hour, +p.minute, +p.second) - d.getTime()) / 60000;
|
|
147
|
+
};
|
|
148
|
+
const parseLocal = (s) => {
|
|
149
|
+
if (typeof s !== "string" || !s) return null;
|
|
150
|
+
if (/([+-]\d\d:\d\d|Z)$/.test(s)) { const d = new Date(s); return isNaN(d) ? null : d; }
|
|
151
|
+
const guess = new Date(s.replace(" ", "T") + "Z");
|
|
152
|
+
if (isNaN(guess)) return null;
|
|
153
|
+
return new Date(guess.getTime() - tzOffsetMin(guess) * 60000);
|
|
154
|
+
};
|
|
155
|
+
const utc = (ms) => new Date(ms).toISOString().replace(/[-:]/g, "").slice(0, 15) + "Z";
|
|
156
|
+
const esc = (s) => String(s).replace(/\\/g, "\\\\").replace(/;/g, "\\;").replace(/,/g, "\\,").replace(/\r\n|\r|\n/g, "\\n");
|
|
157
|
+
const octets = (ch) => { const c = ch.codePointAt(0); return c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; };
|
|
158
|
+
const fold = (line) => {
|
|
159
|
+
const parts = []; let cur = "", bytes = 0, budget = 75;
|
|
160
|
+
for (const ch of line) { const n = octets(ch);
|
|
161
|
+
if (bytes + n > budget) { parts.push(cur); cur = ""; bytes = 0; budget = 74; }
|
|
162
|
+
cur += ch; bytes += n; }
|
|
163
|
+
parts.push(cur); return parts.join("\r\n ");
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
// event snapshot → validated item, or null (bad rows drop out per item).
|
|
167
|
+
const toItem = (itemId, ev) => {
|
|
168
|
+
if (!ev || !ev.date || !ev.time || !ev.title) return null;
|
|
169
|
+
const start = parseLocal(`${ev.date}T${ev.time}`);
|
|
170
|
+
if (!start) return null;
|
|
171
|
+
let end = ev.endtime && ev.endtime !== ev.time ? parseLocal(`${ev.date}T${ev.endtime}`) : null;
|
|
172
|
+
let endMs = end ? end.getTime() : start.getTime() + 2 * 3600_000; // default 2h
|
|
173
|
+
if (endMs < start.getTime()) endMs += 24 * 3600_000; // overnight (end before start, same-day form)
|
|
174
|
+
if (endMs <= start.getTime()) return null;
|
|
175
|
+
const url = typeof ev.url === "string" && /^https?:\/\/[^\s\x00-\x1f\x7f]+$/i.test(ev.url) ? ev.url : null;
|
|
176
|
+
return { id: itemId, title: ev.title, start: utc(start.getTime()), end: utc(endMs), venue: ev.venue, url };
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
const buildIcs = (handle, items) => {
|
|
180
|
+
const stamp = utc(Date.now());
|
|
181
|
+
const lines = ["BEGIN:VCALENDAR", "VERSION:2.0", "PRODID:-//vibes.diy//app//EN", "CALSCALE:GREGORIAN",
|
|
182
|
+
"METHOD:PUBLISH", `X-WR-CALNAME:${esc(`@${handle} — My Picks`)}`, `X-WR-TIMEZONE:${TZ}`,
|
|
183
|
+
"REFRESH-INTERVAL;VALUE=DURATION:PT6H", "X-PUBLISHED-TTL:PT6H"];
|
|
184
|
+
for (const it of [...items].sort((a, b) => (a.start < b.start ? -1 : 1))) {
|
|
185
|
+
lines.push("BEGIN:VEVENT", `UID:item-${it.id.replace(/[^A-Za-z0-9._-]/g, "-")}@app.vibes.diy`,
|
|
186
|
+
`DTSTAMP:${stamp}`, `DTSTART:${it.start}`, `DTEND:${it.end}`, `SUMMARY:${esc(it.title)}`);
|
|
187
|
+
if (it.venue) lines.push(`LOCATION:${esc(it.venue)}`);
|
|
188
|
+
if (it.url) lines.push(`URL:${it.url}`); // URI-valued: verbatim, pre-validated
|
|
189
|
+
lines.push("END:VEVENT");
|
|
190
|
+
}
|
|
191
|
+
lines.push("END:VCALENDAR");
|
|
192
|
+
return lines.map(fold).join("\r\n") + "\r\n";
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
let cache = null; // { users: handle → [{itemId, event}], tokens: token → handle }
|
|
196
|
+
|
|
197
|
+
export async function scheduled(event, ctx) {
|
|
198
|
+
const docs = await ctx.db.query({ db: "items" }); // admin-mode read
|
|
199
|
+
const users = new Map();
|
|
200
|
+
const tokens = new Map();
|
|
201
|
+
for (const d of docs) {
|
|
202
|
+
if (d.type === "caltoken" && typeof d.token === "string" && /^[A-Za-z0-9_-]{16,64}$/.test(d.token) && d.userId) {
|
|
203
|
+
tokens.set(d.token, String(d.userId).toLowerCase()); // the opt-in capability
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
if (d.type !== "favorite" || !d.userId || d.itemId == null) continue; // ONLY shared types
|
|
207
|
+
const k = String(d.userId).toLowerCase();
|
|
208
|
+
if (!users.has(k)) users.set(k, []);
|
|
209
|
+
users.get(k).push({ itemId: String(d.itemId), event: d.event });
|
|
210
|
+
}
|
|
211
|
+
// Opt-in means opt-in: drop aggregates for users without a token.
|
|
212
|
+
const optedIn = new Set(tokens.values());
|
|
213
|
+
for (const h of [...users.keys()]) if (!optedIn.has(h)) users.delete(h);
|
|
214
|
+
cache = { users, tokens };
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export async function fetch(request, ctx) {
|
|
218
|
+
const url = new URL(request.url);
|
|
219
|
+
if (url.pathname !== "/faves.ics") return new Response("not found", { status: 404 });
|
|
220
|
+
if (request.method !== "GET" && request.method !== "HEAD")
|
|
221
|
+
return new Response("method not allowed", { status: 405, headers: { allow: "GET" } });
|
|
222
|
+
const t = url.searchParams.get("t") ?? "";
|
|
223
|
+
if (!/^[A-Za-z0-9_-]{16,64}$/.test(t)) return new Response("pass t=<calendar token>", { status: 400 });
|
|
224
|
+
// Display label only (token gates the data): iOS captures the calendar name
|
|
225
|
+
// at subscribe time, often before the tick knows a freshly-minted token.
|
|
226
|
+
const nRaw = (url.searchParams.get("n") ?? "").toLowerCase();
|
|
227
|
+
const displayName = /^[a-z0-9][a-z0-9_-]{0,39}$/.test(nRaw) ? nRaw : null;
|
|
228
|
+
const cold = cache === null; // tick hasn't run yet: serve VALID + empty, never 503
|
|
229
|
+
// Unknown token → EMPTY valid calendar too: a just-created token can beat
|
|
230
|
+
// the next tick (a 404 there fails iOS's add-time validation), and a
|
|
231
|
+
// revoked token draining to empty is exactly what revocation should do.
|
|
232
|
+
const handle = cold ? undefined : cache.tokens.get(t);
|
|
233
|
+
const faves = (handle && cache.users.get(handle)) || [];
|
|
234
|
+
const items = faves.map((f) => toItem(f.itemId, f.event)).filter(Boolean);
|
|
235
|
+
return new Response(buildIcs(handle ?? displayName ?? "my", items), {
|
|
236
|
+
status: 200,
|
|
237
|
+
headers: { "content-type": "text/calendar; charset=utf-8",
|
|
238
|
+
"cache-control": cold || !handle ? "no-store" : "public, max-age=300" },
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
If items should track a live external events API, add the join inside `fetch`:
|
|
244
|
+
fetch the API window with `globalThis.fetch`, key rows by the same item id,
|
|
245
|
+
prefer the live row over the stored snapshot, skip items the API marks
|
|
246
|
+
cancelled, and keep the snapshot path as the fallback when the API is down or
|
|
247
|
+
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;
|
|
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.
|
|
3
|
+
"version": "4.2.3",
|
|
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.
|
|
28
|
-
"@vibes.diy/identity": "^4.
|
|
29
|
-
"@vibes.diy/use-vibes-types": "^4.
|
|
27
|
+
"@vibes.diy/call-ai-v2": "^4.2.3",
|
|
28
|
+
"@vibes.diy/identity": "^4.2.3",
|
|
29
|
+
"@vibes.diy/use-vibes-types": "^4.2.3",
|
|
30
30
|
"arktype": "~2.2.2",
|
|
31
31
|
"json-schema-faker": "~0.6.2"
|
|
32
32
|
},
|