peachsim 0.1.527

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 (324) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +640 -0
  3. package/cli/app-config.ts +82 -0
  4. package/cli/app-fonts.ts +388 -0
  5. package/cli/app-project.ts +59 -0
  6. package/cli/app-splash.ts +171 -0
  7. package/cli/app-state-reset.ts +26 -0
  8. package/cli/auth.ts +184 -0
  9. package/cli/bin.ts +59 -0
  10. package/cli/bridge-diagnostics.ts +226 -0
  11. package/cli/bridge-flow-runner.ts +2806 -0
  12. package/cli/browser-backend.ts +44 -0
  13. package/cli/browser-evals.ts +96 -0
  14. package/cli/cli-update.ts +261 -0
  15. package/cli/cloud-client.ts +1530 -0
  16. package/cli/cloud-dispatch.ts +206 -0
  17. package/cli/cloud-session.ts +227 -0
  18. package/cli/command-contract.ts +221 -0
  19. package/cli/command-registry.ts +304 -0
  20. package/cli/commands/agent-wrapper.ts +1048 -0
  21. package/cli/commands/agent.ts +439 -0
  22. package/cli/commands/app-fonts.ts +99 -0
  23. package/cli/commands/assert.ts +542 -0
  24. package/cli/commands/auth.ts +71 -0
  25. package/cli/commands/box/bundle-plane.ts +71 -0
  26. package/cli/commands/box/checkout-plane.ts +256 -0
  27. package/cli/commands/box/plane-share.ts +208 -0
  28. package/cli/commands/box/rnx-command.ts +60 -0
  29. package/cli/commands/box/search-command.ts +157 -0
  30. package/cli/commands/box.ts +925 -0
  31. package/cli/commands/camera.ts +266 -0
  32. package/cli/commands/cleanup.ts +169 -0
  33. package/cli/commands/compat.ts +176 -0
  34. package/cli/commands/config.ts +34 -0
  35. package/cli/commands/control.ts +2154 -0
  36. package/cli/commands/cpu-profile.ts +941 -0
  37. package/cli/commands/daemon-mac-app.ts +165 -0
  38. package/cli/commands/daemon.ts +800 -0
  39. package/cli/commands/debug.ts +751 -0
  40. package/cli/commands/desktop.ts +39 -0
  41. package/cli/commands/detect.ts +201 -0
  42. package/cli/commands/detox.ts +481 -0
  43. package/cli/commands/device.ts +134 -0
  44. package/cli/commands/diagnose.ts +589 -0
  45. package/cli/commands/do-chain.ts +408 -0
  46. package/cli/commands/electron.ts +94 -0
  47. package/cli/commands/film.ts +379 -0
  48. package/cli/commands/flow.ts +1240 -0
  49. package/cli/commands/inspect/actions.ts +516 -0
  50. package/cli/commands/inspect/core.ts +2086 -0
  51. package/cli/commands/inspect/count.ts +17 -0
  52. package/cli/commands/inspect/describe.ts +119 -0
  53. package/cli/commands/inspect/env.ts +25 -0
  54. package/cli/commands/inspect/find.ts +169 -0
  55. package/cli/commands/inspect/get-layout.ts +53 -0
  56. package/cli/commands/inspect/keyboard.ts +54 -0
  57. package/cli/commands/inspect/list.ts +175 -0
  58. package/cli/commands/inspect/memory.ts +215 -0
  59. package/cli/commands/inspect/redaction.ts +39 -0
  60. package/cli/commands/inspect/resolve-target.ts +77 -0
  61. package/cli/commands/inspect/screens.ts +78 -0
  62. package/cli/commands/inspect/settle.ts +32 -0
  63. package/cli/commands/inspect/settling.ts +197 -0
  64. package/cli/commands/inspect/shared.ts +259 -0
  65. package/cli/commands/inspect/sleep.ts +15 -0
  66. package/cli/commands/inspect/tree.ts +23 -0
  67. package/cli/commands/inspect/url.ts +17 -0
  68. package/cli/commands/inspect/wait-event.ts +211 -0
  69. package/cli/commands/inspect/wait-idle.ts +25 -0
  70. package/cli/commands/inspect/wait-ready.ts +87 -0
  71. package/cli/commands/inspect/wait-selector.ts +59 -0
  72. package/cli/commands/inspect/wait.ts +32 -0
  73. package/cli/commands/inspect.ts +4738 -0
  74. package/cli/commands/install-cli.ts +275 -0
  75. package/cli/commands/install-desktop.ts +385 -0
  76. package/cli/commands/login.ts +357 -0
  77. package/cli/commands/logout.ts +24 -0
  78. package/cli/commands/maestro-generate.ts +375 -0
  79. package/cli/commands/maestro.ts +536 -0
  80. package/cli/commands/mode.ts +58 -0
  81. package/cli/commands/no-bridge-hint.ts +80 -0
  82. package/cli/commands/perf.ts +67 -0
  83. package/cli/commands/permissions.ts +203 -0
  84. package/cli/commands/platform.ts +410 -0
  85. package/cli/commands/preview.ts +103 -0
  86. package/cli/commands/profile.ts +106 -0
  87. package/cli/commands/react.ts +353 -0
  88. package/cli/commands/record.ts +1435 -0
  89. package/cli/commands/report-issue.ts +305 -0
  90. package/cli/commands/reset.ts +89 -0
  91. package/cli/commands/runtime.ts +348 -0
  92. package/cli/commands/screenshot-command.ts +106 -0
  93. package/cli/commands/screenshot-layers.ts +144 -0
  94. package/cli/commands/screenshot-mode.ts +38 -0
  95. package/cli/commands/screenshot.ts +492 -0
  96. package/cli/commands/screenshots-capture.ts +608 -0
  97. package/cli/commands/screenshots.ts +127 -0
  98. package/cli/commands/serve.ts +139 -0
  99. package/cli/commands/setup.ts +416 -0
  100. package/cli/commands/shell-boolean-mode.ts +82 -0
  101. package/cli/commands/skills.ts +468 -0
  102. package/cli/commands/slides.ts +357 -0
  103. package/cli/commands/state.ts +94 -0
  104. package/cli/commands/storage.ts +58 -0
  105. package/cli/commands/telemetry.ts +55 -0
  106. package/cli/commands/test.ts +535 -0
  107. package/cli/commands/three-mode.ts +771 -0
  108. package/cli/commands/timeline.ts +121 -0
  109. package/cli/commands/upgrade.ts +167 -0
  110. package/cli/commands/upload.ts +1203 -0
  111. package/cli/commands/version.ts +63 -0
  112. package/cli/commands/welcome.ts +17 -0
  113. package/cli/commands/what-happened.ts +328 -0
  114. package/cli/current-sim.ts +217 -0
  115. package/cli/desktop-companion.ts +315 -0
  116. package/cli/drivers/electron.ts +70 -0
  117. package/cli/drivers/index.ts +20 -0
  118. package/cli/drivers/playwright-provisioning.ts +184 -0
  119. package/cli/drivers/playwright-sim-host.ts +537 -0
  120. package/cli/drivers/playwright.ts +209 -0
  121. package/cli/drivers/registry.ts +65 -0
  122. package/cli/drivers/types.ts +102 -0
  123. package/cli/flow-export.ts +55 -0
  124. package/cli/flow-file.ts +142 -0
  125. package/cli/flow-live-status.ts +126 -0
  126. package/cli/flow-session.ts +140 -0
  127. package/cli/help-core.ts +143 -0
  128. package/cli/help.ts +44 -0
  129. package/cli/hidden-runtime-alias.ts +19 -0
  130. package/cli/hints.ts +214 -0
  131. package/cli/inspect-notice-state.ts +114 -0
  132. package/cli/internal-child.ts +176 -0
  133. package/cli/maestro-js.ts +323 -0
  134. package/cli/main.ts +704 -0
  135. package/cli/open-url.ts +8 -0
  136. package/cli/outbound-endpoints.ts +830 -0
  137. package/cli/parent-pid.ts +204 -0
  138. package/cli/parse-args.ts +189 -0
  139. package/cli/privacy.ts +53 -0
  140. package/cli/prompt.ts +56 -0
  141. package/cli/recording-access.ts +108 -0
  142. package/cli/registry.ts +2 -0
  143. package/cli/resolve-assets.ts +63 -0
  144. package/cli/rnx-in-process.ts +98 -0
  145. package/cli/run-registry.ts +226 -0
  146. package/cli/run-rnx-core.ts +148 -0
  147. package/cli/run-rnx.ts +137 -0
  148. package/cli/runtime-notes.ts +66 -0
  149. package/cli/runtime-summary.ts +25 -0
  150. package/cli/secure-file.ts +31 -0
  151. package/cli/self-invocation.ts +58 -0
  152. package/cli/send-to-box.ts +109 -0
  153. package/cli/setup-repository.ts +191 -0
  154. package/cli/shell-init.ts +98 -0
  155. package/cli/standalone.ts +4 -0
  156. package/cli/telemetry.ts +84 -0
  157. package/cli/ui.ts +68 -0
  158. package/cli/ws-bridge.ts +1020 -0
  159. package/detox/attempt-events.cjs +23 -0
  160. package/detox/colors.ts +54 -0
  161. package/detox/config-loader.ts +135 -0
  162. package/detox/element-types.ts +48 -0
  163. package/detox/expectations.ts +534 -0
  164. package/detox/gestures.ts +501 -0
  165. package/detox/index.ts +2694 -0
  166. package/detox/jest-preset.cjs +29 -0
  167. package/detox/jest-setup-after-env.cjs +22 -0
  168. package/detox/matchers.ts +30 -0
  169. package/detox/motion-change.cjs +109 -0
  170. package/detox/motion-change.d.cts +35 -0
  171. package/detox/navigation-lifecycle.ts +290 -0
  172. package/detox/navigation.ts +43 -0
  173. package/detox/proof-frame.cjs +114 -0
  174. package/detox/record-block-execution.cjs +78 -0
  175. package/detox/screenshots/animated-color-test-rest-norngh.png +0 -0
  176. package/detox/screenshots/color-test-after-drag-norngh.png +0 -0
  177. package/detox/screenshots/color-test-rest-norngh.png +0 -0
  178. package/detox/screenshots/theme-blue-toggle.png +0 -0
  179. package/detox/screenshots/theme-blue.png +0 -0
  180. package/detox/screenshots/theme-red-toggle.png +0 -0
  181. package/detox/screenshots/theme-red.png +0 -0
  182. package/dist-lib/agent-daemon-client.cjs +502 -0
  183. package/dist-lib/agent-events.cjs +48 -0
  184. package/dist-lib/agent-identity.cjs +53 -0
  185. package/dist-lib/agent-sessions.cjs +759 -0
  186. package/dist-lib/attached-projects.cjs +526 -0
  187. package/dist-lib/auth/shared-session.cjs +208 -0
  188. package/dist-lib/backend-origin.cjs +88 -0
  189. package/dist-lib/beta.cjs +41 -0
  190. package/dist-lib/beta.mjs +13 -0
  191. package/dist-lib/bridge-constants.cjs +161 -0
  192. package/dist-lib/bridge-contract-input.cjs +451 -0
  193. package/dist-lib/bridge-contract-input.mjs +414 -0
  194. package/dist-lib/bridge-contract.cjs +130 -0
  195. package/dist-lib/bridge-contract.mjs +94 -0
  196. package/dist-lib/capture-contract.cjs +220 -0
  197. package/dist-lib/capture-contract.mjs +190 -0
  198. package/dist-lib/cli-constants.cjs +32 -0
  199. package/dist-lib/cloud-contract.cjs +194 -0
  200. package/dist-lib/cloud-contract.mjs +145 -0
  201. package/dist-lib/cloud.cjs +670 -0
  202. package/dist-lib/cloud.mjs +639 -0
  203. package/dist-lib/config.cjs +96 -0
  204. package/dist-lib/detox/index.cjs +3789 -0
  205. package/dist-lib/detox/jest-preset.cjs +29 -0
  206. package/dist-lib/dev-bundle-resolution.cjs +290 -0
  207. package/dist-lib/home-paths.cjs +638 -0
  208. package/dist-lib/host/bridge-host.cjs +10903 -0
  209. package/dist-lib/host/fetch-proxy-handler.cjs +421 -0
  210. package/dist-lib/host/fetch-proxy-overrides.cjs +63 -0
  211. package/dist-lib/host/fetch-proxy-overrides.mjs +37 -0
  212. package/dist-lib/host/replacement-module-handler.cjs +469 -0
  213. package/dist-lib/host/websocket-proxy.cjs +298 -0
  214. package/dist-lib/index.cjs +4268 -0
  215. package/dist-lib/jump-to-source-babel.cjs +93 -0
  216. package/dist-lib/jump-to-source-native.cjs +112 -0
  217. package/dist-lib/menu.cjs +646 -0
  218. package/dist-lib/menu.mjs +604 -0
  219. package/dist-lib/metro-fingerprint-registry.cjs +186 -0
  220. package/dist-lib/metro-fingerprint-registry.mjs +156 -0
  221. package/dist-lib/metro-production-bundle.cjs +329 -0
  222. package/dist-lib/metro-production-bundle.mjs +295 -0
  223. package/dist-lib/metro.cjs +904 -0
  224. package/dist-lib/profiles.cjs +246 -0
  225. package/dist-lib/public-brand.cjs +39 -0
  226. package/dist-lib/react-native-host-modules.cjs +51 -0
  227. package/dist-lib/react-native-host-modules.mjs +25 -0
  228. package/dist-lib/render-mode.cjs +54 -0
  229. package/dist-lib/scripts/dev-server-scanner.cjs +1232 -0
  230. package/dist-lib/sdk.cjs +2433 -0
  231. package/dist-lib/sdk.mjs +2336 -0
  232. package/dist-lib/skills.cjs +39132 -0
  233. package/dist-lib/swift-submit.cjs +92 -0
  234. package/dist-lib/swift-submit.mjs +65 -0
  235. package/dist-lib/swift.cjs +1646 -0
  236. package/dist-lib/vite.cjs +1591 -0
  237. package/package.json +290 -0
  238. package/scripts/dev-server-scanner.ts +1291 -0
  239. package/scripts/optional-demo-registry.ts +113 -0
  240. package/skills/contrast/SKILL.md +165 -0
  241. package/skills/rnx-debug/SKILL.md +433 -0
  242. package/skills/rnx-perf/SKILL.md +399 -0
  243. package/skills/rnx-setup/SKILL.md +172 -0
  244. package/skills/rnx-test/SKILL.md +321 -0
  245. package/skills/rnx-visual/SKILL.md +126 -0
  246. package/src/agent-daemon-client.ts +410 -0
  247. package/src/agent-events.ts +71 -0
  248. package/src/agent-identity.ts +23 -0
  249. package/src/agent-prompt.ts +71 -0
  250. package/src/agent-sessions.ts +580 -0
  251. package/src/app-url.ts +39 -0
  252. package/src/attached-projects.ts +539 -0
  253. package/src/auth/shared-session.ts +235 -0
  254. package/src/backend-origin.ts +70 -0
  255. package/src/beta.ts +19 -0
  256. package/src/bridge-constants.ts +175 -0
  257. package/src/bridge-contract-input.ts +502 -0
  258. package/src/bridge-contract.ts +558 -0
  259. package/src/browser-cache.ts +16 -0
  260. package/src/capture-contract.ts +587 -0
  261. package/src/cli-constants.ts +1 -0
  262. package/src/cli-version.ts +40 -0
  263. package/src/cloud-contract.ts +274 -0
  264. package/src/cloud.ts +762 -0
  265. package/src/codex-client.ts +234 -0
  266. package/src/config.ts +132 -0
  267. package/src/connect.ts +101 -0
  268. package/src/dev-bundle-resolution.ts +346 -0
  269. package/src/dev-server-open.ts +198 -0
  270. package/src/disk-cleanup.ts +540 -0
  271. package/src/flow-timeout-scale.ts +15 -0
  272. package/src/home-paths.ts +806 -0
  273. package/src/host/agent-host.ts +666 -0
  274. package/src/host/bridge-host.ts +2788 -0
  275. package/src/host/fetch-proxy-handler.ts +449 -0
  276. package/src/host/fetch-proxy-overrides.ts +51 -0
  277. package/src/host/open-url.ts +89 -0
  278. package/src/host/plane-host.ts +203 -0
  279. package/src/host/replacement-module-handler.ts +158 -0
  280. package/src/host/websocket-proxy.ts +315 -0
  281. package/src/index.ts +71 -0
  282. package/src/jump-to-source-babel.ts +135 -0
  283. package/src/jump-to-source-native.ts +102 -0
  284. package/src/menu.ts +777 -0
  285. package/src/metro-fingerprint-registry.ts +302 -0
  286. package/src/metro-plugin.ts +341 -0
  287. package/src/metro-production-bundle.ts +471 -0
  288. package/src/native-dev-bundle-url.ts +118 -0
  289. package/src/native-seam-manifest.ts +341 -0
  290. package/src/playwright-host-log.ts +16 -0
  291. package/src/plist.ts +27 -0
  292. package/src/poll-until.ts +123 -0
  293. package/src/profiles.ts +179 -0
  294. package/src/public-brand.ts +9 -0
  295. package/src/react-native-host-modules.ts +26 -0
  296. package/src/render-mode.ts +27 -0
  297. package/src/rolldown-plugin-swift.ts +240 -0
  298. package/src/runtime-assets.ts +233 -0
  299. package/src/runtime-delivery.ts +54 -0
  300. package/src/screenshots/compose.ts +422 -0
  301. package/src/screenshots/frame-compose.ts +514 -0
  302. package/src/screenshots/orchestrate.ts +256 -0
  303. package/src/screenshots/org-deck.ts +91 -0
  304. package/src/screenshots/registry.ts +58 -0
  305. package/src/screenshots/schema.ts +364 -0
  306. package/src/sdk.ts +15 -0
  307. package/src/settings-bundle.ts +418 -0
  308. package/src/shell-bridge-identity.ts +15 -0
  309. package/src/sim-client.ts +697 -0
  310. package/src/skills/builtin/a11y-review.ts +132 -0
  311. package/src/skills/builtin/compat-check.ts +71 -0
  312. package/src/skills/builtin/maestro-test.ts +121 -0
  313. package/src/skills/builtin/perf-profile.ts +90 -0
  314. package/src/skills/builtin/screenshot-all.ts +52 -0
  315. package/src/skills/builtin/visual-diff.ts +100 -0
  316. package/src/skills/registry.ts +107 -0
  317. package/src/skills/types.ts +41 -0
  318. package/src/swift-submit.ts +185 -0
  319. package/src/swift.ts +7 -0
  320. package/src/team-machine-prompt.ts +73 -0
  321. package/src/vite-plugin-one.ts +264 -0
  322. package/src/vite-plugin-swift.ts +620 -0
  323. package/src/vite-plugin.ts +1946 -0
  324. package/src/worklets-babel.ts +250 -0
@@ -0,0 +1,78 @@
1
+ // producer half of the paired test-block execution contract. jest's own JSON
2
+ // reporter cannot say whether a failed block failed in its body or never got
3
+ // there: a `beforeAll`/`beforeEach` throw and a failed `expect` inside the body
4
+ // produce assertion results identical in status, duration, invocations,
5
+ // numPassingAsserts and retryReasons. only the failure message text differs, and
6
+ // attributing behavior on message text is the fuzzy join this whole bridge
7
+ // exists to remove.
8
+ //
9
+ // so the suite records it directly. this module wraps the globals the
10
+ // conformance catalogs register their blocks with, and appends one line per
11
+ // block whose body actually started, naming how that body finished. a block
12
+ // whose hooks failed produces no line at all, which is what makes a setup loss
13
+ // distinguishable from a behavior failure downstream.
14
+ //
15
+ // the rnx suites get it through `jest-setup-after-env.cjs`, which this preset
16
+ // already loads; the native detox suites name it in `setupFilesAfterEnv`
17
+ // directly. either way it does nothing until CONFORMANCE_BLOCK_EXECUTION_FILE
18
+ // is set, so an unwired run behaves exactly as before.
19
+ //
20
+ // `scripts/lib/paired-conformance-test-outcomes.ts` reads what this writes.
21
+
22
+ const { appendFileSync } = require('node:fs')
23
+ // the global `expect` is not jest's here: detox's core listener overwrites it
24
+ // with its own element matcher on the circus `setup` event, which fires before
25
+ // setup files are required. `@jest/globals` is served by the jest runtime
26
+ // itself and always hands back the same jest expect the runner set `testPath`
27
+ // on, whatever a runner did to the globals.
28
+ const { expect: jestExpect } = require('@jest/globals')
29
+
30
+ const outputFile = process.env.CONFORMANCE_BLOCK_EXECUTION_FILE
31
+
32
+ if (outputFile) {
33
+ const testFile = jestExpect.getState().testPath
34
+
35
+ // a retried block runs its body more than once. numbering the invocations
36
+ // makes the retry explicit, so a reader can take the last attempt instead of
37
+ // guessing which of two identical lines was terminal.
38
+ const attempts = new Map()
39
+
40
+ const record = (title, bodyOutcome) => {
41
+ const attempt = (attempts.get(title) ?? 0) + 1
42
+ attempts.set(title, attempt)
43
+ appendFileSync(
44
+ outputFile,
45
+ `${JSON.stringify({ attempt, bodyOutcome, testFile, title })}\n`,
46
+ )
47
+ }
48
+
49
+ // jest workers each append to the same file. these lines are far below the
50
+ // atomic-append size, so interleaving splits between lines, never inside one.
51
+ const wrap = (raw) => {
52
+ const wrapped = function wrapped(title, body, timeout) {
53
+ if (typeof body !== 'function') return raw(title, body, timeout)
54
+ return raw(
55
+ title,
56
+ async function recordedBody(...args) {
57
+ let bodyOutcome = 'failed'
58
+ try {
59
+ const value = await body.apply(this, args)
60
+ bodyOutcome = 'passed'
61
+ return value
62
+ } finally {
63
+ record(title, bodyOutcome)
64
+ }
65
+ },
66
+ timeout,
67
+ )
68
+ }
69
+ // carries over each/skip/todo/failing/concurrent; `only` is wrapped too so a
70
+ // focused run still records its bodies.
71
+ Object.assign(wrapped, raw)
72
+ if (typeof raw.only === 'function') wrapped.only = wrap(raw.only)
73
+ return wrapped
74
+ }
75
+
76
+ globalThis.it = wrap(globalThis.it)
77
+ globalThis.test = wrap(globalThis.test)
78
+ }
Binary file
Binary file
@@ -0,0 +1,502 @@
1
+ /*! rnx v0.1.527 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
+ "use strict";
4
+ var __create = Object.create;
5
+ var __defProp = Object.defineProperty;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getProtoOf = Object.getPrototypeOf;
9
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
10
+ var __export = (target, all) => {
11
+ for (var name2 in all)
12
+ __defProp(target, name2, { get: all[name2], enumerable: true });
13
+ };
14
+ var __copyProps = (to, from, except, desc) => {
15
+ if (from && typeof from === "object" || typeof from === "function") {
16
+ for (let key of __getOwnPropNames(from))
17
+ if (!__hasOwnProp.call(to, key) && key !== except)
18
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
19
+ }
20
+ return to;
21
+ };
22
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
23
+ // If the importer is in node compatibility mode or this is not an ESM
24
+ // file that has been converted to a CommonJS file using a Babel-
25
+ // compatible transform (i.e. "__esModule" has not been set), then set
26
+ // "default" to the CommonJS "module.exports" for node compatibility.
27
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
28
+ mod
29
+ ));
30
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
31
+
32
+ // src/agent-daemon-client.ts
33
+ var agent_daemon_client_exports = {};
34
+ __export(agent_daemon_client_exports, {
35
+ AgentDaemonClient: () => AgentDaemonClient,
36
+ AgentDaemonError: () => AgentDaemonError,
37
+ connectToDaemon: () => connectToDaemon,
38
+ ensureDaemonRunning: () => ensureDaemonRunning,
39
+ isBridgeUp: () => isBridgeUp
40
+ });
41
+ module.exports = __toCommonJS(agent_daemon_client_exports);
42
+ var import_node_child_process = require("node:child_process");
43
+ var import_node_net = __toESM(require("node:net"), 1);
44
+ var import_ws = require("ws");
45
+
46
+ // src/agent-sessions.ts
47
+ var import_node_fs3 = __toESM(require("node:fs"), 1);
48
+ var import_node_path3 = __toESM(require("node:path"), 1);
49
+
50
+ // cli/self-invocation.ts
51
+ var import_node_fs = require("node:fs");
52
+ var import_node_path = require("node:path");
53
+ var import_node_url = require("node:url");
54
+
55
+ // src/public-brand.ts
56
+ var name = "rnx";
57
+ var rnxPublicBrand = Object.freeze({
58
+ name,
59
+ packageName: "rnxsim",
60
+ commandName: "rnx",
61
+ domain: "rnxsim.com",
62
+ origin: "https://rnxsim.com"
63
+ });
64
+
65
+ // cli/standalone.ts
66
+ var IS_STANDALONE = typeof __SOOTSIM_STANDALONE__ !== "undefined" && __SOOTSIM_STANDALONE__;
67
+
68
+ // cli/self-invocation.ts
69
+ function sourceEntryPath() {
70
+ try {
71
+ const candidate = (0, import_node_path.join)((0, import_node_path.dirname)((0, import_node_url.fileURLToPath)(__sootsim_import_meta_url)), "bin.ts");
72
+ return (0, import_node_fs.existsSync)(candidate) ? candidate : null;
73
+ } catch {
74
+ return null;
75
+ }
76
+ }
77
+ function isCliEntry(path3) {
78
+ const name2 = (0, import_node_path.basename)(path3);
79
+ return name2 === "bin.ts" || name2 === "bin.js";
80
+ }
81
+ function rnxSelfInvocation() {
82
+ if (IS_STANDALONE) return { executable: process.execPath, prefixArgs: [] };
83
+ const entry = process.argv[1];
84
+ if (entry && isCliEntry(entry)) {
85
+ return { executable: process.execPath, prefixArgs: [entry] };
86
+ }
87
+ const sourceEntry = sourceEntryPath();
88
+ if (sourceEntry) {
89
+ return { executable: process.execPath, prefixArgs: [sourceEntry] };
90
+ }
91
+ if (!entry) {
92
+ throw new Error(`could not locate the ${rnxPublicBrand.commandName} entry script`);
93
+ }
94
+ return { executable: process.execPath, prefixArgs: [entry] };
95
+ }
96
+
97
+ // src/home-paths.ts
98
+ var import_node_fs2 = __toESM(require("node:fs"), 1);
99
+ var import_node_path2 = __toESM(require("node:path"), 1);
100
+ function isSootsimDevCheckout() {
101
+ if (process.env.SOOTSIM_FORCE_DAEMON_INSTALL === "1") return false;
102
+ const env = process.env.SOOTSIM_DEV;
103
+ if (env === "1" || env === "true") return true;
104
+ if (env === "0" || env === "false") return false;
105
+ const argv1 = process.argv[1];
106
+ if (!argv1) return false;
107
+ try {
108
+ const real = import_node_fs2.default.realpathSync(argv1);
109
+ return real.includes(`${import_node_path2.default.sep}packages${import_node_path2.default.sep}sootsim${import_node_path2.default.sep}`);
110
+ } catch {
111
+ return false;
112
+ }
113
+ }
114
+ function isDevWorkstation() {
115
+ if (process.env.SOOTSIM_FORCE_DAEMON_INSTALL === "1") return false;
116
+ return process.env.IS_TAMAGUI_DEV === "1";
117
+ }
118
+ function shouldSkipPersistentDaemon() {
119
+ return isSootsimDevCheckout() || isDevWorkstation();
120
+ }
121
+ var DAEMON_LOCKFILE_MAX_BYTES = 16 * 1024;
122
+
123
+ // src/attached-projects.ts
124
+ var COST_HISTORY_MAX_AGE_MS = 14 * 24 * 60 * 60 * 1e3;
125
+
126
+ // src/agent-sessions.ts
127
+ function resolveSootsimInvocation() {
128
+ if (process.env.RNX_BIN) {
129
+ return { executable: process.env.RNX_BIN, prefixArgs: [] };
130
+ }
131
+ if (IS_STANDALONE) return rnxSelfInvocation();
132
+ if (process.versions.electron) {
133
+ const resourcesPath = process.resourcesPath;
134
+ if (resourcesPath) {
135
+ const candidates = [
136
+ import_node_path3.default.join(resourcesPath, "bin", "sootsim"),
137
+ import_node_path3.default.join(resourcesPath, "bin", `sootsim-${process.platform}-${process.arch}`)
138
+ ];
139
+ for (const c of candidates) {
140
+ if (import_node_fs3.default.existsSync(c)) return { executable: c, prefixArgs: [] };
141
+ }
142
+ }
143
+ }
144
+ const workspace = tryWorkspaceSootsim();
145
+ if (workspace) return workspace;
146
+ const argv1 = process.argv[1];
147
+ if (argv1 && /\.(ts|tsx|mjs|cjs|js)$/.test(argv1)) {
148
+ return { executable: process.argv[0], prefixArgs: [argv1] };
149
+ }
150
+ throw new Error(
151
+ "rnx CLI not found. set RNX_BIN to the path of the rnx binary, or build the workspace CLI via `bun run --cwd packages/sootsim build:cli`."
152
+ );
153
+ }
154
+ function tryWorkspaceSootsim() {
155
+ try {
156
+ const sootsimDir = resolveSootsimPackageDir();
157
+ if (!sootsimDir) return null;
158
+ const binaryName = `rnx-${process.platform === "win32" ? "windows" : process.platform}-${process.arch}${process.platform === "win32" ? ".exe" : ""}`;
159
+ const distBinary = import_node_path3.default.join(sootsimDir, "dist-bin", binaryName);
160
+ if (import_node_fs3.default.existsSync(distBinary)) return { executable: distBinary, prefixArgs: [] };
161
+ const distBin = import_node_path3.default.join(sootsimDir, "dist-cli", "bin.js");
162
+ if (import_node_fs3.default.existsSync(distBin)) {
163
+ try {
164
+ const src = import_node_path3.default.join(sootsimDir, "cli", "commands", "agent-wrapper.ts");
165
+ if (import_node_fs3.default.existsSync(src)) {
166
+ const srcMtime = import_node_fs3.default.statSync(src).mtimeMs;
167
+ const buildMtime = import_node_fs3.default.statSync(distBin).mtimeMs;
168
+ if (buildMtime < srcMtime) {
169
+ console.warn(
170
+ `[rnx] dist-cli/bin.js is older than agent-wrapper.ts \u2014 rebuild with \`bun run --cwd packages/sootsim build:cli\`.`
171
+ );
172
+ }
173
+ }
174
+ } catch {
175
+ }
176
+ return { executable: process.execPath, prefixArgs: [distBin] };
177
+ }
178
+ return null;
179
+ } catch {
180
+ return null;
181
+ }
182
+ }
183
+ function resolveSootsimPackageDir() {
184
+ try {
185
+ const resolved = require.resolve(`${rnxPublicBrand.packageName}/package.json`);
186
+ return import_node_path3.default.dirname(resolved);
187
+ } catch {
188
+ }
189
+ const here = fileFromImportMeta();
190
+ if (!here) return null;
191
+ let cur = import_node_path3.default.dirname(here);
192
+ for (let i = 0; i < 8; i++) {
193
+ const pkg = import_node_path3.default.join(cur, "package.json");
194
+ try {
195
+ if (import_node_fs3.default.existsSync(pkg)) {
196
+ const parsed = JSON.parse(import_node_fs3.default.readFileSync(pkg, "utf8"));
197
+ if (parsed.name === rnxPublicBrand.packageName) return cur;
198
+ }
199
+ } catch {
200
+ }
201
+ const parent = import_node_path3.default.dirname(cur);
202
+ if (parent === cur) break;
203
+ cur = parent;
204
+ }
205
+ return null;
206
+ }
207
+ function fileFromImportMeta() {
208
+ try {
209
+ const url = __sootsim_import_meta_url;
210
+ if (!url || !url.startsWith("file://")) return null;
211
+ return decodeURIComponent(url.slice("file://".length));
212
+ } catch {
213
+ return null;
214
+ }
215
+ }
216
+
217
+ // src/bridge-constants.ts
218
+ var DEFAULT_SOOTSIM_BRIDGE_PORT = 7668;
219
+ var DEFAULT_SOOTSIM_BRIDGE_URL = `http://localhost:${DEFAULT_SOOTSIM_BRIDGE_PORT}/`;
220
+
221
+ // src/agent-daemon-client.ts
222
+ var AgentDaemonError = class extends Error {
223
+ code;
224
+ constructor(message, code) {
225
+ super(message);
226
+ this.name = "AgentDaemonError";
227
+ this.code = code;
228
+ }
229
+ };
230
+ var AgentDaemonClient = class {
231
+ ws;
232
+ port;
233
+ commandTimeoutMs;
234
+ ready;
235
+ closed = false;
236
+ nextId = 1;
237
+ pending = /* @__PURE__ */ new Map();
238
+ eventListeners = /* @__PURE__ */ new Set();
239
+ statusListeners = /* @__PURE__ */ new Set();
240
+ disconnectListeners = /* @__PURE__ */ new Set();
241
+ constructor(opts = {}) {
242
+ this.port = opts.port ?? DEFAULT_SOOTSIM_BRIDGE_PORT;
243
+ this.commandTimeoutMs = opts.commandTimeoutMs ?? 15e3;
244
+ this.ws = new import_ws.WebSocket(`ws://127.0.0.1:${this.port}`);
245
+ this.ready = new Promise((resolve, reject) => {
246
+ const onOpen = () => {
247
+ this.ws.off("error", onError);
248
+ resolve();
249
+ };
250
+ const onError = (err) => {
251
+ this.ws.off("open", onOpen);
252
+ reject(
253
+ new AgentDaemonError(
254
+ `could not connect to rnx daemon on port ${this.port}: ${err.message}`,
255
+ "NO_DAEMON"
256
+ )
257
+ );
258
+ };
259
+ this.ws.once("open", onOpen);
260
+ this.ws.once("error", onError);
261
+ });
262
+ this.ws.on("message", (data) => this.handleMessage(data));
263
+ this.ws.on("close", () => this.handleClose());
264
+ this.ws.on("error", () => {
265
+ });
266
+ }
267
+ async waitReady() {
268
+ return this.ready;
269
+ }
270
+ // --- public api ---
271
+ async listProjects() {
272
+ return this.send("agent:list-projects");
273
+ }
274
+ async upsertProject(input) {
275
+ return this.send("agent:upsert-project", { input });
276
+ }
277
+ async deleteProject(projectId) {
278
+ return this.send("agent:delete-project", { projectId });
279
+ }
280
+ async autoAttachForUrl(input) {
281
+ return this.send("agent:auto-attach-for-url", {
282
+ input
283
+ });
284
+ }
285
+ async listSessions(projectId) {
286
+ return this.send("agent:list-sessions", { projectId });
287
+ }
288
+ async startSession(input) {
289
+ return this.send("agent:start-session", { input });
290
+ }
291
+ async sendPrompt(sessionId, prompt) {
292
+ return this.send("agent:send-prompt", {
293
+ sessionId,
294
+ prompt
295
+ });
296
+ }
297
+ async sendClaimedPrompt(simId, prompt) {
298
+ return this.send(
299
+ "agent:send-claimed-prompt",
300
+ {
301
+ simId,
302
+ prompt
303
+ }
304
+ );
305
+ }
306
+ async endSession(sessionId) {
307
+ return this.send("agent:end-session", { sessionId });
308
+ }
309
+ async getTranscript(sessionId) {
310
+ return this.send("agent:get-transcript", {
311
+ sessionId
312
+ });
313
+ }
314
+ async getPaths() {
315
+ return this.send("agent:get-paths");
316
+ }
317
+ async subscribeEvents(sessionId) {
318
+ return this.send("agent:subscribe-events", {
319
+ sessionId
320
+ });
321
+ }
322
+ async unsubscribeEvents(sessionId) {
323
+ return this.send("agent:unsubscribe-events", {
324
+ sessionId
325
+ });
326
+ }
327
+ onAgentEvent(cb) {
328
+ this.eventListeners.add(cb);
329
+ return () => this.eventListeners.delete(cb);
330
+ }
331
+ onSessionStatusChange(cb) {
332
+ this.statusListeners.add(cb);
333
+ return () => this.statusListeners.delete(cb);
334
+ }
335
+ onDisconnect(cb) {
336
+ this.disconnectListeners.add(cb);
337
+ return () => this.disconnectListeners.delete(cb);
338
+ }
339
+ close() {
340
+ if (this.closed) return;
341
+ this.closed = true;
342
+ try {
343
+ this.ws.close();
344
+ } catch {
345
+ }
346
+ }
347
+ // --- internals ---
348
+ async send(type, payload = {}) {
349
+ await this.ready;
350
+ if (this.closed || this.ws.readyState !== import_ws.WebSocket.OPEN) {
351
+ throw new AgentDaemonError("daemon connection is closed", "NO_DAEMON");
352
+ }
353
+ const id = this.nextId++;
354
+ return new Promise((resolve, reject) => {
355
+ const timer = setTimeout(() => {
356
+ this.pending.delete(id);
357
+ reject(
358
+ new AgentDaemonError(
359
+ `${type} timed out after ${Math.round(this.commandTimeoutMs / 1e3)}s`,
360
+ "TIMEOUT"
361
+ )
362
+ );
363
+ }, this.commandTimeoutMs);
364
+ this.pending.set(id, {
365
+ resolve,
366
+ reject,
367
+ timer
368
+ });
369
+ try {
370
+ this.ws.send(JSON.stringify({ id, type, ...payload }));
371
+ } catch (err) {
372
+ clearTimeout(timer);
373
+ this.pending.delete(id);
374
+ reject(err instanceof Error ? err : new Error(String(err)));
375
+ }
376
+ });
377
+ }
378
+ handleMessage(data) {
379
+ let msg;
380
+ try {
381
+ msg = JSON.parse(String(data));
382
+ } catch {
383
+ return;
384
+ }
385
+ if (!msg || typeof msg !== "object") return;
386
+ if (msg.type === "agent:event") {
387
+ for (const cb of this.eventListeners) {
388
+ try {
389
+ cb({ sessionId: msg.sessionId, event: msg.event });
390
+ } catch {
391
+ }
392
+ }
393
+ return;
394
+ }
395
+ if (msg.type === "agent:session-status") {
396
+ for (const cb of this.statusListeners) {
397
+ try {
398
+ cb(msg.session);
399
+ } catch {
400
+ }
401
+ }
402
+ return;
403
+ }
404
+ if (typeof msg.id !== "number") return;
405
+ const entry = this.pending.get(msg.id);
406
+ if (!entry) return;
407
+ this.pending.delete(msg.id);
408
+ clearTimeout(entry.timer);
409
+ if (msg.error) {
410
+ entry.reject(new AgentDaemonError(msg.error, msg.code));
411
+ } else {
412
+ entry.resolve(msg.result);
413
+ }
414
+ }
415
+ handleClose() {
416
+ if (this.closed) return;
417
+ this.closed = true;
418
+ for (const [, entry] of this.pending) {
419
+ clearTimeout(entry.timer);
420
+ entry.reject(new AgentDaemonError("daemon disconnected", "DISCONNECT"));
421
+ }
422
+ this.pending.clear();
423
+ for (const cb of this.disconnectListeners) {
424
+ try {
425
+ cb();
426
+ } catch {
427
+ }
428
+ }
429
+ }
430
+ };
431
+ function isBridgeUp(port = DEFAULT_SOOTSIM_BRIDGE_PORT, timeoutMs = 400) {
432
+ return new Promise((resolve) => {
433
+ const socket = new import_node_net.default.Socket();
434
+ let settled = false;
435
+ const done = (ok) => {
436
+ if (settled) return;
437
+ settled = true;
438
+ socket.destroy();
439
+ resolve(ok);
440
+ };
441
+ socket.setTimeout(timeoutMs);
442
+ socket.once("connect", () => done(true));
443
+ socket.once("timeout", () => done(false));
444
+ socket.once("error", () => done(false));
445
+ socket.connect(port, "127.0.0.1");
446
+ });
447
+ }
448
+ async function ensureDaemonRunning(opts = {}) {
449
+ const port = opts.port ?? DEFAULT_SOOTSIM_BRIDGE_PORT;
450
+ if (await isBridgeUp(port)) {
451
+ return { alreadyRunning: true };
452
+ }
453
+ if (shouldSkipPersistentDaemon()) {
454
+ throw new AgentDaemonError(
455
+ `no rnx bridge on port ${port}. run \`rnx daemon install\` to enable the faster background service, or \`rnx serve\` in another shell.`,
456
+ "DEV_HOST_REFUSED"
457
+ );
458
+ }
459
+ const { executable, prefixArgs } = resolveSootsimInvocation();
460
+ const args = [...prefixArgs, "serve", "--quiet"];
461
+ if (port !== DEFAULT_SOOTSIM_BRIDGE_PORT) {
462
+ args.push("--port", String(port));
463
+ }
464
+ const child = (0, import_node_child_process.spawn)(executable, args, {
465
+ detached: true,
466
+ stdio: "ignore",
467
+ env: process.env,
468
+ cwd: process.cwd()
469
+ });
470
+ child.unref();
471
+ const deadline = Date.now() + (opts.startupTimeoutMs ?? 5e3);
472
+ while (Date.now() < deadline) {
473
+ if (await isBridgeUp(port)) return { alreadyRunning: false, pid: child.pid };
474
+ await new Promise((r) => setTimeout(r, 100));
475
+ }
476
+ throw new AgentDaemonError(
477
+ `spawned rnx daemon on port ${port} but it did not come up in time. run \`rnx serve\` manually to diagnose.`,
478
+ "SPAWN_TIMEOUT"
479
+ );
480
+ }
481
+ async function connectToDaemon(opts = {}) {
482
+ await ensureDaemonRunning({
483
+ port: opts.port,
484
+ startupTimeoutMs: opts.startupTimeoutMs
485
+ });
486
+ const client = new AgentDaemonClient(opts);
487
+ try {
488
+ await client.waitReady();
489
+ } catch (err) {
490
+ client.close();
491
+ throw err;
492
+ }
493
+ return client;
494
+ }
495
+ // Annotate the CommonJS export names for ESM import in node:
496
+ 0 && (module.exports = {
497
+ AgentDaemonClient,
498
+ AgentDaemonError,
499
+ connectToDaemon,
500
+ ensureDaemonRunning,
501
+ isBridgeUp
502
+ });
@@ -0,0 +1,48 @@
1
+ /*! rnx v0.1.527 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
+ "use strict";
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ // src/agent-events.ts
23
+ var agent_events_exports = {};
24
+ __export(agent_events_exports, {
25
+ isAgentEvent: () => isAgentEvent,
26
+ parseAgentEventLine: () => parseAgentEventLine
27
+ });
28
+ module.exports = __toCommonJS(agent_events_exports);
29
+ function isAgentEvent(value) {
30
+ if (!value || typeof value !== "object") return false;
31
+ const v = value;
32
+ return typeof v.type === "string" && typeof v.ts === "number";
33
+ }
34
+ function parseAgentEventLine(line) {
35
+ const trimmed = line.trim();
36
+ if (!trimmed) return null;
37
+ try {
38
+ const parsed = JSON.parse(trimmed);
39
+ return isAgentEvent(parsed) ? parsed : null;
40
+ } catch {
41
+ return null;
42
+ }
43
+ }
44
+ // Annotate the CommonJS export names for ESM import in node:
45
+ 0 && (module.exports = {
46
+ isAgentEvent,
47
+ parseAgentEventLine
48
+ });
@@ -0,0 +1,53 @@
1
+ /*! rnx v0.1.527 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
+ "use strict";
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ // src/agent-identity.ts
23
+ var agent_identity_exports = {};
24
+ __export(agent_identity_exports, {
25
+ agentSessionIdFromCliIdentity: () => agentSessionIdFromCliIdentity,
26
+ isValidTeamMachineSessionId: () => isValidTeamMachineSessionId,
27
+ teamMachineSessionIdFromCliIdentity: () => teamMachineSessionIdFromCliIdentity
28
+ });
29
+ module.exports = __toCommonJS(agent_identity_exports);
30
+ var TEAM_MACHINE_SESSION_RE = /^[A-Za-z0-9._:-]{1,160}$/;
31
+ function agentSessionIdFromCliIdentity(identity) {
32
+ if (!identity) return null;
33
+ const colon = identity.indexOf(":");
34
+ if (colon < 0) return identity.trim() || null;
35
+ const source = identity.slice(0, colon);
36
+ const value = identity.slice(colon + 1).trim();
37
+ return source === "RNX_CLI_IDENTITY" && value ? value : null;
38
+ }
39
+ function teamMachineSessionIdFromCliIdentity(identity) {
40
+ if (!identity?.startsWith("TM_SESSION:")) return null;
41
+ const sessionId = identity.slice("TM_SESSION:".length).trim();
42
+ if (!TEAM_MACHINE_SESSION_RE.test(sessionId)) return null;
43
+ return sessionId;
44
+ }
45
+ function isValidTeamMachineSessionId(sessionId) {
46
+ return TEAM_MACHINE_SESSION_RE.test(sessionId);
47
+ }
48
+ // Annotate the CommonJS export names for ESM import in node:
49
+ 0 && (module.exports = {
50
+ agentSessionIdFromCliIdentity,
51
+ isValidTeamMachineSessionId,
52
+ teamMachineSessionIdFromCliIdentity
53
+ });