@aria-cli/cli 1.0.50 → 1.0.51

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 (319) hide show
  1. package/bin/aria.mjs +1 -1
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/attached-local-control-client.js +826 -0
  4. package/dist/bootstrap-local-control-client.js +2 -0
  5. package/dist/capability-aware-method-proxy.js +42 -0
  6. package/dist/cli-context.js +160 -0
  7. package/dist/commands/arions.js +174 -0
  8. package/dist/commands/auth.js +123 -0
  9. package/dist/commands/daemon.js +245 -0
  10. package/dist/commands/definitions.js +176 -0
  11. package/dist/commands/index.js +74 -0
  12. package/dist/commands/login-handler.js +1108 -0
  13. package/dist/commands/logout-handler.js +92 -0
  14. package/dist/commands/memory-handlers.js +89 -0
  15. package/dist/commands/pairing.js +60 -0
  16. package/dist/commands/runtime-cutover-reset-command.js +12 -0
  17. package/dist/commands/runtime-cutover-reset.js +265 -0
  18. package/dist/commands/terminal-setup.js +84 -0
  19. package/dist/config/aria-config.js +238 -0
  20. package/dist/config/index.js +3 -0
  21. package/dist/config/loader.js +97 -0
  22. package/dist/config.js +142 -0
  23. package/dist/daemon-info.js +10 -0
  24. package/dist/ensure-daemon.js +128 -0
  25. package/dist/entrypoints/command-mode.js +5 -0
  26. package/dist/entrypoints/daemon.js +50 -0
  27. package/dist/entrypoints/headless-stdio.js +25 -0
  28. package/dist/entrypoints/interactive.js +80 -0
  29. package/dist/event-loop-watchdog.js +73 -0
  30. package/dist/headless/auth-orchestrator.js +508 -0
  31. package/dist/headless/auth-service.js +43 -0
  32. package/dist/headless/bootstrap-fast-path.js +112 -0
  33. package/dist/headless/call-command.js +143 -0
  34. package/dist/headless/daemon-service.js +318 -0
  35. package/dist/headless/hook-actions.js +235 -0
  36. package/dist/headless/hook-service.js +42 -0
  37. package/dist/headless/kernel-services.js +216 -0
  38. package/dist/headless/kernel.js +785 -0
  39. package/dist/headless/operations/arion.js +119 -0
  40. package/dist/headless/operations/auth.js +45 -0
  41. package/dist/headless/operations/client.js +31 -0
  42. package/dist/headless/operations/config.js +69 -0
  43. package/dist/headless/operations/daemon.js +47 -0
  44. package/dist/headless/operations/hook.js +56 -0
  45. package/dist/headless/operations/index.js +11 -0
  46. package/dist/headless/operations/memory.js +102 -0
  47. package/dist/headless/operations/message.js +279 -0
  48. package/dist/headless/operations/model.js +100 -0
  49. package/dist/headless/operations/peer.js +56 -0
  50. package/dist/headless/operations/run.js +24 -0
  51. package/dist/headless/operations/session.js +90 -0
  52. package/dist/headless/operations/system.js +19 -0
  53. package/dist/headless/operations/utils.js +35 -0
  54. package/dist/headless/run-orchestrator.js +703 -0
  55. package/dist/headless/stdio-server.js +439 -0
  56. package/dist/history/SessionHistory.js +8 -0
  57. package/dist/history/SessionHistoryClient.js +186 -0
  58. package/dist/history/conversation-message.js +112 -0
  59. package/dist/history/index.js +8 -0
  60. package/dist/history/jsonl-replay.js +154 -0
  61. package/dist/history/repair-tool-pairing.js +84 -0
  62. package/dist/history/stall-phase-bridge.js +11 -0
  63. package/dist/history/turn-accumulator.js +427 -0
  64. package/dist/index.js +7 -0
  65. package/dist/ink-repl.js +4183 -0
  66. package/dist/local-control-bootstrap.js +26 -0
  67. package/dist/local-control-client.js +2 -0
  68. package/dist/local-control-error-reporting.js +34 -0
  69. package/dist/local-control-http-client.js +362 -0
  70. package/dist/local-control-lazy-wrapper.js +363 -0
  71. package/dist/local-control-manager.js +146 -0
  72. package/dist/main.js +38 -0
  73. package/dist/network-security.js +62 -0
  74. package/dist/networking-server.js +38 -0
  75. package/dist/peer-identity.js +23 -0
  76. package/dist/polling-subscription.js +34 -0
  77. package/dist/relaunch.js +588 -0
  78. package/dist/release-notes.js +35 -0
  79. package/dist/repl-cleanup.js +47 -0
  80. package/dist/runtime/configure-bun-sqlite.js +3 -0
  81. package/dist/runtime/crash-handlers.js +111 -0
  82. package/dist/runtime/interactive-invocation.js +39 -0
  83. package/dist/runtime/internal-mode.js +14 -0
  84. package/dist/runtime/launch-spec.js +64 -0
  85. package/dist/runtime/owner-lease.js +44 -0
  86. package/dist/runtime/public-mode.js +20 -0
  87. package/dist/runtime/run-internal-mode.js +18 -0
  88. package/dist/runtime/runtime-kind.js +32 -0
  89. package/dist/runtime/spawn-aria.js +38 -0
  90. package/dist/selectable-client.js +2 -0
  91. package/dist/selectable-peer.js +2 -0
  92. package/dist/session.js +203 -0
  93. package/dist/slash-commands.js +80 -0
  94. package/dist/sounds.js +210 -0
  95. package/dist/ui/App.js +526 -0
  96. package/dist/ui/components/AnthropicMethodPicker.js +6 -0
  97. package/dist/ui/components/ArionPrompt.js +15 -0
  98. package/dist/ui/components/AutocompleteDropdown.js +23 -0
  99. package/dist/ui/components/AutonomySelector.js +55 -0
  100. package/dist/ui/components/Banner.js +98 -0
  101. package/dist/ui/components/ConversationHistory.js +175 -0
  102. package/dist/ui/components/CopilotDeviceLoginFlow.js +88 -0
  103. package/dist/ui/components/CopilotSourcePicker.js +50 -0
  104. package/dist/ui/components/Cost.js +10 -0
  105. package/dist/ui/components/CustomSelect/option-map.js +30 -0
  106. package/dist/ui/components/CustomSelect/select-option.js +13 -0
  107. package/dist/ui/components/CustomSelect/select.js +42 -0
  108. package/dist/ui/components/CustomSelect/use-select-state.js +179 -0
  109. package/dist/ui/components/CustomSelect/use-select.js +15 -0
  110. package/dist/ui/components/ErrorDisplay.js +35 -0
  111. package/dist/ui/components/FallbackToolUseRejectedMessage.js +7 -0
  112. package/dist/ui/components/FileEditToolUpdatedMessage.js +57 -0
  113. package/dist/ui/components/HandoffMarker.js +18 -0
  114. package/dist/ui/components/HighlightedCode.js +21 -0
  115. package/dist/ui/components/InputArea.js +187 -0
  116. package/dist/ui/components/Message.js +25 -0
  117. package/dist/ui/components/OAuthLoginFlow.js +113 -0
  118. package/dist/ui/components/OutputTruncation.js +35 -0
  119. package/dist/ui/components/PermissionPrompt.js +79 -0
  120. package/dist/ui/components/PipelineTimingPanel.js +15 -0
  121. package/dist/ui/components/ProviderMethodPicker.js +61 -0
  122. package/dist/ui/components/ProviderPicker.js +63 -0
  123. package/dist/ui/components/RenderItemView.js +71 -0
  124. package/dist/ui/components/Spinner.js +46 -0
  125. package/dist/ui/components/StatusBar.js +95 -0
  126. package/dist/ui/components/StreamingIndicator.js +55 -0
  127. package/dist/ui/components/StructuredDiff.js +168 -0
  128. package/dist/ui/components/TextInputOverlay.js +43 -0
  129. package/dist/ui/components/ThinkingBlock.js +82 -0
  130. package/dist/ui/components/ToolCost.js +17 -0
  131. package/dist/ui/components/ToolExecution.js +61 -0
  132. package/dist/ui/components/ToolHeader.js +51 -0
  133. package/dist/ui/components/ToolRenderLayoutContext.js +14 -0
  134. package/dist/ui/components/ToolResultWrapper.js +6 -0
  135. package/dist/ui/components/ToolUseLoader.js +35 -0
  136. package/dist/ui/components/TraceWaterfall.js +91 -0
  137. package/dist/ui/components/index.js +33 -0
  138. package/dist/ui/components/messages/AssistantTextMessage.js +25 -0
  139. package/dist/ui/components/messages/UserImageMessage.js +12 -0
  140. package/dist/ui/components/messages/UserTextMessage.js +12 -0
  141. package/dist/ui/components/overlays/ArionSelector.js +68 -0
  142. package/dist/ui/components/overlays/ClientSelector.js +62 -0
  143. package/dist/ui/components/overlays/CommandPalette.js +67 -0
  144. package/dist/ui/components/overlays/DaemonControl.js +87 -0
  145. package/dist/ui/components/overlays/InviteShareOverlay.js +15 -0
  146. package/dist/ui/components/overlays/JoinInviteOverlay.js +32 -0
  147. package/dist/ui/components/overlays/MemoryBrowser.js +100 -0
  148. package/dist/ui/components/overlays/MessageSelector.js +123 -0
  149. package/dist/ui/components/overlays/ModelSelector.js +211 -0
  150. package/dist/ui/components/overlays/PairRequestOverlay.js +42 -0
  151. package/dist/ui/components/overlays/PeerSelector.js +84 -0
  152. package/dist/ui/components/overlays/SessionSelector.js +102 -0
  153. package/dist/ui/components/overlays/SoundSelector.js +86 -0
  154. package/dist/ui/components/overlays/ThemeSelector.js +139 -0
  155. package/dist/ui/components/overlays/index.js +15 -0
  156. package/dist/ui/components/permissions/BashPermissionRequest/BashPermissionRequest.js +53 -0
  157. package/dist/ui/components/permissions/FallbackPermissionRequest.js +56 -0
  158. package/dist/ui/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.js +76 -0
  159. package/dist/ui/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js +18 -0
  160. package/dist/ui/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.js +64 -0
  161. package/dist/ui/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js +26 -0
  162. package/dist/ui/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +141 -0
  163. package/dist/ui/components/permissions/PermissionRequest.js +70 -0
  164. package/dist/ui/components/permissions/PermissionRequestTitle.js +41 -0
  165. package/dist/ui/components/permissions/hooks.js +10 -0
  166. package/dist/ui/components/permissions/toolUseOptions.js +68 -0
  167. package/dist/ui/components/permissions/utils.js +10 -0
  168. package/dist/ui/components/text-input/Cursor.js +326 -0
  169. package/dist/ui/components/text-input/TextInput.js +231 -0
  170. package/dist/ui/components/text-input/imagePaste.js +28 -0
  171. package/dist/ui/components/text-input/index.js +6 -0
  172. package/dist/ui/components/text-input/useDoublePress.js +30 -0
  173. package/dist/ui/components/text-input/useTextInput.js +245 -0
  174. package/dist/ui/components/tool-types.js +9 -0
  175. package/dist/ui/constants/figures.js +4 -0
  176. package/dist/ui/constants/index.js +3 -0
  177. package/dist/ui/display-mode.js +93 -0
  178. package/dist/ui/display-policy.js +19 -0
  179. package/dist/ui/hooks/index.js +6 -0
  180. package/dist/ui/hooks/useCommandAutocomplete.js +93 -0
  181. package/dist/ui/hooks/useDoublePress.js +37 -0
  182. package/dist/ui/hooks/useIndicatorState.js +55 -0
  183. package/dist/ui/hooks/useInterval.js +23 -0
  184. package/dist/ui/hooks/useKeyboardShortcuts.js +127 -0
  185. package/dist/ui/hooks/useTerminalSize.js +55 -0
  186. package/dist/ui/hooks/useUnifiedMessages.js +117 -0
  187. package/dist/ui/indicator-state.js +44 -0
  188. package/dist/ui/markdown/highlight.js +44 -0
  189. package/dist/ui/markdown/index.js +1460 -0
  190. package/dist/ui/markdown/tokenizer.js +24 -0
  191. package/dist/ui/render-item.js +5 -0
  192. package/dist/ui/screens/REPL.js +119 -0
  193. package/dist/ui/screens/approval-lifecycle.js +38 -0
  194. package/dist/ui/status-line.js +72 -0
  195. package/dist/ui/theme/index.js +51 -0
  196. package/dist/ui/theme/themes/claude-dark-daltonized.js +51 -0
  197. package/dist/ui/theme/themes/claude-dark.js +50 -0
  198. package/dist/ui/theme/themes/claude-light-daltonized.js +51 -0
  199. package/dist/ui/theme/themes/claude-light.js +50 -0
  200. package/dist/ui/theme/themes/dark-accessible.js +18 -0
  201. package/dist/ui/theme/themes/dark.js +49 -0
  202. package/dist/ui/theme/themes/light-accessible.js +18 -0
  203. package/dist/ui/theme/themes/light.js +49 -0
  204. package/dist/ui/theme/types.js +3 -0
  205. package/dist/ui/theme.js +142 -0
  206. package/dist/ui/to-render-items.js +145 -0
  207. package/dist/ui/tools/AgentTool/index.js +30 -0
  208. package/dist/ui/tools/ArchitectTool/index.js +31 -0
  209. package/dist/ui/tools/AskUserTool/index.js +46 -0
  210. package/dist/ui/tools/BashTool/BashToolResultMessage.js +11 -0
  211. package/dist/ui/tools/BashTool/OutputLine.js +21 -0
  212. package/dist/ui/tools/BashTool/index.js +91 -0
  213. package/dist/ui/tools/BrowseTool/index.js +43 -0
  214. package/dist/ui/tools/BrowserTool/index.js +47 -0
  215. package/dist/ui/tools/CbmTool/index.js +188 -0
  216. package/dist/ui/tools/CheckDelegationTool/index.js +46 -0
  217. package/dist/ui/tools/CheckMessagesTool/index.js +85 -0
  218. package/dist/ui/tools/CreateQuipTool/index.js +30 -0
  219. package/dist/ui/tools/CreateSkillTool/index.js +22 -0
  220. package/dist/ui/tools/CreateToolTool/index.js +31 -0
  221. package/dist/ui/tools/DelegateRemoteTool/index.js +42 -0
  222. package/dist/ui/tools/DeployTool/index.js +47 -0
  223. package/dist/ui/tools/FffTool/index.js +103 -0
  224. package/dist/ui/tools/FileEditTool/index.js +67 -0
  225. package/dist/ui/tools/FileReadTool/index.js +68 -0
  226. package/dist/ui/tools/FileWriteTool/index.js +61 -0
  227. package/dist/ui/tools/ForkTool/index.js +47 -0
  228. package/dist/ui/tools/FrgTool/index.js +96 -0
  229. package/dist/ui/tools/GetThreadTool/index.js +39 -0
  230. package/dist/ui/tools/GlobTool/index.js +50 -0
  231. package/dist/ui/tools/GrepTool/index.js +84 -0
  232. package/dist/ui/tools/HatchArionTool/index.js +36 -0
  233. package/dist/ui/tools/LearnSkillTool/index.js +22 -0
  234. package/dist/ui/tools/LearnTool/index.js +43 -0
  235. package/dist/ui/tools/LearnToolTool/index.js +22 -0
  236. package/dist/ui/tools/ListClientsTool/index.js +39 -0
  237. package/dist/ui/tools/LspTool/index.js +261 -0
  238. package/dist/ui/tools/MCPTool/index.js +33 -0
  239. package/dist/ui/tools/ManageNetworkTool/index.js +53 -0
  240. package/dist/ui/tools/MemoryReadTool/index.js +64 -0
  241. package/dist/ui/tools/MemoryWriteTool/index.js +20 -0
  242. package/dist/ui/tools/NotebookEditTool/index.js +33 -0
  243. package/dist/ui/tools/NotebookReadTool/index.js +25 -0
  244. package/dist/ui/tools/OutlookReadTool/index.js +66 -0
  245. package/dist/ui/tools/OutlookReplyTool/index.js +49 -0
  246. package/dist/ui/tools/OutlookSendTool/index.js +49 -0
  247. package/dist/ui/tools/PauseDelegationTool/index.js +35 -0
  248. package/dist/ui/tools/ProbeTool/index.js +121 -0
  249. package/dist/ui/tools/ProcessTool/index.js +66 -0
  250. package/dist/ui/tools/QuestListTool/index.js +46 -0
  251. package/dist/ui/tools/QuestReportTool/index.js +49 -0
  252. package/dist/ui/tools/QuestUpdateTool/index.js +87 -0
  253. package/dist/ui/tools/QuipCommentTool/index.js +69 -0
  254. package/dist/ui/tools/QuipReadTool/index.js +71 -0
  255. package/dist/ui/tools/RestArionTool/index.js +32 -0
  256. package/dist/ui/tools/RestartTool/index.js +35 -0
  257. package/dist/ui/tools/ResumeDelegationTool/index.js +35 -0
  258. package/dist/ui/tools/RetireArionTool/index.js +32 -0
  259. package/dist/ui/tools/RgTool/index.js +73 -0
  260. package/dist/ui/tools/SearchKnowledgeTool/index.js +43 -0
  261. package/dist/ui/tools/SearchMessagesTool/index.js +43 -0
  262. package/dist/ui/tools/SelfDiagnoseTool/index.js +61 -0
  263. package/dist/ui/tools/SendMessageTool/index.js +45 -0
  264. package/dist/ui/tools/SerenaTool/index.js +124 -0
  265. package/dist/ui/tools/SessionHistoryTool/index.js +52 -0
  266. package/dist/ui/tools/SgTool/index.js +80 -0
  267. package/dist/ui/tools/SlackReactTool/index.js +41 -0
  268. package/dist/ui/tools/SlackReadTool/index.js +48 -0
  269. package/dist/ui/tools/SlackSendTool/index.js +45 -0
  270. package/dist/ui/tools/SpawnWorkerTool/index.js +33 -0
  271. package/dist/ui/tools/StickerRequestTool/index.js +19 -0
  272. package/dist/ui/tools/ThinkTool/index.js +17 -0
  273. package/dist/ui/tools/UgTool/index.js +108 -0
  274. package/dist/ui/tools/UseSkillTool/index.js +22 -0
  275. package/dist/ui/tools/WakeArionTool/index.js +32 -0
  276. package/dist/ui/tools/WebFetchTool/index.js +56 -0
  277. package/dist/ui/tools/WebSearchTool/index.js +44 -0
  278. package/dist/ui/tools/lsTool/index.js +58 -0
  279. package/dist/ui/tools/registry.js +197 -0
  280. package/dist/ui/tools/tool-renderer.js +11 -0
  281. package/dist/ui/tools/truncation.js +35 -0
  282. package/dist/ui/types/anthropic.js +4 -0
  283. package/dist/ui/types/index.js +2 -0
  284. package/dist/ui/types/message.js +3 -0
  285. package/dist/ui/types/tool.js +4 -0
  286. package/dist/ui/utils/array.js +4 -0
  287. package/dist/ui/utils/cursor.js +131 -0
  288. package/dist/ui/utils/diff.js +120 -0
  289. package/dist/ui/utils/format.js +42 -0
  290. package/dist/ui/utils/fuzzy.js +59 -0
  291. package/dist/ui/utils/index.js +11 -0
  292. package/dist/ui/utils/keys.js +8 -0
  293. package/dist/ui/utils/patch.js +17 -0
  294. package/dist/ui/utils/risk.js +114 -0
  295. package/dist/ui/utils/terminal-image.js +70 -0
  296. package/dist/ui/utils/validation.js +48 -0
  297. package/dist/ui/verb-pairs.js +248 -0
  298. package/dist/ui.js +131 -0
  299. package/package.json +73 -14
  300. package/src/entrypoints/command-mode.ts +5 -0
  301. package/src/entrypoints/daemon.ts +54 -0
  302. package/src/entrypoints/headless-stdio.ts +27 -0
  303. package/src/entrypoints/interactive.ts +112 -0
  304. package/src/main.ts +44 -0
  305. package/src/runtime/configure-bun-sqlite.ts +3 -0
  306. package/src/runtime/crash-handlers.ts +128 -0
  307. package/src/runtime/interactive-invocation.test.ts +42 -0
  308. package/src/runtime/interactive-invocation.ts +51 -0
  309. package/src/runtime/internal-mode.test.ts +19 -0
  310. package/src/runtime/internal-mode.ts +24 -0
  311. package/src/runtime/launch-spec.test.ts +26 -0
  312. package/src/runtime/launch-spec.ts +84 -0
  313. package/src/runtime/owner-lease.ts +52 -0
  314. package/src/runtime/public-mode.test.ts +18 -0
  315. package/src/runtime/public-mode.ts +19 -0
  316. package/src/runtime/run-internal-mode.ts +19 -0
  317. package/src/runtime/runtime-kind.test.ts +23 -0
  318. package/src/runtime/runtime-kind.ts +41 -0
  319. package/src/runtime/spawn-aria.ts +62 -0
@@ -0,0 +1,70 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // Changes:
3
+ // - Tool import → minimal ToolLike interface
4
+ // - Removed tool object references (FileEditTool, BashTool, etc.) → name-based dispatch
5
+ // - Removed PRODUCT_NAME → "ARIA"
6
+ // - Removed useNotifyAfterTimeout (analytics/notification)
7
+ // - Removed AssistantMessage import → inline type
8
+ // - Removed CommandSubcommandPrefixResult → inline type
9
+ import { useInput } from "ink";
10
+ import * as React from "react";
11
+ import { isEscapeInput } from "../../utils/keys.js";
12
+ import { FileEditPermissionRequest } from "./FileEditPermissionRequest/FileEditPermissionRequest.js";
13
+ import { BashPermissionRequest } from "./BashPermissionRequest/BashPermissionRequest.js";
14
+ import { FallbackPermissionRequest } from "./FallbackPermissionRequest.js";
15
+ import { FileWritePermissionRequest } from "./FileWritePermissionRequest/FileWritePermissionRequest.js";
16
+ import { FilesystemPermissionRequest } from "./FilesystemPermissionRequest/FilesystemPermissionRequest.js";
17
+ // Name-based routing for tool-specific permission components
18
+ const FILE_EDIT_TOOLS = new Set(["Edit", "file_edit", "str_replace_editor"]);
19
+ const FILE_WRITE_TOOLS = new Set(["Write", "file_write", "create_file"]);
20
+ const BASH_TOOLS = new Set(["Bash", "bash", "execute_command"]);
21
+ const FILESYSTEM_TOOLS = new Set([
22
+ "Glob",
23
+ "glob",
24
+ "Grep",
25
+ "grep",
26
+ "LS",
27
+ "ls",
28
+ "Read",
29
+ "file_read",
30
+ "read_file",
31
+ "NotebookRead",
32
+ "notebook_read",
33
+ "NotebookEdit",
34
+ "notebook_edit",
35
+ ]);
36
+ function permissionComponentForToolName(name) {
37
+ if (FILE_EDIT_TOOLS.has(name))
38
+ return FileEditPermissionRequest;
39
+ if (FILE_WRITE_TOOLS.has(name))
40
+ return FileWritePermissionRequest;
41
+ if (BASH_TOOLS.has(name))
42
+ return BashPermissionRequest;
43
+ if (FILESYSTEM_TOOLS.has(name))
44
+ return FilesystemPermissionRequest;
45
+ return FallbackPermissionRequest;
46
+ }
47
+ export function toolUseConfirmGetPrefix(toolUseConfirm) {
48
+ return ((toolUseConfirm.commandPrefix &&
49
+ !toolUseConfirm.commandPrefix.commandInjectionDetected &&
50
+ toolUseConfirm.commandPrefix.commandPrefix) ||
51
+ null);
52
+ }
53
+ export function PermissionRequest({ toolUseConfirm, onDone, verbose, }) {
54
+ const dismissedRef = React.useRef(false);
55
+ // Handle Ctrl+C and Escape — reject and close the modal.
56
+ // Guard with dismissedRef so rapid keypresses don't double-fire
57
+ // onReject/onDone before React unmounts the component.
58
+ useInput((input, key) => {
59
+ if (dismissedRef.current)
60
+ return;
61
+ if ((key.ctrl && input === "c") || isEscapeInput(input, key)) {
62
+ dismissedRef.current = true;
63
+ toolUseConfirm.onReject();
64
+ onDone();
65
+ }
66
+ });
67
+ const PermissionComponent = permissionComponentForToolName(toolUseConfirm.tool.name);
68
+ return _jsx(PermissionComponent, { toolUseConfirm: toolUseConfirm, onDone: onDone, verbose: verbose });
69
+ }
70
+ //# sourceMappingURL=PermissionRequest.js.map
@@ -0,0 +1,41 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { getTheme } from "../../theme/index.js";
4
+ export function categoryForRiskScore(riskScore) {
5
+ return riskScore >= 70 ? "high" : riskScore >= 30 ? "moderate" : "low";
6
+ }
7
+ function colorSchemeForRiskScoreCategory(category) {
8
+ const theme = getTheme();
9
+ switch (category) {
10
+ case "low":
11
+ return {
12
+ highlightColor: theme.colors.success,
13
+ textColor: theme.colors.primary,
14
+ };
15
+ case "moderate":
16
+ return {
17
+ highlightColor: theme.colors.warning,
18
+ textColor: theme.colors.warning,
19
+ };
20
+ case "high":
21
+ return {
22
+ highlightColor: theme.colors.error,
23
+ textColor: theme.colors.error,
24
+ };
25
+ }
26
+ }
27
+ export function textColorForRiskScore(riskScore) {
28
+ if (riskScore === null) {
29
+ return getTheme().colors.primary;
30
+ }
31
+ const category = categoryForRiskScore(riskScore);
32
+ return colorSchemeForRiskScoreCategory(category).textColor;
33
+ }
34
+ export function PermissionRiskScore({ riskScore }) {
35
+ const category = categoryForRiskScore(riskScore);
36
+ return _jsxs(Text, { color: textColorForRiskScore(riskScore), children: ["Risk: ", category] });
37
+ }
38
+ export function PermissionRequestTitle({ title, riskScore }) {
39
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, color: getTheme().colors.primary, children: title }), riskScore !== null && _jsx(PermissionRiskScore, { riskScore: riskScore })] }));
40
+ }
41
+ //# sourceMappingURL=PermissionRequestTitle.js.map
@@ -0,0 +1,10 @@
1
+ // Change: removed all analytics (usePermissionRequestLogging was Statsig + unary logging)
2
+ // This hook is now a no-op stub kept for structural compatibility.
3
+ /**
4
+ * Stub for usePermissionRequestLogging.
5
+ * Analytics removed.
6
+ */
7
+ export function usePermissionRequestLogging(_toolUseConfirm, _unaryEvent) {
8
+ // no-op: analytics removed
9
+ }
10
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1,68 @@
1
+ // Changes:
2
+ // - Option type from @inkjs/ui → imported from CustomSelect
3
+ // - isUnsafeCompoundCommand → inline stub (always false)
4
+ // - getCwd → process.cwd()
5
+ // - getTheme → ARIA's theme
6
+ import chalk from "chalk";
7
+ import { toolUseConfirmGetPrefix } from "./PermissionRequest.js";
8
+ import { getTheme } from "../../theme/index.js";
9
+ /**
10
+ * Detects compound shell commands that chain multiple operations.
11
+ * Returns true if the command contains shell operators that could execute
12
+ * additional commands beyond what was explicitly approved.
13
+ */
14
+ function isUnsafeCompoundCommand(command) {
15
+ // Strip content inside single-quoted strings (they don't expand)
16
+ const withoutSingleQuoted = command.replace(/'[^']*'/g, "");
17
+ // Strip content inside double-quoted strings (preserve operators outside quotes)
18
+ const withoutQuoted = withoutSingleQuoted.replace(/"[^"]*"/g, "");
19
+ // Check for shell compound operators: &&, ||, ;, |, backticks, $()
20
+ if (/&&|\|\||[;|]/.test(withoutQuoted))
21
+ return true;
22
+ if (/`/.test(withoutQuoted))
23
+ return true;
24
+ if (/\$\(/.test(withoutQuoted))
25
+ return true;
26
+ return false;
27
+ }
28
+ /**
29
+ * Generates options for the tool use confirmation dialog
30
+ */
31
+ export function toolUseOptions({ toolUseConfirm, command, }) {
32
+ // Hide "don't ask again" options if the command is an unsafe compound command, or a potential command injection
33
+ const showDontAskAgainOption = !isUnsafeCompoundCommand(command) &&
34
+ toolUseConfirm.commandPrefix &&
35
+ !toolUseConfirm.commandPrefix.commandInjectionDetected;
36
+ const prefix = toolUseConfirmGetPrefix(toolUseConfirm);
37
+ const showDontAskAgainPrefixOption = showDontAskAgainOption && prefix !== null;
38
+ let dontShowAgainOptions = [];
39
+ if (showDontAskAgainPrefixOption) {
40
+ // Prefix option takes precedence over full command option
41
+ dontShowAgainOptions = [
42
+ {
43
+ label: `Yes, and don't ask again for ${chalk.bold(prefix)} commands in ${chalk.bold(process.cwd())}`,
44
+ value: "yes-dont-ask-again-prefix",
45
+ },
46
+ ];
47
+ }
48
+ else if (showDontAskAgainOption) {
49
+ dontShowAgainOptions = [
50
+ {
51
+ label: `Yes, and don't ask again for ${chalk.bold(command)} commands in ${chalk.bold(process.cwd())}`,
52
+ value: "yes-dont-ask-again-full",
53
+ },
54
+ ];
55
+ }
56
+ return [
57
+ {
58
+ label: "Yes",
59
+ value: "yes",
60
+ },
61
+ ...dontShowAgainOptions,
62
+ {
63
+ label: `No, and provide instructions (${chalk.bold.hex(getTheme().colors.warning)("esc")})`,
64
+ value: "no",
65
+ },
66
+ ];
67
+ }
68
+ //# sourceMappingURL=toolUseOptions.js.map
@@ -0,0 +1,10 @@
1
+ // Change: removed logUnaryEvent and env imports (analytics removed)
2
+ // This module is now a no-op stub kept for structural compatibility.
3
+ /**
4
+ * Stub for logUnaryPermissionEvent.
5
+ * Analytics removed.
6
+ */
7
+ export function logUnaryPermissionEvent(_completion_type, _toolUseConfirm, _event) {
8
+ // no-op: analytics removed
9
+ }
10
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1,326 @@
1
+ import stringWidth from "string-width";
2
+ export class Cursor {
3
+ measuredText;
4
+ selection;
5
+ offset;
6
+ constructor(measuredText, offset = 0, selection = 0) {
7
+ this.measuredText = measuredText;
8
+ this.selection = selection;
9
+ // it's ok for the cursor to be 1 char beyond the end of the string
10
+ this.offset = Math.max(0, Math.min(this.measuredText.text.length, offset));
11
+ }
12
+ static fromText(text, columns, offset = 0, selection = 0) {
13
+ // make MeasuredText on less than columns width, to account for cursor
14
+ return new Cursor(new MeasuredText(text, columns - 1), offset, selection);
15
+ }
16
+ render(cursorChar, mask, invert) {
17
+ const { line, column } = this.getPosition();
18
+ return this.measuredText
19
+ .getWrappedText()
20
+ .map((text, currentLine, allLines) => {
21
+ let displayText = text;
22
+ if (mask && currentLine === allLines.length - 1) {
23
+ const lastSixStart = Math.max(0, text.length - 6);
24
+ displayText = mask.repeat(lastSixStart) + text.slice(lastSixStart);
25
+ }
26
+ // looking for the line with the cursor
27
+ if (line != currentLine)
28
+ return displayText.trimEnd();
29
+ return (displayText.slice(0, column) +
30
+ invert(displayText[column] || cursorChar) +
31
+ displayText.trimEnd().slice(column + 1));
32
+ })
33
+ .join("\n");
34
+ }
35
+ left() {
36
+ return new Cursor(this.measuredText, this.offset - 1);
37
+ }
38
+ right() {
39
+ return new Cursor(this.measuredText, this.offset + 1);
40
+ }
41
+ up() {
42
+ const { line, column } = this.getPosition();
43
+ if (line == 0) {
44
+ return new Cursor(this.measuredText, 0, 0);
45
+ }
46
+ const newOffset = this.getOffset({ line: line - 1, column });
47
+ return new Cursor(this.measuredText, newOffset, 0);
48
+ }
49
+ down() {
50
+ const { line, column } = this.getPosition();
51
+ if (line >= this.measuredText.lineCount - 1) {
52
+ return new Cursor(this.measuredText, this.text.length, 0);
53
+ }
54
+ const newOffset = this.getOffset({ line: line + 1, column });
55
+ return new Cursor(this.measuredText, newOffset, 0);
56
+ }
57
+ startOfLine() {
58
+ const { line } = this.getPosition();
59
+ return new Cursor(this.measuredText, this.getOffset({
60
+ line,
61
+ column: 0,
62
+ }), 0);
63
+ }
64
+ endOfLine() {
65
+ const { line } = this.getPosition();
66
+ const column = this.measuredText.getLineLength(line);
67
+ const offset = this.getOffset({ line, column });
68
+ return new Cursor(this.measuredText, offset, 0);
69
+ }
70
+ nextWord() {
71
+ let nextCursor = this;
72
+ // If we're on a word, move to the next non-word
73
+ while (nextCursor.isOverWordChar() && !nextCursor.isAtEnd()) {
74
+ nextCursor = nextCursor.right();
75
+ }
76
+ // now move to the next word char
77
+ while (!nextCursor.isOverWordChar() && !nextCursor.isAtEnd()) {
78
+ nextCursor = nextCursor.right();
79
+ }
80
+ return nextCursor;
81
+ }
82
+ prevWord() {
83
+ let cursor = this;
84
+ // if we are already at the beginning of a word, step off it
85
+ if (!cursor.left().isOverWordChar()) {
86
+ cursor = cursor.left();
87
+ }
88
+ // Move left over any non-word characters
89
+ while (!cursor.isOverWordChar() && !cursor.isAtStart()) {
90
+ cursor = cursor.left();
91
+ }
92
+ // If we're over a word character, move to the start of this word
93
+ if (cursor.isOverWordChar()) {
94
+ while (cursor.left().isOverWordChar() && !cursor.isAtStart()) {
95
+ cursor = cursor.left();
96
+ }
97
+ }
98
+ return cursor;
99
+ }
100
+ modifyText(end, insertString = "") {
101
+ const startOffset = this.offset;
102
+ const endOffset = end.offset;
103
+ const newText = this.text.slice(0, startOffset) + insertString + this.text.slice(endOffset);
104
+ return Cursor.fromText(newText, this.columns, startOffset + insertString.length);
105
+ }
106
+ insert(insertString) {
107
+ const newCursor = this.modifyText(this, insertString);
108
+ return newCursor;
109
+ }
110
+ del() {
111
+ if (this.isAtEnd()) {
112
+ return this;
113
+ }
114
+ return this.modifyText(this.right());
115
+ }
116
+ backspace() {
117
+ if (this.isAtStart()) {
118
+ return this;
119
+ }
120
+ // Get the current position
121
+ const currentOffset = this.offset;
122
+ // Create a new cursor at the position before the current one
123
+ const leftCursor = this.left();
124
+ const leftOffset = leftCursor.offset;
125
+ // Create the new text by removing one character
126
+ const newText = this.text.slice(0, leftOffset) + this.text.slice(currentOffset);
127
+ // Return a new cursor with the updated text and position
128
+ return Cursor.fromText(newText, this.columns, leftOffset);
129
+ }
130
+ deleteToLineStart() {
131
+ return this.startOfLine().modifyText(this);
132
+ }
133
+ deleteToLineEnd() {
134
+ // If cursor is on a newline character, delete just that character
135
+ if (this.text[this.offset] === "\n") {
136
+ return this.modifyText(this.right());
137
+ }
138
+ return this.modifyText(this.endOfLine());
139
+ }
140
+ deleteWordBefore() {
141
+ if (this.isAtStart()) {
142
+ return this;
143
+ }
144
+ return this.prevWord().modifyText(this);
145
+ }
146
+ deleteWordAfter() {
147
+ if (this.isAtEnd()) {
148
+ return this;
149
+ }
150
+ return this.modifyText(this.nextWord());
151
+ }
152
+ isOverWordChar() {
153
+ const currentChar = this.text[this.offset] ?? "";
154
+ return /\w/.test(currentChar);
155
+ }
156
+ equals(other) {
157
+ return this.offset === other.offset && this.measuredText == other.measuredText;
158
+ }
159
+ isAtStart() {
160
+ return this.offset == 0;
161
+ }
162
+ isAtEnd() {
163
+ return this.offset == this.text.length;
164
+ }
165
+ get text() {
166
+ return this.measuredText.text;
167
+ }
168
+ get columns() {
169
+ return this.measuredText.columns + 1;
170
+ }
171
+ getPosition() {
172
+ return this.measuredText.getPositionFromOffset(this.offset);
173
+ }
174
+ getOffset(position) {
175
+ return this.measuredText.getOffsetFromPosition(position);
176
+ }
177
+ }
178
+ class WrappedLine {
179
+ text;
180
+ startOffset;
181
+ isPrecededByNewline;
182
+ endsWithNewline;
183
+ constructor(text, startOffset, isPrecededByNewline, endsWithNewline = false) {
184
+ this.text = text;
185
+ this.startOffset = startOffset;
186
+ this.isPrecededByNewline = isPrecededByNewline;
187
+ this.endsWithNewline = endsWithNewline;
188
+ }
189
+ equals(other) {
190
+ return this.text === other.text && this.startOffset === other.startOffset;
191
+ }
192
+ get length() {
193
+ return this.text.length + (this.endsWithNewline ? 1 : 0);
194
+ }
195
+ }
196
+ export class MeasuredText {
197
+ text;
198
+ columns;
199
+ wrappedLines;
200
+ constructor(text, columns) {
201
+ this.text = text;
202
+ this.columns = columns;
203
+ this.wrappedLines = this.measureWrappedText();
204
+ }
205
+ /**
206
+ * Walk the text character-by-character using stringWidth for visual widths,
207
+ * computing line breaks directly. This replaces the old wrapAnsi+indexOf
208
+ * approach which crashed when wrapAnsi transformed text (tab expansion,
209
+ * ANSI re-sequencing, wide-char padding) making indexOf fail.
210
+ */
211
+ measureWrappedText() {
212
+ if (this.text.length === 0) {
213
+ return [new WrappedLine("", 0, true, false)];
214
+ }
215
+ const lines = [];
216
+ let pos = 0;
217
+ while (pos < this.text.length) {
218
+ const lineStart = pos;
219
+ const isAfterNewline = pos === 0 || this.text[pos - 1] === "\n";
220
+ let width = 0;
221
+ let scan = pos;
222
+ let lastSpacePos = -1;
223
+ while (scan < this.text.length) {
224
+ const ch = this.text[scan];
225
+ if (ch === "\n") {
226
+ lines.push(new WrappedLine(this.text.slice(lineStart, scan), lineStart, isAfterNewline, true));
227
+ pos = scan + 1;
228
+ break;
229
+ }
230
+ const cp = this.text.codePointAt(scan);
231
+ const fullChar = String.fromCodePoint(cp);
232
+ const charWidth = stringWidth(fullChar);
233
+ if (width + charWidth > this.columns) {
234
+ let wrapPos;
235
+ if (lastSpacePos >= lineStart && lastSpacePos + 1 < scan) {
236
+ // Word wrap: break after the last space
237
+ wrapPos = lastSpacePos + 1;
238
+ }
239
+ else if (scan > lineStart) {
240
+ // Hard wrap: break before this character
241
+ wrapPos = scan;
242
+ }
243
+ else {
244
+ // Single character wider than columns — force it on this line
245
+ wrapPos = scan + fullChar.length;
246
+ }
247
+ lines.push(new WrappedLine(this.text.slice(lineStart, wrapPos), lineStart, isAfterNewline, false));
248
+ pos = wrapPos;
249
+ break;
250
+ }
251
+ if (ch === " " || ch === "\t") {
252
+ lastSpacePos = scan;
253
+ }
254
+ width += charWidth;
255
+ scan += fullChar.length;
256
+ }
257
+ // Reached end of text without hitting \n or wrap
258
+ if (scan >= this.text.length && pos === lineStart) {
259
+ lines.push(new WrappedLine(this.text.slice(lineStart), lineStart, isAfterNewline, false));
260
+ pos = this.text.length;
261
+ }
262
+ }
263
+ // Trailing newline produces an empty final line
264
+ if (this.text.length > 0 && this.text[this.text.length - 1] === "\n") {
265
+ lines.push(new WrappedLine("", this.text.length, true, false));
266
+ }
267
+ return lines;
268
+ }
269
+ getWrappedText() {
270
+ return this.wrappedLines.map((line) => line.isPrecededByNewline ? line.text : line.text.trimStart());
271
+ }
272
+ getLine(line) {
273
+ return this.wrappedLines[Math.max(0, Math.min(line, this.wrappedLines.length - 1))];
274
+ }
275
+ getOffsetFromPosition(position) {
276
+ const wrappedLine = this.getLine(position.line);
277
+ const startOffsetPlusColumn = wrappedLine.startOffset + position.column;
278
+ // Handle blank lines specially
279
+ if (wrappedLine.text.length === 0 && wrappedLine.endsWithNewline) {
280
+ return wrappedLine.startOffset;
281
+ }
282
+ // For normal lines
283
+ const lineEnd = wrappedLine.startOffset + wrappedLine.text.length;
284
+ // Add 1 only if this line ends with a newline
285
+ const maxOffset = wrappedLine.endsWithNewline ? lineEnd + 1 : lineEnd;
286
+ return Math.min(startOffsetPlusColumn, maxOffset);
287
+ }
288
+ getLineLength(line) {
289
+ const currentLine = this.getLine(line);
290
+ const nextLine = this.getLine(line + 1);
291
+ if (nextLine.equals(currentLine)) {
292
+ return this.text.length - currentLine.startOffset;
293
+ }
294
+ return nextLine.startOffset - currentLine.startOffset - 1;
295
+ }
296
+ getPositionFromOffset(offset) {
297
+ const lines = this.wrappedLines;
298
+ for (let line = 0; line < lines.length; line++) {
299
+ const currentLine = lines[line];
300
+ const nextLine = lines[line + 1];
301
+ if (offset >= currentLine.startOffset && (!nextLine || offset < nextLine.startOffset)) {
302
+ const leadingWhitepace = currentLine.isPrecededByNewline
303
+ ? 0
304
+ : currentLine.text.length - currentLine.text.trimStart().length;
305
+ const column = Math.max(0, Math.min(offset - currentLine.startOffset - leadingWhitepace, currentLine.text.length));
306
+ return {
307
+ line,
308
+ column,
309
+ };
310
+ }
311
+ }
312
+ // If we're past the last character, return the end of the last line
313
+ const line = lines.length - 1;
314
+ return {
315
+ line,
316
+ column: this.wrappedLines[line].text.length,
317
+ };
318
+ }
319
+ get lineCount() {
320
+ return this.wrappedLines.length;
321
+ }
322
+ equals(other) {
323
+ return this.text === other.text && this.columns === other.columns;
324
+ }
325
+ }
326
+ //# sourceMappingURL=Cursor.js.map