dj-claude 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin.mjs +24 -0
- package/dist/App.d.ts +6 -0
- package/dist/App.d.ts.map +1 -0
- package/dist/App.js +64 -0
- package/dist/App.js.map +1 -0
- package/dist/audio/engine.d.ts +15 -0
- package/dist/audio/engine.d.ts.map +1 -0
- package/dist/audio/engine.js +117 -0
- package/dist/audio/engine.js.map +1 -0
- package/dist/audio/polyfill.d.ts +2 -0
- package/dist/audio/polyfill.d.ts.map +1 -0
- package/dist/audio/polyfill.js +122 -0
- package/dist/audio/polyfill.js.map +1 -0
- package/dist/components/CodeDisplay.d.ts +7 -0
- package/dist/components/CodeDisplay.d.ts.map +1 -0
- package/dist/components/CodeDisplay.js +12 -0
- package/dist/components/CodeDisplay.js.map +1 -0
- package/dist/components/DancingClaude.d.ts +6 -0
- package/dist/components/DancingClaude.d.ts.map +1 -0
- package/dist/components/DancingClaude.js +26 -0
- package/dist/components/DancingClaude.js.map +1 -0
- package/dist/components/Header.d.ts +8 -0
- package/dist/components/Header.d.ts.map +1 -0
- package/dist/components/Header.js +28 -0
- package/dist/components/Header.js.map +1 -0
- package/dist/components/PromptInput.d.ts +9 -0
- package/dist/components/PromptInput.d.ts.map +1 -0
- package/dist/components/PromptInput.js +7 -0
- package/dist/components/PromptInput.js.map +1 -0
- package/dist/components/SpeechBubble.d.ts +6 -0
- package/dist/components/SpeechBubble.d.ts.map +1 -0
- package/dist/components/SpeechBubble.js +25 -0
- package/dist/components/SpeechBubble.js.map +1 -0
- package/dist/components/StatusBar.d.ts +6 -0
- package/dist/components/StatusBar.d.ts.map +1 -0
- package/dist/components/StatusBar.js +6 -0
- package/dist/components/StatusBar.js.map +1 -0
- package/dist/headless.d.ts +2 -0
- package/dist/headless.d.ts.map +1 -0
- package/dist/headless.js +37 -0
- package/dist/headless.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/ascii-frames.d.ts +3 -0
- package/dist/lib/ascii-frames.d.ts.map +1 -0
- package/dist/lib/ascii-frames.js +82 -0
- package/dist/lib/ascii-frames.js.map +1 -0
- package/dist/lib/claude.d.ts +3 -0
- package/dist/lib/claude.d.ts.map +1 -0
- package/dist/lib/claude.js +44 -0
- package/dist/lib/claude.js.map +1 -0
- package/dist/lib/config.d.ts +3 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +27 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/parseCode.d.ts +8 -0
- package/dist/lib/parseCode.d.ts.map +1 -0
- package/dist/lib/parseCode.js +94 -0
- package/dist/lib/parseCode.js.map +1 -0
- package/dist/lib/prompts.d.ts +2 -0
- package/dist/lib/prompts.d.ts.map +1 -0
- package/dist/lib/prompts.js +221 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/reducer.d.ts +4 -0
- package/dist/lib/reducer.d.ts.map +1 -0
- package/dist/lib/reducer.js +79 -0
- package/dist/lib/reducer.js.map +1 -0
- package/dist/lib/session.d.ts +4 -0
- package/dist/lib/session.d.ts.map +1 -0
- package/dist/lib/session.js +45 -0
- package/dist/lib/session.js.map +1 -0
- package/dist/lib/types.d.ts +49 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +166 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/state.d.ts +16 -0
- package/dist/mcp/state.d.ts.map +1 -0
- package/dist/mcp/state.js +32 -0
- package/dist/mcp/state.js.map +1 -0
- package/mcp.mjs +15 -0
- package/package.json +45 -0
package/bin.mjs
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Import order matters — polyfill patches globalThis with Web Audio API
|
|
4
|
+
// and browser stubs BEFORE Strudel packages try to access them.
|
|
5
|
+
await import('./dist/audio/polyfill.js');
|
|
6
|
+
|
|
7
|
+
// Parse --headless "prompt" [--duration N]
|
|
8
|
+
const args = process.argv.slice(2);
|
|
9
|
+
const headlessIdx = args.indexOf('--headless');
|
|
10
|
+
|
|
11
|
+
if (headlessIdx !== -1) {
|
|
12
|
+
const prompt = args[headlessIdx + 1];
|
|
13
|
+
if (!prompt || prompt.startsWith('--')) {
|
|
14
|
+
console.error('Usage: dj-claude --headless "prompt" [--duration N]');
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
const durationIdx = args.indexOf('--duration');
|
|
18
|
+
const duration = durationIdx !== -1 ? Number(args[durationIdx + 1]) || 10 : 10;
|
|
19
|
+
|
|
20
|
+
const { runHeadless } = await import('./dist/headless.js');
|
|
21
|
+
await runHeadless(prompt, duration);
|
|
22
|
+
} else {
|
|
23
|
+
await import('./dist/index.js');
|
|
24
|
+
}
|
package/dist/App.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"AAaA,UAAU,QAAQ;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,2CAmGvC"}
|
package/dist/App.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useReducer, useEffect, useState, useCallback } from 'react';
|
|
3
|
+
import { Box, useApp, useInput } from 'ink';
|
|
4
|
+
import { Header } from './components/Header.js';
|
|
5
|
+
import { PromptInput } from './components/PromptInput.js';
|
|
6
|
+
import { DancingClaude } from './components/DancingClaude.js';
|
|
7
|
+
import { SpeechBubble } from './components/SpeechBubble.js';
|
|
8
|
+
import { StatusBar } from './components/StatusBar.js';
|
|
9
|
+
import { CodeDisplay } from './components/CodeDisplay.js';
|
|
10
|
+
import { djReducer, initialState } from './lib/reducer.js';
|
|
11
|
+
import { parseStreamingCode } from './lib/parseCode.js';
|
|
12
|
+
import { handlePrompt } from './lib/session.js';
|
|
13
|
+
import { initEngine, evaluate, hush } from './audio/engine.js';
|
|
14
|
+
export function App({ apiKey }) {
|
|
15
|
+
const { exit } = useApp();
|
|
16
|
+
const [state, dispatch] = useReducer(djReducer, initialState);
|
|
17
|
+
const [input, setInput] = useState('');
|
|
18
|
+
// Init audio engine on mount
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
initEngine()
|
|
21
|
+
.then(() => dispatch({ type: 'AUDIO_INITIALIZED' }))
|
|
22
|
+
.catch((err) => dispatch({ type: 'STREAM_ERROR', error: `Audio init failed: ${err.message}` }));
|
|
23
|
+
}, []);
|
|
24
|
+
// Handle submit — delegates to session.ts for streaming + parsing + evaluation
|
|
25
|
+
const handleSubmit = useCallback(async (prompt) => {
|
|
26
|
+
if (!prompt.trim() || state.isStreaming)
|
|
27
|
+
return;
|
|
28
|
+
const trimmed = prompt.trim();
|
|
29
|
+
setInput('');
|
|
30
|
+
dispatch({ type: 'ADD_USER_MESSAGE', content: trimmed });
|
|
31
|
+
await handlePrompt(apiKey, trimmed, state.currentCode, state.messages, dispatch);
|
|
32
|
+
}, [apiKey, state.currentCode, state.messages, state.isStreaming]);
|
|
33
|
+
// Global keyboard shortcuts
|
|
34
|
+
useInput((ch, key) => {
|
|
35
|
+
if (ch === 'q' && !state.isStreaming) {
|
|
36
|
+
hush();
|
|
37
|
+
exit();
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (key.escape) {
|
|
41
|
+
if (state.isPlaying) {
|
|
42
|
+
hush();
|
|
43
|
+
dispatch({ type: 'HUSH' });
|
|
44
|
+
}
|
|
45
|
+
else if (state.currentCode) {
|
|
46
|
+
evaluate(state.currentCode).catch(() => { });
|
|
47
|
+
dispatch({ type: 'CODE_EXECUTED', code: state.currentCode });
|
|
48
|
+
}
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (ch === 'r' && !state.isStreaming && state.previousCode) {
|
|
52
|
+
dispatch({ type: 'RESTORE_PREVIOUS' });
|
|
53
|
+
evaluate(state.previousCode).catch(() => { });
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
// Show streaming code preview
|
|
58
|
+
const streamParse = state.isStreaming
|
|
59
|
+
? parseStreamingCode(state.streamingCode)
|
|
60
|
+
: null;
|
|
61
|
+
const displayError = state.streamingError || state.executionError;
|
|
62
|
+
return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(Header, { isPlaying: state.isPlaying, isStreaming: state.isStreaming, audioInitialized: state.audioInitialized }), _jsx(Box, { marginY: 1, justifyContent: "center", children: _jsx(DancingClaude, { isPlaying: state.isPlaying }) }), state.mcCommentary && (_jsx(Box, { justifyContent: "center", marginBottom: 1, children: _jsx(SpeechBubble, { text: state.mcCommentary }) })), state.isStreaming && streamParse?.displayCode && (_jsx(CodeDisplay, { code: streamParse.displayCode, label: "Incoming" })), !state.isStreaming && state.currentCode && (_jsx(CodeDisplay, { code: state.currentCode })), _jsx(Box, { marginTop: 1, children: _jsx(PromptInput, { value: input, onChange: setInput, onSubmit: handleSubmit, isDisabled: state.isStreaming }) }), _jsx(Box, { marginTop: 1, children: _jsx(StatusBar, { error: displayError }) })] }));
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=App.js.map
|
package/dist/App.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC5E,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAM/D,MAAM,UAAU,GAAG,CAAC,EAAE,MAAM,EAAY;IACtC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAC9D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEvC,6BAA6B;IAC7B,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,EAAE;aACT,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;aACnD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACb,QAAQ,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,sBAAsB,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAC/E,CAAC;IACN,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,+EAA+E;IAC/E,MAAM,YAAY,GAAG,WAAW,CAC9B,KAAK,EAAE,MAAc,EAAE,EAAE;QACvB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,WAAW;YAAE,OAAO;QAChD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,QAAQ,CAAC,EAAE,CAAC,CAAC;QACb,QAAQ,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACzD,MAAM,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnF,CAAC,EACD,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC,CAC/D,CAAC;IAEF,4BAA4B;IAC5B,QAAQ,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE;QACnB,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YACrC,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,IAAI,EAAE,CAAC;gBACP,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC7B,CAAC;iBAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;gBAC7B,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBAC5C,QAAQ,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YAC3D,QAAQ,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;YACvC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,8BAA8B;IAC9B,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW;QACnC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,aAAa,CAAC;QACzC,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,YAAY,GAAG,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc,CAAC;IAElE,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,aACpC,KAAC,MAAM,IACL,SAAS,EAAE,KAAK,CAAC,SAAS,EAC1B,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,GACxC,EAEF,KAAC,GAAG,IAAC,OAAO,EAAE,CAAC,EAAE,cAAc,EAAC,QAAQ,YACtC,KAAC,aAAa,IAAC,SAAS,EAAE,KAAK,CAAC,SAAS,GAAI,GACzC,EAEL,KAAK,CAAC,YAAY,IAAI,CACrB,KAAC,GAAG,IAAC,cAAc,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,YAC1C,KAAC,YAAY,IAAC,IAAI,EAAE,KAAK,CAAC,YAAY,GAAI,GACtC,CACP,EAEA,KAAK,CAAC,WAAW,IAAI,WAAW,EAAE,WAAW,IAAI,CAChD,KAAC,WAAW,IAAC,IAAI,EAAE,WAAW,CAAC,WAAW,EAAE,KAAK,EAAC,UAAU,GAAG,CAChE,EAEA,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,IAAI,CAC1C,KAAC,WAAW,IAAC,IAAI,EAAE,KAAK,CAAC,WAAW,GAAI,CACzC,EAED,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,WAAW,IACV,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,KAAK,CAAC,WAAW,GAC7B,GACE,EAEN,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,SAAS,IAAC,KAAK,EAAE,YAAY,GAAI,GAC9B,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AudioContext } from 'node-web-audio-api';
|
|
2
|
+
export declare function initEngine(): Promise<void>;
|
|
3
|
+
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
|
+
export declare function safeEvaluate(newCode: string, previousCode: string): Promise<SafeEvalResult>;
|
|
13
|
+
export declare function hush(): void;
|
|
14
|
+
export declare function getContext(): AudioContext | null;
|
|
15
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// Strudel audio engine — init, evaluate, and hush.
|
|
2
|
+
// polyfill.ts MUST be imported before this file.
|
|
3
|
+
import { AudioContext } from 'node-web-audio-api';
|
|
4
|
+
let repl = null;
|
|
5
|
+
let audioContext = null;
|
|
6
|
+
export async function initEngine() {
|
|
7
|
+
// Dynamic imports to ensure polyfill has run first
|
|
8
|
+
const core = await import('@strudel/core');
|
|
9
|
+
const mini = await import('@strudel/mini');
|
|
10
|
+
const webaudio = await import('@strudel/webaudio');
|
|
11
|
+
const superdough = await import('superdough');
|
|
12
|
+
// Expose all Strudel core + mini exports on globalThis so the REPL
|
|
13
|
+
// evaluate() (which uses Function() constructor) can access them.
|
|
14
|
+
// This includes functions (note, s, stack) and signal patterns (sine, cosine, perlin, rand, saw).
|
|
15
|
+
const g = globalThis;
|
|
16
|
+
for (const [key, value] of Object.entries(core)) {
|
|
17
|
+
if (key !== 'default' && key !== '__esModule') {
|
|
18
|
+
g[key] = value;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
for (const [key, value] of Object.entries(mini)) {
|
|
22
|
+
if (key !== 'default' && key !== '__esModule') {
|
|
23
|
+
g[key] = value;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Register mini notation as the default string parser so that
|
|
27
|
+
// note("c3 e3 g3") parses the string as a mini-notation pattern.
|
|
28
|
+
if (typeof mini.miniAllStrings === 'function') {
|
|
29
|
+
mini.miniAllStrings();
|
|
30
|
+
}
|
|
31
|
+
// Create audio context and set it as the default for superdough
|
|
32
|
+
audioContext = new AudioContext();
|
|
33
|
+
g.__audio_context = audioContext;
|
|
34
|
+
if (typeof superdough.setDefaultAudioContext === 'function') {
|
|
35
|
+
superdough.setDefaultAudioContext(audioContext);
|
|
36
|
+
}
|
|
37
|
+
// Silence noisy Strudel logging (sampler loading, cyclist errors).
|
|
38
|
+
if (typeof webaudio.setLogger === 'function') {
|
|
39
|
+
webaudio.setLogger(() => { });
|
|
40
|
+
}
|
|
41
|
+
// The core logger (used by cyclist) writes to console.log with a %c prefix.
|
|
42
|
+
// Intercept and suppress those messages.
|
|
43
|
+
const origLog = console.log;
|
|
44
|
+
console.log = (...args) => {
|
|
45
|
+
if (typeof args[0] === 'string' && (args[0].includes('[cyclist]') || args[0].includes('[eval]')))
|
|
46
|
+
return;
|
|
47
|
+
origLog.apply(console, args);
|
|
48
|
+
};
|
|
49
|
+
// Register synth sounds (triangle, sawtooth, square, sine)
|
|
50
|
+
if (typeof webaudio.registerSynthSounds === 'function') {
|
|
51
|
+
await webaudio.registerSynthSounds();
|
|
52
|
+
}
|
|
53
|
+
// Load drum sample manifest and init REPL concurrently.
|
|
54
|
+
// The manifest is a small JSON fetch; actual audio files are lazy-loaded on
|
|
55
|
+
// first use. We await both so samples are available when code runs.
|
|
56
|
+
const [, replInstance] = await Promise.all([
|
|
57
|
+
webaudio.samples('github:tidalcycles/Dirt-Samples/master').catch((err) => {
|
|
58
|
+
console.error('Failed to load sample manifest:', err.message);
|
|
59
|
+
}),
|
|
60
|
+
core.repl({
|
|
61
|
+
defaultOutput: webaudio.webaudioOutput,
|
|
62
|
+
getTime: () => audioContext.currentTime,
|
|
63
|
+
}),
|
|
64
|
+
]);
|
|
65
|
+
repl = replInstance;
|
|
66
|
+
// Stub .pattern() on the Pattern prototype — it doesn't exist in this
|
|
67
|
+
// Strudel version but Claude may generate it. Make it a no-op returning `this`.
|
|
68
|
+
try {
|
|
69
|
+
const proto = Object.getPrototypeOf(core.note('c3'));
|
|
70
|
+
if (proto && !proto.pattern) {
|
|
71
|
+
proto.pattern = function () { return this; };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Pattern prototype not accessible — skip
|
|
76
|
+
}
|
|
77
|
+
// Don't start scheduler yet — it requires a pattern to be set first.
|
|
78
|
+
// evaluate() will trigger the scheduler via repl.evaluate().
|
|
79
|
+
}
|
|
80
|
+
export async function evaluate(code) {
|
|
81
|
+
if (!repl) {
|
|
82
|
+
throw new Error('Engine not initialized. Call initEngine() first.');
|
|
83
|
+
}
|
|
84
|
+
await repl.evaluate(code);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Try evaluating newCode. On failure, re-evaluate previousCode to keep
|
|
88
|
+
* the old pattern playing, and return the error.
|
|
89
|
+
*/
|
|
90
|
+
export async function safeEvaluate(newCode, previousCode) {
|
|
91
|
+
try {
|
|
92
|
+
await evaluate(newCode);
|
|
93
|
+
return { success: true };
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
97
|
+
// Restore the previous pattern so music doesn't stop
|
|
98
|
+
if (previousCode) {
|
|
99
|
+
try {
|
|
100
|
+
await evaluate(previousCode);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Previous code also failed — nothing we can do
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return { success: false, error };
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export function hush() {
|
|
110
|
+
if (!repl)
|
|
111
|
+
return;
|
|
112
|
+
repl.scheduler.stop();
|
|
113
|
+
}
|
|
114
|
+
export function getContext() {
|
|
115
|
+
return audioContext;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/audio/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polyfill.d.ts","sourceRoot":"","sources":["../../src/audio/polyfill.ts"],"names":[],"mappings":"AAkIA,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// Audio polyfill — MUST be imported before any Strudel packages.
|
|
2
|
+
// Patches globalThis with Web Audio API from node-web-audio-api
|
|
3
|
+
// and stubs browser globals that Strudel/superdough expect.
|
|
4
|
+
import * as webAudio from 'node-web-audio-api';
|
|
5
|
+
// Assign all Web Audio API exports to globalThis
|
|
6
|
+
const g = globalThis;
|
|
7
|
+
for (const [key, value] of Object.entries(webAudio)) {
|
|
8
|
+
g[key] = value;
|
|
9
|
+
}
|
|
10
|
+
// Event target support for window/globalThis
|
|
11
|
+
const windowListeners = {};
|
|
12
|
+
if (!g.addEventListener) {
|
|
13
|
+
g.addEventListener = (type, fn) => {
|
|
14
|
+
(windowListeners[type] ??= []).push(fn);
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
if (!g.removeEventListener) {
|
|
18
|
+
g.removeEventListener = (type, fn) => {
|
|
19
|
+
const arr = windowListeners[type];
|
|
20
|
+
if (arr)
|
|
21
|
+
windowListeners[type] = arr.filter((f) => f !== fn);
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
if (!g.dispatchEvent) {
|
|
25
|
+
g.dispatchEvent = (event) => {
|
|
26
|
+
for (const fn of windowListeners[event.type] ?? [])
|
|
27
|
+
fn(event);
|
|
28
|
+
return true;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
// Stub browser globals that superdough/Strudel check for
|
|
32
|
+
if (typeof globalThis.window === 'undefined') {
|
|
33
|
+
g.window = globalThis;
|
|
34
|
+
}
|
|
35
|
+
if (typeof globalThis.document === 'undefined') {
|
|
36
|
+
const listeners = {};
|
|
37
|
+
g.document = {
|
|
38
|
+
createElement: () => ({}),
|
|
39
|
+
createElementNS: () => ({}),
|
|
40
|
+
addEventListener: (type, fn) => {
|
|
41
|
+
(listeners[type] ??= []).push(fn);
|
|
42
|
+
},
|
|
43
|
+
removeEventListener: (type, fn) => {
|
|
44
|
+
const arr = listeners[type];
|
|
45
|
+
if (arr)
|
|
46
|
+
listeners[type] = arr.filter((f) => f !== fn);
|
|
47
|
+
},
|
|
48
|
+
dispatchEvent: (event) => {
|
|
49
|
+
for (const fn of listeners[event.type] ?? [])
|
|
50
|
+
fn(event);
|
|
51
|
+
return true;
|
|
52
|
+
},
|
|
53
|
+
querySelector: () => null,
|
|
54
|
+
querySelectorAll: () => [],
|
|
55
|
+
body: { appendChild: () => { }, removeChild: () => { } },
|
|
56
|
+
head: { appendChild: () => { } },
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
if (typeof globalThis.CustomEvent === 'undefined') {
|
|
60
|
+
g.CustomEvent = class CustomEvent extends Event {
|
|
61
|
+
detail;
|
|
62
|
+
constructor(type, params) {
|
|
63
|
+
super(type);
|
|
64
|
+
this.detail = params?.detail;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (typeof globalThis.navigator === 'undefined') {
|
|
69
|
+
g.navigator = { userAgent: 'node' };
|
|
70
|
+
}
|
|
71
|
+
if (typeof globalThis.requestAnimationFrame === 'undefined') {
|
|
72
|
+
g.requestAnimationFrame = (cb) => setTimeout(cb, 16);
|
|
73
|
+
g.cancelAnimationFrame = (id) => clearTimeout(id);
|
|
74
|
+
}
|
|
75
|
+
// Stub AudioWorkletNode so that AudioWorklet-based effects (.shape(), .crush(),
|
|
76
|
+
// .coarse(), etc.) become silent passthroughs instead of throwing.
|
|
77
|
+
if (!g.AudioWorkletNode) {
|
|
78
|
+
g.AudioWorkletNode = class AudioWorkletNode {
|
|
79
|
+
connect() { return this; }
|
|
80
|
+
disconnect() { }
|
|
81
|
+
addEventListener() { }
|
|
82
|
+
removeEventListener() { }
|
|
83
|
+
get port() {
|
|
84
|
+
return { postMessage() { }, onmessage: null, addEventListener() { }, removeEventListener() { } };
|
|
85
|
+
}
|
|
86
|
+
get parameters() {
|
|
87
|
+
return new Map();
|
|
88
|
+
}
|
|
89
|
+
get numberOfInputs() { return 1; }
|
|
90
|
+
get numberOfOutputs() { return 1; }
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
// Patch AudioContext prototype with effects that superdough expects
|
|
94
|
+
const AudioCtx = webAudio.AudioContext;
|
|
95
|
+
if (!AudioCtx.prototype.createReverb) {
|
|
96
|
+
AudioCtx.prototype.createReverb = function () {
|
|
97
|
+
// Create a simple reverb using ConvolverNode with generated impulse
|
|
98
|
+
const convolver = this.createConvolver();
|
|
99
|
+
const sampleRate = this.sampleRate;
|
|
100
|
+
const length = sampleRate * 2; // 2 second reverb tail
|
|
101
|
+
const impulse = this.createBuffer(2, length, sampleRate);
|
|
102
|
+
for (let ch = 0; ch < 2; ch++) {
|
|
103
|
+
const data = impulse.getChannelData(ch);
|
|
104
|
+
for (let i = 0; i < length; i++) {
|
|
105
|
+
data[i] = (Math.random() * 2 - 1) * Math.pow(1 - i / length, 2);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
convolver.buffer = impulse;
|
|
109
|
+
return convolver;
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
if (!AudioCtx.prototype.createFeedbackDelay) {
|
|
113
|
+
AudioCtx.prototype.createFeedbackDelay = function (maxDelay = 1) {
|
|
114
|
+
const delay = this.createDelay(maxDelay);
|
|
115
|
+
const feedback = this.createGain();
|
|
116
|
+
feedback.gain.value = 0.3;
|
|
117
|
+
delay.connect(feedback);
|
|
118
|
+
feedback.connect(delay);
|
|
119
|
+
return Object.assign(delay, { feedback });
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=polyfill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polyfill.js","sourceRoot":"","sources":["../../src/audio/polyfill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeDisplay.d.ts","sourceRoot":"","sources":["../../src/components/CodeDisplay.tsx"],"names":[],"mappings":"AAGA,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,KAAqB,EAAE,EAAE,gBAAgB,kDAmB5E"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
export function CodeDisplay({ code, label = 'Now playing' }) {
|
|
4
|
+
if (!code)
|
|
5
|
+
return null;
|
|
6
|
+
// Truncate to fit terminal — show first ~15 lines
|
|
7
|
+
const lines = code.split('\n');
|
|
8
|
+
const shown = lines.slice(0, 15);
|
|
9
|
+
const truncated = lines.length > 15;
|
|
10
|
+
return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Text, { color: "magenta", bold: true, dimColor: true, children: ['── ', label, ' ──'] }), _jsxs(Box, { flexDirection: "column", paddingLeft: 1, children: [shown.map((line, i) => (_jsx(Text, { color: "gray", children: line }, i))), truncated && _jsxs(Text, { color: "gray", dimColor: true, children: [" ... (", lines.length - 15, " more lines)"] })] })] }));
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=CodeDisplay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeDisplay.js","sourceRoot":"","sources":["../../src/components/CodeDisplay.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAOhC,MAAM,UAAU,WAAW,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG,aAAa,EAAoB;IAC3E,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,kDAAkD;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;IAEpC,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACtC,MAAC,IAAI,IAAC,KAAK,EAAC,SAAS,EAAC,IAAI,QAAC,QAAQ,mBAAE,KAAK,EAAE,KAAK,EAAE,KAAK,IAAQ,EAChE,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAE,CAAC,aACvC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,KAAC,IAAI,IAAS,KAAK,EAAC,MAAM,YAAE,IAAI,IAArB,CAAC,CAA4B,CACzC,CAAC,EACD,SAAS,IAAI,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,8BAAS,KAAK,CAAC,MAAM,GAAG,EAAE,oBAAoB,IACnF,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DancingClaude.d.ts","sourceRoot":"","sources":["../../src/components/DancingClaude.tsx"],"names":[],"mappings":"AAIA,UAAU,kBAAkB;IAC1B,SAAS,EAAE,OAAO,CAAC;CACpB;AAOD,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,EAAE,kBAAkB,2CA4B9D"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { Box, Text } from 'ink';
|
|
4
|
+
import { bodyFrames, legFrames } from '../lib/ascii-frames.js';
|
|
5
|
+
function cellToChar(cell) {
|
|
6
|
+
// 1 = body block, 0/2/3 = space (eyes, mouth, empty are all transparent in terminal)
|
|
7
|
+
return cell === 1 ? '█' : ' ';
|
|
8
|
+
}
|
|
9
|
+
export function DancingClaude({ isPlaying }) {
|
|
10
|
+
const [frame, setFrame] = useState(0);
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
if (!isPlaying) {
|
|
13
|
+
setFrame(0);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const interval = setInterval(() => {
|
|
17
|
+
setFrame((f) => (f + 1) % 4);
|
|
18
|
+
}, 200);
|
|
19
|
+
return () => clearInterval(interval);
|
|
20
|
+
}, [isPlaying]);
|
|
21
|
+
const body = bodyFrames[frame];
|
|
22
|
+
const legs = legFrames[frame];
|
|
23
|
+
const allRows = [...body, ...legs];
|
|
24
|
+
return (_jsx(Box, { flexDirection: "column", alignItems: "center", children: allRows.map((row, i) => (_jsx(Text, { color: "cyan", children: row.map(cellToChar).join('') }, i))) }));
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=DancingClaude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DancingClaude.js","sourceRoot":"","sources":["../../src/components/DancingClaude.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAM/D,SAAS,UAAU,CAAC,IAAY;IAC9B,qFAAqF;IACrF,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAE,SAAS,EAAsB;IAC7D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEtC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,QAAQ,CAAC,CAAC,CAAC,CAAC;YACZ,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,CAAC,EAAE,GAAG,CAAC,CAAC;QACR,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAE9B,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;IAEnC,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,YAC5C,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CACvB,KAAC,IAAI,IAAS,KAAK,EAAC,MAAM,YACvB,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IADpB,CAAC,CAEL,CACR,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface HeaderProps {
|
|
2
|
+
isPlaying: boolean;
|
|
3
|
+
isStreaming: boolean;
|
|
4
|
+
audioInitialized: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function Header({ isPlaying, isStreaming, audioInitialized }: HeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=Header.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../src/components/Header.tsx"],"names":[],"mappings":"AAYA,UAAU,WAAW;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,MAAM,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,EAAE,WAAW,2CAuB/E"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
const BANNER = [
|
|
4
|
+
' ██████╗ ██╗ ██████╗██╗ █████╗ ██╗ ██╗██████╗ ███████╗',
|
|
5
|
+
' ██╔══██╗ ██║ ██╔════╝██║ ██╔══██╗██║ ██║██╔══██╗██╔════╝',
|
|
6
|
+
' ██║ ██║ ██║ ██║ ██║ ███████║██║ ██║██║ ██║█████╗',
|
|
7
|
+
' ██║ ██║██ ██║ ██║ ██║ ██╔══██║██║ ██║██║ ██║██╔══╝',
|
|
8
|
+
' ██████╔╝╚█████╔╝ ╚██████╗███████╗██║ ██║╚██████╔╝██████╔╝███████╗',
|
|
9
|
+
' ╚═════╝ ╚════╝ ╚═════╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚══════╝',
|
|
10
|
+
].join('\n');
|
|
11
|
+
export function Header({ isPlaying, isStreaming, audioInitialized }) {
|
|
12
|
+
let status = 'READY';
|
|
13
|
+
let statusColor = 'gray';
|
|
14
|
+
if (!audioInitialized) {
|
|
15
|
+
status = 'LOADING...';
|
|
16
|
+
statusColor = 'yellow';
|
|
17
|
+
}
|
|
18
|
+
else if (isStreaming) {
|
|
19
|
+
status = 'MIXING...';
|
|
20
|
+
statusColor = 'magenta';
|
|
21
|
+
}
|
|
22
|
+
else if (isPlaying) {
|
|
23
|
+
status = 'PLAYING';
|
|
24
|
+
statusColor = 'green';
|
|
25
|
+
}
|
|
26
|
+
return (_jsxs(Box, { flexDirection: "column", alignItems: "center", children: [_jsx(Text, { color: "cyan", children: BANNER }), _jsxs(Text, { children: [' ', "Status: ", _jsx(Text, { color: statusColor, bold: true, children: status })] })] }));
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=Header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Header.js","sourceRoot":"","sources":["../../src/components/Header.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,MAAM,MAAM,GAAG;IACb,wEAAwE;IACxE,wEAAwE;IACxE,sEAAsE;IACtE,sEAAsE;IACtE,wEAAwE;IACxE,wEAAwE;CACzE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAQb,MAAM,UAAU,MAAM,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAe;IAC9E,IAAI,MAAM,GAAG,OAAO,CAAC;IACrB,IAAI,WAAW,GAAW,MAAM,CAAC;IAEjC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,MAAM,GAAG,YAAY,CAAC;QACtB,WAAW,GAAG,QAAQ,CAAC;IACzB,CAAC;SAAM,IAAI,WAAW,EAAE,CAAC;QACvB,MAAM,GAAG,WAAW,CAAC;QACrB,WAAW,GAAG,SAAS,CAAC;IAC1B,CAAC;SAAM,IAAI,SAAS,EAAE,CAAC;QACrB,MAAM,GAAG,SAAS,CAAC;QACnB,WAAW,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,aAC7C,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,MAAM,GAAQ,EAClC,MAAC,IAAI,eACF,IAAI,cAAS,KAAC,IAAI,IAAC,KAAK,EAAE,WAAW,EAAE,IAAI,kBAAE,MAAM,GAAQ,IACvD,IACH,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface PromptInputProps {
|
|
2
|
+
value: string;
|
|
3
|
+
onChange: (value: string) => void;
|
|
4
|
+
onSubmit: (value: string) => void;
|
|
5
|
+
isDisabled: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function PromptInput({ value, onChange, onSubmit, isDisabled }: PromptInputProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=PromptInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PromptInput.d.ts","sourceRoot":"","sources":["../../src/components/PromptInput.tsx"],"names":[],"mappings":"AAIA,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,gBAAgB,2CAgBtF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import TextInput from 'ink-text-input';
|
|
4
|
+
export function PromptInput({ value, onChange, onSubmit, isDisabled }) {
|
|
5
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: isDisabled ? 'gray' : 'green', bold: true, children: '> ' }), isDisabled ? (_jsx(Text, { color: "gray", children: "Mixing..." })) : (_jsx(TextInput, { value: value, onChange: onChange, onSubmit: onSubmit, placeholder: "What do you want to hear?" }))] }));
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=PromptInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PromptInput.js","sourceRoot":"","sources":["../../src/components/PromptInput.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,SAAS,MAAM,gBAAgB,CAAC;AASvC,MAAM,UAAU,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAoB;IACrF,OAAO,CACL,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,kBAAE,IAAI,GAAQ,EAC7D,UAAU,CAAC,CAAC,CAAC,CACZ,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,0BAAiB,CACpC,CAAC,CAAC,CAAC,CACF,KAAC,SAAS,IACR,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAC,2BAA2B,GACvC,CACH,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpeechBubble.d.ts","sourceRoot":"","sources":["../../src/components/SpeechBubble.tsx"],"names":[],"mappings":"AAGA,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,EAAE,iBAAiB,kDAgCvD"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
export function SpeechBubble({ text }) {
|
|
4
|
+
if (!text)
|
|
5
|
+
return null;
|
|
6
|
+
const maxWidth = 60;
|
|
7
|
+
const lines = [];
|
|
8
|
+
const words = text.split(' ');
|
|
9
|
+
let current = '';
|
|
10
|
+
for (const word of words) {
|
|
11
|
+
if (current.length + word.length + 1 > maxWidth - 4) {
|
|
12
|
+
lines.push(current);
|
|
13
|
+
current = word;
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
current = current ? `${current} ${word}` : word;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
if (current)
|
|
20
|
+
lines.push(current);
|
|
21
|
+
const contentWidth = Math.max(...lines.map((l) => l.length), 10);
|
|
22
|
+
const border = '─'.repeat(contentWidth + 2);
|
|
23
|
+
return (_jsxs(Box, { flexDirection: "column", alignItems: "center", children: [_jsx(Text, { color: "yellow", children: '╭' + border + '╮' }), lines.map((line, i) => (_jsxs(Text, { color: "yellow", children: ['│ ', line.padEnd(contentWidth), ' │'] }, i))), _jsx(Text, { color: "yellow", children: '╰' + border + '╯' })] }));
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=SpeechBubble.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpeechBubble.js","sourceRoot":"","sources":["../../src/components/SpeechBubble.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAMhC,MAAM,UAAU,YAAY,CAAC,EAAE,IAAI,EAAqB;IACtD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;YACpD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAClD,CAAC;IACH,CAAC;IACD,IAAI,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEjC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;IAE5C,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,aAC7C,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,YAAE,GAAG,GAAG,MAAM,GAAG,GAAG,GAAQ,EAC/C,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,MAAC,IAAI,IAAS,KAAK,EAAC,QAAQ,aACzB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,IAAI,KAD7B,CAAC,CAEL,CACR,CAAC,EACF,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,YAAE,GAAG,GAAG,MAAM,GAAG,GAAG,GAAQ,IAC5C,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../../src/components/StatusBar.tsx"],"names":[],"mappings":"AAGA,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,cAAc,2CAelD"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
export function StatusBar({ error }) {
|
|
4
|
+
return (_jsxs(Box, { flexDirection: "column", children: [error && (_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { color: "red", children: ["Error: ", error] }) })), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: "[Enter] submit [q] quit [Esc] pause [r] revert" }) })] }));
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=StatusBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusBar.js","sourceRoot":"","sources":["../../src/components/StatusBar.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAMhC,MAAM,UAAU,SAAS,CAAC,EAAE,KAAK,EAAkB;IACjD,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACxB,KAAK,IAAI,CACR,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,MAAC,IAAI,IAAC,KAAK,EAAC,KAAK,wBAAS,KAAK,IAAQ,GACnC,CACP,EACD,KAAC,GAAG,cACF,KAAC,IAAI,IAAC,QAAQ,wEAEP,GACH,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headless.d.ts","sourceRoot":"","sources":["../src/headless.ts"],"names":[],"mappings":"AAQA,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCpF"}
|