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.
Files changed (49) hide show
  1. package/bin.mjs +15 -4
  2. package/dist/audio/backend.d.ts +14 -0
  3. package/dist/audio/backend.d.ts.map +1 -0
  4. package/dist/audio/backend.js +10 -0
  5. package/dist/audio/backend.js.map +1 -0
  6. package/dist/audio/browser-backend.d.ts +18 -0
  7. package/dist/audio/browser-backend.d.ts.map +1 -0
  8. package/dist/audio/browser-backend.js +172 -0
  9. package/dist/audio/browser-backend.js.map +1 -0
  10. package/dist/audio/browser-page.d.ts +2 -0
  11. package/dist/audio/browser-page.d.ts.map +1 -0
  12. package/dist/audio/browser-page.js +253 -0
  13. package/dist/audio/browser-page.js.map +1 -0
  14. package/dist/audio/engine.d.ts +3 -10
  15. package/dist/audio/engine.d.ts.map +1 -1
  16. package/dist/audio/engine.js +17 -104
  17. package/dist/audio/engine.js.map +1 -1
  18. package/dist/audio/node-backend.d.ts +11 -0
  19. package/dist/audio/node-backend.d.ts.map +1 -0
  20. package/dist/audio/node-backend.js +122 -0
  21. package/dist/audio/node-backend.js.map +1 -0
  22. package/dist/components/CodeDisplay.js +1 -1
  23. package/dist/components/CodeDisplay.js.map +1 -1
  24. package/dist/components/DancingClaude.js +1 -1
  25. package/dist/components/DancingClaude.js.map +1 -1
  26. package/dist/components/Header.d.ts.map +1 -1
  27. package/dist/components/Header.js +16 -9
  28. package/dist/components/Header.js.map +1 -1
  29. package/dist/components/PromptInput.js +1 -1
  30. package/dist/components/PromptInput.js.map +1 -1
  31. package/dist/components/SpeechBubble.js +2 -2
  32. package/dist/components/SpeechBubble.js.map +1 -1
  33. package/dist/components/StatusBar.js +1 -1
  34. package/dist/components/StatusBar.js.map +1 -1
  35. package/dist/headless.d.ts +2 -1
  36. package/dist/headless.d.ts.map +1 -1
  37. package/dist/headless.js +6 -2
  38. package/dist/headless.js.map +1 -1
  39. package/dist/lib/ascii-frames.js +50 -50
  40. package/dist/lib/ascii-frames.js.map +1 -1
  41. package/dist/lib/config.d.ts.map +1 -1
  42. package/dist/lib/config.js +40 -5
  43. package/dist/lib/config.js.map +1 -1
  44. package/dist/mcp/server.d.ts +1 -1
  45. package/dist/mcp/server.d.ts.map +1 -1
  46. package/dist/mcp/server.js +10 -4
  47. package/dist/mcp/server.js.map +1 -1
  48. package/mcp.mjs +13 -2
  49. 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
- await import('./dist/audio/polyfill.js');
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,2 @@
1
+ export declare function getPageHtml(wsPort: number): string;
2
+ //# sourceMappingURL=browser-page.d.ts.map
@@ -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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"}
@@ -1,15 +1,8 @@
1
- import { AudioContext } from 'node-web-audio-api';
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,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKlD,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CA+EhD;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK1D;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,cAAc,CAAC,CAgBzB;AAED,wBAAgB,IAAI,IAAI,IAAI,CAG3B;AAED,wBAAgB,UAAU,IAAI,YAAY,GAAG,IAAI,CAEhD"}
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"}