wiggum-cli 0.8.0 → 0.9.1
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/dist/ai/conversation/conversation-manager.d.ts +11 -0
- package/dist/ai/conversation/conversation-manager.d.ts.map +1 -1
- package/dist/ai/conversation/conversation-manager.js +14 -0
- package/dist/ai/conversation/conversation-manager.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/new.d.ts +2 -0
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +63 -22
- package/dist/commands/new.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +97 -22
- package/dist/index.js.map +1 -1
- package/dist/tui/app.d.ts +46 -36
- package/dist/tui/app.d.ts.map +1 -1
- package/dist/tui/app.js +136 -37
- package/dist/tui/app.js.map +1 -1
- package/dist/tui/components/WiggumBanner.d.ts +30 -0
- package/dist/tui/components/WiggumBanner.d.ts.map +1 -0
- package/dist/tui/components/WiggumBanner.js +34 -0
- package/dist/tui/components/WiggumBanner.js.map +1 -0
- package/dist/tui/demo.d.ts +8 -0
- package/dist/tui/demo.d.ts.map +1 -0
- package/dist/tui/demo.js +69 -0
- package/dist/tui/demo.js.map +1 -0
- package/dist/tui/hooks/useSpecGenerator.d.ts +16 -0
- package/dist/tui/hooks/useSpecGenerator.d.ts.map +1 -1
- package/dist/tui/hooks/useSpecGenerator.js +47 -0
- package/dist/tui/hooks/useSpecGenerator.js.map +1 -1
- package/dist/tui/orchestration/index.d.ts +6 -0
- package/dist/tui/orchestration/index.d.ts.map +1 -0
- package/dist/tui/orchestration/index.js +6 -0
- package/dist/tui/orchestration/index.js.map +1 -0
- package/dist/tui/orchestration/interview-orchestrator.d.ts +136 -0
- package/dist/tui/orchestration/interview-orchestrator.d.ts.map +1 -0
- package/dist/tui/orchestration/interview-orchestrator.js +437 -0
- package/dist/tui/orchestration/interview-orchestrator.js.map +1 -0
- package/dist/tui/screens/InitScreen.d.ts +26 -0
- package/dist/tui/screens/InitScreen.d.ts.map +1 -0
- package/dist/tui/screens/InitScreen.js +30 -0
- package/dist/tui/screens/InitScreen.js.map +1 -0
- package/dist/tui/screens/InterviewScreen.d.ts +2 -13
- package/dist/tui/screens/InterviewScreen.d.ts.map +1 -1
- package/dist/tui/screens/InterviewScreen.js +162 -34
- package/dist/tui/screens/InterviewScreen.js.map +1 -1
- package/dist/tui/screens/MainShell.d.ts +46 -0
- package/dist/tui/screens/MainShell.d.ts.map +1 -0
- package/dist/tui/screens/MainShell.js +196 -0
- package/dist/tui/screens/MainShell.js.map +1 -0
- package/dist/tui/screens/WelcomeScreen.d.ts +45 -0
- package/dist/tui/screens/WelcomeScreen.d.ts.map +1 -0
- package/dist/tui/screens/WelcomeScreen.js +56 -0
- package/dist/tui/screens/WelcomeScreen.js.map +1 -0
- package/dist/tui/theme.d.ts +4 -0
- package/dist/tui/theme.d.ts.map +1 -1
- package/dist/tui/theme.js +4 -0
- package/dist/tui/theme.js.map +1 -1
- package/dist/utils/repl-prompts.d.ts +1 -1
- package/dist/utils/repl-prompts.d.ts.map +1 -1
- package/dist/utils/repl-prompts.js +77 -22
- package/dist/utils/repl-prompts.js.map +1 -1
- package/package.json +1 -1
- package/src/ai/conversation/conversation-manager.ts +22 -0
- package/src/cli.ts +4 -0
- package/src/commands/new.ts +79 -27
- package/src/index.ts +109 -27
- package/src/tui/app.tsx +222 -63
- package/src/tui/components/WiggumBanner.tsx +66 -0
- package/src/tui/demo.tsx +111 -0
- package/src/tui/hooks/useSpecGenerator.ts +73 -0
- package/src/tui/orchestration/index.ts +10 -0
- package/src/tui/orchestration/interview-orchestrator.ts +559 -0
- package/src/tui/screens/InitScreen.tsx +63 -0
- package/src/tui/screens/InterviewScreen.tsx +201 -46
- package/src/tui/screens/MainShell.tsx +290 -0
- package/src/tui/screens/WelcomeScreen.tsx +141 -0
- package/src/tui/theme.ts +4 -0
- package/src/utils/repl-prompts.ts +83 -25
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interview-orchestrator.js","sourceRoot":"","sources":["../../../src/tui/orchestration/interview-orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InitScreen - Screen for the /init command workflow
|
|
3
|
+
*
|
|
4
|
+
* Handles project initialization within the TUI context.
|
|
5
|
+
* Since the init workflow uses readline-based prompts, this screen
|
|
6
|
+
* signals that init should run outside of Ink.
|
|
7
|
+
*/
|
|
8
|
+
import React from 'react';
|
|
9
|
+
/**
|
|
10
|
+
* Props for the InitScreen component
|
|
11
|
+
*/
|
|
12
|
+
export interface InitScreenProps {
|
|
13
|
+
/** Called to trigger the init workflow (runs outside Ink) */
|
|
14
|
+
onRunInit: () => void;
|
|
15
|
+
/** Called when user cancels */
|
|
16
|
+
onCancel: () => void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* InitScreen component
|
|
20
|
+
*
|
|
21
|
+
* Displays a message and triggers the init workflow.
|
|
22
|
+
* The actual init workflow runs outside of Ink because it uses
|
|
23
|
+
* readline-based interactive prompts.
|
|
24
|
+
*/
|
|
25
|
+
export declare function InitScreen({ onRunInit, onCancel: _onCancel, }: InitScreenProps): React.ReactElement;
|
|
26
|
+
//# sourceMappingURL=InitScreen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InitScreen.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/InitScreen.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAoB,MAAM,OAAO,CAAC;AAIzC;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,6DAA6D;IAC7D,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EACzB,SAAS,EACT,QAAQ,EAAE,SAAS,GACpB,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CA8BtC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* InitScreen - Screen for the /init command workflow
|
|
4
|
+
*
|
|
5
|
+
* Handles project initialization within the TUI context.
|
|
6
|
+
* Since the init workflow uses readline-based prompts, this screen
|
|
7
|
+
* signals that init should run outside of Ink.
|
|
8
|
+
*/
|
|
9
|
+
import { useEffect } from 'react';
|
|
10
|
+
import { Box, Text } from 'ink';
|
|
11
|
+
import { colors } from '../theme.js';
|
|
12
|
+
/**
|
|
13
|
+
* InitScreen component
|
|
14
|
+
*
|
|
15
|
+
* Displays a message and triggers the init workflow.
|
|
16
|
+
* The actual init workflow runs outside of Ink because it uses
|
|
17
|
+
* readline-based interactive prompts.
|
|
18
|
+
*/
|
|
19
|
+
export function InitScreen({ onRunInit, onCancel: _onCancel, }) {
|
|
20
|
+
// Trigger init workflow on mount
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
// Small delay to allow the screen to render before unmounting
|
|
23
|
+
const timer = setTimeout(() => {
|
|
24
|
+
onRunInit();
|
|
25
|
+
}, 100);
|
|
26
|
+
return () => clearTimeout(timer);
|
|
27
|
+
}, [onRunInit]);
|
|
28
|
+
return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: colors.yellow, bold: true, children: "Initializing Project" }) }), _jsx(Box, { marginBottom: 1, children: _jsx(Text, { children: "Starting initialization workflow..." }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: "Press Ctrl+C to cancel" }) })] }));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=InitScreen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InitScreen.js","sourceRoot":"","sources":["../../../src/tui/screens/InitScreen.tsx"],"names":[],"mappings":";AAAA;;;;;;GAMG;AAEH,OAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAYrC;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,EACzB,SAAS,EACT,QAAQ,EAAE,SAAS,GACH;IAChB,iCAAiC;IACjC,SAAS,CAAC,GAAG,EAAE;QACb,8DAA8D;QAC9D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,SAAS,EAAE,CAAC;QACd,CAAC,EAAE,GAAG,CAAC,CAAC;QAER,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,aACpC,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,2CAEzB,GACH,EAEN,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,KAAC,IAAI,sDAA2C,GAC5C,EAEN,KAAC,GAAG,cACF,KAAC,IAAI,IAAC,QAAQ,6CAEP,GACH,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -37,19 +37,8 @@ export interface InterviewScreenProps {
|
|
|
37
37
|
* components (PhaseHeader, MessageList, WorkingIndicator, ChatInput) to
|
|
38
38
|
* create the complete interview experience.
|
|
39
39
|
*
|
|
40
|
-
* Uses the useSpecGenerator hook
|
|
41
|
-
*
|
|
42
|
-
* @example
|
|
43
|
-
* ```tsx
|
|
44
|
-
* <InterviewScreen
|
|
45
|
-
* featureName="user-auth"
|
|
46
|
-
* projectRoot="/path/to/project"
|
|
47
|
-
* provider="anthropic"
|
|
48
|
-
* model="claude-sonnet-4-5-20250514"
|
|
49
|
-
* onComplete={(spec) => writeSpec(spec)}
|
|
50
|
-
* onCancel={() => process.exit(0)}
|
|
51
|
-
* />
|
|
52
|
-
* ```
|
|
40
|
+
* Uses the useSpecGenerator hook for state and InterviewOrchestrator
|
|
41
|
+
* to bridge to the AI conversation.
|
|
53
42
|
*/
|
|
54
43
|
export declare function InterviewScreen({ featureName, projectRoot, provider, model, scanResult, onComplete, onCancel, }: InterviewScreenProps): React.ReactElement;
|
|
55
44
|
//# sourceMappingURL=InterviewScreen.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InterviewScreen.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/InterviewScreen.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"InterviewScreen.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/InterviewScreen.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAyC,MAAM,OAAO,CAAC;AAE9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAczD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,QAAQ,EAAE,UAAU,CAAC;IACrB,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,8CAA8C;IAC9C,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,EAC9B,WAAW,EACX,WAAW,EACX,QAAQ,EACR,KAAK,EACL,UAAU,EACV,UAAU,EACV,QAAQ,GACT,EAAE,oBAAoB,GAAG,KAAK,CAAC,YAAY,CA4P3C"}
|
|
@@ -9,13 +9,15 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
9
9
|
* 3. Interview - Clarifying questions
|
|
10
10
|
* 4. Generation - Generate the specification
|
|
11
11
|
*/
|
|
12
|
-
import { useEffect, useCallback } from 'react';
|
|
13
|
-
import { Box, useInput } from 'ink';
|
|
12
|
+
import { useEffect, useCallback, useRef } from 'react';
|
|
13
|
+
import { Box, Text, useInput } from 'ink';
|
|
14
14
|
import { PhaseHeader } from '../components/PhaseHeader.js';
|
|
15
15
|
import { MessageList } from '../components/MessageList.js';
|
|
16
16
|
import { WorkingIndicator } from '../components/WorkingIndicator.js';
|
|
17
17
|
import { ChatInput } from '../components/ChatInput.js';
|
|
18
18
|
import { useSpecGenerator, PHASE_CONFIGS, TOTAL_DISPLAY_PHASES, } from '../hooks/useSpecGenerator.js';
|
|
19
|
+
import { InterviewOrchestrator } from '../orchestration/interview-orchestrator.js';
|
|
20
|
+
import { colors } from '../theme.js';
|
|
19
21
|
/**
|
|
20
22
|
* InterviewScreen component
|
|
21
23
|
*
|
|
@@ -23,41 +25,155 @@ import { useSpecGenerator, PHASE_CONFIGS, TOTAL_DISPLAY_PHASES, } from '../hooks
|
|
|
23
25
|
* components (PhaseHeader, MessageList, WorkingIndicator, ChatInput) to
|
|
24
26
|
* create the complete interview experience.
|
|
25
27
|
*
|
|
26
|
-
* Uses the useSpecGenerator hook
|
|
27
|
-
*
|
|
28
|
-
* @example
|
|
29
|
-
* ```tsx
|
|
30
|
-
* <InterviewScreen
|
|
31
|
-
* featureName="user-auth"
|
|
32
|
-
* projectRoot="/path/to/project"
|
|
33
|
-
* provider="anthropic"
|
|
34
|
-
* model="claude-sonnet-4-5-20250514"
|
|
35
|
-
* onComplete={(spec) => writeSpec(spec)}
|
|
36
|
-
* onCancel={() => process.exit(0)}
|
|
37
|
-
* />
|
|
38
|
-
* ```
|
|
28
|
+
* Uses the useSpecGenerator hook for state and InterviewOrchestrator
|
|
29
|
+
* to bridge to the AI conversation.
|
|
39
30
|
*/
|
|
40
31
|
export function InterviewScreen({ featureName, projectRoot, provider, model, scanResult, onComplete, onCancel, }) {
|
|
41
|
-
const { state,
|
|
42
|
-
//
|
|
32
|
+
const { state, initialize, addMessage, updateStreamingMessage, completeStreamingMessage, startToolCall, completeToolCall, setPhase, setGeneratedSpec, setError, setWorking, setReady, } = useSpecGenerator();
|
|
33
|
+
// Track orchestrator instance
|
|
34
|
+
const orchestratorRef = useRef(null);
|
|
35
|
+
// Track if we're in streaming mode for the current message
|
|
36
|
+
const isStreamingRef = useRef(false);
|
|
37
|
+
const streamContentRef = useRef('');
|
|
38
|
+
// Track if component is unmounted to prevent callbacks after cleanup
|
|
39
|
+
const isCancelledRef = useRef(false);
|
|
40
|
+
// Use refs for callbacks to avoid stale closures and unnecessary effect re-runs
|
|
41
|
+
const onCompleteRef = useRef(onComplete);
|
|
42
|
+
onCompleteRef.current = onComplete;
|
|
43
|
+
// Initialize the orchestrator when the component mounts
|
|
43
44
|
useEffect(() => {
|
|
45
|
+
// Reset cancelled flag on mount
|
|
46
|
+
isCancelledRef.current = false;
|
|
47
|
+
// Initialize hook state
|
|
44
48
|
initialize({
|
|
45
49
|
featureName,
|
|
46
50
|
projectRoot,
|
|
47
51
|
provider,
|
|
48
52
|
model,
|
|
49
53
|
});
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
54
|
+
// Create orchestrator with callbacks that check for cancellation
|
|
55
|
+
const orchestrator = new InterviewOrchestrator({
|
|
56
|
+
featureName,
|
|
57
|
+
projectRoot,
|
|
58
|
+
provider,
|
|
59
|
+
model,
|
|
60
|
+
scanResult,
|
|
61
|
+
onMessage: (role, content) => {
|
|
62
|
+
if (isCancelledRef.current)
|
|
63
|
+
return;
|
|
64
|
+
addMessage(role, content);
|
|
65
|
+
},
|
|
66
|
+
onStreamChunk: (chunk) => {
|
|
67
|
+
if (isCancelledRef.current)
|
|
68
|
+
return;
|
|
69
|
+
if (!isStreamingRef.current) {
|
|
70
|
+
// Start a new streaming message
|
|
71
|
+
isStreamingRef.current = true;
|
|
72
|
+
streamContentRef.current = chunk;
|
|
73
|
+
addMessage('assistant', chunk);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// Append to existing streaming content
|
|
77
|
+
streamContentRef.current += chunk;
|
|
78
|
+
updateStreamingMessage(streamContentRef.current);
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
onStreamComplete: () => {
|
|
82
|
+
if (isCancelledRef.current)
|
|
83
|
+
return;
|
|
84
|
+
if (isStreamingRef.current) {
|
|
85
|
+
completeStreamingMessage();
|
|
86
|
+
isStreamingRef.current = false;
|
|
87
|
+
streamContentRef.current = '';
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
onToolStart: (toolName, input) => {
|
|
91
|
+
if (isCancelledRef.current)
|
|
92
|
+
return '';
|
|
93
|
+
return startToolCall(toolName, input);
|
|
94
|
+
},
|
|
95
|
+
onToolEnd: (toolId, output, error) => {
|
|
96
|
+
if (isCancelledRef.current)
|
|
97
|
+
return;
|
|
98
|
+
completeToolCall(toolId, output, error);
|
|
99
|
+
},
|
|
100
|
+
onPhaseChange: (phase) => {
|
|
101
|
+
if (isCancelledRef.current)
|
|
102
|
+
return;
|
|
103
|
+
setPhase(phase);
|
|
104
|
+
},
|
|
105
|
+
onComplete: (spec) => {
|
|
106
|
+
if (isCancelledRef.current)
|
|
107
|
+
return;
|
|
108
|
+
setGeneratedSpec(spec);
|
|
109
|
+
// Use ref to avoid stale closure
|
|
110
|
+
onCompleteRef.current(spec);
|
|
111
|
+
},
|
|
112
|
+
onError: (error) => {
|
|
113
|
+
if (isCancelledRef.current)
|
|
114
|
+
return;
|
|
115
|
+
setError(error);
|
|
116
|
+
},
|
|
117
|
+
onWorkingChange: (isWorking, status) => {
|
|
118
|
+
if (isCancelledRef.current)
|
|
119
|
+
return;
|
|
120
|
+
setWorking(isWorking, status);
|
|
121
|
+
},
|
|
122
|
+
onReady: () => {
|
|
123
|
+
if (isCancelledRef.current)
|
|
124
|
+
return;
|
|
125
|
+
setReady();
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
orchestratorRef.current = orchestrator;
|
|
129
|
+
// Start the orchestrator
|
|
130
|
+
orchestrator.start();
|
|
131
|
+
// Cleanup: mark as cancelled to prevent callbacks after unmount
|
|
132
|
+
return () => {
|
|
133
|
+
isCancelledRef.current = true;
|
|
134
|
+
orchestratorRef.current = null;
|
|
135
|
+
};
|
|
136
|
+
}, [featureName, projectRoot, provider, model, scanResult]);
|
|
137
|
+
// Handle user input submission based on current phase
|
|
58
138
|
const handleSubmit = useCallback(async (value) => {
|
|
59
|
-
|
|
60
|
-
|
|
139
|
+
const orchestrator = orchestratorRef.current;
|
|
140
|
+
if (!orchestrator)
|
|
141
|
+
return;
|
|
142
|
+
// Add user message to display
|
|
143
|
+
if (value) {
|
|
144
|
+
addMessage('user', value);
|
|
145
|
+
}
|
|
146
|
+
const currentPhase = orchestrator.getPhase();
|
|
147
|
+
switch (currentPhase) {
|
|
148
|
+
case 'context':
|
|
149
|
+
if (value) {
|
|
150
|
+
// User entered a reference URL/path
|
|
151
|
+
await orchestrator.addReference(value);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
// Empty input = done with context, advance to goals
|
|
155
|
+
await orchestrator.advanceToGoals();
|
|
156
|
+
}
|
|
157
|
+
break;
|
|
158
|
+
case 'goals':
|
|
159
|
+
// User entered their goals
|
|
160
|
+
await orchestrator.submitGoals(value);
|
|
161
|
+
break;
|
|
162
|
+
case 'interview':
|
|
163
|
+
if (value.toLowerCase() === 'done' || value.toLowerCase() === 'skip') {
|
|
164
|
+
// Skip to generation
|
|
165
|
+
await orchestrator.skipToGeneration();
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
// Submit answer
|
|
169
|
+
await orchestrator.submitAnswer(value);
|
|
170
|
+
}
|
|
171
|
+
break;
|
|
172
|
+
default:
|
|
173
|
+
// In generation or complete phase, ignore input
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
}, [addMessage]);
|
|
61
177
|
// Handle keyboard input for Escape key
|
|
62
178
|
useInput((input, key) => {
|
|
63
179
|
if (key.escape) {
|
|
@@ -67,18 +183,30 @@ export function InterviewScreen({ featureName, projectRoot, provider, model, sca
|
|
|
67
183
|
// Get current phase configuration
|
|
68
184
|
const phaseConfig = PHASE_CONFIGS[state.phase];
|
|
69
185
|
// Determine if input should be disabled
|
|
70
|
-
|
|
71
|
-
const inputDisabled = !state.awaitingInput || state.isWorking;
|
|
186
|
+
const inputDisabled = !state.awaitingInput || state.isWorking || state.phase === 'complete';
|
|
72
187
|
// Build the working indicator state
|
|
73
188
|
const workingState = {
|
|
74
189
|
isWorking: state.isWorking,
|
|
75
190
|
status: state.workingStatus,
|
|
76
191
|
hint: 'esc to cancel',
|
|
77
192
|
};
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
193
|
+
// Get placeholder text based on phase
|
|
194
|
+
const getPlaceholder = () => {
|
|
195
|
+
switch (state.phase) {
|
|
196
|
+
case 'context':
|
|
197
|
+
return 'Enter URL or file path, or press Enter to continue...';
|
|
198
|
+
case 'goals':
|
|
199
|
+
return 'Describe what you want to build...';
|
|
200
|
+
case 'interview':
|
|
201
|
+
return 'Type your response (or "done" to generate spec)...';
|
|
202
|
+
case 'generation':
|
|
203
|
+
return 'Generating specification...';
|
|
204
|
+
case 'complete':
|
|
205
|
+
return 'Specification complete!';
|
|
206
|
+
default:
|
|
207
|
+
return 'Type your response...';
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(PhaseHeader, { currentPhase: phaseConfig.number, totalPhases: TOTAL_DISPLAY_PHASES, phaseName: phaseConfig.name }), state.error && (_jsx(Box, { marginY: 1, children: _jsxs(Text, { color: "red", children: ["Error: ", state.error] }) })), _jsx(Box, { marginY: 1, children: _jsx(MessageList, { messages: state.messages }) }), state.isWorking && (_jsx(Box, { marginY: 1, children: _jsx(WorkingIndicator, { state: workingState }) })), state.phase === 'complete' && (_jsx(Box, { marginY: 1, children: _jsx(Text, { color: colors.green, children: "Specification generated successfully!" }) })), state.phase !== 'complete' && (_jsx(Box, { marginTop: 1, children: _jsx(ChatInput, { onSubmit: handleSubmit, disabled: inputDisabled, allowEmpty: state.phase === 'context', placeholder: getPlaceholder() }) }))] }));
|
|
83
211
|
}
|
|
84
212
|
//# sourceMappingURL=InterviewScreen.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InterviewScreen.js","sourceRoot":"","sources":["../../../src/tui/screens/InterviewScreen.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;AAEH,OAAc,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"InterviewScreen.js","sourceRoot":"","sources":["../../../src/tui/screens/InterviewScreen.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MainShell - Ink-based REPL replacement
|
|
3
|
+
*
|
|
4
|
+
* The main interactive shell for Wiggum CLI, replacing the readline REPL.
|
|
5
|
+
* Handles slash commands and provides navigation to other screens.
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import type { SessionState } from '../../repl/session-state.js';
|
|
9
|
+
/**
|
|
10
|
+
* Navigation targets for the shell
|
|
11
|
+
*/
|
|
12
|
+
export type NavigationTarget = 'welcome' | 'shell' | 'interview' | 'init';
|
|
13
|
+
/**
|
|
14
|
+
* Navigation props passed to target screens
|
|
15
|
+
*/
|
|
16
|
+
export interface NavigationProps {
|
|
17
|
+
featureName?: string;
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Props for MainShell component
|
|
22
|
+
*/
|
|
23
|
+
export interface MainShellProps {
|
|
24
|
+
/** Current session state */
|
|
25
|
+
sessionState: SessionState;
|
|
26
|
+
/** Called when navigating to another screen */
|
|
27
|
+
onNavigate: (target: NavigationTarget, props?: NavigationProps) => void;
|
|
28
|
+
/** Called when session state changes */
|
|
29
|
+
onSessionStateChange?: (state: SessionState) => void;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* MainShell component
|
|
33
|
+
*
|
|
34
|
+
* The main interactive shell that handles slash commands and navigation.
|
|
35
|
+
* Replaces the readline-based REPL with an Ink-powered TUI.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```tsx
|
|
39
|
+
* <MainShell
|
|
40
|
+
* sessionState={state}
|
|
41
|
+
* onNavigate={(target, props) => setScreen(target, props)}
|
|
42
|
+
* />
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare function MainShell({ sessionState, onNavigate, }: MainShellProps): React.ReactElement;
|
|
46
|
+
//# sourceMappingURL=MainShell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MainShell.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/MainShell.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAgC,MAAM,OAAO,CAAC;AAWrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4BAA4B;IAC5B,YAAY,EAAE,YAAY,CAAC;IAC3B,+CAA+C;IAC/C,UAAU,EAAE,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;IACxE,wCAAwC;IACxC,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;CACtD;AASD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,EACxB,YAAY,EACZ,UAAU,GACX,EAAE,cAAc,GAAG,KAAK,CAAC,YAAY,CA4NrC"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* MainShell - Ink-based REPL replacement
|
|
4
|
+
*
|
|
5
|
+
* The main interactive shell for Wiggum CLI, replacing the readline REPL.
|
|
6
|
+
* Handles slash commands and provides navigation to other screens.
|
|
7
|
+
*/
|
|
8
|
+
import { useState, useCallback } from 'react';
|
|
9
|
+
import { Box, Text, useInput, useApp } from 'ink';
|
|
10
|
+
import { MessageList } from '../components/MessageList.js';
|
|
11
|
+
import { ChatInput } from '../components/ChatInput.js';
|
|
12
|
+
import { colors } from '../theme.js';
|
|
13
|
+
import { parseInput, resolveCommandAlias, formatHelpText, } from '../../repl/command-parser.js';
|
|
14
|
+
/**
|
|
15
|
+
* Generate a unique ID for messages
|
|
16
|
+
*/
|
|
17
|
+
function generateId() {
|
|
18
|
+
return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* MainShell component
|
|
22
|
+
*
|
|
23
|
+
* The main interactive shell that handles slash commands and navigation.
|
|
24
|
+
* Replaces the readline-based REPL with an Ink-powered TUI.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```tsx
|
|
28
|
+
* <MainShell
|
|
29
|
+
* sessionState={state}
|
|
30
|
+
* onNavigate={(target, props) => setScreen(target, props)}
|
|
31
|
+
* />
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export function MainShell({ sessionState, onNavigate, }) {
|
|
35
|
+
const { exit } = useApp();
|
|
36
|
+
const [messages, setMessages] = useState([]);
|
|
37
|
+
/**
|
|
38
|
+
* Add a system message to the conversation
|
|
39
|
+
*/
|
|
40
|
+
const addSystemMessage = useCallback((content) => {
|
|
41
|
+
const message = {
|
|
42
|
+
id: generateId(),
|
|
43
|
+
role: 'system',
|
|
44
|
+
content,
|
|
45
|
+
};
|
|
46
|
+
setMessages((prev) => [...prev, message]);
|
|
47
|
+
}, []);
|
|
48
|
+
/**
|
|
49
|
+
* Handle /help command
|
|
50
|
+
*/
|
|
51
|
+
const handleHelp = useCallback(() => {
|
|
52
|
+
addSystemMessage(formatHelpText());
|
|
53
|
+
}, [addSystemMessage]);
|
|
54
|
+
/**
|
|
55
|
+
* Handle /init command
|
|
56
|
+
*/
|
|
57
|
+
const handleInit = useCallback(() => {
|
|
58
|
+
// Navigate to init screen
|
|
59
|
+
onNavigate('init');
|
|
60
|
+
}, [onNavigate]);
|
|
61
|
+
/**
|
|
62
|
+
* Handle /new command
|
|
63
|
+
*/
|
|
64
|
+
const handleNew = useCallback((args) => {
|
|
65
|
+
if (args.length === 0) {
|
|
66
|
+
addSystemMessage('Feature name required. Usage: /new <feature-name>');
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (!sessionState.initialized) {
|
|
70
|
+
addSystemMessage('Project not initialized. Run /init first.');
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const featureName = args[0];
|
|
74
|
+
onNavigate('interview', { featureName });
|
|
75
|
+
}, [sessionState.initialized, onNavigate, addSystemMessage]);
|
|
76
|
+
/**
|
|
77
|
+
* Handle /run command
|
|
78
|
+
*/
|
|
79
|
+
const handleRun = useCallback((args) => {
|
|
80
|
+
if (args.length === 0) {
|
|
81
|
+
addSystemMessage('Feature name required. Usage: /run <feature-name>');
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (!sessionState.initialized) {
|
|
85
|
+
addSystemMessage('Project not initialized. Run /init first.');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
// TODO: Implement run screen navigation
|
|
89
|
+
addSystemMessage(`Run command for "${args[0]}" - not yet implemented in TUI mode.`);
|
|
90
|
+
}, [sessionState.initialized, addSystemMessage]);
|
|
91
|
+
/**
|
|
92
|
+
* Handle /monitor command
|
|
93
|
+
*/
|
|
94
|
+
const handleMonitor = useCallback((args) => {
|
|
95
|
+
if (args.length === 0) {
|
|
96
|
+
addSystemMessage('Feature name required. Usage: /monitor <feature-name>');
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// TODO: Implement monitor screen navigation
|
|
100
|
+
addSystemMessage(`Monitor command for "${args[0]}" - not yet implemented in TUI mode.`);
|
|
101
|
+
}, [addSystemMessage]);
|
|
102
|
+
/**
|
|
103
|
+
* Handle /config command
|
|
104
|
+
*/
|
|
105
|
+
const handleConfig = useCallback((args) => {
|
|
106
|
+
// TODO: Implement config screen or inline config
|
|
107
|
+
if (args.length === 0) {
|
|
108
|
+
addSystemMessage('Config management - not yet implemented in TUI mode. Use CLI: wiggum config');
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
addSystemMessage(`Config: ${args.join(' ')} - not yet implemented in TUI mode.`);
|
|
112
|
+
}
|
|
113
|
+
}, [addSystemMessage]);
|
|
114
|
+
/**
|
|
115
|
+
* Handle /exit command
|
|
116
|
+
*/
|
|
117
|
+
const handleExit = useCallback(() => {
|
|
118
|
+
addSystemMessage('Goodbye!');
|
|
119
|
+
// Small delay to show message before exit
|
|
120
|
+
setTimeout(() => {
|
|
121
|
+
exit();
|
|
122
|
+
}, 100);
|
|
123
|
+
}, [addSystemMessage, exit]);
|
|
124
|
+
/**
|
|
125
|
+
* Execute a slash command
|
|
126
|
+
*/
|
|
127
|
+
const executeCommand = useCallback((commandName, args) => {
|
|
128
|
+
switch (commandName) {
|
|
129
|
+
case 'help':
|
|
130
|
+
handleHelp();
|
|
131
|
+
break;
|
|
132
|
+
case 'init':
|
|
133
|
+
handleInit();
|
|
134
|
+
break;
|
|
135
|
+
case 'new':
|
|
136
|
+
handleNew(args);
|
|
137
|
+
break;
|
|
138
|
+
case 'run':
|
|
139
|
+
handleRun(args);
|
|
140
|
+
break;
|
|
141
|
+
case 'monitor':
|
|
142
|
+
handleMonitor(args);
|
|
143
|
+
break;
|
|
144
|
+
case 'config':
|
|
145
|
+
handleConfig(args);
|
|
146
|
+
break;
|
|
147
|
+
case 'exit':
|
|
148
|
+
handleExit();
|
|
149
|
+
break;
|
|
150
|
+
default:
|
|
151
|
+
addSystemMessage(`Unknown command: ${commandName}`);
|
|
152
|
+
}
|
|
153
|
+
}, [handleHelp, handleInit, handleNew, handleRun, handleMonitor, handleConfig, handleExit, addSystemMessage]);
|
|
154
|
+
/**
|
|
155
|
+
* Handle natural language input
|
|
156
|
+
*/
|
|
157
|
+
const handleNaturalLanguage = useCallback((_text) => {
|
|
158
|
+
// For now, just show a tip (text parameter reserved for future AI chat)
|
|
159
|
+
addSystemMessage('Tip: Use /help to see available commands, or /new <feature> to create a spec.');
|
|
160
|
+
}, [addSystemMessage]);
|
|
161
|
+
/**
|
|
162
|
+
* Handle user input submission
|
|
163
|
+
*/
|
|
164
|
+
const handleSubmit = useCallback((value) => {
|
|
165
|
+
const parsed = parseInput(value);
|
|
166
|
+
switch (parsed.type) {
|
|
167
|
+
case 'empty':
|
|
168
|
+
// Ignore empty input
|
|
169
|
+
break;
|
|
170
|
+
case 'slash-command': {
|
|
171
|
+
const { command } = parsed;
|
|
172
|
+
if (!command)
|
|
173
|
+
break;
|
|
174
|
+
const resolvedName = resolveCommandAlias(command.name);
|
|
175
|
+
if (!resolvedName) {
|
|
176
|
+
addSystemMessage(`Unknown command: /${command.name}. Type /help for available commands.`);
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
executeCommand(resolvedName, command.args);
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
case 'natural-language': {
|
|
183
|
+
handleNaturalLanguage(parsed.text);
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}, [executeCommand, handleNaturalLanguage, addSystemMessage]);
|
|
188
|
+
// Handle Ctrl+C
|
|
189
|
+
useInput((input, key) => {
|
|
190
|
+
if (key.ctrl && input === 'c') {
|
|
191
|
+
addSystemMessage('Use /exit to quit');
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { color: colors.yellow, bold: true, children: "Wiggum Interactive Mode" }), _jsx(Text, { dimColor: true, children: " \u2502 " }), sessionState.initialized ? (_jsx(Text, { color: colors.green, children: "Ready" })) : (_jsx(Text, { color: colors.orange, children: "Not initialized - run /init" }))] }), _jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { dimColor: true, children: sessionState.provider ? `${sessionState.provider}/${sessionState.model}` : 'No provider configured' }), _jsx(Text, { dimColor: true, children: " \u2502 Type /help for commands" })] }), messages.length > 0 && (_jsx(Box, { marginY: 1, flexDirection: "column", children: _jsx(MessageList, { messages: messages }) })), _jsx(Box, { marginTop: 1, children: _jsx(ChatInput, { onSubmit: handleSubmit, disabled: false, placeholder: "Enter command or type /help...", prompt: "wiggum> " }) })] }));
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=MainShell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MainShell.js","sourceRoot":"","sources":["../../../src/tui/screens/MainShell.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,OAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAClD,OAAO,EAAE,WAAW,EAAgB,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,cAAc,GAEf,MAAM,8BAA8B,CAAC;AA4BtC;;GAEG;AACH,SAAS,UAAU;IACjB,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACvE,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,SAAS,CAAC,EACxB,YAAY,EACZ,UAAU,GACK;IACf,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAY,EAAE,CAAC,CAAC;IAExD;;OAEG;IACH,MAAM,gBAAgB,GAAG,WAAW,CAAC,CAAC,OAAe,EAAE,EAAE;QACvD,MAAM,OAAO,GAAY;YACvB,EAAE,EAAE,UAAU,EAAE;YAChB,IAAI,EAAE,QAAQ;YACd,OAAO;SACR,CAAC;QACF,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;OAEG;IACH,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,gBAAgB,CAAC,cAAc,EAAE,CAAC,CAAC;IACrC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEvB;;OAEG;IACH,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,0BAA0B;QAC1B,UAAU,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB;;OAEG;IACH,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,IAAc,EAAE,EAAE;QAC/C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,gBAAgB,CAAC,mDAAmD,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;YAC9B,gBAAgB,CAAC,2CAA2C,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,UAAU,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAE7D;;OAEG;IACH,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,IAAc,EAAE,EAAE;QAC/C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,gBAAgB,CAAC,mDAAmD,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;YAC9B,gBAAgB,CAAC,2CAA2C,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QAED,wCAAwC;QACxC,gBAAgB,CAAC,oBAAoB,IAAI,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC;IACtF,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEjD;;OAEG;IACH,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,IAAc,EAAE,EAAE;QACnD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,gBAAgB,CAAC,uDAAuD,CAAC,CAAC;YAC1E,OAAO;QACT,CAAC;QAED,4CAA4C;QAC5C,gBAAgB,CAAC,wBAAwB,IAAI,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC;IAC1F,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEvB;;OAEG;IACH,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,IAAc,EAAE,EAAE;QAClD,iDAAiD;QACjD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,gBAAgB,CAAC,6EAA6E,CAAC,CAAC;QAClG,CAAC;aAAM,CAAC;YACN,gBAAgB,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnF,CAAC;IACH,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEvB;;OAEG;IACH,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC7B,0CAA0C;QAC1C,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,EAAE,CAAC;QACT,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC,EAAE,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC;IAE7B;;OAEG;IACH,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,WAA4B,EAAE,IAAc,EAAE,EAAE;QAClF,QAAQ,WAAW,EAAE,CAAC;YACpB,KAAK,MAAM;gBACT,UAAU,EAAE,CAAC;gBACb,MAAM;YACR,KAAK,MAAM;gBACT,UAAU,EAAE,CAAC;gBACb,MAAM;YACR,KAAK,KAAK;gBACR,SAAS,CAAC,IAAI,CAAC,CAAC;gBAChB,MAAM;YACR,KAAK,KAAK;gBACR,SAAS,CAAC,IAAI,CAAC,CAAC;gBAChB,MAAM;YACR,KAAK,SAAS;gBACZ,aAAa,CAAC,IAAI,CAAC,CAAC;gBACpB,MAAM;YACR,KAAK,QAAQ;gBACX,YAAY,CAAC,IAAI,CAAC,CAAC;gBACnB,MAAM;YACR,KAAK,MAAM;gBACT,UAAU,EAAE,CAAC;gBACb,MAAM;YACR;gBACE,gBAAgB,CAAC,oBAAoB,WAAW,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAE9G;;OAEG;IACH,MAAM,qBAAqB,GAAG,WAAW,CAAC,CAAC,KAAa,EAAE,EAAE;QAC1D,wEAAwE;QACxE,gBAAgB,CAAC,+EAA+E,CAAC,CAAC;IACpG,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEvB;;OAEG;IACH,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,KAAa,EAAE,EAAE;QACjD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAEjC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,OAAO;gBACV,qBAAqB;gBACrB,MAAM;YAER,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;gBAC3B,IAAI,CAAC,OAAO;oBAAE,MAAM;gBAEpB,MAAM,YAAY,GAAG,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACvD,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,gBAAgB,CAAC,qBAAqB,OAAO,CAAC,IAAI,sCAAsC,CAAC,CAAC;oBAC1F,MAAM;gBACR,CAAC;gBAED,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC3C,MAAM;YACR,CAAC;YAED,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,qBAAqB,CAAC,MAAM,CAAC,IAAK,CAAC,CAAC;gBACpC,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,cAAc,EAAE,qBAAqB,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAE9D,gBAAgB;IAChB,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC9B,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,aAEpC,MAAC,GAAG,IAAC,YAAY,EAAE,CAAC,aAClB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,8CAA+B,EAC/D,KAAC,IAAI,IAAC,QAAQ,+BAAW,EACxB,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAC1B,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,sBAAc,CACxC,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,4CAAoC,CAC/D,IACG,EAGN,MAAC,GAAG,IAAC,YAAY,EAAE,CAAC,aAClB,KAAC,IAAI,IAAC,QAAQ,kBACX,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,QAAQ,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,wBAAwB,GAC/F,EACP,KAAC,IAAI,IAAC,QAAQ,sDAAkC,IAC5C,EAGL,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CACtB,KAAC,GAAG,IAAC,OAAO,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,YACrC,KAAC,WAAW,IAAC,QAAQ,EAAE,QAAQ,GAAI,GAC/B,CACP,EAGD,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,SAAS,IACR,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,KAAK,EACf,WAAW,EAAC,gCAAgC,EAC5C,MAAM,EAAC,UAAU,GACjB,GACE,IACF,CACP,CAAC;AACJ,CAAC"}
|