@zenalexa/unicli 0.221.1 → 0.222.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/AGENTS.md +2 -2
  2. package/README.md +29 -22
  3. package/README.zh-CN.md +26 -22
  4. package/crates/unicli-atspi/src/errors.rs +2 -2
  5. package/crates/unicli-uia/src/errors.rs +1 -1
  6. package/dist/commands/compute.d.ts.map +1 -1
  7. package/dist/commands/compute.js +1 -1
  8. package/dist/commands/compute.js.map +1 -1
  9. package/dist/commands/doctor-compute.js +11 -7
  10. package/dist/commands/doctor-compute.js.map +1 -1
  11. package/dist/commands/lint.js +3 -3
  12. package/dist/commands/lint.js.map +1 -1
  13. package/dist/commands/migrate-schema.d.ts.map +1 -1
  14. package/dist/commands/migrate-schema.js +26 -22
  15. package/dist/commands/migrate-schema.js.map +1 -1
  16. package/dist/discovery/loader.d.ts.map +1 -1
  17. package/dist/discovery/loader.js +47 -2
  18. package/dist/discovery/loader.js.map +1 -1
  19. package/dist/electron-apps.d.ts +1 -1
  20. package/dist/electron-apps.d.ts.map +1 -1
  21. package/dist/electron-apps.js +2 -2
  22. package/dist/electron-apps.js.map +1 -1
  23. package/dist/engine/executor.d.ts +1 -1
  24. package/dist/engine/executor.js +7 -7
  25. package/dist/engine/executor.js.map +1 -1
  26. package/dist/engine/repair/remedies.js +3 -3
  27. package/dist/engine/repair/remedies.js.map +1 -1
  28. package/dist/engine/steps/desktop-ax.d.ts +4 -0
  29. package/dist/engine/steps/desktop-ax.d.ts.map +1 -1
  30. package/dist/engine/steps/desktop-ax.js +8 -0
  31. package/dist/engine/steps/desktop-ax.js.map +1 -1
  32. package/dist/engine/steps/desktop-sidecar.d.ts +1 -1
  33. package/dist/engine/steps/desktop-sidecar.js +1 -1
  34. package/dist/engine/steps/index.d.ts +1 -1
  35. package/dist/engine/steps/index.d.ts.map +1 -1
  36. package/dist/engine/steps/index.js +1 -1
  37. package/dist/engine/steps/index.js.map +1 -1
  38. package/dist/engine/steps/visual.d.ts +47 -0
  39. package/dist/engine/steps/visual.d.ts.map +1 -0
  40. package/dist/engine/steps/visual.js +66 -0
  41. package/dist/engine/steps/visual.js.map +1 -0
  42. package/dist/engine/transport/mcp-browser.d.ts +1 -1
  43. package/dist/engine/transport/mcp-browser.js +1 -1
  44. package/dist/manifest-compact.txt +2 -2
  45. package/dist/manifest-search.json +1 -1
  46. package/dist/manifest.json +68 -54
  47. package/dist/transport/adapters/desktop-atspi.js +1 -1
  48. package/dist/transport/adapters/desktop-atspi.js.map +1 -1
  49. package/dist/transport/adapters/desktop-ax-background-activation-swift.d.ts +9 -0
  50. package/dist/transport/adapters/desktop-ax-background-activation-swift.d.ts.map +1 -0
  51. package/dist/transport/adapters/desktop-ax-background-activation-swift.js +99 -0
  52. package/dist/transport/adapters/desktop-ax-background-activation-swift.js.map +1 -0
  53. package/dist/transport/adapters/desktop-ax-background-click-swift.d.ts.map +1 -1
  54. package/dist/transport/adapters/desktop-ax-background-click-swift.js +10 -133
  55. package/dist/transport/adapters/desktop-ax-background-click-swift.js.map +1 -1
  56. package/dist/transport/adapters/desktop-ax-background-click.d.ts +1 -3
  57. package/dist/transport/adapters/desktop-ax-background-click.d.ts.map +1 -1
  58. package/dist/transport/adapters/desktop-ax-background-click.js +1 -69
  59. package/dist/transport/adapters/desktop-ax-background-click.js.map +1 -1
  60. package/dist/transport/adapters/desktop-ax-background-dispatch-swift.d.ts +9 -0
  61. package/dist/transport/adapters/desktop-ax-background-dispatch-swift.d.ts.map +1 -0
  62. package/dist/transport/adapters/desktop-ax-background-dispatch-swift.js +169 -0
  63. package/dist/transport/adapters/desktop-ax-background-dispatch-swift.js.map +1 -0
  64. package/dist/transport/adapters/desktop-ax-background-input-swift.d.ts +23 -0
  65. package/dist/transport/adapters/desktop-ax-background-input-swift.d.ts.map +1 -0
  66. package/dist/transport/adapters/desktop-ax-background-input-swift.js +157 -0
  67. package/dist/transport/adapters/desktop-ax-background-input-swift.js.map +1 -0
  68. package/dist/transport/adapters/desktop-ax-background-input.d.ts +13 -0
  69. package/dist/transport/adapters/desktop-ax-background-input.d.ts.map +1 -0
  70. package/dist/transport/adapters/desktop-ax-background-input.js +124 -0
  71. package/dist/transport/adapters/desktop-ax-background-input.js.map +1 -0
  72. package/dist/transport/adapters/desktop-ax-background-window-swift.d.ts +9 -0
  73. package/dist/transport/adapters/desktop-ax-background-window-swift.d.ts.map +1 -0
  74. package/dist/transport/adapters/desktop-ax-background-window-swift.js +110 -0
  75. package/dist/transport/adapters/desktop-ax-background-window-swift.js.map +1 -0
  76. package/dist/transport/adapters/desktop-ax-swift.d.ts +1 -0
  77. package/dist/transport/adapters/desktop-ax-swift.d.ts.map +1 -1
  78. package/dist/transport/adapters/desktop-ax-swift.js +1 -0
  79. package/dist/transport/adapters/desktop-ax-swift.js.map +1 -1
  80. package/dist/transport/adapters/desktop-ax.d.ts +4 -1
  81. package/dist/transport/adapters/desktop-ax.d.ts.map +1 -1
  82. package/dist/transport/adapters/desktop-ax.js +57 -6
  83. package/dist/transport/adapters/desktop-ax.js.map +1 -1
  84. package/dist/transport/adapters/desktop-uia.js +1 -1
  85. package/dist/transport/adapters/desktop-uia.js.map +1 -1
  86. package/dist/transport/adapters/visual.d.ts +114 -0
  87. package/dist/transport/adapters/visual.d.ts.map +1 -0
  88. package/dist/transport/adapters/visual.js +473 -0
  89. package/dist/transport/adapters/visual.js.map +1 -0
  90. package/dist/transport/bus.d.ts +1 -1
  91. package/dist/transport/bus.js +3 -3
  92. package/dist/transport/bus.js.map +1 -1
  93. package/dist/transport/capability.d.ts.map +1 -1
  94. package/dist/transport/capability.js +32 -30
  95. package/dist/transport/capability.js.map +1 -1
  96. package/dist/transport/cascade.js +27 -27
  97. package/dist/transport/cascade.js.map +1 -1
  98. package/dist/transport/types.d.ts +5 -5
  99. package/dist/transport/types.d.ts.map +1 -1
  100. package/dist/transport/types.js +1 -1
  101. package/docs/operate/compute.md +20 -7
  102. package/docs/operate/focus-behavior.md +21 -12
  103. package/docs/operate/troubleshooting.md +17 -12
  104. package/package.json +5 -11
  105. package/server.json +2 -2
  106. package/skills/unicli/SKILL.md +1 -1
  107. package/skills/unicli-claude-code/SKILL.md +1 -1
  108. package/skills/unicli-hermes/SKILL.md +1 -1
  109. package/skills/unicli-repair/references/error-codes.md +7 -7
  110. package/src/adapters/_archived/README.md +6 -6
  111. package/src/adapters/_archived/apple-music/rate-album.yaml +15 -15
  112. package/src/adapters/_archived/archive.json +2 -2
  113. package/src/adapters/figma/export-selected.yaml +16 -16
  114. package/src/adapters/openalex/works.test.ts +40 -32
  115. package/src/adapters/zoom/toggle-mute.yaml +1 -1
  116. package/dist/engine/steps/cua.d.ts +0 -41
  117. package/dist/engine/steps/cua.d.ts.map +0 -1
  118. package/dist/engine/steps/cua.js +0 -59
  119. package/dist/engine/steps/cua.js.map +0 -1
  120. package/dist/transport/adapters/cua.d.ts +0 -239
  121. package/dist/transport/adapters/cua.d.ts.map +0 -1
  122. package/dist/transport/adapters/cua.js +0 -661
  123. package/dist/transport/adapters/cua.js.map +0 -1
  124. package/src/adapters/cua/bench-list.yaml +0 -28
  125. package/src/adapters/cua/bench-run.yaml +0 -40
@@ -0,0 +1,169 @@
1
+ /**
2
+ * @owner src/transport/adapters/desktop-ax-background-dispatch-swift.ts
3
+ * @does Generate Swift for pid-addressed mouse, text, and key-combo dispatch.
4
+ * @needs AppKit NSEvent factories, CoreGraphics event APIs, Carbon virtual key constants
5
+ * @feeds desktop-ax background input Swift generator
6
+ * @breaks Bad key maps or event ordering can drop input or leave modifier keys pressed.
7
+ */
8
+ export function swiftBackgroundDispatcherSupportCode() {
9
+ return [
10
+ `struct ScopedWindowInputDispatcher {`,
11
+ ` let targetPID: pid_t`,
12
+ ` let windowNumber: Int`,
13
+ ` let windowFrame: CGRect`,
14
+ ` let keySource = CGEventSource(stateID: .hidSystemState)`,
15
+ ` func click(atScreenPoint point: CGPoint, buttonIndex: Int, clickCount: Int) throws {`,
16
+ ` let button = cgButton(buttonIndex)`,
17
+ ` let types = mouseTypes(buttonIndex)`,
18
+ ` let clampedCount = max(1, min(3, clickCount))`,
19
+ ` for index in 1...clampedCount {`,
20
+ ` let state = index`,
21
+ ` let down = try makeMouse(types.down, point: point, button: button, clickState: state, pressure: 1)`,
22
+ ` let up = try makeMouse(types.up, point: point, button: button, clickState: state, pressure: 0)`,
23
+ ` down.postToPid(targetPID)`,
24
+ ` usleep(30_000)`,
25
+ ` up.postToPid(targetPID)`,
26
+ ` if index < clampedCount { usleep(80_000) }`,
27
+ ` }`,
28
+ ` }`,
29
+ ` func typeText(_ text: String) throws {`,
30
+ ` for character in text {`,
31
+ ` let units = Array(String(character).utf16)`,
32
+ ` try units.withUnsafeBufferPointer { buffer in`,
33
+ ` guard let base = buffer.baseAddress, buffer.count > 0 else { return }`,
34
+ ` let down = try makeKey(keyCode: 0, flags: [], isDown: true)`,
35
+ ` down.keyboardSetUnicodeString(stringLength: buffer.count, unicodeString: base)`,
36
+ ` postKey(down)`,
37
+ ` let up = try makeKey(keyCode: 0, flags: [], isDown: false)`,
38
+ ` up.keyboardSetUnicodeString(stringLength: buffer.count, unicodeString: base)`,
39
+ ` postKey(up)`,
40
+ ` }`,
41
+ ` usleep(1_000)`,
42
+ ` }`,
43
+ ` }`,
44
+ ` func press(_ raw: String) throws {`,
45
+ ` let combo = try KeyCombination.parse(raw)`,
46
+ ` for modifier in combo.modifiers { postKey(try makeKey(keyCode: modifier.virtualKey, flags: modifier.flags, isDown: true)) }`,
47
+ ` let combined = combo.modifiers.reduce(into: CGEventFlags()) { acc, modifier in acc.formUnion(modifier.flags) }`,
48
+ ` postKey(try makeKey(keyCode: combo.keyCode, flags: combined, isDown: true))`,
49
+ ` postKey(try makeKey(keyCode: combo.keyCode, flags: combined, isDown: false))`,
50
+ ` var remaining = combined`,
51
+ ` for modifier in combo.modifiers.reversed() {`,
52
+ ` remaining.subtract(modifier.flags)`,
53
+ ` postKey(try makeKey(keyCode: modifier.virtualKey, flags: remaining, isDown: false))`,
54
+ ` }`,
55
+ ` }`,
56
+ ` private func makeMouse(_ type: CGEventType, point: CGPoint, button: CGMouseButton, clickState: Int, pressure: Double) throws -> CGEvent {`,
57
+ ` let modifierFlags: NSEvent.ModifierFlags = appIsActive(pid: targetPID) ? [] : [.command]`,
58
+ ` guard let nsEvent = NSEvent.mouseEvent(`,
59
+ ` with: nsMouseType(type),`,
60
+ ` location: point,`,
61
+ ` modifierFlags: modifierFlags,`,
62
+ ` timestamp: ProcessInfo.processInfo.systemUptime,`,
63
+ ` windowNumber: windowNumber,`,
64
+ ` context: nil,`,
65
+ ` eventNumber: nextSyntheticMouseEventNumber(),`,
66
+ ` clickCount: clickState,`,
67
+ ` pressure: Float(pressure)`,
68
+ ` ), let event = nsEvent.cgEvent else { throw BackgroundInputError.eventCreate("mouse") }`,
69
+ ` stampWindow(event, targetPID: targetPID, windowNumber: windowNumber, windowFrame: windowFrame, point: point, buttonNumber: Int64(button.rawValue), clickState: Int64(clickState), pressure: pressure)`,
70
+ ` return event`,
71
+ ` }`,
72
+ ` private func nsMouseType(_ type: CGEventType) -> NSEvent.EventType {`,
73
+ ` switch type {`,
74
+ ` case .rightMouseDown: return .rightMouseDown`,
75
+ ` case .rightMouseUp: return .rightMouseUp`,
76
+ ` case .otherMouseDown: return .otherMouseDown`,
77
+ ` case .otherMouseUp: return .otherMouseUp`,
78
+ ` case .leftMouseUp: return .leftMouseUp`,
79
+ ` default: return .leftMouseDown`,
80
+ ` }`,
81
+ ` }`,
82
+ ` private func makeKey(keyCode: CGKeyCode, flags: CGEventFlags, isDown: Bool) throws -> CGEvent {`,
83
+ ` guard let event = CGEvent(keyboardEventSource: keySource, virtualKey: keyCode, keyDown: isDown) else { throw BackgroundInputError.eventCreate("keyboard") }`,
84
+ ` event.flags = flags`,
85
+ ` event.setIntegerValueField(.eventTargetUnixProcessID, value: Int64(targetPID))`,
86
+ ` event.setWindowAddressingFields(windowNumber: windowNumber)`,
87
+ ` return event`,
88
+ ` }`,
89
+ ` private func postKey(_ event: CGEvent) { event.postToPid(targetPID) }`,
90
+ `}`,
91
+ ``,
92
+ `var syntheticMouseEventNumber = 1`,
93
+ `func nextSyntheticMouseEventNumber() -> Int {`,
94
+ ` defer { syntheticMouseEventNumber += 1 }`,
95
+ ` return syntheticMouseEventNumber`,
96
+ `}`,
97
+ ``,
98
+ `func appIsActive(pid: pid_t) -> Bool {`,
99
+ ` NSWorkspace.shared.runningApplications.first { $0.processIdentifier == pid }?.isActive == true`,
100
+ `}`,
101
+ ``,
102
+ `func cgButton(_ index: Int) -> CGMouseButton {`,
103
+ ` if index == 1 { return .right }`,
104
+ ` if index == 2 { return .center }`,
105
+ ` return .left`,
106
+ `}`,
107
+ ``,
108
+ `func mouseTypes(_ index: Int) -> (down: CGEventType, up: CGEventType) {`,
109
+ ` if index == 1 { return (.rightMouseDown, .rightMouseUp) }`,
110
+ ` if index == 2 { return (.otherMouseDown, .otherMouseUp) }`,
111
+ ` return (.leftMouseDown, .leftMouseUp)`,
112
+ `}`,
113
+ ``,
114
+ `struct KeyCombination {`,
115
+ ` let modifiers: [KeyModifier]`,
116
+ ` let keyCode: CGKeyCode`,
117
+ ` static func parse(_ raw: String) throws -> KeyCombination {`,
118
+ ` let segments = raw.split(separator: "+").map { $0.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() }`,
119
+ ` guard let final = segments.last, !final.isEmpty else { throw BackgroundInputError.invalidCombo(raw) }`,
120
+ ` let modifiers = try segments.dropLast().map(KeyModifier.init(token:))`,
121
+ ` return KeyCombination(modifiers: modifiers, keyCode: try keyCode(for: final))`,
122
+ ` }`,
123
+ ` private static func keyCode(for token: String) throws -> CGKeyCode {`,
124
+ ` if token.count == 1, let scalar = token.unicodeScalars.first {`,
125
+ ` switch scalar {`,
126
+ ` case "a"..."z": return alphaKeyCodes[String(scalar)]!`,
127
+ ` case "0"..."9": return digitKeyCodes[String(scalar)]!`,
128
+ ` default: break`,
129
+ ` }`,
130
+ ` }`,
131
+ ` guard let keyCode = namedKeyCodes[token] else { throw BackgroundInputError.unsupportedKey(token) }`,
132
+ ` return keyCode`,
133
+ ` }`,
134
+ `}`,
135
+ ``,
136
+ `struct KeyModifier {`,
137
+ ` let flags: CGEventFlags`,
138
+ ` let virtualKey: CGKeyCode`,
139
+ ` init(token: String) throws {`,
140
+ ` switch token {`,
141
+ ` case "shift": flags = .maskShift; virtualKey = CGKeyCode(kVK_Shift)`,
142
+ ` case "control", "ctrl": flags = .maskControl; virtualKey = CGKeyCode(kVK_Control)`,
143
+ ` case "option", "alt": flags = .maskAlternate; virtualKey = CGKeyCode(kVK_Option)`,
144
+ ` case "command", "cmd", "super", "meta": flags = .maskCommand; virtualKey = CGKeyCode(kVK_Command)`,
145
+ ` default: throw BackgroundInputError.unsupportedKey(token)`,
146
+ ` }`,
147
+ ` }`,
148
+ `}`,
149
+ ``,
150
+ `let alphaKeyCodes: [String: CGKeyCode] = [`,
151
+ ` "a": CGKeyCode(kVK_ANSI_A), "b": CGKeyCode(kVK_ANSI_B), "c": CGKeyCode(kVK_ANSI_C), "d": CGKeyCode(kVK_ANSI_D), "e": CGKeyCode(kVK_ANSI_E), "f": CGKeyCode(kVK_ANSI_F),`,
152
+ ` "g": CGKeyCode(kVK_ANSI_G), "h": CGKeyCode(kVK_ANSI_H), "i": CGKeyCode(kVK_ANSI_I), "j": CGKeyCode(kVK_ANSI_J), "k": CGKeyCode(kVK_ANSI_K), "l": CGKeyCode(kVK_ANSI_L),`,
153
+ ` "m": CGKeyCode(kVK_ANSI_M), "n": CGKeyCode(kVK_ANSI_N), "o": CGKeyCode(kVK_ANSI_O), "p": CGKeyCode(kVK_ANSI_P), "q": CGKeyCode(kVK_ANSI_Q), "r": CGKeyCode(kVK_ANSI_R),`,
154
+ ` "s": CGKeyCode(kVK_ANSI_S), "t": CGKeyCode(kVK_ANSI_T), "u": CGKeyCode(kVK_ANSI_U), "v": CGKeyCode(kVK_ANSI_V), "w": CGKeyCode(kVK_ANSI_W), "x": CGKeyCode(kVK_ANSI_X),`,
155
+ ` "y": CGKeyCode(kVK_ANSI_Y), "z": CGKeyCode(kVK_ANSI_Z),`,
156
+ `]`,
157
+ `let digitKeyCodes: [String: CGKeyCode] = [`,
158
+ ` "0": CGKeyCode(kVK_ANSI_0), "1": CGKeyCode(kVK_ANSI_1), "2": CGKeyCode(kVK_ANSI_2), "3": CGKeyCode(kVK_ANSI_3), "4": CGKeyCode(kVK_ANSI_4),`,
159
+ ` "5": CGKeyCode(kVK_ANSI_5), "6": CGKeyCode(kVK_ANSI_6), "7": CGKeyCode(kVK_ANSI_7), "8": CGKeyCode(kVK_ANSI_8), "9": CGKeyCode(kVK_ANSI_9),`,
160
+ `]`,
161
+ `let namedKeyCodes: [String: CGKeyCode] = [`,
162
+ ` "space": CGKeyCode(kVK_Space), "tab": CGKeyCode(kVK_Tab), "return": CGKeyCode(kVK_Return), "enter": CGKeyCode(kVK_Return),`,
163
+ ` "escape": CGKeyCode(kVK_Escape), "esc": CGKeyCode(kVK_Escape), "delete": CGKeyCode(kVK_Delete), "backspace": CGKeyCode(kVK_Delete),`,
164
+ ` "forward-delete": CGKeyCode(kVK_ForwardDelete), "left": CGKeyCode(kVK_LeftArrow), "right": CGKeyCode(kVK_RightArrow), "up": CGKeyCode(kVK_UpArrow),`,
165
+ ` "down": CGKeyCode(kVK_DownArrow), "home": CGKeyCode(kVK_Home), "end": CGKeyCode(kVK_End), "pageup": CGKeyCode(kVK_PageUp), "pagedown": CGKeyCode(kVK_PageDown),`,
166
+ `]`,
167
+ ].join("\n");
168
+ }
169
+ //# sourceMappingURL=desktop-ax-background-dispatch-swift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-ax-background-dispatch-swift.js","sourceRoot":"","sources":["../../../src/transport/adapters/desktop-ax-background-dispatch-swift.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @owner src/transport/adapters/desktop-ax-background-input-swift.ts
3
+ * @does Generate Swift for scoped macOS background window activation and pid-addressed input.
4
+ * @needs desktop-ax target resolution, background activation/window/input Swift fragments
5
+ * @feeds desktop-ax background click/type/press actions
6
+ * @breaks Invalid event fields or focus suppression regressions can steal focus or drop background input.
7
+ */
8
+ import type { ResolvedAxTarget } from "./desktop-ax-swift.js";
9
+ export type AxBackgroundInputAction = "click" | "type_text" | "press_key";
10
+ export interface AxBackgroundInputScriptOptions {
11
+ action: AxBackgroundInputAction;
12
+ x?: number;
13
+ y?: number;
14
+ coordinateSpace: "screen" | "window";
15
+ button: number;
16
+ clickCount: number;
17
+ windowNumber?: number;
18
+ text?: string;
19
+ key?: string;
20
+ clickBeforeText?: boolean;
21
+ }
22
+ export declare function buildAxBackgroundInputScript(target: ResolvedAxTarget, opts: AxBackgroundInputScriptOptions): string;
23
+ //# sourceMappingURL=desktop-ax-background-input-swift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-ax-background-input-swift.d.ts","sourceRoot":"","sources":["../../../src/transport/adapters/desktop-ax-background-input-swift.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAM9D,MAAM,MAAM,uBAAuB,GAAG,OAAO,GAAG,WAAW,GAAG,WAAW,CAAC;AAE1E,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,uBAAuB,CAAC;IAChC,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,8BAA8B,GACnC,MAAM,CAgHR"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * @owner src/transport/adapters/desktop-ax-background-input-swift.ts
3
+ * @does Generate Swift for scoped macOS background window activation and pid-addressed input.
4
+ * @needs desktop-ax target resolution, background activation/window/input Swift fragments
5
+ * @feeds desktop-ax background click/type/press actions
6
+ * @breaks Invalid event fields or focus suppression regressions can steal focus or drop background input.
7
+ */
8
+ import { swiftStringArray, swiftStringLiteral } from "./desktop-ax-swift.js";
9
+ import { swiftBackgroundActivationSupportCode } from "./desktop-ax-background-activation-swift.js";
10
+ import { swiftBackgroundDispatcherSupportCode } from "./desktop-ax-background-dispatch-swift.js";
11
+ import { swiftBackgroundWindowSupportCode } from "./desktop-ax-background-window-swift.js";
12
+ export function buildAxBackgroundInputScript(target, opts) {
13
+ const action = opts.action;
14
+ const x = normalizeNumber(opts.x, 0);
15
+ const y = normalizeNumber(opts.y, 0);
16
+ const hasPoint = typeof opts.x === "number" &&
17
+ Number.isFinite(opts.x) &&
18
+ typeof opts.y === "number" &&
19
+ Number.isFinite(opts.y);
20
+ const coordinateSpace = opts.coordinateSpace === "screen" ? "screen" : "window";
21
+ const button = Math.max(0, Math.trunc(opts.button));
22
+ const clickCount = Math.max(1, Math.trunc(opts.clickCount));
23
+ const windowNumber = opts.windowNumber
24
+ ? Math.max(0, Math.trunc(opts.windowNumber))
25
+ : 0;
26
+ return [
27
+ `import AppKit`,
28
+ `import ApplicationServices`,
29
+ `import Carbon.HIToolbox`,
30
+ `import CoreFoundation`,
31
+ `import CoreGraphics`,
32
+ `import Darwin`,
33
+ `import Foundation`,
34
+ ``,
35
+ ...buildRunningAppPrelude(target),
36
+ swiftEmitHelper(),
37
+ `let commandMode = "background_input"`,
38
+ `let requestedAction = ${swiftStringLiteral(action)}`,
39
+ `let inputX = CGFloat(${x})`,
40
+ `let inputY = CGFloat(${y})`,
41
+ `let hasInputPoint = ${hasPoint ? "true" : "false"}`,
42
+ `let coordinateSpace = ${swiftStringLiteral(coordinateSpace)}`,
43
+ `let buttonIndex = ${button}`,
44
+ `let requestedClickCount = ${clickCount}`,
45
+ `let requestedWindowNumber = ${windowNumber}`,
46
+ `let inputText = ${swiftStringLiteral(opts.text ?? "")}`,
47
+ `let inputKey = ${swiftStringLiteral(opts.key ?? "")}`,
48
+ `let clickBeforeText = ${opts.clickBeforeText === false ? "false" : "true"}`,
49
+ ``,
50
+ swiftSupportCode(),
51
+ ``,
52
+ `guard let running else {`,
53
+ ` emit(["found": false, "posted": false, "mode": commandMode, "action": requestedAction, "bundleId": bundleId, "localizedName": processName, "reason": "target_app_not_running"])`,
54
+ ` exit(0)`,
55
+ `}`,
56
+ ``,
57
+ `guard let window = targetWindow(pid: running.processIdentifier) else {`,
58
+ ` emit(["found": true, "posted": false, "mode": commandMode, "action": requestedAction, "pid": Int(running.processIdentifier), "reason": "window_not_found"])`,
59
+ ` exit(0)`,
60
+ `}`,
61
+ ``,
62
+ `if requestedAction == "click" && !hasInputPoint {`,
63
+ ` emit(["found": true, "posted": false, "mode": commandMode, "action": requestedAction, "pid": Int(running.processIdentifier), "windowNumber": Int(window.id), "reason": "missing_point"])`,
64
+ ` exit(0)`,
65
+ `}`,
66
+ `if requestedAction == "type_text" && inputText.isEmpty {`,
67
+ ` emit(["found": true, "posted": true, "mode": commandMode, "action": requestedAction, "pid": Int(running.processIdentifier), "windowNumber": Int(window.id), "typedCharacters": 0])`,
68
+ ` exit(0)`,
69
+ `}`,
70
+ `if requestedAction == "press_key" && inputKey.isEmpty {`,
71
+ ` emit(["found": true, "posted": false, "mode": commandMode, "action": requestedAction, "pid": Int(running.processIdentifier), "windowNumber": Int(window.id), "reason": "missing_key"])`,
72
+ ` exit(0)`,
73
+ `}`,
74
+ ``,
75
+ `let wasFrontmost = NSWorkspace.shared.frontmostApplication?.processIdentifier == running.processIdentifier`,
76
+ `let activation: ScopedWindowActivationSession?`,
77
+ `if wasFrontmost {`,
78
+ ` activation = nil`,
79
+ `} else {`,
80
+ ` guard let session = ScopedWindowActivationSession.start(targetPID: running.processIdentifier) else {`,
81
+ ` emit(["found": true, "posted": false, "mode": commandMode, "action": requestedAction, "pid": Int(running.processIdentifier), "windowNumber": Int(window.id), "reason": "focus_suppression_tap_failed"])`,
82
+ ` exit(0)`,
83
+ ` }`,
84
+ ` activation = session`,
85
+ `}`,
86
+ `defer {`,
87
+ ` if !wasFrontmost { activation?.restoreBackgroundActivationIfNeeded(windowNumber: Int(window.id)) }`,
88
+ ` activation?.finish()`,
89
+ `}`,
90
+ ``,
91
+ `if !wasFrontmost {`,
92
+ ` activation?.beginTargetDelivery()`,
93
+ ` ScopedWindowActivationSession.activateWindow(targetPID: running.processIdentifier, windowNumber: Int(window.id), windowFrame: window.frame)`,
94
+ ` activation?.holdFocusSuppressionUntilFinish()`,
95
+ `}`,
96
+ ``,
97
+ `let requestedPoint = hasInputPoint ? requestedScreenPoint(windowFrame: window.frame) : CGPoint(x: window.frame.midX, y: window.frame.midY)`,
98
+ `let dispatcher = ScopedWindowInputDispatcher(targetPID: running.processIdentifier, windowNumber: Int(window.id), windowFrame: window.frame)`,
99
+ `do {`,
100
+ ` switch requestedAction {`,
101
+ ` case "click":`,
102
+ ` try dispatcher.click(atScreenPoint: requestedPoint, buttonIndex: buttonIndex, clickCount: requestedClickCount)`,
103
+ ` emitSuccess(window: window, running: running, wasFrontmost: wasFrontmost, extra: ["screenX": Double(requestedPoint.x), "screenY": Double(requestedPoint.y)])`,
104
+ ` case "type_text":`,
105
+ ` if clickBeforeText && hasInputPoint {`,
106
+ ` try dispatcher.click(atScreenPoint: requestedPoint, buttonIndex: 0, clickCount: 1)`,
107
+ ` usleep(30_000)`,
108
+ ` }`,
109
+ ` try dispatcher.typeText(inputText)`,
110
+ ` emitSuccess(window: window, running: running, wasFrontmost: wasFrontmost, extra: ["typedCharacters": inputText.count])`,
111
+ ` case "press_key":`,
112
+ ` try dispatcher.press(inputKey)`,
113
+ ` emitSuccess(window: window, running: running, wasFrontmost: wasFrontmost, extra: ["key": inputKey])`,
114
+ ` default:`,
115
+ ` emit(["found": true, "posted": false, "mode": commandMode, "action": requestedAction, "pid": Int(running.processIdentifier), "windowNumber": Int(window.id), "reason": "unsupported_action"])`,
116
+ ` }`,
117
+ `} catch {`,
118
+ ` emit(["found": true, "posted": false, "mode": commandMode, "action": requestedAction, "pid": Int(running.processIdentifier), "windowNumber": Int(window.id), "reason": String(describing: error)])`,
119
+ `}`,
120
+ ].join("\n");
121
+ }
122
+ function buildRunningAppPrelude(target) {
123
+ return [
124
+ `let bundleId: String? = ${swiftStringLiteral(target.bundleId ?? "")}.isEmpty ? nil : ${swiftStringLiteral(target.bundleId ?? "")}`,
125
+ `let processName: String? = ${swiftStringLiteral(target.processName)}.isEmpty ? nil : ${swiftStringLiteral(target.processName)}`,
126
+ `let executableNames: [String] = ${swiftStringArray(target.executableNames)}`,
127
+ `func matches(_ app: NSRunningApplication) -> Bool {`,
128
+ ` if let bundleId, app.bundleIdentifier == bundleId { return true }`,
129
+ ` if let processName, app.localizedName == processName { return true }`,
130
+ ` if let executable = app.executableURL?.lastPathComponent, executableNames.contains(executable) { return true }`,
131
+ ` return false`,
132
+ `}`,
133
+ `let running = NSWorkspace.shared.runningApplications.first(where: matches)`,
134
+ ];
135
+ }
136
+ function swiftEmitHelper() {
137
+ return [
138
+ `func emit(_ object: [String: Any?]) {`,
139
+ ` let flat = object.reduce(into: [String: Any]()) { acc, item in`,
140
+ ` if let value = item.value { acc[item.key] = value }`,
141
+ ` }`,
142
+ ` let data = try! JSONSerialization.data(withJSONObject: flat, options: [])`,
143
+ ` FileHandle.standardOutput.write(data)`,
144
+ `}`,
145
+ ].join("\n");
146
+ }
147
+ function swiftSupportCode() {
148
+ return [
149
+ swiftBackgroundWindowSupportCode(),
150
+ swiftBackgroundActivationSupportCode(),
151
+ swiftBackgroundDispatcherSupportCode(),
152
+ ].join("\n");
153
+ }
154
+ function normalizeNumber(value, fallback) {
155
+ return String(typeof value === "number" && Number.isFinite(value) ? value : fallback);
156
+ }
157
+ //# sourceMappingURL=desktop-ax-background-input-swift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-ax-background-input-swift.js","sourceRoot":"","sources":["../../../src/transport/adapters/desktop-ax-background-input-swift.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @owner src/transport/adapters/desktop-ax-background-input.ts
3
+ * @does Validate and execute macOS desktop-ax background input actions through generated Swift.
4
+ * @needs desktop-ax shell abstraction, target resolution, background input Swift generator
5
+ * @feeds DesktopAxTransport background click/type/press actions
6
+ * @breaks Bad validation can route unscoped input to the wrong app or hide host permission failures.
7
+ */
8
+ import type { Envelope } from "../../core/envelope.js";
9
+ import type { AxShell } from "./desktop-ax.js";
10
+ export declare function runAxBackgroundClick<T>(shell: AxShell, params: Record<string, unknown>): Promise<Envelope<T>>;
11
+ export declare function runAxBackgroundType<T>(shell: AxShell, params: Record<string, unknown>): Promise<Envelope<T>>;
12
+ export declare function runAxBackgroundPress<T>(shell: AxShell, params: Record<string, unknown>): Promise<Envelope<T>>;
13
+ //# sourceMappingURL=desktop-ax-background-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-ax-background-input.d.ts","sourceRoot":"","sources":["../../../src/transport/adapters/desktop-ax-background-input.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAoB/C,wBAAsB,oBAAoB,CAAC,CAAC,EAC1C,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAMtB;AAED,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAMtB;AAED,wBAAsB,oBAAoB,CAAC,CAAC,EAC1C,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAMtB"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * @owner src/transport/adapters/desktop-ax-background-input.ts
3
+ * @does Validate and execute macOS desktop-ax background input actions through generated Swift.
4
+ * @needs desktop-ax shell abstraction, target resolution, background input Swift generator
5
+ * @feeds DesktopAxTransport background click/type/press actions
6
+ * @breaks Bad validation can route unscoped input to the wrong app or hide host permission failures.
7
+ */
8
+ import { err, exitCodeFor, ok } from "../../core/envelope.js";
9
+ import { buildAxBackgroundInputScript } from "./desktop-ax-background-input-swift.js";
10
+ import { readPositiveInt, resolveAxTarget } from "./desktop-ax-swift.js";
11
+ export async function runAxBackgroundClick(shell, params) {
12
+ return runAxBackgroundInput(shell, params, {
13
+ action: "click",
14
+ sourceAction: "ax_background_click",
15
+ requirePoint: true,
16
+ });
17
+ }
18
+ export async function runAxBackgroundType(shell, params) {
19
+ return runAxBackgroundInput(shell, params, {
20
+ action: "type_text",
21
+ sourceAction: "ax_background_type",
22
+ textParam: typeof params.value === "string" ? "value" : "text",
23
+ });
24
+ }
25
+ export async function runAxBackgroundPress(shell, params) {
26
+ return runAxBackgroundInput(shell, params, {
27
+ action: "press_key",
28
+ sourceAction: "ax_background_press",
29
+ keyParam: typeof params.key === "string" ? "key" : "combo",
30
+ });
31
+ }
32
+ async function runAxBackgroundInput(shell, params, opts) {
33
+ const target = resolveAxTarget(params);
34
+ if (!target) {
35
+ return err({
36
+ transport: "desktop-ax",
37
+ step: 0,
38
+ action: opts.sourceAction,
39
+ reason: "missing target app (`app`, `bundleId`, or `processName`)",
40
+ suggestion: "pass params.app, or supply params.bundleId / params.processName for localized Electron apps",
41
+ exit_code: exitCodeFor("usage_error"),
42
+ });
43
+ }
44
+ const x = typeof params.x === "number" ? params.x : undefined;
45
+ const y = typeof params.y === "number" ? params.y : undefined;
46
+ if (opts.requirePoint && (x === undefined || y === undefined)) {
47
+ return err({
48
+ transport: "desktop-ax",
49
+ step: 0,
50
+ action: opts.sourceAction,
51
+ reason: `missing required param \`${x === undefined ? "x" : "y"}\``,
52
+ suggestion: `pass screen or window-local x/y coordinates to ${opts.sourceAction}`,
53
+ exit_code: exitCodeFor("usage_error"),
54
+ });
55
+ }
56
+ const text = opts.textParam ? readString(params[opts.textParam]) : undefined;
57
+ if (opts.textParam && text === undefined) {
58
+ return missingInputParam(opts.sourceAction, opts.textParam);
59
+ }
60
+ const key = opts.keyParam ? readString(params[opts.keyParam]) : undefined;
61
+ if (opts.keyParam && key === undefined) {
62
+ return missingInputParam(opts.sourceAction, opts.keyParam);
63
+ }
64
+ try {
65
+ const { stdout } = await shell.run("swift", [
66
+ "-e",
67
+ buildAxBackgroundInputScript(target, {
68
+ action: opts.action,
69
+ x,
70
+ y,
71
+ coordinateSpace: params.coordinateSpace === "screen" ? "screen" : "window",
72
+ button: readPositiveInt(params.button, 0),
73
+ clickCount: readPositiveInt(params.clickCount, 1) || 1,
74
+ windowNumber: typeof params.windowNumber === "number"
75
+ ? readPositiveInt(params.windowNumber, 0)
76
+ : undefined,
77
+ text,
78
+ key,
79
+ clickBeforeText: params.clickBeforeText !== false,
80
+ }),
81
+ ], { timeoutMs: 10_000 });
82
+ const result = JSON.parse(stdout.trim());
83
+ if (!result.found || result.posted === false) {
84
+ return err({
85
+ transport: "desktop-ax",
86
+ step: 0,
87
+ action: opts.sourceAction,
88
+ reason: `background input failed in ${target.appName}: ${result.reason ?? "target app/window not found"}`,
89
+ suggestion: "verify the target window is on screen and grant Input Monitoring / Accessibility to the host terminal",
90
+ exit_code: exitCodeFor("service_unavailable"),
91
+ });
92
+ }
93
+ return ok(result);
94
+ }
95
+ catch (e) {
96
+ const msg = e instanceof Error ? e.message : String(e);
97
+ const timeout = /timeout|timed out|ETIMEDOUT/i.test(msg);
98
+ return err({
99
+ transport: "desktop-ax",
100
+ step: 0,
101
+ action: opts.sourceAction,
102
+ reason: msg,
103
+ suggestion: "check app name, Input Monitoring / Accessibility permissions, and that the app is installed",
104
+ retryable: timeout,
105
+ exit_code: timeout
106
+ ? exitCodeFor("temp_failure")
107
+ : exitCodeFor("service_unavailable"),
108
+ });
109
+ }
110
+ }
111
+ function readString(value) {
112
+ return typeof value === "string" ? value : undefined;
113
+ }
114
+ function missingInputParam(action, paramName) {
115
+ return err({
116
+ transport: "desktop-ax",
117
+ step: 0,
118
+ action,
119
+ reason: `missing required param \`${paramName}\``,
120
+ suggestion: `pass params.${paramName} to ${action}`,
121
+ exit_code: exitCodeFor("usage_error"),
122
+ });
123
+ }
124
+ //# sourceMappingURL=desktop-ax-background-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-ax-background-input.js","sourceRoot":"","sources":["../../../src/transport/adapters/desktop-ax-background-input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @owner src/transport/adapters/desktop-ax-background-window-swift.ts
3
+ * @does Generate Swift helpers for target window lookup and CGEvent window addressing.
4
+ * @needs AppKit/CoreGraphics runtime APIs
5
+ * @feeds desktop-ax background input Swift generator
6
+ * @breaks Incorrect window fields can send background input to the wrong macOS window.
7
+ */
8
+ export declare function swiftBackgroundWindowSupportCode(): string;
9
+ //# sourceMappingURL=desktop-ax-background-window-swift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-ax-background-window-swift.d.ts","sourceRoot":"","sources":["../../../src/transport/adapters/desktop-ax-background-window-swift.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,wBAAgB,gCAAgC,IAAI,MAAM,CAqGzD"}