wave-code 0.17.0 → 0.17.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/acp/agent.d.ts +1 -0
  2. package/dist/acp/agent.d.ts.map +1 -1
  3. package/dist/acp/agent.js +116 -1
  4. package/dist/components/ChatInterface.d.ts.map +1 -1
  5. package/dist/components/ChatInterface.js +5 -2
  6. package/dist/components/InputBox.d.ts +2 -0
  7. package/dist/components/InputBox.d.ts.map +1 -1
  8. package/dist/components/InputBox.js +29 -8
  9. package/dist/components/LoadingIndicator.d.ts +2 -1
  10. package/dist/components/LoadingIndicator.d.ts.map +1 -1
  11. package/dist/components/LoadingIndicator.js +2 -2
  12. package/dist/components/QueuedMessageList.d.ts.map +1 -1
  13. package/dist/components/QueuedMessageList.js +10 -10
  14. package/dist/components/StatusLine.d.ts +2 -0
  15. package/dist/components/StatusLine.d.ts.map +1 -1
  16. package/dist/components/StatusLine.js +6 -6
  17. package/dist/components/TaskList.d.ts +3 -0
  18. package/dist/components/TaskList.d.ts.map +1 -1
  19. package/dist/components/TaskList.js +171 -28
  20. package/dist/components/TaskNotificationMessage.d.ts.map +1 -1
  21. package/dist/components/TaskNotificationMessage.js +1 -0
  22. package/dist/components/WorkflowManager.d.ts +6 -0
  23. package/dist/components/WorkflowManager.d.ts.map +1 -0
  24. package/dist/components/WorkflowManager.js +102 -0
  25. package/dist/constants/commands.d.ts.map +1 -1
  26. package/dist/constants/commands.js +6 -0
  27. package/dist/contexts/useChat.d.ts +8 -1
  28. package/dist/contexts/useChat.d.ts.map +1 -1
  29. package/dist/contexts/useChat.js +68 -4
  30. package/dist/hooks/useInputManager.d.ts +2 -0
  31. package/dist/hooks/useInputManager.d.ts.map +1 -1
  32. package/dist/hooks/useInputManager.js +22 -13
  33. package/dist/managers/inputHandlers.d.ts.map +1 -1
  34. package/dist/managers/inputHandlers.js +6 -3
  35. package/dist/managers/inputReducer.d.ts +10 -0
  36. package/dist/managers/inputReducer.d.ts.map +1 -1
  37. package/dist/managers/inputReducer.js +41 -4
  38. package/dist/print-cli.d.ts.map +1 -1
  39. package/dist/print-cli.js +3 -31
  40. package/dist/reducers/workflowManagerReducer.d.ts +41 -0
  41. package/dist/reducers/workflowManagerReducer.d.ts.map +1 -0
  42. package/dist/reducers/workflowManagerReducer.js +100 -0
  43. package/package.json +2 -2
  44. package/src/acp/agent.ts +137 -1
  45. package/src/components/ChatInterface.tsx +10 -1
  46. package/src/components/InputBox.tsx +43 -3
  47. package/src/components/LoadingIndicator.tsx +4 -1
  48. package/src/components/QueuedMessageList.tsx +7 -3
  49. package/src/components/StatusLine.tsx +28 -16
  50. package/src/components/TaskList.tsx +213 -19
  51. package/src/components/TaskNotificationMessage.tsx +1 -0
  52. package/src/components/WorkflowManager.tsx +320 -0
  53. package/src/constants/commands.ts +6 -0
  54. package/src/contexts/useChat.tsx +83 -4
  55. package/src/hooks/useInputManager.ts +25 -13
  56. package/src/managers/inputHandlers.ts +5 -4
  57. package/src/managers/inputReducer.ts +54 -6
  58. package/src/print-cli.ts +3 -37
  59. package/src/reducers/workflowManagerReducer.ts +143 -0
@@ -0,0 +1,143 @@
1
+ import { Key } from "ink";
2
+ import type { WorkflowRun } from "wave-agent-sdk";
3
+
4
+ export type PendingEffect =
5
+ | { type: "CANCEL" }
6
+ | { type: "STOP_RUN"; runId: string };
7
+
8
+ export interface WorkflowManagerState {
9
+ runs: WorkflowRun[];
10
+ selectedIndex: number;
11
+ viewMode: "list" | "detail";
12
+ detailRunId: string | null;
13
+ pendingEffect: PendingEffect | null;
14
+ }
15
+
16
+ export type WorkflowManagerAction =
17
+ | { type: "SET_RUNS"; runs: WorkflowRun[] }
18
+ | { type: "SELECT_INDEX"; index: number }
19
+ | { type: "MOVE_UP" }
20
+ | { type: "MOVE_DOWN" }
21
+ | { type: "SELECT_CURRENT" }
22
+ | { type: "SET_VIEW_MODE"; mode: "list" | "detail" }
23
+ | { type: "RESET_DETAIL" }
24
+ | { type: "HANDLE_KEY"; input: string; key: Key }
25
+ | { type: "CLEAR_PENDING_EFFECT" };
26
+
27
+ export function workflowManagerReducer(
28
+ state: WorkflowManagerState,
29
+ action: WorkflowManagerAction,
30
+ ): WorkflowManagerState {
31
+ switch (action.type) {
32
+ case "SET_RUNS":
33
+ return { ...state, runs: action.runs };
34
+ case "SELECT_INDEX":
35
+ return { ...state, selectedIndex: action.index };
36
+ case "MOVE_UP":
37
+ return { ...state, selectedIndex: Math.max(0, state.selectedIndex - 1) };
38
+ case "MOVE_DOWN":
39
+ return {
40
+ ...state,
41
+ selectedIndex: Math.min(
42
+ state.runs.length > 0 ? state.runs.length - 1 : 0,
43
+ state.selectedIndex + 1,
44
+ ),
45
+ };
46
+ case "SELECT_CURRENT":
47
+ if (state.runs.length > 0 && state.selectedIndex < state.runs.length) {
48
+ return {
49
+ ...state,
50
+ detailRunId: state.runs[state.selectedIndex].runId,
51
+ viewMode: "detail",
52
+ };
53
+ }
54
+ return state;
55
+ case "SET_VIEW_MODE":
56
+ return { ...state, viewMode: action.mode };
57
+ case "RESET_DETAIL":
58
+ return {
59
+ ...state,
60
+ viewMode: "list",
61
+ detailRunId: null,
62
+ };
63
+ case "HANDLE_KEY": {
64
+ const { input, key } = action;
65
+ if (state.viewMode === "list") {
66
+ if (key.return) {
67
+ if (
68
+ state.runs.length > 0 &&
69
+ state.selectedIndex < state.runs.length
70
+ ) {
71
+ return {
72
+ ...state,
73
+ detailRunId: state.runs[state.selectedIndex].runId,
74
+ viewMode: "detail",
75
+ };
76
+ }
77
+ return state;
78
+ }
79
+
80
+ if (key.escape) {
81
+ return { ...state, pendingEffect: { type: "CANCEL" } };
82
+ }
83
+
84
+ if (key.upArrow) {
85
+ return {
86
+ ...state,
87
+ selectedIndex: Math.max(0, state.selectedIndex - 1),
88
+ };
89
+ }
90
+
91
+ if (key.downArrow) {
92
+ return {
93
+ ...state,
94
+ selectedIndex: Math.min(
95
+ state.runs.length > 0 ? state.runs.length - 1 : 0,
96
+ state.selectedIndex + 1,
97
+ ),
98
+ };
99
+ }
100
+
101
+ if (input === "k") {
102
+ if (
103
+ state.runs.length > 0 &&
104
+ state.selectedIndex < state.runs.length
105
+ ) {
106
+ const selectedRun = state.runs[state.selectedIndex];
107
+ if (selectedRun.status === "running") {
108
+ return {
109
+ ...state,
110
+ pendingEffect: { type: "STOP_RUN", runId: selectedRun.runId },
111
+ };
112
+ }
113
+ }
114
+ return state;
115
+ }
116
+ } else if (state.viewMode === "detail") {
117
+ if (key.escape) {
118
+ return {
119
+ ...state,
120
+ viewMode: "list",
121
+ detailRunId: null,
122
+ };
123
+ }
124
+
125
+ if (input === "k" && state.detailRunId) {
126
+ const run = state.runs.find((r) => r.runId === state.detailRunId);
127
+ if (run && run.status === "running") {
128
+ return {
129
+ ...state,
130
+ pendingEffect: { type: "STOP_RUN", runId: state.detailRunId },
131
+ };
132
+ }
133
+ return state;
134
+ }
135
+ }
136
+ return state;
137
+ }
138
+ case "CLEAR_PENDING_EFFECT":
139
+ return { ...state, pendingEffect: null };
140
+ default:
141
+ return state;
142
+ }
143
+ }