@ashx-j/lunr-dev 0.2.16-dev.9.1 → 0.2.21-dev.12.1

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 (430) hide show
  1. package/CHANGELOG.md +67 -1
  2. package/README.md +7 -1
  3. package/dist/builtin-extensions/ashxj-thinking.d.ts +1 -0
  4. package/dist/builtin-extensions/ashxj-thinking.d.ts.map +1 -1
  5. package/dist/builtin-extensions/ashxj-thinking.js +44 -19
  6. package/dist/builtin-extensions/ashxj-thinking.js.map +1 -1
  7. package/dist/builtin-extensions/index.d.ts.map +1 -1
  8. package/dist/builtin-extensions/index.js +1 -2
  9. package/dist/builtin-extensions/index.js.map +1 -1
  10. package/dist/builtin-extensions/lunr-computer-use.d.ts +3 -0
  11. package/dist/builtin-extensions/lunr-computer-use.d.ts.map +1 -0
  12. package/dist/builtin-extensions/lunr-computer-use.js +158 -0
  13. package/dist/builtin-extensions/lunr-computer-use.js.map +1 -0
  14. package/dist/builtin-extensions/lunr-todos.d.ts +6 -5
  15. package/dist/builtin-extensions/lunr-todos.d.ts.map +1 -1
  16. package/dist/builtin-extensions/lunr-todos.js +9 -7
  17. package/dist/builtin-extensions/lunr-todos.js.map +1 -1
  18. package/dist/builtin-extensions/pi-intercom/broker/spawn.d.ts +6 -4
  19. package/dist/builtin-extensions/pi-intercom/broker/spawn.d.ts.map +1 -1
  20. package/dist/builtin-extensions/pi-intercom/broker/spawn.js +114 -61
  21. package/dist/builtin-extensions/pi-intercom/broker/spawn.js.map +1 -1
  22. package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
  23. package/dist/builtin-extensions/pi-intercom/index.js +360 -351
  24. package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
  25. package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
  26. package/dist/builtin-extensions/pi-lsp-extension/src/index.js +10 -3
  27. package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
  28. package/dist/builtin-extensions/pi-lsp-extension/src/runtime.d.ts +5 -1
  29. package/dist/builtin-extensions/pi-lsp-extension/src/runtime.d.ts.map +1 -1
  30. package/dist/builtin-extensions/pi-lsp-extension/src/runtime.js +26 -4
  31. package/dist/builtin-extensions/pi-lsp-extension/src/runtime.js.map +1 -1
  32. package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
  33. package/dist/builtin-extensions/pi-mcp-adapter/index.js +37 -27
  34. package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
  35. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts +6 -1
  36. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts.map +1 -1
  37. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js +33 -8
  38. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js.map +1 -1
  39. package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.d.ts.map +1 -1
  40. package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js +2 -2
  41. package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js.map +1 -1
  42. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +8 -6
  43. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  44. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +179 -79
  45. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  46. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts +18 -8
  47. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
  48. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +44 -15
  49. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
  50. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +4 -3
  51. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
  52. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +24 -14
  53. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
  54. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts +8 -1
  55. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts.map +1 -1
  56. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js +247 -18
  57. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js.map +1 -1
  58. package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.d.ts +1 -0
  59. package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.d.ts.map +1 -1
  60. package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.js +1 -1
  61. package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.js.map +1 -1
  62. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.d.ts +29 -0
  63. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.d.ts.map +1 -0
  64. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.js +179 -0
  65. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.js.map +1 -0
  66. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.d.ts +89 -0
  67. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.d.ts.map +1 -0
  68. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.js +541 -0
  69. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.js.map +1 -0
  70. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts +11 -1
  71. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
  72. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js +38 -12
  73. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
  74. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.d.ts.map +1 -1
  75. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.js +3 -2
  76. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.js.map +1 -1
  77. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts +2 -1
  78. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts.map +1 -1
  79. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js +35 -8
  80. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js.map +1 -1
  81. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +7 -3
  82. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
  83. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +26 -4
  84. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
  85. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts +1 -0
  86. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
  87. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js +55 -38
  88. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js.map +1 -1
  89. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts +100 -0
  90. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  91. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +46 -31
  92. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  93. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.d.ts +3 -6
  94. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.d.ts.map +1 -1
  95. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.js +64 -5
  96. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.js.map +1 -1
  97. package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.d.ts +15 -2
  98. package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.d.ts.map +1 -1
  99. package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.js +14 -4
  100. package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.js.map +1 -1
  101. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts +1 -1
  102. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts.map +1 -1
  103. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js +7 -3
  104. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js.map +1 -1
  105. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
  106. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +21 -8
  107. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
  108. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  109. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +1 -1
  110. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  111. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.d.ts +10 -0
  112. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.d.ts.map +1 -0
  113. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.js +38 -0
  114. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.js.map +1 -0
  115. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts +0 -1
  116. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  117. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +74 -41
  118. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  119. package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.d.ts +2 -0
  120. package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.d.ts.map +1 -1
  121. package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.js +75 -18
  122. package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.js.map +1 -1
  123. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts +1 -1
  124. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts.map +1 -1
  125. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js +2 -0
  126. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js.map +1 -1
  127. package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.d.ts +1 -1
  128. package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.d.ts.map +1 -1
  129. package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.js +1 -1
  130. package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.js.map +1 -1
  131. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +13 -1
  132. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
  133. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +67 -11
  134. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
  135. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +1 -0
  136. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  137. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  138. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts +3 -0
  139. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts.map +1 -1
  140. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js +7 -2
  141. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js.map +1 -1
  142. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -1
  143. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js +13 -3
  144. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js.map +1 -1
  145. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts +2 -2
  146. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts.map +1 -1
  147. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js +5 -10
  148. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js.map +1 -1
  149. package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.d.ts +2 -0
  150. package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.d.ts.map +1 -0
  151. package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.js +3 -0
  152. package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.js.map +1 -0
  153. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts +3 -0
  154. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts.map +1 -1
  155. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js +68 -11
  156. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js.map +1 -1
  157. package/dist/builtin-extensions/pi-subagents/src/shared/formatters.d.ts +12 -1
  158. package/dist/builtin-extensions/pi-subagents/src/shared/formatters.d.ts.map +1 -1
  159. package/dist/builtin-extensions/pi-subagents/src/shared/formatters.js +21 -2
  160. package/dist/builtin-extensions/pi-subagents/src/shared/formatters.js.map +1 -1
  161. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +21 -4
  162. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
  163. package/dist/builtin-extensions/pi-subagents/src/shared/types.js +1 -1
  164. package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
  165. package/dist/builtin-extensions/pi-subagents/src/slash/delegation-adapters.d.ts.map +1 -1
  166. package/dist/builtin-extensions/pi-subagents/src/slash/delegation-adapters.js.map +1 -1
  167. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts +7 -0
  168. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
  169. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +11 -7
  170. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
  171. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts +6 -0
  172. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
  173. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +46 -29
  174. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
  175. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +47 -4
  176. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  177. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +428 -431
  178. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  179. package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.d.ts.map +1 -1
  180. package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.js +1 -1
  181. package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.js.map +1 -1
  182. package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.d.ts +2 -13
  183. package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.d.ts.map +1 -1
  184. package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.js +5 -91
  185. package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.js.map +1 -1
  186. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  187. package/dist/builtin-extensions/pi-web-access/index.js +103 -102
  188. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  189. package/dist/core/agent-session-services.d.ts.map +1 -1
  190. package/dist/core/agent-session-services.js +1 -1
  191. package/dist/core/agent-session-services.js.map +1 -1
  192. package/dist/core/computer-use/adapter.d.ts +23 -0
  193. package/dist/core/computer-use/adapter.d.ts.map +1 -0
  194. package/dist/core/computer-use/adapter.js +116 -0
  195. package/dist/core/computer-use/adapter.js.map +1 -0
  196. package/dist/core/computer-use/image.d.ts +26 -0
  197. package/dist/core/computer-use/image.d.ts.map +1 -0
  198. package/dist/core/computer-use/image.js +64 -0
  199. package/dist/core/computer-use/image.js.map +1 -0
  200. package/dist/core/computer-use/lease.d.ts +18 -0
  201. package/dist/core/computer-use/lease.d.ts.map +1 -0
  202. package/dist/core/computer-use/lease.js +129 -0
  203. package/dist/core/computer-use/lease.js.map +1 -0
  204. package/dist/core/computer-use/macos-runtime.d.ts +14 -0
  205. package/dist/core/computer-use/macos-runtime.d.ts.map +1 -0
  206. package/dist/core/computer-use/macos-runtime.js +148 -0
  207. package/dist/core/computer-use/macos-runtime.js.map +1 -0
  208. package/dist/core/computer-use/policy.d.ts +19 -0
  209. package/dist/core/computer-use/policy.d.ts.map +1 -0
  210. package/dist/core/computer-use/policy.js +62 -0
  211. package/dist/core/computer-use/policy.js.map +1 -0
  212. package/dist/core/computer-use/release.generated.d.ts +31 -0
  213. package/dist/core/computer-use/release.generated.d.ts.map +1 -0
  214. package/dist/core/computer-use/release.generated.js +36 -0
  215. package/dist/core/computer-use/release.generated.js.map +1 -0
  216. package/dist/core/computer-use/runtime.d.ts +13 -0
  217. package/dist/core/computer-use/runtime.d.ts.map +1 -0
  218. package/dist/core/computer-use/runtime.js +158 -0
  219. package/dist/core/computer-use/runtime.js.map +1 -0
  220. package/dist/core/computer-use/schemas.d.ts +91 -0
  221. package/dist/core/computer-use/schemas.d.ts.map +1 -0
  222. package/dist/core/computer-use/schemas.js +71 -0
  223. package/dist/core/computer-use/schemas.js.map +1 -0
  224. package/dist/core/computer-use/windows-desktop.d.ts +3 -0
  225. package/dist/core/computer-use/windows-desktop.d.ts.map +1 -0
  226. package/dist/core/computer-use/windows-desktop.js +48 -0
  227. package/dist/core/computer-use/windows-desktop.js.map +1 -0
  228. package/dist/core/computer-use/workflow.d.ts +32 -0
  229. package/dist/core/computer-use/workflow.d.ts.map +1 -0
  230. package/dist/core/computer-use/workflow.js +341 -0
  231. package/dist/core/computer-use/workflow.js.map +1 -0
  232. package/dist/core/customize.d.ts +2 -0
  233. package/dist/core/customize.d.ts.map +1 -1
  234. package/dist/core/customize.js +3 -0
  235. package/dist/core/customize.js.map +1 -1
  236. package/dist/core/keybindings.d.ts +2 -2
  237. package/dist/core/keybindings.d.ts.map +1 -1
  238. package/dist/core/keybindings.js +2 -2
  239. package/dist/core/keybindings.js.map +1 -1
  240. package/dist/core/model-runtime.d.ts +0 -3
  241. package/dist/core/model-runtime.d.ts.map +1 -1
  242. package/dist/core/model-runtime.js +1 -10
  243. package/dist/core/model-runtime.js.map +1 -1
  244. package/dist/core/package-manager.d.ts.map +1 -1
  245. package/dist/core/package-manager.js +1 -1
  246. package/dist/core/package-manager.js.map +1 -1
  247. package/dist/core/permissions.d.ts +2 -1
  248. package/dist/core/permissions.d.ts.map +1 -1
  249. package/dist/core/permissions.js +31 -11
  250. package/dist/core/permissions.js.map +1 -1
  251. package/dist/core/plan-mode.d.ts.map +1 -1
  252. package/dist/core/plan-mode.js +9 -5
  253. package/dist/core/plan-mode.js.map +1 -1
  254. package/dist/core/rollback.d.ts.map +1 -1
  255. package/dist/core/rollback.js +13 -90
  256. package/dist/core/rollback.js.map +1 -1
  257. package/dist/core/runtime-bridges.d.ts.map +1 -1
  258. package/dist/core/runtime-bridges.js +0 -2
  259. package/dist/core/runtime-bridges.js.map +1 -1
  260. package/dist/core/session-manager.d.ts +0 -1
  261. package/dist/core/session-manager.d.ts.map +1 -1
  262. package/dist/core/session-manager.js +21 -79
  263. package/dist/core/session-manager.js.map +1 -1
  264. package/dist/core/settings-manager.d.ts +10 -0
  265. package/dist/core/settings-manager.d.ts.map +1 -1
  266. package/dist/core/settings-manager.js +30 -0
  267. package/dist/core/settings-manager.js.map +1 -1
  268. package/dist/core/subagent-cancellation.d.ts +21 -0
  269. package/dist/core/subagent-cancellation.d.ts.map +1 -0
  270. package/dist/core/subagent-cancellation.js +53 -0
  271. package/dist/core/subagent-cancellation.js.map +1 -0
  272. package/dist/core/subagent-spinner-setting.d.ts +6 -0
  273. package/dist/core/subagent-spinner-setting.d.ts.map +1 -0
  274. package/dist/core/subagent-spinner-setting.js +12 -0
  275. package/dist/core/subagent-spinner-setting.js.map +1 -0
  276. package/dist/core/subagent-spinner.d.ts +4 -0
  277. package/dist/core/subagent-spinner.d.ts.map +1 -0
  278. package/dist/core/subagent-spinner.js +6 -0
  279. package/dist/core/subagent-spinner.js.map +1 -0
  280. package/dist/dev-cli.js +0 -0
  281. package/dist/gateway/agent-bridge.d.ts +6 -1
  282. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  283. package/dist/gateway/agent-bridge.js +23 -6
  284. package/dist/gateway/agent-bridge.js.map +1 -1
  285. package/dist/gateway/cron.d.ts +1 -1
  286. package/dist/gateway/cron.d.ts.map +1 -1
  287. package/dist/gateway/cron.js +23 -7
  288. package/dist/gateway/cron.js.map +1 -1
  289. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  290. package/dist/modes/interactive/components/assistant-message.js +12 -18
  291. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  292. package/dist/modes/interactive/components/footer.d.ts +4 -2
  293. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  294. package/dist/modes/interactive/components/footer.js +23 -32
  295. package/dist/modes/interactive/components/footer.js.map +1 -1
  296. package/dist/modes/interactive/components/processes-selector.d.ts +2 -3
  297. package/dist/modes/interactive/components/processes-selector.d.ts.map +1 -1
  298. package/dist/modes/interactive/components/processes-selector.js +5 -10
  299. package/dist/modes/interactive/components/processes-selector.js.map +1 -1
  300. package/dist/modes/interactive/components/settings-selector.d.ts +8 -0
  301. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  302. package/dist/modes/interactive/components/settings-selector.js +93 -1
  303. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  304. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  305. package/dist/modes/interactive/components/tool-execution.js +12 -0
  306. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  307. package/dist/modes/interactive/extension-widget-order.d.ts +8 -0
  308. package/dist/modes/interactive/extension-widget-order.d.ts.map +1 -0
  309. package/dist/modes/interactive/extension-widget-order.js +37 -0
  310. package/dist/modes/interactive/extension-widget-order.js.map +1 -0
  311. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  312. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  313. package/dist/modes/interactive/interactive-mode.js +58 -26
  314. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  315. package/dist/modes/interactive/thinking-level-slash.d.ts +4 -0
  316. package/dist/modes/interactive/thinking-level-slash.d.ts.map +1 -0
  317. package/dist/modes/interactive/thinking-level-slash.js +23 -0
  318. package/dist/modes/interactive/thinking-level-slash.js.map +1 -0
  319. package/dist/node-runtime/adapter-AZMY335J.js +279 -0
  320. package/dist/node-runtime/{agent-session-services-IFJMSX7Z.js → agent-session-services-QANFGM2V.js} +15 -11
  321. package/dist/node-runtime/{builtin-extensions-LYZ3BFWQ.js → builtin-extensions-SRCYQPZ6.js} +5 -3
  322. package/dist/node-runtime/chunk-2IDTZAG5.js +1415 -0
  323. package/dist/node-runtime/chunk-3ONQTOMR.js +68 -0
  324. package/dist/node-runtime/{chunk-TQNSPERU.js → chunk-5SQDLSZJ.js} +1 -1
  325. package/dist/node-runtime/chunk-5ZH3ZFIZ.js +308 -0
  326. package/dist/node-runtime/{chunk-PBC2Y6GS.js → chunk-6UB6NKA3.js} +29 -72
  327. package/dist/node-runtime/{chunk-A2KQXUJD.js → chunk-7AFOFSDY.js} +1 -1
  328. package/dist/node-runtime/chunk-A3KMVBZV.js +60 -0
  329. package/dist/node-runtime/{chunk-N77MY65L.js → chunk-BJ6H7DPI.js} +25 -25
  330. package/dist/node-runtime/{chunk-PGAJ5MO5.js → chunk-BYQ2MOFI.js} +6 -6
  331. package/dist/node-runtime/{chunk-QH42CDX3.js → chunk-CZUBYPFP.js} +234 -124
  332. package/dist/node-runtime/{chunk-LZAW4ZX3.js → chunk-D466UAID.js} +34 -13
  333. package/dist/node-runtime/{chunk-ZKMFUD3Q.js → chunk-GT5F3OKM.js} +3 -3
  334. package/dist/node-runtime/chunk-H2BI7G7T.js +73 -0
  335. package/dist/node-runtime/{chunk-5P7PZMRU.js → chunk-HRS4HMDX.js} +1 -1
  336. package/dist/node-runtime/{chunk-IPA627GP.js → chunk-HXJS2PJM.js} +4 -4
  337. package/dist/node-runtime/chunk-JZHEUQRL.js +180 -0
  338. package/dist/node-runtime/chunk-LISUTZS3.js +19 -0
  339. package/dist/node-runtime/chunk-LOYUC2ID.js +2185 -0
  340. package/dist/node-runtime/{chunk-2QKLKMKC.js → chunk-LTXUQJI4.js} +1 -1
  341. package/dist/node-runtime/{chunk-YF63P5ZT.js → chunk-LTYWTR3V.js} +1 -426
  342. package/dist/node-runtime/{chunk-MKKH27PH.js → chunk-LWJXTA6Z.js} +274 -2416
  343. package/dist/node-runtime/chunk-MW2XJZIK.js +108 -0
  344. package/dist/node-runtime/{chunk-CDFZEWPU.js → chunk-N3PNL74S.js} +537 -262
  345. package/dist/node-runtime/{chunk-4TLO4PO2.js → chunk-U6C7VTR5.js} +7 -1401
  346. package/dist/node-runtime/chunk-URD2SLIT.js +1019 -0
  347. package/dist/node-runtime/{chunk-HQCKFM2O.js → chunk-VGYZ3APQ.js} +3 -0
  348. package/dist/node-runtime/{chunk-AJX357CL.js → chunk-VQ4UBWSA.js} +30 -1013
  349. package/dist/node-runtime/{chunk-F4VQFJI2.js → chunk-VTGEKB7R.js} +2 -2
  350. package/dist/node-runtime/{chunk-AD6VXAO7.js → chunk-VTPM5V35.js} +5 -100
  351. package/dist/node-runtime/chunk-W3SILANP.js +24 -0
  352. package/dist/node-runtime/{chunk-WOVTOV5P.js → chunk-XAUQOKYK.js} +421 -63
  353. package/dist/node-runtime/{chunk-ECD5L7YI.js → chunk-XSRCAQK2.js} +390 -16
  354. package/dist/node-runtime/{chunk-PCGNAY2O.js → chunk-ZOIIMEN6.js} +54 -433
  355. package/dist/node-runtime/{chunk-EDBJNRSM.js → chunk-ZVSORYRM.js} +1 -1
  356. package/dist/node-runtime/cli-runtime.js +1 -1
  357. package/dist/node-runtime/{command-L3LAHDIH.js → command-ZURZJDXF.js} +1 -1
  358. package/dist/node-runtime/{commands-RL5YBW5I.js → commands-BZGSLIP7.js} +4 -2
  359. package/dist/node-runtime/{customize-XEXL2DGQ.js → customize-LF5VST47.js} +1 -1
  360. package/dist/node-runtime/{direct-tool-executor-JVDXTO7A.js → direct-tool-executor-BSZDHIYR.js} +7 -4
  361. package/dist/node-runtime/{export-html-KR26FOUZ.js → export-html-E4DT6ZJQ.js} +1 -1
  362. package/dist/node-runtime/{gateway-X2TI5X7F.js → gateway-FWHRIBK5.js} +24 -369
  363. package/dist/node-runtime/index.js +49 -42
  364. package/dist/node-runtime/{init-NJV2T55N.js → init-DVJUAOUO.js} +4 -2
  365. package/dist/node-runtime/{interactive-mode-KOM35YF2.js → interactive-mode-BBASNWHN.js} +23 -17
  366. package/dist/node-runtime/{interactive-view-U6OILKF3.js → interactive-view-N6F4KUIT.js} +3 -5
  367. package/dist/node-runtime/lunr-computer-use-TJNDAMWM.js +135 -0
  368. package/dist/node-runtime/{lunr-cron-YJ5UHYRD.js → lunr-cron-J64I72C6.js} +7 -1
  369. package/dist/node-runtime/main.js +25 -20
  370. package/dist/node-runtime/{mcp-auth-flow-QIXHW6QN.js → mcp-auth-flow-YL6RWPYG.js} +2 -1
  371. package/dist/node-runtime/{package-manager-cli-TZZHJCVI.js → package-manager-cli-VMYX4Y2S.js} +10 -7
  372. package/dist/node-runtime/{pi-intercom-EEMBGQID.js → pi-intercom-NV2LW6X7.js} +108 -87
  373. package/dist/node-runtime/{pi-mcp-adapter-QFB37AVN.js → pi-mcp-adapter-JLB5YL2F.js} +31 -25
  374. package/dist/node-runtime/{pi-subagents-7XJ4H53P.js → pi-subagents-WEHV3W7H.js} +1321 -631
  375. package/dist/node-runtime/{pi-web-access-DPGAVKOA.js → pi-web-access-FN5YC5T6.js} +67 -64
  376. package/dist/node-runtime/{proxy-modes-HEEFK4KC.js → proxy-modes-OR7ISBXK.js} +7 -4
  377. package/dist/node-runtime/rpc-entry.js +25 -20
  378. package/dist/node-runtime/runtime-3SB5ATHQ.js +21 -0
  379. package/dist/node-runtime/{runtime-bridges-PPHNBFWL.js → runtime-bridges-2VQTLPOZ.js} +3 -5
  380. package/dist/node-runtime/{session-manager-MQNBYACL.js → session-manager-QEMZBMTM.js} +3 -5
  381. package/dist/node-runtime/{session-selector-5AZLJS6U.js → session-selector-URVJLOTK.js} +2 -2
  382. package/dist/node-runtime/{settings-manager-5LF2VQWC.js → settings-manager-3CCU326G.js} +4 -1
  383. package/dist/node-runtime/{src-Y7JSCK64.js → src-BPQFJR76.js} +27 -7
  384. package/dist/node-runtime/{subagent-executor-5RNDEPIJ.js → subagent-executor-CXKXQDHH.js} +189 -284
  385. package/dist/node-runtime/{update-cli-A253SZ7P.js → update-cli-NM7B4CKL.js} +4 -1
  386. package/dist/node-runtime/workflow-C26QCUTW.js +468 -0
  387. package/dist/rpc.d.ts +3 -0
  388. package/dist/rpc.d.ts.map +1 -0
  389. package/dist/rpc.js +18 -0
  390. package/dist/rpc.js.map +1 -0
  391. package/dist/startup/interactive-view.d.ts.map +1 -1
  392. package/dist/startup/interactive-view.js +1 -2
  393. package/dist/startup/interactive-view.js.map +1 -1
  394. package/docs/computer-use.md +242 -0
  395. package/docs/development.md +0 -32
  396. package/docs/features.md +24 -6
  397. package/docs/interactive-startup.md +10 -3
  398. package/docs/keybindings.md +5 -3
  399. package/docs/settings.md +3 -2
  400. package/docs/terminal-setup.md +1 -1
  401. package/docs/usage.md +1 -1
  402. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  403. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  404. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  405. package/examples/extensions/gondolin/package-lock.json +2 -2
  406. package/examples/extensions/gondolin/package.json +1 -1
  407. package/examples/extensions/hidden-thinking-label.ts +1 -1
  408. package/examples/extensions/sandbox/package-lock.json +2 -2
  409. package/examples/extensions/sandbox/package.json +1 -1
  410. package/examples/extensions/with-deps/package-lock.json +2 -2
  411. package/examples/extensions/with-deps/package.json +1 -1
  412. package/install-lock/package-lock.json +3827 -0
  413. package/install-lock/package.json +18 -0
  414. package/native/computer-use/LICENSE.md +21 -0
  415. package/npm-shrinkwrap.json +3808 -0
  416. package/package.json +16 -10
  417. package/dist/builtin-extensions/lunr-settings-tools.d.ts +0 -4
  418. package/dist/builtin-extensions/lunr-settings-tools.d.ts.map +0 -1
  419. package/dist/builtin-extensions/lunr-settings-tools.js +0 -120
  420. package/dist/builtin-extensions/lunr-settings-tools.js.map +0 -1
  421. package/dist/core/settings-tools-bridge.d.ts +0 -35
  422. package/dist/core/settings-tools-bridge.d.ts.map +0 -1
  423. package/dist/core/settings-tools-bridge.js +0 -56
  424. package/dist/core/settings-tools-bridge.js.map +0 -1
  425. package/dist/node-runtime/chunk-AHSTJBIB.js +0 -64
  426. package/dist/startup/interactive-shell.d.ts +0 -55
  427. package/dist/startup/interactive-shell.d.ts.map +0 -1
  428. package/dist/startup/interactive-shell.js +0 -264
  429. package/dist/startup/interactive-shell.js.map +0 -1
  430. package/dist/node-runtime/{chunk-YSKSB3BJ.js → chunk-CH6OL6P2.js} +2 -2
@@ -0,0 +1,91 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ export declare const computerSchemas: {
3
+ computer_load: Type.TObject<{}>;
4
+ computer_apps: Type.TObject<{
5
+ pid: Type.TOptional<Type.TInteger>;
6
+ offset: Type.TOptional<Type.TInteger>;
7
+ }>;
8
+ computer_observe: Type.TObject<{
9
+ pid: Type.TOptional<Type.TInteger>;
10
+ window_id: Type.TOptional<Type.TInteger>;
11
+ desktop: Type.TOptional<Type.TBoolean>;
12
+ observation: Type.TOptional<Type.TString>;
13
+ crop: Type.TOptional<Type.TObject<{
14
+ x: Type.TNumber;
15
+ y: Type.TNumber;
16
+ width: Type.TNumber;
17
+ height: Type.TNumber;
18
+ }>>;
19
+ }>;
20
+ computer_click: Type.TObject<{
21
+ pid: Type.TOptional<Type.TInteger>;
22
+ window_id: Type.TOptional<Type.TInteger>;
23
+ desktop: Type.TOptional<Type.TBoolean>;
24
+ observation: Type.TString;
25
+ foreground: Type.TOptional<Type.TBoolean>;
26
+ x: Type.TNumber;
27
+ y: Type.TNumber;
28
+ button: Type.TOptional<Type.TUnion<[Type.TLiteral<"left">, Type.TLiteral<"right">]>>;
29
+ count: Type.TOptional<Type.TInteger>;
30
+ modifier: Type.TOptional<Type.TArray<Type.TString>>;
31
+ }>;
32
+ computer_drag: Type.TObject<{
33
+ pid: Type.TOptional<Type.TInteger>;
34
+ window_id: Type.TOptional<Type.TInteger>;
35
+ desktop: Type.TOptional<Type.TBoolean>;
36
+ observation: Type.TString;
37
+ foreground: Type.TOptional<Type.TBoolean>;
38
+ from_x: Type.TNumber;
39
+ from_y: Type.TNumber;
40
+ to_x: Type.TNumber;
41
+ to_y: Type.TNumber;
42
+ }>;
43
+ computer_key: Type.TObject<{
44
+ pid: Type.TOptional<Type.TInteger>;
45
+ window_id: Type.TOptional<Type.TInteger>;
46
+ desktop: Type.TOptional<Type.TBoolean>;
47
+ observation: Type.TString;
48
+ foreground: Type.TOptional<Type.TBoolean>;
49
+ x: Type.TOptional<Type.TNumber>;
50
+ y: Type.TOptional<Type.TNumber>;
51
+ key: Type.TOptional<Type.TString>;
52
+ keys: Type.TOptional<Type.TArray<Type.TString>>;
53
+ }>;
54
+ computer_text: Type.TObject<{
55
+ pid: Type.TOptional<Type.TInteger>;
56
+ window_id: Type.TOptional<Type.TInteger>;
57
+ desktop: Type.TOptional<Type.TBoolean>;
58
+ observation: Type.TString;
59
+ foreground: Type.TOptional<Type.TBoolean>;
60
+ x: Type.TOptional<Type.TNumber>;
61
+ y: Type.TOptional<Type.TNumber>;
62
+ text: Type.TString;
63
+ }>;
64
+ computer_window: Type.TObject<{
65
+ pid: Type.TInteger;
66
+ window_id: Type.TInteger;
67
+ observation: Type.TString;
68
+ action: Type.TUnion<[Type.TLiteral<"frame">, Type.TLiteral<"focus">]>;
69
+ x: Type.TOptional<Type.TNumber>;
70
+ y: Type.TOptional<Type.TNumber>;
71
+ width: Type.TOptional<Type.TInteger>;
72
+ height: Type.TOptional<Type.TInteger>;
73
+ }>;
74
+ computer_launch: Type.TObject<{
75
+ name: Type.TString;
76
+ }>;
77
+ computer_scroll: Type.TObject<{
78
+ pid: Type.TOptional<Type.TInteger>;
79
+ window_id: Type.TOptional<Type.TInteger>;
80
+ desktop: Type.TOptional<Type.TBoolean>;
81
+ observation: Type.TString;
82
+ foreground: Type.TOptional<Type.TBoolean>;
83
+ x: Type.TNumber;
84
+ y: Type.TNumber;
85
+ direction: Type.TUnion<[Type.TLiteral<"up">, Type.TLiteral<"down">, Type.TLiteral<"left">, Type.TLiteral<"right">]>;
86
+ amount: Type.TInteger;
87
+ by: Type.TUnion<[Type.TLiteral<"line">, Type.TLiteral<"page">]>;
88
+ }>;
89
+ computer_end: Type.TObject<{}>;
90
+ };
91
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/core/computer-use/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAmBzC,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2E3B,CAAC","sourcesContent":["import { Type } from \"@sinclair/typebox\";\n\nconst target = {\n\tpid: Type.Integer({ minimum: 1 }),\n\twindow_id: Type.Integer({ minimum: 1 }),\n};\nconst observation = Type.String({\n\tdescription: \"Latest image token for this exact target. Single action, expires after 30 seconds.\",\n});\nconst grounded = {\n\tpid: Type.Optional(target.pid),\n\twindow_id: Type.Optional(target.window_id),\n\tdesktop: Type.Optional(Type.Boolean({ description: \"Primary desktop instead of a window; requires foreground=true.\" })),\n\tobservation,\n\tforeground: Type.Optional(Type.Boolean({ description: \"Window focus escalation after verified background failure. Settings may forbid it.\" })),\n};\nconst coordinate = Type.Number({ minimum: 0 });\nconst pixels = { x: coordinate, y: coordinate };\nconst optionalPixels = { x: Type.Optional(coordinate), y: Type.Optional(coordinate) };\nexport const computerSchemas = {\n\tcomputer_load: Type.Object({}, { additionalProperties: false }),\n\tcomputer_apps: Type.Object({\n\t\tpid: Type.Optional(target.pid),\n\t\toffset: Type.Optional(Type.Integer({ minimum: 0, maximum: Number.MAX_SAFE_INTEGER, description: \"Zero-based row offset, default 0. Pass the result's next_offset to retrieve the next 50 apps or windows.\" })),\n\t}, { additionalProperties: false }),\n\tcomputer_observe: Type.Object(\n\t\t{\n\t\t\tpid: Type.Optional(target.pid),\n\t\t\twindow_id: Type.Optional(target.window_id),\n\t\t\tdesktop: Type.Optional(Type.Boolean({ description: \"Capture the primary desktop instead of a window.\" })),\n\t\t\tobservation: Type.Optional(observation),\n\t\t\tcrop: Type.Optional(Type.Object({\n\t\t\t\tx: coordinate,\n\t\t\t\ty: coordinate,\n\t\t\t\twidth: Type.Number({ exclusiveMinimum: 0 }),\n\t\t\t\theight: Type.Number({ exclusiveMinimum: 0 }),\n\t\t\t}, { additionalProperties: false, description: \"Region in the latest returned image's pixels; requires its observation token. Captures fresh pixels. Omit for full target.\" })),\n\t\t},\n\t\t{ additionalProperties: false },\n\t),\n\tcomputer_click: Type.Object(\n\t\t{\n\t\t\t...grounded,\n\t\t\t...pixels,\n\t\t\tbutton: Type.Optional(Type.Union([Type.Literal(\"left\"), Type.Literal(\"right\")])),\n\t\t\tcount: Type.Optional(Type.Integer({ minimum: 1, maximum: 2 })),\n\t\t\tmodifier: Type.Optional(Type.Array(Type.String({ minLength: 1 }), { maxItems: 4 })),\n\t\t},\n\t\t{ additionalProperties: false },\n\t),\n\tcomputer_drag: Type.Object(\n\t\t{ ...grounded, from_x: coordinate, from_y: coordinate, to_x: coordinate, to_y: coordinate },\n\t\t{ additionalProperties: false },\n\t),\n\tcomputer_key: Type.Object(\n\t\t{\n\t\t\t...grounded,\n\t\t\t...optionalPixels,\n\t\t\tkey: Type.Optional(Type.String({ minLength: 1, maxLength: 100 })),\n\t\t\tkeys: Type.Optional(Type.Array(Type.String({ minLength: 1, maxLength: 100 }), { minItems: 2, maxItems: 5 })),\n\t\t},\n\t\t{ additionalProperties: false },\n\t),\n\tcomputer_text: Type.Object(\n\t\t{ ...grounded, ...optionalPixels, text: Type.String({ maxLength: 20000 }) },\n\t\t{ additionalProperties: false },\n\t),\n\tcomputer_window: Type.Object(\n\t\t{\n\t\t\t...target,\n\t\t\tobservation,\n\t\t\taction: Type.Union([Type.Literal(\"frame\"), Type.Literal(\"focus\")]),\n\t\t\tx: Type.Optional(Type.Number()),\n\t\t\ty: Type.Optional(Type.Number()),\n\t\t\twidth: Type.Optional(Type.Integer({ minimum: 1 })),\n\t\t\theight: Type.Optional(Type.Integer({ minimum: 1 })),\n\t\t},\n\t\t{ additionalProperties: false },\n\t),\n\tcomputer_launch: Type.Object(\n\t\t{ name: Type.String({ minLength: 1, maxLength: 500 }) },\n\t\t{ additionalProperties: false },\n\t),\n\tcomputer_scroll: Type.Object(\n\t\t{\n\t\t\t...grounded,\n\t\t\t...pixels,\n\t\t\tdirection: Type.Union([Type.Literal(\"up\"), Type.Literal(\"down\"), Type.Literal(\"left\"), Type.Literal(\"right\")]),\n\t\t\tamount: Type.Integer({ minimum: 1, maximum: 50 }),\n\t\t\tby: Type.Union([Type.Literal(\"line\"), Type.Literal(\"page\")]),\n\t\t},\n\t\t{ additionalProperties: false },\n\t),\n\tcomputer_end: Type.Object({}, { additionalProperties: false }),\n};\n"]}
@@ -0,0 +1,71 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ const target = {
3
+ pid: Type.Integer({ minimum: 1 }),
4
+ window_id: Type.Integer({ minimum: 1 }),
5
+ };
6
+ const observation = Type.String({
7
+ description: "Latest image token for this exact target. Single action, expires after 30 seconds.",
8
+ });
9
+ const grounded = {
10
+ pid: Type.Optional(target.pid),
11
+ window_id: Type.Optional(target.window_id),
12
+ desktop: Type.Optional(Type.Boolean({ description: "Primary desktop instead of a window; requires foreground=true." })),
13
+ observation,
14
+ foreground: Type.Optional(Type.Boolean({ description: "Window focus escalation after verified background failure. Settings may forbid it." })),
15
+ };
16
+ const coordinate = Type.Number({ minimum: 0 });
17
+ const pixels = { x: coordinate, y: coordinate };
18
+ const optionalPixels = { x: Type.Optional(coordinate), y: Type.Optional(coordinate) };
19
+ export const computerSchemas = {
20
+ computer_load: Type.Object({}, { additionalProperties: false }),
21
+ computer_apps: Type.Object({
22
+ pid: Type.Optional(target.pid),
23
+ offset: Type.Optional(Type.Integer({ minimum: 0, maximum: Number.MAX_SAFE_INTEGER, description: "Zero-based row offset, default 0. Pass the result's next_offset to retrieve the next 50 apps or windows." })),
24
+ }, { additionalProperties: false }),
25
+ computer_observe: Type.Object({
26
+ pid: Type.Optional(target.pid),
27
+ window_id: Type.Optional(target.window_id),
28
+ desktop: Type.Optional(Type.Boolean({ description: "Capture the primary desktop instead of a window." })),
29
+ observation: Type.Optional(observation),
30
+ crop: Type.Optional(Type.Object({
31
+ x: coordinate,
32
+ y: coordinate,
33
+ width: Type.Number({ exclusiveMinimum: 0 }),
34
+ height: Type.Number({ exclusiveMinimum: 0 }),
35
+ }, { additionalProperties: false, description: "Region in the latest returned image's pixels; requires its observation token. Captures fresh pixels. Omit for full target." })),
36
+ }, { additionalProperties: false }),
37
+ computer_click: Type.Object({
38
+ ...grounded,
39
+ ...pixels,
40
+ button: Type.Optional(Type.Union([Type.Literal("left"), Type.Literal("right")])),
41
+ count: Type.Optional(Type.Integer({ minimum: 1, maximum: 2 })),
42
+ modifier: Type.Optional(Type.Array(Type.String({ minLength: 1 }), { maxItems: 4 })),
43
+ }, { additionalProperties: false }),
44
+ computer_drag: Type.Object({ ...grounded, from_x: coordinate, from_y: coordinate, to_x: coordinate, to_y: coordinate }, { additionalProperties: false }),
45
+ computer_key: Type.Object({
46
+ ...grounded,
47
+ ...optionalPixels,
48
+ key: Type.Optional(Type.String({ minLength: 1, maxLength: 100 })),
49
+ keys: Type.Optional(Type.Array(Type.String({ minLength: 1, maxLength: 100 }), { minItems: 2, maxItems: 5 })),
50
+ }, { additionalProperties: false }),
51
+ computer_text: Type.Object({ ...grounded, ...optionalPixels, text: Type.String({ maxLength: 20000 }) }, { additionalProperties: false }),
52
+ computer_window: Type.Object({
53
+ ...target,
54
+ observation,
55
+ action: Type.Union([Type.Literal("frame"), Type.Literal("focus")]),
56
+ x: Type.Optional(Type.Number()),
57
+ y: Type.Optional(Type.Number()),
58
+ width: Type.Optional(Type.Integer({ minimum: 1 })),
59
+ height: Type.Optional(Type.Integer({ minimum: 1 })),
60
+ }, { additionalProperties: false }),
61
+ computer_launch: Type.Object({ name: Type.String({ minLength: 1, maxLength: 500 }) }, { additionalProperties: false }),
62
+ computer_scroll: Type.Object({
63
+ ...grounded,
64
+ ...pixels,
65
+ direction: Type.Union([Type.Literal("up"), Type.Literal("down"), Type.Literal("left"), Type.Literal("right")]),
66
+ amount: Type.Integer({ minimum: 1, maximum: 50 }),
67
+ by: Type.Union([Type.Literal("line"), Type.Literal("page")]),
68
+ }, { additionalProperties: false }),
69
+ computer_end: Type.Object({}, { additionalProperties: false }),
70
+ };
71
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/core/computer-use/schemas.ts"],"names":[],"mappings":"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","sourcesContent":["import { Type } from \"@sinclair/typebox\";\n\nconst target = {\n\tpid: Type.Integer({ minimum: 1 }),\n\twindow_id: Type.Integer({ minimum: 1 }),\n};\nconst observation = Type.String({\n\tdescription: \"Latest image token for this exact target. Single action, expires after 30 seconds.\",\n});\nconst grounded = {\n\tpid: Type.Optional(target.pid),\n\twindow_id: Type.Optional(target.window_id),\n\tdesktop: Type.Optional(Type.Boolean({ description: \"Primary desktop instead of a window; requires foreground=true.\" })),\n\tobservation,\n\tforeground: Type.Optional(Type.Boolean({ description: \"Window focus escalation after verified background failure. Settings may forbid it.\" })),\n};\nconst coordinate = Type.Number({ minimum: 0 });\nconst pixels = { x: coordinate, y: coordinate };\nconst optionalPixels = { x: Type.Optional(coordinate), y: Type.Optional(coordinate) };\nexport const computerSchemas = {\n\tcomputer_load: Type.Object({}, { additionalProperties: false }),\n\tcomputer_apps: Type.Object({\n\t\tpid: Type.Optional(target.pid),\n\t\toffset: Type.Optional(Type.Integer({ minimum: 0, maximum: Number.MAX_SAFE_INTEGER, description: \"Zero-based row offset, default 0. Pass the result's next_offset to retrieve the next 50 apps or windows.\" })),\n\t}, { additionalProperties: false }),\n\tcomputer_observe: Type.Object(\n\t\t{\n\t\t\tpid: Type.Optional(target.pid),\n\t\t\twindow_id: Type.Optional(target.window_id),\n\t\t\tdesktop: Type.Optional(Type.Boolean({ description: \"Capture the primary desktop instead of a window.\" })),\n\t\t\tobservation: Type.Optional(observation),\n\t\t\tcrop: Type.Optional(Type.Object({\n\t\t\t\tx: coordinate,\n\t\t\t\ty: coordinate,\n\t\t\t\twidth: Type.Number({ exclusiveMinimum: 0 }),\n\t\t\t\theight: Type.Number({ exclusiveMinimum: 0 }),\n\t\t\t}, { additionalProperties: false, description: \"Region in the latest returned image's pixels; requires its observation token. Captures fresh pixels. Omit for full target.\" })),\n\t\t},\n\t\t{ additionalProperties: false },\n\t),\n\tcomputer_click: Type.Object(\n\t\t{\n\t\t\t...grounded,\n\t\t\t...pixels,\n\t\t\tbutton: Type.Optional(Type.Union([Type.Literal(\"left\"), Type.Literal(\"right\")])),\n\t\t\tcount: Type.Optional(Type.Integer({ minimum: 1, maximum: 2 })),\n\t\t\tmodifier: Type.Optional(Type.Array(Type.String({ minLength: 1 }), { maxItems: 4 })),\n\t\t},\n\t\t{ additionalProperties: false },\n\t),\n\tcomputer_drag: Type.Object(\n\t\t{ ...grounded, from_x: coordinate, from_y: coordinate, to_x: coordinate, to_y: coordinate },\n\t\t{ additionalProperties: false },\n\t),\n\tcomputer_key: Type.Object(\n\t\t{\n\t\t\t...grounded,\n\t\t\t...optionalPixels,\n\t\t\tkey: Type.Optional(Type.String({ minLength: 1, maxLength: 100 })),\n\t\t\tkeys: Type.Optional(Type.Array(Type.String({ minLength: 1, maxLength: 100 }), { minItems: 2, maxItems: 5 })),\n\t\t},\n\t\t{ additionalProperties: false },\n\t),\n\tcomputer_text: Type.Object(\n\t\t{ ...grounded, ...optionalPixels, text: Type.String({ maxLength: 20000 }) },\n\t\t{ additionalProperties: false },\n\t),\n\tcomputer_window: Type.Object(\n\t\t{\n\t\t\t...target,\n\t\t\tobservation,\n\t\t\taction: Type.Union([Type.Literal(\"frame\"), Type.Literal(\"focus\")]),\n\t\t\tx: Type.Optional(Type.Number()),\n\t\t\ty: Type.Optional(Type.Number()),\n\t\t\twidth: Type.Optional(Type.Integer({ minimum: 1 })),\n\t\t\theight: Type.Optional(Type.Integer({ minimum: 1 })),\n\t\t},\n\t\t{ additionalProperties: false },\n\t),\n\tcomputer_launch: Type.Object(\n\t\t{ name: Type.String({ minLength: 1, maxLength: 500 }) },\n\t\t{ additionalProperties: false },\n\t),\n\tcomputer_scroll: Type.Object(\n\t\t{\n\t\t\t...grounded,\n\t\t\t...pixels,\n\t\t\tdirection: Type.Union([Type.Literal(\"up\"), Type.Literal(\"down\"), Type.Literal(\"left\"), Type.Literal(\"right\")]),\n\t\t\tamount: Type.Integer({ minimum: 1, maximum: 50 }),\n\t\t\tby: Type.Union([Type.Literal(\"line\"), Type.Literal(\"page\")]),\n\t\t},\n\t\t{ additionalProperties: false },\n\t),\n\tcomputer_end: Type.Object({}, { additionalProperties: false }),\n};\n"]}
@@ -0,0 +1,3 @@
1
+ export declare const WINDOWS_DESKTOP_PROBE = "\n$ErrorActionPreference = 'Stop'\nAdd-Type -TypeDefinition @'\nusing System;\nusing System.Diagnostics;\nusing System.Runtime.InteropServices;\nusing System.Text;\npublic static class LunrDesktopProbe {\n [DllImport(\"user32.dll\", SetLastError=true)] static extern IntPtr OpenInputDesktop(uint flags, bool inherit, uint access);\n [DllImport(\"user32.dll\")] static extern bool CloseDesktop(IntPtr desktop);\n [DllImport(\"user32.dll\", CharSet=CharSet.Unicode, SetLastError=true)] static extern bool GetUserObjectInformation(IntPtr handle, int index, StringBuilder info, uint length, out uint needed);\n [DllImport(\"wtsapi32.dll\", SetLastError=true)] static extern bool WTSQuerySessionInformation(IntPtr server, int session, int info, out IntPtr buffer, out uint bytes);\n [DllImport(\"wtsapi32.dll\")] static extern void WTSFreeMemory(IntPtr buffer);\n public static bool Ready() {\n int session = Process.GetCurrentProcess().SessionId;\n if (session == 0) return false;\n IntPtr buffer; uint bytes;\n if (!WTSQuerySessionInformation(IntPtr.Zero, session, 8, out buffer, out bytes)) return false;\n try { if (bytes < 4 || Marshal.ReadInt32(buffer) != 0) return false; }\n finally { WTSFreeMemory(buffer); }\n IntPtr desktop = OpenInputDesktop(0, false, 1);\n if (desktop == IntPtr.Zero) return false;\n try {\n var name = new StringBuilder(256); uint needed;\n return GetUserObjectInformation(desktop, 2, name, 512, out needed) && name.ToString() == \"Default\";\n } finally { CloseDesktop(desktop); }\n }\n}\n'@\nif ([LunrDesktopProbe]::Ready()) { 'ready' } else { 'unavailable' }\n";
2
+ export declare function assertInteractiveDesktop(signal?: AbortSignal): Promise<void>;
3
+ //# sourceMappingURL=windows-desktop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows-desktop.d.ts","sourceRoot":"","sources":["../../../src/core/computer-use/windows-desktop.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,qBAAqB,wkDA8BjC,CAAC;AAEF,wBAAsB,wBAAwB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBlF","sourcesContent":["import { execFile } from \"node:child_process\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\n\nconst exec = promisify(execFile);\nexport const WINDOWS_DESKTOP_PROBE = `\n$ErrorActionPreference = 'Stop'\nAdd-Type -TypeDefinition @'\nusing System;\nusing System.Diagnostics;\nusing System.Runtime.InteropServices;\nusing System.Text;\npublic static class LunrDesktopProbe {\n [DllImport(\"user32.dll\", SetLastError=true)] static extern IntPtr OpenInputDesktop(uint flags, bool inherit, uint access);\n [DllImport(\"user32.dll\")] static extern bool CloseDesktop(IntPtr desktop);\n [DllImport(\"user32.dll\", CharSet=CharSet.Unicode, SetLastError=true)] static extern bool GetUserObjectInformation(IntPtr handle, int index, StringBuilder info, uint length, out uint needed);\n [DllImport(\"wtsapi32.dll\", SetLastError=true)] static extern bool WTSQuerySessionInformation(IntPtr server, int session, int info, out IntPtr buffer, out uint bytes);\n [DllImport(\"wtsapi32.dll\")] static extern void WTSFreeMemory(IntPtr buffer);\n public static bool Ready() {\n int session = Process.GetCurrentProcess().SessionId;\n if (session == 0) return false;\n IntPtr buffer; uint bytes;\n if (!WTSQuerySessionInformation(IntPtr.Zero, session, 8, out buffer, out bytes)) return false;\n try { if (bytes < 4 || Marshal.ReadInt32(buffer) != 0) return false; }\n finally { WTSFreeMemory(buffer); }\n IntPtr desktop = OpenInputDesktop(0, false, 1);\n if (desktop == IntPtr.Zero) return false;\n try {\n var name = new StringBuilder(256); uint needed;\n return GetUserObjectInformation(desktop, 2, name, 512, out needed) && name.ToString() == \"Default\";\n } finally { CloseDesktop(desktop); }\n }\n}\n'@\nif ([LunrDesktopProbe]::Ready()) { 'ready' } else { 'unavailable' }\n`;\n\nexport async function assertInteractiveDesktop(signal?: AbortSignal): Promise<void> {\n\tif (process.platform !== \"win32\") return;\n\tconst command = join(\n\t\tprocess.env.SystemRoot ?? \"C:\\\\Windows\",\n\t\t\"System32\",\n\t\t\"WindowsPowerShell\",\n\t\t\"v1.0\",\n\t\t\"powershell.exe\",\n\t);\n\tconst { stdout } = await exec(command, [\"-NoProfile\", \"-NonInteractive\", \"-Command\", WINDOWS_DESKTOP_PROBE], {\n\t\ttimeout: 5000,\n\t\twindowsHide: true,\n\t\tsignal,\n\t});\n\tif (stdout.trim() !== \"ready\")\n\t\tthrow new Error(\n\t\t\t\"Computer use requires an active, unlocked Windows desktop. No login, unlock, or elevation is attempted.\",\n\t\t);\n}\n"]}
@@ -0,0 +1,48 @@
1
+ import { execFile } from "node:child_process";
2
+ import { join } from "node:path";
3
+ import { promisify } from "node:util";
4
+ const exec = promisify(execFile);
5
+ export const WINDOWS_DESKTOP_PROBE = `
6
+ $ErrorActionPreference = 'Stop'
7
+ Add-Type -TypeDefinition @'
8
+ using System;
9
+ using System.Diagnostics;
10
+ using System.Runtime.InteropServices;
11
+ using System.Text;
12
+ public static class LunrDesktopProbe {
13
+ [DllImport("user32.dll", SetLastError=true)] static extern IntPtr OpenInputDesktop(uint flags, bool inherit, uint access);
14
+ [DllImport("user32.dll")] static extern bool CloseDesktop(IntPtr desktop);
15
+ [DllImport("user32.dll", CharSet=CharSet.Unicode, SetLastError=true)] static extern bool GetUserObjectInformation(IntPtr handle, int index, StringBuilder info, uint length, out uint needed);
16
+ [DllImport("wtsapi32.dll", SetLastError=true)] static extern bool WTSQuerySessionInformation(IntPtr server, int session, int info, out IntPtr buffer, out uint bytes);
17
+ [DllImport("wtsapi32.dll")] static extern void WTSFreeMemory(IntPtr buffer);
18
+ public static bool Ready() {
19
+ int session = Process.GetCurrentProcess().SessionId;
20
+ if (session == 0) return false;
21
+ IntPtr buffer; uint bytes;
22
+ if (!WTSQuerySessionInformation(IntPtr.Zero, session, 8, out buffer, out bytes)) return false;
23
+ try { if (bytes < 4 || Marshal.ReadInt32(buffer) != 0) return false; }
24
+ finally { WTSFreeMemory(buffer); }
25
+ IntPtr desktop = OpenInputDesktop(0, false, 1);
26
+ if (desktop == IntPtr.Zero) return false;
27
+ try {
28
+ var name = new StringBuilder(256); uint needed;
29
+ return GetUserObjectInformation(desktop, 2, name, 512, out needed) && name.ToString() == "Default";
30
+ } finally { CloseDesktop(desktop); }
31
+ }
32
+ }
33
+ '@
34
+ if ([LunrDesktopProbe]::Ready()) { 'ready' } else { 'unavailable' }
35
+ `;
36
+ export async function assertInteractiveDesktop(signal) {
37
+ if (process.platform !== "win32")
38
+ return;
39
+ const command = join(process.env.SystemRoot ?? "C:\\Windows", "System32", "WindowsPowerShell", "v1.0", "powershell.exe");
40
+ const { stdout } = await exec(command, ["-NoProfile", "-NonInteractive", "-Command", WINDOWS_DESKTOP_PROBE], {
41
+ timeout: 5000,
42
+ windowsHide: true,
43
+ signal,
44
+ });
45
+ if (stdout.trim() !== "ready")
46
+ throw new Error("Computer use requires an active, unlocked Windows desktop. No login, unlock, or elevation is attempted.");
47
+ }
48
+ //# sourceMappingURL=windows-desktop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows-desktop.js","sourceRoot":"","sources":["../../../src/core/computer-use/windows-desktop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AACjC,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BpC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,MAAoB,EAAiB;IACnF,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO;IACzC,MAAM,OAAO,GAAG,IAAI,CACnB,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,aAAa,EACvC,UAAU,EACV,mBAAmB,EACnB,MAAM,EACN,gBAAgB,CAChB,CAAC;IACF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,qBAAqB,CAAC,EAAE;QAC5G,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,IAAI;QACjB,MAAM;KACN,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,OAAO;QAC5B,MAAM,IAAI,KAAK,CACd,yGAAyG,CACzG,CAAC;AAAA,CACH","sourcesContent":["import { execFile } from \"node:child_process\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\n\nconst exec = promisify(execFile);\nexport const WINDOWS_DESKTOP_PROBE = `\n$ErrorActionPreference = 'Stop'\nAdd-Type -TypeDefinition @'\nusing System;\nusing System.Diagnostics;\nusing System.Runtime.InteropServices;\nusing System.Text;\npublic static class LunrDesktopProbe {\n [DllImport(\"user32.dll\", SetLastError=true)] static extern IntPtr OpenInputDesktop(uint flags, bool inherit, uint access);\n [DllImport(\"user32.dll\")] static extern bool CloseDesktop(IntPtr desktop);\n [DllImport(\"user32.dll\", CharSet=CharSet.Unicode, SetLastError=true)] static extern bool GetUserObjectInformation(IntPtr handle, int index, StringBuilder info, uint length, out uint needed);\n [DllImport(\"wtsapi32.dll\", SetLastError=true)] static extern bool WTSQuerySessionInformation(IntPtr server, int session, int info, out IntPtr buffer, out uint bytes);\n [DllImport(\"wtsapi32.dll\")] static extern void WTSFreeMemory(IntPtr buffer);\n public static bool Ready() {\n int session = Process.GetCurrentProcess().SessionId;\n if (session == 0) return false;\n IntPtr buffer; uint bytes;\n if (!WTSQuerySessionInformation(IntPtr.Zero, session, 8, out buffer, out bytes)) return false;\n try { if (bytes < 4 || Marshal.ReadInt32(buffer) != 0) return false; }\n finally { WTSFreeMemory(buffer); }\n IntPtr desktop = OpenInputDesktop(0, false, 1);\n if (desktop == IntPtr.Zero) return false;\n try {\n var name = new StringBuilder(256); uint needed;\n return GetUserObjectInformation(desktop, 2, name, 512, out needed) && name.ToString() == \"Default\";\n } finally { CloseDesktop(desktop); }\n }\n}\n'@\nif ([LunrDesktopProbe]::Ready()) { 'ready' } else { 'unavailable' }\n`;\n\nexport async function assertInteractiveDesktop(signal?: AbortSignal): Promise<void> {\n\tif (process.platform !== \"win32\") return;\n\tconst command = join(\n\t\tprocess.env.SystemRoot ?? \"C:\\\\Windows\",\n\t\t\"System32\",\n\t\t\"WindowsPowerShell\",\n\t\t\"v1.0\",\n\t\t\"powershell.exe\",\n\t);\n\tconst { stdout } = await exec(command, [\"-NoProfile\", \"-NonInteractive\", \"-Command\", WINDOWS_DESKTOP_PROBE], {\n\t\ttimeout: 5000,\n\t\twindowsHide: true,\n\t\tsignal,\n\t});\n\tif (stdout.trim() !== \"ready\")\n\t\tthrow new Error(\n\t\t\t\"Computer use requires an active, unlocked Windows desktop. No login, unlock, or elevation is attempted.\",\n\t\t);\n}\n"]}
@@ -0,0 +1,32 @@
1
+ import type { ImageContent, TextContent } from "@ashx-j/lunr-ai";
2
+ import type { ComputerDriver, DriverReply } from "./adapter.ts";
3
+ import { DesktopLease } from "./lease.ts";
4
+ export declare function driverData(reply: DriverReply): Record<string, unknown>;
5
+ export declare function driverRefused(reply: DriverReply): boolean;
6
+ type Result = {
7
+ content: (ImageContent | TextContent)[];
8
+ details: {
9
+ observation?: string;
10
+ };
11
+ isError: boolean;
12
+ };
13
+ export declare class ComputerWorkflow {
14
+ private observation?;
15
+ private lastCapture?;
16
+ private lastAction?;
17
+ private readonly abort;
18
+ private closing?;
19
+ private readonly driver;
20
+ private readonly lease;
21
+ constructor(driver: ComputerDriver, lease?: DesktopLease);
22
+ private fresh;
23
+ private capture;
24
+ private imageResult;
25
+ private crop;
26
+ private action;
27
+ execute(name: string, input: Record<string, unknown>, signal?: AbortSignal): Promise<Result>;
28
+ close(): Promise<void>;
29
+ private stop;
30
+ }
31
+ export {};
32
+ //# sourceMappingURL=workflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../../src/core/computer-use/workflow.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAWtE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAWzD;AAmED,KAAK,MAAM,GAAG;IAAE,OAAO,EAAE,CAAC,YAAY,GAAG,WAAW,CAAC,EAAE,CAAC;IAAC,OAAO,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAiB/G,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,WAAW,CAAC,CAA2D;IAC/E,OAAO,CAAC,UAAU,CAAC,CAAiE;IACpF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,OAAO,CAAC,OAAO,CAAC,CAAgB;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,YAAY,MAAM,EAAE,cAAc,EAAE,KAAK,eAAqB,EAI7D;IAED,OAAO,CAAC,KAAK;YAOC,OAAO;IAsBrB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,IAAI;IAcZ,OAAO,CAAC,MAAM;IAuDR,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAgFjG;IAED,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAKrB;YAEa,IAAI;CAIlB","sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport type { ImageContent, TextContent } from \"@ashx-j/lunr-ai\";\nimport type { ComputerDriver, DriverReply } from \"./adapter.ts\";\nimport { type ImageRegion, prepareComputerImage, screenshotDimensions } from \"./image.ts\";\nimport { DesktopLease } from \"./lease.ts\";\nimport { computerSchemas } from \"./schemas.ts\";\n\nexport function driverData(reply: DriverReply): Record<string, unknown> {\n\tif (reply.structuredContent && typeof reply.structuredContent === \"object\" && !Array.isArray(reply.structuredContent))\n\t\treturn Object.fromEntries(Object.entries(reply.structuredContent));\n\tif (Array.isArray(reply.content)) for (const item of reply.content) {\n\t\tif (item.type !== \"text\" || typeof item.text !== \"string\") continue;\n\t\ttry {\n\t\t\tconst value: unknown = JSON.parse(item.text);\n\t\t\tif (value && typeof value === \"object\" && !Array.isArray(value)) return Object.fromEntries(Object.entries(value));\n\t\t} catch {}\n\t}\n\treturn {};\n}\n\nexport function driverRefused(reply: DriverReply): boolean {\n\tconst data = driverData(reply);\n\tconst acknowledged = data.activated === true || data.success === true || data.verified === true || data.effect === \"confirmed\";\n\tconst uncertain = [data.status, data.effect].some((value) => value === \"partial\" || value === \"unverifiable\");\n\treturn reply.isError === true ||\n\t\t(data.refusal !== undefined && data.refusal !== null && data.refusal !== false) ||\n\t\t(data.error !== undefined && data.error !== null && data.error !== false) ||\n\t\tdata.effect === \"refused\" || data.status === \"refused\" || data.status === \"failed\" || data.success === false ||\n\t\tdata.code === \"window_target_mismatch\" ||\n\t\t(data.status !== undefined && !acknowledged && !uncertain && ![\"ok\", \"success\", \"completed\"].includes(String(data.status))) ||\n\t\t(data.code !== undefined && data.code !== 0 && !acknowledged && !uncertain);\n}\n\nfunction record(value: unknown): Record<string, unknown> {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value) ? Object.fromEntries(Object.entries(value)) : {};\n}\n\nfunction select(data: Record<string, unknown>, keys: readonly string[]): Record<string, string | number | boolean> {\n\tconst result: Record<string, string | number | boolean> = {};\n\tfor (const key of keys) {\n\t\tconst value = data[key];\n\t\tif (typeof value === \"string\") result[key] = value.slice(0, 240);\n\t\telse if (typeof value === \"boolean\" || (typeof value === \"number\" && Number.isFinite(value))) result[key] = value;\n\t}\n\treturn result;\n}\n\nfunction typingRecovery(data: Record<string, unknown>, text: unknown) {\n\tif (typeof text !== \"string\") return {};\n\tconst requested = data.requested_chars;\n\tconst delivered = data.delivered_chars;\n\tif (typeof requested !== \"number\" || !Number.isSafeInteger(requested) || requested < 0 ||\n\t\trequested > 20000 || requested !== Array.from(text).length) return {};\n\tconst validDelivered = typeof delivered === \"number\" && Number.isSafeInteger(delivered) && delivered >= 0 && delivered <= requested;\n\treturn {\n\t\trequested_chars: requested,\n\t\tdelivered_chars: validDelivered ? delivered : undefined,\n\t\tretryable: typeof data.retryable === \"boolean\" ? data.retryable : undefined,\n\t\tretry_from_character: validDelivered && data.retry_from_character === delivered ? delivered : undefined,\n\t};\n}\n\nfunction outcome(reply: DriverReply, text?: unknown) {\n\tconst data = driverData(reply);\n\tconst message = Array.isArray(reply.content) ? reply.content.find((item) => item.type === \"text\" && typeof item.text === \"string\") : undefined;\n\treturn {\n\t\t...select(data, [\"status\", \"effect\", \"refusal\", \"error\", \"code\", \"path\", \"verified\", \"verify\", \"success\", \"activated\"]),\n\t\trefusal: typeof data.refusal === \"object\" && data.refusal !== null ? select(record(data.refusal), [\"code\", \"message\", \"facility\"]) : select(data, [\"refusal\"]).refusal,\n\t\terror: typeof data.error === \"object\" && data.error !== null ? select(record(data.error), [\"code\", \"message\", \"facility\"]) : select(data, [\"error\"]).error,\n\t\tmessage: Object.keys(data).length === 0 && message?.type === \"text\" ? String(message.text).slice(0, 240) : undefined,\n\t\tescalation: record(data.escalation).recommended === \"foreground\" ? \"foreground\" : undefined,\n\t\tinput: driverRefused(reply) ? \"refused_or_failed\" : \"dispatched\",\n\t\tapplicationEffect: \"unverified\",\n\t\t...typingRecovery(data, text),\n\t};\n}\n\nfunction abortable<T>(pending: Promise<T>, signal: AbortSignal): Promise<T> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst abort = () => {\n\t\t\tsignal.removeEventListener(\"abort\", abort);\n\t\t\treject(signal.reason ?? new Error(\"Computer operation cancelled.\"));\n\t\t};\n\t\tsignal.addEventListener(\"abort\", abort, { once: true });\n\t\tpending.then((value) => {\n\t\t\tsignal.removeEventListener(\"abort\", abort);\n\t\t\tresolve(value);\n\t\t}, (error) => {\n\t\t\tsignal.removeEventListener(\"abort\", abort);\n\t\t\treject(error);\n\t\t});\n\t\tif (signal.aborted) abort();\n\t});\n}\n\ntype Target = { desktop: true } | { pid: number; window_id: number; desktop?: false };\ntype PreparedImage = Awaited<ReturnType<typeof prepareComputerImage>>;\ntype Observation = PreparedImage & { token: string; target: Target; time: number; fingerprint: string; geometry: string };\ntype Result = { content: (ImageContent | TextContent)[]; details: { observation?: string }; isError: boolean };\n\nfunction targetFrom(input: Record<string, unknown>): Target {\n\tif (input.desktop === true) {\n\t\tif (input.pid !== undefined || input.window_id !== undefined) throw new Error(\"Desktop target cannot include pid/window_id.\");\n\t\treturn { desktop: true };\n\t}\n\tif (typeof input.pid !== \"number\" || !Number.isInteger(input.pid) || input.pid < 1 ||\n\t\ttypeof input.window_id !== \"number\" || !Number.isInteger(input.window_id) || input.window_id < 1)\n\t\tthrow new Error(\"Window target requires positive integer pid and window_id.\");\n\treturn { pid: input.pid, window_id: input.window_id };\n}\n\nfunction sameTarget(a: Target, b: Target): boolean {\n\treturn a.desktop === true ? b.desktop === true : b.desktop !== true && a.pid === b.pid && a.window_id === b.window_id;\n}\n\nexport class ComputerWorkflow {\n\tprivate observation?: Observation;\n\tprivate lastCapture?: { fingerprint: string; target: Target; repeats: number };\n\tprivate lastAction?: { signature: string; fingerprint: string; unchanged: boolean };\n\tprivate readonly abort = new AbortController();\n\tprivate closing?: Promise<void>;\n\tprivate readonly driver: ComputerDriver;\n\tprivate readonly lease: DesktopLease;\n\tconstructor(driver: ComputerDriver, lease = new DesktopLease()) {\n\t\tthis.driver = driver;\n\t\tthis.lease = lease;\n\t\tthis.driver.setProcessObserver?.((pid) => this.lease.trackProcess(pid));\n\t}\n\n\tprivate fresh(input: Record<string, unknown>, previous?: Observation): Observation {\n\t\tif (!previous || previous.token !== input.observation || !sameTarget(previous.target, targetFrom(input)) ||\n\t\t\tDate.now() - previous.time > 30000)\n\t\t\tthrow new Error(\"Stale observation. Capture this exact target again before acting.\");\n\t\treturn previous;\n\t}\n\n\tprivate async capture(target: Target, signal: AbortSignal, previous?: Observation, crop?: ImageRegion): Promise<Observation> {\n\t\tconst time = Date.now();\n\t\tconst reply = await abortable(this.driver.call(target.desktop ? \"get_desktop_state\" : \"get_window_state\",\n\t\t\ttarget.desktop ? {} : { pid: target.pid, window_id: target.window_id, include_accessibility_tree: false, include_screenshot: true, max_dimension: 2560 }, signal), signal);\n\t\tif (driverRefused(reply)) throw new Error(`Capture refused: ${JSON.stringify(outcome(reply))}`);\n\t\tconst data = driverData(reply);\n\t\tconst images = Array.isArray(reply.content) ? reply.content.filter((item) => item.type === \"image\") : [];\n\t\tif (images.length !== 1 || typeof images[0].data !== \"string\" || typeof images[0].mimeType !== \"string\")\n\t\t\tthrow new Error(\"Capture must return exactly one screenshot.\");\n\t\tconst image: ImageContent = { type: \"image\", data: images[0].data, mimeType: images[0].mimeType };\n\t\tconst dimensions = screenshotDimensions(image);\n\t\tif (data.screenshot_frame_valid === false || data.screenshot_error != null || dimensions.width !== data.screenshot_width || dimensions.height !== data.screenshot_height)\n\t\t\tthrow new Error(\"Screenshot dimensions or frame could not be verified. Capture again.\");\n\t\tconst geometry = JSON.stringify(select(record(data.window_bounds), [\"x\", \"y\", \"width\", \"height\"]));\n\t\tif (crop && previous && (previous.sourceWidth !== dimensions.width || previous.sourceHeight !== dimensions.height || previous.geometry !== geometry))\n\t\t\tthrow new Error(\"Target geometry changed. Capture a full image before selecting a crop.\");\n\t\tconst prepared = await abortable(prepareComputerImage(image, crop), signal);\n\t\tsignal.throwIfAborted();\n\t\treturn { ...prepared, token: randomUUID(), target, time, geometry,\n\t\t\tfingerprint: createHash(\"sha256\").update(image.data).digest(\"hex\") };\n\t}\n\n\tprivate imageResult(observation: Observation, extra: Record<string, unknown> = {}): Result {\n\t\tthis.observation = observation;\n\t\tconst { width, height, region, sourceWidth, sourceHeight, scaleX, scaleY, target, token } = observation;\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text: JSON.stringify({\n\t\t\t\t...extra, observation: token, target, image: { width, height },\n\t\t\t\tmapping: { sourceWidth, sourceHeight, ...region, scaleX, scaleY },\n\t\t\t\tcoordinates: \"Use returned-image pixels; mapping is applied automatically.\",\n\t\t\t}) }, observation.image],\n\t\t\tdetails: { observation: token }, isError: false,\n\t\t};\n\t}\n\n\tprivate crop(input: Record<string, unknown>, previous: Observation): ImageRegion {\n\t\tconst crop = record(input.crop);\n\t\tconst { x, y, width, height } = crop;\n\t\tif (typeof x !== \"number\" || typeof y !== \"number\" || typeof width !== \"number\" || typeof height !== \"number\" ||\n\t\t\t![x, y, width, height].every(Number.isFinite) || x < 0 || y < 0 || width <= 0 || height <= 0 ||\n\t\t\tx + width > previous.width || y + height > previous.height || Object.keys(crop).some((key) => ![\"x\", \"y\", \"width\", \"height\"].includes(key)))\n\t\t\tthrow new Error(\"Crop must fit the latest returned image.\");\n\t\tconst left = Math.floor(previous.region.x + x * previous.scaleX);\n\t\tconst top = Math.floor(previous.region.y + y * previous.scaleY);\n\t\tconst right = Math.min(previous.sourceWidth, Math.ceil(previous.region.x + (x + width) * previous.scaleX));\n\t\tconst bottom = Math.min(previous.sourceHeight, Math.ceil(previous.region.y + (y + height) * previous.scaleY));\n\t\treturn { x: left, y: top, width: right - left, height: bottom - top };\n\t}\n\n\tprivate action(name: string, input: Record<string, unknown>, previous: Observation) {\n\t\tconst args: Record<string, unknown> = previous.target.desktop ? { scope: \"desktop\" } : { pid: previous.target.pid, window_id: previous.target.window_id };\n\t\tif (previous.target.desktop && input.foreground !== true) throw new Error(\"Desktop input requires foreground=true.\");\n\t\tif (name !== \"computer_window\") args.delivery_mode = input.foreground === true ? \"foreground\" : \"background\";\n\t\tfor (const key of [\"x\", \"y\", \"from_x\", \"from_y\", \"to_x\", \"to_y\"]) {\n\t\t\tif (name === \"computer_window\") break;\n\t\t\tconst value = input[key];\n\t\t\tif (value === undefined) continue;\n\t\t\tconst horizontal = key.endsWith(\"x\");\n\t\t\tif (typeof value !== \"number\" || !Number.isFinite(value) || value < 0 || value >= (horizontal ? previous.width : previous.height))\n\t\t\t\tthrow new Error(\"Coordinate outside the observed image.\");\n\t\t\targs[key] = (horizontal ? previous.region.x : previous.region.y) + value * (horizontal ? previous.scaleX : previous.scaleY);\n\t\t}\n\t\tif ((input.x === undefined) !== (input.y === undefined)) throw new Error(\"Provide a complete x/y pair.\");\n\t\tif (previous.target.desktop && [\"computer_key\", \"computer_text\"].includes(name) && input.x !== undefined)\n\t\t\tthrow new Error(\"Desktop keyboard input uses the observed focused field. Change focus with a separate grounded click.\");\n\t\tlet operation: string;\n\t\tswitch (name) {\n\t\t\tcase \"computer_click\":\n\t\t\tcase \"computer_scroll\":\n\t\t\t\tif (input.x === undefined || input.y === undefined) throw new Error(\"This action requires x/y image coordinates.\");\n\t\t\t\toperation = name === \"computer_click\" ? \"click\" : \"scroll\";\n\t\t\t\tfor (const key of name === \"computer_click\" ? [\"button\", \"count\", \"modifier\"] : [\"direction\", \"amount\", \"by\"])\n\t\t\t\t\tif (input[key] !== undefined) args[key] = input[key];\n\t\t\t\tbreak;\n\t\t\tcase \"computer_drag\":\n\t\t\t\tif (![\"from_x\", \"from_y\", \"to_x\", \"to_y\"].every((key) => typeof args[key] === \"number\")) throw new Error(\"Drag requires both endpoints.\");\n\t\t\t\toperation = \"drag\";\n\t\t\t\tbreak;\n\t\t\tcase \"computer_key\":\n\t\t\t\tif ((input.key === undefined) === (input.keys === undefined)) throw new Error(\"Provide key OR keys.\");\n\t\t\t\toperation = input.keys === undefined ? \"press_key\" : \"hotkey\";\n\t\t\t\targs[input.keys === undefined ? \"key\" : \"keys\"] = input.keys ?? input.key;\n\t\t\t\tbreak;\n\t\t\tcase \"computer_text\":\n\t\t\t\toperation = \"type_text\";\n\t\t\t\targs.text = input.text;\n\t\t\t\tbreak;\n\t\t\tcase \"computer_window\":\n\t\t\t\tif (previous.target.desktop) throw new Error(\"Window management requires an exact window target.\");\n\t\t\t\tif (input.action === \"frame\") {\n\t\t\t\t\tfor (const key of [\"x\", \"y\", \"width\", \"height\"]) {\n\t\t\t\t\t\tconst value = input[key];\n\t\t\t\t\t\tif (typeof value !== \"number\" || !Number.isFinite(value) || ([\"width\", \"height\"].includes(key) && value <= 0)) throw new Error(\"Frame requires valid x/y/width/height.\");\n\t\t\t\t\t\targs[key] = value;\n\t\t\t\t\t}\n\t\t\t\t\toperation = \"set_window_frame\";\n\t\t\t\t} else if (input.action === \"focus\" && [\"x\", \"y\", \"width\", \"height\"].every((key) => input[key] === undefined)) operation = \"bring_to_front\";\n\t\t\t\telse throw new Error(\"Use frame or focus. Minimize/restore uses a fresh image click on the visible control.\");\n\t\t\t\tbreak;\n\t\t\tdefault: throw new Error(\"Unknown computer action.\");\n\t\t}\n\t\treturn { operation, args };\n\t}\n\n\tasync execute(name: string, input: Record<string, unknown>, signal?: AbortSignal): Promise<Result> {\n\t\tconst combined = AbortSignal.any([this.abort.signal, this.lease.signal, AbortSignal.timeout(90000), ...(signal ? [signal] : [])]);\n\t\ttry {\n\t\t\tconst result = await this.lease.run(async (): Promise<Result> => {\n\t\t\t\tif (!Object.hasOwn(computerSchemas, name)) throw new Error(\"Unknown computer operation.\");\n\t\t\t\tconst schema = computerSchemas[name as keyof typeof computerSchemas];\n\t\t\t\tif (Object.keys(input).some((key) => !Object.hasOwn(schema.properties, key))) throw new Error(\"Unsupported computer argument. Use image coordinates only.\");\n\t\t\t\tconst previous = this.observation;\n\t\t\t\tthis.observation = undefined;\n\t\t\t\tif (name === \"computer_apps\" || name === \"computer_launch\") {\n\t\t\t\t\tconst operation = name === \"computer_launch\" ? \"launch_app\" : input.pid === undefined ? \"list_apps\" : \"list_windows\";\n\t\t\t\t\tconst offset = input.offset ?? 0;\n\t\t\t\t\tif (typeof offset !== \"number\" || !Number.isSafeInteger(offset) || offset < 0)\n\t\t\t\t\t\tthrow new Error(\"Discovery offset must be a nonnegative safe integer.\");\n\t\t\t\t\tconst args = name === \"computer_launch\" ? { name: input.name } : input.pid === undefined ? {} : { pid: input.pid };\n\t\t\t\t\tconst reply = await abortable(this.driver.call(operation, args, combined), combined);\n\t\t\t\t\tconst data = driverData(reply);\n\t\t\t\t\tconst rows = data.apps ?? data.windows;\n\t\t\t\t\tconst metadata = Array.isArray(rows) ? rows.slice(offset, offset + 50).map((row) => {\n\t\t\t\t\t\tconst item = record(row);\n\t\t\t\t\t\treturn { ...select(item, [\"pid\", \"window_id\", \"name\", \"app_name\", \"title\", \"active\", \"running\", \"is_on_screen\", \"minimized\"]),\n\t\t\t\t\t\t\tbounds: item.bounds ? select(record(item.bounds), [\"x\", \"y\", \"width\", \"height\"]) : undefined };\n\t\t\t\t\t}) : undefined;\n\t\t\t\t\tconst remaining = Array.isArray(rows) ? Math.max(0, rows.length - offset - (metadata?.length ?? 0)) : 0;\n\t\t\t\t\treturn { content: [{ type: \"text\", text: JSON.stringify({\n\t\t\t\t\t\t...outcome(reply), ...select(data, [\"pid\", \"window_id\", \"name\", \"title\"]),\n\t\t\t\t\t\titems: metadata, offset, total: Array.isArray(rows) ? rows.length : undefined,\n\t\t\t\t\t\tomitted: remaining || undefined, next_offset: remaining ? offset + 50 : undefined,\n\t\t\t\t\t\tguidance: name === \"computer_launch\" ? \"Capture the exact target before input.\" : remaining ? \"Pass next_offset as offset with the same pid selection. Lists refresh per call.\" : undefined,\n\t\t\t\t\t}) }], details: {}, isError: driverRefused(reply) };\n\t\t\t\t}\n\t\t\t\tconst target = targetFrom(input);\n\t\t\t\tif (name === \"computer_observe\") {\n\t\t\t\t\tconst crop = input.crop === undefined ? undefined : this.crop(input, this.fresh(input, previous));\n\t\t\t\t\tconst captured = await this.capture(target, combined, previous, crop);\n\t\t\t\t\tconst unchanged = this.lastCapture?.fingerprint === captured.fingerprint && sameTarget(this.lastCapture.target, target);\n\t\t\t\t\tconst repeats = crop ? 0 : unchanged ? (this.lastCapture?.repeats ?? 0) + 1 : 1;\n\t\t\t\t\tthis.lastCapture = { fingerprint: captured.fingerprint, target, repeats };\n\t\t\t\t\tif (repeats >= 3) return {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Three captures are unchanged. Workflow stopped; stop polling and reconsider the target or approach. No input token issued.\" }], details: {}, isError: true,\n\t\t\t\t\t};\n\t\t\t\t\treturn this.imageResult(captured, { unchanged });\n\t\t\t\t}\n\t\t\t\tconst grounded = this.fresh(input, previous);\n\t\t\t\tconst { operation, args } = this.action(name, input, grounded);\n\t\t\t\tconst { button = \"left\", count = 1, modifier = [], ...clickArgs } = args;\n\t\t\t\tconst signature = JSON.stringify({ operation, args: operation === \"click\"\n\t\t\t\t\t? { ...clickArgs, button, count, modifier: Array.isArray(modifier) ? [...new Set(modifier)].sort() : modifier }\n\t\t\t\t\t: args });\n\t\t\t\tif (this.lastAction?.unchanged && this.lastAction.signature === signature && this.lastAction.fingerprint === grounded.fingerprint)\n\t\t\t\t\tthrow new Error(\"The identical action had no visible change. Choose a different grounded action; never retry blindly.\");\n\t\t\t\tconst reply = await abortable(this.driver.call(operation, args, combined), combined);\n\t\t\t\tcombined.throwIfAborted();\n\t\t\t\tconst actionOutcome = outcome(reply, name === \"computer_text\" ? input.text : undefined);\n\t\t\t\tconst recoveryGuidance = \"retry_from_character\" in actionOutcome && actionOutcome.retry_from_character !== undefined\n\t\t\t\t\t? \"Verify the field in a fresh image before considering any remaining suffix. retry_from_character is a zero-based Unicode code-point offset, not UTF-16. retryable is driver advice, not authorization to retry.\"\n\t\t\t\t\t: undefined;\n\t\t\t\tif (driverRefused(reply)) return { content: [{ type: \"text\", text: JSON.stringify({ ...actionOutcome,\n\t\t\t\t\tguidance: recoveryGuidance ?? \"Capture again before deciding; never retry input blindly.\" }) }], details: {}, isError: true };\n\t\t\t\ttry {\n\t\t\t\t\tconst after = await this.capture(target, combined);\n\t\t\t\t\tconst unchanged = after.fingerprint === grounded.fingerprint;\n\t\t\t\t\tthis.lastAction = { signature, fingerprint: after.fingerprint, unchanged };\n\t\t\t\t\tthis.lastCapture = { fingerprint: after.fingerprint, target, repeats: 0 };\n\t\t\t\t\treturn this.imageResult(after, { ...actionOutcome, unchanged,\n\t\t\t\t\t\tguidance: recoveryGuidance ?? (unchanged ? \"No visible change; this does not prove failure. Do not repeat input blindly.\" : \"Inspect the post-action image to verify the intended effect.\") });\n\t\t\t\t} catch (error) {\n\t\t\t\t\tcombined.throwIfAborted();\n\t\t\t\t\treturn { content: [{ type: \"text\", text: JSON.stringify({ ...actionOutcome,\n\t\t\t\t\t\tobservation: \"unavailable\", guidance: recoveryGuidance ?? \"Input may have taken effect. Capture again before deciding; never repeat blindly.\",\n\t\t\t\t\t\terror: error instanceof Error ? error.message.slice(0, 300) : \"Post-action capture failed.\",\n\t\t\t\t\t}) }], details: {}, isError: true };\n\t\t\t\t}\n\t\t\t}, combined);\n\t\t\tif (result.isError) await this.close();\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tawait this.close();\n\t\t\tthrow new Error(`Computer workflow stopped. Input may have taken effect; observe before deciding, never retry blindly. ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\n\tclose(): Promise<void> {\n\t\tthis.abort.abort();\n\t\tthis.observation = undefined;\n\t\tthis.closing ??= this.stop();\n\t\treturn this.closing;\n\t}\n\n\tprivate async stop(): Promise<void> {\n\t\tawait this.driver.close();\n\t\tawait this.lease.close();\n\t}\n}\n"]}