askui-agent-os 26.1.1__tar.gz

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.
@@ -0,0 +1,386 @@
1
+ Metadata-Version: 2.4
2
+ Name: askui-agent-os
3
+ Version: 26.1.1
4
+ Summary: Platform-specific binaries for the AskUI Remote Device Controller, shipped as a Python package. Used by the AskUI Agent (created with the AskUI Python SDK) to control the local device on Windows, Linux, and macOS.
5
+ Author-email: askui GmbH <support@askui.com>
6
+ License: ================================================================================
7
+ askui GmbH
8
+ Zimmerstraße 3 · 76137 Karlsruhe · Germany
9
+ ================================================================================
10
+
11
+ ASKUI AGENT OS
12
+ TERMS OF SERVICE
13
+
14
+ Effective Date: February 2026
15
+
16
+ --------------------------------------------------------------------------------
17
+ IMPORTANT — READ CAREFULLY
18
+ --------------------------------------------------------------------------------
19
+ By downloading, installing, copying, or otherwise using AskUI Agent OS (the
20
+ "Software"), you agree to be bound by the terms of this Agreement. If you do
21
+ not agree, do not install or use the Software.
22
+
23
+
24
+ ================================================================================
25
+ 1. DEFINITIONS
26
+ ================================================================================
27
+
28
+ "AskUI" means askui GmbH, registered at Zimmerstraße 3, 76137 Karlsruhe,
29
+ Germany (HRB 740125).
30
+
31
+ "Agent OS" or "Software" means the AskUI Agent OS desktop controller
32
+ software, including all updates, patches, documentation, and associated
33
+ files provided by AskUI.
34
+
35
+ "Commercial Use" means any use of the Software in connection with or for the
36
+ benefit of a business, organization, or revenue-generating activity,
37
+ including but not limited to: use in production environments, use for client
38
+ projects, integration into commercial products or services, or use by or on
39
+ behalf of any for-profit entity.
40
+
41
+ "Commercial Licence" means a valid, paid subscription agreement between the
42
+ Licensee and AskUI (such as a SaaS Order Form) that expressly authorises
43
+ Commercial Use of the Software.
44
+
45
+ "Trial Period" means a time-limited evaluation period expressly agreed in
46
+ writing between the Licensee and AskUI, during which the Licensee may use
47
+ the Software for evaluation and testing purposes under the terms specified
48
+ in such agreement.
49
+
50
+ "Licensee" or "You" means the individual or legal entity that downloads,
51
+ installs, or uses the Software.
52
+
53
+ "Non-Commercial Use" means use of the Software solely for personal learning,
54
+ academic research, open-source development, or internal evaluation purposes
55
+ that do not directly or indirectly generate revenue or commercial advantage.
56
+
57
+
58
+ ================================================================================
59
+ 2. LICENCE GRANT
60
+ ================================================================================
61
+
62
+ 2.1 Non-Commercial Licence.
63
+ Subject to the terms of this Agreement, AskUI grants the Licensee a
64
+ limited, non-exclusive, non-transferable, revocable licence to install
65
+ and use the Software solely for Non-Commercial Use. This licence is
66
+ granted free of charge and does not require a separate subscription
67
+ agreement.
68
+
69
+ 2.2 Commercial Use Prohibited Without Licence.
70
+ Commercial Use of the Software is strictly prohibited unless the
71
+ Licensee holds a valid Commercial Licence issued by AskUI. Any
72
+ Commercial Use without a Commercial Licence constitutes a material
73
+ breach of this Agreement and may result in immediate termination of the
74
+ licence and legal action.
75
+
76
+ 2.3 Commercial Licence.
77
+ Licensees who wish to use the Software for Commercial Use must enter
78
+ into a separate Commercial Licence agreement with AskUI (e.g., a SaaS
79
+ Order Form or enterprise agreement). The terms of such Commercial
80
+ Licence shall govern Commercial Use and shall take precedence over this
81
+ Agreement to the extent of any conflict.
82
+
83
+ 2.4 Trial Use.
84
+ AskUI may, at its sole discretion, grant the Licensee a time-limited
85
+ Trial Period for evaluation purposes. Trial use is subject to the
86
+ following conditions:
87
+
88
+ (a) The Trial Period must be agreed in writing between the Licensee and
89
+ AskUI, specifying the duration, scope, and any limitations.
90
+
91
+ (b) During the Trial Period, the Licensee may use the Software for
92
+ internal evaluation and testing only. Production use, client-facing
93
+ use, and revenue-generating activities are not permitted during a
94
+ Trial unless expressly authorised.
95
+
96
+ (c) Upon expiration of the Trial Period, the Licensee must either enter
97
+ into a Commercial Licence or cease all use of the Software and
98
+ uninstall it from all systems.
99
+
100
+ (d) AskUI reserves the right to revoke any Trial at any time and for
101
+ any reason upon written notice.
102
+
103
+
104
+ ================================================================================
105
+ 3. RESTRICTIONS
106
+ ================================================================================
107
+
108
+ The Licensee shall not, and shall not permit any third party to:
109
+
110
+ • Use the Software for any Commercial Use without a valid Commercial
111
+ Licence or an active, authorised Trial Period;
112
+
113
+ • Copy, modify, adapt, translate, or create derivative works of the
114
+ Software, in whole or in part;
115
+
116
+ • Reverse engineer, decompile, disassemble, or otherwise attempt to
117
+ discover the source code, algorithms, or underlying structure of the
118
+ Software;
119
+
120
+ • Distribute, sublicence, lease, rent, loan, or otherwise transfer the
121
+ Software or any rights therein to any third party;
122
+
123
+ • Remove, alter, or obscure any proprietary notices, labels, or
124
+ trademarks on or within the Software;
125
+
126
+ • Use the Software for timesharing, service bureau, managed service, or
127
+ similar purposes for the benefit of third parties;
128
+
129
+ • Use the Software in any manner that violates applicable law or
130
+ regulation;
131
+
132
+ • Circumvent or attempt to circumvent any licence key, activation
133
+ mechanism, usage limit, or technical protection measure incorporated
134
+ into the Software;
135
+
136
+ • Use the Software to develop a competing product or service.
137
+
138
+
139
+ ================================================================================
140
+ 4. INTELLECTUAL PROPERTY
141
+ ================================================================================
142
+
143
+ 4.1 The Software is the proprietary product of AskUI and is protected by
144
+ copyright, trade secret, and other intellectual property laws. AskUI
145
+ and its licensors retain all right, title, and interest in and to the
146
+ Software, including all copies, modifications, and derivative works
147
+ thereof. Nothing in this Agreement transfers ownership of the Software
148
+ to the Licensee.
149
+
150
+ 4.2 All trademarks, service marks, and trade names associated with the
151
+ Software (including "AskUI", "Agent OS", and the AskUI logo) are the
152
+ exclusive property of AskUI. The Licensee is not granted any right to
153
+ use such marks without prior written consent.
154
+
155
+
156
+ ================================================================================
157
+ 5. DATA AND PRIVACY
158
+ ================================================================================
159
+
160
+ 5.1 The Software may collect anonymised, aggregated telemetry data relating
161
+ to system performance, usage patterns, and error diagnostics. This data
162
+ does not include personal data or any content processed by the Software
163
+ during test execution.
164
+
165
+ 5.2 If the Software is used in connection with AskUI's SaaS services (under
166
+ a Commercial Licence), data processing shall be governed by the Data
167
+ Processing Agreement entered into between AskUI and the Licensee.
168
+
169
+ 5.3 AskUI will not use any data processed through the Software to train,
170
+ fine-tune, or improve any artificial intelligence or machine learning
171
+ models. AI models used by the Software are pre-trained and do not learn
172
+ from Licensee data.
173
+
174
+
175
+ ================================================================================
176
+ 6. DISCLAIMER OF WARRANTIES
177
+ ================================================================================
178
+
179
+ THE SOFTWARE IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY
180
+ KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
181
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
182
+ NON-INFRINGEMENT. ASKUI DOES NOT WARRANT THAT THE SOFTWARE WILL BE
183
+ UNINTERRUPTED, ERROR-FREE, OR FREE OF HARMFUL COMPONENTS. THE LICENSEE
184
+ ASSUMES ALL RISK ARISING FROM THE USE OF THE SOFTWARE.
185
+
186
+
187
+ ================================================================================
188
+ 7. LIMITATION OF LIABILITY
189
+ ================================================================================
190
+
191
+ 7.1 TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL
192
+ ASKUI BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, OR
193
+ PUNITIVE DAMAGES, OR ANY LOSS OF PROFITS, REVENUE, DATA, OR BUSINESS
194
+ OPPORTUNITY, ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT OR THE
195
+ USE OF THE SOFTWARE, REGARDLESS OF THE THEORY OF LIABILITY.
196
+
197
+ 7.2 ASKUI'S TOTAL AGGREGATE LIABILITY UNDER THIS AGREEMENT SHALL NOT EXCEED
198
+ THE FEES ACTUALLY PAID BY THE LICENSEE TO ASKUI FOR THE SOFTWARE IN THE
199
+ TWELVE (12) MONTHS PRECEDING THE EVENT GIVING RISE TO THE CLAIM. WHERE
200
+ NO FEES HAVE BEEN PAID (E.G., NON-COMMERCIAL OR TRIAL USE), ASKUI'S
201
+ LIABILITY SHALL BE LIMITED TO FIFTY EUROS (€50).
202
+
203
+ 7.3 The limitations in this Section 7 shall not apply to liability arising
204
+ from AskUI's gross negligence, wilful misconduct, or breach of
205
+ obligations that cannot be limited under mandatory applicable law.
206
+
207
+
208
+ ================================================================================
209
+ 8. TERM AND TERMINATION
210
+ ================================================================================
211
+
212
+ 8.1 This Agreement is effective from the date the Licensee first installs or
213
+ uses the Software and continues until terminated.
214
+
215
+ 8.2 Non-Commercial and Trial Licences. AskUI may terminate this licence at
216
+ any time for any reason upon thirty (30) days' written notice. The
217
+ Licensee may terminate at any time by uninstalling the Software and
218
+ destroying all copies.
219
+
220
+ 8.3 Termination for Breach. AskUI may terminate this Agreement immediately
221
+ upon written notice if the Licensee breaches any term of this Agreement,
222
+ including but not limited to engaging in unauthorised Commercial Use.
223
+
224
+ 8.4 Effect of Termination. Upon termination or expiration of this Agreement,
225
+ the Licensee must immediately cease all use of the Software and
226
+ uninstall or destroy all copies in its possession or control. Sections
227
+ 3, 4, 6, 7, 9, and 10 shall survive termination.
228
+
229
+
230
+ ================================================================================
231
+ 9. COMPLIANCE AND AUDIT
232
+ ================================================================================
233
+
234
+ 9.1 AskUI reserves the right to verify the Licensee's compliance with this
235
+ Agreement, including verification of licence type and usage scope. The
236
+ Licensee agrees to provide reasonable cooperation in connection with
237
+ any compliance verification.
238
+
239
+ 9.2 If an audit reveals unauthorised Commercial Use, the Licensee shall
240
+ promptly pay all applicable licence fees retroactively from the date
241
+ such Commercial Use commenced, plus a surcharge of twenty-five percent
242
+ (25%) of the applicable fees as liquidated damages. This is in addition
243
+ to, and not in lieu of, any other remedies available to AskUI.
244
+
245
+
246
+ ================================================================================
247
+ 10. GOVERNING LAW AND JURISDICTION
248
+ ================================================================================
249
+
250
+ 10.1 This Agreement shall be governed by and construed in accordance with
251
+ the laws of the Federal Republic of Germany, excluding the UN
252
+ Convention on Contracts for the International Sale of Goods (CISG) and
253
+ conflict-of-law rules.
254
+
255
+ 10.2 The exclusive place of jurisdiction for all disputes arising out of or
256
+ in connection with this Agreement shall be Karlsruhe, Germany, to the
257
+ extent permitted by applicable law.
258
+
259
+
260
+ ================================================================================
261
+ 11. EXPORT COMPLIANCE
262
+ ================================================================================
263
+
264
+ The Licensee shall comply with all applicable export control laws and
265
+ regulations, including those of the European Union and Germany. The
266
+ Licensee shall not export, re-export, or transfer the Software to any
267
+ country, entity, or person prohibited by applicable export laws without
268
+ obtaining prior authorisation from the relevant authorities.
269
+
270
+
271
+ ================================================================================
272
+ 12. MISCELLANEOUS
273
+ ================================================================================
274
+
275
+ 12.1 Entire Agreement. This Agreement constitutes the entire agreement
276
+ between the Licensee and AskUI with respect to the non-commercial and
277
+ trial use of the Software. For Commercial Use, the applicable
278
+ Commercial Licence agreement shall govern.
279
+
280
+ 12.2 Amendments. AskUI reserves the right to modify this Agreement at any
281
+ time. Updated terms will be made available through the Software or at
282
+ askui.com. Continued use of the Software after such modifications
283
+ constitutes acceptance of the revised terms.
284
+
285
+ 12.3 Severability. If any provision of this Agreement is found to be
286
+ invalid or unenforceable, the remaining provisions shall remain in
287
+ full force and effect.
288
+
289
+ 12.4 No Waiver. The failure of AskUI to enforce any right or provision of
290
+ this Agreement shall not constitute a waiver of such right or
291
+ provision.
292
+
293
+ 12.5 Assignment. The Licensee may not assign or transfer this Agreement or
294
+ any rights hereunder without AskUI's prior written consent. AskUI may
295
+ assign this Agreement freely in connection with a merger, acquisition,
296
+ or sale of assets.
297
+
298
+
299
+ ================================================================================
300
+ — End of Terms of Service —
301
+ ================================================================================
302
+
303
+ askui GmbH
304
+ Registry court: Amtsgericht Mannheim · HRB 740125 · VAT-ID: DE342511595
305
+ Responsible persons: Jonas Menesklou, Dominik Klotz
306
+
307
+ Project-URL: Homepage, https://www.askui.com/
308
+ Project-URL: Documentation, https://docs.askui.com
309
+ Keywords: askui,automation,agent-os
310
+ Classifier: Development Status :: 4 - Beta
311
+ Classifier: Intended Audience :: Developers
312
+ Classifier: License :: Other/Proprietary License
313
+ Classifier: Operating System :: Microsoft :: Windows
314
+ Classifier: Operating System :: POSIX :: Linux
315
+ Classifier: Operating System :: MacOS
316
+ Classifier: Programming Language :: Python :: 3
317
+ Classifier: Programming Language :: Python :: 3 :: Only
318
+ Classifier: Topic :: Software Development :: Testing
319
+ Requires-Python: >=3.8
320
+ Description-Content-Type: text/markdown
321
+ License-File: docs/AskUI_AgentOS_TermsOfService.txt
322
+ Dynamic: license-file
323
+
324
+ # AskUI Agent OS
325
+
326
+ Platform-specific binaries for the **AskUI Remote Device Controller**, shipped as a Python package. Use it with the [AskUI Python SDK](https://github.com/askui/python-sdk) when you need local device control—see the [Setup Guide](https://docs.askui.com) in the official docs.
327
+
328
+ ## Requirements
329
+
330
+ - **Python:** 3.8+
331
+ - **Platforms:** Windows, Linux, macOS
332
+ - **Windows only:** [Microsoft Visual C++ Redistributable](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist) (minimum version 14.34.31938). The package checks this automatically when you use the API.
333
+
334
+ ## Installation
335
+
336
+ ```bash
337
+ pip install askui-agent-os
338
+ ```
339
+
340
+ ## Usage
341
+
342
+ ### Command line
343
+
344
+ Get the path to the Remote Device Controller binary:
345
+
346
+ ```bash
347
+ askui-agent-os get-binary-path
348
+ ```
349
+
350
+ ### Python API
351
+
352
+ The package exposes a single class, **`AgentOS`**, with static methods. On import, `AgentOS.setup()` runs and makes the controller binary executable (no-op on Windows). Prerequisites (e.g. Windows VC++ runtime) are checked when you call `bin_path()` or `controller_path()`.
353
+
354
+ ```python
355
+ from askui_agent_os import AgentOS
356
+
357
+ # Directory containing platform binaries
358
+ bin_dir = AgentOS.bin_path()
359
+
360
+ # Full path to the controller executable (use this with the AskUI SDK)
361
+ path = AgentOS.controller_path()
362
+
363
+ # Optional: require Windows VC++ runtime (raises RuntimeError if missing on Windows)
364
+ AgentOS.require_vc_redistributable()
365
+ ```
366
+
367
+ | Method | Description |
368
+ |--------|-------------|
369
+ | `AgentOS.bin_path()` | Path to the package `bin` directory. |
370
+ | `AgentOS.controller_path()` | Full path to the controller executable. |
371
+ | `AgentOS.require_vc_redistributable()` | No-op on non-Windows; on Windows, raises if the required VC++ runtime is missing. |
372
+
373
+ ## CI/CD and automated pipelines
374
+
375
+ **This package is for local and desktop use only.** It is **not** suitable for use in CI/CD or other headless/automated pipelines. For CI/CD you need the dedicated AskUI service. To request access, contact **support@askui.com**.
376
+
377
+ ## License
378
+
379
+ Use of AskUI Agent OS is subject to the AskUI Agent OS Terms of Service. Non-commercial use is free; commercial use requires a separate Commercial Licence from AskUI.
380
+
381
+ ## Links
382
+
383
+ - [Homepage](https://www.askui.com/)
384
+ - [Python SDK](https://github.com/askui/python-sdk)
385
+ - [Documentation](https://docs.askui.com)
386
+ - [Support](mailto:support@askui.com)
@@ -0,0 +1,80 @@
1
+ # AskUI Agent OS Deliveries
2
+
3
+ This repository contains the delivery pipelines and assets for **AskUI Agent OS** and **AskUI Suite Installers**. Use it to build, release, and publish installers and the Agent OS Python package.
4
+
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ You can use this repo in two main ways:
10
+
11
+ | Delivery type | What it does | How to trigger |
12
+ |---------------|--------------|----------------|
13
+ | **Suite Installer** | Build and release AskUI Suite Installers (Web/Full) for Windows, macOS, and Linux | Create a **GitHub Release** with a version tag, or run the **Build Suite Installer** workflow manually |
14
+ | **Agent OS** | Publish the Agent OS Python package to PyPI and build Windows service installers (AMD64/ARM64) | Run the **Release Agent OS** workflow manually and provide a version |
15
+
16
+ ---
17
+
18
+ ## Suite Installer releases
19
+
20
+ ### Version and tag format
21
+
22
+ - **Stable:** `26.2.1` (semver: `YY.MINOR.PATCH`)
23
+ - **Release candidate:** `26.2.1.1` (e.g. `26.2.1.1` = rc1 for 26.2.1)
24
+
25
+ ### Option A: Release from a GitHub Release
26
+
27
+ 1. In this repo, go to **Releases** → **Draft a new release**.
28
+ 2. Create a **tag** with the version (e.g. `26.2.1` or `26.2.1.1`).
29
+ 3. Publish the release.
30
+
31
+ Publishing the release triggers **Build Suite Installer** and builds installers for:
32
+
33
+ - Windows (AMD64): Web, Full
34
+ - Windows (ARM64): Web
35
+ - macOS (ARM64): Web
36
+ - Linux (AMD64, ARM64): Web
37
+
38
+ Installers are released to the configured S3 bucket. Only tags **without** the `agent-os-` prefix trigger this behavior.
39
+
40
+ ### Option B: Manual build (single or all)
41
+
42
+ 1. Go to **Actions** → **Build Suite Installer** → **Run workflow**.
43
+ 2. Choose:
44
+ - **all_builds:** `true` to build all OS/arch/type combinations (as above), or `false` to pick one.
45
+ - **os:** Windows, MacOS, or Linux (ignored if `all_builds` is true).
46
+ - **architecture:** AMD64 or ARM64 (ignored if `all_builds` is true).
47
+ - **version:** e.g. `26.2.1`.
48
+ - **installationType:** Web or Full.
49
+ - **release:** set to `true` to publish the built installer to the S3 bucket.
50
+
51
+ ---
52
+
53
+ ## Agent OS releases (Python package + Windows installers)
54
+
55
+ ### Version format
56
+
57
+ - **Stable:** `26.2.1` → tag `agent-os-v26.2.1`, PyPI version `26.2.1`.
58
+ - **Release candidate:** `26.2.1.5` → tag `agent-os-v26.2.1.5`, PyPI version `26.2.1.rc5`.
59
+
60
+ Version must match: `YY.MINOR.PATCH` or `YY.MINOR.PATCH.RC` (e.g. `26.1.1` or `26.1.1.5` for rc5).
61
+
62
+ ### How to release
63
+
64
+ 1. Go to **Actions** → **Release Agent OS** → **Run workflow**.
65
+ 2. Enter the **version** (e.g. `26.1.1` or `26.1.1.5` for rc5).
66
+ 3. Run the workflow.
67
+
68
+ The workflow will:
69
+
70
+ 1. Bump the version and create the Git tag (e.g. `agent-os-v26.2.1` or `agent-os-v26.2.1.5`).
71
+ 2. Publish the **Python package** to PyPI (e.g. `pip install askui-agent-os==26.2.1`).
72
+ 3. Build **Agent OS Windows service installers** for AMD64 and ARM64 and upload them to the S3 bucket.
73
+ 4. Create a **GitHub Release** with generated release notes (PyPI install instructions and installer download links).
74
+
75
+ ---
76
+
77
+ ## Summary
78
+
79
+ - **Suite Installers:** Use a **GitHub Release** with a version tag (`26.2.1` or `26.2.1.1`), or run **Build Suite Installer** manually for a single or full matrix.
80
+ - **Agent OS:** Run **Release Agent OS** with a version; it handles tagging, PyPI, Windows installers, and the GitHub Release.
@@ -0,0 +1,5 @@
1
+ from askui_agent_os.agent_os import AgentOS
2
+
3
+ AgentOS.setup()
4
+
5
+ __all__ = ["AgentOS"]
@@ -0,0 +1,66 @@
1
+ """Windows C++ runtime check - verifies minimum Visual C++ Redistributable version."""
2
+
3
+ import platform
4
+
5
+
6
+ def check_windows_cpp_runtime(
7
+ min_major: int,
8
+ min_minor: int,
9
+ min_patch: int,
10
+ ) -> bool:
11
+ """
12
+ Check if a sufficient Microsoft Visual C++ Redistributable is installed (Windows only).
13
+
14
+ Returns True if not on Windows, or if a compatible runtime is installed.
15
+ Returns False if on Windows and no compatible runtime is found.
16
+ """
17
+ if platform.system() != "Windows":
18
+ return True
19
+
20
+ try:
21
+ import winreg
22
+ except ImportError:
23
+ return True
24
+
25
+ arch = platform.machine().lower()
26
+ if arch in ("amd64", "x86_64"):
27
+ arch_key = "x64"
28
+ elif arch in ("arm64", "aarch64"):
29
+ arch_key = "ARM64"
30
+ else:
31
+ arch_key = "x86"
32
+
33
+ base_path = r"SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes"
34
+ wow_path = r"SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes"
35
+
36
+ for root, subkey in [
37
+ (winreg.HKEY_LOCAL_MACHINE, base_path),
38
+ (winreg.HKEY_LOCAL_MACHINE, wow_path),
39
+ ]:
40
+ try:
41
+ key_path = f"{subkey}\\{arch_key}"
42
+ with winreg.OpenKey(root, key_path, 0, winreg.KEY_READ) as key:
43
+ try:
44
+ version, _ = winreg.QueryValueEx(key, "Version")
45
+ except OSError:
46
+ continue
47
+ if isinstance(version, str):
48
+ version = version.lstrip("v").strip()
49
+ parts = version.split(".")
50
+ major = int(parts[0]) if parts else 0
51
+ minor = int(parts[1]) if len(parts) > 1 else 0
52
+ patch = int(parts[2]) if len(parts) > 2 else 0
53
+ else:
54
+ continue
55
+ if (
56
+ major > min_major
57
+ or (major == min_major and minor >= min_minor)
58
+ or (
59
+ major == min_major and minor == min_minor and patch >= min_patch
60
+ )
61
+ ):
62
+ return True
63
+ except OSError:
64
+ continue
65
+
66
+ return False
@@ -0,0 +1,90 @@
1
+ """Public API: single entry point for AskUI Agent OS functionality."""
2
+
3
+ import platform
4
+ from pathlib import Path
5
+
6
+ from askui_agent_os._runtime_check import (
7
+ check_windows_cpp_runtime,
8
+ )
9
+
10
+
11
+ class AgentOS:
12
+ """
13
+ Platform-specific binaries and helpers for the AskUI Remote Device Controller.
14
+
15
+ Use static methods to get paths, check runtimes, and prepare the environment.
16
+ Setup runs on import; prerequisites (e.g. Windows VC++ runtime check) run on each call.
17
+ """
18
+
19
+ _MIN_VC_RUNTIME_MAJOR = 14
20
+ _MIN_VC_RUNTIME_MINOR = 34
21
+ _MIN_VC_RUNTIME_PATCH = 31938
22
+
23
+ @staticmethod
24
+ def setup() -> None:
25
+ """Prepare the environment: make binary executable. Called on import."""
26
+ AgentOS._make_binary_executable()
27
+
28
+ @staticmethod
29
+ def bin_path() -> Path:
30
+ """Return the path to the package's bin directory (where binaries are installed)."""
31
+ AgentOS._ensure_prerequisites()
32
+ return AgentOS._get_bin_dir()
33
+
34
+ @staticmethod
35
+ def controller_path() -> Path:
36
+ """Return the path to the remote device controller binary."""
37
+ AgentOS._ensure_prerequisites()
38
+ return AgentOS._get_remote_device_controller_path()
39
+
40
+ @staticmethod
41
+ def make_executable() -> None:
42
+ """Make the controller binary executable (no-op on Windows)."""
43
+ AgentOS._ensure_prerequisites()
44
+ AgentOS._make_binary_executable()
45
+
46
+ @staticmethod
47
+ def require_vc_redistributable() -> None:
48
+ """
49
+ Require a sufficient Microsoft Visual C++ Redistributable on Windows.
50
+
51
+ No-op on non-Windows platforms. On Windows, raises RuntimeError if the
52
+ minimum required version is not found.
53
+ """
54
+ if not check_windows_cpp_runtime(
55
+ min_major=AgentOS._MIN_VC_RUNTIME_MAJOR,
56
+ min_minor=AgentOS._MIN_VC_RUNTIME_MINOR,
57
+ min_patch=AgentOS._MIN_VC_RUNTIME_PATCH,
58
+ ):
59
+ raise RuntimeError(
60
+ f"[AskUI Agent OS]: Microsoft Visual C++ Redistributable (minimum "
61
+ f"{AgentOS._MIN_VC_RUNTIME_MAJOR}.{AgentOS._MIN_VC_RUNTIME_MINOR}.{AgentOS._MIN_VC_RUNTIME_PATCH}) "
62
+ "is required on Windows. Install from: "
63
+ "https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist"
64
+ )
65
+
66
+ @staticmethod
67
+ def _ensure_prerequisites() -> None:
68
+ """Run prerequisites (e.g. require Windows VC++ runtime). Called before each operation."""
69
+ AgentOS.require_vc_redistributable()
70
+
71
+ @staticmethod
72
+ def _get_bin_dir() -> Path:
73
+ """Return the path to the package's bin directory (where binaries are installed)."""
74
+ return Path(__file__).resolve().parent / "bin"
75
+
76
+ @staticmethod
77
+ def _get_remote_device_controller_path() -> Path:
78
+ """Return the path to the remote device controller binary."""
79
+ binary_name = "AskuiRemoteDeviceController"
80
+ if platform.system() == "Windows":
81
+ binary_name += ".exe"
82
+ return (AgentOS._get_bin_dir() / binary_name).absolute()
83
+
84
+ @staticmethod
85
+ def _make_binary_executable() -> None:
86
+ """Make the binary executable (no-op on Windows)."""
87
+ if platform.system() == "Windows":
88
+ return
89
+ AgentOS._get_remote_device_controller_path().chmod(0o755)
90
+
@@ -0,0 +1,25 @@
1
+ """CLI for askui-agent-os."""
2
+
3
+ import argparse
4
+
5
+ from askui_agent_os import AgentOS
6
+
7
+
8
+ def main() -> None:
9
+ parser = argparse.ArgumentParser(prog="askui-agent-os")
10
+ subparsers = parser.add_subparsers(dest="command", required=True)
11
+
12
+ path_parser = subparsers.add_parser("get-binary-path")
13
+ path_parser.set_defaults(func=_cmd_controller_path)
14
+
15
+ args = parser.parse_args()
16
+ args.func(args)
17
+
18
+
19
+ def _cmd_controller_path(_args: argparse.Namespace) -> None:
20
+ path = AgentOS.controller_path()
21
+ print(path)
22
+
23
+
24
+ if __name__ == "__main__":
25
+ main()