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.
Files changed (87) hide show
  1. package/bin.mjs +24 -0
  2. package/dist/App.d.ts +6 -0
  3. package/dist/App.d.ts.map +1 -0
  4. package/dist/App.js +64 -0
  5. package/dist/App.js.map +1 -0
  6. package/dist/audio/engine.d.ts +15 -0
  7. package/dist/audio/engine.d.ts.map +1 -0
  8. package/dist/audio/engine.js +117 -0
  9. package/dist/audio/engine.js.map +1 -0
  10. package/dist/audio/polyfill.d.ts +2 -0
  11. package/dist/audio/polyfill.d.ts.map +1 -0
  12. package/dist/audio/polyfill.js +122 -0
  13. package/dist/audio/polyfill.js.map +1 -0
  14. package/dist/components/CodeDisplay.d.ts +7 -0
  15. package/dist/components/CodeDisplay.d.ts.map +1 -0
  16. package/dist/components/CodeDisplay.js +12 -0
  17. package/dist/components/CodeDisplay.js.map +1 -0
  18. package/dist/components/DancingClaude.d.ts +6 -0
  19. package/dist/components/DancingClaude.d.ts.map +1 -0
  20. package/dist/components/DancingClaude.js +26 -0
  21. package/dist/components/DancingClaude.js.map +1 -0
  22. package/dist/components/Header.d.ts +8 -0
  23. package/dist/components/Header.d.ts.map +1 -0
  24. package/dist/components/Header.js +28 -0
  25. package/dist/components/Header.js.map +1 -0
  26. package/dist/components/PromptInput.d.ts +9 -0
  27. package/dist/components/PromptInput.d.ts.map +1 -0
  28. package/dist/components/PromptInput.js +7 -0
  29. package/dist/components/PromptInput.js.map +1 -0
  30. package/dist/components/SpeechBubble.d.ts +6 -0
  31. package/dist/components/SpeechBubble.d.ts.map +1 -0
  32. package/dist/components/SpeechBubble.js +25 -0
  33. package/dist/components/SpeechBubble.js.map +1 -0
  34. package/dist/components/StatusBar.d.ts +6 -0
  35. package/dist/components/StatusBar.d.ts.map +1 -0
  36. package/dist/components/StatusBar.js +6 -0
  37. package/dist/components/StatusBar.js.map +1 -0
  38. package/dist/headless.d.ts +2 -0
  39. package/dist/headless.d.ts.map +1 -0
  40. package/dist/headless.js +37 -0
  41. package/dist/headless.js.map +1 -0
  42. package/dist/index.d.ts +2 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +9 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/lib/ascii-frames.d.ts +3 -0
  47. package/dist/lib/ascii-frames.d.ts.map +1 -0
  48. package/dist/lib/ascii-frames.js +82 -0
  49. package/dist/lib/ascii-frames.js.map +1 -0
  50. package/dist/lib/claude.d.ts +3 -0
  51. package/dist/lib/claude.d.ts.map +1 -0
  52. package/dist/lib/claude.js +44 -0
  53. package/dist/lib/claude.js.map +1 -0
  54. package/dist/lib/config.d.ts +3 -0
  55. package/dist/lib/config.d.ts.map +1 -0
  56. package/dist/lib/config.js +27 -0
  57. package/dist/lib/config.js.map +1 -0
  58. package/dist/lib/parseCode.d.ts +8 -0
  59. package/dist/lib/parseCode.d.ts.map +1 -0
  60. package/dist/lib/parseCode.js +94 -0
  61. package/dist/lib/parseCode.js.map +1 -0
  62. package/dist/lib/prompts.d.ts +2 -0
  63. package/dist/lib/prompts.d.ts.map +1 -0
  64. package/dist/lib/prompts.js +221 -0
  65. package/dist/lib/prompts.js.map +1 -0
  66. package/dist/lib/reducer.d.ts +4 -0
  67. package/dist/lib/reducer.d.ts.map +1 -0
  68. package/dist/lib/reducer.js +79 -0
  69. package/dist/lib/reducer.js.map +1 -0
  70. package/dist/lib/session.d.ts +4 -0
  71. package/dist/lib/session.d.ts.map +1 -0
  72. package/dist/lib/session.js +45 -0
  73. package/dist/lib/session.js.map +1 -0
  74. package/dist/lib/types.d.ts +49 -0
  75. package/dist/lib/types.d.ts.map +1 -0
  76. package/dist/lib/types.js +2 -0
  77. package/dist/lib/types.js.map +1 -0
  78. package/dist/mcp/server.d.ts +2 -0
  79. package/dist/mcp/server.d.ts.map +1 -0
  80. package/dist/mcp/server.js +166 -0
  81. package/dist/mcp/server.js.map +1 -0
  82. package/dist/mcp/state.d.ts +16 -0
  83. package/dist/mcp/state.d.ts.map +1 -0
  84. package/dist/mcp/state.js +32 -0
  85. package/dist/mcp/state.js.map +1 -0
  86. package/mcp.mjs +15 -0
  87. 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,6 @@
1
+ interface AppProps {
2
+ apiKey: string;
3
+ }
4
+ export declare function App({ apiKey }: AppProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=App.d.ts.map
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=polyfill.d.ts.map
@@ -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,7 @@
1
+ interface CodeDisplayProps {
2
+ code: string;
3
+ label?: string;
4
+ }
5
+ export declare function CodeDisplay({ code, label }: CodeDisplayProps): import("react/jsx-runtime").JSX.Element | null;
6
+ export {};
7
+ //# sourceMappingURL=CodeDisplay.d.ts.map
@@ -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,6 @@
1
+ interface DancingClaudeProps {
2
+ isPlaying: boolean;
3
+ }
4
+ export declare function DancingClaude({ isPlaying }: DancingClaudeProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=DancingClaude.d.ts.map
@@ -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,6 @@
1
+ interface SpeechBubbleProps {
2
+ text: string;
3
+ }
4
+ export declare function SpeechBubble({ text }: SpeechBubbleProps): import("react/jsx-runtime").JSX.Element | null;
5
+ export {};
6
+ //# sourceMappingURL=SpeechBubble.d.ts.map
@@ -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,6 @@
1
+ interface StatusBarProps {
2
+ error?: string | null;
3
+ }
4
+ export declare function StatusBar({ error }: StatusBarProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=StatusBar.d.ts.map
@@ -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,2 @@
1
+ export declare function runHeadless(prompt: string, durationSec: number): Promise<void>;
2
+ //# sourceMappingURL=headless.d.ts.map
@@ -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"}