agent-tempo 1.7.0 → 2.0.0-beta.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 (171) hide show
  1. package/CLAUDE.md +10 -13
  2. package/README.md +21 -15
  3. package/dashboard/dist/assets/index-BbR7zIdK.js.map +1 -1
  4. package/dashboard/package.json +1 -1
  5. package/dist/activities/hard-terminate.d.ts +2 -2
  6. package/dist/activities/hard-terminate.js +3 -9
  7. package/dist/activities/maestro.d.ts +8 -13
  8. package/dist/activities/maestro.js +3 -10
  9. package/dist/activities/outbox.js +16 -2
  10. package/dist/activities/resolve.d.ts +18 -7
  11. package/dist/activities/resolve.js +58 -46
  12. package/dist/adapters/base.js +3 -0
  13. package/dist/adapters/claude-code/adapter.js +7 -0
  14. package/dist/cli/command-center-command.js +15 -1
  15. package/dist/cli/commands.d.ts +8 -0
  16. package/dist/cli/commands.js +79 -11
  17. package/dist/cli/daemon-command.js +19 -33
  18. package/dist/cli/help-text.js +9 -7
  19. package/dist/cli/home-command.d.ts +26 -0
  20. package/dist/cli/home-command.js +156 -0
  21. package/dist/cli/removed-verbs.d.ts +0 -4
  22. package/dist/cli/removed-verbs.js +23 -12
  23. package/dist/cli/sa-preflight.d.ts +0 -14
  24. package/dist/cli/sa-preflight.js +1 -17
  25. package/dist/cli/startup.d.ts +1 -10
  26. package/dist/cli/startup.js +0 -40
  27. package/dist/cli.js +34 -80
  28. package/dist/client/core.js +13 -15
  29. package/dist/client/index.d.ts +2 -1
  30. package/dist/client/interface.d.ts +5 -14
  31. package/dist/client/with-spawn.d.ts +9 -4
  32. package/dist/client/with-spawn.js +7 -10
  33. package/dist/config.d.ts +14 -13
  34. package/dist/config.js +14 -0
  35. package/dist/constants.d.ts +50 -0
  36. package/dist/constants.js +60 -1
  37. package/dist/daemon.js +81 -0
  38. package/dist/http/auth.d.ts +3 -21
  39. package/dist/http/auth.js +10 -31
  40. package/dist/http/event-types.d.ts +38 -4
  41. package/dist/http/orphans.d.ts +3 -3
  42. package/dist/http/orphans.js +3 -3
  43. package/dist/http/server.d.ts +0 -5
  44. package/dist/http/server.js +79 -29
  45. package/dist/http/snapshot.js +3 -0
  46. package/dist/http/writes.d.ts +1 -1
  47. package/dist/http/writes.js +25 -2
  48. package/dist/observability/nondeterminism-alarm.d.ts +113 -0
  49. package/dist/observability/nondeterminism-alarm.js +162 -0
  50. package/dist/palette/index.d.ts +6 -7
  51. package/dist/palette/index.js +6 -7
  52. package/dist/pi/mission-control/actions.d.ts +67 -1
  53. package/dist/pi/mission-control/actions.js +61 -0
  54. package/dist/pi/mission-control/extension.d.ts +77 -0
  55. package/dist/pi/mission-control/extension.js +171 -0
  56. package/dist/pi/workflow-client.d.ts +14 -16
  57. package/dist/pi/workflow-client.js +18 -44
  58. package/dist/server-tools.js +30 -29
  59. package/dist/server.js +42 -0
  60. package/dist/tools/action-guard.d.ts +23 -0
  61. package/dist/tools/action-guard.js +33 -0
  62. package/dist/tools/coat-check.d.ts +20 -0
  63. package/dist/tools/coat-check.js +129 -0
  64. package/dist/tools/gate.d.ts +13 -0
  65. package/dist/tools/gate.js +88 -0
  66. package/dist/tools/schedule.d.ts +18 -0
  67. package/dist/tools/schedule.js +93 -1
  68. package/dist/tools/stage.d.ts +17 -0
  69. package/dist/tools/stage.js +85 -1
  70. package/dist/tools/state.d.ts +14 -0
  71. package/dist/tools/state.js +95 -0
  72. package/dist/types.d.ts +54 -7
  73. package/dist/upgrade/boot-guard.d.ts +95 -0
  74. package/dist/upgrade/boot-guard.js +88 -0
  75. package/dist/upgrade/from-upgrade.d.ts +95 -0
  76. package/dist/upgrade/from-upgrade.js +330 -0
  77. package/dist/upgrade/phase-engine.js +4 -1
  78. package/dist/utils/duration.d.ts +3 -6
  79. package/dist/utils/duration.js +3 -6
  80. package/dist/utils/format-hosts.d.ts +1 -1
  81. package/dist/utils/format-hosts.js +0 -2
  82. package/dist/utils/grpc-shutdown-guard.js +0 -4
  83. package/dist/utils/hosts.d.ts +4 -10
  84. package/dist/utils/hosts.js +12 -28
  85. package/dist/utils/orphan-guard.d.ts +37 -0
  86. package/dist/utils/orphan-guard.js +26 -0
  87. package/dist/utils/search-attributes.d.ts +28 -18
  88. package/dist/utils/search-attributes.js +48 -18
  89. package/dist/utils/visibility-deadline.d.ts +16 -0
  90. package/dist/utils/visibility-deadline.js +16 -0
  91. package/dist/workflows/maestro-signals.d.ts +0 -13
  92. package/dist/workflows/maestro-signals.js +6 -14
  93. package/dist/workflows/maestro.js +27 -32
  94. package/dist/workflows/scheduler.js +7 -1
  95. package/dist/workflows/session.js +237 -153
  96. package/dist/workflows/signals.d.ts +9 -1
  97. package/dist/workflows/signals.js +8 -6
  98. package/package.json +1 -6
  99. package/workflow-bundle.js +478 -225
  100. package/dist/cli/legacy-migration.d.ts +0 -35
  101. package/dist/cli/legacy-migration.js +0 -341
  102. package/dist/client/ensure-conductor-spawned.d.ts +0 -35
  103. package/dist/client/ensure-conductor-spawned.js +0 -48
  104. package/dist/tui/App.d.ts +0 -85
  105. package/dist/tui/App.js +0 -1791
  106. package/dist/tui/bootstrap-types.d.ts +0 -46
  107. package/dist/tui/bootstrap-types.js +0 -7
  108. package/dist/tui/commands.d.ts +0 -71
  109. package/dist/tui/commands.js +0 -1375
  110. package/dist/tui/components/ChatView.d.ts +0 -35
  111. package/dist/tui/components/ChatView.js +0 -54
  112. package/dist/tui/components/CommandPalette.d.ts +0 -21
  113. package/dist/tui/components/CommandPalette.js +0 -67
  114. package/dist/tui/components/ConversationStream.d.ts +0 -114
  115. package/dist/tui/components/ConversationStream.js +0 -307
  116. package/dist/tui/components/CreateEnsembleWizard.d.ts +0 -19
  117. package/dist/tui/components/CreateEnsembleWizard.js +0 -223
  118. package/dist/tui/components/DestroyConfirmModal.d.ts +0 -17
  119. package/dist/tui/components/DestroyConfirmModal.js +0 -62
  120. package/dist/tui/components/ErrorView.d.ts +0 -31
  121. package/dist/tui/components/ErrorView.js +0 -129
  122. package/dist/tui/components/HomeView.d.ts +0 -54
  123. package/dist/tui/components/HomeView.js +0 -306
  124. package/dist/tui/components/LoadLineupModal.d.ts +0 -18
  125. package/dist/tui/components/LoadLineupModal.js +0 -79
  126. package/dist/tui/components/MainView.d.ts +0 -21
  127. package/dist/tui/components/MainView.js +0 -107
  128. package/dist/tui/components/NewEnsembleModal.d.ts +0 -9
  129. package/dist/tui/components/NewEnsembleModal.js +0 -73
  130. package/dist/tui/components/Picker.d.ts +0 -23
  131. package/dist/tui/components/Picker.js +0 -70
  132. package/dist/tui/components/PlayerDetailView.d.ts +0 -26
  133. package/dist/tui/components/PlayerDetailView.js +0 -118
  134. package/dist/tui/components/PromptArea.d.ts +0 -50
  135. package/dist/tui/components/PromptArea.js +0 -303
  136. package/dist/tui/components/RecruitWizard.d.ts +0 -17
  137. package/dist/tui/components/RecruitWizard.js +0 -221
  138. package/dist/tui/components/RestoreConfirmModal.d.ts +0 -18
  139. package/dist/tui/components/RestoreConfirmModal.js +0 -71
  140. package/dist/tui/components/ScheduleWizard.d.ts +0 -19
  141. package/dist/tui/components/ScheduleWizard.js +0 -259
  142. package/dist/tui/components/Splash.d.ts +0 -23
  143. package/dist/tui/components/Splash.js +0 -221
  144. package/dist/tui/components/StatusBar.d.ts +0 -48
  145. package/dist/tui/components/StatusBar.js +0 -128
  146. package/dist/tui/components/StatusOverlay.d.ts +0 -15
  147. package/dist/tui/components/StatusOverlay.js +0 -76
  148. package/dist/tui/components/TitleBar.d.ts +0 -10
  149. package/dist/tui/components/TitleBar.js +0 -21
  150. package/dist/tui/index.d.ts +0 -15
  151. package/dist/tui/index.js +0 -162
  152. package/dist/tui/ink-context.d.ts +0 -18
  153. package/dist/tui/ink-context.js +0 -59
  154. package/dist/tui/ink-loader.d.ts +0 -26
  155. package/dist/tui/ink-loader.js +0 -42
  156. package/dist/tui/removed-commands.d.ts +0 -9
  157. package/dist/tui/removed-commands.js +0 -22
  158. package/dist/tui/sse-handler.d.ts +0 -52
  159. package/dist/tui/sse-handler.js +0 -157
  160. package/dist/tui/store.d.ts +0 -598
  161. package/dist/tui/store.js +0 -753
  162. package/dist/tui/utils/format.d.ts +0 -56
  163. package/dist/tui/utils/format.js +0 -155
  164. package/dist/tui/utils/fullscreen.d.ts +0 -23
  165. package/dist/tui/utils/fullscreen.js +0 -71
  166. package/dist/tui/utils/history.d.ts +0 -10
  167. package/dist/tui/utils/history.js +0 -85
  168. package/dist/tui/utils/platform.d.ts +0 -45
  169. package/dist/tui/utils/platform.js +0 -258
  170. package/dist/tui/utils/theme.d.ts +0 -21
  171. package/dist/tui/utils/theme.js +0 -24
@@ -1,223 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.CreateEnsembleWizard = CreateEnsembleWizard;
37
- /**
38
- * CreateEnsembleWizard — step-by-step flow for creating a new ensemble.
39
- *
40
- * Steps: name → workDir → lineup (optional) → confirm
41
- *
42
- * Minimal-Box pattern: single <Text> root for static content,
43
- * one <Box> for Ink's TextInput on text-input steps.
44
- */
45
- const react_1 = __importStar(require("react"));
46
- const ink_context_1 = require("../ink-context");
47
- const theme_1 = require("../utils/theme");
48
- const saver_1 = require("../../ensemble/saver");
49
- const STEP_LABELS = {
50
- name: 'Ensemble name',
51
- workDir: 'Working directory',
52
- lineup: 'Lineup (optional)',
53
- confirm: 'Confirm',
54
- done: 'Done',
55
- };
56
- const TEXT_INPUT_STEPS = new Set(['name', 'workDir']);
57
- function CreateEnsembleWizard({ state, onAnswer, onBack, onConfirm, onCancel, onDone }) {
58
- const { Box, Text, TextInput, useInput } = (0, ink_context_1.useInk)();
59
- const [inputValue, setInputValue] = (0, react_1.useState)('');
60
- const [lineupIdx, setLineupIdx] = (0, react_1.useState)(0);
61
- const [lineupCustom, setLineupCustom] = (0, react_1.useState)(false);
62
- // Build lineup options: (none) + saved/shipped + custom path
63
- const lineupOptions = (0, react_1.useMemo)(() => {
64
- const options = [
65
- { label: '(none) \u2014 start with no lineup', value: '' },
66
- ];
67
- try {
68
- for (const l of (0, saver_1.listAllLineups)()) {
69
- options.push({ label: `${l.name} (${l.source})`, value: l.name, source: l.source });
70
- }
71
- }
72
- catch { /* ignore */ }
73
- options.push({ label: '[custom path...]', value: '__custom__' });
74
- return options;
75
- }, []);
76
- useInput((0, react_1.useCallback)((_input, key) => {
77
- if (key.escape) {
78
- onCancel();
79
- return;
80
- }
81
- if (key.backspace && state.step !== 'name' && state.step !== 'done' && !inputValue) {
82
- if (state.step === 'lineup' && lineupCustom) {
83
- setLineupCustom(false);
84
- return;
85
- }
86
- onBack();
87
- return;
88
- }
89
- if (state.step === 'confirm' && key.return)
90
- onConfirm();
91
- if (state.step === 'done' && key.return)
92
- onDone();
93
- // Lineup list navigation
94
- if (state.step === 'lineup' && !lineupCustom) {
95
- if (key.upArrow) {
96
- setLineupIdx(i => (i - 1 + lineupOptions.length) % lineupOptions.length);
97
- return;
98
- }
99
- if (key.downArrow) {
100
- setLineupIdx(i => (i + 1) % lineupOptions.length);
101
- return;
102
- }
103
- if (key.return) {
104
- const selected = lineupOptions[lineupIdx];
105
- if (selected.value === '__custom__') {
106
- setLineupCustom(true);
107
- }
108
- else {
109
- onAnswer({ lineup: selected.value });
110
- }
111
- return;
112
- }
113
- }
114
- }, [state.step, inputValue, lineupCustom, lineupIdx, lineupOptions, onBack, onCancel, onConfirm, onDone, onAnswer]));
115
- const handleTextSubmit = (0, react_1.useCallback)((value) => {
116
- const trimmed = value.trim();
117
- switch (state.step) {
118
- case 'name':
119
- if (!trimmed)
120
- return;
121
- onAnswer({ name: trimmed });
122
- break;
123
- case 'workDir':
124
- onAnswer({ workDir: trimmed || state.answers.workDir });
125
- break;
126
- case 'lineup':
127
- // Custom path mode
128
- onAnswer({ lineup: trimmed });
129
- setLineupCustom(false);
130
- break;
131
- }
132
- setInputValue('');
133
- }, [state.step, state.answers.workDir, onAnswer]);
134
- const children = [];
135
- // Header
136
- children.push(react_1.default.createElement(react_1.default.Fragment, { key: 'hdr' }, react_1.default.createElement(Text, { bold: true, color: theme_1.THEME.accent }, ' Create New Ensemble'), react_1.default.createElement(Text, { color: theme_1.THEME.dim }, ' (Esc to cancel, Backspace to go back)')));
137
- // Completed steps
138
- const steps = ['name', 'workDir', 'lineup'];
139
- for (const s of steps) {
140
- if (s === state.step)
141
- break;
142
- const value = getAnswerDisplay(s, state.answers);
143
- children.push('\n');
144
- children.push(react_1.default.createElement(react_1.default.Fragment, { key: `done-${s}` }, react_1.default.createElement(Text, { color: theme_1.THEME.success }, ' \u2714 '), react_1.default.createElement(Text, { color: theme_1.THEME.dim }, `${STEP_LABELS[s]}: `), react_1.default.createElement(Text, { color: theme_1.THEME.text }, value)));
145
- }
146
- // Current step
147
- if (state.step === 'confirm') {
148
- const a = state.answers;
149
- children.push('\n\n');
150
- children.push(react_1.default.createElement(Text, { key: 'sum-h', bold: true, color: theme_1.THEME.accent }, ' Create Ensemble:'));
151
- children.push('\n');
152
- children.push(react_1.default.createElement(Text, { key: 'sum-n', color: theme_1.THEME.text }, ` Name: ${a.name}`));
153
- children.push('\n');
154
- children.push(react_1.default.createElement(Text, { key: 'sum-d', color: theme_1.THEME.text }, ` Directory: ${a.workDir}`));
155
- children.push('\n');
156
- children.push(react_1.default.createElement(Text, { key: 'sum-l', color: theme_1.THEME.text }, ` Lineup: ${a.lineup || '(none — bare ensemble)'}`));
157
- children.push('\n\n');
158
- children.push(react_1.default.createElement(Text, { key: 'sum-hint', color: theme_1.THEME.dim }, ' Press Enter to create, Esc to cancel'));
159
- }
160
- else if (state.step === 'done') {
161
- children.push('\n\n');
162
- if (state.error) {
163
- children.push(react_1.default.createElement(Text, { key: 'err', color: theme_1.THEME.error, bold: true }, ` \u2717 Failed: ${state.error}`));
164
- children.push('\n');
165
- children.push(react_1.default.createElement(Text, { key: 'err-h', color: theme_1.THEME.dim }, ' Press Enter to return'));
166
- }
167
- }
168
- else if (state.submitting) {
169
- children.push('\n\n');
170
- children.push(react_1.default.createElement(Text, { key: 'sub', color: theme_1.THEME.warning }, ` \u2026 Creating ensemble "${state.answers.name}"...`));
171
- }
172
- else if (state.step === 'lineup') {
173
- children.push('\n\n');
174
- children.push(react_1.default.createElement(react_1.default.Fragment, { key: 'inp-q' }, react_1.default.createElement(Text, { color: theme_1.THEME.accent }, ' ? '), react_1.default.createElement(Text, { bold: true, color: theme_1.THEME.text }, 'Select a lineup:')));
175
- if (!lineupCustom) {
176
- for (let i = 0; i < lineupOptions.length; i++) {
177
- const opt = lineupOptions[i];
178
- const selected = i === lineupIdx;
179
- children.push('\n');
180
- children.push(react_1.default.createElement(Text, { key: `lo-${i}`, color: selected ? theme_1.THEME.text : theme_1.THEME.dim, bold: selected }, ` ${selected ? '\u276F' : ' '} ${opt.label}`));
181
- }
182
- }
183
- }
184
- else if (TEXT_INPUT_STEPS.has(state.step)) {
185
- const defaultHint = getDefaultHint(state.step, state.answers);
186
- children.push('\n\n');
187
- children.push(react_1.default.createElement(react_1.default.Fragment, { key: 'inp-q' }, react_1.default.createElement(Text, { color: theme_1.THEME.accent }, ' ? '), react_1.default.createElement(Text, { bold: true, color: theme_1.THEME.text }, `${STEP_LABELS[state.step]}:`), defaultHint
188
- ? react_1.default.createElement(Text, { color: theme_1.THEME.dim }, ` (${defaultHint})`)
189
- : null));
190
- }
191
- // Lineup custom path mode: show text input
192
- if (state.step === 'lineup' && lineupCustom && !state.submitting) {
193
- return react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement(Text, null, ...children), react_1.default.createElement(Box, { marginLeft: 3 }, react_1.default.createElement(Text, { color: theme_1.THEME.accent }, '> '), react_1.default.createElement(TextInput, {
194
- value: inputValue,
195
- onChange: setInputValue,
196
- onSubmit: handleTextSubmit,
197
- })));
198
- }
199
- // Text input steps: Text + Box(TextInput)
200
- if (TEXT_INPUT_STEPS.has(state.step) && !state.submitting) {
201
- return react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement(Text, null, ...children), react_1.default.createElement(Box, { marginLeft: 3 }, react_1.default.createElement(Text, { color: theme_1.THEME.accent }, '> '), react_1.default.createElement(TextInput, {
202
- value: inputValue,
203
- onChange: setInputValue,
204
- onSubmit: handleTextSubmit,
205
- })));
206
- }
207
- return react_1.default.createElement(Text, null, ...children);
208
- }
209
- function getAnswerDisplay(step, answers) {
210
- switch (step) {
211
- case 'name': return answers.name;
212
- case 'workDir': return answers.workDir;
213
- case 'lineup': return answers.lineup || '(none)';
214
- default: return '';
215
- }
216
- }
217
- function getDefaultHint(step, answers) {
218
- switch (step) {
219
- case 'workDir': return answers.workDir;
220
- case 'lineup': return 'press Enter to skip';
221
- default: return null;
222
- }
223
- }
@@ -1,17 +0,0 @@
1
- /**
2
- * Typed-name confirmation for `/destroy <ensemble>`. User must type the
3
- * ensemble name character-for-character before Enter fires the destroy
4
- * call. Mismatch preserves the input + surfaces an inline error; Esc
5
- * cancels.
6
- */
7
- import React from 'react';
8
- export interface DestroyConfirmModalProps {
9
- ensemble: string;
10
- input: string;
11
- error?: string;
12
- submitting?: boolean;
13
- onInput: (next: string) => void;
14
- onSubmit: () => void;
15
- onCancel: () => void;
16
- }
17
- export declare function DestroyConfirmModal(props: DestroyConfirmModalProps): React.ReactElement;
@@ -1,62 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.DestroyConfirmModal = DestroyConfirmModal;
37
- /**
38
- * Typed-name confirmation for `/destroy <ensemble>`. User must type the
39
- * ensemble name character-for-character before Enter fires the destroy
40
- * call. Mismatch preserves the input + surfaces an inline error; Esc
41
- * cancels.
42
- */
43
- const react_1 = __importStar(require("react"));
44
- const ink_context_1 = require("../ink-context");
45
- const theme_1 = require("../utils/theme");
46
- function DestroyConfirmModal(props) {
47
- const { ensemble, input, error, submitting, onInput, onSubmit, onCancel } = props;
48
- const { Box, Text, TextInput, useInput } = (0, ink_context_1.useInk)();
49
- useInput((0, react_1.useCallback)((_input, key) => {
50
- if (!submitting && key.escape)
51
- onCancel();
52
- }, [submitting, onCancel]));
53
- return react_1.default.createElement(Box, { flexDirection: 'column' }, react_1.default.createElement(Text, { bold: true, color: theme_1.THEME.error }, ' Destroy ensemble'), react_1.default.createElement(Box, { marginTop: 1, flexDirection: 'column' }, react_1.default.createElement(Text, { color: theme_1.THEME.text }, ` Destroying "${ensemble}" will terminate all sessions, the scheduler, and the maestro.`), react_1.default.createElement(Text, { color: theme_1.THEME.text }, ` Type the ensemble name (${ensemble}) to confirm, or Esc to cancel:`)), submitting
54
- ? react_1.default.createElement(Box, { marginLeft: 3, marginTop: 1 }, react_1.default.createElement(Text, { color: theme_1.THEME.warning }, `\u2026 Destroying "${ensemble}"\u2026`))
55
- : react_1.default.createElement(Box, { marginLeft: 3, marginTop: 1 }, react_1.default.createElement(Text, { color: theme_1.THEME.error }, '> '), react_1.default.createElement(TextInput, {
56
- value: input,
57
- onChange: onInput,
58
- onSubmit,
59
- })), error
60
- ? react_1.default.createElement(Text, { color: theme_1.THEME.error }, ` \u2717 ${error}`)
61
- : null);
62
- }
@@ -1,31 +0,0 @@
1
- /**
2
- * ErrorView — connection failure screen with troubleshooting.
3
- *
4
- * Performance: Single <Text> root with nested virtual-text children.
5
- * Zero Yoga <Box> nodes — follows the pattern from StatusOverlay/ConversationStream.
6
- */
7
- import React from 'react';
8
- export interface ErrorCheck {
9
- label: string;
10
- passed: boolean;
11
- detail?: string;
12
- }
13
- export interface ErrorViewProps {
14
- version: string;
15
- checks: ErrorCheck[];
16
- /** Error detail text (e.g., "Connection refused (ECONNREFUSED)"). */
17
- errorDetail?: string;
18
- /** Whether auto-retry is active. */
19
- retrying?: boolean;
20
- /** Seconds until next retry. */
21
- retryIn?: number;
22
- /** Current retry attempt number. */
23
- retryAttempt?: number;
24
- /** Max retry attempts. */
25
- retryMax?: number;
26
- /** Called when user presses 'r' to retry. */
27
- onRetry?: () => void;
28
- /** Called when user presses 'q' to quit. */
29
- onQuit?: () => void;
30
- }
31
- export declare function ErrorView({ version, checks, retrying, retryIn, retryAttempt, retryMax, onRetry, onQuit, }: ErrorViewProps): React.CElement<{}, React.Component<{}, any, any>>;
@@ -1,129 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.ErrorView = ErrorView;
37
- /**
38
- * ErrorView — connection failure screen with troubleshooting.
39
- *
40
- * Performance: Single <Text> root with nested virtual-text children.
41
- * Zero Yoga <Box> nodes — follows the pattern from StatusOverlay/ConversationStream.
42
- */
43
- const react_1 = __importStar(require("react"));
44
- const ink_context_1 = require("../ink-context");
45
- const platform_1 = require("../utils/platform");
46
- const theme_1 = require("../utils/theme");
47
- function ErrorView({ version, checks, retrying, retryIn, retryAttempt, retryMax, onRetry, onQuit, }) {
48
- const { Text, useInput } = (0, ink_context_1.useInk)();
49
- // Wire up keybindings
50
- useInput((0, react_1.useCallback)((input) => {
51
- if (input === 'r' && onRetry)
52
- onRetry();
53
- if (input === 'q' && onQuit)
54
- onQuit();
55
- }, [onRetry, onQuit]));
56
- const children = [];
57
- // Static metronome — always center frame (index 1), rendered dim
58
- const brailleFrames = (0, platform_1.metronomeBrailleFrames)();
59
- const staticFrame = brailleFrames[1];
60
- for (let i = 0; i < staticFrame.length; i++) {
61
- if (i > 0)
62
- children.push('\n');
63
- children.push(react_1.default.createElement(react_1.default.Fragment, { key: `m-${i}` }, ...staticFrame[i].map((seg, j) => react_1.default.createElement(Text, { key: j, color: theme_1.THEME.dim }, seg.char))));
64
- }
65
- // Title
66
- children.push('\n\n');
67
- children.push(react_1.default.createElement(Text, { key: 'title', bold: true, color: theme_1.THEME.accent }, ' agent-tempo'));
68
- children.push('\n');
69
- children.push(react_1.default.createElement(Text, { key: 'sub', color: theme_1.THEME.dim }, ' Multi-session orchestration via Temporal'));
70
- children.push('\n');
71
- children.push(react_1.default.createElement(Text, { key: 'ver', color: theme_1.THEME.muted }, ` v${version}`));
72
- // Error header
73
- children.push('\n\n');
74
- children.push(react_1.default.createElement(Text, { key: 'err', bold: true, color: theme_1.THEME.error }, ' \u26A0 Connection Failed'));
75
- // Checklist
76
- children.push('\n');
77
- for (let i = 0; i < checks.length; i++) {
78
- const check = checks[i];
79
- children.push('\n');
80
- children.push(react_1.default.createElement(Text, { key: `c-${i}`, color: check.passed ? theme_1.THEME.success : theme_1.THEME.error }, ` ${check.passed ? '\u2713' : '\u2717'} ${check.label}`));
81
- if (check.detail && !check.passed) {
82
- children.push('\n');
83
- children.push(react_1.default.createElement(Text, { key: `cd-${i}`, color: theme_1.THEME.dim }, ` ${check.detail}`));
84
- }
85
- }
86
- // Troubleshooting box (text-based border)
87
- const boxWidth = 56;
88
- const hLine = '\u2500'.repeat(boxWidth);
89
- children.push('\n\n');
90
- children.push(react_1.default.createElement(Text, { key: 'bt', color: theme_1.THEME.dim }, ` \u250C${hLine}\u2510`));
91
- children.push('\n');
92
- children.push(react_1.default.createElement(Text, { key: 'bh', bold: true, color: theme_1.THEME.warning }, ' \u2502 Troubleshooting'));
93
- children.push(react_1.default.createElement(Text, { key: 'bh2', color: theme_1.THEME.dim }, ' '.repeat(boxWidth - 17) + '\u2502'));
94
- children.push('\n');
95
- children.push(react_1.default.createElement(Text, { key: 'bs', color: theme_1.THEME.dim }, ` \u2502${' '.repeat(boxWidth)}\u2502`));
96
- const steps = [
97
- { label: '1. Start the Temporal dev server:', cmd: ' $ temporal server start-dev' },
98
- { label: '2. Or specify a custom address:', cmd: ' $ TEMPORAL_ADDRESS=host:7233 agent-tempo' },
99
- { label: '3. Check if Temporal is running:', cmd: ' $ temporal operator cluster health' },
100
- ];
101
- for (let i = 0; i < steps.length; i++) {
102
- const s = steps[i];
103
- const pad1 = ' '.repeat(Math.max(0, boxWidth - s.label.length - 2));
104
- const pad2 = ' '.repeat(Math.max(0, boxWidth - s.cmd.length - 2));
105
- children.push('\n');
106
- children.push(react_1.default.createElement(Text, { key: `s${i}a`, color: theme_1.THEME.text }, ` \u2502 ${s.label}`));
107
- children.push(react_1.default.createElement(Text, { key: `s${i}ap`, color: theme_1.THEME.dim }, `${pad1}\u2502`));
108
- children.push('\n');
109
- children.push(react_1.default.createElement(Text, { key: `s${i}b`, color: theme_1.THEME.accent }, ` \u2502 ${s.cmd}`));
110
- children.push(react_1.default.createElement(Text, { key: `s${i}bp`, color: theme_1.THEME.dim }, `${pad2}\u2502`));
111
- }
112
- children.push('\n');
113
- children.push(react_1.default.createElement(Text, { key: 'be', color: theme_1.THEME.dim }, ` \u2502${' '.repeat(boxWidth)}\u2502`));
114
- const docsUrl = 'Docs: https://github.com/vinceblank/agent-tempo#setup';
115
- const docsPad = ' '.repeat(Math.max(0, boxWidth - docsUrl.length - 2));
116
- children.push('\n');
117
- children.push(react_1.default.createElement(Text, { key: 'bd', color: theme_1.THEME.dim }, ` \u2502 ${docsUrl}${docsPad}\u2502`));
118
- children.push('\n');
119
- children.push(react_1.default.createElement(Text, { key: 'bb', color: theme_1.THEME.dim }, ` \u2514${hLine}\u2518`));
120
- // Retry progress
121
- if (retrying) {
122
- children.push('\n\n');
123
- children.push(react_1.default.createElement(Text, { key: 'retry', color: theme_1.THEME.dim }, ` Retrying in ${retryIn ?? '?'}s... (attempt ${retryAttempt ?? '?'}/${retryMax ?? 5})`));
124
- }
125
- // Keybindings
126
- children.push('\n\n');
127
- children.push(react_1.default.createElement(Text, { key: 'keys', color: theme_1.THEME.dim }, ' [r] retry now [q] quit [?] help'));
128
- return react_1.default.createElement(Text, null, ...children);
129
- }
@@ -1,54 +0,0 @@
1
- /**
2
- * HomeView — three-list landing surface (Online / Paused / Offline). Polls
3
- * `listEnsembles` every 10s; `r` forces an immediate refresh.
4
- *
5
- * Offline rows whose ensemble name matches the cwd's git-root basename are
6
- * pinned to the top of the offline list with a `⬡` badge — the visual
7
- * affordance for "press Enter to restore the ensemble you created here".
8
- * Online and Paused rows are not cwd-pinned — entering them is a no-op
9
- * navigation, not a restore that needs a per-cwd hint.
10
- */
11
- import React from 'react';
12
- import type { BootstrapBadges } from '../bootstrap-types';
13
- import type { EnsembleSummary, TempoClient } from '../../client';
14
- /**
15
- * Initial snapshot — structurally a subset of `BootstrapResult` so callers
16
- * can pass the full bootstrap result directly.
17
- */
18
- export interface HomeViewInitial {
19
- ensembles: EnsembleSummary[];
20
- cwdGitRoot: string | null;
21
- badges: BootstrapBadges;
22
- }
23
- export interface HomeViewProps {
24
- initial: HomeViewInitial;
25
- client: TempoClient;
26
- onEnterEnsemble: (name: string) => void;
27
- onCreateEnsemble: () => void;
28
- onLoadLineup: () => void;
29
- onRestoreEnsemble: (name: string) => void;
30
- onQuit: () => void;
31
- }
32
- interface SortedLists {
33
- online: EnsembleSummary[];
34
- paused: EnsembleSummary[];
35
- offline: EnsembleSummary[];
36
- /**
37
- * Flat sequence used for keyboard navigation. Order matches render
38
- * order: Online → Paused → Offline (cwd-match offline rows first).
39
- */
40
- flat: Array<{
41
- ensemble: EnsembleSummary;
42
- isCwdMatch: boolean;
43
- }>;
44
- /** Count of cwd-matched offline ensembles pinned at the top of the offline list. */
45
- cwdMatchCount: number;
46
- }
47
- /**
48
- * Split + sort ensembles into Online / Paused / Offline lists with
49
- * cwd-match rows pinned to the top of the Offline list. Pure function for
50
- * testability.
51
- */
52
- export declare function partitionEnsembles(ensembles: readonly EnsembleSummary[], cwdGitRoot: string | null, cwdMatcher?: (ensemble: EnsembleSummary, gitRoot: string) => boolean): SortedLists;
53
- export declare function HomeView(props: HomeViewProps): React.ReactElement;
54
- export {};