dj-claude 0.1.0 → 0.1.2
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/bin.mjs +15 -4
- package/dist/audio/backend.d.ts +14 -0
- package/dist/audio/backend.d.ts.map +1 -0
- package/dist/audio/backend.js +10 -0
- package/dist/audio/backend.js.map +1 -0
- package/dist/audio/browser-backend.d.ts +18 -0
- package/dist/audio/browser-backend.d.ts.map +1 -0
- package/dist/audio/browser-backend.js +172 -0
- package/dist/audio/browser-backend.js.map +1 -0
- package/dist/audio/browser-page.d.ts +2 -0
- package/dist/audio/browser-page.d.ts.map +1 -0
- package/dist/audio/browser-page.js +253 -0
- package/dist/audio/browser-page.js.map +1 -0
- package/dist/audio/engine.d.ts +3 -10
- package/dist/audio/engine.d.ts.map +1 -1
- package/dist/audio/engine.js +17 -104
- package/dist/audio/engine.js.map +1 -1
- package/dist/audio/node-backend.d.ts +11 -0
- package/dist/audio/node-backend.d.ts.map +1 -0
- package/dist/audio/node-backend.js +122 -0
- package/dist/audio/node-backend.js.map +1 -0
- package/dist/components/CodeDisplay.js +1 -1
- package/dist/components/CodeDisplay.js.map +1 -1
- package/dist/components/DancingClaude.js +1 -1
- package/dist/components/DancingClaude.js.map +1 -1
- package/dist/components/Header.d.ts.map +1 -1
- package/dist/components/Header.js +16 -9
- package/dist/components/Header.js.map +1 -1
- package/dist/components/PromptInput.js +1 -1
- package/dist/components/PromptInput.js.map +1 -1
- package/dist/components/SpeechBubble.js +2 -2
- package/dist/components/SpeechBubble.js.map +1 -1
- package/dist/components/StatusBar.js +1 -1
- package/dist/components/StatusBar.js.map +1 -1
- package/dist/headless.d.ts +2 -1
- package/dist/headless.d.ts.map +1 -1
- package/dist/headless.js +6 -2
- package/dist/headless.js.map +1 -1
- package/dist/lib/ascii-frames.js +50 -50
- package/dist/lib/ascii-frames.js.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +40 -5
- package/dist/lib/config.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +10 -4
- package/dist/mcp/server.js.map +1 -1
- package/mcp.mjs +13 -2
- package/package.json +3 -1
package/bin.mjs
CHANGED
|
@@ -1,24 +1,35 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
+
const args = process.argv.slice(2);
|
|
4
|
+
const browserMode = args.includes('--browser');
|
|
5
|
+
|
|
3
6
|
// Import order matters — polyfill patches globalThis with Web Audio API
|
|
4
7
|
// and browser stubs BEFORE Strudel packages try to access them.
|
|
5
|
-
|
|
8
|
+
// In browser mode the polyfill is not needed (Strudel runs in the browser).
|
|
9
|
+
if (!browserMode) {
|
|
10
|
+
await import('./dist/audio/polyfill.js');
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Set backend mode before any engine initialization
|
|
14
|
+
if (browserMode) {
|
|
15
|
+
const { setBackendMode } = await import('./dist/audio/engine.js');
|
|
16
|
+
setBackendMode('browser');
|
|
17
|
+
}
|
|
6
18
|
|
|
7
19
|
// Parse --headless "prompt" [--duration N]
|
|
8
|
-
const args = process.argv.slice(2);
|
|
9
20
|
const headlessIdx = args.indexOf('--headless');
|
|
10
21
|
|
|
11
22
|
if (headlessIdx !== -1) {
|
|
12
23
|
const prompt = args[headlessIdx + 1];
|
|
13
24
|
if (!prompt || prompt.startsWith('--')) {
|
|
14
|
-
console.error('Usage: dj-claude --headless "prompt" [--duration N]');
|
|
25
|
+
console.error('Usage: dj-claude --headless "prompt" [--duration N] [--browser]');
|
|
15
26
|
process.exit(1);
|
|
16
27
|
}
|
|
17
28
|
const durationIdx = args.indexOf('--duration');
|
|
18
29
|
const duration = durationIdx !== -1 ? Number(args[durationIdx + 1]) || 10 : 10;
|
|
19
30
|
|
|
20
31
|
const { runHeadless } = await import('./dist/headless.js');
|
|
21
|
-
await runHeadless(prompt, duration);
|
|
32
|
+
await runHeadless(prompt, duration, browserMode ? 'browser' : 'node');
|
|
22
33
|
} else {
|
|
23
34
|
await import('./dist/index.js');
|
|
24
35
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface SafeEvalResult {
|
|
2
|
+
success: boolean;
|
|
3
|
+
error?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface AudioBackend {
|
|
6
|
+
init(): Promise<void>;
|
|
7
|
+
evaluate(code: string): Promise<void>;
|
|
8
|
+
safeEvaluate(newCode: string, previousCode: string): Promise<SafeEvalResult>;
|
|
9
|
+
hush(): void;
|
|
10
|
+
dispose(): void;
|
|
11
|
+
}
|
|
12
|
+
export type BackendMode = 'node' | 'browser';
|
|
13
|
+
export declare function createBackend(mode: BackendMode): Promise<AudioBackend>;
|
|
14
|
+
//# sourceMappingURL=backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/audio/backend.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7E,IAAI,IAAI,IAAI,CAAC;IACb,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AAE7C,wBAAsB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAO5E"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// AudioBackend abstraction — allows swapping between node and browser audio.
|
|
2
|
+
export async function createBackend(mode) {
|
|
3
|
+
if (mode === 'browser') {
|
|
4
|
+
const { BrowserAudioBackend } = await import('./browser-backend.js');
|
|
5
|
+
return new BrowserAudioBackend();
|
|
6
|
+
}
|
|
7
|
+
const { NodeAudioBackend } = await import('./node-backend.js');
|
|
8
|
+
return new NodeAudioBackend();
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/audio/backend.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAiB7E,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAiB;IACnD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QACrE,OAAO,IAAI,mBAAmB,EAAE,CAAC;IACnC,CAAC;IACD,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/D,OAAO,IAAI,gBAAgB,EAAE,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AudioBackend, SafeEvalResult } from './backend.js';
|
|
2
|
+
export declare class BrowserAudioBackend implements AudioBackend {
|
|
3
|
+
private httpServer;
|
|
4
|
+
private wsServer;
|
|
5
|
+
private socket;
|
|
6
|
+
private port;
|
|
7
|
+
private currentCode;
|
|
8
|
+
private pendingEvals;
|
|
9
|
+
private readyPromise;
|
|
10
|
+
private commandQueue;
|
|
11
|
+
init(): Promise<void>;
|
|
12
|
+
evaluate(code: string): Promise<void>;
|
|
13
|
+
safeEvaluate(newCode: string, previousCode: string): Promise<SafeEvalResult>;
|
|
14
|
+
hush(): void;
|
|
15
|
+
dispose(): void;
|
|
16
|
+
private send;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=browser-backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-backend.d.ts","sourceRoot":"","sources":["../../src/audio/browser-backend.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAajE,qBAAa,mBAAoB,YAAW,YAAY;IACtD,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,YAAY,CAAsE;IAC1F,OAAO,CAAC,YAAY,CAA2D;IAEzE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuFrB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBrC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAiBlF,IAAI,IAAI,IAAI;IAKZ,OAAO,IAAI,IAAI;IAoBf,OAAO,CAAC,IAAI;CAKb"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
// Browser audio backend — routes audio through a browser tab via WebSocket.
|
|
2
|
+
import { createServer } from 'node:http';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
import { exec } from 'node:child_process';
|
|
5
|
+
import { getPageHtml } from './browser-page.js';
|
|
6
|
+
export class BrowserAudioBackend {
|
|
7
|
+
httpServer = null;
|
|
8
|
+
wsServer = null;
|
|
9
|
+
socket = null;
|
|
10
|
+
port = 0;
|
|
11
|
+
currentCode = '';
|
|
12
|
+
pendingEvals = new Map();
|
|
13
|
+
readyPromise = null;
|
|
14
|
+
commandQueue = [];
|
|
15
|
+
async init() {
|
|
16
|
+
const { WebSocketServer } = await import('ws');
|
|
17
|
+
// Start HTTP server on a random available port
|
|
18
|
+
this.httpServer = createServer((req, res) => {
|
|
19
|
+
if (req.url === '/' || req.url === '/index.html') {
|
|
20
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
21
|
+
res.end(getPageHtml(this.port));
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
res.writeHead(404);
|
|
25
|
+
res.end('Not found');
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
await new Promise((resolve, reject) => {
|
|
29
|
+
this.httpServer.listen(0, '127.0.0.1', () => resolve());
|
|
30
|
+
this.httpServer.on('error', reject);
|
|
31
|
+
});
|
|
32
|
+
const addr = this.httpServer.address();
|
|
33
|
+
this.port = typeof addr === 'object' && addr ? addr.port : 0;
|
|
34
|
+
// Start WebSocket server on the same port
|
|
35
|
+
this.wsServer = new WebSocketServer({ server: this.httpServer });
|
|
36
|
+
this.wsServer.on('connection', (ws) => {
|
|
37
|
+
this.socket = ws;
|
|
38
|
+
ws.on('message', (data) => {
|
|
39
|
+
let msg;
|
|
40
|
+
try {
|
|
41
|
+
msg = JSON.parse(data.toString());
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (msg.type === 'ready') {
|
|
47
|
+
console.error(`[dj-claude] Browser audio connected.`);
|
|
48
|
+
if (this.readyPromise) {
|
|
49
|
+
this.readyPromise.resolve();
|
|
50
|
+
this.readyPromise = null;
|
|
51
|
+
}
|
|
52
|
+
// Flush queued commands
|
|
53
|
+
for (const cmd of this.commandQueue) {
|
|
54
|
+
this.send(cmd);
|
|
55
|
+
}
|
|
56
|
+
this.commandQueue = [];
|
|
57
|
+
// Replay current code on reconnect
|
|
58
|
+
if (this.currentCode) {
|
|
59
|
+
const id = randomUUID();
|
|
60
|
+
this.send({ type: 'evaluate', code: this.currentCode, id });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else if (msg.type === 'ack' && msg.id) {
|
|
64
|
+
const pending = this.pendingEvals.get(msg.id);
|
|
65
|
+
if (pending) {
|
|
66
|
+
clearTimeout(pending.timer);
|
|
67
|
+
pending.resolve();
|
|
68
|
+
this.pendingEvals.delete(msg.id);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else if (msg.type === 'error' && msg.id) {
|
|
72
|
+
const pending = this.pendingEvals.get(msg.id);
|
|
73
|
+
if (pending) {
|
|
74
|
+
clearTimeout(pending.timer);
|
|
75
|
+
pending.reject(new Error(msg.error || 'Browser evaluation failed'));
|
|
76
|
+
this.pendingEvals.delete(msg.id);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
ws.on('close', () => {
|
|
81
|
+
console.error('[dj-claude] Browser disconnected.');
|
|
82
|
+
this.socket = null;
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
// Open the browser
|
|
86
|
+
const url = `http://127.0.0.1:${this.port}`;
|
|
87
|
+
console.error(`[dj-claude] Opening browser audio at ${url}`);
|
|
88
|
+
openBrowser(url);
|
|
89
|
+
// Wait for the browser to connect and send 'ready'
|
|
90
|
+
await new Promise((resolve, reject) => {
|
|
91
|
+
this.readyPromise = { resolve, reject };
|
|
92
|
+
// Don't timeout — user needs to click "Start Audio" manually
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
async evaluate(code) {
|
|
96
|
+
const id = randomUUID();
|
|
97
|
+
const msg = { type: 'evaluate', code, id };
|
|
98
|
+
if (!this.socket || this.socket.readyState !== 1) {
|
|
99
|
+
// Queue for when browser reconnects
|
|
100
|
+
this.commandQueue.push(msg);
|
|
101
|
+
this.currentCode = code;
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
return new Promise((resolve, reject) => {
|
|
105
|
+
const timer = setTimeout(() => {
|
|
106
|
+
this.pendingEvals.delete(id);
|
|
107
|
+
reject(new Error('Browser evaluation timed out (10s)'));
|
|
108
|
+
}, 10_000);
|
|
109
|
+
this.pendingEvals.set(id, { resolve, reject, timer });
|
|
110
|
+
this.send(msg);
|
|
111
|
+
this.currentCode = code;
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
async safeEvaluate(newCode, previousCode) {
|
|
115
|
+
try {
|
|
116
|
+
await this.evaluate(newCode);
|
|
117
|
+
return { success: true };
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
121
|
+
if (previousCode) {
|
|
122
|
+
try {
|
|
123
|
+
await this.evaluate(previousCode);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
// Previous code also failed
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return { success: false, error };
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
hush() {
|
|
133
|
+
this.send({ type: 'hush' });
|
|
134
|
+
this.currentCode = '';
|
|
135
|
+
}
|
|
136
|
+
dispose() {
|
|
137
|
+
for (const [id, pending] of this.pendingEvals) {
|
|
138
|
+
clearTimeout(pending.timer);
|
|
139
|
+
pending.reject(new Error('Backend disposed'));
|
|
140
|
+
this.pendingEvals.delete(id);
|
|
141
|
+
}
|
|
142
|
+
if (this.socket) {
|
|
143
|
+
this.socket.close();
|
|
144
|
+
this.socket = null;
|
|
145
|
+
}
|
|
146
|
+
if (this.wsServer) {
|
|
147
|
+
this.wsServer.close();
|
|
148
|
+
this.wsServer = null;
|
|
149
|
+
}
|
|
150
|
+
if (this.httpServer) {
|
|
151
|
+
this.httpServer.close();
|
|
152
|
+
this.httpServer = null;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
send(msg) {
|
|
156
|
+
if (this.socket && this.socket.readyState === 1) {
|
|
157
|
+
this.socket.send(JSON.stringify(msg));
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function openBrowser(url) {
|
|
162
|
+
const cmd = process.platform === 'darwin'
|
|
163
|
+
? `open "${url}"`
|
|
164
|
+
: process.platform === 'win32'
|
|
165
|
+
? `start "${url}"`
|
|
166
|
+
: `xdg-open "${url}"`;
|
|
167
|
+
exec(cmd, (err) => {
|
|
168
|
+
if (err)
|
|
169
|
+
console.error('[dj-claude] Could not open browser:', err.message);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=browser-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-backend.js","sourceRoot":"","sources":["../../src/audio/browser-backend.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-page.d.ts","sourceRoot":"","sources":["../../src/audio/browser-page.ts"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA4PlD"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
// Inline HTML page served to the browser for audio playback.
|
|
2
|
+
// Visual design matches claude.dj (welcome box, ASCII logo, dancing Claude).
|
|
3
|
+
export function getPageHtml(wsPort) {
|
|
4
|
+
// Body frames: 4 frames, each 10 rows x 18 cols
|
|
5
|
+
// 0=empty, 1=body, 2=eye, 3=mouth
|
|
6
|
+
const bodyFrames = [
|
|
7
|
+
[[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], [0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0]],
|
|
8
|
+
[[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], [0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0]],
|
|
9
|
+
[[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], [0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0]],
|
|
10
|
+
[[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], [0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0]],
|
|
11
|
+
];
|
|
12
|
+
// Leg frames: 4 frames, each 2 rows x 18 cols
|
|
13
|
+
const legFrames = [
|
|
14
|
+
[[0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0]],
|
|
15
|
+
[[0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0]],
|
|
16
|
+
[[0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0]],
|
|
17
|
+
[[0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
|
|
18
|
+
];
|
|
19
|
+
const framesJson = JSON.stringify({ body: bodyFrames, legs: legFrames });
|
|
20
|
+
return `<!DOCTYPE html>
|
|
21
|
+
<html lang="en">
|
|
22
|
+
<head>
|
|
23
|
+
<meta charset="UTF-8">
|
|
24
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
25
|
+
<title>DJ Claude | v 0.1.0</title>
|
|
26
|
+
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🔈</text></svg>">
|
|
27
|
+
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
|
|
28
|
+
<style>
|
|
29
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
30
|
+
|
|
31
|
+
:root {
|
|
32
|
+
--bg: #262624;
|
|
33
|
+
--fg: #E8704E;
|
|
34
|
+
--fg-dim: rgba(232, 112, 78, 0.4);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
body {
|
|
38
|
+
background: var(--bg);
|
|
39
|
+
color: var(--fg);
|
|
40
|
+
font-family: 'JetBrains Mono', 'Menlo', 'Consolas', 'DejaVu Sans Mono', monospace;
|
|
41
|
+
font-size: 12px;
|
|
42
|
+
line-height: 1.2;
|
|
43
|
+
height: 100vh;
|
|
44
|
+
overflow: hidden;
|
|
45
|
+
display: flex;
|
|
46
|
+
flex-direction: column;
|
|
47
|
+
align-items: center;
|
|
48
|
+
justify-content: center;
|
|
49
|
+
gap: 0;
|
|
50
|
+
-webkit-font-smoothing: antialiased;
|
|
51
|
+
-moz-osx-font-smoothing: grayscale;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
::selection {
|
|
55
|
+
background: var(--fg);
|
|
56
|
+
color: var(--bg);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
::-webkit-scrollbar { width: 6px; height: 6px; }
|
|
60
|
+
::-webkit-scrollbar-track { background: transparent; }
|
|
61
|
+
::-webkit-scrollbar-thumb { background: var(--fg-dim); border-radius: 3px; }
|
|
62
|
+
|
|
63
|
+
pre { margin: 0; font-family: inherit; font-size: 12px; line-height: 1.2; }
|
|
64
|
+
|
|
65
|
+
.ascii-box { width: fit-content; user-select: none; }
|
|
66
|
+
.dim { opacity: 0.3; }
|
|
67
|
+
|
|
68
|
+
/* ── ASCII logo ── */
|
|
69
|
+
#logo { user-select: none; }
|
|
70
|
+
|
|
71
|
+
/* ── Start button ── */
|
|
72
|
+
#start-box {
|
|
73
|
+
cursor: pointer;
|
|
74
|
+
user-select: none;
|
|
75
|
+
width: fit-content;
|
|
76
|
+
transition: opacity 0.15s;
|
|
77
|
+
margin-top: 8px;
|
|
78
|
+
}
|
|
79
|
+
#start-box:hover { opacity: 0.6; }
|
|
80
|
+
#start-box.disabled { opacity: 0.3; pointer-events: none; }
|
|
81
|
+
|
|
82
|
+
/* ── Dancing Claude ── */
|
|
83
|
+
#claude {
|
|
84
|
+
margin-top: 12px;
|
|
85
|
+
display: flex;
|
|
86
|
+
flex-direction: column;
|
|
87
|
+
align-items: center;
|
|
88
|
+
transition: transform 0.15s ease-out;
|
|
89
|
+
}
|
|
90
|
+
.pixel-row { display: flex; }
|
|
91
|
+
.pixel {
|
|
92
|
+
width: 6px;
|
|
93
|
+
height: 6px;
|
|
94
|
+
}
|
|
95
|
+
</style>
|
|
96
|
+
</head>
|
|
97
|
+
<body>
|
|
98
|
+
|
|
99
|
+
<!-- Welcome box -->
|
|
100
|
+
<div class="ascii-box">
|
|
101
|
+
<pre>╔═════════════════════════════════════════════╗</pre>
|
|
102
|
+
<div style="display:flex"><pre>║</pre><pre style="flex:1;text-align:center">Welcome to DJ Claude <span class="dim">v 0.1.0</span></pre><pre>║</pre></div>
|
|
103
|
+
<pre>╚═════════════════════════════════════════════╝</pre>
|
|
104
|
+
</div>
|
|
105
|
+
|
|
106
|
+
<!-- ASCII Logo -->
|
|
107
|
+
<div id="logo">
|
|
108
|
+
<pre>
|
|
109
|
+
██████╗ ██╗ ██████╗██╗ █████╗ ██╗ ██╗██████╗ ███████╗
|
|
110
|
+
██╔══██╗ ██║ ██╔════╝██║ ██╔══██╗██║ ██║██╔══██╗██╔════╝
|
|
111
|
+
██║ ██║ ██║ ██║ ██║ ███████║██║ ██║██║ ██║█████╗
|
|
112
|
+
██║ ██║██ ██║ ██║ ██║ ██╔══██║██║ ██║██║ ██║██╔══╝
|
|
113
|
+
██████╔╝╚█████╔╝ ╚██████╗███████╗██║ ██║╚██████╔╝██████╔╝███████╗
|
|
114
|
+
╚═════╝ ╚════╝ ╚═════╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚══════╝</pre>
|
|
115
|
+
</div>
|
|
116
|
+
|
|
117
|
+
<!-- Start Audio button -->
|
|
118
|
+
<div id="start-box">
|
|
119
|
+
<pre>╔════════════════════╗</pre>
|
|
120
|
+
<div style="display:flex"><pre>║</pre><pre id="start-label" style="flex:1;text-align:center">▶ Unmute Audio</pre><pre>║</pre></div>
|
|
121
|
+
<pre>╚════════════════════╝</pre>
|
|
122
|
+
</div>
|
|
123
|
+
|
|
124
|
+
<!-- Dancing Claude pixel art -->
|
|
125
|
+
<div id="claude"></div>
|
|
126
|
+
|
|
127
|
+
<script type="module">
|
|
128
|
+
import { initStrudel } from 'https://unpkg.com/@strudel/web@1.2.6/dist/index.mjs';
|
|
129
|
+
|
|
130
|
+
const startBox = document.getElementById('start-box');
|
|
131
|
+
const startLabel = document.getElementById('start-label');
|
|
132
|
+
const claudeEl = document.getElementById('claude');
|
|
133
|
+
|
|
134
|
+
const FRAMES = ${framesJson};
|
|
135
|
+
const FG = getComputedStyle(document.documentElement).getPropertyValue('--fg').trim();
|
|
136
|
+
const BG = getComputedStyle(document.documentElement).getPropertyValue('--bg').trim();
|
|
137
|
+
|
|
138
|
+
let strudelEval = null;
|
|
139
|
+
let strudelHush = null;
|
|
140
|
+
let ws = null;
|
|
141
|
+
let started = false;
|
|
142
|
+
let isMixing = false;
|
|
143
|
+
let animFrame = 0;
|
|
144
|
+
let animInterval = null;
|
|
145
|
+
|
|
146
|
+
// ── Pixel art renderer ──
|
|
147
|
+
function renderClaude(frame) {
|
|
148
|
+
const body = FRAMES.body[frame];
|
|
149
|
+
const legs = FRAMES.legs[frame];
|
|
150
|
+
const bob = (frame === 1 || frame === 3) && isMixing ? -2 : 0;
|
|
151
|
+
|
|
152
|
+
claudeEl.style.transform = 'translateY(' + bob + 'px)';
|
|
153
|
+
|
|
154
|
+
let html = '';
|
|
155
|
+
const allRows = [...body, ...legs];
|
|
156
|
+
for (const row of allRows) {
|
|
157
|
+
html += '<div class="pixel-row">';
|
|
158
|
+
for (const cell of row) {
|
|
159
|
+
const bg = cell === 1 ? FG : 'transparent';
|
|
160
|
+
// 2=eye, 3=mouth → transparent
|
|
161
|
+
html += '<div class="pixel" style="background:' + bg + '"></div>';
|
|
162
|
+
}
|
|
163
|
+
html += '</div>';
|
|
164
|
+
}
|
|
165
|
+
claudeEl.innerHTML = html;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function startDancing() {
|
|
169
|
+
if (animInterval) return;
|
|
170
|
+
isMixing = true;
|
|
171
|
+
animInterval = setInterval(() => {
|
|
172
|
+
animFrame = (animFrame + 1) % 4;
|
|
173
|
+
renderClaude(animFrame);
|
|
174
|
+
}, 200);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function stopDancing() {
|
|
178
|
+
isMixing = false;
|
|
179
|
+
if (animInterval) {
|
|
180
|
+
clearInterval(animInterval);
|
|
181
|
+
animInterval = null;
|
|
182
|
+
}
|
|
183
|
+
animFrame = 0;
|
|
184
|
+
renderClaude(0);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Initial static render
|
|
188
|
+
renderClaude(0);
|
|
189
|
+
|
|
190
|
+
// ── Audio init ──
|
|
191
|
+
async function start() {
|
|
192
|
+
startBox.classList.add('disabled');
|
|
193
|
+
|
|
194
|
+
try {
|
|
195
|
+
const { evaluate, hush } = await initStrudel();
|
|
196
|
+
strudelEval = evaluate;
|
|
197
|
+
strudelHush = hush;
|
|
198
|
+
started = true;
|
|
199
|
+
startLabel.textContent = '● Audio On';
|
|
200
|
+
startBox.style.cursor = 'default';
|
|
201
|
+
startBox.style.pointerEvents = 'none';
|
|
202
|
+
startBox.classList.remove('disabled');
|
|
203
|
+
connectWs();
|
|
204
|
+
} catch (err) {
|
|
205
|
+
startBox.classList.remove('disabled');
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// ── WebSocket ──
|
|
210
|
+
function connectWs() {
|
|
211
|
+
if (!started) return;
|
|
212
|
+
|
|
213
|
+
ws = new WebSocket('ws://localhost:${wsPort}');
|
|
214
|
+
|
|
215
|
+
ws.onopen = () => {
|
|
216
|
+
ws.send(JSON.stringify({ type: 'ready' }));
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
ws.onmessage = async (event) => {
|
|
220
|
+
let msg;
|
|
221
|
+
try { msg = JSON.parse(event.data); } catch { return; }
|
|
222
|
+
|
|
223
|
+
if (msg.type === 'evaluate') {
|
|
224
|
+
try {
|
|
225
|
+
await strudelEval(msg.code);
|
|
226
|
+
startDancing();
|
|
227
|
+
ws.send(JSON.stringify({ type: 'ack', id: msg.id }));
|
|
228
|
+
} catch (err) {
|
|
229
|
+
stopDancing();
|
|
230
|
+
ws.send(JSON.stringify({ type: 'error', id: msg.id, error: err.message }));
|
|
231
|
+
}
|
|
232
|
+
} else if (msg.type === 'hush') {
|
|
233
|
+
strudelHush();
|
|
234
|
+
stopDancing();
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
ws.onclose = () => {
|
|
239
|
+
stopDancing();
|
|
240
|
+
setTimeout(connectWs, 2000);
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
ws.onerror = () => {
|
|
244
|
+
ws.close();
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
startBox.addEventListener('click', start);
|
|
249
|
+
</script>
|
|
250
|
+
</body>
|
|
251
|
+
</html>`;
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=browser-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-page.js","sourceRoot":"","sources":["../../src/audio/browser-page.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,6EAA6E;AAE7E,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,gDAAgD;IAChD,kCAAkC;IAClC,MAAM,UAAU,GAAG;QACjB,CAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;QAC7X,CAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;QAC7X,CAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;QAC7X,CAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAA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"}
|
package/dist/audio/engine.d.ts
CHANGED
|
@@ -1,15 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { SafeEvalResult, BackendMode } from './backend.js';
|
|
2
|
+
export type { SafeEvalResult };
|
|
3
|
+
export declare function setBackendMode(mode: BackendMode): void;
|
|
2
4
|
export declare function initEngine(): Promise<void>;
|
|
3
5
|
export declare function evaluate(code: string): Promise<void>;
|
|
4
|
-
export interface SafeEvalResult {
|
|
5
|
-
success: boolean;
|
|
6
|
-
error?: string;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Try evaluating newCode. On failure, re-evaluate previousCode to keep
|
|
10
|
-
* the old pattern playing, and return the error.
|
|
11
|
-
*/
|
|
12
6
|
export declare function safeEvaluate(newCode: string, previousCode: string): Promise<SafeEvalResult>;
|
|
13
7
|
export declare function hush(): void;
|
|
14
|
-
export declare function getContext(): AudioContext | null;
|
|
15
8
|
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/audio/engine.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/audio/engine.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAgB,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG9E,YAAY,EAAE,cAAc,EAAE,CAAC;AAK/B,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAEtD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAGhD;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK1D;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,cAAc,CAAC,CAKzB;AAED,wBAAgB,IAAI,IAAI,IAAI,CAG3B"}
|