claude-in-mobile 3.13.0 → 4.0.0-dev
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/README.md +61 -574
- package/dist/a11y/types.d.ts +1 -1
- package/dist/a11y/types.d.ts.map +1 -1
- package/dist/adapters/contracts.d.ts +66 -0
- package/dist/adapters/contracts.d.ts.map +1 -0
- package/dist/adapters/contracts.js +15 -0
- package/dist/adapters/contracts.js.map +1 -0
- package/dist/adapters/index.d.ts +0 -5
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +1 -5
- package/dist/adapters/index.js.map +1 -1
- package/dist/autopilot/explorer.js +1 -1
- package/dist/autopilot/explorer.js.map +1 -1
- package/dist/autopilot/healer.d.ts +1 -1
- package/dist/autopilot/healer.d.ts.map +1 -1
- package/dist/autopilot/screen-fingerprint.d.ts +1 -1
- package/dist/autopilot/screen-fingerprint.d.ts.map +1 -1
- package/dist/autopilot/types.d.ts +1 -1
- package/dist/autopilot/types.d.ts.map +1 -1
- package/dist/device/client-cache.d.ts +1 -1
- package/dist/device/client-cache.d.ts.map +1 -1
- package/dist/device/client-cache.js +4 -24
- package/dist/device/client-cache.js.map +1 -1
- package/dist/device/proxies/desktop-facade.d.ts +5 -8
- package/dist/device/proxies/desktop-facade.d.ts.map +1 -1
- package/dist/device/proxies/desktop-facade.js +12 -14
- package/dist/device/proxies/desktop-facade.js.map +1 -1
- package/dist/device-manager.d.ts +16 -16
- package/dist/device-manager.d.ts.map +1 -1
- package/dist/device-manager.js +23 -17
- package/dist/device-manager.js.map +1 -1
- package/dist/index.js +21 -6
- package/dist/index.js.map +1 -1
- package/dist/perf/collector.d.ts +5 -5
- package/dist/perf/collector.d.ts.map +1 -1
- package/dist/perf/collector.js.map +1 -1
- package/dist/plugins/repl/client.d.ts +15 -1
- package/dist/plugins/repl/client.d.ts.map +1 -1
- package/dist/plugins/repl/client.js +65 -8
- package/dist/plugins/repl/client.js.map +1 -1
- package/dist/plugins/repl/index.d.ts +2 -0
- package/dist/plugins/repl/index.d.ts.map +1 -1
- package/dist/plugins/repl/index.js +22 -3
- package/dist/plugins/repl/index.js.map +1 -1
- package/dist/plugins/repl/types.d.ts +6 -0
- package/dist/plugins/repl/types.d.ts.map +1 -1
- package/dist/runtime/bootstrap.d.ts +7 -0
- package/dist/runtime/bootstrap.d.ts.map +1 -1
- package/dist/runtime/bootstrap.js +87 -15
- package/dist/runtime/bootstrap.js.map +1 -1
- package/dist/runtime/cli.d.ts.map +1 -1
- package/dist/runtime/cli.js +14 -0
- package/dist/runtime/cli.js.map +1 -1
- package/dist/runtime/platform-cli.d.ts +24 -0
- package/dist/runtime/platform-cli.d.ts.map +1 -0
- package/dist/runtime/platform-cli.js +116 -0
- package/dist/runtime/platform-cli.js.map +1 -0
- package/dist/runtime/platform-config.d.ts +21 -0
- package/dist/runtime/platform-config.d.ts.map +1 -0
- package/dist/runtime/platform-config.js +71 -0
- package/dist/runtime/platform-config.js.map +1 -0
- package/dist/tools/browser-tools.js.map +1 -1
- package/dist/tools/clipboard-tools.js +1 -1
- package/dist/tools/clipboard-tools.js.map +1 -1
- package/dist/tools/context/hints.d.ts +1 -1
- package/dist/tools/context/hints.d.ts.map +1 -1
- package/dist/tools/context/hints.js +1 -1
- package/dist/tools/context/hints.js.map +1 -1
- package/dist/tools/context/ios-helpers.d.ts +1 -1
- package/dist/tools/context/ios-helpers.d.ts.map +1 -1
- package/dist/tools/context/shared-state-class.d.ts +1 -1
- package/dist/tools/context/shared-state-class.d.ts.map +1 -1
- package/dist/tools/context/shared-state.d.ts +1 -1
- package/dist/tools/context/shared-state.d.ts.map +1 -1
- package/dist/tools/context.d.ts +2 -1
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +17 -9
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/desktop-tools.d.ts.map +1 -1
- package/dist/tools/desktop-tools.js.map +1 -1
- package/dist/tools/flow/common.js +1 -1
- package/dist/tools/flow/common.js.map +1 -1
- package/dist/tools/flow/run.js +1 -1
- package/dist/tools/flow/run.js.map +1 -1
- package/dist/tools/helpers/get-elements.d.ts +1 -1
- package/dist/tools/helpers/get-elements.d.ts.map +1 -1
- package/dist/tools/helpers/get-elements.js +1 -1
- package/dist/tools/helpers/get-elements.js.map +1 -1
- package/dist/tools/helpers/resolve-element.js +1 -1
- package/dist/tools/helpers/resolve-element.js.map +1 -1
- package/dist/tools/screenshot-tools.js +1 -1
- package/dist/tools/screenshot-tools.js.map +1 -1
- package/dist/tools/ui/analyze.js +1 -1
- package/dist/tools/ui/analyze.js.map +1 -1
- package/dist/tools/ui/assert.js +1 -1
- package/dist/tools/ui/assert.js.map +1 -1
- package/dist/tools/ui/find.js +1 -1
- package/dist/tools/ui/find.js.map +1 -1
- package/dist/tools/ui/tree.js +1 -1
- package/dist/tools/ui/tree.js.map +1 -1
- package/dist/tools/ui/wait.js +1 -1
- package/dist/tools/ui/wait.js.map +1 -1
- package/dist/ui-tree/ui-parser/diff-engine.d.ts.map +1 -0
- package/dist/ui-tree/ui-parser/diff-engine.js.map +1 -0
- package/dist/ui-tree/ui-parser/element-builder.d.ts.map +1 -0
- package/dist/ui-tree/ui-parser/element-builder.js.map +1 -0
- package/dist/ui-tree/ui-parser/element-finders.d.ts.map +1 -0
- package/dist/ui-tree/ui-parser/element-finders.js.map +1 -0
- package/dist/ui-tree/ui-parser/formatters/compact.d.ts.map +1 -0
- package/dist/ui-tree/ui-parser/formatters/compact.js.map +1 -0
- package/dist/ui-tree/ui-parser/formatters/full.d.ts.map +1 -0
- package/dist/ui-tree/ui-parser/formatters/full.js.map +1 -0
- package/dist/ui-tree/ui-parser/formatters/index.d.ts.map +1 -0
- package/dist/ui-tree/ui-parser/formatters/index.js.map +1 -0
- package/dist/ui-tree/ui-parser/formatters/semantic.d.ts.map +1 -0
- package/dist/ui-tree/ui-parser/formatters/semantic.js.map +1 -0
- package/dist/ui-tree/ui-parser/node-parser.d.ts.map +1 -0
- package/dist/ui-tree/ui-parser/node-parser.js.map +1 -0
- package/dist/ui-tree/ui-parser/screen-analyzer.d.ts.map +1 -0
- package/dist/ui-tree/ui-parser/screen-analyzer.js.map +1 -0
- package/dist/ui-tree/ui-parser/types.d.ts.map +1 -0
- package/dist/ui-tree/ui-parser/types.js.map +1 -0
- package/dist/ui-tree/ui-parser.d.ts.map +1 -0
- package/dist/ui-tree/ui-parser.js.map +1 -0
- package/dist/ui-tree/ui-scoring.d.ts.map +1 -0
- package/dist/ui-tree/ui-scoring.js.map +1 -0
- package/dist/ui-tree/ui-tree-cache.d.ts.map +1 -0
- package/dist/ui-tree/ui-tree-cache.js.map +1 -0
- package/dist/utils/image/annotate.d.ts +1 -1
- package/dist/utils/image/annotate.d.ts.map +1 -1
- package/package.json +11 -6
- package/dist/adapters/android-adapter.d.ts +0 -64
- package/dist/adapters/android-adapter.d.ts.map +0 -1
- package/dist/adapters/android-adapter.js +0 -164
- package/dist/adapters/android-adapter.js.map +0 -1
- package/dist/adapters/aurora-adapter.d.ts +0 -56
- package/dist/adapters/aurora-adapter.d.ts.map +0 -1
- package/dist/adapters/aurora-adapter.js +0 -118
- package/dist/adapters/aurora-adapter.js.map +0 -1
- package/dist/adapters/browser-adapter.d.ts +0 -51
- package/dist/adapters/browser-adapter.d.ts.map +0 -1
- package/dist/adapters/browser-adapter.js +0 -223
- package/dist/adapters/browser-adapter.js.map +0 -1
- package/dist/adapters/desktop-adapter.d.ts +0 -64
- package/dist/adapters/desktop-adapter.d.ts.map +0 -1
- package/dist/adapters/desktop-adapter.js +0 -202
- package/dist/adapters/desktop-adapter.js.map +0 -1
- package/dist/adapters/ios-adapter.d.ts +0 -60
- package/dist/adapters/ios-adapter.d.ts.map +0 -1
- package/dist/adapters/ios-adapter.js +0 -146
- package/dist/adapters/ios-adapter.js.map +0 -1
- package/dist/adb/client.d.ts +0 -238
- package/dist/adb/client.d.ts.map +0 -1
- package/dist/adb/client.js +0 -462
- package/dist/adb/client.js.map +0 -1
- package/dist/adb/exec.d.ts +0 -23
- package/dist/adb/exec.d.ts.map +0 -1
- package/dist/adb/exec.js +0 -98
- package/dist/adb/exec.js.map +0 -1
- package/dist/adb/index.d.ts +0 -5
- package/dist/adb/index.d.ts.map +0 -1
- package/dist/adb/index.js +0 -3
- package/dist/adb/index.js.map +0 -1
- package/dist/adb/keycodes.d.ts +0 -22
- package/dist/adb/keycodes.d.ts.map +0 -1
- package/dist/adb/keycodes.js +0 -69
- package/dist/adb/keycodes.js.map +0 -1
- package/dist/adb/logcat.d.ts +0 -23
- package/dist/adb/logcat.d.ts.map +0 -1
- package/dist/adb/logcat.js +0 -40
- package/dist/adb/logcat.js.map +0 -1
- package/dist/adb/parsers.d.ts +0 -60
- package/dist/adb/parsers.d.ts.map +0 -1
- package/dist/adb/parsers.js +0 -118
- package/dist/adb/parsers.js.map +0 -1
- package/dist/adb/resolver.d.ts +0 -24
- package/dist/adb/resolver.d.ts.map +0 -1
- package/dist/adb/resolver.js +0 -130
- package/dist/adb/resolver.js.map +0 -1
- package/dist/adb/text-escape.d.ts +0 -23
- package/dist/adb/text-escape.d.ts.map +0 -1
- package/dist/adb/text-escape.js +0 -41
- package/dist/adb/text-escape.js.map +0 -1
- package/dist/adb/ui-parser/diff-engine.d.ts.map +0 -1
- package/dist/adb/ui-parser/diff-engine.js.map +0 -1
- package/dist/adb/ui-parser/element-builder.d.ts.map +0 -1
- package/dist/adb/ui-parser/element-builder.js.map +0 -1
- package/dist/adb/ui-parser/element-finders.d.ts.map +0 -1
- package/dist/adb/ui-parser/element-finders.js.map +0 -1
- package/dist/adb/ui-parser/formatters/compact.d.ts.map +0 -1
- package/dist/adb/ui-parser/formatters/compact.js.map +0 -1
- package/dist/adb/ui-parser/formatters/full.d.ts.map +0 -1
- package/dist/adb/ui-parser/formatters/full.js.map +0 -1
- package/dist/adb/ui-parser/formatters/index.d.ts.map +0 -1
- package/dist/adb/ui-parser/formatters/index.js.map +0 -1
- package/dist/adb/ui-parser/formatters/semantic.d.ts.map +0 -1
- package/dist/adb/ui-parser/formatters/semantic.js.map +0 -1
- package/dist/adb/ui-parser/node-parser.d.ts.map +0 -1
- package/dist/adb/ui-parser/node-parser.js.map +0 -1
- package/dist/adb/ui-parser/screen-analyzer.d.ts.map +0 -1
- package/dist/adb/ui-parser/screen-analyzer.js.map +0 -1
- package/dist/adb/ui-parser/types.d.ts.map +0 -1
- package/dist/adb/ui-parser/types.js.map +0 -1
- package/dist/adb/ui-parser.d.ts.map +0 -1
- package/dist/adb/ui-parser.js.map +0 -1
- package/dist/adb/ui-scoring.d.ts.map +0 -1
- package/dist/adb/ui-scoring.js.map +0 -1
- package/dist/adb/ui-tree-cache.d.ts.map +0 -1
- package/dist/adb/ui-tree-cache.js.map +0 -1
- package/dist/adb/webview.d.ts +0 -59
- package/dist/adb/webview.d.ts.map +0 -1
- package/dist/adb/webview.js +0 -169
- package/dist/adb/webview.js.map +0 -1
- package/dist/aurora/client.d.ts +0 -180
- package/dist/aurora/client.d.ts.map +0 -1
- package/dist/aurora/client.js +0 -324
- package/dist/aurora/client.js.map +0 -1
- package/dist/aurora/index.d.ts +0 -2
- package/dist/aurora/index.d.ts.map +0 -1
- package/dist/aurora/index.js +0 -2
- package/dist/aurora/index.js.map +0 -1
- package/dist/browser/cdp-helpers.d.ts +0 -17
- package/dist/browser/cdp-helpers.d.ts.map +0 -1
- package/dist/browser/cdp-helpers.js +0 -79
- package/dist/browser/cdp-helpers.js.map +0 -1
- package/dist/browser/cdp-types.d.ts +0 -167
- package/dist/browser/cdp-types.d.ts.map +0 -1
- package/dist/browser/cdp-types.js +0 -9
- package/dist/browser/cdp-types.js.map +0 -1
- package/dist/browser/client.d.ts +0 -29
- package/dist/browser/client.d.ts.map +0 -1
- package/dist/browser/client.js +0 -391
- package/dist/browser/client.js.map +0 -1
- package/dist/browser/index.d.ts +0 -5
- package/dist/browser/index.d.ts.map +0 -1
- package/dist/browser/index.js +0 -4
- package/dist/browser/index.js.map +0 -1
- package/dist/browser/key-map.d.ts +0 -16
- package/dist/browser/key-map.d.ts.map +0 -1
- package/dist/browser/key-map.js +0 -35
- package/dist/browser/key-map.js.map +0 -1
- package/dist/browser/session-manager.d.ts +0 -21
- package/dist/browser/session-manager.d.ts.map +0 -1
- package/dist/browser/session-manager.js +0 -109
- package/dist/browser/session-manager.js.map +0 -1
- package/dist/browser/snapshot-builder.d.ts +0 -4
- package/dist/browser/snapshot-builder.d.ts.map +0 -1
- package/dist/browser/snapshot-builder.js +0 -76
- package/dist/browser/snapshot-builder.js.map +0 -1
- package/dist/browser/types.d.ts +0 -75
- package/dist/browser/types.d.ts.map +0 -1
- package/dist/browser/types.js +0 -11
- package/dist/browser/types.js.map +0 -1
- package/dist/desktop/client.d.ts +0 -196
- package/dist/desktop/client.d.ts.map +0 -1
- package/dist/desktop/client.js +0 -540
- package/dist/desktop/client.js.map +0 -1
- package/dist/desktop/gradle.d.ts +0 -45
- package/dist/desktop/gradle.d.ts.map +0 -1
- package/dist/desktop/gradle.js +0 -234
- package/dist/desktop/gradle.js.map +0 -1
- package/dist/desktop/index.d.ts +0 -7
- package/dist/desktop/index.d.ts.map +0 -1
- package/dist/desktop/index.js +0 -7
- package/dist/desktop/index.js.map +0 -1
- package/dist/desktop/launch-options.d.ts +0 -13
- package/dist/desktop/launch-options.d.ts.map +0 -1
- package/dist/desktop/launch-options.js +0 -54
- package/dist/desktop/launch-options.js.map +0 -1
- package/dist/desktop/launchers.d.ts +0 -52
- package/dist/desktop/launchers.d.ts.map +0 -1
- package/dist/desktop/launchers.js +0 -125
- package/dist/desktop/launchers.js.map +0 -1
- package/dist/desktop/log-ring.d.ts +0 -21
- package/dist/desktop/log-ring.d.ts.map +0 -1
- package/dist/desktop/log-ring.js +0 -45
- package/dist/desktop/log-ring.js.map +0 -1
- package/dist/desktop/permission-allowlist.d.ts +0 -47
- package/dist/desktop/permission-allowlist.d.ts.map +0 -1
- package/dist/desktop/permission-allowlist.js +0 -148
- package/dist/desktop/permission-allowlist.js.map +0 -1
- package/dist/desktop/types.d.ts +0 -177
- package/dist/desktop/types.d.ts.map +0 -1
- package/dist/desktop/types.js +0 -5
- package/dist/desktop/types.js.map +0 -1
- package/dist/ios/client.d.ts +0 -194
- package/dist/ios/client.d.ts.map +0 -1
- package/dist/ios/client.js +0 -457
- package/dist/ios/client.js.map +0 -1
- package/dist/ios/index.d.ts +0 -2
- package/dist/ios/index.d.ts.map +0 -1
- package/dist/ios/index.js +0 -2
- package/dist/ios/index.js.map +0 -1
- package/dist/ios/keymap.d.ts +0 -20
- package/dist/ios/keymap.d.ts.map +0 -1
- package/dist/ios/keymap.js +0 -33
- package/dist/ios/keymap.js.map +0 -1
- package/dist/ios/simctl-commands.d.ts +0 -35
- package/dist/ios/simctl-commands.d.ts.map +0 -1
- package/dist/ios/simctl-commands.js +0 -60
- package/dist/ios/simctl-commands.js.map +0 -1
- package/dist/ios/simctl-exec.d.ts +0 -19
- package/dist/ios/simctl-exec.d.ts.map +0 -1
- package/dist/ios/simctl-exec.js +0 -55
- package/dist/ios/simctl-exec.js.map +0 -1
- package/dist/ios/simctl-parsers.d.ts +0 -10
- package/dist/ios/simctl-parsers.d.ts.map +0 -1
- package/dist/ios/simctl-parsers.js +0 -29
- package/dist/ios/simctl-parsers.js.map +0 -1
- package/dist/ios/types.d.ts +0 -8
- package/dist/ios/types.d.ts.map +0 -1
- package/dist/ios/types.js +0 -2
- package/dist/ios/types.js.map +0 -1
- package/dist/ios/wda/index.d.ts +0 -4
- package/dist/ios/wda/index.d.ts.map +0 -1
- package/dist/ios/wda/index.js +0 -4
- package/dist/ios/wda/index.js.map +0 -1
- package/dist/ios/wda/wda-client.d.ts +0 -27
- package/dist/ios/wda/wda-client.d.ts.map +0 -1
- package/dist/ios/wda/wda-client.js +0 -237
- package/dist/ios/wda/wda-client.js.map +0 -1
- package/dist/ios/wda/wda-manager.d.ts +0 -18
- package/dist/ios/wda/wda-manager.d.ts.map +0 -1
- package/dist/ios/wda/wda-manager.js +0 -238
- package/dist/ios/wda/wda-manager.js.map +0 -1
- package/dist/ios/wda/wda-types.d.ts +0 -39
- package/dist/ios/wda/wda-types.d.ts.map +0 -1
- package/dist/ios/wda/wda-types.js +0 -2
- package/dist/ios/wda/wda-types.js.map +0 -1
- package/dist/ios/wda-errors.d.ts +0 -8
- package/dist/ios/wda-errors.d.ts.map +0 -1
- package/dist/ios/wda-errors.js +0 -13
- package/dist/ios/wda-errors.js.map +0 -1
- package/dist/ios/wda-payloads.d.ts +0 -32
- package/dist/ios/wda-payloads.d.ts.map +0 -1
- package/dist/ios/wda-payloads.js +0 -31
- package/dist/ios/wda-payloads.js.map +0 -1
- package/dist/plugins/android/index.d.ts +0 -23
- package/dist/plugins/android/index.d.ts.map +0 -1
- package/dist/plugins/android/index.js +0 -45
- package/dist/plugins/android/index.js.map +0 -1
- package/dist/plugins/aurora/index.d.ts +0 -17
- package/dist/plugins/aurora/index.d.ts.map +0 -1
- package/dist/plugins/aurora/index.js +0 -27
- package/dist/plugins/aurora/index.js.map +0 -1
- package/dist/plugins/desktop/index.d.ts +0 -18
- package/dist/plugins/desktop/index.d.ts.map +0 -1
- package/dist/plugins/desktop/index.js +0 -28
- package/dist/plugins/desktop/index.js.map +0 -1
- package/dist/plugins/ios/index.d.ts +0 -17
- package/dist/plugins/ios/index.d.ts.map +0 -1
- package/dist/plugins/ios/index.js +0 -36
- package/dist/plugins/ios/index.js.map +0 -1
- package/dist/plugins/web/index.d.ts +0 -17
- package/dist/plugins/web/index.d.ts.map +0 -1
- package/dist/plugins/web/index.js +0 -27
- package/dist/plugins/web/index.js.map +0 -1
- /package/dist/{adb → ui-tree}/ui-parser/diff-engine.d.ts +0 -0
- /package/dist/{adb → ui-tree}/ui-parser/diff-engine.js +0 -0
- /package/dist/{adb → ui-tree}/ui-parser/element-builder.d.ts +0 -0
- /package/dist/{adb → ui-tree}/ui-parser/element-builder.js +0 -0
- /package/dist/{adb → ui-tree}/ui-parser/element-finders.d.ts +0 -0
- /package/dist/{adb → ui-tree}/ui-parser/element-finders.js +0 -0
- /package/dist/{adb → ui-tree}/ui-parser/formatters/compact.d.ts +0 -0
- /package/dist/{adb → ui-tree}/ui-parser/formatters/compact.js +0 -0
- /package/dist/{adb → ui-tree}/ui-parser/formatters/full.d.ts +0 -0
- /package/dist/{adb → ui-tree}/ui-parser/formatters/full.js +0 -0
- /package/dist/{adb → ui-tree}/ui-parser/formatters/index.d.ts +0 -0
- /package/dist/{adb → ui-tree}/ui-parser/formatters/index.js +0 -0
- /package/dist/{adb → ui-tree}/ui-parser/formatters/semantic.d.ts +0 -0
- /package/dist/{adb → ui-tree}/ui-parser/formatters/semantic.js +0 -0
- /package/dist/{adb → ui-tree}/ui-parser/node-parser.d.ts +0 -0
- /package/dist/{adb → ui-tree}/ui-parser/node-parser.js +0 -0
- /package/dist/{adb → ui-tree}/ui-parser/screen-analyzer.d.ts +0 -0
- /package/dist/{adb → ui-tree}/ui-parser/screen-analyzer.js +0 -0
- /package/dist/{adb → ui-tree}/ui-parser/types.d.ts +0 -0
- /package/dist/{adb → ui-tree}/ui-parser/types.js +0 -0
- /package/dist/{adb → ui-tree}/ui-parser.d.ts +0 -0
- /package/dist/{adb → ui-tree}/ui-parser.js +0 -0
- /package/dist/{adb → ui-tree}/ui-scoring.d.ts +0 -0
- /package/dist/{adb → ui-tree}/ui-scoring.js +0 -0
- /package/dist/{adb → ui-tree}/ui-tree-cache.d.ts +0 -0
- /package/dist/{adb → ui-tree}/ui-tree-cache.js +0 -0
package/dist/desktop/gradle.js
DELETED
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Gradle task detection and launcher for Compose Desktop projects
|
|
3
|
-
*/
|
|
4
|
-
import { execFileSync, spawn } from "child_process";
|
|
5
|
-
import * as path from "path";
|
|
6
|
-
import * as fs from "fs";
|
|
7
|
-
// Known desktop run task patterns
|
|
8
|
-
const DESKTOP_TASK_PATTERNS = [
|
|
9
|
-
":desktopApp:run",
|
|
10
|
-
":composeApp:desktopRun",
|
|
11
|
-
":desktop:run",
|
|
12
|
-
":app:desktopRun",
|
|
13
|
-
"desktopRun",
|
|
14
|
-
"runDesktop",
|
|
15
|
-
];
|
|
16
|
-
export class GradleLauncher {
|
|
17
|
-
/**
|
|
18
|
-
* Check if Gradle wrapper exists in project
|
|
19
|
-
*/
|
|
20
|
-
hasGradleWrapper(projectPath) {
|
|
21
|
-
const wrapperScript = process.platform === "win32" ? "gradlew.bat" : "gradlew";
|
|
22
|
-
const wrapperPath = path.join(projectPath, wrapperScript);
|
|
23
|
-
return fs.existsSync(wrapperPath);
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Get Gradle executable (wrapper or system gradle)
|
|
27
|
-
*/
|
|
28
|
-
getGradleExecutable(projectPath) {
|
|
29
|
-
if (this.hasGradleWrapper(projectPath)) {
|
|
30
|
-
return process.platform === "win32"
|
|
31
|
-
? path.join(projectPath, "gradlew.bat")
|
|
32
|
-
: path.join(projectPath, "gradlew");
|
|
33
|
-
}
|
|
34
|
-
return "gradle";
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Detect available desktop run tasks in the project
|
|
38
|
-
*/
|
|
39
|
-
async detectDesktopTasks(projectPath) {
|
|
40
|
-
const gradle = this.getGradleExecutable(projectPath);
|
|
41
|
-
try {
|
|
42
|
-
// Run gradle tasks and parse output
|
|
43
|
-
// SECURITY: argv-form invocation (execFileSync) — no /bin/sh -c, shell metachars
|
|
44
|
-
// in `gradle` path or args are passed literally. Mirrors src/adb/client.ts fix (#40).
|
|
45
|
-
const output = execFileSync(gradle, ["tasks", "--all"], {
|
|
46
|
-
cwd: projectPath,
|
|
47
|
-
encoding: "utf-8",
|
|
48
|
-
maxBuffer: 10 * 1024 * 1024,
|
|
49
|
-
timeout: 60000,
|
|
50
|
-
});
|
|
51
|
-
const tasks = [];
|
|
52
|
-
const lines = output.split("\n");
|
|
53
|
-
for (const line of lines) {
|
|
54
|
-
const trimmed = line.trim();
|
|
55
|
-
// Look for task lines (format: "taskName - description" or just "taskName")
|
|
56
|
-
const taskMatch = trimmed.match(/^(:\S+|[a-zA-Z]\S*)\s*(-|$)/);
|
|
57
|
-
if (taskMatch) {
|
|
58
|
-
const taskName = taskMatch[1];
|
|
59
|
-
// Check if it matches known desktop patterns
|
|
60
|
-
for (const pattern of DESKTOP_TASK_PATTERNS) {
|
|
61
|
-
if (taskName.includes(pattern) ||
|
|
62
|
-
taskName.toLowerCase().includes("desktop") && taskName.toLowerCase().includes("run")) {
|
|
63
|
-
tasks.push(taskName);
|
|
64
|
-
break;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
// Deduplicate and sort
|
|
70
|
-
return [...new Set(tasks)].sort();
|
|
71
|
-
}
|
|
72
|
-
catch {
|
|
73
|
-
// Fallback: check common task names directly
|
|
74
|
-
const commonTasks = [];
|
|
75
|
-
for (const pattern of DESKTOP_TASK_PATTERNS) {
|
|
76
|
-
try {
|
|
77
|
-
// SECURITY: argv-form — `pattern` from internal const, single task name (no spaces).
|
|
78
|
-
execFileSync(gradle, [pattern, "--dry-run"], {
|
|
79
|
-
cwd: projectPath,
|
|
80
|
-
encoding: "utf-8",
|
|
81
|
-
timeout: 30000,
|
|
82
|
-
stdio: "pipe",
|
|
83
|
-
});
|
|
84
|
-
commonTasks.push(pattern);
|
|
85
|
-
}
|
|
86
|
-
catch {
|
|
87
|
-
// Task doesn't exist
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
return commonTasks;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Analyze Gradle project and return info
|
|
95
|
-
*/
|
|
96
|
-
async analyzeProject(projectPath) {
|
|
97
|
-
if (!fs.existsSync(projectPath)) {
|
|
98
|
-
throw new Error(`Project path does not exist: ${projectPath}`);
|
|
99
|
-
}
|
|
100
|
-
// Check for build.gradle or build.gradle.kts
|
|
101
|
-
const hasBuildGradle = fs.existsSync(path.join(projectPath, "build.gradle")) ||
|
|
102
|
-
fs.existsSync(path.join(projectPath, "build.gradle.kts"));
|
|
103
|
-
if (!hasBuildGradle) {
|
|
104
|
-
throw new Error(`No build.gradle or build.gradle.kts found in: ${projectPath}`);
|
|
105
|
-
}
|
|
106
|
-
const desktopTasks = await this.detectDesktopTasks(projectPath);
|
|
107
|
-
return {
|
|
108
|
-
path: projectPath,
|
|
109
|
-
desktopTasks,
|
|
110
|
-
selectedTask: desktopTasks[0], // Default to first detected task
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Launch desktop app via Gradle
|
|
115
|
-
* Returns the spawned process
|
|
116
|
-
*/
|
|
117
|
-
launch(options) {
|
|
118
|
-
const { projectPath, task, jvmArgs = [], env = {} } = options;
|
|
119
|
-
if (!projectPath) {
|
|
120
|
-
throw new Error("projectPath is required to launch via Gradle");
|
|
121
|
-
}
|
|
122
|
-
if (!fs.existsSync(projectPath)) {
|
|
123
|
-
throw new Error(`Project path does not exist: ${projectPath}`);
|
|
124
|
-
}
|
|
125
|
-
const gradle = this.getGradleExecutable(projectPath);
|
|
126
|
-
// Determine task to run
|
|
127
|
-
let targetTask = task;
|
|
128
|
-
if (!targetTask) {
|
|
129
|
-
// Auto-detect
|
|
130
|
-
const detected = this.detectDesktopTasksSync(projectPath);
|
|
131
|
-
if (detected.length === 0) {
|
|
132
|
-
throw new Error(`No desktop run task found in project. ` +
|
|
133
|
-
`Please specify task explicitly or ensure project has Compose Desktop configured.`);
|
|
134
|
-
}
|
|
135
|
-
targetTask = detected[0];
|
|
136
|
-
}
|
|
137
|
-
// Build command args
|
|
138
|
-
const args = [targetTask];
|
|
139
|
-
// Add JVM args
|
|
140
|
-
if (jvmArgs.length > 0) {
|
|
141
|
-
args.push(`-Dorg.gradle.jvmargs=${jvmArgs.join(" ")}`);
|
|
142
|
-
}
|
|
143
|
-
// Add --console=plain for cleaner output
|
|
144
|
-
args.push("--console=plain");
|
|
145
|
-
// Merge environment
|
|
146
|
-
const processEnv = {
|
|
147
|
-
...process.env,
|
|
148
|
-
...env,
|
|
149
|
-
};
|
|
150
|
-
// Spawn Gradle process
|
|
151
|
-
const child = spawn(gradle, args, {
|
|
152
|
-
cwd: projectPath,
|
|
153
|
-
env: processEnv,
|
|
154
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
155
|
-
shell: process.platform === "win32",
|
|
156
|
-
});
|
|
157
|
-
return child;
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Synchronous version of detectDesktopTasks (for launch)
|
|
161
|
-
*/
|
|
162
|
-
detectDesktopTasksSync(projectPath) {
|
|
163
|
-
const gradle = this.getGradleExecutable(projectPath);
|
|
164
|
-
const tasks = [];
|
|
165
|
-
// Quick check for common patterns
|
|
166
|
-
for (const pattern of DESKTOP_TASK_PATTERNS) {
|
|
167
|
-
try {
|
|
168
|
-
// SECURITY: argv-form — `pattern` from internal const, single task name (no spaces).
|
|
169
|
-
execFileSync(gradle, [pattern, "--dry-run"], {
|
|
170
|
-
cwd: projectPath,
|
|
171
|
-
encoding: "utf-8",
|
|
172
|
-
timeout: 30000,
|
|
173
|
-
stdio: "pipe",
|
|
174
|
-
});
|
|
175
|
-
tasks.push(pattern);
|
|
176
|
-
}
|
|
177
|
-
catch {
|
|
178
|
-
// Task doesn't exist
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
return tasks;
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* Stop a running Gradle process
|
|
185
|
-
*/
|
|
186
|
-
stop(process) {
|
|
187
|
-
if (process && !process.killed) {
|
|
188
|
-
// Try graceful shutdown first
|
|
189
|
-
process.kill("SIGTERM");
|
|
190
|
-
// Force kill after timeout
|
|
191
|
-
setTimeout(() => {
|
|
192
|
-
if (!process.killed) {
|
|
193
|
-
process.kill("SIGKILL");
|
|
194
|
-
}
|
|
195
|
-
}, 5000);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Check if Gradle daemon is running
|
|
200
|
-
*/
|
|
201
|
-
isGradleDaemonRunning(projectPath) {
|
|
202
|
-
const gradle = this.getGradleExecutable(projectPath);
|
|
203
|
-
try {
|
|
204
|
-
// SECURITY: argv-form invocation — no shell parsing of `gradle` path.
|
|
205
|
-
const output = execFileSync(gradle, ["--status"], {
|
|
206
|
-
cwd: projectPath,
|
|
207
|
-
encoding: "utf-8",
|
|
208
|
-
timeout: 10000,
|
|
209
|
-
});
|
|
210
|
-
return output.includes("IDLE") || output.includes("BUSY");
|
|
211
|
-
}
|
|
212
|
-
catch {
|
|
213
|
-
return false;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Stop Gradle daemon
|
|
218
|
-
*/
|
|
219
|
-
stopGradleDaemon(projectPath) {
|
|
220
|
-
const gradle = this.getGradleExecutable(projectPath);
|
|
221
|
-
try {
|
|
222
|
-
// SECURITY: argv-form invocation — no shell parsing of `gradle` path.
|
|
223
|
-
execFileSync(gradle, ["--stop"], {
|
|
224
|
-
cwd: projectPath,
|
|
225
|
-
encoding: "utf-8",
|
|
226
|
-
timeout: 30000,
|
|
227
|
-
});
|
|
228
|
-
}
|
|
229
|
-
catch {
|
|
230
|
-
// Ignore errors
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
//# sourceMappingURL=gradle.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gradle.js","sourceRoot":"","sources":["../../src/desktop/gradle.ts"],"names":[],"mappings":"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"}
|
package/dist/desktop/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/desktop/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,cAAc,YAAY,CAAC"}
|
package/dist/desktop/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/desktop/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,cAAc,YAAY,CAAC"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pure normalisation of the flat {@link RawLaunchOptions} into the strict
|
|
3
|
-
* discriminated-union {@link LaunchOptions}. Lives next to the DesktopClient
|
|
4
|
-
* but is intentionally stateless so it can be unit-tested in isolation and
|
|
5
|
-
* imported without dragging in the RPC state machine.
|
|
6
|
-
*/
|
|
7
|
-
import type { LaunchOptions, RawLaunchOptions } from "./types.js";
|
|
8
|
-
/**
|
|
9
|
-
* Normalise a flat RawLaunchOptions into the strict discriminated-union LaunchOptions.
|
|
10
|
-
* Throws on conflicting fields (e.g. mode:"gradle" + pid).
|
|
11
|
-
*/
|
|
12
|
-
export declare function normalizeLaunchOptions(raw: RawLaunchOptions): LaunchOptions;
|
|
13
|
-
//# sourceMappingURL=launch-options.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"launch-options.d.ts","sourceRoot":"","sources":["../../src/desktop/launch-options.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAElE;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,GAAG,aAAa,CAoD3E"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pure normalisation of the flat {@link RawLaunchOptions} into the strict
|
|
3
|
-
* discriminated-union {@link LaunchOptions}. Lives next to the DesktopClient
|
|
4
|
-
* but is intentionally stateless so it can be unit-tested in isolation and
|
|
5
|
-
* imported without dragging in the RPC state machine.
|
|
6
|
-
*/
|
|
7
|
-
import { MobileError } from "../errors.js";
|
|
8
|
-
/**
|
|
9
|
-
* Normalise a flat RawLaunchOptions into the strict discriminated-union LaunchOptions.
|
|
10
|
-
* Throws on conflicting fields (e.g. mode:"gradle" + pid).
|
|
11
|
-
*/
|
|
12
|
-
export function normalizeLaunchOptions(raw) {
|
|
13
|
-
// Detect conflicting params: mode-specific fields must not bleed across modes
|
|
14
|
-
if (raw.mode === "gradle" && (raw.bundleId !== undefined || raw.appPath !== undefined || raw.pid !== undefined)) {
|
|
15
|
-
throw new MobileError(`Conflicting launch parameters: mode "gradle" does not accept bundleId, appPath, or pid`, "INVALID_LAUNCH_OPTIONS");
|
|
16
|
-
}
|
|
17
|
-
if (raw.mode === "bundle" && (raw.pid !== undefined || raw.projectPath !== undefined)) {
|
|
18
|
-
throw new MobileError(`Conflicting launch parameters: mode "bundle" does not accept pid or projectPath`, "INVALID_LAUNCH_OPTIONS");
|
|
19
|
-
}
|
|
20
|
-
if (raw.mode === "attach" && (raw.bundleId !== undefined || raw.appPath !== undefined || raw.projectPath !== undefined)) {
|
|
21
|
-
throw new MobileError(`Conflicting launch parameters: mode "attach" does not accept bundleId, appPath, or projectPath`, "INVALID_LAUNCH_OPTIONS");
|
|
22
|
-
}
|
|
23
|
-
if (raw.mode) {
|
|
24
|
-
// Explicit mode — build typed object (do not cast)
|
|
25
|
-
switch (raw.mode) {
|
|
26
|
-
case "gradle":
|
|
27
|
-
if (!raw.projectPath)
|
|
28
|
-
throw new MobileError(`mode "gradle" requires projectPath`, "INVALID_LAUNCH_OPTIONS");
|
|
29
|
-
return { mode: "gradle", projectPath: raw.projectPath, task: raw.task, jvmArgs: raw.jvmArgs, env: raw.env };
|
|
30
|
-
case "bundle":
|
|
31
|
-
if (!raw.bundleId && !raw.appPath)
|
|
32
|
-
throw new MobileError(`mode "bundle" requires bundleId or appPath`, "INVALID_LAUNCH_OPTIONS");
|
|
33
|
-
// After the check, at least one is defined — split to satisfy the XOR union type
|
|
34
|
-
if (raw.bundleId) {
|
|
35
|
-
return { mode: "bundle", bundleId: raw.bundleId, appPath: raw.appPath, env: raw.env };
|
|
36
|
-
}
|
|
37
|
-
return { mode: "bundle", appPath: raw.appPath, env: raw.env };
|
|
38
|
-
case "attach":
|
|
39
|
-
if (raw.pid === undefined)
|
|
40
|
-
throw new MobileError(`mode "attach" requires pid`, "INVALID_LAUNCH_OPTIONS");
|
|
41
|
-
return { mode: "attach", pid: raw.pid };
|
|
42
|
-
case "companion-only":
|
|
43
|
-
return { mode: "companion-only" };
|
|
44
|
-
default:
|
|
45
|
-
throw new MobileError(`Unknown launch mode: "${raw.mode}". Valid values: gradle, bundle, attach, companion-only`, "INVALID_LAUNCH_OPTIONS");
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
// Legacy: infer mode from fields present
|
|
49
|
-
if (raw.projectPath) {
|
|
50
|
-
return { mode: "gradle", projectPath: raw.projectPath, task: raw.task, jvmArgs: raw.jvmArgs, env: raw.env };
|
|
51
|
-
}
|
|
52
|
-
return { mode: "companion-only" };
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=launch-options.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"launch-options.js","sourceRoot":"","sources":["../../src/desktop/launch-options.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* App-launch strategies for the desktop companion.
|
|
3
|
-
*
|
|
4
|
-
* Each strategy encapsulates how a single LaunchOptions variant is realised:
|
|
5
|
-
* `gradle` runs a Gradle task, `bundle` uses `open`/spawn, `attach` validates an
|
|
6
|
-
* existing pid, and `companion-only` is a no-op (the companion runs solo).
|
|
7
|
-
*
|
|
8
|
-
* The strategies are intentionally small and pid-returning so the DesktopClient
|
|
9
|
-
* can stay agnostic about platform details.
|
|
10
|
-
*/
|
|
11
|
-
import type { GradleLauncher } from "./gradle.js";
|
|
12
|
-
import type { LaunchOptions, LogType } from "./types.js";
|
|
13
|
-
/** Strategy interface — returns the targetPid of the launched/attached app, or null. */
|
|
14
|
-
export interface AppLaunchStrategy {
|
|
15
|
-
launch(): Promise<number | null>;
|
|
16
|
-
stop(): void;
|
|
17
|
-
}
|
|
18
|
-
export declare class GradleAppLauncher implements AppLaunchStrategy {
|
|
19
|
-
private readonly opts;
|
|
20
|
-
private readonly gradleLauncher;
|
|
21
|
-
private readonly addLog;
|
|
22
|
-
private userAppProcess;
|
|
23
|
-
constructor(opts: Extract<LaunchOptions, {
|
|
24
|
-
mode: "gradle";
|
|
25
|
-
}>, gradleLauncher: GradleLauncher, addLog: (type: LogType, msg: string) => void);
|
|
26
|
-
launch(): Promise<number | null>;
|
|
27
|
-
stop(): void;
|
|
28
|
-
}
|
|
29
|
-
export declare class BundleAppLauncher implements AppLaunchStrategy {
|
|
30
|
-
private readonly opts;
|
|
31
|
-
private readonly addLog;
|
|
32
|
-
stop(): void;
|
|
33
|
-
constructor(opts: Extract<LaunchOptions, {
|
|
34
|
-
mode: "bundle";
|
|
35
|
-
}>, addLog: (type: LogType, msg: string) => void);
|
|
36
|
-
launch(): Promise<number | null>;
|
|
37
|
-
private getAppPathFromBundleId;
|
|
38
|
-
}
|
|
39
|
-
export declare class AttachLauncher implements AppLaunchStrategy {
|
|
40
|
-
private readonly opts;
|
|
41
|
-
private readonly addLog;
|
|
42
|
-
constructor(opts: Extract<LaunchOptions, {
|
|
43
|
-
mode: "attach";
|
|
44
|
-
}>, addLog: (type: LogType, msg: string) => void);
|
|
45
|
-
launch(): Promise<number | null>;
|
|
46
|
-
stop(): void;
|
|
47
|
-
}
|
|
48
|
-
export declare class NoOpLauncher implements AppLaunchStrategy {
|
|
49
|
-
launch(): Promise<number | null>;
|
|
50
|
-
stop(): void;
|
|
51
|
-
}
|
|
52
|
-
//# sourceMappingURL=launchers.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"launchers.d.ts","sourceRoot":"","sources":["../../src/desktop/launchers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AASzD,wFAAwF;AACxF,MAAM,WAAW,iBAAiB;IAChC,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACjC,IAAI,IAAI,IAAI,CAAC;CACd;AAED,qBAAa,iBAAkB,YAAW,iBAAiB;IAIvD,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM;IALzB,OAAO,CAAC,cAAc,CAA6B;gBAGhC,IAAI,EAAE,OAAO,CAAC,aAAa,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAC,EAChD,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI;IAGzD,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAStC,IAAI,IAAI,IAAI;CAMb;AAED,qBAAa,iBAAkB,YAAW,iBAAiB;IAIvD,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJzB,IAAI,IAAI,IAAI;gBAGO,IAAI,EAAE,OAAO,CAAC,aAAa,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAC,EAChD,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI;IAGzD,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAoDtC,OAAO,CAAC,sBAAsB;CAY/B;AAED,qBAAa,cAAe,YAAW,iBAAiB;IAEpD,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,IAAI,EAAE,OAAO,CAAC,aAAa,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAC,EAChD,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI;IAGzD,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAMtC,IAAI,IAAI,IAAI;CACb;AAED,qBAAa,YAAa,YAAW,iBAAiB;IAC9C,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IACtC,IAAI,IAAI,IAAI;CACb"}
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* App-launch strategies for the desktop companion.
|
|
3
|
-
*
|
|
4
|
-
* Each strategy encapsulates how a single LaunchOptions variant is realised:
|
|
5
|
-
* `gradle` runs a Gradle task, `bundle` uses `open`/spawn, `attach` validates an
|
|
6
|
-
* existing pid, and `companion-only` is a no-op (the companion runs solo).
|
|
7
|
-
*
|
|
8
|
-
* The strategies are intentionally small and pid-returning so the DesktopClient
|
|
9
|
-
* can stay agnostic about platform details.
|
|
10
|
-
*/
|
|
11
|
-
import { execFileSync, spawn } from "child_process";
|
|
12
|
-
import { MobileError } from "../errors.js";
|
|
13
|
-
import { validateBundleId } from "../utils/sanitize.js";
|
|
14
|
-
import { BUNDLE_LAUNCH_POLL_INTERVAL_MS, getBundleIdFromAppPath, resolvePidByBundleId, validateAndResolveAppPath, validateAttachPid, } from "./permission-allowlist.js";
|
|
15
|
-
export class GradleAppLauncher {
|
|
16
|
-
opts;
|
|
17
|
-
gradleLauncher;
|
|
18
|
-
addLog;
|
|
19
|
-
userAppProcess = null;
|
|
20
|
-
constructor(opts, gradleLauncher, addLog) {
|
|
21
|
-
this.opts = opts;
|
|
22
|
-
this.gradleLauncher = gradleLauncher;
|
|
23
|
-
this.addLog = addLog;
|
|
24
|
-
}
|
|
25
|
-
async launch() {
|
|
26
|
-
this.addLog("stdout", `Launching user app from: ${this.opts.projectPath}`);
|
|
27
|
-
// Spread to satisfy RawLaunchOptions (no as any — structural types are compatible)
|
|
28
|
-
this.userAppProcess = this.gradleLauncher.launch({ ...this.opts });
|
|
29
|
-
this.userAppProcess.stdout?.on("data", (data) => this.addLog("stdout", `[UserApp] ${data.toString()}`));
|
|
30
|
-
this.userAppProcess.stderr?.on("data", (data) => this.addLog("stderr", `[UserApp] ${data.toString()}`));
|
|
31
|
-
return null;
|
|
32
|
-
}
|
|
33
|
-
stop() {
|
|
34
|
-
if (this.userAppProcess) {
|
|
35
|
-
this.gradleLauncher.stop(this.userAppProcess);
|
|
36
|
-
this.userAppProcess = null;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
export class BundleAppLauncher {
|
|
41
|
-
opts;
|
|
42
|
-
addLog;
|
|
43
|
-
stop() { }
|
|
44
|
-
constructor(opts, addLog) {
|
|
45
|
-
this.opts = opts;
|
|
46
|
-
this.addLog = addLog;
|
|
47
|
-
}
|
|
48
|
-
async launch() {
|
|
49
|
-
// Both bundleId and appPath are pre-validated by normalizeLaunchOptions — at least one is set.
|
|
50
|
-
const { bundleId, appPath, env } = this.opts;
|
|
51
|
-
const hasEnv = env && Object.keys(env).length > 0;
|
|
52
|
-
let resolvedBundleId;
|
|
53
|
-
let resolvedPath;
|
|
54
|
-
if (bundleId) {
|
|
55
|
-
validateBundleId(bundleId);
|
|
56
|
-
resolvedBundleId = bundleId;
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
resolvedPath = validateAndResolveAppPath(appPath);
|
|
60
|
-
resolvedBundleId = getBundleIdFromAppPath(resolvedPath);
|
|
61
|
-
validateBundleId(resolvedBundleId);
|
|
62
|
-
}
|
|
63
|
-
this.addLog("stdout", `Launching app: ${bundleId ?? resolvedPath}${hasEnv ? ` (with env: ${Object.keys(env).join(", ")})` : ""}`);
|
|
64
|
-
if (hasEnv) {
|
|
65
|
-
// `open` cannot pass env vars to the launched app — spawn the binary directly.
|
|
66
|
-
// resolvedPath is always set when env is used with appPath; derive it from bundleId otherwise.
|
|
67
|
-
const appPath_ = resolvedPath ?? this.getAppPathFromBundleId(resolvedBundleId);
|
|
68
|
-
const binaryName = execFileSync("defaults", ["read", `${appPath_}/Contents/Info`, "CFBundleExecutable"], { encoding: "utf-8", timeout: 3000 }).trim();
|
|
69
|
-
const binaryPath = `${appPath_}/Contents/MacOS/${binaryName}`;
|
|
70
|
-
spawn(binaryPath, [], {
|
|
71
|
-
env: { ...process.env, ...env },
|
|
72
|
-
detached: true,
|
|
73
|
-
stdio: "ignore",
|
|
74
|
-
}).unref();
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
// No env vars needed — use `open` (proper app launch via LaunchServices)
|
|
78
|
-
try {
|
|
79
|
-
if (resolvedPath) {
|
|
80
|
-
// Pass the realpath-resolved path to `open` to prevent TOCTOU
|
|
81
|
-
execFileSync("open", [resolvedPath], { timeout: 5000 });
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
execFileSync("open", ["-b", resolvedBundleId], { timeout: 5000 });
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
catch (e) {
|
|
88
|
-
throw new MobileError(`Failed to launch app "${bundleId ?? resolvedPath}": ${e.message}`, "BUNDLE_LAUNCH_FAILED");
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
this.addLog("stdout", `Waiting for app to start (polling every ${BUNDLE_LAUNCH_POLL_INTERVAL_MS}ms)...`);
|
|
92
|
-
const targetPid = await resolvePidByBundleId(resolvedBundleId);
|
|
93
|
-
this.addLog("stdout", `App started with PID ${targetPid}`);
|
|
94
|
-
return targetPid;
|
|
95
|
-
}
|
|
96
|
-
getAppPathFromBundleId(bundleId) {
|
|
97
|
-
try {
|
|
98
|
-
const result = execFileSync("osascript", ["-e", `POSIX path of (path to application id "${bundleId}")`], { encoding: "utf-8", timeout: 5000 }).trim();
|
|
99
|
-
// Strip trailing slash that osascript adds
|
|
100
|
-
return result.replace(/\/$/, "");
|
|
101
|
-
}
|
|
102
|
-
catch (e) {
|
|
103
|
-
throw new MobileError(`Cannot find app path for bundle ID "${bundleId}": ${e.message}`, "BUNDLE_PATH_NOT_FOUND");
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
export class AttachLauncher {
|
|
108
|
-
opts;
|
|
109
|
-
addLog;
|
|
110
|
-
constructor(opts, addLog) {
|
|
111
|
-
this.opts = opts;
|
|
112
|
-
this.addLog = addLog;
|
|
113
|
-
}
|
|
114
|
-
async launch() {
|
|
115
|
-
validateAttachPid(this.opts.pid);
|
|
116
|
-
this.addLog("stdout", `Attaching to existing process with PID ${this.opts.pid}`);
|
|
117
|
-
return this.opts.pid;
|
|
118
|
-
}
|
|
119
|
-
stop() { }
|
|
120
|
-
}
|
|
121
|
-
export class NoOpLauncher {
|
|
122
|
-
async launch() { return null; }
|
|
123
|
-
stop() { }
|
|
124
|
-
}
|
|
125
|
-
//# sourceMappingURL=launchers.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"launchers.js","sourceRoot":"","sources":["../../src/desktop/launchers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Bounded in-memory ring buffer for desktop companion log entries.
|
|
3
|
-
*
|
|
4
|
-
* Keeps the most recent `maxEntries` lines and supports filtered queries by
|
|
5
|
-
* level, since-timestamp and limit. Once the buffer is full the oldest entry
|
|
6
|
-
* is dropped on every push (FIFO eviction), so the memory footprint of a
|
|
7
|
-
* long-running session stays bounded.
|
|
8
|
-
*/
|
|
9
|
-
import type { LogEntry, LogOptions, LogType } from "./types.js";
|
|
10
|
-
export declare class LogRing {
|
|
11
|
-
private readonly maxEntries;
|
|
12
|
-
private entries;
|
|
13
|
-
constructor(maxEntries?: number);
|
|
14
|
-
/** Append a new log line. Evicts the oldest entry once the buffer is full. */
|
|
15
|
-
push(type: LogType, message: string): void;
|
|
16
|
-
/** Return a copy of the buffer, optionally filtered by type/since/limit. */
|
|
17
|
-
query(options?: LogOptions): LogEntry[];
|
|
18
|
-
/** Drop every buffered entry. */
|
|
19
|
-
clear(): void;
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=log-ring.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"log-ring.d.ts","sourceRoot":"","sources":["../../src/desktop/log-ring.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEhE,qBAAa,OAAO;IAGN,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,OAAO,CAAC,OAAO,CAAkB;gBAEJ,UAAU,GAAE,MAAe;IAExD,8EAA8E;IAC9E,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAY1C,4EAA4E;IAC5E,KAAK,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,QAAQ,EAAE;IAkBvC,iCAAiC;IACjC,KAAK,IAAI,IAAI;CAGd"}
|
package/dist/desktop/log-ring.js
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Bounded in-memory ring buffer for desktop companion log entries.
|
|
3
|
-
*
|
|
4
|
-
* Keeps the most recent `maxEntries` lines and supports filtered queries by
|
|
5
|
-
* level, since-timestamp and limit. Once the buffer is full the oldest entry
|
|
6
|
-
* is dropped on every push (FIFO eviction), so the memory footprint of a
|
|
7
|
-
* long-running session stays bounded.
|
|
8
|
-
*/
|
|
9
|
-
export class LogRing {
|
|
10
|
-
maxEntries;
|
|
11
|
-
entries = [];
|
|
12
|
-
constructor(maxEntries = 10_000) {
|
|
13
|
-
this.maxEntries = maxEntries;
|
|
14
|
-
}
|
|
15
|
-
/** Append a new log line. Evicts the oldest entry once the buffer is full. */
|
|
16
|
-
push(type, message) {
|
|
17
|
-
this.entries.push({
|
|
18
|
-
timestamp: Date.now(),
|
|
19
|
-
type,
|
|
20
|
-
message,
|
|
21
|
-
});
|
|
22
|
-
if (this.entries.length > this.maxEntries) {
|
|
23
|
-
this.entries.shift();
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
/** Return a copy of the buffer, optionally filtered by type/since/limit. */
|
|
27
|
-
query(options) {
|
|
28
|
-
let result = [...this.entries];
|
|
29
|
-
if (options?.type) {
|
|
30
|
-
result = result.filter(log => log.type === options.type);
|
|
31
|
-
}
|
|
32
|
-
if (options?.since) {
|
|
33
|
-
result = result.filter(log => log.timestamp >= options.since);
|
|
34
|
-
}
|
|
35
|
-
if (options?.limit) {
|
|
36
|
-
result = result.slice(-options.limit);
|
|
37
|
-
}
|
|
38
|
-
return result;
|
|
39
|
-
}
|
|
40
|
-
/** Drop every buffered entry. */
|
|
41
|
-
clear() {
|
|
42
|
-
this.entries = [];
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=log-ring.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"log-ring.js","sourceRoot":"","sources":["../../src/desktop/log-ring.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,OAAO,OAAO;IAGW;IAFrB,OAAO,GAAe,EAAE,CAAC;IAEjC,YAA6B,aAAqB,MAAM;QAA3B,eAAU,GAAV,UAAU,CAAiB;IAAG,CAAC;IAE5D,8EAA8E;IAC9E,IAAI,CAAC,IAAa,EAAE,OAAe;QACjC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,IAAI;YACJ,OAAO;SACR,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,OAAoB;QACxB,IAAI,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QAE/B,IAAI,OAAO,EAAE,IAAI,EAAE,CAAC;YAClB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;YACnB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,KAAM,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;YACnB,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,iCAAiC;IACjC,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;CACF"}
|