@ashx-j/lunr-dev 0.2.19-dev.10.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.
- package/CHANGELOG.md +36 -1
- package/README.md +2 -2
- package/dist/builtin-extensions/index.d.ts.map +1 -1
- package/dist/builtin-extensions/index.js +0 -2
- package/dist/builtin-extensions/index.js.map +1 -1
- package/dist/builtin-extensions/lunr-computer-use.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-computer-use.js +15 -14
- package/dist/builtin-extensions/lunr-computer-use.js.map +1 -1
- package/dist/builtin-extensions/lunr-todos.d.ts +6 -5
- package/dist/builtin-extensions/lunr-todos.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-todos.js +9 -7
- package/dist/builtin-extensions/lunr-todos.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/broker/spawn.d.ts +6 -4
- package/dist/builtin-extensions/pi-intercom/broker/spawn.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/broker/spawn.js +114 -61
- package/dist/builtin-extensions/pi-intercom/broker/spawn.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/index.js +360 -351
- package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js +2 -2
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +8 -6
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js +128 -57
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts +18 -8
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +38 -13
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +4 -3
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +24 -14
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts +8 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js +247 -18
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.d.ts +29 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.js +179 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.js.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.d.ts +89 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.js +541 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.js.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts +11 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js +38 -12
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.js +3 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts +2 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js +35 -8
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +7 -3
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +26 -4
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js +55 -38
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts +100 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +46 -31
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.d.ts +3 -6
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.js +64 -5
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.d.ts +15 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.js +14 -4
- package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js +2 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +21 -8
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts +0 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +71 -25
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.d.ts +2 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.js +75 -18
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +13 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +67 -11
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts +3 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js +7 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js +13 -3
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js +5 -10
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.d.ts +2 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.js +3 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.js.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts +3 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js +68 -11
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/formatters.d.ts +12 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/formatters.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/formatters.js +21 -2
- package/dist/builtin-extensions/pi-subagents/src/shared/formatters.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +21 -4
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/delegation-adapters.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/delegation-adapters.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts +7 -0
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +11 -7
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts +6 -0
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +46 -29
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +46 -4
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js +407 -450
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.d.ts +2 -13
- package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.js +5 -91
- package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.js.map +1 -1
- package/dist/core/computer-use/image.d.ts +26 -0
- package/dist/core/computer-use/image.d.ts.map +1 -0
- package/dist/core/computer-use/image.js +64 -0
- package/dist/core/computer-use/image.js.map +1 -0
- package/dist/core/computer-use/policy.d.ts.map +1 -1
- package/dist/core/computer-use/policy.js +2 -6
- package/dist/core/computer-use/policy.js.map +1 -1
- package/dist/core/computer-use/schemas.d.ts +13 -10
- package/dist/core/computer-use/schemas.d.ts.map +1 -1
- package/dist/core/computer-use/schemas.js +26 -35
- package/dist/core/computer-use/schemas.js.map +1 -1
- package/dist/core/computer-use/workflow.d.ts +16 -8
- package/dist/core/computer-use/workflow.d.ts.map +1 -1
- package/dist/core/computer-use/workflow.js +271 -260
- package/dist/core/computer-use/workflow.js.map +1 -1
- package/dist/core/customize.d.ts +2 -0
- package/dist/core/customize.d.ts.map +1 -1
- package/dist/core/customize.js +3 -0
- package/dist/core/customize.js.map +1 -1
- package/dist/core/permissions.d.ts +1 -0
- package/dist/core/permissions.d.ts.map +1 -1
- package/dist/core/permissions.js +8 -4
- package/dist/core/permissions.js.map +1 -1
- package/dist/core/plan-mode.d.ts.map +1 -1
- package/dist/core/plan-mode.js +0 -5
- package/dist/core/plan-mode.js.map +1 -1
- package/dist/core/runtime-bridges.d.ts.map +1 -1
- package/dist/core/runtime-bridges.js +0 -2
- package/dist/core/runtime-bridges.js.map +1 -1
- package/dist/core/settings-manager.d.ts +4 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +11 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/subagent-cancellation.d.ts +21 -0
- package/dist/core/subagent-cancellation.d.ts.map +1 -0
- package/dist/core/subagent-cancellation.js +53 -0
- package/dist/core/subagent-cancellation.js.map +1 -0
- package/dist/core/subagent-spinner-setting.d.ts +6 -0
- package/dist/core/subagent-spinner-setting.d.ts.map +1 -0
- package/dist/core/subagent-spinner-setting.js +12 -0
- package/dist/core/subagent-spinner-setting.js.map +1 -0
- package/dist/core/subagent-spinner.d.ts +4 -0
- package/dist/core/subagent-spinner.d.ts.map +1 -0
- package/dist/core/subagent-spinner.js +6 -0
- package/dist/core/subagent-spinner.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +12 -18
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +4 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +73 -1
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +12 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/extension-widget-order.d.ts +8 -0
- package/dist/modes/interactive/extension-widget-order.d.ts.map +1 -0
- package/dist/modes/interactive/extension-widget-order.js +37 -0
- package/dist/modes/interactive/extension-widget-order.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +44 -22
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/node-runtime/{agent-session-services-RSGP5GDN.js → agent-session-services-QANFGM2V.js} +14 -13
- package/dist/node-runtime/{builtin-extensions-7STLFW3A.js → builtin-extensions-SRCYQPZ6.js} +4 -3
- package/dist/node-runtime/{chunk-5OLJGVCB.js → chunk-3ONQTOMR.js} +2 -2
- package/dist/node-runtime/chunk-5ZH3ZFIZ.js +308 -0
- package/dist/node-runtime/{chunk-4SJWFTUP.js → chunk-7NBZ5P7I.js} +1 -1
- package/dist/node-runtime/chunk-A3KMVBZV.js +60 -0
- package/dist/node-runtime/{chunk-FLYMHKCS.js → chunk-BJ6H7DPI.js} +25 -25
- package/dist/node-runtime/{chunk-T5GM5BFH.js → chunk-BYQ2MOFI.js} +6 -6
- package/dist/node-runtime/{chunk-W7S2REEG.js → chunk-CZUBYPFP.js} +157 -74
- package/dist/node-runtime/{chunk-ZRDIMBEQ.js → chunk-D466UAID.js} +9 -6
- package/dist/node-runtime/{chunk-K72NVGUB.js → chunk-GT5F3OKM.js} +1 -1
- package/dist/node-runtime/chunk-H2BI7G7T.js +73 -0
- package/dist/node-runtime/{chunk-ISQDQIZN.js → chunk-HXJS2PJM.js} +2 -2
- package/dist/node-runtime/chunk-LISUTZS3.js +19 -0
- package/dist/node-runtime/{chunk-BKAZ6BKX.js → chunk-LOYUC2ID.js} +7 -7
- package/dist/node-runtime/{chunk-OTT6JMPU.js → chunk-LTYWTR3V.js} +1 -369
- package/dist/node-runtime/{chunk-5Q45AVQG.js → chunk-MW2XJZIK.js} +1 -1
- package/dist/node-runtime/{chunk-MUMMMTW4.js → chunk-N3PNL74S.js} +536 -265
- package/dist/node-runtime/{chunk-HQCKFM2O.js → chunk-VGYZ3APQ.js} +3 -0
- package/dist/node-runtime/{chunk-5NWQCSKR.js → chunk-VQ4UBWSA.js} +11 -1
- package/dist/node-runtime/{chunk-6SPPH4FY.js → chunk-VTGEKB7R.js} +4 -4
- package/dist/node-runtime/chunk-W3SILANP.js +24 -0
- package/dist/node-runtime/{chunk-J7QGQD45.js → chunk-WJVFOIB5.js} +1 -1
- package/dist/node-runtime/{chunk-JT6YCS5B.js → chunk-XAUQOKYK.js} +408 -45
- package/dist/node-runtime/{chunk-LCACDWHJ.js → chunk-XSRCAQK2.js} +13 -13
- package/dist/node-runtime/{chunk-TAP7QTUT.js → chunk-ZOIIMEN6.js} +24 -425
- package/dist/node-runtime/{chunk-MGSB2C3M.js → chunk-ZVSORYRM.js} +1 -1
- package/dist/node-runtime/{command-6UXQ6XZN.js → command-ZURZJDXF.js} +1 -1
- package/dist/node-runtime/{commands-LGR5VT5X.js → commands-BZGSLIP7.js} +3 -3
- package/dist/node-runtime/{customize-XEXL2DGQ.js → customize-LF5VST47.js} +1 -1
- package/dist/node-runtime/{direct-tool-executor-TDJS7TBD.js → direct-tool-executor-BSZDHIYR.js} +4 -4
- package/dist/node-runtime/{extract-IUCVZCWC.js → extract-XLQSJN4V.js} +2 -2
- package/dist/node-runtime/{gateway-3OLC4GQN.js → gateway-FWHRIBK5.js} +9 -9
- package/dist/node-runtime/{gemini-search-NCIDF7NE.js → gemini-search-U7SUMPQA.js} +1 -1
- package/dist/node-runtime/{gemini-url-context-OKIN7AIP.js → gemini-url-context-PXWCBQHK.js} +2 -2
- package/dist/node-runtime/index.js +34 -31
- package/dist/node-runtime/{init-EKE277AG.js → init-DVJUAOUO.js} +3 -3
- package/dist/node-runtime/{interactive-mode-S5M26CQ7.js → interactive-mode-BBASNWHN.js} +18 -15
- package/dist/node-runtime/lunr-computer-use-TJNDAMWM.js +135 -0
- package/dist/node-runtime/{lunr-cron-KKBOGAEF.js → lunr-cron-J64I72C6.js} +5 -5
- package/dist/node-runtime/main.js +22 -20
- package/dist/node-runtime/{package-manager-cli-C4EJOO5Q.js → package-manager-cli-VMYX4Y2S.js} +8 -7
- package/dist/node-runtime/{pi-intercom-EEMBGQID.js → pi-intercom-NV2LW6X7.js} +108 -87
- package/dist/node-runtime/{pi-mcp-adapter-DPTJGAAL.js → pi-mcp-adapter-JLB5YL2F.js} +6 -6
- package/dist/node-runtime/{pi-subagents-VKCLYIBY.js → pi-subagents-WEHV3W7H.js} +1267 -604
- package/dist/node-runtime/{pi-web-access-BV6DSZOP.js → pi-web-access-FN5YC5T6.js} +5 -5
- package/dist/node-runtime/{proxy-modes-R64LU6WZ.js → proxy-modes-OR7ISBXK.js} +7 -7
- package/dist/node-runtime/rpc-entry.js +22 -20
- package/dist/node-runtime/{runtime-bridges-UJ5WJJLN.js → runtime-bridges-2VQTLPOZ.js} +3 -5
- package/dist/node-runtime/{settings-manager-K6IPIQTI.js → settings-manager-3CCU326G.js} +3 -2
- package/dist/node-runtime/{subagent-executor-EFLTO32A.js → subagent-executor-CXKXQDHH.js} +186 -299
- package/dist/node-runtime/{update-cli-I6OVDRPL.js → update-cli-NM7B4CKL.js} +3 -2
- package/dist/node-runtime/{video-extract-ETA5RA7U.js → video-extract-OYT5WKS5.js} +2 -2
- package/dist/node-runtime/workflow-C26QCUTW.js +468 -0
- package/dist/node-runtime/{youtube-extract-SRVGNN26.js → youtube-extract-TQYKGFGS.js} +2 -2
- package/docs/computer-use.md +233 -268
- package/docs/features.md +22 -4
- package/docs/keybindings.md +3 -1
- package/docs/settings.md +3 -2
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/install-lock/package-lock.json +24 -24
- package/install-lock/package.json +2 -2
- package/npm-shrinkwrap.json +21 -21
- package/package.json +7 -7
- package/dist/builtin-extensions/lunr-settings-tools.d.ts +0 -4
- package/dist/builtin-extensions/lunr-settings-tools.d.ts.map +0 -1
- package/dist/builtin-extensions/lunr-settings-tools.js +0 -120
- package/dist/builtin-extensions/lunr-settings-tools.js.map +0 -1
- package/dist/core/settings-tools-bridge.d.ts +0 -35
- package/dist/core/settings-tools-bridge.d.ts.map +0 -1
- package/dist/core/settings-tools-bridge.js +0 -56
- package/dist/core/settings-tools-bridge.js.map +0 -1
- package/dist/node-runtime/chunk-EH2LJQPM.js +0 -64
- package/dist/node-runtime/image-resize-6ZPBFMWW.js +0 -11
- package/dist/node-runtime/lunr-computer-use-4X3KUNF4.js +0 -206
- package/dist/node-runtime/workflow-SA34S4VX.js +0 -325
- package/dist/node-runtime/{chunk-EHMBW7FA.js → chunk-VSELYKWU.js} +3 -3
- package/dist/node-runtime/{chunk-ZSEZY3II.js → chunk-VTPM5V35.js} +0 -0
- package/dist/node-runtime/{src-GPFAU3N6.js → src-BPQFJR76.js} +3 -3
|
@@ -6,9 +6,10 @@ import {
|
|
|
6
6
|
import "./chunk-DVGWF6A2.js";
|
|
7
7
|
import {
|
|
8
8
|
SettingsManager
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-VQ4UBWSA.js";
|
|
10
10
|
import "./chunk-URD2SLIT.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-LISUTZS3.js";
|
|
12
|
+
import "./chunk-3ONQTOMR.js";
|
|
12
13
|
import "./chunk-AY6CAJSL.js";
|
|
13
14
|
import {
|
|
14
15
|
APP_NAME,
|
|
@@ -11,8 +11,8 @@ import {
|
|
|
11
11
|
} from "./chunk-3WFAEVKS.js";
|
|
12
12
|
import {
|
|
13
13
|
extractHeadingTitle
|
|
14
|
-
} from "./chunk-
|
|
15
|
-
import "./chunk-
|
|
14
|
+
} from "./chunk-WJVFOIB5.js";
|
|
15
|
+
import "./chunk-7NBZ5P7I.js";
|
|
16
16
|
import {
|
|
17
17
|
activityMonitor
|
|
18
18
|
} from "./chunk-DAPBPCBP.js";
|
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
import { createRequire as __lunrRequire } from "node:module"; const require = __lunrRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
assertOwnedPath
|
|
4
|
+
} from "./chunk-JZHEUQRL.js";
|
|
5
|
+
import {
|
|
6
|
+
computerSchemas
|
|
7
|
+
} from "./chunk-H2BI7G7T.js";
|
|
8
|
+
import {
|
|
9
|
+
require_proper_lockfile
|
|
10
|
+
} from "./chunk-URD2SLIT.js";
|
|
11
|
+
import "./chunk-PL6JKXWI.js";
|
|
12
|
+
import {
|
|
13
|
+
resizeImage
|
|
14
|
+
} from "./chunk-VTPM5V35.js";
|
|
15
|
+
import {
|
|
16
|
+
loadPhoton
|
|
17
|
+
} from "./chunk-RQ2Q5IYR.js";
|
|
18
|
+
import "./chunk-PCIGF2XK.js";
|
|
19
|
+
import "./chunk-Q4Q6D4IY.js";
|
|
20
|
+
import {
|
|
21
|
+
__toESM
|
|
22
|
+
} from "./chunk-BRJX2PRC.js";
|
|
23
|
+
|
|
24
|
+
// packages/coding-agent/dist/core/computer-use/workflow.js
|
|
25
|
+
import { createHash, randomUUID as randomUUID2 } from "node:crypto";
|
|
26
|
+
|
|
27
|
+
// packages/coding-agent/dist/core/computer-use/image.js
|
|
28
|
+
function screenshotDimensions(image) {
|
|
29
|
+
if (image.mimeType !== "image/png" || image.data.length > 64 * 1024 * 1024)
|
|
30
|
+
throw new Error("Expected a bounded PNG screenshot.");
|
|
31
|
+
let bytes = Buffer.from(image.data, "base64");
|
|
32
|
+
if (bytes.length < 24 || !bytes.subarray(0, 8).equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10])))
|
|
33
|
+
throw new Error("Invalid screenshot PNG.");
|
|
34
|
+
let width = bytes.readUInt32BE(16), height = bytes.readUInt32BE(20);
|
|
35
|
+
if (!width || !height || width > 16384 || height > 16384 || width * height > 4e7)
|
|
36
|
+
throw new Error("Screenshot dimensions exceed the supported capture budget.");
|
|
37
|
+
return { width, height };
|
|
38
|
+
}
|
|
39
|
+
async function prepareComputerImage(image, crop) {
|
|
40
|
+
let source = screenshotDimensions(image), region = crop ?? { x: 0, y: 0, ...source };
|
|
41
|
+
if (![region.x, region.y, region.width, region.height].every(Number.isInteger) || region.x < 0 || region.y < 0 || region.width < 1 || region.height < 1 || region.x + region.width > source.width || region.y + region.height > source.height)
|
|
42
|
+
throw new Error("Crop is outside the captured image.");
|
|
43
|
+
let bytes = Buffer.from(image.data, "base64");
|
|
44
|
+
if (crop) {
|
|
45
|
+
let photon = await loadPhoton();
|
|
46
|
+
if (!photon)
|
|
47
|
+
throw new Error("Image processing is unavailable; crop refused.");
|
|
48
|
+
let original = photon.PhotonImage.new_from_byteslice(bytes);
|
|
49
|
+
try {
|
|
50
|
+
if (original.get_width() !== source.width || original.get_height() !== source.height)
|
|
51
|
+
throw new Error("Decoded screenshot dimensions changed.");
|
|
52
|
+
let cropped = photon.crop(original, region.x, region.y, region.x + region.width, region.y + region.height);
|
|
53
|
+
try {
|
|
54
|
+
bytes = cropped.get_bytes();
|
|
55
|
+
} finally {
|
|
56
|
+
cropped.free();
|
|
57
|
+
}
|
|
58
|
+
} finally {
|
|
59
|
+
original.free();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
let ratio = Math.min(1, 1280 / Math.max(region.width, region.height), Math.sqrt(1e6 / (region.width * region.height))), resized = await resizeImage(bytes, "image/png", {
|
|
63
|
+
maxWidth: Math.max(1, Math.floor(region.width * ratio)),
|
|
64
|
+
maxHeight: Math.max(1, Math.floor(region.height * ratio)),
|
|
65
|
+
maxBytes: 1.5 * 1024 * 1024
|
|
66
|
+
});
|
|
67
|
+
if (!resized || resized.originalWidth !== region.width || resized.originalHeight !== region.height || resized.width < 1 || resized.height < 1 || resized.width > 1280 || resized.height > 1280 || resized.width * resized.height > 1e6)
|
|
68
|
+
throw new Error("Screenshot could not be decoded within the image budget.");
|
|
69
|
+
return {
|
|
70
|
+
image: { type: "image", data: resized.data, mimeType: resized.mimeType },
|
|
71
|
+
width: resized.width,
|
|
72
|
+
height: resized.height,
|
|
73
|
+
sourceWidth: source.width,
|
|
74
|
+
sourceHeight: source.height,
|
|
75
|
+
region,
|
|
76
|
+
scaleX: region.width / resized.width,
|
|
77
|
+
scaleY: region.height / resized.height
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// packages/coding-agent/dist/core/computer-use/lease.js
|
|
82
|
+
var import_proper_lockfile = __toESM(require_proper_lockfile(), 1);
|
|
83
|
+
import { randomUUID } from "node:crypto";
|
|
84
|
+
import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
85
|
+
import { userInfo } from "node:os";
|
|
86
|
+
import { join } from "node:path";
|
|
87
|
+
var DesktopLease = class {
|
|
88
|
+
identity = randomUUID();
|
|
89
|
+
owned = !1;
|
|
90
|
+
tail = Promise.resolve();
|
|
91
|
+
closed = !1;
|
|
92
|
+
controller = new AbortController();
|
|
93
|
+
get signal() {
|
|
94
|
+
return this.controller.signal;
|
|
95
|
+
}
|
|
96
|
+
directory;
|
|
97
|
+
constructor(directory = join(userInfo().homedir, ".lunr", "desktop")) {
|
|
98
|
+
this.directory = directory;
|
|
99
|
+
}
|
|
100
|
+
async owner() {
|
|
101
|
+
try {
|
|
102
|
+
let value = JSON.parse(await readFile(join(this.directory, "workflow-owner.json"), "utf8"));
|
|
103
|
+
if (!value || typeof value != "object" || !("pid" in value) || typeof value.pid != "number" || !Number.isInteger(value.pid) || value.pid < 1 || !("identity" in value) || typeof value.identity != "string")
|
|
104
|
+
throw new Error("Invalid desktop owner record; refusing takeover.");
|
|
105
|
+
let processes = "processes" in value ? value.processes : [];
|
|
106
|
+
if (!Array.isArray(processes) || !processes.every((pid) => Number.isInteger(pid) && pid > 0))
|
|
107
|
+
throw new Error("Invalid runtime owner record; refusing takeover.");
|
|
108
|
+
return { pid: value.pid, identity: value.identity, processes };
|
|
109
|
+
} catch (error) {
|
|
110
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
111
|
+
return;
|
|
112
|
+
throw error;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async withOwnerLock(operation) {
|
|
116
|
+
let release = await import_proper_lockfile.default.lock(this.directory, {
|
|
117
|
+
lockfilePath: join(this.directory, "workflow-acquire.lock"),
|
|
118
|
+
retries: 0,
|
|
119
|
+
stale: 1e4
|
|
120
|
+
});
|
|
121
|
+
try {
|
|
122
|
+
await operation();
|
|
123
|
+
} finally {
|
|
124
|
+
await release();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async writeOwner(owner) {
|
|
128
|
+
let temporary = join(this.directory, `workflow-owner-${randomUUID()}.tmp`);
|
|
129
|
+
try {
|
|
130
|
+
await writeFile(temporary, JSON.stringify(owner), { mode: 384, flag: "wx" }), await rename(temporary, join(this.directory, "workflow-owner.json"));
|
|
131
|
+
} finally {
|
|
132
|
+
await rm(temporary, { force: !0 });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async acquire() {
|
|
136
|
+
await assertOwnedPath(this.directory), await mkdir(this.directory, { recursive: !0, mode: 448 }), await this.withOwnerLock(async () => {
|
|
137
|
+
let owner = await this.owner();
|
|
138
|
+
if (owner && [owner.pid, ...owner.processes].some((pid) => {
|
|
139
|
+
try {
|
|
140
|
+
return process.kill(pid, 0), !0;
|
|
141
|
+
} catch (error) {
|
|
142
|
+
return !(error instanceof Error && "code" in error && error.code === "ESRCH");
|
|
143
|
+
}
|
|
144
|
+
}))
|
|
145
|
+
throw new Error("Desktop busy: another lunR workflow owns this user's desktop. Retry only after it ends.");
|
|
146
|
+
await this.writeOwner({ pid: process.pid, identity: this.identity }), this.owned = !0;
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
async trackProcess(pid) {
|
|
150
|
+
await this.withOwnerLock(async () => {
|
|
151
|
+
let owner = await this.owner();
|
|
152
|
+
if (!owner || owner.identity !== this.identity || !Number.isInteger(pid) || pid < 1)
|
|
153
|
+
throw new Error("Cannot bind runtime to the desktop lease.");
|
|
154
|
+
owner.processes.includes(pid) || owner.processes.push(pid), await this.writeOwner(owner);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
run(operation, signal) {
|
|
158
|
+
let result = this.tail.then(async () => {
|
|
159
|
+
if (this.closed)
|
|
160
|
+
throw new Error("Desktop workflow ended. Start a new workflow and observe again.");
|
|
161
|
+
if (signal?.throwIfAborted(), this.owned || await this.acquire(), (await this.owner())?.identity !== this.identity)
|
|
162
|
+
throw this.closed = !0, this.controller.abort(new Error("Desktop lease lost.")), new Error("Desktop lease lost. Input refused.");
|
|
163
|
+
return signal?.throwIfAborted(), operation();
|
|
164
|
+
});
|
|
165
|
+
return this.tail = result.catch(() => {
|
|
166
|
+
}), result;
|
|
167
|
+
}
|
|
168
|
+
async close() {
|
|
169
|
+
this.closed = !0, this.controller.abort(), await this.tail, this.owned && (await this.withOwnerLock(async () => {
|
|
170
|
+
(await this.owner())?.identity === this.identity && await rm(join(this.directory, "workflow-owner.json"));
|
|
171
|
+
}), this.owned = !1);
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
// packages/coding-agent/dist/core/computer-use/workflow.js
|
|
176
|
+
function driverData(reply) {
|
|
177
|
+
if (reply.structuredContent && typeof reply.structuredContent == "object" && !Array.isArray(reply.structuredContent))
|
|
178
|
+
return Object.fromEntries(Object.entries(reply.structuredContent));
|
|
179
|
+
if (Array.isArray(reply.content)) {
|
|
180
|
+
for (let item of reply.content)
|
|
181
|
+
if (!(item.type !== "text" || typeof item.text != "string"))
|
|
182
|
+
try {
|
|
183
|
+
let value = JSON.parse(item.text);
|
|
184
|
+
if (value && typeof value == "object" && !Array.isArray(value))
|
|
185
|
+
return Object.fromEntries(Object.entries(value));
|
|
186
|
+
} catch {
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return {};
|
|
190
|
+
}
|
|
191
|
+
function driverRefused(reply) {
|
|
192
|
+
let data = driverData(reply), acknowledged = data.activated === !0 || data.success === !0 || data.verified === !0 || data.effect === "confirmed", uncertain = [data.status, data.effect].some((value) => value === "partial" || value === "unverifiable");
|
|
193
|
+
return reply.isError === !0 || data.refusal !== void 0 && data.refusal !== null && data.refusal !== !1 || data.error !== void 0 && data.error !== null && data.error !== !1 || data.effect === "refused" || data.status === "refused" || data.status === "failed" || data.success === !1 || data.code === "window_target_mismatch" || data.status !== void 0 && !acknowledged && !uncertain && !["ok", "success", "completed"].includes(String(data.status)) || data.code !== void 0 && data.code !== 0 && !acknowledged && !uncertain;
|
|
194
|
+
}
|
|
195
|
+
function record(value) {
|
|
196
|
+
return value !== null && typeof value == "object" && !Array.isArray(value) ? Object.fromEntries(Object.entries(value)) : {};
|
|
197
|
+
}
|
|
198
|
+
function select(data, keys) {
|
|
199
|
+
let result = {};
|
|
200
|
+
for (let key of keys) {
|
|
201
|
+
let value = data[key];
|
|
202
|
+
typeof value == "string" ? result[key] = value.slice(0, 240) : (typeof value == "boolean" || typeof value == "number" && Number.isFinite(value)) && (result[key] = value);
|
|
203
|
+
}
|
|
204
|
+
return result;
|
|
205
|
+
}
|
|
206
|
+
function typingRecovery(data, text) {
|
|
207
|
+
if (typeof text != "string")
|
|
208
|
+
return {};
|
|
209
|
+
let requested = data.requested_chars, delivered = data.delivered_chars;
|
|
210
|
+
if (typeof requested != "number" || !Number.isSafeInteger(requested) || requested < 0 || requested > 2e4 || requested !== Array.from(text).length)
|
|
211
|
+
return {};
|
|
212
|
+
let validDelivered = typeof delivered == "number" && Number.isSafeInteger(delivered) && delivered >= 0 && delivered <= requested;
|
|
213
|
+
return {
|
|
214
|
+
requested_chars: requested,
|
|
215
|
+
delivered_chars: validDelivered ? delivered : void 0,
|
|
216
|
+
retryable: typeof data.retryable == "boolean" ? data.retryable : void 0,
|
|
217
|
+
retry_from_character: validDelivered && data.retry_from_character === delivered ? delivered : void 0
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
function outcome(reply, text) {
|
|
221
|
+
let data = driverData(reply), message = Array.isArray(reply.content) ? reply.content.find((item) => item.type === "text" && typeof item.text == "string") : void 0;
|
|
222
|
+
return {
|
|
223
|
+
...select(data, ["status", "effect", "refusal", "error", "code", "path", "verified", "verify", "success", "activated"]),
|
|
224
|
+
refusal: typeof data.refusal == "object" && data.refusal !== null ? select(record(data.refusal), ["code", "message", "facility"]) : select(data, ["refusal"]).refusal,
|
|
225
|
+
error: typeof data.error == "object" && data.error !== null ? select(record(data.error), ["code", "message", "facility"]) : select(data, ["error"]).error,
|
|
226
|
+
message: Object.keys(data).length === 0 && message?.type === "text" ? String(message.text).slice(0, 240) : void 0,
|
|
227
|
+
escalation: record(data.escalation).recommended === "foreground" ? "foreground" : void 0,
|
|
228
|
+
input: driverRefused(reply) ? "refused_or_failed" : "dispatched",
|
|
229
|
+
applicationEffect: "unverified",
|
|
230
|
+
...typingRecovery(data, text)
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
function abortable(pending, signal) {
|
|
234
|
+
return new Promise((resolve, reject) => {
|
|
235
|
+
let abort = () => {
|
|
236
|
+
signal.removeEventListener("abort", abort), reject(signal.reason ?? new Error("Computer operation cancelled."));
|
|
237
|
+
};
|
|
238
|
+
signal.addEventListener("abort", abort, { once: !0 }), pending.then((value) => {
|
|
239
|
+
signal.removeEventListener("abort", abort), resolve(value);
|
|
240
|
+
}, (error) => {
|
|
241
|
+
signal.removeEventListener("abort", abort), reject(error);
|
|
242
|
+
}), signal.aborted && abort();
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
function targetFrom(input) {
|
|
246
|
+
if (input.desktop === !0) {
|
|
247
|
+
if (input.pid !== void 0 || input.window_id !== void 0)
|
|
248
|
+
throw new Error("Desktop target cannot include pid/window_id.");
|
|
249
|
+
return { desktop: !0 };
|
|
250
|
+
}
|
|
251
|
+
if (typeof input.pid != "number" || !Number.isInteger(input.pid) || input.pid < 1 || typeof input.window_id != "number" || !Number.isInteger(input.window_id) || input.window_id < 1)
|
|
252
|
+
throw new Error("Window target requires positive integer pid and window_id.");
|
|
253
|
+
return { pid: input.pid, window_id: input.window_id };
|
|
254
|
+
}
|
|
255
|
+
function sameTarget(a, b) {
|
|
256
|
+
return a.desktop === !0 ? b.desktop === !0 : b.desktop !== !0 && a.pid === b.pid && a.window_id === b.window_id;
|
|
257
|
+
}
|
|
258
|
+
var ComputerWorkflow = class {
|
|
259
|
+
observation;
|
|
260
|
+
lastCapture;
|
|
261
|
+
lastAction;
|
|
262
|
+
abort = new AbortController();
|
|
263
|
+
closing;
|
|
264
|
+
driver;
|
|
265
|
+
lease;
|
|
266
|
+
constructor(driver, lease = new DesktopLease()) {
|
|
267
|
+
this.driver = driver, this.lease = lease, this.driver.setProcessObserver?.((pid) => this.lease.trackProcess(pid));
|
|
268
|
+
}
|
|
269
|
+
fresh(input, previous) {
|
|
270
|
+
if (!previous || previous.token !== input.observation || !sameTarget(previous.target, targetFrom(input)) || Date.now() - previous.time > 3e4)
|
|
271
|
+
throw new Error("Stale observation. Capture this exact target again before acting.");
|
|
272
|
+
return previous;
|
|
273
|
+
}
|
|
274
|
+
async capture(target, signal, previous, crop) {
|
|
275
|
+
let time = Date.now(), reply = await abortable(this.driver.call(target.desktop ? "get_desktop_state" : "get_window_state", target.desktop ? {} : { pid: target.pid, window_id: target.window_id, include_accessibility_tree: !1, include_screenshot: !0, max_dimension: 2560 }, signal), signal);
|
|
276
|
+
if (driverRefused(reply))
|
|
277
|
+
throw new Error(`Capture refused: ${JSON.stringify(outcome(reply))}`);
|
|
278
|
+
let data = driverData(reply), images = Array.isArray(reply.content) ? reply.content.filter((item) => item.type === "image") : [];
|
|
279
|
+
if (images.length !== 1 || typeof images[0].data != "string" || typeof images[0].mimeType != "string")
|
|
280
|
+
throw new Error("Capture must return exactly one screenshot.");
|
|
281
|
+
let image = { type: "image", data: images[0].data, mimeType: images[0].mimeType }, dimensions = screenshotDimensions(image);
|
|
282
|
+
if (data.screenshot_frame_valid === !1 || data.screenshot_error != null || dimensions.width !== data.screenshot_width || dimensions.height !== data.screenshot_height)
|
|
283
|
+
throw new Error("Screenshot dimensions or frame could not be verified. Capture again.");
|
|
284
|
+
let geometry = JSON.stringify(select(record(data.window_bounds), ["x", "y", "width", "height"]));
|
|
285
|
+
if (crop && previous && (previous.sourceWidth !== dimensions.width || previous.sourceHeight !== dimensions.height || previous.geometry !== geometry))
|
|
286
|
+
throw new Error("Target geometry changed. Capture a full image before selecting a crop.");
|
|
287
|
+
let prepared = await abortable(prepareComputerImage(image, crop), signal);
|
|
288
|
+
return signal.throwIfAborted(), {
|
|
289
|
+
...prepared,
|
|
290
|
+
token: randomUUID2(),
|
|
291
|
+
target,
|
|
292
|
+
time,
|
|
293
|
+
geometry,
|
|
294
|
+
fingerprint: createHash("sha256").update(image.data).digest("hex")
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
imageResult(observation, extra = {}) {
|
|
298
|
+
this.observation = observation;
|
|
299
|
+
let { width, height, region, sourceWidth, sourceHeight, scaleX, scaleY, target, token } = observation;
|
|
300
|
+
return {
|
|
301
|
+
content: [{ type: "text", text: JSON.stringify({
|
|
302
|
+
...extra,
|
|
303
|
+
observation: token,
|
|
304
|
+
target,
|
|
305
|
+
image: { width, height },
|
|
306
|
+
mapping: { sourceWidth, sourceHeight, ...region, scaleX, scaleY },
|
|
307
|
+
coordinates: "Use returned-image pixels; mapping is applied automatically."
|
|
308
|
+
}) }, observation.image],
|
|
309
|
+
details: { observation: token },
|
|
310
|
+
isError: !1
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
crop(input, previous) {
|
|
314
|
+
let crop = record(input.crop), { x, y, width, height } = crop;
|
|
315
|
+
if (typeof x != "number" || typeof y != "number" || typeof width != "number" || typeof height != "number" || ![x, y, width, height].every(Number.isFinite) || x < 0 || y < 0 || width <= 0 || height <= 0 || x + width > previous.width || y + height > previous.height || Object.keys(crop).some((key) => !["x", "y", "width", "height"].includes(key)))
|
|
316
|
+
throw new Error("Crop must fit the latest returned image.");
|
|
317
|
+
let left = Math.floor(previous.region.x + x * previous.scaleX), top = Math.floor(previous.region.y + y * previous.scaleY), right = Math.min(previous.sourceWidth, Math.ceil(previous.region.x + (x + width) * previous.scaleX)), bottom = Math.min(previous.sourceHeight, Math.ceil(previous.region.y + (y + height) * previous.scaleY));
|
|
318
|
+
return { x: left, y: top, width: right - left, height: bottom - top };
|
|
319
|
+
}
|
|
320
|
+
action(name, input, previous) {
|
|
321
|
+
let args = previous.target.desktop ? { scope: "desktop" } : { pid: previous.target.pid, window_id: previous.target.window_id };
|
|
322
|
+
if (previous.target.desktop && input.foreground !== !0)
|
|
323
|
+
throw new Error("Desktop input requires foreground=true.");
|
|
324
|
+
name !== "computer_window" && (args.delivery_mode = input.foreground === !0 ? "foreground" : "background");
|
|
325
|
+
for (let key of ["x", "y", "from_x", "from_y", "to_x", "to_y"]) {
|
|
326
|
+
if (name === "computer_window")
|
|
327
|
+
break;
|
|
328
|
+
let value = input[key];
|
|
329
|
+
if (value === void 0)
|
|
330
|
+
continue;
|
|
331
|
+
let horizontal = key.endsWith("x");
|
|
332
|
+
if (typeof value != "number" || !Number.isFinite(value) || value < 0 || value >= (horizontal ? previous.width : previous.height))
|
|
333
|
+
throw new Error("Coordinate outside the observed image.");
|
|
334
|
+
args[key] = (horizontal ? previous.region.x : previous.region.y) + value * (horizontal ? previous.scaleX : previous.scaleY);
|
|
335
|
+
}
|
|
336
|
+
if (input.x === void 0 != (input.y === void 0))
|
|
337
|
+
throw new Error("Provide a complete x/y pair.");
|
|
338
|
+
if (previous.target.desktop && ["computer_key", "computer_text"].includes(name) && input.x !== void 0)
|
|
339
|
+
throw new Error("Desktop keyboard input uses the observed focused field. Change focus with a separate grounded click.");
|
|
340
|
+
let operation;
|
|
341
|
+
switch (name) {
|
|
342
|
+
case "computer_click":
|
|
343
|
+
case "computer_scroll":
|
|
344
|
+
if (input.x === void 0 || input.y === void 0)
|
|
345
|
+
throw new Error("This action requires x/y image coordinates.");
|
|
346
|
+
operation = name === "computer_click" ? "click" : "scroll";
|
|
347
|
+
for (let key of name === "computer_click" ? ["button", "count", "modifier"] : ["direction", "amount", "by"])
|
|
348
|
+
input[key] !== void 0 && (args[key] = input[key]);
|
|
349
|
+
break;
|
|
350
|
+
case "computer_drag":
|
|
351
|
+
if (!["from_x", "from_y", "to_x", "to_y"].every((key) => typeof args[key] == "number"))
|
|
352
|
+
throw new Error("Drag requires both endpoints.");
|
|
353
|
+
operation = "drag";
|
|
354
|
+
break;
|
|
355
|
+
case "computer_key":
|
|
356
|
+
if (input.key === void 0 == (input.keys === void 0))
|
|
357
|
+
throw new Error("Provide key OR keys.");
|
|
358
|
+
operation = input.keys === void 0 ? "press_key" : "hotkey", args[input.keys === void 0 ? "key" : "keys"] = input.keys ?? input.key;
|
|
359
|
+
break;
|
|
360
|
+
case "computer_text":
|
|
361
|
+
operation = "type_text", args.text = input.text;
|
|
362
|
+
break;
|
|
363
|
+
case "computer_window":
|
|
364
|
+
if (previous.target.desktop)
|
|
365
|
+
throw new Error("Window management requires an exact window target.");
|
|
366
|
+
if (input.action === "frame") {
|
|
367
|
+
for (let key of ["x", "y", "width", "height"]) {
|
|
368
|
+
let value = input[key];
|
|
369
|
+
if (typeof value != "number" || !Number.isFinite(value) || ["width", "height"].includes(key) && value <= 0)
|
|
370
|
+
throw new Error("Frame requires valid x/y/width/height.");
|
|
371
|
+
args[key] = value;
|
|
372
|
+
}
|
|
373
|
+
operation = "set_window_frame";
|
|
374
|
+
} else if (input.action === "focus" && ["x", "y", "width", "height"].every((key) => input[key] === void 0))
|
|
375
|
+
operation = "bring_to_front";
|
|
376
|
+
else
|
|
377
|
+
throw new Error("Use frame or focus. Minimize/restore uses a fresh image click on the visible control.");
|
|
378
|
+
break;
|
|
379
|
+
default:
|
|
380
|
+
throw new Error("Unknown computer action.");
|
|
381
|
+
}
|
|
382
|
+
return { operation, args };
|
|
383
|
+
}
|
|
384
|
+
async execute(name, input, signal) {
|
|
385
|
+
let combined = AbortSignal.any([this.abort.signal, this.lease.signal, AbortSignal.timeout(9e4), ...signal ? [signal] : []]);
|
|
386
|
+
try {
|
|
387
|
+
let result = await this.lease.run(async () => {
|
|
388
|
+
if (!Object.hasOwn(computerSchemas, name))
|
|
389
|
+
throw new Error("Unknown computer operation.");
|
|
390
|
+
let schema = computerSchemas[name];
|
|
391
|
+
if (Object.keys(input).some((key) => !Object.hasOwn(schema.properties, key)))
|
|
392
|
+
throw new Error("Unsupported computer argument. Use image coordinates only.");
|
|
393
|
+
let previous = this.observation;
|
|
394
|
+
if (this.observation = void 0, name === "computer_apps" || name === "computer_launch") {
|
|
395
|
+
let operation2 = name === "computer_launch" ? "launch_app" : input.pid === void 0 ? "list_apps" : "list_windows", offset = input.offset ?? 0;
|
|
396
|
+
if (typeof offset != "number" || !Number.isSafeInteger(offset) || offset < 0)
|
|
397
|
+
throw new Error("Discovery offset must be a nonnegative safe integer.");
|
|
398
|
+
let args2 = name === "computer_launch" ? { name: input.name } : input.pid === void 0 ? {} : { pid: input.pid }, reply2 = await abortable(this.driver.call(operation2, args2, combined), combined), data = driverData(reply2), rows = data.apps ?? data.windows, metadata = Array.isArray(rows) ? rows.slice(offset, offset + 50).map((row) => {
|
|
399
|
+
let item = record(row);
|
|
400
|
+
return {
|
|
401
|
+
...select(item, ["pid", "window_id", "name", "app_name", "title", "active", "running", "is_on_screen", "minimized"]),
|
|
402
|
+
bounds: item.bounds ? select(record(item.bounds), ["x", "y", "width", "height"]) : void 0
|
|
403
|
+
};
|
|
404
|
+
}) : void 0, remaining = Array.isArray(rows) ? Math.max(0, rows.length - offset - (metadata?.length ?? 0)) : 0;
|
|
405
|
+
return { content: [{ type: "text", text: JSON.stringify({
|
|
406
|
+
...outcome(reply2),
|
|
407
|
+
...select(data, ["pid", "window_id", "name", "title"]),
|
|
408
|
+
items: metadata,
|
|
409
|
+
offset,
|
|
410
|
+
total: Array.isArray(rows) ? rows.length : void 0,
|
|
411
|
+
omitted: remaining || void 0,
|
|
412
|
+
next_offset: remaining ? offset + 50 : void 0,
|
|
413
|
+
guidance: name === "computer_launch" ? "Capture the exact target before input." : remaining ? "Pass next_offset as offset with the same pid selection. Lists refresh per call." : void 0
|
|
414
|
+
}) }], details: {}, isError: driverRefused(reply2) };
|
|
415
|
+
}
|
|
416
|
+
let target = targetFrom(input);
|
|
417
|
+
if (name === "computer_observe") {
|
|
418
|
+
let crop = input.crop === void 0 ? void 0 : this.crop(input, this.fresh(input, previous)), captured = await this.capture(target, combined, previous, crop), unchanged = this.lastCapture?.fingerprint === captured.fingerprint && sameTarget(this.lastCapture.target, target), repeats = crop ? 0 : unchanged ? (this.lastCapture?.repeats ?? 0) + 1 : 1;
|
|
419
|
+
return this.lastCapture = { fingerprint: captured.fingerprint, target, repeats }, repeats >= 3 ? {
|
|
420
|
+
content: [{ type: "text", text: "Three captures are unchanged. Workflow stopped; stop polling and reconsider the target or approach. No input token issued." }],
|
|
421
|
+
details: {},
|
|
422
|
+
isError: !0
|
|
423
|
+
} : this.imageResult(captured, { unchanged });
|
|
424
|
+
}
|
|
425
|
+
let grounded = this.fresh(input, previous), { operation, args } = this.action(name, input, grounded), { button = "left", count = 1, modifier = [], ...clickArgs } = args, signature = JSON.stringify({ operation, args: operation === "click" ? { ...clickArgs, button, count, modifier: Array.isArray(modifier) ? [...new Set(modifier)].sort() : modifier } : args });
|
|
426
|
+
if (this.lastAction?.unchanged && this.lastAction.signature === signature && this.lastAction.fingerprint === grounded.fingerprint)
|
|
427
|
+
throw new Error("The identical action had no visible change. Choose a different grounded action; never retry blindly.");
|
|
428
|
+
let reply = await abortable(this.driver.call(operation, args, combined), combined);
|
|
429
|
+
combined.throwIfAborted();
|
|
430
|
+
let actionOutcome = outcome(reply, name === "computer_text" ? input.text : void 0), recoveryGuidance = "retry_from_character" in actionOutcome && actionOutcome.retry_from_character !== void 0 ? "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." : void 0;
|
|
431
|
+
if (driverRefused(reply))
|
|
432
|
+
return { content: [{ type: "text", text: JSON.stringify({
|
|
433
|
+
...actionOutcome,
|
|
434
|
+
guidance: recoveryGuidance ?? "Capture again before deciding; never retry input blindly."
|
|
435
|
+
}) }], details: {}, isError: !0 };
|
|
436
|
+
try {
|
|
437
|
+
let after = await this.capture(target, combined), unchanged = after.fingerprint === grounded.fingerprint;
|
|
438
|
+
return this.lastAction = { signature, fingerprint: after.fingerprint, unchanged }, this.lastCapture = { fingerprint: after.fingerprint, target, repeats: 0 }, this.imageResult(after, {
|
|
439
|
+
...actionOutcome,
|
|
440
|
+
unchanged,
|
|
441
|
+
guidance: 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.")
|
|
442
|
+
});
|
|
443
|
+
} catch (error) {
|
|
444
|
+
return combined.throwIfAborted(), { content: [{ type: "text", text: JSON.stringify({
|
|
445
|
+
...actionOutcome,
|
|
446
|
+
observation: "unavailable",
|
|
447
|
+
guidance: recoveryGuidance ?? "Input may have taken effect. Capture again before deciding; never repeat blindly.",
|
|
448
|
+
error: error instanceof Error ? error.message.slice(0, 300) : "Post-action capture failed."
|
|
449
|
+
}) }], details: {}, isError: !0 };
|
|
450
|
+
}
|
|
451
|
+
}, combined);
|
|
452
|
+
return result.isError && await this.close(), result;
|
|
453
|
+
} catch (error) {
|
|
454
|
+
throw await this.close(), new Error(`Computer workflow stopped. Input may have taken effect; observe before deciding, never retry blindly. ${error instanceof Error ? error.message : String(error)}`);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
close() {
|
|
458
|
+
return this.abort.abort(), this.observation = void 0, this.closing ??= this.stop(), this.closing;
|
|
459
|
+
}
|
|
460
|
+
async stop() {
|
|
461
|
+
await this.driver.close(), await this.lease.close();
|
|
462
|
+
}
|
|
463
|
+
};
|
|
464
|
+
export {
|
|
465
|
+
ComputerWorkflow,
|
|
466
|
+
driverData,
|
|
467
|
+
driverRefused
|
|
468
|
+
};
|
|
@@ -14,8 +14,8 @@ import {
|
|
|
14
14
|
} from "./chunk-XBWPBZBN.js";
|
|
15
15
|
import {
|
|
16
16
|
extractHeadingTitle
|
|
17
|
-
} from "./chunk-
|
|
18
|
-
import "./chunk-
|
|
17
|
+
} from "./chunk-WJVFOIB5.js";
|
|
18
|
+
import "./chunk-7NBZ5P7I.js";
|
|
19
19
|
import {
|
|
20
20
|
activityMonitor
|
|
21
21
|
} from "./chunk-DAPBPCBP.js";
|