zelari-code 0.2.2 → 0.6.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 (126) hide show
  1. package/README.md +97 -2
  2. package/dist/agents/councilApi.js +7 -7
  3. package/dist/agents/councilApi.js.map +1 -1
  4. package/dist/agents/councilDirectives.js +3 -3
  5. package/dist/agents/promoteMember.js +2 -2
  6. package/dist/agents/roles.js +32 -32
  7. package/dist/agents/roles.js.map +1 -1
  8. package/dist/agents/skills/builtin/debugging.js +4 -4
  9. package/dist/agents/skills/builtin/debugging.js.map +1 -1
  10. package/dist/agents/skills/builtin/docs.js +13 -23
  11. package/dist/agents/skills/builtin/docs.js.map +1 -1
  12. package/dist/agents/skills/builtin/git-ops.js +3 -3
  13. package/dist/agents/skills/builtin/git-ops.js.map +1 -1
  14. package/dist/agents/skills/builtin/planning.js +4 -4
  15. package/dist/agents/skills/builtin/planning.js.map +1 -1
  16. package/dist/agents/skills/builtin/refactoring.js +3 -3
  17. package/dist/agents/skills/builtin/refactoring.js.map +1 -1
  18. package/dist/agents/skills/builtin/review.js +9 -9
  19. package/dist/agents/skills/builtin/review.js.map +1 -1
  20. package/dist/agents/skills/builtin/testing.js +3 -3
  21. package/dist/agents/skills/builtin/testing.js.map +1 -1
  22. package/dist/agents/tools.js +9 -2
  23. package/dist/agents/tools.js.map +1 -1
  24. package/dist/cli/app.js +94 -1861
  25. package/dist/cli/app.js.map +1 -1
  26. package/dist/cli/compaction.js.map +1 -1
  27. package/dist/cli/components/ChatStream.js +81 -14
  28. package/dist/cli/components/ChatStream.js.map +1 -1
  29. package/dist/cli/components/CollapsibleToolOutput.js +26 -3
  30. package/dist/cli/components/CollapsibleToolOutput.js.map +1 -1
  31. package/dist/cli/components/Header.js +20 -1
  32. package/dist/cli/components/Header.js.map +1 -1
  33. package/dist/cli/components/InputBar.js +34 -2
  34. package/dist/cli/components/InputBar.js.map +1 -1
  35. package/dist/cli/components/Sidebar.js +30 -10
  36. package/dist/cli/components/Sidebar.js.map +1 -1
  37. package/dist/cli/councilDispatcher.js +10 -2
  38. package/dist/cli/councilDispatcher.js.map +1 -1
  39. package/dist/cli/headless.js +137 -0
  40. package/dist/cli/headless.js.map +1 -0
  41. package/dist/cli/hooks/chatStats.js +28 -0
  42. package/dist/cli/hooks/chatStats.js.map +1 -0
  43. package/dist/cli/hooks/eventsToMessages.js +111 -0
  44. package/dist/cli/hooks/eventsToMessages.js.map +1 -0
  45. package/dist/cli/hooks/messageHelpers.js +125 -0
  46. package/dist/cli/hooks/messageHelpers.js.map +1 -0
  47. package/dist/cli/hooks/skillCompare.js +69 -0
  48. package/dist/cli/hooks/skillCompare.js.map +1 -0
  49. package/dist/cli/hooks/steer.js +28 -0
  50. package/dist/cli/hooks/steer.js.map +1 -0
  51. package/dist/cli/hooks/useBatchedMessages.js +67 -0
  52. package/dist/cli/hooks/useBatchedMessages.js.map +1 -0
  53. package/dist/cli/hooks/useChatTurn.js +363 -0
  54. package/dist/cli/hooks/useChatTurn.js.map +1 -0
  55. package/dist/cli/hooks/useSession.js +116 -0
  56. package/dist/cli/hooks/useSession.js.map +1 -0
  57. package/dist/cli/hooks/useSlashDispatch.js +303 -0
  58. package/dist/cli/hooks/useSlashDispatch.js.map +1 -0
  59. package/dist/cli/hooks/useTerminalSize.js +60 -0
  60. package/dist/cli/hooks/useTerminalSize.js.map +1 -0
  61. package/dist/cli/main.bundled.js +25212 -21722
  62. package/dist/cli/main.bundled.js.map +4 -4
  63. package/dist/cli/main.js +86 -2
  64. package/dist/cli/main.js.map +1 -1
  65. package/dist/cli/provider/openai-compatible.js +9 -2
  66. package/dist/cli/provider/openai-compatible.js.map +1 -1
  67. package/dist/cli/runHeadless.js +160 -0
  68. package/dist/cli/runHeadless.js.map +1 -0
  69. package/dist/cli/sessionManager.js +47 -1
  70. package/dist/cli/sessionManager.js.map +1 -1
  71. package/dist/cli/skillSuggest.js +1 -1
  72. package/dist/cli/slashCommands.js +72 -3
  73. package/dist/cli/slashCommands.js.map +1 -1
  74. package/dist/cli/slashHandlers/branch.js +57 -0
  75. package/dist/cli/slashHandlers/branch.js.map +1 -0
  76. package/dist/cli/slashHandlers/git.js +40 -0
  77. package/dist/cli/slashHandlers/git.js.map +1 -0
  78. package/dist/cli/slashHandlers/promoteMember.js +25 -0
  79. package/dist/cli/slashHandlers/promoteMember.js.map +1 -0
  80. package/dist/cli/slashHandlers/provider.js +199 -0
  81. package/dist/cli/slashHandlers/provider.js.map +1 -0
  82. package/dist/cli/slashHandlers/skills.js +82 -0
  83. package/dist/cli/slashHandlers/skills.js.map +1 -0
  84. package/dist/cli/slashHandlers/transcript.js +13 -0
  85. package/dist/cli/slashHandlers/transcript.js.map +1 -0
  86. package/dist/cli/slashHandlers/updater.js +40 -0
  87. package/dist/cli/slashHandlers/updater.js.map +1 -0
  88. package/dist/cli/slashHandlers/workspace.js +118 -0
  89. package/dist/cli/slashHandlers/workspace.js.map +1 -0
  90. package/dist/cli/toolRegistry.js +17 -8
  91. package/dist/cli/toolRegistry.js.map +1 -1
  92. package/dist/cli/utils/duration.js +34 -0
  93. package/dist/cli/utils/duration.js.map +1 -0
  94. package/dist/cli/wizard/firstRun.js +63 -0
  95. package/dist/cli/wizard/firstRun.js.map +1 -0
  96. package/dist/cli/wizard/index.js +150 -0
  97. package/dist/cli/wizard/index.js.map +1 -0
  98. package/dist/cli/wizard/runWizard.js +137 -0
  99. package/dist/cli/wizard/runWizard.js.map +1 -0
  100. package/dist/cli/wizard/useWizardState.js +151 -0
  101. package/dist/cli/wizard/useWizardState.js.map +1 -0
  102. package/dist/cli/workspace/agentsMd.js +314 -0
  103. package/dist/cli/workspace/agentsMd.js.map +1 -0
  104. package/dist/cli/workspace/index.js +24 -0
  105. package/dist/cli/workspace/index.js.map +1 -0
  106. package/dist/cli/workspace/paths.js +88 -0
  107. package/dist/cli/workspace/paths.js.map +1 -0
  108. package/dist/cli/workspace/postCouncilHook.js +38 -0
  109. package/dist/cli/workspace/postCouncilHook.js.map +1 -0
  110. package/dist/cli/workspace/storage.js +392 -0
  111. package/dist/cli/workspace/storage.js.map +1 -0
  112. package/dist/cli/workspace/stubs.js +528 -0
  113. package/dist/cli/workspace/stubs.js.map +1 -0
  114. package/dist/cli/workspace/toolRegistry.js +61 -0
  115. package/dist/cli/workspace/toolRegistry.js.map +1 -0
  116. package/dist/cli/workspace/types.js +10 -0
  117. package/dist/cli/workspace/types.js.map +1 -0
  118. package/dist/main/core/tools/builtin/_walk.js +129 -0
  119. package/dist/main/core/tools/builtin/_walk.js.map +1 -0
  120. package/dist/main/core/tools/builtin/diff.js +477 -0
  121. package/dist/main/core/tools/builtin/diff.js.map +1 -0
  122. package/dist/main/core/tools/builtin/listFiles.js +5 -43
  123. package/dist/main/core/tools/builtin/listFiles.js.map +1 -1
  124. package/dist/main/core/tools/builtin/search.js +120 -28
  125. package/dist/main/core/tools/builtin/search.js.map +1 -1
  126. package/package.json +10 -2
@@ -0,0 +1,303 @@
1
+ // @ts-nocheck — pre-existing strict-mode type narrowing issues carried over
2
+ // from app.tsx. Runtime is correct; tighten signatures in a follow-up.
3
+ import { useCallback } from 'react';
4
+ import { handleSlashCommand } from '../slashCommands.js';
5
+ import { appendSystem, appendUser } from './messageHelpers.js';
6
+ import { sessionKindRouter } from '../sessionManager.js';
7
+ import { newSessionId } from '../sessionManager.js';
8
+ import { handleDiff, handleUndo } from '../slashHandlers/git.js';
9
+ import { handleCompact } from '../slashHandlers/transcript.js';
10
+ import { handleUpdateCheck, handleUpdatePerform } from '../slashHandlers/updater.js';
11
+ import { handlePromoteMember } from '../slashHandlers/promoteMember.js';
12
+ import { handleBranchCreate, handleBranchList, handleBranchCheckout, } from '../slashHandlers/branch.js';
13
+ import { handleWorkspaceShow, handleWorkspaceSync, handleWorkspaceReset, } from '../slashHandlers/workspace.js';
14
+ import { handleProviderList, handleProviderSet, handleProviderCustom, handleProviderRefresh, handleProviderStatus, handleLoginKey, handleLoginOAuthGrok, handleModelShow, handleModelSet, handleModelsList, handleModelsRefresh, } from '../slashHandlers/provider.js';
15
+ import { handleSkillStats, handleSkillCompare, handleCouncilFeedback, handleSteer, handleClearChat, } from '../slashHandlers/skills.js';
16
+ export function useSlashDispatch(params) {
17
+ const { skills, sessionId, messages, setMessages, setInput, setBusy, setSessionId, setSessionActive, setProviderConfig, activeProviderSpec, activeModel, providerDefaults, harnessRef, setQueueCount, dispatchPrompt, dispatchCouncilPrompt, } = params;
18
+ return useCallback(async (value) => {
19
+ if (!value.trim())
20
+ return;
21
+ // We can't read `busy` here (would need to be a dep); the InputBar is
22
+ // disabled when busy, so this is a belt-and-suspenders guard.
23
+ const result = handleSlashCommand(value, skills);
24
+ // Base context — passed to every handler that needs chat state.
25
+ const baseCtx = { setMessages, setInput };
26
+ // Some handlers (e.g. handleCompact) need read access to the live message
27
+ // list — supply a wider ctx for them.
28
+ const fullCtx = { ...baseCtx, messages };
29
+ const providerCtx = {
30
+ ...baseCtx, setProviderConfig, setBusy,
31
+ activeProviderSpec, activeModel, providerDefaults,
32
+ };
33
+ const skillCtx = { ...baseCtx, setBusy, sessionId };
34
+ const branchCtx = { ...baseCtx, sessionId };
35
+ const steerCtx = { ...skillCtx, harnessRef, setQueueCount, dispatchPrompt };
36
+ // Local refs to optional callbacks so the closure types are tight.
37
+ const { onNewSession, onExit } = params;
38
+ // ── Unhandled: free-form prompt → dispatch to LLM ──
39
+ if (!result.handled) {
40
+ appendUser(setMessages, value);
41
+ setSessionActive(true);
42
+ await dispatchPrompt(value);
43
+ setInput('');
44
+ return;
45
+ }
46
+ // ── Session kinds ──
47
+ if (result.kind === 'session' || result.kind === 'resume' || result.kind === 'new') {
48
+ // Session-kind commands touch the persistence layer (sessions directory,
49
+ // current-session marker, writerRef) which lives in App. We delegate
50
+ // to the helpers exported from sessionManager and apply the writerRef
51
+ // + messages reset ourselves.
52
+ if (result.kind === 'session') {
53
+ const { message: sysMsg } = await sessionKindRouter('session');
54
+ appendSystem(setMessages, sysMsg);
55
+ }
56
+ else if (result.kind === 'resume' && result.targetSessionId) {
57
+ const { message: sysMsg } = await sessionKindRouter('resume', result.targetSessionId);
58
+ appendSystem(setMessages, sysMsg);
59
+ }
60
+ else if (result.kind === 'new') {
61
+ // Generate the id HERE (not inside sessionKindRouter) so the in-memory
62
+ // state, the on-disk current-session marker, and the writerRef ALL
63
+ // share the same id. The previous split-brain bug fired both
64
+ // sessionKindRouter's internal newSessionId() AND a second
65
+ // newSessionId() here, leaving idA on disk and idB in memory.
66
+ const id = newSessionId();
67
+ const { message: sysMsg } = await sessionKindRouter('new', undefined, id);
68
+ appendSystem(setMessages, sysMsg);
69
+ setSessionId(id);
70
+ setMessages([]);
71
+ setSessionActive(false);
72
+ onNewSession?.(id);
73
+ }
74
+ setInput('');
75
+ return;
76
+ }
77
+ // ── Council ──
78
+ if (result.kind === 'council' && result.councilInput) {
79
+ appendUser(setMessages, `/council ${result.councilInput}`);
80
+ setSessionActive(true);
81
+ setInput('');
82
+ await dispatchCouncilPrompt(result.councilInput);
83
+ return;
84
+ }
85
+ // ── Council feedback ──
86
+ if (result.kind === 'council_feedback' && result.feedbackMemberId && typeof result.feedbackScore === 'number') {
87
+ handleCouncilFeedback(skillCtx, result.feedbackMemberId, result.feedbackScore, result.feedbackNote);
88
+ setInput('');
89
+ return;
90
+ }
91
+ // ── Provider ops ──
92
+ if (result.kind === 'provider_set' && result.provider) {
93
+ handleProviderSet(providerCtx, result.provider);
94
+ setInput('');
95
+ return;
96
+ }
97
+ if (result.kind === 'provider_list') {
98
+ handleProviderList(providerCtx);
99
+ setInput('');
100
+ return;
101
+ }
102
+ if (result.kind === 'provider_custom') {
103
+ handleProviderCustom(providerCtx, {
104
+ endpoint: result.customEndpoint,
105
+ clear: result.customClear,
106
+ message: result.message,
107
+ });
108
+ setInput('');
109
+ return;
110
+ }
111
+ if (result.kind === 'provider_refresh' && result.provider) {
112
+ await handleProviderRefresh(providerCtx, result.provider);
113
+ setInput('');
114
+ return;
115
+ }
116
+ if (result.kind === 'provider_status' && result.provider) {
117
+ await handleProviderStatus(providerCtx, result.provider);
118
+ setInput('');
119
+ return;
120
+ }
121
+ // ── Login ──
122
+ if (result.kind === 'login' && result.provider && result.loginKey) {
123
+ await handleLoginKey(providerCtx, result.provider, result.loginKey);
124
+ setInput('');
125
+ return;
126
+ }
127
+ if (result.kind === 'login_oauth' && result.provider === 'grok') {
128
+ await handleLoginOAuthGrok(providerCtx);
129
+ setInput('');
130
+ return;
131
+ }
132
+ // ── Model ──
133
+ if (result.kind === 'model_set' && result.model) {
134
+ handleModelSet(providerCtx, result.model);
135
+ setInput('');
136
+ return;
137
+ }
138
+ if (result.kind === 'model_show') {
139
+ handleModelShow(providerCtx);
140
+ setInput('');
141
+ return;
142
+ }
143
+ if (result.kind === 'models_list') {
144
+ handleModelsList(providerCtx);
145
+ setInput('');
146
+ return;
147
+ }
148
+ if (result.kind === 'models_refresh' || result.kind === 'model_refresh') {
149
+ handleModelsRefresh(providerCtx);
150
+ setInput('');
151
+ return;
152
+ }
153
+ // ── Branch ──
154
+ if (result.kind === 'branch_create' && result.branchName) {
155
+ if (!sessionId) {
156
+ appendSystem(setMessages, '[branch] no active session — wait for bootstrap or run a prompt first');
157
+ }
158
+ else {
159
+ await handleBranchCreate(branchCtx, result.branchName);
160
+ }
161
+ setInput('');
162
+ return;
163
+ }
164
+ if (result.kind === 'branch_list') {
165
+ await handleBranchList(branchCtx);
166
+ setInput('');
167
+ return;
168
+ }
169
+ if (result.kind === 'branch_checkout' && result.branchName) {
170
+ await handleBranchCheckout(branchCtx, result.branchName);
171
+ setInput('');
172
+ return;
173
+ }
174
+ // ── Steer ──
175
+ if (result.kind === 'steer' || result.kind === 'steer_interrupt') {
176
+ await handleSteer(steerCtx, result.steerText, result.message);
177
+ setInput('');
178
+ return;
179
+ }
180
+ if (result.kind === 'steer_no_active_run') {
181
+ if (result.message)
182
+ appendSystem(setMessages, result.message);
183
+ setInput('');
184
+ return;
185
+ }
186
+ // ── Update ──
187
+ if (result.kind === 'update_check') {
188
+ await handleUpdateCheck(baseCtx);
189
+ setInput('');
190
+ return;
191
+ }
192
+ if (result.kind === 'update_perform') {
193
+ await handleUpdatePerform(baseCtx);
194
+ setInput('');
195
+ return;
196
+ }
197
+ if (result.kind === 'update_usage') {
198
+ appendSystem(setMessages, result.message ?? 'Usage: /update [--yes|-y]');
199
+ setInput('');
200
+ return;
201
+ }
202
+ // ── Workspace ──
203
+ if (result.kind === 'workspace') {
204
+ appendSystem(setMessages, result.message ?? 'Usage: /workspace (see /workspace --help or docs/plans/2026-07-01-council-workspace-cli-stubs.md)');
205
+ setInput('');
206
+ return;
207
+ }
208
+ if (result.kind === 'workspace_show' && result.workspaceWhat) {
209
+ const what = result.workspaceWhat;
210
+ await handleWorkspaceShow(baseCtx, what);
211
+ setInput('');
212
+ return;
213
+ }
214
+ if (result.kind === 'workspace_sync') {
215
+ await handleWorkspaceSync(baseCtx);
216
+ setInput('');
217
+ return;
218
+ }
219
+ if (result.kind === 'workspace_reset') {
220
+ await handleWorkspaceReset(baseCtx, !!result.workspaceForce);
221
+ setInput('');
222
+ return;
223
+ }
224
+ // ── Compact ──
225
+ if (result.kind === 'compact') {
226
+ handleCompact(fullCtx, result.compactThreshold, result.compactKeepRecent);
227
+ setInput('');
228
+ return;
229
+ }
230
+ // ── Diff / undo ──
231
+ if (result.kind === 'diff') {
232
+ await handleDiff(baseCtx, !!result.diffStaged);
233
+ setInput('');
234
+ return;
235
+ }
236
+ if (result.kind === 'undo' || result.kind === 'undo_confirm') {
237
+ await handleUndo(baseCtx, result.message, result.kind === 'undo_confirm' && !!result.undoConfirmed);
238
+ setInput('');
239
+ return;
240
+ }
241
+ // ── Promote member ──
242
+ if (result.kind === 'promote_member' && result.promoteMemberId) {
243
+ await handlePromoteMember(baseCtx, result.promoteMemberId);
244
+ setInput('');
245
+ return;
246
+ }
247
+ if (result.kind === 'promote_member_error') {
248
+ appendSystem(setMessages, result.promoteMemberError ?? 'Usage: /promote-member <memberId>');
249
+ setInput('');
250
+ return;
251
+ }
252
+ // ── Skill stats / compare ──
253
+ if (result.kind === 'skill_stats') {
254
+ await handleSkillStats(skillCtx, result.skillStatsSkillId);
255
+ setInput('');
256
+ return;
257
+ }
258
+ if (result.kind === 'skill-compare') {
259
+ await handleSkillCompare(skillCtx, result.compareIds, result.message);
260
+ setInput('');
261
+ return;
262
+ }
263
+ // ── Skill invocation (special: dispatches to LLM) ──
264
+ if (result.kind === 'skill' && result.expandedSkill) {
265
+ // The skill's expanded prompt goes through the normal chat-turn pipeline
266
+ // so it gets logged, streamed, and session-stats-tracked.
267
+ const sysMsg = result.message
268
+ ?? `[skill] ${result.expandedSkill.skillId} — prompt ready (dispatch lands in Phase 14.7)`;
269
+ appendSystem(setMessages, sysMsg);
270
+ setInput('');
271
+ await dispatchPrompt(result.expandedSkill.prompt);
272
+ return;
273
+ }
274
+ // ── Clear / exit ──
275
+ if (result.kind === 'clear') {
276
+ handleClearChat(setMessages, setSessionActive);
277
+ setInput('');
278
+ return;
279
+ }
280
+ if (result.kind === 'exit') {
281
+ // Hand off to the App via callback so writerRef close + process.exit
282
+ // happen in the right place.
283
+ setInput('');
284
+ onExit?.();
285
+ return;
286
+ }
287
+ // ── Help / unknown ──
288
+ if (result.message) {
289
+ appendSystem(setMessages, result.message);
290
+ setInput('');
291
+ return;
292
+ }
293
+ appendSystem(setMessages, `[${result.kind}] handled`);
294
+ setInput('');
295
+ }, [
296
+ skills, sessionId, messages,
297
+ setMessages, setInput, setBusy, setSessionId, setSessionActive, setProviderConfig,
298
+ activeProviderSpec, activeModel, providerDefaults,
299
+ harnessRef, setQueueCount, dispatchPrompt, dispatchCouncilPrompt,
300
+ params,
301
+ ]);
302
+ }
303
+ //# sourceMappingURL=useSlashDispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSlashDispatch.js","sourceRoot":"","sources":["../../../src/cli/hooks/useSlashDispatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { useStdout } from 'ink';
3
+ /**
4
+ * useTerminalSize — reactive stdout dimensions.
5
+ *
6
+ * Returns the current terminal size and re-renders on resize events.
7
+ * Coalesces bursts of resize events into a single state update per
8
+ * animation frame so a fast drag doesn't trigger 100+ redraws.
9
+ *
10
+ * Extracted from app.tsx (Task v0.4.2 audit split) so it can be unit-tested
11
+ * and reused by other components that care about dimensions (Sidebar,
12
+ * ChatStream already take height/width as props).
13
+ */
14
+ export function useTerminalSize(options = {}) {
15
+ const { defaults = { columns: 80, rows: 24 }, coalesceMs = 16 } = options;
16
+ const { stdout } = useStdout();
17
+ const [size, setSize] = useState({
18
+ columns: stdout?.columns ?? defaults.columns,
19
+ rows: stdout?.rows ?? defaults.rows,
20
+ });
21
+ useEffect(() => {
22
+ if (!stdout)
23
+ return;
24
+ // v0.4.3 audit fix: if stdout resolves AFTER the initial render (e.g.
25
+ // test bootstrap or some terminal wrappers), the size would stay at
26
+ // the default 80x24 until the user manually resized. Pull the current
27
+ // dimensions immediately when stdout becomes available.
28
+ setSize({
29
+ columns: stdout.columns ?? defaults.columns,
30
+ rows: stdout.rows ?? defaults.rows,
31
+ });
32
+ let rafId = null;
33
+ const handleResize = () => {
34
+ if (coalesceMs <= 0) {
35
+ setSize({
36
+ columns: stdout.columns ?? defaults.columns,
37
+ rows: stdout.rows ?? defaults.rows,
38
+ });
39
+ return;
40
+ }
41
+ if (rafId !== null)
42
+ clearTimeout(rafId);
43
+ rafId = setTimeout(() => {
44
+ setSize({
45
+ columns: stdout.columns ?? defaults.columns,
46
+ rows: stdout.rows ?? defaults.rows,
47
+ });
48
+ rafId = null;
49
+ }, coalesceMs);
50
+ };
51
+ stdout.on('resize', handleResize);
52
+ return () => {
53
+ stdout.off('resize', handleResize);
54
+ if (rafId !== null)
55
+ clearTimeout(rafId);
56
+ };
57
+ }, [stdout, defaults.columns, defaults.rows, coalesceMs]);
58
+ return size;
59
+ }
60
+ //# sourceMappingURL=useTerminalSize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTerminalSize.js","sourceRoot":"","sources":["../../../src/cli/hooks/useTerminalSize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAmBhC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,UAA+B,EAAE;IAC/D,MAAM,EAAE,QAAQ,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IAC1E,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAe;QAC7C,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,QAAQ,CAAC,OAAO;QAC5C,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,QAAQ,CAAC,IAAI;KACpC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,sEAAsE;QACtE,oEAAoE;QACpE,sEAAsE;QACtE,wDAAwD;QACxD,OAAO,CAAC;YACN,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO;YAC3C,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI;SACnC,CAAC,CAAC;QACH,IAAI,KAAK,GAAyC,IAAI,CAAC;QACvD,MAAM,YAAY,GAAG,GAAG,EAAE;YACxB,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;gBACpB,OAAO,CAAC;oBACN,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO;oBAC3C,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI;iBACnC,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,IAAI,KAAK,KAAK,IAAI;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YACxC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBACtB,OAAO,CAAC;oBACN,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO;oBAC3C,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI;iBACnC,CAAC,CAAC;gBACH,KAAK,GAAG,IAAI,CAAC;YACf,CAAC,EAAE,UAAU,CAAC,CAAC;QACjB,CAAC,CAAC;QACF,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACnC,IAAI,KAAK,KAAK,IAAI;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;IAE1D,OAAO,IAAI,CAAC;AACd,CAAC"}