@dsh-cc/tui 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +144 -0
  3. package/lib/bash-history.d.ts +31 -0
  4. package/lib/bash-history.d.ts.map +1 -0
  5. package/lib/bash-history.js +94 -0
  6. package/lib/bash-history.js.map +1 -0
  7. package/lib/compact-fold.d.ts +35 -0
  8. package/lib/compact-fold.d.ts.map +1 -0
  9. package/lib/compact-fold.js +60 -0
  10. package/lib/compact-fold.js.map +1 -0
  11. package/lib/components/arg-completers.d.ts +22 -0
  12. package/lib/components/arg-completers.d.ts.map +1 -0
  13. package/lib/components/arg-completers.js +75 -0
  14. package/lib/components/arg-completers.js.map +1 -0
  15. package/lib/components/code-theme.d.ts +25 -0
  16. package/lib/components/code-theme.d.ts.map +1 -0
  17. package/lib/components/code-theme.js +137 -0
  18. package/lib/components/code-theme.js.map +1 -0
  19. package/lib/components/completion.d.ts +50 -0
  20. package/lib/components/completion.d.ts.map +1 -0
  21. package/lib/components/completion.js +279 -0
  22. package/lib/components/completion.js.map +1 -0
  23. package/lib/components/diff-card.d.ts +29 -0
  24. package/lib/components/diff-card.d.ts.map +1 -0
  25. package/lib/components/diff-card.js +175 -0
  26. package/lib/components/diff-card.js.map +1 -0
  27. package/lib/components/diff-hunks.d.ts +44 -0
  28. package/lib/components/diff-hunks.d.ts.map +1 -0
  29. package/lib/components/diff-hunks.js +188 -0
  30. package/lib/components/diff-hunks.js.map +1 -0
  31. package/lib/components/editor-history.d.ts +23 -0
  32. package/lib/components/editor-history.d.ts.map +1 -0
  33. package/lib/components/editor-history.js +29 -0
  34. package/lib/components/editor-history.js.map +1 -0
  35. package/lib/components/markdown-theme.d.ts +11 -0
  36. package/lib/components/markdown-theme.d.ts.map +1 -0
  37. package/lib/components/markdown-theme.js +29 -0
  38. package/lib/components/markdown-theme.js.map +1 -0
  39. package/lib/components/masked-input.d.ts +24 -0
  40. package/lib/components/masked-input.d.ts.map +1 -0
  41. package/lib/components/masked-input.js +168 -0
  42. package/lib/components/masked-input.js.map +1 -0
  43. package/lib/components/overlay-host.d.ts +31 -0
  44. package/lib/components/overlay-host.d.ts.map +1 -0
  45. package/lib/components/overlay-host.js +128 -0
  46. package/lib/components/overlay-host.js.map +1 -0
  47. package/lib/components/overlays.d.ts +94 -0
  48. package/lib/components/overlays.d.ts.map +1 -0
  49. package/lib/components/overlays.js +450 -0
  50. package/lib/components/overlays.js.map +1 -0
  51. package/lib/components/provider-box.d.ts +23 -0
  52. package/lib/components/provider-box.d.ts.map +1 -0
  53. package/lib/components/provider-box.js +164 -0
  54. package/lib/components/provider-box.js.map +1 -0
  55. package/lib/components/read-group.d.ts +51 -0
  56. package/lib/components/read-group.d.ts.map +1 -0
  57. package/lib/components/read-group.js +105 -0
  58. package/lib/components/read-group.js.map +1 -0
  59. package/lib/components/root-bash.d.ts +36 -0
  60. package/lib/components/root-bash.d.ts.map +1 -0
  61. package/lib/components/root-bash.js +112 -0
  62. package/lib/components/root-bash.js.map +1 -0
  63. package/lib/components/root-types.d.ts +42 -0
  64. package/lib/components/root-types.d.ts.map +1 -0
  65. package/lib/components/root-types.js +8 -0
  66. package/lib/components/root-types.js.map +1 -0
  67. package/lib/components/root-utils.d.ts +22 -0
  68. package/lib/components/root-utils.d.ts.map +1 -0
  69. package/lib/components/root-utils.js +45 -0
  70. package/lib/components/root-utils.js.map +1 -0
  71. package/lib/components/root.d.ts +25 -0
  72. package/lib/components/root.d.ts.map +1 -0
  73. package/lib/components/root.js +357 -0
  74. package/lib/components/root.js.map +1 -0
  75. package/lib/components/theme.d.ts +61 -0
  76. package/lib/components/theme.d.ts.map +1 -0
  77. package/lib/components/theme.js +99 -0
  78. package/lib/components/theme.js.map +1 -0
  79. package/lib/components/transcript.d.ts +43 -0
  80. package/lib/components/transcript.d.ts.map +1 -0
  81. package/lib/components/transcript.js +203 -0
  82. package/lib/components/transcript.js.map +1 -0
  83. package/lib/components/working-line.d.ts +35 -0
  84. package/lib/components/working-line.d.ts.map +1 -0
  85. package/lib/components/working-line.js +66 -0
  86. package/lib/components/working-line.js.map +1 -0
  87. package/lib/effort-catalog.d.ts +27 -0
  88. package/lib/effort-catalog.d.ts.map +1 -0
  89. package/lib/effort-catalog.js +36 -0
  90. package/lib/effort-catalog.js.map +1 -0
  91. package/lib/export-markdown.d.ts +18 -0
  92. package/lib/export-markdown.d.ts.map +1 -0
  93. package/lib/export-markdown.js +124 -0
  94. package/lib/export-markdown.js.map +1 -0
  95. package/lib/harness/approval-preview.d.ts +33 -0
  96. package/lib/harness/approval-preview.d.ts.map +1 -0
  97. package/lib/harness/approval-preview.js +179 -0
  98. package/lib/harness/approval-preview.js.map +1 -0
  99. package/lib/harness/boot-banner.d.ts +14 -0
  100. package/lib/harness/boot-banner.d.ts.map +1 -0
  101. package/lib/harness/boot-banner.js +89 -0
  102. package/lib/harness/boot-banner.js.map +1 -0
  103. package/lib/harness/driver-agent.d.ts +78 -0
  104. package/lib/harness/driver-agent.d.ts.map +1 -0
  105. package/lib/harness/driver-agent.js +314 -0
  106. package/lib/harness/driver-agent.js.map +1 -0
  107. package/lib/harness/driver-agents.d.ts +20 -0
  108. package/lib/harness/driver-agents.d.ts.map +1 -0
  109. package/lib/harness/driver-agents.js +123 -0
  110. package/lib/harness/driver-agents.js.map +1 -0
  111. package/lib/harness/driver-approvals.d.ts +38 -0
  112. package/lib/harness/driver-approvals.d.ts.map +1 -0
  113. package/lib/harness/driver-approvals.js +277 -0
  114. package/lib/harness/driver-approvals.js.map +1 -0
  115. package/lib/harness/driver-bash.d.ts +15 -0
  116. package/lib/harness/driver-bash.d.ts.map +1 -0
  117. package/lib/harness/driver-bash.js +73 -0
  118. package/lib/harness/driver-bash.js.map +1 -0
  119. package/lib/harness/driver-catalog.d.ts +84 -0
  120. package/lib/harness/driver-catalog.d.ts.map +1 -0
  121. package/lib/harness/driver-catalog.js +256 -0
  122. package/lib/harness/driver-catalog.js.map +1 -0
  123. package/lib/harness/driver-ctx.d.ts +462 -0
  124. package/lib/harness/driver-ctx.d.ts.map +1 -0
  125. package/lib/harness/driver-ctx.js +11 -0
  126. package/lib/harness/driver-ctx.js.map +1 -0
  127. package/lib/harness/driver-hud.d.ts +31 -0
  128. package/lib/harness/driver-hud.d.ts.map +1 -0
  129. package/lib/harness/driver-hud.js +204 -0
  130. package/lib/harness/driver-hud.js.map +1 -0
  131. package/lib/harness/driver-live.d.ts +36 -0
  132. package/lib/harness/driver-live.d.ts.map +1 -0
  133. package/lib/harness/driver-live.js +44 -0
  134. package/lib/harness/driver-live.js.map +1 -0
  135. package/lib/harness/driver-modal.d.ts +52 -0
  136. package/lib/harness/driver-modal.d.ts.map +1 -0
  137. package/lib/harness/driver-modal.js +78 -0
  138. package/lib/harness/driver-modal.js.map +1 -0
  139. package/lib/harness/driver-mode.d.ts +35 -0
  140. package/lib/harness/driver-mode.d.ts.map +1 -0
  141. package/lib/harness/driver-mode.js +84 -0
  142. package/lib/harness/driver-mode.js.map +1 -0
  143. package/lib/harness/driver-pickers.d.ts +48 -0
  144. package/lib/harness/driver-pickers.d.ts.map +1 -0
  145. package/lib/harness/driver-pickers.js +249 -0
  146. package/lib/harness/driver-pickers.js.map +1 -0
  147. package/lib/harness/driver-promote.d.ts +29 -0
  148. package/lib/harness/driver-promote.d.ts.map +1 -0
  149. package/lib/harness/driver-promote.js +36 -0
  150. package/lib/harness/driver-promote.js.map +1 -0
  151. package/lib/harness/driver-queue.d.ts +19 -0
  152. package/lib/harness/driver-queue.d.ts.map +1 -0
  153. package/lib/harness/driver-queue.js +281 -0
  154. package/lib/harness/driver-queue.js.map +1 -0
  155. package/lib/harness/driver-run-local.d.ts +32 -0
  156. package/lib/harness/driver-run-local.d.ts.map +1 -0
  157. package/lib/harness/driver-run-local.js +366 -0
  158. package/lib/harness/driver-run-local.js.map +1 -0
  159. package/lib/harness/driver-sessions.d.ts +28 -0
  160. package/lib/harness/driver-sessions.d.ts.map +1 -0
  161. package/lib/harness/driver-sessions.js +386 -0
  162. package/lib/harness/driver-sessions.js.map +1 -0
  163. package/lib/harness/driver.d.ts +22 -0
  164. package/lib/harness/driver.d.ts.map +1 -0
  165. package/lib/harness/driver.js +459 -0
  166. package/lib/harness/driver.js.map +1 -0
  167. package/lib/harness/preset.d.ts +32 -0
  168. package/lib/harness/preset.d.ts.map +1 -0
  169. package/lib/harness/preset.js +34 -0
  170. package/lib/harness/preset.js.map +1 -0
  171. package/lib/harness/session-list.d.ts +65 -0
  172. package/lib/harness/session-list.d.ts.map +1 -0
  173. package/lib/harness/session-list.js +91 -0
  174. package/lib/harness/session-list.js.map +1 -0
  175. package/lib/harness/shell-output.d.ts +44 -0
  176. package/lib/harness/shell-output.d.ts.map +1 -0
  177. package/lib/harness/shell-output.js +90 -0
  178. package/lib/harness/shell-output.js.map +1 -0
  179. package/lib/harness/statusline-cc-transcript.d.ts +51 -0
  180. package/lib/harness/statusline-cc-transcript.d.ts.map +1 -0
  181. package/lib/harness/statusline-cc-transcript.js +191 -0
  182. package/lib/harness/statusline-cc-transcript.js.map +1 -0
  183. package/lib/harness/statusline-command.d.ts +54 -0
  184. package/lib/harness/statusline-command.d.ts.map +1 -0
  185. package/lib/harness/statusline-command.js +161 -0
  186. package/lib/harness/statusline-command.js.map +1 -0
  187. package/lib/harness/statusline-payload.d.ts +79 -0
  188. package/lib/harness/statusline-payload.d.ts.map +1 -0
  189. package/lib/harness/statusline-payload.js +93 -0
  190. package/lib/harness/statusline-payload.js.map +1 -0
  191. package/lib/harness/statusline-settings.d.ts +47 -0
  192. package/lib/harness/statusline-settings.d.ts.map +1 -0
  193. package/lib/harness/statusline-settings.js +57 -0
  194. package/lib/harness/statusline-settings.js.map +1 -0
  195. package/lib/harness/statusline-wiring.d.ts +45 -0
  196. package/lib/harness/statusline-wiring.d.ts.map +1 -0
  197. package/lib/harness/statusline-wiring.js +247 -0
  198. package/lib/harness/statusline-wiring.js.map +1 -0
  199. package/lib/harness/usage-view.d.ts +84 -0
  200. package/lib/harness/usage-view.d.ts.map +1 -0
  201. package/lib/harness/usage-view.js +199 -0
  202. package/lib/harness/usage-view.js.map +1 -0
  203. package/lib/harness/worktree-exit.d.ts +105 -0
  204. package/lib/harness/worktree-exit.d.ts.map +1 -0
  205. package/lib/harness/worktree-exit.js +168 -0
  206. package/lib/harness/worktree-exit.js.map +1 -0
  207. package/lib/history.d.ts +50 -0
  208. package/lib/history.d.ts.map +1 -0
  209. package/lib/history.js +139 -0
  210. package/lib/history.js.map +1 -0
  211. package/lib/index.d.ts +63 -0
  212. package/lib/index.d.ts.map +1 -0
  213. package/lib/index.js +54 -0
  214. package/lib/index.js.map +1 -0
  215. package/lib/input.d.ts +158 -0
  216. package/lib/input.d.ts.map +1 -0
  217. package/lib/input.js +400 -0
  218. package/lib/input.js.map +1 -0
  219. package/lib/invariant.d.ts +14 -0
  220. package/lib/invariant.d.ts.map +1 -0
  221. package/lib/invariant.js +20 -0
  222. package/lib/invariant.js.map +1 -0
  223. package/lib/mode-cycle.d.ts +22 -0
  224. package/lib/mode-cycle.d.ts.map +1 -0
  225. package/lib/mode-cycle.js +32 -0
  226. package/lib/mode-cycle.js.map +1 -0
  227. package/lib/model-catalog.d.ts +22 -0
  228. package/lib/model-catalog.d.ts.map +1 -0
  229. package/lib/model-catalog.js +45 -0
  230. package/lib/model-catalog.js.map +1 -0
  231. package/lib/packaged-preset.d.ts +32 -0
  232. package/lib/packaged-preset.d.ts.map +1 -0
  233. package/lib/packaged-preset.js +94 -0
  234. package/lib/packaged-preset.js.map +1 -0
  235. package/lib/plugin.d.ts +11 -0
  236. package/lib/plugin.d.ts.map +1 -0
  237. package/lib/plugin.js +88 -0
  238. package/lib/plugin.js.map +1 -0
  239. package/lib/profile.d.ts +4 -0
  240. package/lib/profile.d.ts.map +1 -0
  241. package/lib/profile.js +7 -0
  242. package/lib/profile.js.map +1 -0
  243. package/lib/project-sessions.d.ts +29 -0
  244. package/lib/project-sessions.d.ts.map +1 -0
  245. package/lib/project-sessions.js +60 -0
  246. package/lib/project-sessions.js.map +1 -0
  247. package/lib/project.d.ts +75 -0
  248. package/lib/project.d.ts.map +1 -0
  249. package/lib/project.js +196 -0
  250. package/lib/project.js.map +1 -0
  251. package/lib/provider-actions.d.ts +37 -0
  252. package/lib/provider-actions.d.ts.map +1 -0
  253. package/lib/provider-actions.js +417 -0
  254. package/lib/provider-actions.js.map +1 -0
  255. package/lib/provider-command.d.ts +109 -0
  256. package/lib/provider-command.d.ts.map +1 -0
  257. package/lib/provider-command.js +220 -0
  258. package/lib/provider-command.js.map +1 -0
  259. package/lib/provider-detail.d.ts +15 -0
  260. package/lib/provider-detail.d.ts.map +1 -0
  261. package/lib/provider-detail.js +201 -0
  262. package/lib/provider-detail.js.map +1 -0
  263. package/lib/provider-flow.d.ts +191 -0
  264. package/lib/provider-flow.d.ts.map +1 -0
  265. package/lib/provider-flow.js +192 -0
  266. package/lib/provider-flow.js.map +1 -0
  267. package/lib/provider-presets.d.ts +32 -0
  268. package/lib/provider-presets.d.ts.map +1 -0
  269. package/lib/provider-presets.js +105 -0
  270. package/lib/provider-presets.js.map +1 -0
  271. package/lib/provider-read.d.ts +63 -0
  272. package/lib/provider-read.d.ts.map +1 -0
  273. package/lib/provider-read.js +115 -0
  274. package/lib/provider-read.js.map +1 -0
  275. package/lib/provider-settings.d.ts +30 -0
  276. package/lib/provider-settings.d.ts.map +1 -0
  277. package/lib/provider-settings.js +65 -0
  278. package/lib/provider-settings.js.map +1 -0
  279. package/lib/resume-target.d.ts +59 -0
  280. package/lib/resume-target.d.ts.map +1 -0
  281. package/lib/resume-target.js +143 -0
  282. package/lib/resume-target.js.map +1 -0
  283. package/lib/slash.d.ts +44 -0
  284. package/lib/slash.d.ts.map +1 -0
  285. package/lib/slash.js +81 -0
  286. package/lib/slash.js.map +1 -0
  287. package/lib/state/driver-types.d.ts +505 -0
  288. package/lib/state/driver-types.d.ts.map +1 -0
  289. package/lib/state/driver-types.js +8 -0
  290. package/lib/state/driver-types.js.map +1 -0
  291. package/lib/state/driver-usage-types.d.ts +59 -0
  292. package/lib/state/driver-usage-types.d.ts.map +1 -0
  293. package/lib/state/driver-usage-types.js +8 -0
  294. package/lib/state/driver-usage-types.js.map +1 -0
  295. package/lib/statusline.d.ts +63 -0
  296. package/lib/statusline.d.ts.map +1 -0
  297. package/lib/statusline.js +97 -0
  298. package/lib/statusline.js.map +1 -0
  299. package/lib/store/pickers.d.ts +34 -0
  300. package/lib/store/pickers.d.ts.map +1 -0
  301. package/lib/store/pickers.js +111 -0
  302. package/lib/store/pickers.js.map +1 -0
  303. package/lib/store/provider-panel.d.ts +107 -0
  304. package/lib/store/provider-panel.d.ts.map +1 -0
  305. package/lib/store/provider-panel.js +151 -0
  306. package/lib/store/provider-panel.js.map +1 -0
  307. package/lib/store/question.d.ts +21 -0
  308. package/lib/store/question.d.ts.map +1 -0
  309. package/lib/store/question.js +59 -0
  310. package/lib/store/question.js.map +1 -0
  311. package/lib/store/queue.d.ts +27 -0
  312. package/lib/store/queue.d.ts.map +1 -0
  313. package/lib/store/queue.js +34 -0
  314. package/lib/store/queue.js.map +1 -0
  315. package/lib/store/session.d.ts +73 -0
  316. package/lib/store/session.d.ts.map +1 -0
  317. package/lib/store/session.js +172 -0
  318. package/lib/store/session.js.map +1 -0
  319. package/lib/store/subagents.d.ts +16 -0
  320. package/lib/store/subagents.d.ts.map +1 -0
  321. package/lib/store/subagents.js +44 -0
  322. package/lib/store/subagents.js.map +1 -0
  323. package/lib/store/todos.d.ts +35 -0
  324. package/lib/store/todos.d.ts.map +1 -0
  325. package/lib/store/todos.js +68 -0
  326. package/lib/store/todos.js.map +1 -0
  327. package/lib/store/usage.d.ts +15 -0
  328. package/lib/store/usage.d.ts.map +1 -0
  329. package/lib/store/usage.js +27 -0
  330. package/lib/store/usage.js.map +1 -0
  331. package/lib/store/views.d.ts +419 -0
  332. package/lib/store/views.d.ts.map +1 -0
  333. package/lib/store/views.js +3 -0
  334. package/lib/store/views.js.map +1 -0
  335. package/lib/store.d.ts +19 -0
  336. package/lib/store.d.ts.map +1 -0
  337. package/lib/store.js +10 -0
  338. package/lib/store.js.map +1 -0
  339. package/lib/terminal/lease.d.ts +33 -0
  340. package/lib/terminal/lease.d.ts.map +1 -0
  341. package/lib/terminal/lease.js +99 -0
  342. package/lib/terminal/lease.js.map +1 -0
  343. package/lib/tool-card.d.ts +75 -0
  344. package/lib/tool-card.d.ts.map +1 -0
  345. package/lib/tool-card.js +109 -0
  346. package/lib/tool-card.js.map +1 -0
  347. package/lib/tool-verbs.d.ts +12 -0
  348. package/lib/tool-verbs.d.ts.map +1 -0
  349. package/lib/tool-verbs.js +29 -0
  350. package/lib/tool-verbs.js.map +1 -0
  351. package/lib/transcript.d.ts +40 -0
  352. package/lib/transcript.d.ts.map +1 -0
  353. package/lib/transcript.js +413 -0
  354. package/lib/transcript.js.map +1 -0
  355. package/lib/working-line.d.ts +44 -0
  356. package/lib/working-line.d.ts.map +1 -0
  357. package/lib/working-line.js +56 -0
  358. package/lib/working-line.js.map +1 -0
  359. package/package.json +72 -0
  360. package/presets/cc/.dsh-cc-managed.json +5 -0
  361. package/presets/cc/agent.cordis.yml +524 -0
  362. package/presets/cc/preset.yml +3 -0
  363. package/scripts/stage-preset.mjs +26 -0
package/lib/input.d.ts ADDED
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Global composer key handling. The editor owns typing, backspace, and enter;
3
+ * this module handles only overlay answers, permission cycling, interrupt,
4
+ * and quit. Reads the live driver snapshot so keystrokes never land on a
5
+ * stale closure.
6
+ * @module @dsh-cc/tui/input
7
+ */
8
+ import type { ApprovalAnswerKind } from './state/driver-types.ts';
9
+ import type { TuiState } from './store.ts';
10
+ export interface InputSink {
11
+ state: TuiState;
12
+ interrupt(): void;
13
+ cyclePermissionMode(): void;
14
+ toggleThinking(): void;
15
+ answerApproval(kind: ApprovalAnswerKind): void;
16
+ questionMove(delta: -1 | 1): void;
17
+ questionToggle(): void;
18
+ questionPick(index: number): void;
19
+ questionType(text: string): void;
20
+ questionBackspace(): void;
21
+ questionSubmit(): void;
22
+ questionCancel(): void;
23
+ modelPickerMove(delta: -1 | 1): void;
24
+ modelPickerSubmit(): void;
25
+ modelPickerCancel(): void;
26
+ effortPickerMove(delta: -1 | 1): void;
27
+ effortPickerSubmit(): void;
28
+ effortPickerCancel(): void;
29
+ permissionPickerMove(delta: -1 | 1): void;
30
+ permissionPickerSubmit(): void;
31
+ permissionPickerCancel(): void;
32
+ sessionSwitcherMove(delta: -1 | 1): void;
33
+ sessionSwitcherType(text: string): void;
34
+ sessionSwitcherBackspace(): void;
35
+ sessionSwitcherToggleScope(): void;
36
+ sessionSwitcherSubmit(): Promise<void>;
37
+ sessionSwitcherCancel(): void;
38
+ /** Toggle the Ctrl+T todo panel: close it when open, open it when closed. */
39
+ toggleTodoPanel(): void;
40
+ /** Move the todo-panel focus by one row (clamped; no wrap). */
41
+ todoPanelMove(delta: -1 | 1): void;
42
+ /** Close the todo panel. */
43
+ todoPanelClose(): void;
44
+ /** Close the `/usage` panel. */
45
+ usagePanelClose(): void;
46
+ /** Move the `/quit` worktree-exit focus by one row. */
47
+ worktreeExitMove(delta: -1 | 1): void;
48
+ /** Confirm the focused worktree-exit option. */
49
+ worktreeExitSubmit(): Promise<void>;
50
+ /** Dismiss the `/quit` worktree-exit overlay without quitting. */
51
+ worktreeExitCancel(): void;
52
+ dispose(): Promise<void>;
53
+ }
54
+ export type InputAction = {
55
+ kind: 'none';
56
+ } | {
57
+ kind: 'quit';
58
+ };
59
+ /**
60
+ * Route one raw keypress into the open approval overlay: `1`/`y`/`Y` grant
61
+ * once, `2`/`n`/`N`/escape reject, `3`/`a`/`A` grant always (once + persist a
62
+ * derived allow rule), `4`/`s`/`S` grant for this session (once + a
63
+ * session-scoped allowlist rule, never persisted to global settings). Every
64
+ * other key is consumed and ignored — the overlay
65
+ * is modal and the composer editor must never see keystrokes while it is open.
66
+ * Shared by the headless composer path and the mounted root listener so the
67
+ * key map has a single source of truth.
68
+ */
69
+ export declare function routeApprovalInput(driver: InputSink, data: string): void;
70
+ /**
71
+ * Route one raw keypress into the open question overlay. Every recognized
72
+ * key is handled and every other input is dropped — the composer editor must
73
+ * never see keystrokes while a question is open.
74
+ */
75
+ export declare function routeQuestionInput(driver: InputSink, data: string): void;
76
+ /**
77
+ * Route one raw keypress into the open model picker. Only arrows, enter, and
78
+ * escape are recognized; everything else is dropped — the picker is modal and
79
+ * the composer editor must never see keystrokes while it is open.
80
+ */
81
+ export declare function routeModelPickerInput(driver: InputSink, data: string): void;
82
+ /**
83
+ * Route one raw keypress into the open effort picker. Only arrows, enter, and
84
+ * escape are recognized; everything else is dropped — the picker is modal and
85
+ * the composer editor must never see keystrokes while it is open.
86
+ */
87
+ export declare function routeEffortPickerInput(driver: InputSink, data: string): void;
88
+ /**
89
+ * Route one raw keypress into the open `/quit` worktree-exit confirmation.
90
+ * Only arrows, enter, and escape are recognized; everything else is dropped
91
+ * — the overlay is modal and the composer editor must never see keystrokes
92
+ * while it is open. Enter on the focused row (keep/remove/cancel) is
93
+ * adjudicated by the driver.
94
+ */
95
+ export declare function routeWorktreeExitInput(driver: InputSink, data: string): void;
96
+ /**
97
+ * Route one raw keypress into the open permission picker. Only arrows, enter,
98
+ * and escape are recognized; everything else is dropped — the picker is modal
99
+ * and the composer editor must never see keystrokes while it is open.
100
+ */
101
+ export declare function routePermissionPickerInput(driver: InputSink, data: string): void;
102
+ /**
103
+ * Route one raw keypress into the open session switcher: arrows move, enter
104
+ * switches, tab toggles the cwd/all-projects scope, backspace and printable
105
+ * characters edit the query filter, and escape cancels (the two-stage
106
+ * clear-filter-then-close lives in the driver). Everything else is dropped —
107
+ * the switcher is modal and the composer editor must never see keystrokes
108
+ * while it is open. While `switching` is true, every key is consumed without
109
+ * action.
110
+ */
111
+ export declare function routeSessionSwitcherInput(driver: InputSink, data: string): void;
112
+ /**
113
+ * Route one raw keypress into the open todo panel. Only arrows, escape, and
114
+ * ctrl+t (toggle closed) are recognized; everything else is dropped — the
115
+ * panel is modal and the composer editor must never see keystrokes while it
116
+ * is open. Opening is owned by the ctrl+t binding in the global listener,
117
+ * which only fires while the panel is closed.
118
+ */
119
+ export declare function routeTodoPanelInput(driver: InputSink, data: string): void;
120
+ /**
121
+ * Route one raw keypress into the open `/usage` panel. The panel is pure
122
+ * display with no focus list, so escape closes it and every other key is
123
+ * consumed and ignored — the composer editor must never see keystrokes while
124
+ * it is open. Opening is owned by the `/usage` command.
125
+ */
126
+ export declare function routeUsagePanelInput(driver: InputSink, data: string): void;
127
+ /**
128
+ * Route one raw keypress into the open `/provider` panel (§4.2–§4.6).
129
+ * Phase-dependent: the list phase keeps j/k navigation (+ `n` starts the
130
+ * custom wizard); the wizard phase feeds printable keys/backspace into the
131
+ * live text field, arrows move the protocol select, enter submits, tab runs
132
+ * the models fetch, `x` is the secondary choice (keep/remove, keep
133
+ * credential), and esc backs one step (closing with a note at the first
134
+ * step). Every other key is consumed — the panel is modal and the composer
135
+ * editor must never see keystrokes while it is open.
136
+ */
137
+ type ProviderPanelRouter = {
138
+ panelPhase?(): 'list' | 'detail' | 'wizard' | 'confirm-remove' | undefined;
139
+ panelMove(delta: -1 | 1): void;
140
+ panelSubmit(): void;
141
+ panelCancel(): void;
142
+ panelEscape?(): void;
143
+ panelType?(text: string): void;
144
+ panelBackspace?(): void;
145
+ panelToggleFetch?(): void;
146
+ panelSecondary?(): void;
147
+ panelRefreshModels?(): void;
148
+ startCustomWizard?(): void;
149
+ };
150
+ export declare function routeProviderPanelInput(runtime: ProviderPanelRouter | undefined, data: string): void;
151
+ /**
152
+ * Apply one raw keypress against the live driver. Returns whether the app
153
+ * should exit. Called from the pi-tui global input listener before the editor
154
+ * receives the keystroke.
155
+ */
156
+ export declare function handleComposerInput(driver: InputSink, data: string): InputAction;
157
+ export {};
158
+ //# sourceMappingURL=input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"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"}
package/lib/input.js ADDED
@@ -0,0 +1,400 @@
1
+ /**
2
+ * Global composer key handling. The editor owns typing, backspace, and enter;
3
+ * this module handles only overlay answers, permission cycling, interrupt,
4
+ * and quit. Reads the live driver snapshot so keystrokes never land on a
5
+ * stale closure.
6
+ * @module @dsh-cc/tui/input
7
+ */
8
+ import { Key, decodeKittyPrintable, matchesKey } from '@dsh-cc/pi-tui';
9
+ /**
10
+ * Decode a raw keypress into the printable character it types, if any. Kitty
11
+ * CSI-u / modifyOtherKeys sequences decode via the vendored helper; legacy
12
+ * input arrives as the character itself.
13
+ */
14
+ function printableOf(data) {
15
+ const decoded = decodeKittyPrintable(data);
16
+ if (decoded !== undefined)
17
+ return decoded;
18
+ if (data.length === 1) {
19
+ const code = data.charCodeAt(0);
20
+ if (code >= 32 && code !== 127)
21
+ return data;
22
+ }
23
+ return undefined;
24
+ }
25
+ /**
26
+ * Route one raw keypress into the open approval overlay: `1`/`y`/`Y` grant
27
+ * once, `2`/`n`/`N`/escape reject, `3`/`a`/`A` grant always (once + persist a
28
+ * derived allow rule), `4`/`s`/`S` grant for this session (once + a
29
+ * session-scoped allowlist rule, never persisted to global settings). Every
30
+ * other key is consumed and ignored — the overlay
31
+ * is modal and the composer editor must never see keystrokes while it is open.
32
+ * Shared by the headless composer path and the mounted root listener so the
33
+ * key map has a single source of truth.
34
+ */
35
+ export function routeApprovalInput(driver, data) {
36
+ if (matchesKey(data, '1') || data === 'y' || data === 'Y') {
37
+ driver.answerApproval('once');
38
+ return;
39
+ }
40
+ if (matchesKey(data, '2') || data === 'n' || data === 'N' || matchesKey(data, Key.escape)) {
41
+ driver.answerApproval('reject');
42
+ return;
43
+ }
44
+ if (matchesKey(data, '3') || data === 'a' || data === 'A') {
45
+ driver.answerApproval('always');
46
+ return;
47
+ }
48
+ if (matchesKey(data, '4') || data === 's' || data === 'S') {
49
+ driver.answerApproval('session');
50
+ return;
51
+ }
52
+ // All other keys consumed and ignored (modal).
53
+ }
54
+ /**
55
+ * Route one raw keypress into the open question overlay. Every recognized
56
+ * key is handled and every other input is dropped — the composer editor must
57
+ * never see keystrokes while a question is open.
58
+ */
59
+ export function routeQuestionInput(driver, data) {
60
+ if (matchesKey(data, Key.escape)) {
61
+ driver.questionCancel();
62
+ return;
63
+ }
64
+ if (matchesKey(data, Key.up)) {
65
+ driver.questionMove(-1);
66
+ return;
67
+ }
68
+ if (matchesKey(data, Key.down)) {
69
+ driver.questionMove(1);
70
+ return;
71
+ }
72
+ if (matchesKey(data, Key.enter)) {
73
+ driver.questionSubmit();
74
+ return;
75
+ }
76
+ if (matchesKey(data, Key.backspace)) {
77
+ driver.questionBackspace();
78
+ return;
79
+ }
80
+ if (matchesKey(data, Key.space)) {
81
+ driver.questionToggle();
82
+ return;
83
+ }
84
+ if (data.length === 1 && data >= '1' && data <= '9') {
85
+ // Digit quick-pick: the driver bounds-checks against the option list.
86
+ driver.questionPick(Number.parseInt(data, 10) - 1);
87
+ return;
88
+ }
89
+ const printable = printableOf(data);
90
+ if (printable !== undefined)
91
+ driver.questionType(printable);
92
+ }
93
+ /**
94
+ * Route one raw keypress into the open model picker. Only arrows, enter, and
95
+ * escape are recognized; everything else is dropped — the picker is modal and
96
+ * the composer editor must never see keystrokes while it is open.
97
+ */
98
+ export function routeModelPickerInput(driver, data) {
99
+ if (matchesKey(data, Key.escape)) {
100
+ driver.modelPickerCancel();
101
+ return;
102
+ }
103
+ if (matchesKey(data, Key.up)) {
104
+ driver.modelPickerMove(-1);
105
+ return;
106
+ }
107
+ if (matchesKey(data, Key.down)) {
108
+ driver.modelPickerMove(1);
109
+ return;
110
+ }
111
+ if (matchesKey(data, Key.enter)) {
112
+ driver.modelPickerSubmit();
113
+ return;
114
+ }
115
+ // All other keys are consumed and ignored (modal).
116
+ }
117
+ /**
118
+ * Route one raw keypress into the open effort picker. Only arrows, enter, and
119
+ * escape are recognized; everything else is dropped — the picker is modal and
120
+ * the composer editor must never see keystrokes while it is open.
121
+ */
122
+ export function routeEffortPickerInput(driver, data) {
123
+ if (matchesKey(data, Key.escape)) {
124
+ driver.effortPickerCancel();
125
+ return;
126
+ }
127
+ if (matchesKey(data, Key.up)) {
128
+ driver.effortPickerMove(-1);
129
+ return;
130
+ }
131
+ if (matchesKey(data, Key.down)) {
132
+ driver.effortPickerMove(1);
133
+ return;
134
+ }
135
+ if (matchesKey(data, Key.enter)) {
136
+ driver.effortPickerSubmit();
137
+ return;
138
+ }
139
+ // All other keys are consumed and ignored (modal).
140
+ }
141
+ /**
142
+ * Route one raw keypress into the open `/quit` worktree-exit confirmation.
143
+ * Only arrows, enter, and escape are recognized; everything else is dropped
144
+ * — the overlay is modal and the composer editor must never see keystrokes
145
+ * while it is open. Enter on the focused row (keep/remove/cancel) is
146
+ * adjudicated by the driver.
147
+ */
148
+ export function routeWorktreeExitInput(driver, data) {
149
+ if (matchesKey(data, Key.escape)) {
150
+ driver.worktreeExitCancel();
151
+ return;
152
+ }
153
+ if (matchesKey(data, Key.up)) {
154
+ driver.worktreeExitMove(-1);
155
+ return;
156
+ }
157
+ if (matchesKey(data, Key.down)) {
158
+ driver.worktreeExitMove(1);
159
+ return;
160
+ }
161
+ if (matchesKey(data, Key.enter)) {
162
+ void driver.worktreeExitSubmit();
163
+ return;
164
+ }
165
+ // All other keys are consumed and ignored (modal).
166
+ }
167
+ /**
168
+ * Route one raw keypress into the open permission picker. Only arrows, enter,
169
+ * and escape are recognized; everything else is dropped — the picker is modal
170
+ * and the composer editor must never see keystrokes while it is open.
171
+ */
172
+ export function routePermissionPickerInput(driver, data) {
173
+ if (matchesKey(data, Key.escape)) {
174
+ driver.permissionPickerCancel();
175
+ return;
176
+ }
177
+ if (matchesKey(data, Key.up)) {
178
+ driver.permissionPickerMove(-1);
179
+ return;
180
+ }
181
+ if (matchesKey(data, Key.down)) {
182
+ driver.permissionPickerMove(1);
183
+ return;
184
+ }
185
+ if (matchesKey(data, Key.enter)) {
186
+ driver.permissionPickerSubmit();
187
+ return;
188
+ }
189
+ // All other keys are consumed and ignored (modal).
190
+ }
191
+ /**
192
+ * Route one raw keypress into the open session switcher: arrows move, enter
193
+ * switches, tab toggles the cwd/all-projects scope, backspace and printable
194
+ * characters edit the query filter, and escape cancels (the two-stage
195
+ * clear-filter-then-close lives in the driver). Everything else is dropped —
196
+ * the switcher is modal and the composer editor must never see keystrokes
197
+ * while it is open. While `switching` is true, every key is consumed without
198
+ * action.
199
+ */
200
+ export function routeSessionSwitcherInput(driver, data) {
201
+ if (driver.state.sessionSwitcher?.switching === true)
202
+ return;
203
+ if (matchesKey(data, Key.escape)) {
204
+ driver.sessionSwitcherCancel();
205
+ return;
206
+ }
207
+ if (matchesKey(data, Key.tab)) {
208
+ driver.sessionSwitcherToggleScope();
209
+ return;
210
+ }
211
+ if (matchesKey(data, Key.up)) {
212
+ driver.sessionSwitcherMove(-1);
213
+ return;
214
+ }
215
+ if (matchesKey(data, Key.down)) {
216
+ driver.sessionSwitcherMove(1);
217
+ return;
218
+ }
219
+ if (matchesKey(data, Key.enter)) {
220
+ void driver.sessionSwitcherSubmit();
221
+ return;
222
+ }
223
+ if (matchesKey(data, Key.backspace)) {
224
+ driver.sessionSwitcherBackspace();
225
+ return;
226
+ }
227
+ const printable = printableOf(data);
228
+ if (printable !== undefined)
229
+ driver.sessionSwitcherType(printable);
230
+ }
231
+ /**
232
+ * Route one raw keypress into the open todo panel. Only arrows, escape, and
233
+ * ctrl+t (toggle closed) are recognized; everything else is dropped — the
234
+ * panel is modal and the composer editor must never see keystrokes while it
235
+ * is open. Opening is owned by the ctrl+t binding in the global listener,
236
+ * which only fires while the panel is closed.
237
+ */
238
+ export function routeTodoPanelInput(driver, data) {
239
+ if (matchesKey(data, Key.ctrl('t'))) {
240
+ driver.todoPanelClose();
241
+ return;
242
+ }
243
+ if (matchesKey(data, Key.escape)) {
244
+ driver.todoPanelClose();
245
+ return;
246
+ }
247
+ if (matchesKey(data, Key.up)) {
248
+ driver.todoPanelMove(-1);
249
+ return;
250
+ }
251
+ if (matchesKey(data, Key.down)) {
252
+ driver.todoPanelMove(1);
253
+ return;
254
+ }
255
+ // All other keys consumed and ignored (modal).
256
+ }
257
+ /**
258
+ * Route one raw keypress into the open `/usage` panel. The panel is pure
259
+ * display with no focus list, so escape closes it and every other key is
260
+ * consumed and ignored — the composer editor must never see keystrokes while
261
+ * it is open. Opening is owned by the `/usage` command.
262
+ */
263
+ export function routeUsagePanelInput(driver, data) {
264
+ if (matchesKey(data, Key.escape)) {
265
+ driver.usagePanelClose();
266
+ return;
267
+ }
268
+ // All other keys consumed and ignored (modal, no navigation).
269
+ }
270
+ export function routeProviderPanelInput(runtime, data) {
271
+ if (runtime === undefined)
272
+ return;
273
+ const phase = runtime.panelPhase?.() ?? 'list';
274
+ if (matchesKey(data, Key.escape)) {
275
+ if (runtime.panelEscape !== undefined)
276
+ runtime.panelEscape();
277
+ else
278
+ runtime.panelCancel();
279
+ return;
280
+ }
281
+ if (matchesKey(data, Key.enter)) {
282
+ runtime.panelSubmit();
283
+ return;
284
+ }
285
+ if (phase === 'wizard') {
286
+ if (matchesKey(data, Key.tab)) {
287
+ runtime.panelToggleFetch?.();
288
+ return;
289
+ }
290
+ if (data === 'x') {
291
+ runtime.panelSecondary?.();
292
+ return;
293
+ }
294
+ }
295
+ if (matchesKey(data, Key.up)) {
296
+ runtime.panelMove(-1);
297
+ return;
298
+ }
299
+ if (matchesKey(data, Key.down)) {
300
+ runtime.panelMove(1);
301
+ return;
302
+ }
303
+ if (phase === 'detail') {
304
+ if (data === 'r') {
305
+ runtime.panelRefreshModels?.();
306
+ return;
307
+ }
308
+ }
309
+ if (phase === 'list') {
310
+ if (data === 'n') {
311
+ runtime.startCustomWizard?.();
312
+ return;
313
+ }
314
+ if (data === 'j') {
315
+ runtime.panelMove(1);
316
+ return;
317
+ }
318
+ if (data === 'k') {
319
+ runtime.panelMove(-1);
320
+ return;
321
+ }
322
+ }
323
+ if (matchesKey(data, Key.backspace)) {
324
+ runtime.panelBackspace?.();
325
+ return;
326
+ }
327
+ if (phase === 'wizard') {
328
+ const printable = printableOf(data);
329
+ if (printable !== undefined)
330
+ runtime.panelType?.(printable);
331
+ }
332
+ // All other keys consumed (modal).
333
+ }
334
+ /**
335
+ * Apply one raw keypress against the live driver. Returns whether the app
336
+ * should exit. Called from the pi-tui global input listener before the editor
337
+ * receives the keystroke.
338
+ */
339
+ export function handleComposerInput(driver, data) {
340
+ const live = driver.state;
341
+ if (live.approval !== undefined) {
342
+ routeApprovalInput(driver, data);
343
+ return { kind: 'none' };
344
+ }
345
+ if (live.question !== undefined) {
346
+ routeQuestionInput(driver, data);
347
+ return { kind: 'none' };
348
+ }
349
+ if (live.modelPicker !== undefined) {
350
+ routeModelPickerInput(driver, data);
351
+ return { kind: 'none' };
352
+ }
353
+ if (live.effortPicker !== undefined) {
354
+ routeEffortPickerInput(driver, data);
355
+ return { kind: 'none' };
356
+ }
357
+ if (live.permissionPicker !== undefined) {
358
+ routePermissionPickerInput(driver, data);
359
+ return { kind: 'none' };
360
+ }
361
+ if (live.sessionSwitcher !== undefined) {
362
+ routeSessionSwitcherInput(driver, data);
363
+ return { kind: 'none' };
364
+ }
365
+ if (live.todoPanel !== undefined) {
366
+ routeTodoPanelInput(driver, data);
367
+ return { kind: 'none' };
368
+ }
369
+ if (live.usagePanel !== undefined) {
370
+ routeUsagePanelInput(driver, data);
371
+ return { kind: 'none' };
372
+ }
373
+ if (live.worktreeExit !== undefined) {
374
+ routeWorktreeExitInput(driver, data);
375
+ return { kind: 'none' };
376
+ }
377
+ if (matchesKey(data, 'shift+tab')) {
378
+ driver.cyclePermissionMode();
379
+ return { kind: 'none' };
380
+ }
381
+ if (matchesKey(data, Key.ctrl('o'))) {
382
+ driver.toggleThinking();
383
+ return { kind: 'none' };
384
+ }
385
+ if (matchesKey(data, Key.ctrl('t'))) {
386
+ driver.toggleTodoPanel();
387
+ return { kind: 'none' };
388
+ }
389
+ if (matchesKey(data, Key.escape)) {
390
+ if (live.busy)
391
+ driver.interrupt();
392
+ return { kind: 'none' };
393
+ }
394
+ if (matchesKey(data, Key.ctrl('c'))) {
395
+ void driver.dispose();
396
+ return { kind: 'quit' };
397
+ }
398
+ return { kind: 'none' };
399
+ }
400
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Package-owned invariant companion for `@dsh-cc/tui`.
3
+ * @module @dsh-cc/tui/invariant
4
+ */
5
+ import type { Context } from '@deepseek-ai/cordis';
6
+ /** Cordis companion plugin name. */
7
+ export declare const name = "dsh-cc-tui-invariant";
8
+ /** Service required before the companion can reserve package ownership. */
9
+ export declare const inject: string[];
10
+ /**
11
+ * Register this package's invariant companion.
12
+ */
13
+ export declare const apply: (ctx: Context) => Promise<() => void>;
14
+ //# sourceMappingURL=invariant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invariant.d.ts","sourceRoot":"","sources":["../src/invariant.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,oCAAoC;AACpC,eAAO,MAAM,IAAI,yBAAyB,CAAA;AAC1C,2EAA2E;AAC3E,eAAO,MAAM,MAAM,UAAiB,CAAA;AAQpC;;GAEG;AACH,eAAO,MAAM,KAAK,GAAI,KAAK,OAAO,KAAG,OAAO,CAAC,MAAM,IAAI,CACU,CAAA"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Package-owned invariant companion for `@dsh-cc/tui`.
3
+ * @module @dsh-cc/tui/invariant
4
+ */
5
+ const PACKAGE_NAME = '@dsh-cc/tui';
6
+ /** Cordis companion plugin name. */
7
+ export const name = 'dsh-cc-tui-invariant';
8
+ /** Service required before the companion can reserve package ownership. */
9
+ export const inject = ['invariants'];
10
+ /**
11
+ * No runtime invariant: the TUI is a protocol driver over session/event and
12
+ * does not own a durable projection.
13
+ */
14
+ const install = () => { };
15
+ /**
16
+ * Register this package's invariant companion.
17
+ */
18
+ export const apply = (ctx) => Promise.resolve(ctx.invariants.register(PACKAGE_NAME, install));
19
+ /* jscpd:ignore-end */
20
+ //# sourceMappingURL=invariant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invariant.js","sourceRoot":"","sources":["../src/invariant.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,YAAY,GAAG,aAAa,CAAA;AAElC,oCAAoC;AACpC,MAAM,CAAC,MAAM,IAAI,GAAG,sBAAsB,CAAA;AAC1C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,YAAY,CAAC,CAAA;AAEpC;;;GAGG;AACH,MAAM,OAAO,GAAuB,GAAG,EAAE,GAAE,CAAC,CAAA;AAE5C;;GAEG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,GAAY,EAAuB,EAAE,CACzD,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAA;AACjE,sBAAsB"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Pure Shift+Tab cycle over CC permission-rule modes. Browser-safe and
3
+ * harness-free so the cycle cannot drift from the `/permissions` list.
4
+ * @module @dsh-cc/tui/mode-cycle
5
+ */
6
+ import { PERMISSION_COMMAND_MODES, type PermissionCommandMode } from '@dsh-cc/command-permissions';
7
+ export { PERMISSION_COMMAND_MODES, type PermissionCommandMode };
8
+ /** Cycle order matches `/permissions` advertisement. */
9
+ export declare const PERMISSION_CYCLE: readonly PermissionCommandMode[];
10
+ /**
11
+ * Advance one step in the CC permission-mode cycle.
12
+ * @param current - the mode currently in force.
13
+ * @param bypassDisabled - when true, `bypassPermissions` is skipped.
14
+ * @returns the next mode (wraps to the first).
15
+ */
16
+ export declare function nextPermissionMode(current: string, bypassDisabled?: boolean): PermissionCommandMode;
17
+ /**
18
+ * Whether `mode` is one of the advertised CC permission modes.
19
+ * @param mode - untrusted user input.
20
+ */
21
+ export declare function isPermissionMode(mode: string): mode is PermissionCommandMode;
22
+ //# sourceMappingURL=mode-cycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-cycle.d.ts","sourceRoot":"","sources":["../src/mode-cycle.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,wBAAwB,EACxB,KAAK,qBAAqB,EAC3B,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EAAE,wBAAwB,EAAE,KAAK,qBAAqB,EAAE,CAAA;AAE/D,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAE,SAAS,qBAAqB,EAA6B,CAAA;AAE1F;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,cAAc,UAAQ,GACrB,qBAAqB,CAOvB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,qBAAqB,CAE5E"}