@vibes.diy/prompts 2.0.0-dev-cli-p → 2.0.0-dev-cli-q
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.
|
@@ -5,7 +5,7 @@ The `callAI` function returns structured JSON from an AI model. It always requir
|
|
|
5
5
|
## Basic Usage
|
|
6
6
|
|
|
7
7
|
```javascript
|
|
8
|
-
import { callAI } from
|
|
8
|
+
import { callAI } from "call-ai";
|
|
9
9
|
|
|
10
10
|
const response = await callAI("Give me a todo list for learning React", {
|
|
11
11
|
schema: {
|
|
@@ -13,10 +13,10 @@ const response = await callAI("Give me a todo list for learning React", {
|
|
|
13
13
|
todos: {
|
|
14
14
|
type: "array",
|
|
15
15
|
description: "List of actionable todo items",
|
|
16
|
-
items: { type: "string" }
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
}
|
|
16
|
+
items: { type: "string" },
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
20
|
});
|
|
21
21
|
const todoData = JSON.parse(response);
|
|
22
22
|
console.log(todoData.todos);
|
|
@@ -25,24 +25,27 @@ console.log(todoData.todos);
|
|
|
25
25
|
## Items with properties
|
|
26
26
|
|
|
27
27
|
```javascript
|
|
28
|
-
const response = await callAI(
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
const response = await callAI(
|
|
29
|
+
"Generate 4 items with label, status, priority (low, medium, high, critical), and notes. Return as structured JSON with these fields.",
|
|
30
|
+
{
|
|
31
|
+
schema: {
|
|
32
|
+
properties: {
|
|
33
33
|
items: {
|
|
34
|
-
type: "
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
34
|
+
type: "array",
|
|
35
|
+
items: {
|
|
36
|
+
type: "object",
|
|
37
|
+
properties: {
|
|
38
|
+
label: { type: "string", description: "Short name for the item" },
|
|
39
|
+
status: { type: "string", description: "Current status (active, done, blocked)" },
|
|
40
|
+
priority: { type: "string", description: "Priority level (low, medium, high, critical)" },
|
|
41
|
+
notes: { type: "string", description: "Additional context or details" },
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
},
|
|
44
47
|
}
|
|
45
|
-
|
|
48
|
+
);
|
|
46
49
|
const demoData = JSON.parse(response);
|
|
47
50
|
console.log(demoData.items); // Array of item objects
|
|
48
51
|
```
|
|
@@ -56,15 +59,15 @@ console.log(demoData.items); // Array of item objects
|
|
|
56
59
|
## Error Handling
|
|
57
60
|
|
|
58
61
|
```javascript
|
|
59
|
-
import { callAI } from
|
|
62
|
+
import { callAI } from "call-ai";
|
|
60
63
|
|
|
61
64
|
try {
|
|
62
65
|
const response = await callAI("Generate some content", {
|
|
63
66
|
schema: {
|
|
64
67
|
properties: {
|
|
65
|
-
result: { type: "string" }
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
+
result: { type: "string" },
|
|
69
|
+
},
|
|
70
|
+
},
|
|
68
71
|
});
|
|
69
72
|
console.log(JSON.parse(response));
|
|
70
73
|
} catch (error) {
|
|
@@ -55,25 +55,19 @@ const App = () => {
|
|
|
55
55
|
return (
|
|
56
56
|
<div>
|
|
57
57
|
<form onSubmit={submit}>
|
|
58
|
-
<input
|
|
59
|
-
value={doc.text}
|
|
60
|
-
onChange={(e) => merge({ text: e.target.value })}
|
|
61
|
-
placeholder="New document"
|
|
62
|
-
/>
|
|
58
|
+
<input value={doc.text} onChange={(e) => merge({ text: e.target.value })} placeholder="New document" />
|
|
63
59
|
<button type="submit">Submit</button>
|
|
64
60
|
</form>
|
|
65
61
|
|
|
66
62
|
<h3>Recent Documents</h3>
|
|
67
63
|
<ul>
|
|
68
64
|
{docs.map((doc) => (
|
|
69
|
-
<li key={doc._id}>
|
|
70
|
-
|
|
71
|
-
</li>
|
|
72
|
-
))}
|
|
65
|
+
<li key={doc._id}>{doc.text}</li>
|
|
66
|
+
))}
|
|
73
67
|
</ul>
|
|
74
68
|
</div>
|
|
75
69
|
);
|
|
76
|
-
}
|
|
70
|
+
};
|
|
77
71
|
```
|
|
78
72
|
|
|
79
73
|
### Editing Documents
|
|
@@ -87,12 +81,14 @@ const { doc, merge, submit, save, reset } = useDocument({ _id: "user-profile:abc
|
|
|
87
81
|
```
|
|
88
82
|
|
|
89
83
|
The `useDocument` hook provides several methods:
|
|
84
|
+
|
|
90
85
|
- `merge(updates)`: Update the document with new fields, without saving. Use this instead of keeping a `useState` for document data.
|
|
91
86
|
- `submit(e)`: Handles form submission by preventing default, saving, and resetting
|
|
92
87
|
- `save()`: Save the current document state
|
|
93
88
|
- `reset()`: Reset to initial state
|
|
94
89
|
|
|
95
90
|
For form-based creation flows, use `submit`:
|
|
91
|
+
|
|
96
92
|
```js
|
|
97
93
|
<form onSubmit={submit}>
|
|
98
94
|
```
|
|
@@ -124,16 +120,18 @@ Here are other common patterns:
|
|
|
124
120
|
#### Query by Key Range
|
|
125
121
|
|
|
126
122
|
Passing a string to `useLiveQuery` will index by that field. You can use the key argument to filter by a specific value:
|
|
123
|
+
|
|
127
124
|
```js
|
|
128
|
-
const { docs } = useLiveQuery("agentName", {
|
|
129
|
-
key: "agent-1"
|
|
125
|
+
const { docs } = useLiveQuery("agentName", {
|
|
126
|
+
key: "agent-1", // all docs where doc.agentName === "agent-1", sorted by _id
|
|
130
127
|
});
|
|
131
128
|
```
|
|
132
129
|
|
|
133
130
|
You can also query a range within a key:
|
|
131
|
+
|
|
134
132
|
```js
|
|
135
|
-
const { docs } = useLiveQuery("agentRating", {
|
|
136
|
-
range: [3, 5]
|
|
133
|
+
const { docs } = useLiveQuery("agentRating", {
|
|
134
|
+
range: [3, 5],
|
|
137
135
|
});
|
|
138
136
|
```
|
|
139
137
|
|
|
@@ -141,23 +139,21 @@ const { docs } = useLiveQuery("agentRating", {
|
|
|
141
139
|
|
|
142
140
|
Documents can be updated by multiple clients, and synced later. To create an event counter, don't increment a number on a single doc, instead write a small document per counted event, and query them with an index. Example:
|
|
143
141
|
|
|
144
|
-
|
|
145
142
|
```js
|
|
146
143
|
const App = () => {
|
|
147
144
|
const { useLiveQuery, database } = useFireproof("my-ledger");
|
|
148
145
|
|
|
149
|
-
const { docs } = useLiveQuery(
|
|
150
|
-
const counterValue = docs.length
|
|
146
|
+
const { docs } = useLiveQuery("counter", { key: "my-event-name" });
|
|
147
|
+
const counterValue = docs.length;
|
|
151
148
|
|
|
152
149
|
function countEvent() {
|
|
153
150
|
database.put({
|
|
154
|
-
counter
|
|
155
|
-
})
|
|
151
|
+
counter: "my-event-name",
|
|
152
|
+
});
|
|
156
153
|
}
|
|
157
154
|
|
|
158
155
|
// Call countEvent() to count each event, and render counterValue in the UI.
|
|
159
|
-
|
|
160
|
-
}
|
|
156
|
+
};
|
|
161
157
|
```
|
|
162
158
|
|
|
163
159
|
This pattern ensures the count is accurate even during sync.
|
|
@@ -169,13 +165,14 @@ Use a custom index function to normalize and transform document data, for instan
|
|
|
169
165
|
```js
|
|
170
166
|
const { docs } = useLiveQuery(
|
|
171
167
|
(doc) => {
|
|
172
|
-
if (doc.type ==
|
|
168
|
+
if (doc.type == "listing_v1") {
|
|
173
169
|
return doc.sellerId;
|
|
174
|
-
} else if (doc.type ==
|
|
170
|
+
} else if (doc.type == "listing") {
|
|
175
171
|
return doc.userId;
|
|
176
172
|
}
|
|
177
|
-
},
|
|
178
|
-
{ key
|
|
173
|
+
},
|
|
174
|
+
{ key: routeParams.sellerId }
|
|
175
|
+
);
|
|
179
176
|
```
|
|
180
177
|
|
|
181
178
|
#### Array Indexes and Prefix Queries
|
|
@@ -200,26 +197,23 @@ Sortable lists are a common pattern. Here's how to implement them using Fireproo
|
|
|
200
197
|
```js
|
|
201
198
|
function App() {
|
|
202
199
|
const { database, useLiveQuery } = useFireproof("my-ledger");
|
|
203
|
-
|
|
200
|
+
|
|
204
201
|
// Initialize list with evenly spaced positions
|
|
205
202
|
async function initializeList() {
|
|
206
203
|
await database.put({ list: "xyz", position: 1000 });
|
|
207
204
|
await database.put({ list: "xyz", position: 2000 });
|
|
208
205
|
await database.put({ list: "xyz", position: 3000 });
|
|
209
206
|
}
|
|
210
|
-
|
|
207
|
+
|
|
211
208
|
// Query items on list xyz, sorted by position. Note that useLiveQuery('list', { key:'xyz' }) would be the same docs, sorted chronologically by _id
|
|
212
|
-
const queryResult = useLiveQuery(
|
|
213
|
-
(doc) => [doc.list, doc.position],
|
|
214
|
-
{ prefix: ["xyz"] }
|
|
215
|
-
);
|
|
209
|
+
const queryResult = useLiveQuery((doc) => [doc.list, doc.position], { prefix: ["xyz"] });
|
|
216
210
|
|
|
217
211
|
// Insert between existing items using midpoint calculation
|
|
218
212
|
async function insertBetween(beforeDoc, afterDoc) {
|
|
219
213
|
const newPosition = (beforeDoc.position + afterDoc.position) / 2;
|
|
220
|
-
await database.put({
|
|
221
|
-
list: "xyz",
|
|
222
|
-
position: newPosition
|
|
214
|
+
await database.put({
|
|
215
|
+
list: "xyz",
|
|
216
|
+
position: newPosition,
|
|
223
217
|
});
|
|
224
218
|
}
|
|
225
219
|
|
|
@@ -227,7 +221,7 @@ function App() {
|
|
|
227
221
|
<div>
|
|
228
222
|
<h3>List xyz (Sorted)</h3>
|
|
229
223
|
<ul>
|
|
230
|
-
{queryResult.docs.map(doc => (
|
|
224
|
+
{queryResult.docs.map((doc) => (
|
|
231
225
|
<li key={doc._id}>
|
|
232
226
|
{doc._id}: position {doc.position}
|
|
233
227
|
</li>
|
|
@@ -282,10 +276,10 @@ database.subscribe((changes) => {
|
|
|
282
276
|
|
|
283
277
|
### Working with Files
|
|
284
278
|
|
|
285
|
-
Attach files to a document by adding them to the _files property. For example:
|
|
279
|
+
Attach files to a document by adding them to the \_files property. For example:
|
|
286
280
|
|
|
287
281
|
```html
|
|
288
|
-
<input accept="image/*" title="save to Fireproof" type="file" id="files" multiple
|
|
282
|
+
<input accept="image/*" title="save to Fireproof" type="file" id="files" multiple />
|
|
289
283
|
```
|
|
290
284
|
|
|
291
285
|
```js
|
|
@@ -293,11 +287,11 @@ function handleFiles() {
|
|
|
293
287
|
const fileList = this.files;
|
|
294
288
|
const doc = {
|
|
295
289
|
type: "files",
|
|
296
|
-
_files: {}
|
|
290
|
+
_files: {},
|
|
297
291
|
};
|
|
298
292
|
for (const file of fileList) {
|
|
299
293
|
// Assign each File object to the document
|
|
300
|
-
doc._files[file.name] = file;
|
|
294
|
+
doc._files[file.name] = file;
|
|
301
295
|
}
|
|
302
296
|
database.put(doc);
|
|
303
297
|
}
|
|
@@ -345,6 +339,7 @@ function handleSubmit(e) {
|
|
|
345
339
|
## Example React Application
|
|
346
340
|
|
|
347
341
|
Code listing for todo tracker App.jsx. Note the code ordering: hooks, then handlers, then classNames right before JSX.
|
|
342
|
+
|
|
348
343
|
```js
|
|
349
344
|
import React from "react";
|
|
350
345
|
import { useFireproof } from "use-fireproof";
|
|
@@ -356,17 +351,17 @@ export default function App() {
|
|
|
356
351
|
const {
|
|
357
352
|
doc: newTodo,
|
|
358
353
|
merge: mergeNewTodo,
|
|
359
|
-
submit: submitNewTodo
|
|
354
|
+
submit: submitNewTodo,
|
|
360
355
|
} = useDocument({
|
|
361
356
|
todo: "",
|
|
362
357
|
type: "todo",
|
|
363
358
|
completed: false,
|
|
364
|
-
createdAt: Date.now()
|
|
359
|
+
createdAt: Date.now(),
|
|
365
360
|
});
|
|
366
361
|
|
|
367
362
|
const { docs: todos } = useLiveQuery("type", {
|
|
368
363
|
key: "todo",
|
|
369
|
-
descending: true
|
|
364
|
+
descending: true,
|
|
370
365
|
});
|
|
371
366
|
|
|
372
367
|
// 2. Event handlers
|
|
@@ -381,8 +376,11 @@ export default function App() {
|
|
|
381
376
|
|
|
382
377
|
// 3. ClassNames — right before JSX so colors stay consistent
|
|
383
378
|
const c = {
|
|
384
|
-
bg: "bg-white",
|
|
385
|
-
|
|
379
|
+
bg: "bg-white",
|
|
380
|
+
card: "bg-gray-50",
|
|
381
|
+
border: "border-gray-200",
|
|
382
|
+
accent: "bg-[#e63946]",
|
|
383
|
+
text: "text-gray-500",
|
|
386
384
|
};
|
|
387
385
|
|
|
388
386
|
// 4. JSX return
|
|
@@ -390,7 +388,9 @@ export default function App() {
|
|
|
390
388
|
<div className={`max-w-md mx-auto p-4 ${c.bg} shadow rounded`}>
|
|
391
389
|
<h2 className="text-2xl font-bold mb-4">Todo List</h2>
|
|
392
390
|
<form onSubmit={handleSubmit} className="mb-4">
|
|
393
|
-
<label htmlFor="todo" className="block mb-2 font-semibold">
|
|
391
|
+
<label htmlFor="todo" className="block mb-2 font-semibold">
|
|
392
|
+
Todo
|
|
393
|
+
</label>
|
|
394
394
|
<input
|
|
395
395
|
className={`w-full ${c.border} border rounded px-2 py-1`}
|
|
396
396
|
id="todo"
|
|
@@ -412,16 +412,11 @@ export default function App() {
|
|
|
412
412
|
/>
|
|
413
413
|
<span className="font-medium">{doc.todo}</span>
|
|
414
414
|
</div>
|
|
415
|
-
<button
|
|
416
|
-
className={`text-sm ${c.accent} text-white px-2 py-1 rounded`}
|
|
417
|
-
onClick={() => database.del(doc._id)}
|
|
418
|
-
>
|
|
415
|
+
<button className={`text-sm ${c.accent} text-white px-2 py-1 rounded`} onClick={() => database.del(doc._id)}>
|
|
419
416
|
Delete
|
|
420
417
|
</button>
|
|
421
418
|
</div>
|
|
422
|
-
<div className={`text-xs ${c.text} mt-1`}>
|
|
423
|
-
{new Date(doc.createdAt).toISOString()}
|
|
424
|
-
</div>
|
|
419
|
+
<div className={`text-xs ${c.text} mt-1`}>{new Date(doc.createdAt).toISOString()}</div>
|
|
425
420
|
</li>
|
|
426
421
|
))}
|
|
427
422
|
</ul>
|
|
@@ -432,9 +427,10 @@ export default function App() {
|
|
|
432
427
|
|
|
433
428
|
### Example Image Uploader
|
|
434
429
|
|
|
435
|
-
This React example shows a simple image uploader application that uses Fireproof to store and sort images by creation date. These APIs easily work with plain JavaScript also.
|
|
430
|
+
This React example shows a simple image uploader application that uses Fireproof to store and sort images by creation date. These APIs easily work with plain JavaScript also.
|
|
436
431
|
|
|
437
432
|
Code listing for App.jsx:
|
|
433
|
+
|
|
438
434
|
```js
|
|
439
435
|
import { useFireproof, ImgFile } from "use-fireproof";
|
|
440
436
|
import { useState } from "react";
|
|
@@ -461,8 +457,10 @@ export default function App() {
|
|
|
461
457
|
|
|
462
458
|
// 3. ClassNames
|
|
463
459
|
const c = {
|
|
464
|
-
bg: "bg-white",
|
|
465
|
-
|
|
460
|
+
bg: "bg-white",
|
|
461
|
+
card: "bg-gray-50",
|
|
462
|
+
accent: "bg-blue-500 hover:bg-blue-600",
|
|
463
|
+
text: "text-gray-700",
|
|
466
464
|
};
|
|
467
465
|
|
|
468
466
|
// 4. JSX return
|
|
@@ -474,13 +472,18 @@ export default function App() {
|
|
|
474
472
|
type="text"
|
|
475
473
|
placeholder="Enter description"
|
|
476
474
|
value={doc.description}
|
|
477
|
-
onChange={e => {
|
|
475
|
+
onChange={(e) => {
|
|
476
|
+
setError(false);
|
|
477
|
+
merge({ description: e.target.value });
|
|
478
|
+
}}
|
|
478
479
|
className={`w-full p-2 border rounded mb-4 ${error ? "border-red-500" : "border-gray-300"}`}
|
|
479
480
|
/>
|
|
480
|
-
<button onClick={handleUpload} className={`px-4 py-2 ${c.accent} text-white rounded`}>
|
|
481
|
+
<button onClick={handleUpload} className={`px-4 py-2 ${c.accent} text-white rounded`}>
|
|
482
|
+
Upload
|
|
483
|
+
</button>
|
|
481
484
|
<h3 className="text-lg font-semibold mt-6">Recent Uploads</h3>
|
|
482
485
|
<div className="grid grid-cols-2 gap-4 mt-2">
|
|
483
|
-
{docs.map(doc => (
|
|
486
|
+
{docs.map((doc) => (
|
|
484
487
|
<div key={doc._id} className={`border p-2 rounded shadow-sm ${c.card}`}>
|
|
485
488
|
{doc._files?.uploaded && <ImgFile file={doc._files.uploaded} alt="Uploaded Image" className="w-full h-auto rounded" />}
|
|
486
489
|
<p className={`text-sm ${c.text} mt-2`}>{doc.description || "No description"}</p>
|
|
@@ -7,7 +7,7 @@ The ImgGen component can be used in three ways:
|
|
|
7
7
|
1. **With no props** - Shows a form UI for users to enter a prompt and/or upload images:
|
|
8
8
|
|
|
9
9
|
```jsx
|
|
10
|
-
import { ImgGen } from
|
|
10
|
+
import { ImgGen } from "use-vibes";
|
|
11
11
|
|
|
12
12
|
function MyComponent() {
|
|
13
13
|
return <ImgGen />; // Shows built-in form for prompt entry and image upload
|
|
@@ -17,7 +17,7 @@ function MyComponent() {
|
|
|
17
17
|
2. **With a prompt prop** - Immediately generates an image (no form shown):
|
|
18
18
|
|
|
19
19
|
```jsx
|
|
20
|
-
import { ImgGen } from
|
|
20
|
+
import { ImgGen } from "use-vibes";
|
|
21
21
|
|
|
22
22
|
function MyComponent() {
|
|
23
23
|
return <ImgGen prompt="A sunset over mountains" />; // Direct generation, no form
|
|
@@ -27,32 +27,31 @@ function MyComponent() {
|
|
|
27
27
|
3. **With images prop** - Edits or combines images with AI (no form shown):
|
|
28
28
|
|
|
29
29
|
```jsx
|
|
30
|
-
import { ImgGen } from
|
|
30
|
+
import { ImgGen } from "use-vibes";
|
|
31
31
|
|
|
32
32
|
function MyComponent() {
|
|
33
33
|
const [files, setFiles] = useState([]);
|
|
34
34
|
return (
|
|
35
|
-
<ImgGen
|
|
36
|
-
prompt="Create a gift basket with these items"
|
|
35
|
+
<ImgGen
|
|
36
|
+
prompt="Create a gift basket with these items"
|
|
37
37
|
images={files} // Array of File objects
|
|
38
38
|
/>
|
|
39
39
|
);
|
|
40
40
|
}
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
-
4. **With an _id prop** - Loads a specific image from the database (no form shown):
|
|
43
|
+
4. **With an \_id prop** - Loads a specific image from the database (no form shown):
|
|
44
44
|
|
|
45
|
-
If there is no image generated for the document yet, but it has a `prompt` field, it will generate a new image with the prompt. If there an images is stored, at doc
|
|
45
|
+
If there is no image generated for the document yet, but it has a `prompt` field, it will generate a new image with the prompt. If there an images is stored, at doc.\_files.original, it will use that as the base image.
|
|
46
46
|
|
|
47
47
|
```jsx
|
|
48
|
-
import { ImgGen } from
|
|
48
|
+
import { ImgGen } from "use-vibes";
|
|
49
49
|
|
|
50
50
|
function MyComponent() {
|
|
51
51
|
return <ImgGen _id="my-image-id" />; // Loads specific image by ID
|
|
52
52
|
}
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
-
|
|
56
55
|
## List by ID
|
|
57
56
|
|
|
58
57
|
Images and prompts are tracked in a Fireproof database with a `type` of `image`. If a database is not provided, it uses `"ImgGen"` as the database name.
|
|
@@ -60,13 +59,13 @@ Images and prompts are tracked in a Fireproof database with a `type` of `image`.
|
|
|
60
59
|
Display stored images by their ID. Ensure you do this, so users can find the images they created.
|
|
61
60
|
|
|
62
61
|
```jsx
|
|
63
|
-
import { useFireproof } from
|
|
64
|
-
import { ImgGen } from
|
|
62
|
+
import { useFireproof } from "use-fireproof";
|
|
63
|
+
import { ImgGen } from "use-vibes";
|
|
65
64
|
|
|
66
65
|
function MyComponent() {
|
|
67
66
|
const { database, useLiveQuery } = useFireproof("my-db-name");
|
|
68
|
-
|
|
69
|
-
key:
|
|
67
|
+
const { docs: imageDocuments } = useLiveQuery("type", {
|
|
68
|
+
key: "image",
|
|
70
69
|
descending: true,
|
|
71
70
|
});
|
|
72
71
|
|
|
@@ -103,8 +102,8 @@ ImgGen supports custom styling through CSS variables or custom class names:
|
|
|
103
102
|
}
|
|
104
103
|
|
|
105
104
|
// With custom class names
|
|
106
|
-
<ImgGen
|
|
107
|
-
prompt="A landscape"
|
|
105
|
+
<ImgGen
|
|
106
|
+
prompt="A landscape"
|
|
108
107
|
className="my-custom-image"
|
|
109
108
|
classes={{
|
|
110
109
|
root: 'custom-container',
|
|
@@ -18,21 +18,23 @@ Examples
|
|
|
18
18
|
const audioCtx = new (window.AudioContext || window.webkitAudioContext)();
|
|
19
19
|
|
|
20
20
|
// Start/resume only in direct response to a user gesture (e.g., a Play button)
|
|
21
|
-
document.querySelector(
|
|
22
|
-
if (audioCtx.state !==
|
|
21
|
+
document.querySelector("#start-audio")?.addEventListener("click", async () => {
|
|
22
|
+
if (audioCtx.state !== "running") await audioCtx.resume();
|
|
23
23
|
// now safe to create/start nodes
|
|
24
24
|
});
|
|
25
25
|
|
|
26
26
|
// 2) Simple tone
|
|
27
27
|
const osc = audioCtx.createOscillator();
|
|
28
|
-
osc.type =
|
|
28
|
+
osc.type = "sine";
|
|
29
29
|
osc.frequency.value = 440;
|
|
30
30
|
osc.connect(audioCtx.destination);
|
|
31
31
|
osc.start();
|
|
32
32
|
osc.stop(audioCtx.currentTime + 1);
|
|
33
33
|
|
|
34
34
|
// 3) Load/decode and play a file
|
|
35
|
-
const buf = await fetch(
|
|
35
|
+
const buf = await fetch("/path/audio.mp3")
|
|
36
|
+
.then((r) => r.arrayBuffer())
|
|
37
|
+
.then((b) => audioCtx.decodeAudioData(b));
|
|
36
38
|
const src = audioCtx.createBufferSource();
|
|
37
39
|
src.buffer = buf;
|
|
38
40
|
src.connect(audioCtx.destination);
|
|
@@ -42,7 +44,7 @@ src.start();
|
|
|
42
44
|
const gain = audioCtx.createGain();
|
|
43
45
|
gain.gain.value = 0.5;
|
|
44
46
|
const filter = audioCtx.createBiquadFilter();
|
|
45
|
-
filter.type =
|
|
47
|
+
filter.type = "lowpass";
|
|
46
48
|
filter.frequency.value = 1000;
|
|
47
49
|
osc.disconnect();
|
|
48
50
|
osc.connect(filter).connect(gain).connect(audioCtx.destination);
|
|
@@ -78,8 +80,8 @@ const wetGain = audioCtx.createGain();
|
|
|
78
80
|
const dryGain = audioCtx.createGain();
|
|
79
81
|
|
|
80
82
|
delay.delayTime.value = 0.35;
|
|
81
|
-
feedbackGain.gain.value = 0.5;
|
|
82
|
-
filter.type =
|
|
83
|
+
feedbackGain.gain.value = 0.5; // < 1.0
|
|
84
|
+
filter.type = "lowpass";
|
|
83
85
|
filter.frequency.value = 8000;
|
|
84
86
|
// distortion.curve = yourFloat32Curve;
|
|
85
87
|
// reverb.buffer = yourImpulseResponseAudioBuffer;
|
|
@@ -103,13 +105,13 @@ Helper (load IR):
|
|
|
103
105
|
|
|
104
106
|
```js
|
|
105
107
|
async function loadImpulseResponse(url) {
|
|
106
|
-
const res = await fetch(url, { mode:
|
|
108
|
+
const res = await fetch(url, { mode: "cors" });
|
|
107
109
|
if (!res.ok) throw new Error(`Failed to fetch IR ${url}: ${res.status} ${res.statusText}`);
|
|
108
110
|
const ab = await res.arrayBuffer();
|
|
109
111
|
try {
|
|
110
112
|
return await audioCtx.decodeAudioData(ab);
|
|
111
113
|
} catch (err) {
|
|
112
|
-
console.error(
|
|
114
|
+
console.error("decodeAudioData failed for IR", url, err);
|
|
113
115
|
throw err; // Surface decoding/CORS-related failures clearly
|
|
114
116
|
}
|
|
115
117
|
}
|
|
@@ -132,7 +134,9 @@ micGain.connect(master);
|
|
|
132
134
|
metronomeGain.connect(master);
|
|
133
135
|
|
|
134
136
|
async function initMic() {
|
|
135
|
-
const stream = await navigator.mediaDevices.getUserMedia({
|
|
137
|
+
const stream = await navigator.mediaDevices.getUserMedia({
|
|
138
|
+
audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: false },
|
|
139
|
+
});
|
|
136
140
|
const micSrc = audioCtx.createMediaStreamSource(stream);
|
|
137
141
|
micSrc.connect(micGain);
|
|
138
142
|
}
|
|
@@ -140,7 +144,7 @@ async function initMic() {
|
|
|
140
144
|
function scheduleClick(atTime, downbeat = false) {
|
|
141
145
|
const osc = audioCtx.createOscillator();
|
|
142
146
|
const env = audioCtx.createGain();
|
|
143
|
-
osc.type =
|
|
147
|
+
osc.type = "square";
|
|
144
148
|
osc.frequency.setValueAtTime(downbeat ? 2000 : 1600, atTime);
|
|
145
149
|
env.gain.setValueAtTime(0.0001, atTime);
|
|
146
150
|
env.gain.exponentialRampToValueAtTime(1.0, atTime + 0.001);
|
|
@@ -150,8 +154,12 @@ function scheduleClick(atTime, downbeat = false) {
|
|
|
150
154
|
osc.stop(atTime + 0.05);
|
|
151
155
|
// Cleanup to avoid accumulating nodes during long sessions
|
|
152
156
|
osc.onended = () => {
|
|
153
|
-
try {
|
|
154
|
-
|
|
157
|
+
try {
|
|
158
|
+
osc.disconnect();
|
|
159
|
+
} catch {}
|
|
160
|
+
try {
|
|
161
|
+
env.disconnect();
|
|
162
|
+
} catch {}
|
|
155
163
|
};
|
|
156
164
|
}
|
|
157
165
|
|
|
@@ -159,11 +167,13 @@ function startMetronome({ bpm = 120, beatsPerBar = 4 } = {}) {
|
|
|
159
167
|
const spb = 60 / bpm; // seconds per beat
|
|
160
168
|
let next = audioCtx.currentTime + 0.1;
|
|
161
169
|
let beat = 0;
|
|
162
|
-
const lookaheadMs = 25,
|
|
170
|
+
const lookaheadMs = 25,
|
|
171
|
+
ahead = 0.2;
|
|
163
172
|
const id = setInterval(() => {
|
|
164
173
|
while (next < audioCtx.currentTime + ahead) {
|
|
165
174
|
scheduleClick(next, beat % beatsPerBar === 0);
|
|
166
|
-
next += spb;
|
|
175
|
+
next += spb;
|
|
176
|
+
beat = (beat + 1) % beatsPerBar;
|
|
167
177
|
}
|
|
168
178
|
}, lookaheadMs);
|
|
169
179
|
return () => clearInterval(id);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibes.diy/prompts",
|
|
3
|
-
"version": "2.0.0-dev-cli-
|
|
3
|
+
"version": "2.0.0-dev-cli-q",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./index.js",
|
|
6
6
|
"description": "",
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
"@fireproof/core-types-base": "~0.24.16",
|
|
31
31
|
"@fireproof/core-types-protocols-cloud": "~0.24.16",
|
|
32
32
|
"@fireproof/use-fireproof": "~0.24.16",
|
|
33
|
-
"@vibes.diy/call-ai-v2": "^2.0.0-dev-cli-
|
|
34
|
-
"@vibes.diy/use-vibes-types": "^2.0.0-dev-cli-
|
|
33
|
+
"@vibes.diy/call-ai-v2": "^2.0.0-dev-cli-q",
|
|
34
|
+
"@vibes.diy/use-vibes-types": "^2.0.0-dev-cli-q",
|
|
35
35
|
"arktype": "~2.2.0",
|
|
36
36
|
"json-schema-faker": "~0.6.1"
|
|
37
37
|
},
|
package/prompts.js
CHANGED
|
@@ -148,7 +148,7 @@ export async function makeBaseSystemPrompt(model, sessionDoc) {
|
|
|
148
148
|
const concatenatedLlmsTxts = [];
|
|
149
149
|
for (const llm of chosenLlms) {
|
|
150
150
|
const rText = await keyedLoadAsset.get(llm.name).once(async () => {
|
|
151
|
-
return loadAsset(`./llms/${llm.name}.
|
|
151
|
+
return loadAsset(`./llms/${llm.name}.md`, {
|
|
152
152
|
fallBackUrl: "https://esm.sh/@vibes.diy/prompts/",
|
|
153
153
|
basePath: () => {
|
|
154
154
|
const dir = import.meta.url;
|
|
@@ -160,7 +160,7 @@ export async function makeBaseSystemPrompt(model, sessionDoc) {
|
|
|
160
160
|
});
|
|
161
161
|
});
|
|
162
162
|
if (rText.isErr()) {
|
|
163
|
-
console.warn(`Failed to load text for LLM ${llm.name} at path ${import.meta.dirname}/./llms/${llm.name}.
|
|
163
|
+
console.warn(`Failed to load text for LLM ${llm.name} at path ${import.meta.dirname}/./llms/${llm.name}.md:`, rText.Err());
|
|
164
164
|
continue;
|
|
165
165
|
}
|
|
166
166
|
concatenatedLlmsTxts.push(`<${llm.label}-docs>`);
|
|
@@ -227,7 +227,7 @@ export async function makeBaseSystemPrompt(model, sessionDoc) {
|
|
|
227
227
|
}
|
|
228
228
|
export async function getSkillText(name) {
|
|
229
229
|
const rText = await keyedLoadAsset.get(name).once(async () => {
|
|
230
|
-
return loadAsset(`./llms/${name}.
|
|
230
|
+
return loadAsset(`./llms/${name}.md`, {
|
|
231
231
|
fallBackUrl: "https://esm.sh/@vibes.diy/prompts/",
|
|
232
232
|
basePath: () => import.meta.url,
|
|
233
233
|
});
|
package/prompts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../jsr/prompts.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../jsr/prompts.ts"],"names":[],"mappings":"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"}
|