actoviq-agent-sdk 0.4.7 → 0.4.8

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 (258) hide show
  1. package/CHANGELOG.md +17 -1
  2. package/README-zh.md +8 -5
  3. package/README.md +9 -6
  4. package/assets/actoviq-icon.png +0 -0
  5. package/dist/src/browser/actoviqBrowserSession.d.ts +137 -0
  6. package/dist/src/browser/actoviqBrowserSession.d.ts.map +1 -0
  7. package/dist/src/browser/actoviqBrowserSession.js +623 -0
  8. package/dist/src/browser/actoviqBrowserSession.js.map +1 -0
  9. package/dist/src/browser/actoviqBrowserTools.d.ts +80 -0
  10. package/dist/src/browser/actoviqBrowserTools.d.ts.map +1 -0
  11. package/dist/src/browser/actoviqBrowserTools.js +177 -0
  12. package/dist/src/browser/actoviqBrowserTools.js.map +1 -0
  13. package/dist/src/browser/browserSettings.d.ts +8 -0
  14. package/dist/src/browser/browserSettings.d.ts.map +1 -0
  15. package/dist/src/browser/browserSettings.js +47 -0
  16. package/dist/src/browser/browserSettings.js.map +1 -0
  17. package/dist/src/cli/actoviq-react.js +144 -4
  18. package/dist/src/cli/actoviq-react.js.map +1 -1
  19. package/dist/src/computer/actoviqComputerUse.d.ts.map +1 -1
  20. package/dist/src/computer/actoviqComputerUse.js +226 -40
  21. package/dist/src/computer/actoviqComputerUse.js.map +1 -1
  22. package/dist/src/computer/e2bComputerUse.d.ts +57 -0
  23. package/dist/src/computer/e2bComputerUse.d.ts.map +1 -0
  24. package/dist/src/computer/e2bComputerUse.js +401 -0
  25. package/dist/src/computer/e2bComputerUse.js.map +1 -0
  26. package/dist/src/config/agentProfiles.d.ts +8 -1
  27. package/dist/src/config/agentProfiles.d.ts.map +1 -1
  28. package/dist/src/config/agentProfiles.js +86 -4
  29. package/dist/src/config/agentProfiles.js.map +1 -1
  30. package/dist/src/config/projectSessionDirectory.d.ts +22 -0
  31. package/dist/src/config/projectSessionDirectory.d.ts.map +1 -1
  32. package/dist/src/config/projectSessionDirectory.js +512 -46
  33. package/dist/src/config/projectSessionDirectory.js.map +1 -1
  34. package/dist/src/config/resolveRuntimeConfig.d.ts.map +1 -1
  35. package/dist/src/config/resolveRuntimeConfig.js +12 -7
  36. package/dist/src/config/resolveRuntimeConfig.js.map +1 -1
  37. package/dist/src/gui/actoviqGui.d.ts +3 -0
  38. package/dist/src/gui/actoviqGui.d.ts.map +1 -1
  39. package/dist/src/gui/actoviqGui.js +7247 -997
  40. package/dist/src/gui/actoviqGui.js.map +1 -1
  41. package/dist/src/gui/electronMain.js +21 -4
  42. package/dist/src/gui/electronMain.js.map +1 -1
  43. package/dist/src/gui/externalCliAgentMonitor.d.ts +15 -0
  44. package/dist/src/gui/externalCliAgentMonitor.d.ts.map +1 -0
  45. package/dist/src/gui/externalCliAgentMonitor.js +133 -0
  46. package/dist/src/gui/externalCliAgentMonitor.js.map +1 -0
  47. package/dist/src/gui/projectWorkbench.d.ts +2 -0
  48. package/dist/src/gui/projectWorkbench.d.ts.map +1 -1
  49. package/dist/src/gui/projectWorkbench.js +66 -1
  50. package/dist/src/gui/projectWorkbench.js.map +1 -1
  51. package/dist/src/gui/transcript/clientBundle.d.ts.map +1 -1
  52. package/dist/src/gui/transcript/clientBundle.js +157 -17
  53. package/dist/src/gui/transcript/clientBundle.js.map +1 -1
  54. package/dist/src/gui/transcript/parts.d.ts.map +1 -1
  55. package/dist/src/gui/transcript/parts.js +28 -0
  56. package/dist/src/gui/transcript/parts.js.map +1 -1
  57. package/dist/src/index.d.ts +36 -3
  58. package/dist/src/index.d.ts.map +1 -1
  59. package/dist/src/index.js +22 -2
  60. package/dist/src/index.js.map +1 -1
  61. package/dist/src/parity/actoviqBridgeSdk.d.ts +13 -1
  62. package/dist/src/parity/actoviqBridgeSdk.d.ts.map +1 -1
  63. package/dist/src/parity/actoviqBridgeSdk.js +1022 -83
  64. package/dist/src/parity/actoviqBridgeSdk.js.map +1 -1
  65. package/dist/src/parity/bridgeConfigs.d.ts +15 -0
  66. package/dist/src/parity/bridgeConfigs.d.ts.map +1 -1
  67. package/dist/src/parity/bridgeConfigs.js +112 -3
  68. package/dist/src/parity/bridgeConfigs.js.map +1 -1
  69. package/dist/src/parity/bridgeEventAdapter.d.ts +5 -1
  70. package/dist/src/parity/bridgeEventAdapter.d.ts.map +1 -1
  71. package/dist/src/parity/bridgeEventAdapter.js +65 -12
  72. package/dist/src/parity/bridgeEventAdapter.js.map +1 -1
  73. package/dist/src/parity/bridgeExecResolver.d.ts +10 -11
  74. package/dist/src/parity/bridgeExecResolver.d.ts.map +1 -1
  75. package/dist/src/parity/bridgeExecResolver.js +40 -23
  76. package/dist/src/parity/bridgeExecResolver.js.map +1 -1
  77. package/dist/src/parity/bridgeProcessTree.d.ts +3 -0
  78. package/dist/src/parity/bridgeProcessTree.d.ts.map +1 -0
  79. package/dist/src/parity/bridgeProcessTree.js +83 -0
  80. package/dist/src/parity/bridgeProcessTree.js.map +1 -0
  81. package/dist/src/parity/bridgeProviders.d.ts +16 -2
  82. package/dist/src/parity/bridgeProviders.d.ts.map +1 -1
  83. package/dist/src/parity/bridgeProviders.js +482 -100
  84. package/dist/src/parity/bridgeProviders.js.map +1 -1
  85. package/dist/src/parity/codewhaleRuntimeAdapter.d.ts +18 -0
  86. package/dist/src/parity/codewhaleRuntimeAdapter.d.ts.map +1 -0
  87. package/dist/src/parity/codewhaleRuntimeAdapter.js +350 -0
  88. package/dist/src/parity/codewhaleRuntimeAdapter.js.map +1 -0
  89. package/dist/src/parity/crushManagedClient.d.ts +84 -0
  90. package/dist/src/parity/crushManagedClient.d.ts.map +1 -0
  91. package/dist/src/parity/crushManagedClient.js +978 -0
  92. package/dist/src/parity/crushManagedClient.js.map +1 -0
  93. package/dist/src/parity/crushSessionHistory.d.ts +53 -0
  94. package/dist/src/parity/crushSessionHistory.d.ts.map +1 -0
  95. package/dist/src/parity/crushSessionHistory.js +358 -0
  96. package/dist/src/parity/crushSessionHistory.js.map +1 -0
  97. package/dist/src/parity/externalCliAuth.d.ts +23 -0
  98. package/dist/src/parity/externalCliAuth.d.ts.map +1 -0
  99. package/dist/src/parity/externalCliAuth.js +268 -0
  100. package/dist/src/parity/externalCliAuth.js.map +1 -0
  101. package/dist/src/parity/externalCliRuntimeManager.d.ts +138 -0
  102. package/dist/src/parity/externalCliRuntimeManager.d.ts.map +1 -0
  103. package/dist/src/parity/externalCliRuntimeManager.js +527 -0
  104. package/dist/src/parity/externalCliRuntimeManager.js.map +1 -0
  105. package/dist/src/parity/externalCliSessions.d.ts +90 -0
  106. package/dist/src/parity/externalCliSessions.d.ts.map +1 -0
  107. package/dist/src/parity/externalCliSessions.js +1436 -0
  108. package/dist/src/parity/externalCliSessions.js.map +1 -0
  109. package/dist/src/parity/reasonixAcpSession.d.ts +35 -0
  110. package/dist/src/parity/reasonixAcpSession.d.ts.map +1 -0
  111. package/dist/src/parity/reasonixAcpSession.js +472 -0
  112. package/dist/src/parity/reasonixAcpSession.js.map +1 -0
  113. package/dist/src/parity/reasonixManagedClient.d.ts +56 -0
  114. package/dist/src/parity/reasonixManagedClient.d.ts.map +1 -0
  115. package/dist/src/parity/reasonixManagedClient.js +293 -0
  116. package/dist/src/parity/reasonixManagedClient.js.map +1 -0
  117. package/dist/src/parity/reasonixSessionParser.d.ts +50 -0
  118. package/dist/src/parity/reasonixSessionParser.d.ts.map +1 -0
  119. package/dist/src/parity/reasonixSessionParser.js +440 -0
  120. package/dist/src/parity/reasonixSessionParser.js.map +1 -0
  121. package/dist/src/plugins/githubPlugin.d.ts +64 -0
  122. package/dist/src/plugins/githubPlugin.d.ts.map +1 -0
  123. package/dist/src/plugins/githubPlugin.js +261 -0
  124. package/dist/src/plugins/githubPlugin.js.map +1 -0
  125. package/dist/src/plugins/kimiWebBridgePlugin.d.ts +32 -0
  126. package/dist/src/plugins/kimiWebBridgePlugin.d.ts.map +1 -0
  127. package/dist/src/plugins/kimiWebBridgePlugin.js +214 -0
  128. package/dist/src/plugins/kimiWebBridgePlugin.js.map +1 -0
  129. package/dist/src/plugins/managedPluginCatalog.d.ts +47 -0
  130. package/dist/src/plugins/managedPluginCatalog.d.ts.map +1 -0
  131. package/dist/src/plugins/managedPluginCatalog.js +399 -0
  132. package/dist/src/plugins/managedPluginCatalog.js.map +1 -0
  133. package/dist/src/plugins/managedPluginHealth.d.ts +9 -0
  134. package/dist/src/plugins/managedPluginHealth.d.ts.map +1 -0
  135. package/dist/src/plugins/managedPluginHealth.js +149 -0
  136. package/dist/src/plugins/managedPluginHealth.js.map +1 -0
  137. package/dist/src/plugins/managedPluginRuntime.d.ts +14 -0
  138. package/dist/src/plugins/managedPluginRuntime.d.ts.map +1 -0
  139. package/dist/src/plugins/managedPluginRuntime.js +331 -0
  140. package/dist/src/plugins/managedPluginRuntime.js.map +1 -0
  141. package/dist/src/plugins/ocrPlugin.d.ts +46 -0
  142. package/dist/src/plugins/ocrPlugin.d.ts.map +1 -0
  143. package/dist/src/plugins/ocrPlugin.js +464 -0
  144. package/dist/src/plugins/ocrPlugin.js.map +1 -0
  145. package/dist/src/provider/client.d.ts +7 -1
  146. package/dist/src/provider/client.d.ts.map +1 -1
  147. package/dist/src/provider/client.js +61 -6
  148. package/dist/src/provider/client.js.map +1 -1
  149. package/dist/src/provider/openai-client.d.ts.map +1 -1
  150. package/dist/src/provider/openai-client.js +49 -3
  151. package/dist/src/provider/openai-client.js.map +1 -1
  152. package/dist/src/runtime/actoviqAgentExecutions.d.ts +85 -0
  153. package/dist/src/runtime/actoviqAgentExecutions.d.ts.map +1 -0
  154. package/dist/src/runtime/actoviqAgentExecutions.js +479 -0
  155. package/dist/src/runtime/actoviqAgentExecutions.js.map +1 -0
  156. package/dist/src/runtime/actoviqAgents.d.ts +15 -12
  157. package/dist/src/runtime/actoviqAgents.d.ts.map +1 -1
  158. package/dist/src/runtime/actoviqAgents.js +15 -0
  159. package/dist/src/runtime/actoviqAgents.js.map +1 -1
  160. package/dist/src/runtime/actoviqBackgroundTasks.d.ts +17 -2
  161. package/dist/src/runtime/actoviqBackgroundTasks.d.ts.map +1 -1
  162. package/dist/src/runtime/actoviqBackgroundTasks.js +291 -104
  163. package/dist/src/runtime/actoviqBackgroundTasks.js.map +1 -1
  164. package/dist/src/runtime/actoviqCompact.d.ts.map +1 -1
  165. package/dist/src/runtime/actoviqCompact.js +10 -75
  166. package/dist/src/runtime/actoviqCompact.js.map +1 -1
  167. package/dist/src/runtime/actoviqSkills.d.ts +14 -1
  168. package/dist/src/runtime/actoviqSkills.d.ts.map +1 -1
  169. package/dist/src/runtime/actoviqSkills.js +27 -2
  170. package/dist/src/runtime/actoviqSkills.js.map +1 -1
  171. package/dist/src/runtime/agentClient.d.ts +16 -2
  172. package/dist/src/runtime/agentClient.d.ts.map +1 -1
  173. package/dist/src/runtime/agentClient.js +745 -207
  174. package/dist/src/runtime/agentClient.js.map +1 -1
  175. package/dist/src/runtime/agentExecution.d.ts +196 -0
  176. package/dist/src/runtime/agentExecution.d.ts.map +1 -0
  177. package/dist/src/runtime/agentExecution.js +360 -0
  178. package/dist/src/runtime/agentExecution.js.map +1 -0
  179. package/dist/src/runtime/agentRuntimeDiscovery.d.ts +8 -2
  180. package/dist/src/runtime/agentRuntimeDiscovery.d.ts.map +1 -1
  181. package/dist/src/runtime/agentRuntimeDiscovery.js +30 -18
  182. package/dist/src/runtime/agentRuntimeDiscovery.js.map +1 -1
  183. package/dist/src/runtime/conversationEngine.d.ts +2 -1
  184. package/dist/src/runtime/conversationEngine.d.ts.map +1 -1
  185. package/dist/src/runtime/conversationEngine.js +66 -50
  186. package/dist/src/runtime/conversationEngine.js.map +1 -1
  187. package/dist/src/runtime/externalSkillCatalog.d.ts +107 -0
  188. package/dist/src/runtime/externalSkillCatalog.d.ts.map +1 -0
  189. package/dist/src/runtime/externalSkillCatalog.js +895 -0
  190. package/dist/src/runtime/externalSkillCatalog.js.map +1 -0
  191. package/dist/src/runtime/externalSkillPreferences.d.ts +25 -0
  192. package/dist/src/runtime/externalSkillPreferences.d.ts.map +1 -0
  193. package/dist/src/runtime/externalSkillPreferences.js +132 -0
  194. package/dist/src/runtime/externalSkillPreferences.js.map +1 -0
  195. package/dist/src/runtime/externalSkillRuntime.d.ts +31 -0
  196. package/dist/src/runtime/externalSkillRuntime.d.ts.map +1 -0
  197. package/dist/src/runtime/externalSkillRuntime.js +129 -0
  198. package/dist/src/runtime/externalSkillRuntime.js.map +1 -0
  199. package/dist/src/runtime/sessionTurnCoordinator.d.ts +2 -2
  200. package/dist/src/runtime/sessionTurnCoordinator.js +2 -2
  201. package/dist/src/storage/agentExecutionStore.d.ts +31 -0
  202. package/dist/src/storage/agentExecutionStore.d.ts.map +1 -0
  203. package/dist/src/storage/agentExecutionStore.js +413 -0
  204. package/dist/src/storage/agentExecutionStore.js.map +1 -0
  205. package/dist/src/storage/backgroundTaskStore.d.ts +5 -0
  206. package/dist/src/storage/backgroundTaskStore.d.ts.map +1 -1
  207. package/dist/src/storage/backgroundTaskStore.js +79 -3
  208. package/dist/src/storage/backgroundTaskStore.js.map +1 -1
  209. package/dist/src/storage/sessionStore.d.ts +8 -0
  210. package/dist/src/storage/sessionStore.d.ts.map +1 -1
  211. package/dist/src/storage/sessionStore.js +134 -18
  212. package/dist/src/storage/sessionStore.js.map +1 -1
  213. package/dist/src/team/teamGraphLayout.d.ts +53 -1
  214. package/dist/src/team/teamGraphLayout.d.ts.map +1 -1
  215. package/dist/src/team/teamGraphLayout.js +127 -1
  216. package/dist/src/team/teamGraphLayout.js.map +1 -1
  217. package/dist/src/team/teamGraphScaffold.d.ts.map +1 -1
  218. package/dist/src/team/teamGraphScaffold.js +31 -0
  219. package/dist/src/team/teamGraphScaffold.js.map +1 -1
  220. package/dist/src/team/teamGraphV3.d.ts +1 -0
  221. package/dist/src/team/teamGraphV3.d.ts.map +1 -1
  222. package/dist/src/team/teamGraphV3.js +24 -5
  223. package/dist/src/team/teamGraphV3.js.map +1 -1
  224. package/dist/src/team/teamPropose.d.ts +19 -0
  225. package/dist/src/team/teamPropose.d.ts.map +1 -0
  226. package/dist/src/team/teamPropose.js +126 -0
  227. package/dist/src/team/teamPropose.js.map +1 -0
  228. package/dist/src/tools/actoviqCoreTools.d.ts.map +1 -1
  229. package/dist/src/tools/actoviqCoreTools.js +3 -1
  230. package/dist/src/tools/actoviqCoreTools.js.map +1 -1
  231. package/dist/src/tools/exaSearch.d.ts +56 -0
  232. package/dist/src/tools/exaSearch.d.ts.map +1 -0
  233. package/dist/src/tools/exaSearch.js +170 -0
  234. package/dist/src/tools/exaSearch.js.map +1 -0
  235. package/dist/src/tools/tavilySearch.d.ts +34 -1
  236. package/dist/src/tools/tavilySearch.d.ts.map +1 -1
  237. package/dist/src/tools/tavilySearch.js +69 -54
  238. package/dist/src/tools/tavilySearch.js.map +1 -1
  239. package/dist/src/tools/todo/TodoWriteTool.d.ts +1 -1
  240. package/dist/src/tui/actoviqTui.d.ts +3 -1
  241. package/dist/src/tui/actoviqTui.d.ts.map +1 -1
  242. package/dist/src/tui/actoviqTui.js +1208 -92
  243. package/dist/src/tui/actoviqTui.js.map +1 -1
  244. package/dist/src/types.d.ts +223 -14
  245. package/dist/src/types.d.ts.map +1 -1
  246. package/dist/src/types.js.map +1 -1
  247. package/dist/src/ui/agentExecutionView.d.ts +111 -0
  248. package/dist/src/ui/agentExecutionView.d.ts.map +1 -0
  249. package/dist/src/ui/agentExecutionView.js +442 -0
  250. package/dist/src/ui/agentExecutionView.js.map +1 -0
  251. package/dist/src/ui/commandSurface.d.ts +2 -0
  252. package/dist/src/ui/commandSurface.d.ts.map +1 -1
  253. package/dist/src/ui/commandSurface.js +38 -3
  254. package/dist/src/ui/commandSurface.js.map +1 -1
  255. package/dist/src/workflow-v2/localIsolatedProcessExecutor.d.ts.map +1 -1
  256. package/dist/src/workflow-v2/localIsolatedProcessExecutor.js +6 -2
  257. package/dist/src/workflow-v2/localIsolatedProcessExecutor.js.map +1 -1
  258. package/package.json +35 -7
@@ -0,0 +1,80 @@
1
+ import type { AgentToolDefinition, CreateActoviqBrowserUseOptions, LocalMcpServerDefinition } from '../types.js';
2
+ import { ActoviqBrowserSession, type ActoviqBrowserSessionOptions } from './actoviqBrowserSession.js';
3
+ export interface ActoviqBrowserUseToolkit {
4
+ tools: AgentToolDefinition[];
5
+ mcpServer: LocalMcpServerDefinition;
6
+ session: ActoviqBrowserSession;
7
+ }
8
+ export interface ActoviqBrowserSessionLike {
9
+ navigate(url: string, opts?: {
10
+ newTab?: boolean;
11
+ }): Promise<{
12
+ tabId: string;
13
+ url: string;
14
+ title: string;
15
+ }>;
16
+ goBack(): Promise<{
17
+ url: string;
18
+ title: string;
19
+ }>;
20
+ wait(ms: number): Promise<void>;
21
+ snapshot(opts?: {
22
+ interactiveOnly?: boolean;
23
+ maxElements?: number;
24
+ }): Promise<unknown>;
25
+ click(target: {
26
+ index?: number;
27
+ x?: number;
28
+ y?: number;
29
+ }): Promise<{
30
+ ok: true;
31
+ }>;
32
+ type(input: {
33
+ index: number;
34
+ text: string;
35
+ clear?: boolean;
36
+ submit?: boolean;
37
+ }): Promise<{
38
+ ok: true;
39
+ }>;
40
+ press(keys: string): Promise<{
41
+ ok: true;
42
+ }>;
43
+ scroll(input: {
44
+ direction: 'up' | 'down';
45
+ pages?: number;
46
+ index?: number;
47
+ }): Promise<{
48
+ ok: true;
49
+ }>;
50
+ screenshot(opts?: {
51
+ path?: string;
52
+ fullPage?: boolean;
53
+ }): Promise<{
54
+ path?: string;
55
+ base64?: string;
56
+ }>;
57
+ tabsDetailed(): Promise<unknown>;
58
+ switchTab(tabId: string): Promise<{
59
+ ok: true;
60
+ tabId: string;
61
+ }>;
62
+ closeTab(tabId?: string): Promise<{
63
+ ok: true;
64
+ closed: string;
65
+ }>;
66
+ extract(): Promise<{
67
+ url: string;
68
+ title: string;
69
+ text: string;
70
+ }>;
71
+ evaluate?(expression: string): Promise<{
72
+ result: unknown;
73
+ }>;
74
+ close(): Promise<void>;
75
+ }
76
+ export declare function sessionOptionsFromBrowserUse(options?: CreateActoviqBrowserUseOptions): ActoviqBrowserSessionOptions;
77
+ export declare function createActoviqBrowserTools(options?: CreateActoviqBrowserUseOptions): AgentToolDefinition[];
78
+ export declare function createActoviqBrowserUseMcpServer(options?: CreateActoviqBrowserUseOptions): LocalMcpServerDefinition;
79
+ export declare function createActoviqBrowserUseToolkit(options?: CreateActoviqBrowserUseOptions): ActoviqBrowserUseToolkit;
80
+ //# sourceMappingURL=actoviqBrowserTools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actoviqBrowserTools.d.ts","sourceRoot":"","sources":["../../../src/browser/actoviqBrowserTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ import { z } from 'zod';
2
+ import { tool } from '../runtime/tools.js';
3
+ import { ActoviqBrowserSession, } from './actoviqBrowserSession.js';
4
+ function withPrefix(prefix, suffix) {
5
+ return prefix?.trim() ? `${prefix}_${suffix}` : `browser_${suffix}`;
6
+ }
7
+ export function sessionOptionsFromBrowserUse(options = {}) {
8
+ return {
9
+ headless: options.headless,
10
+ channel: options.channel,
11
+ cdpUrl: options.cdpUrl,
12
+ userDataDir: options.userDataDir,
13
+ workspaceDir: options.workspaceDir,
14
+ allowedDomains: options.allowedDomains,
15
+ defaultTimeoutMs: options.defaultTimeoutMs,
16
+ viewport: options.viewport,
17
+ };
18
+ }
19
+ export function createActoviqBrowserTools(options = {}) {
20
+ const session = options.session ?? new ActoviqBrowserSession(sessionOptionsFromBrowserUse(options));
21
+ const allowEvaluate = options.allowEvaluate === true;
22
+ const requiresHostSessionApproval = () => Boolean(options.cdpUrl?.trim() || options.userDataDir?.trim());
23
+ const tools = [
24
+ tool({
25
+ name: withPrefix(options.prefix, 'navigate'),
26
+ description: 'Open a URL in the controlled browser (Playwright). Prefer this for page automation; use computer_* for OS-level actions.',
27
+ inputSchema: z.object({
28
+ url: z.string().url(),
29
+ newTab: z.boolean().optional(),
30
+ }),
31
+ isDestructive: () => false,
32
+ requiresUserInteraction: requiresHostSessionApproval,
33
+ }, async ({ url, newTab }) => session.navigate(url, { newTab })),
34
+ tool({
35
+ name: withPrefix(options.prefix, 'go_back'),
36
+ description: 'Navigate the active browser tab back in history.',
37
+ inputSchema: z.object({}),
38
+ requiresUserInteraction: requiresHostSessionApproval,
39
+ }, async () => session.goBack()),
40
+ tool({
41
+ name: withPrefix(options.prefix, 'wait'),
42
+ description: 'Wait briefly for the page to settle before the next browser action.',
43
+ inputSchema: z.object({
44
+ ms: z.number().int().min(0).max(60_000).optional(),
45
+ }),
46
+ requiresUserInteraction: requiresHostSessionApproval,
47
+ }, async ({ ms }) => {
48
+ await session.wait(ms ?? 1000);
49
+ return { ok: true, ms: ms ?? 1000 };
50
+ }),
51
+ tool({
52
+ name: withPrefix(options.prefix, 'snapshot'),
53
+ description: 'Capture the current page URL/title and a numbered list of interactive elements. Use element indexes with browser_click / browser_type (browser-use style).',
54
+ inputSchema: z.object({
55
+ interactiveOnly: z.boolean().optional(),
56
+ maxElements: z.number().int().min(1).max(300).optional(),
57
+ }),
58
+ isReadOnly: () => true,
59
+ requiresUserInteraction: requiresHostSessionApproval,
60
+ }, async (input) => session.snapshot(input)),
61
+ tool({
62
+ name: withPrefix(options.prefix, 'click'),
63
+ description: 'Click an interactive element by snapshot index, or by viewport x/y coordinates.',
64
+ inputSchema: z.object({
65
+ index: z.number().int().min(0).optional(),
66
+ x: z.number().optional(),
67
+ y: z.number().optional(),
68
+ }),
69
+ requiresUserInteraction: requiresHostSessionApproval,
70
+ }, async (input) => session.click(input)),
71
+ tool({
72
+ name: withPrefix(options.prefix, 'type'),
73
+ description: 'Type into an interactive element identified by browser_snapshot index.',
74
+ inputSchema: z.object({
75
+ index: z.number().int().min(0),
76
+ text: z.string(),
77
+ clear: z.boolean().optional(),
78
+ submit: z.boolean().optional(),
79
+ }),
80
+ requiresUserInteraction: requiresHostSessionApproval,
81
+ }, async (input) => session.type(input)),
82
+ tool({
83
+ name: withPrefix(options.prefix, 'press'),
84
+ description: 'Press a key or chord in the active page (Playwright key names, e.g. Enter, Control+a).',
85
+ inputSchema: z.object({
86
+ keys: z.string().min(1),
87
+ }),
88
+ requiresUserInteraction: requiresHostSessionApproval,
89
+ }, async ({ keys }) => session.press(keys)),
90
+ tool({
91
+ name: withPrefix(options.prefix, 'scroll'),
92
+ description: 'Scroll the page, or scroll a snapshot element into view.',
93
+ inputSchema: z.object({
94
+ direction: z.enum(['up', 'down']).optional(),
95
+ pages: z.number().int().min(1).max(10).optional(),
96
+ index: z.number().int().min(0).optional(),
97
+ }),
98
+ requiresUserInteraction: requiresHostSessionApproval,
99
+ }, async (input) => session.scroll({
100
+ direction: input.direction ?? 'down',
101
+ pages: input.pages,
102
+ index: input.index,
103
+ })),
104
+ tool({
105
+ name: withPrefix(options.prefix, 'screenshot'),
106
+ description: 'Capture a PNG screenshot of the active tab. Provide path to save on disk, otherwise returns base64.',
107
+ inputSchema: z.object({
108
+ path: z.string().min(1).optional(),
109
+ fullPage: z.boolean().optional(),
110
+ }),
111
+ isReadOnly: (input) => !input?.path,
112
+ isDestructive: (input) => Boolean(input?.path),
113
+ requiresUserInteraction: requiresHostSessionApproval,
114
+ }, async (input) => session.screenshot(input)),
115
+ tool({
116
+ name: withPrefix(options.prefix, 'tabs'),
117
+ description: 'List open browser tabs (id, url, title, active).',
118
+ inputSchema: z.object({}),
119
+ isReadOnly: () => true,
120
+ requiresUserInteraction: requiresHostSessionApproval,
121
+ }, async () => ({ tabs: await session.tabsDetailed() })),
122
+ tool({
123
+ name: withPrefix(options.prefix, 'switch'),
124
+ description: 'Switch the active browser tab by id from browser_tabs.',
125
+ inputSchema: z.object({
126
+ tabId: z.string().min(1),
127
+ }),
128
+ requiresUserInteraction: requiresHostSessionApproval,
129
+ }, async ({ tabId }) => session.switchTab(tabId)),
130
+ tool({
131
+ name: withPrefix(options.prefix, 'close'),
132
+ description: 'Close a browser tab (defaults to the active tab). Closing the last tab opens a blank one.',
133
+ inputSchema: z.object({
134
+ tabId: z.string().min(1).optional(),
135
+ }),
136
+ requiresUserInteraction: requiresHostSessionApproval,
137
+ }, async ({ tabId }) => session.closeTab(tabId)),
138
+ tool({
139
+ name: withPrefix(options.prefix, 'extract'),
140
+ description: 'Extract visible text from the active page (truncated). Prefer snapshot for interactive control.',
141
+ inputSchema: z.object({}),
142
+ isReadOnly: () => true,
143
+ requiresUserInteraction: requiresHostSessionApproval,
144
+ }, async () => session.extract()),
145
+ ];
146
+ if (allowEvaluate && session.evaluate) {
147
+ tools.push(tool({
148
+ name: withPrefix(options.prefix, 'evaluate'),
149
+ description: 'Evaluate a JavaScript expression in the page. Potentially dangerous; only enabled when allowEvaluate is true.',
150
+ inputSchema: z.object({
151
+ expression: z.string().min(1),
152
+ }),
153
+ isDestructive: () => true,
154
+ requiresUserInteraction: requiresHostSessionApproval,
155
+ }, async ({ expression }) => session.evaluate(expression)));
156
+ }
157
+ return tools;
158
+ }
159
+ export function createActoviqBrowserUseMcpServer(options = {}) {
160
+ return {
161
+ kind: 'local',
162
+ name: options.serverName ?? 'actoviq-browser-use',
163
+ prefix: options.prefix ?? 'browser',
164
+ tools: createActoviqBrowserTools(options),
165
+ };
166
+ }
167
+ export function createActoviqBrowserUseToolkit(options = {}) {
168
+ const session = options.session ??
169
+ new ActoviqBrowserSession(sessionOptionsFromBrowserUse(options));
170
+ const next = { ...options, session };
171
+ return {
172
+ tools: createActoviqBrowserTools(next),
173
+ mcpServer: createActoviqBrowserUseMcpServer(next),
174
+ session,
175
+ };
176
+ }
177
+ //# sourceMappingURL=actoviqBrowserTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actoviqBrowserTools.js","sourceRoot":"","sources":["../../../src/browser/actoviqBrowserTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { CreateActoviqBrowserUseOptions } from '../types.js';
2
+ export interface ActoviqBrowserSettings extends CreateActoviqBrowserUseOptions {
3
+ /** When true, GUI/SDK hosts may auto-attach browser tools. */
4
+ enabled?: boolean;
5
+ }
6
+ export declare function readActoviqBrowserSettings(raw: Record<string, unknown> | null | undefined): ActoviqBrowserSettings;
7
+ export declare function writeActoviqBrowserSettings(raw: Record<string, unknown>, patch: Partial<ActoviqBrowserSettings>): Record<string, unknown>;
8
+ //# sourceMappingURL=browserSettings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browserSettings.d.ts","sourceRoot":"","sources":["../../../src/browser/browserSettings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAElE,MAAM,WAAW,sBAAuB,SAAQ,8BAA8B;IAC5E,8DAA8D;IAC9D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAMD,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,sBAAsB,CAsBlH;AAED,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,KAAK,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACrC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqBzB"}
@@ -0,0 +1,47 @@
1
+ function isRecord(value) {
2
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
3
+ }
4
+ export function readActoviqBrowserSettings(raw) {
5
+ const source = isRecord(raw?.browser) ? raw.browser : {};
6
+ const allowedDomains = Array.isArray(source.allowedDomains)
7
+ ? source.allowedDomains.filter((item) => typeof item === 'string' && item.trim().length > 0)
8
+ : undefined;
9
+ const channel = source.channel === 'chrome' || source.channel === 'msedge' || source.channel === 'chromium'
10
+ ? source.channel
11
+ : undefined;
12
+ return {
13
+ enabled: source.enabled === true,
14
+ headless: typeof source.headless === 'boolean' ? source.headless : undefined,
15
+ channel,
16
+ cdpUrl: typeof source.cdpUrl === 'string' ? source.cdpUrl : undefined,
17
+ userDataDir: typeof source.userDataDir === 'string' ? source.userDataDir : undefined,
18
+ allowedDomains,
19
+ defaultTimeoutMs: typeof source.defaultTimeoutMs === 'number' && Number.isFinite(source.defaultTimeoutMs)
20
+ ? Math.max(1_000, Math.min(180_000, Math.trunc(source.defaultTimeoutMs)))
21
+ : undefined,
22
+ allowEvaluate: source.allowEvaluate === true,
23
+ };
24
+ }
25
+ export function writeActoviqBrowserSettings(raw, patch) {
26
+ const current = readActoviqBrowserSettings(raw);
27
+ const next = {
28
+ ...current,
29
+ ...patch,
30
+ };
31
+ raw.browser = {
32
+ enabled: next.enabled === true,
33
+ headless: next.headless !== false,
34
+ ...(next.channel ? { channel: next.channel } : {}),
35
+ ...(next.cdpUrl?.trim() ? { cdpUrl: next.cdpUrl.trim() } : {}),
36
+ ...(next.userDataDir?.trim() ? { userDataDir: next.userDataDir.trim() } : {}),
37
+ ...(next.allowedDomains && next.allowedDomains.length > 0
38
+ ? { allowedDomains: next.allowedDomains }
39
+ : {}),
40
+ ...(typeof next.defaultTimeoutMs === 'number'
41
+ ? { defaultTimeoutMs: next.defaultTimeoutMs }
42
+ : {}),
43
+ allowEvaluate: next.allowEvaluate === true,
44
+ };
45
+ return raw;
46
+ }
47
+ //# sourceMappingURL=browserSettings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browserSettings.js","sourceRoot":"","sources":["../../../src/browser/browserSettings.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@
6
6
  * and real-time streaming output. Uses the main terminal buffer for
7
7
  * native scrollback.
8
8
  */
9
- import { createAgentSdk, loadJsonConfigFile, loadDefaultActoviqSettings, getLoadedJsonConfig, createActoviqCoreTools, listWorkflows, loadWorkflow, listTeamDefinitions, loadTeamDefinition, cloneTeamDefinition, instantiateTeamDefinition, listTeamAgentLabels, countTeamAgents, createModelTeam, createTeamTool, readTeamPreferences, createManagerTools, buildManagerSystemPrompt, buildUpdateProgressPrompt, formatManagerUpdatePreview, resolveGitHubDigestForUpdate, readManagerConfig, writeManagerConfig, readProjectPlanFile, readProgressFile, managerProgressPath, createProjectIssue, executeProjectIssue, isIssueStatus, isIssueStorageMode, listProjectIssues, listScheduledAutomationTasks, resolveActoviqHome, transitionProjectIssue, WorktreeService, } from 'actoviq-agent-sdk';
9
+ import { createAgentSdk, loadJsonConfigFile, loadDefaultActoviqSettings, getLoadedJsonConfig, createActoviqCoreTools, createManagedPluginRuntime, resolveActoviqSettingsStore, listWorkflows, loadWorkflow, listTeamDefinitions, loadTeamDefinition, cloneTeamDefinition, instantiateTeamDefinition, listTeamAgentLabels, countTeamAgents, createModelTeam, createTeamTool, readTeamPreferences, createManagerTools, buildManagerSystemPrompt, buildUpdateProgressPrompt, formatManagerUpdatePreview, resolveGitHubDigestForUpdate, readManagerConfig, writeManagerConfig, readProjectPlanFile, readProgressFile, managerProgressPath, createProjectIssue, executeProjectIssue, isIssueStatus, isIssueStorageMode, listProjectIssues, listScheduledAutomationTasks, resolveActoviqHome, externalSkillPreferencesToRuntimeOptions, readActoviqExternalSkillPreferences, transitionProjectIssue, WorktreeService, } from 'actoviq-agent-sdk';
10
10
  import { readProjectMeta } from '../gui/projectMeta.js';
11
11
  import { LegacySurfaceEventPipeline, } from '../surfaces/index.js';
12
12
  import { applyTeamRunEvent, createTeamRunViewState, formatTeamRunTreeLines } from '../team/teamRunView.js';
@@ -21,6 +21,8 @@ if (hasVersionFlag(process.argv.slice(2))) {
21
21
  const WORK_DIR = path.resolve(process.argv[2] ?? process.cwd());
22
22
  const CONFIG_PATH = process.argv[3] ?? path.join(resolveActoviqHome(), 'settings.json');
23
23
  const DEFAULT_PERMISSION_MODE = 'bypassPermissions';
24
+ const MANAGED_PLUGIN_FINAL_CLOSE_ATTEMPTS = 2;
25
+ const MANAGED_PLUGIN_FINAL_CLOSE_TIMEOUT_MS = 35_000;
24
26
  const PERMISSION_MODES = new Set([
25
27
  'default',
26
28
  'acceptEdits',
@@ -114,12 +116,42 @@ function resultLine(isErr, dur, output) {
114
116
  process.stdout.write(`${ok}${C.r}${C.d}${d} ${o}${C.r}\n`);
115
117
  }
116
118
  // ═══════════════════════════════════════════════════════════════════════
119
+ function errorMessage(error) {
120
+ return error instanceof Error ? error.message : String(error);
121
+ }
122
+ async function closeManagedPluginsForExit(close) {
123
+ const failures = [];
124
+ for (let attempt = 1; attempt <= MANAGED_PLUGIN_FINAL_CLOSE_ATTEMPTS; attempt += 1) {
125
+ let timer;
126
+ try {
127
+ await Promise.race([
128
+ close(),
129
+ new Promise((_, reject) => {
130
+ timer = setTimeout(() => {
131
+ reject(new Error(`managed plugin cleanup timed out after ${MANAGED_PLUGIN_FINAL_CLOSE_TIMEOUT_MS}ms`));
132
+ }, MANAGED_PLUGIN_FINAL_CLOSE_TIMEOUT_MS);
133
+ }),
134
+ ]);
135
+ return;
136
+ }
137
+ catch (error) {
138
+ failures.push(error);
139
+ process.stderr.write(`[actoviq-react] warning: managed plugin cleanup attempt ${attempt}/` +
140
+ `${MANAGED_PLUGIN_FINAL_CLOSE_ATTEMPTS} failed: ${errorMessage(error)}\n`);
141
+ }
142
+ finally {
143
+ if (timer)
144
+ clearTimeout(timer);
145
+ }
146
+ }
147
+ throw new AggregateError(failures, 'Managed plugin cleanup failed after bounded retries; an external sandbox may remain active and billing may continue.');
148
+ }
117
149
  async function main() {
118
150
  // Header
119
151
  const w = process.stdout.columns || 80;
120
152
  process.stdout.write(`\n${C.c}${C.b}╭${'─'.repeat(Math.min(w - 2, 60))}╮${C.r}\n`);
121
153
  process.stdout.write(`${C.c}│${C.r} dir : ${C.y}${WORK_DIR.slice(0, 45)}${C.r}\n`);
122
- const tools = createActoviqCoreTools({ cwd: WORK_DIR });
154
+ const coreTools = createActoviqCoreTools({ cwd: WORK_DIR });
123
155
  const userSuppliedConfig = Boolean(process.argv[3]);
124
156
  try {
125
157
  if (userSuppliedConfig)
@@ -144,16 +176,65 @@ async function main() {
144
176
  process.stderr.write(`${C.y}⚠ Default settings load failed: ${msg}${C.r}\n`);
145
177
  }
146
178
  }
179
+ const managedPluginRuntime = await resolveActoviqSettingsStore({
180
+ configPath: CONFIG_PATH,
181
+ }).then(store => createManagedPluginRuntime(store.raw, {
182
+ cwd: WORK_DIR,
183
+ })).catch(() => ({
184
+ tools: [],
185
+ enabledPluginIds: [],
186
+ close: async () => undefined,
187
+ }));
188
+ const tools = [...new Map([...coreTools, ...managedPluginRuntime.tools].map(tool => [tool.name, tool])).values()];
189
+ const externalSkillPreferences = await readActoviqExternalSkillPreferences({
190
+ actoviqHomeDir: resolveActoviqHome(),
191
+ workDir: WORK_DIR,
192
+ });
193
+ let pendingToolApproval = null;
194
+ const approver = async (context) => {
195
+ if (!process.stdin.isTTY) {
196
+ return {
197
+ behavior: 'deny',
198
+ reason: 'Interactive approval requires a TTY.',
199
+ };
200
+ }
201
+ if (pendingToolApproval) {
202
+ return {
203
+ behavior: 'deny',
204
+ reason: 'Another tool approval is already pending.',
205
+ };
206
+ }
207
+ let input = '';
208
+ try {
209
+ input = JSON.stringify(context.input);
210
+ }
211
+ catch {
212
+ input = '[unserializable input]';
213
+ }
214
+ process.stdout.write(`\n${C.y}Approval required:${C.r} ${C.b}${context.publicName}${C.r}\n` +
215
+ `${C.d}${context.reason}${input ? `\n${input.slice(0, 500)}` : ''}${C.r}\n` +
216
+ 'Allow this tool once? [y/N] ');
217
+ return await new Promise(resolve => {
218
+ pendingToolApproval = { resolve };
219
+ });
220
+ };
147
221
  const sdk = await createAgentSdk({
148
222
  workDir: WORK_DIR,
149
223
  tools,
150
224
  permissionMode: DEFAULT_PERMISSION_MODE,
225
+ approver,
226
+ externalSkills: externalSkillPreferencesToRuntimeOptions(externalSkillPreferences),
151
227
  });
152
228
  const toolMetadata = await sdk.listToolMetadata();
153
229
  let session = await sdk.createSession({
154
230
  title: path.basename(WORK_DIR),
155
231
  permissionMode: DEFAULT_PERMISSION_MODE,
156
232
  });
233
+ await session.setPermissionContext({
234
+ mode: session.permissionContext.mode ?? DEFAULT_PERMISSION_MODE,
235
+ permissions: session.permissionContext.permissions,
236
+ approver,
237
+ });
157
238
  process.stdout.write(`${C.c}│${C.r} model : ${C.y}${session.model}${C.r}\n`);
158
239
  process.stdout.write(`${C.c}│${C.r} tools : ${C.y}${toolMetadata.length} tools loaded${C.r}\n`);
159
240
  process.stdout.write(`${C.c}│${C.r} keys : Tab=complete ↑↓=history Ctrl+C=abort${C.r}\n`);
@@ -199,6 +280,11 @@ async function main() {
199
280
  const existing = managers[0];
200
281
  if (existing) {
201
282
  managerSession = await sdk.resumeSession(existing.id, { permissionMode: DEFAULT_PERMISSION_MODE });
283
+ await managerSession.setPermissionContext({
284
+ mode: managerSession.permissionContext.mode ?? DEFAULT_PERMISSION_MODE,
285
+ permissions: managerSession.permissionContext.permissions,
286
+ approver,
287
+ });
202
288
  return managerSession;
203
289
  }
204
290
  managerSession = await sdk.createSession({
@@ -206,6 +292,11 @@ async function main() {
206
292
  metadata: { __actoviqKind: 'manager' },
207
293
  permissionMode: DEFAULT_PERMISSION_MODE,
208
294
  });
295
+ await managerSession.setPermissionContext({
296
+ mode: managerSession.permissionContext.mode ?? DEFAULT_PERMISSION_MODE,
297
+ permissions: managerSession.permissionContext.permissions,
298
+ approver,
299
+ });
209
300
  return managerSession;
210
301
  }
211
302
  // ── Process message ────────────────────────────────────────────
@@ -255,6 +346,7 @@ async function main() {
255
346
  await session.setPermissionContext({
256
347
  mode: requested,
257
348
  permissions: state.permissions,
349
+ approver,
258
350
  });
259
351
  process.stdout.write(`${C.g}Permission mode set to ${C.y}${requested}${C.r}\n\n`);
260
352
  return;
@@ -285,6 +377,11 @@ async function main() {
285
377
  return;
286
378
  }
287
379
  session = await sdk.resumeSession(sessionId);
380
+ await session.setPermissionContext({
381
+ mode: session.permissionContext.mode ?? DEFAULT_PERMISSION_MODE,
382
+ permissions: session.permissionContext.permissions,
383
+ approver,
384
+ });
288
385
  process.stdout.write(`${C.g}Resumed ${session.id}: ${session.title} (${session.model})${C.r}\n\n`);
289
386
  return;
290
387
  }
@@ -766,6 +863,7 @@ async function main() {
766
863
  systemPrompt: buildManagerSystemPrompt(WORK_DIR, cfg),
767
864
  tools: managerTools,
768
865
  signal: abortCtrl.signal,
866
+ approver,
769
867
  ...(cfg.model ? { model: cfg.model } : {}),
770
868
  __actoviqUseDefaultTools: false,
771
869
  __actoviqAllowedTools: managerTools.map(tool => tool.name),
@@ -817,6 +915,7 @@ async function main() {
817
915
  signal: abortCtrl.signal,
818
916
  model: session.model,
819
917
  permissionMode: session.permissionContext.mode ?? DEFAULT_PERMISSION_MODE,
918
+ approver,
820
919
  // Attached team is only exposed to the main agent when autoInvoke is on;
821
920
  // otherwise attach is a selection and /team ask stays the manual path.
822
921
  ...(activeTeamTool && teamPrefs.autoInvoke ? { tools: [activeTeamTool] } : {}),
@@ -904,8 +1003,17 @@ async function main() {
904
1003
  if (shuttingDown)
905
1004
  return;
906
1005
  shuttingDown = true;
1006
+ let exitCode = code;
907
1007
  if (ccT)
908
1008
  clearTimeout(ccT);
1009
+ if (pendingToolApproval) {
1010
+ const approval = pendingToolApproval;
1011
+ pendingToolApproval = null;
1012
+ approval.resolve({
1013
+ behavior: 'deny',
1014
+ reason: 'The interactive session is shutting down.',
1015
+ });
1016
+ }
909
1017
  abortCtrl?.abort();
910
1018
  if (process.stdin.isTTY)
911
1019
  process.stdin.setRawMode(false);
@@ -913,17 +1021,36 @@ async function main() {
913
1021
  if (closeReadline)
914
1022
  rl.close();
915
1023
  process.stdout.write(`\n${C.d}Goodbye.${C.r}\n`);
1024
+ try {
1025
+ await closeManagedPluginsForExit(managedPluginRuntime.close);
1026
+ }
1027
+ catch (error) {
1028
+ exitCode = 1;
1029
+ process.stderr.write(`[actoviq-react] ERROR: ${errorMessage(error)} ` +
1030
+ 'Check E2B/Playwright resources manually before assuming billing has stopped.\n');
1031
+ }
916
1032
  try {
917
1033
  await sdk.close();
918
1034
  }
919
- catch { }
920
- process.exit(code);
1035
+ catch (error) {
1036
+ exitCode = 1;
1037
+ process.stderr.write(`[actoviq-react] ERROR: SDK cleanup failed: ${errorMessage(error)}\n`);
1038
+ }
1039
+ process.exit(exitCode);
921
1040
  }
922
1041
  readline.emitKeypressEvents(process.stdin);
923
1042
  if (process.stdin.isTTY)
924
1043
  process.stdin.setRawMode(true);
925
1044
  process.stdin.on('keypress', (_ch, key) => {
926
1045
  if (key?.name === 'c' && key?.ctrl) {
1046
+ if (pendingToolApproval) {
1047
+ const approval = pendingToolApproval;
1048
+ pendingToolApproval = null;
1049
+ approval.resolve({
1050
+ behavior: 'deny',
1051
+ reason: 'The user interrupted the approval prompt.',
1052
+ });
1053
+ }
927
1054
  cc++;
928
1055
  if (cc >= 2) {
929
1056
  void shutdown(0);
@@ -945,6 +1072,19 @@ async function main() {
945
1072
  rl.prompt();
946
1073
  rl.on('line', async (line) => {
947
1074
  const queued = line.trim();
1075
+ if (pendingToolApproval) {
1076
+ const approval = pendingToolApproval;
1077
+ pendingToolApproval = null;
1078
+ const allowed = /^(?:y|yes)$/i.test(queued);
1079
+ approval.resolve({
1080
+ behavior: allowed ? 'allow' : 'deny',
1081
+ reason: allowed
1082
+ ? 'The user approved this tool once.'
1083
+ : 'The user denied this tool.',
1084
+ });
1085
+ process.stdout.write(`${allowed ? `${C.g}Allowed` : `${C.y}Denied`}.${C.r}\n`);
1086
+ return;
1087
+ }
948
1088
  if (abortCtrl) {
949
1089
  if (!queued) {
950
1090
  rl.prompt();