sootsim 0.1.268 → 0.1.270

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 (155) hide show
  1. package/README.md +7 -3
  2. package/detox/index.ts +5 -2
  3. package/dist-cli/bin.js +4 -4
  4. package/dist-cli/chunks/{agent-KQSZFG6R.js → agent-4YXUPSJ2.js} +2 -2
  5. package/dist-cli/chunks/{agent-wrapper-DLDQVS7O.js → agent-wrapper-BMJPWHWK.js} +2 -2
  6. package/dist-cli/chunks/{app-fonts-6XVNNHAB.js → app-fonts-EDRH6ETC.js} +2 -2
  7. package/dist-cli/chunks/{assert-DLGUW4JS.js → assert-CRDV324D.js} +2 -2
  8. package/dist-cli/chunks/{auth-MTSJWWMS.js → auth-WYRQIJEN.js} +2 -2
  9. package/dist-cli/chunks/beta-NBANSL2S.js +2 -0
  10. package/dist-cli/chunks/{camera-MGJUBHWZ.js → camera-5TO6IVBP.js} +3 -3
  11. package/dist-cli/chunks/{chunk-LJGOZ77E.js → chunk-2J3E5TPS.js} +1 -1
  12. package/dist-cli/chunks/{chunk-GUXMUE5A.js → chunk-3VIMSXQZ.js} +2 -2
  13. package/dist-cli/chunks/{chunk-YUDUKMJV.js → chunk-3ZOF2BTJ.js} +1 -1
  14. package/dist-cli/chunks/{chunk-RCU4A7LU.js → chunk-44ISBOEK.js} +3 -3
  15. package/dist-cli/chunks/{chunk-F7DMZRQX.js → chunk-4HPWZVBS.js} +1 -1
  16. package/dist-cli/chunks/{chunk-K5ZMEBMQ.js → chunk-557IYHPC.js} +1 -1
  17. package/dist-cli/chunks/{chunk-RG6QF6DY.js → chunk-5IHDZOMR.js} +1 -1
  18. package/dist-cli/chunks/{chunk-XIBSRCKK.js → chunk-6CI73D3X.js} +2 -2
  19. package/dist-cli/chunks/chunk-6JLIPPNB.js +2 -0
  20. package/dist-cli/chunks/{chunk-YMTVQA6W.js → chunk-74HIBIJQ.js} +4 -4
  21. package/dist-cli/chunks/{chunk-6TXGR4HK.js → chunk-ABSUFSOH.js} +2 -2
  22. package/dist-cli/chunks/{chunk-NPSDN7D7.js → chunk-AG563BSO.js} +2 -2
  23. package/dist-cli/chunks/{chunk-IWJTCFAE.js → chunk-AMA3YGJ5.js} +2 -2
  24. package/dist-cli/chunks/{chunk-EG3JCOGS.js → chunk-AMVYE3F4.js} +2 -2
  25. package/dist-cli/chunks/{chunk-LOOHTTDV.js → chunk-B5IBLYEO.js} +3 -3
  26. package/dist-cli/chunks/{chunk-M2LYCMW4.js → chunk-DCJXHSIA.js} +2 -2
  27. package/dist-cli/chunks/{chunk-ITQ7WKNC.js → chunk-ERXCR7NU.js} +2 -2
  28. package/dist-cli/chunks/{chunk-KR4LGQWN.js → chunk-FCMEOOQE.js} +2 -2
  29. package/dist-cli/chunks/{chunk-YNMYUJYR.js → chunk-FHPXOPMC.js} +2 -2
  30. package/dist-cli/chunks/{chunk-V27FSRID.js → chunk-FNBFRG64.js} +1 -1
  31. package/dist-cli/chunks/{chunk-5JH5F4TM.js → chunk-GAYG7AO4.js} +1 -1
  32. package/dist-cli/chunks/chunk-GQDQO3KU.js +5 -0
  33. package/dist-cli/chunks/{chunk-JERNRAFO.js → chunk-HWGKGIWE.js} +2 -2
  34. package/dist-cli/chunks/{chunk-YLMP3AEX.js → chunk-IIXRM6BB.js} +2 -2
  35. package/dist-cli/chunks/{chunk-EPKHW3XW.js → chunk-LHMVSKKD.js} +3 -3
  36. package/dist-cli/chunks/chunk-M32JVXHU.js +5 -0
  37. package/dist-cli/chunks/{chunk-FGKDYXO3.js → chunk-M5VURHXD.js} +1 -1
  38. package/dist-cli/chunks/{chunk-6YB3URLB.js → chunk-MD24VVKT.js} +2 -2
  39. package/dist-cli/chunks/{chunk-CWC7QMVM.js → chunk-MYBY7OHL.js} +1 -1
  40. package/dist-cli/chunks/{chunk-7XWLSCXZ.js → chunk-NTO6SKS5.js} +1 -1
  41. package/dist-cli/chunks/{chunk-H2WCONSC.js → chunk-OUKH6UGN.js} +1 -1
  42. package/dist-cli/chunks/{chunk-OOVGROTR.js → chunk-PDFKRVDC.js} +1 -1
  43. package/dist-cli/chunks/{chunk-74QJWGDX.js → chunk-SDKIUJUO.js} +2 -2
  44. package/dist-cli/chunks/chunk-SLR3HWMB.js +13 -0
  45. package/dist-cli/chunks/{chunk-WUOPQL2J.js → chunk-SW5HZ5LK.js} +1 -1
  46. package/dist-cli/chunks/{chunk-WT3OYHU7.js → chunk-TIONGRTA.js} +3 -3
  47. package/dist-cli/chunks/{chunk-EH3A54PO.js → chunk-TLNGREAA.js} +2 -2
  48. package/dist-cli/chunks/{chunk-5MIRQ65V.js → chunk-TMWNOQAA.js} +1 -1
  49. package/dist-cli/chunks/{chunk-3MZJ2KVR.js → chunk-TZH4VH32.js} +3 -3
  50. package/dist-cli/chunks/{chunk-FGY5ESGU.js → chunk-UPRCATUH.js} +2 -2
  51. package/dist-cli/chunks/chunk-XTTXSDDA.js +1 -0
  52. package/dist-cli/chunks/{chunk-ZTOWO5CK.js → chunk-YKK2QUGO.js} +1 -1
  53. package/dist-cli/chunks/{chunk-SV6D5FXN.js → chunk-ZTKDHPA6.js} +2 -2
  54. package/dist-cli/chunks/chunk-ZZH2AFPJ.js +1 -0
  55. package/dist-cli/chunks/cli-version-BLKUTVJ2.js +2 -0
  56. package/dist-cli/chunks/{compat-IVBKZVGH.js → compat-IZEDAAUW.js} +3 -3
  57. package/dist-cli/chunks/{config-PQ3KBTIM.js → config-I4CXZ6M7.js} +2 -2
  58. package/dist-cli/chunks/{control-BKTYM5XP.js → control-DVF7UL5D.js} +2 -2
  59. package/dist-cli/chunks/daemon-FPKQPSSY.js +2 -0
  60. package/dist-cli/chunks/{debug-HRR2LK2J.js → debug-5X2F2WRP.js} +3 -3
  61. package/dist-cli/chunks/{desktop-466O4AQA.js → desktop-JHEYQZGF.js} +3 -3
  62. package/dist-cli/chunks/{detox-UH44KHQJ.js → detox-W64UENQG.js} +2 -2
  63. package/dist-cli/chunks/{device-FZLXTC3W.js → device-ZBSW2EHS.js} +2 -2
  64. package/dist-cli/chunks/{diagnose-RJMRI27P.js → diagnose-WER4X3P5.js} +2 -2
  65. package/dist-cli/chunks/drivers-6P53DLMM.js +2 -0
  66. package/dist-cli/chunks/{film-VL66UAM3.js → film-TIXNUTR6.js} +3 -3
  67. package/dist-cli/chunks/flow-53XFDYLL.js +2 -0
  68. package/dist-cli/chunks/help-MPYJLD7I.js +2 -0
  69. package/dist-cli/chunks/{hidden-runtime-alias-3ZAR7GCH.js → hidden-runtime-alias-R3JH3INM.js} +2 -2
  70. package/dist-cli/chunks/{home-paths-S2GRJWV3.js → home-paths-CNNARPCT.js} +2 -2
  71. package/dist-cli/chunks/inspect-JBDDYUA5.js +2 -0
  72. package/dist-cli/chunks/install-desktop-BBP7AMK4.js +2 -0
  73. package/dist-cli/chunks/{login-TR3YAEA2.js → login-6NCCZ3CZ.js} +4 -4
  74. package/dist-cli/chunks/{logout-WPY2DOYZ.js → logout-C4VKXUH4.js} +2 -2
  75. package/dist-cli/chunks/{maestro-DSG7V2BA.js → maestro-ZRGFQ3MV.js} +3 -3
  76. package/dist-cli/chunks/{maestro-generate-6KA7PCN5.js → maestro-generate-A5XZS5GC.js} +3 -3
  77. package/dist-cli/chunks/{mode-QUYGPNBW.js → mode-IFFZ55HM.js} +2 -2
  78. package/dist-cli/chunks/optional-demo-registry-TQZA65K3.js +2 -0
  79. package/dist-cli/chunks/{perf-ELBRUVVU.js → perf-44KZNTIV.js} +2 -2
  80. package/dist-cli/chunks/{record-6PDTULUN.js → record-GZLZNXYZ.js} +3 -3
  81. package/dist-cli/chunks/runtime-F4FCEPPB.js +2 -0
  82. package/dist-cli/chunks/{screenshot-command-E2A4VY6D.js → screenshot-command-GL3STSWK.js} +3 -3
  83. package/dist-cli/chunks/{screenshots-capture-TRCRHK2E.js → screenshots-capture-QSSBWHN6.js} +2 -2
  84. package/dist-cli/chunks/serve-AFK6X2Q3.js +42 -0
  85. package/dist-cli/chunks/{setup-5BHQNK2L.js → setup-DYSDNEUE.js} +3 -3
  86. package/dist-cli/chunks/{skills-NQLI6WXW.js → skills-YXWQ43PZ.js} +2 -2
  87. package/dist-cli/chunks/{storage-SKARYTYK.js → storage-C7IS5GTM.js} +2 -2
  88. package/dist-cli/chunks/store-LVF2C2XZ.js +2 -0
  89. package/dist-cli/chunks/telemetry-5V3OXY6C.js +2 -0
  90. package/dist-cli/chunks/{timeline-DYJ4GKGE.js → timeline-FDTIHQ5V.js} +2 -2
  91. package/dist-cli/chunks/{upgrade-PHUUE5QV.js → upgrade-VRQCFJEI.js} +2 -2
  92. package/dist-cli/chunks/upload-CRCPDN6G.js +2 -0
  93. package/dist-cli/chunks/{version-XQQSXS3E.js → version-MP6NKJ27.js} +2 -2
  94. package/dist-cli/chunks/web-XYPFJHKW.js +2 -0
  95. package/dist-cli/chunks/{what-happened-I2N3FFIV.js → what-happened-IM6UH24Q.js} +2 -2
  96. package/dist-lib/agent-daemon-client.cjs +1 -1
  97. package/dist-lib/agent-events.cjs +1 -1
  98. package/dist-lib/agent-identity.cjs +10 -10
  99. package/dist-lib/agent-sessions.cjs +29 -13
  100. package/dist-lib/attached-projects.cjs +33 -13
  101. package/dist-lib/auth/shared-session.cjs +1 -1
  102. package/dist-lib/backend-origin.cjs +1 -1
  103. package/dist-lib/beta.cjs +1 -1
  104. package/dist-lib/beta.mjs +1 -1
  105. package/dist-lib/bridge-constants.cjs +23 -6
  106. package/dist-lib/cli-constants.cjs +1 -1
  107. package/dist-lib/config.cjs +1 -1
  108. package/dist-lib/detox/index.cjs +6 -4
  109. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  110. package/dist-lib/home-paths.cjs +1 -1
  111. package/dist-lib/host/bridge-host.cjs +110 -54
  112. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  113. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  114. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  115. package/dist-lib/host/websocket-proxy.cjs +1 -1
  116. package/dist-lib/index.cjs +1 -1
  117. package/dist-lib/jump-to-source-babel.cjs +1 -1
  118. package/dist-lib/menu.cjs +1 -1
  119. package/dist-lib/menu.mjs +1 -1
  120. package/dist-lib/metro.cjs +1 -1
  121. package/dist-lib/profiles.cjs +1 -1
  122. package/dist-lib/render-mode.cjs +1 -1
  123. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  124. package/dist-lib/sdk.cjs +1 -1
  125. package/dist-lib/sdk.mjs +1 -1
  126. package/dist-lib/skills.cjs +220 -148
  127. package/dist-lib/vite.cjs +1 -1
  128. package/package.json +1 -1
  129. package/src/agent-daemon-client.ts +2 -2
  130. package/src/agent-identity.ts +7 -5
  131. package/src/attached-projects.ts +35 -11
  132. package/src/bridge-constants.ts +23 -4
  133. package/src/host/agent-host.ts +63 -14
  134. package/src/{agentbus-prompt.ts → team-machine-prompt.ts} +13 -20
  135. package/dist-cli/chunks/beta-7R4DRB3R.js +0 -2
  136. package/dist-cli/chunks/chunk-2LWDKYJ3.js +0 -1
  137. package/dist-cli/chunks/chunk-346C7547.js +0 -2
  138. package/dist-cli/chunks/chunk-CD2GF6PV.js +0 -5
  139. package/dist-cli/chunks/chunk-PN2LR6T4.js +0 -5
  140. package/dist-cli/chunks/chunk-Y3IYHVEX.js +0 -13
  141. package/dist-cli/chunks/chunk-ZHSXFJ7W.js +0 -1
  142. package/dist-cli/chunks/cli-version-362THKXA.js +0 -2
  143. package/dist-cli/chunks/daemon-SCTA3HTZ.js +0 -2
  144. package/dist-cli/chunks/drivers-S7D5OZQN.js +0 -2
  145. package/dist-cli/chunks/flow-IM5OXO5S.js +0 -2
  146. package/dist-cli/chunks/help-G5CN3KXU.js +0 -2
  147. package/dist-cli/chunks/inspect-WI7GXOH5.js +0 -2
  148. package/dist-cli/chunks/install-desktop-PVBWQQHY.js +0 -2
  149. package/dist-cli/chunks/optional-demo-registry-CROVHXTW.js +0 -2
  150. package/dist-cli/chunks/runtime-ITR3EUXS.js +0 -2
  151. package/dist-cli/chunks/serve-JLLSEZDN.js +0 -41
  152. package/dist-cli/chunks/store-VR5QRAYX.js +0 -2
  153. package/dist-cli/chunks/telemetry-PMYZDJGO.js +0 -2
  154. package/dist-cli/chunks/upload-OUKKXVNC.js +0 -2
  155. package/dist-cli/chunks/web-AZI3JODI.js +0 -2
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.1.268 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{C as N,D as F,F as y,Q as T,R as b,S}from"./chunk-FGKDYXO3.js";import{g as A,i as _}from"./chunk-ITQ7WKNC.js";import"./chunk-346C7547.js";import{c as k}from"./chunk-YMTVQA6W.js";import"./chunk-K5ZMEBMQ.js";import"./chunk-RG6QF6DY.js";function O(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--since"&&e+1<n.length){t.push(e,e+1);let s=n[e+1].trim(),l=/^(\d+(?:\.\d+)?)(ms|s|m)?$/.exec(s);if(l){let r=Number(l[1]),u=l[2]??"ms",v=u==="s"?r*1e3:u==="m"?r*6e4:r;return{since:Date.now()-v,consumed:t}}let i=Number(s);if(Number.isFinite(i)&&i>1e12)return{since:i,consumed:t}}return{consumed:t}}function B(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--kinds"&&e+1<n.length)return t.push(e,e+1),{kinds:n[e+1].split(",").map(s=>s.trim()).filter(Boolean),consumed:t};return{consumed:t}}function D(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--limit"&&e+1<n.length){t.push(e,e+1);let s=Number(n[e+1]);if(Number.isFinite(s)&&s>0)return{limit:s,consumed:t}}return{consumed:t}}function x(n){let t=[],e={label:"initial state",events:[],startedAt:n[0]?.t??null};t.push(e);for(let s of n)if(e.events.push(s),s.kind==="screen"||s.kind==="route"){let l=s.data,i=l?.phase;if(!i||i==="enter"||i==="appear"||i==="active"){let r=l?.name||l?.activeName||l?.path||l?.pathname||s.kind;t.length===1&&e.events.length===1?e.label=`${s.kind}: ${r}`:(e={label:`${s.kind}: ${r}`,events:[],startedAt:s.t},t.push(e))}}return t}async function J(n,t){let e=A(n,{port:t.port,stripBooleanFlags:["--summary","--all","--json","--no-advance","--help","-h","--flow","--noisy"],stripValueFlags:["--since","--kinds","--limit"]});(n.includes("--help")||n.includes("-h"))&&(console.log(`
1
+ /*! sootsim v0.1.270 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{C as N,D as F,F as y,Q as T,R as b,S}from"./chunk-M5VURHXD.js";import{g as A,i as _}from"./chunk-ERXCR7NU.js";import"./chunk-6JLIPPNB.js";import{c as k}from"./chunk-74HIBIJQ.js";import"./chunk-557IYHPC.js";import"./chunk-5IHDZOMR.js";function O(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--since"&&e+1<n.length){t.push(e,e+1);let s=n[e+1].trim(),l=/^(\d+(?:\.\d+)?)(ms|s|m)?$/.exec(s);if(l){let r=Number(l[1]),u=l[2]??"ms",v=u==="s"?r*1e3:u==="m"?r*6e4:r;return{since:Date.now()-v,consumed:t}}let i=Number(s);if(Number.isFinite(i)&&i>1e12)return{since:i,consumed:t}}return{consumed:t}}function B(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--kinds"&&e+1<n.length)return t.push(e,e+1),{kinds:n[e+1].split(",").map(s=>s.trim()).filter(Boolean),consumed:t};return{consumed:t}}function D(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--limit"&&e+1<n.length){t.push(e,e+1);let s=Number(n[e+1]);if(Number.isFinite(s)&&s>0)return{limit:s,consumed:t}}return{consumed:t}}function x(n){let t=[],e={label:"initial state",events:[],startedAt:n[0]?.t??null};t.push(e);for(let s of n)if(e.events.push(s),s.kind==="screen"||s.kind==="route"){let l=s.data,i=l?.phase;if(!i||i==="enter"||i==="appear"||i==="active"){let r=l?.name||l?.activeName||l?.path||l?.pathname||s.kind;t.length===1&&e.events.length===1?e.label=`${s.kind}: ${r}`:(e={label:`${s.kind}: ${r}`,events:[],startedAt:s.t},t.push(e))}}return t}async function J(n,t){let e=A(n,{port:t.port,stripBooleanFlags:["--summary","--all","--json","--no-advance","--help","-h","--flow","--noisy"],stripValueFlags:["--since","--kinds","--limit"]});(n.includes("--help")||n.includes("-h"))&&(console.log(`
3
3
  sootsim what-happened \u2014 show recent events from the semantic timeline
4
4
 
5
5
  usage:
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.268 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.270 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.268 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.270 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.268 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.270 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -23,11 +23,11 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
23
23
  var agent_identity_exports = {};
24
24
  __export(agent_identity_exports, {
25
25
  agentSessionIdFromCliIdentity: () => agentSessionIdFromCliIdentity,
26
- agentbusSessionIdFromCliIdentity: () => agentbusSessionIdFromCliIdentity,
27
- isValidAgentbusSessionId: () => isValidAgentbusSessionId
26
+ isValidTeamMachineSessionId: () => isValidTeamMachineSessionId,
27
+ teamMachineSessionIdFromCliIdentity: () => teamMachineSessionIdFromCliIdentity
28
28
  });
29
29
  module.exports = __toCommonJS(agent_identity_exports);
30
- var AGENTBUS_SESSION_RE = /^[A-Za-z0-9._:-]{1,160}$/;
30
+ var TEAM_MACHINE_SESSION_RE = /^[A-Za-z0-9._:-]{1,160}$/;
31
31
  function agentSessionIdFromCliIdentity(identity) {
32
32
  if (!identity) return null;
33
33
  const colon = identity.indexOf(":");
@@ -36,18 +36,18 @@ function agentSessionIdFromCliIdentity(identity) {
36
36
  const value = identity.slice(colon + 1).trim();
37
37
  return source === "SOOTSIM_CLI_IDENTITY" && value ? value : null;
38
38
  }
39
- function agentbusSessionIdFromCliIdentity(identity) {
39
+ function teamMachineSessionIdFromCliIdentity(identity) {
40
40
  if (!identity?.startsWith("AGENTBUS_SESSION:")) return null;
41
41
  const sessionId = identity.slice("AGENTBUS_SESSION:".length).trim();
42
- if (!AGENTBUS_SESSION_RE.test(sessionId)) return null;
42
+ if (!TEAM_MACHINE_SESSION_RE.test(sessionId)) return null;
43
43
  return sessionId;
44
44
  }
45
- function isValidAgentbusSessionId(sessionId) {
46
- return AGENTBUS_SESSION_RE.test(sessionId);
45
+ function isValidTeamMachineSessionId(sessionId) {
46
+ return TEAM_MACHINE_SESSION_RE.test(sessionId);
47
47
  }
48
48
  // Annotate the CommonJS export names for ESM import in node:
49
49
  0 && (module.exports = {
50
50
  agentSessionIdFromCliIdentity,
51
- agentbusSessionIdFromCliIdentity,
52
- isValidAgentbusSessionId
51
+ isValidTeamMachineSessionId,
52
+ teamMachineSessionIdFromCliIdentity
53
53
  });
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.268 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.270 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -243,21 +243,37 @@ function listSessions(projectId) {
243
243
  const all = loadStore().agentSessions;
244
244
  return projectId ? all.filter((s) => s.projectId === projectId) : all;
245
245
  }
246
- function updateSessionStatus(id, patch) {
246
+ function applySessionStatusPatch(existing, patch, now = Date.now()) {
247
+ return {
248
+ ...existing,
249
+ ...patch,
250
+ id: existing.id,
251
+ projectId: existing.projectId,
252
+ createdAt: existing.createdAt,
253
+ lastSeenAt: now
254
+ };
255
+ }
256
+ function updateSessionStatuses(updates) {
257
+ if (updates.length === 0) return;
247
258
  mutateStore((store) => {
248
- const existing = store.agentSessions.find((s) => s.id === id);
249
- if (!existing) return;
250
- const idx = store.agentSessions.indexOf(existing);
251
- store.agentSessions[idx] = {
252
- ...existing,
253
- ...patch,
254
- id: existing.id,
255
- projectId: existing.projectId,
256
- createdAt: existing.createdAt,
257
- lastSeenAt: Date.now()
258
- };
259
+ const now = Date.now();
260
+ const indexById = new Map(
261
+ store.agentSessions.map((session, index) => [session.id, index])
262
+ );
263
+ for (const { id, patch } of updates) {
264
+ const idx = indexById.get(id);
265
+ if (idx === void 0) continue;
266
+ store.agentSessions[idx] = applySessionStatusPatch(
267
+ store.agentSessions[idx],
268
+ patch,
269
+ now
270
+ );
271
+ }
259
272
  });
260
273
  }
274
+ function updateSessionStatus(id, patch) {
275
+ updateSessionStatuses([{ id, patch }]);
276
+ }
261
277
 
262
278
  // src/agent-sessions.ts
263
279
  function sessionDir(sessionId) {
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.268 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.270 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -77,6 +77,7 @@ var init_optional_demo_registry = __esm({
77
77
  var attached_projects_exports = {};
78
78
  __export(attached_projects_exports, {
79
79
  __setUserDataDirForTests: () => __setUserDataDirForTests,
80
+ applySessionStatusPatch: () => applySessionStatusPatch,
80
81
  costThisWeek: () => costThisWeek,
81
82
  deletePreviewAttachment: () => deletePreviewAttachment,
82
83
  deleteProject: () => deleteProject,
@@ -96,6 +97,7 @@ __export(attached_projects_exports, {
96
97
  seedFromDemoAppRegistry: () => seedFromDemoAppRegistry,
97
98
  setUserDataDir: () => setUserDataDir,
98
99
  updateSessionStatus: () => updateSessionStatus,
100
+ updateSessionStatuses: () => updateSessionStatuses,
99
101
  upsertPreviewAttachment: () => upsertPreviewAttachment,
100
102
  upsertProject: () => upsertProject,
101
103
  upsertSession: () => upsertSession
@@ -366,21 +368,37 @@ function listSessions(projectId) {
366
368
  const all = loadStore().agentSessions;
367
369
  return projectId ? all.filter((s) => s.projectId === projectId) : all;
368
370
  }
369
- function updateSessionStatus(id, patch) {
371
+ function applySessionStatusPatch(existing, patch, now = Date.now()) {
372
+ return {
373
+ ...existing,
374
+ ...patch,
375
+ id: existing.id,
376
+ projectId: existing.projectId,
377
+ createdAt: existing.createdAt,
378
+ lastSeenAt: now
379
+ };
380
+ }
381
+ function updateSessionStatuses(updates) {
382
+ if (updates.length === 0) return;
370
383
  mutateStore((store) => {
371
- const existing = store.agentSessions.find((s) => s.id === id);
372
- if (!existing) return;
373
- const idx = store.agentSessions.indexOf(existing);
374
- store.agentSessions[idx] = {
375
- ...existing,
376
- ...patch,
377
- id: existing.id,
378
- projectId: existing.projectId,
379
- createdAt: existing.createdAt,
380
- lastSeenAt: Date.now()
381
- };
384
+ const now = Date.now();
385
+ const indexById = new Map(
386
+ store.agentSessions.map((session, index) => [session.id, index])
387
+ );
388
+ for (const { id, patch } of updates) {
389
+ const idx = indexById.get(id);
390
+ if (idx === void 0) continue;
391
+ store.agentSessions[idx] = applySessionStatusPatch(
392
+ store.agentSessions[idx],
393
+ patch,
394
+ now
395
+ );
396
+ }
382
397
  });
383
398
  }
399
+ function updateSessionStatus(id, patch) {
400
+ updateSessionStatuses([{ id, patch }]);
401
+ }
384
402
  function deleteSession(id) {
385
403
  mutateStore((store) => {
386
404
  store.agentSessions = store.agentSessions.filter((s) => s.id !== id);
@@ -459,6 +477,7 @@ async function seedFromDemoAppRegistry() {
459
477
  // Annotate the CommonJS export names for ESM import in node:
460
478
  0 && (module.exports = {
461
479
  __setUserDataDirForTests,
480
+ applySessionStatusPatch,
462
481
  costThisWeek,
463
482
  deletePreviewAttachment,
464
483
  deleteProject,
@@ -478,6 +497,7 @@ async function seedFromDemoAppRegistry() {
478
497
  seedFromDemoAppRegistry,
479
498
  setUserDataDir,
480
499
  updateSessionStatus,
500
+ updateSessionStatuses,
481
501
  upsertPreviewAttachment,
482
502
  upsertProject,
483
503
  upsertSession
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.268 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.270 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.268 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.270 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/beta.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.268 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.270 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/beta.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.268 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.270 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/beta.ts
4
4
  var IS_BETA = true;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.268 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.270 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -28,7 +28,8 @@ __export(bridge_constants_exports, {
28
28
  resolveSootsimBridgePort: () => resolveSootsimBridgePort,
29
29
  resolveSootsimBridgePortForHttpPort: () => resolveSootsimBridgePortForHttpPort,
30
30
  resolveSootsimBridgePortForRuntimeLocation: () => resolveSootsimBridgePortForRuntimeLocation,
31
- resolveSootsimBridgeWebSocketUrl: () => resolveSootsimBridgeWebSocketUrl
31
+ resolveSootsimBridgeWebSocketUrl: () => resolveSootsimBridgeWebSocketUrl,
32
+ resolveSootsimWebSocketProxyUrl: () => resolveSootsimWebSocketProxyUrl
32
33
  });
33
34
  module.exports = __toCommonJS(bridge_constants_exports);
34
35
  var DEFAULT_SOOTSIM_BRIDGE_PORT = 7668;
@@ -105,16 +106,31 @@ function resolveSootsimBridgePortForRuntimeLocation(input = {}) {
105
106
  if (baseHttpPort === null) return DEFAULT_SOOTSIM_BRIDGE_PORT;
106
107
  return resolveSootsimBridgePortForHttpPort({ httpPort, baseHttpPort });
107
108
  }
108
- function resolveSootsimBridgeWebSocketUrl(input) {
109
+ function resolveSootsimWebSocketProxyUrl(input) {
109
110
  const pageUrl = parseHrefUrl(input.href);
110
111
  if (!pageUrl || pageUrl.protocol !== "http:" && pageUrl.protocol !== "https:") {
111
- throw new Error(`invalid SootSim browser bridge page URL: ${input.href}`);
112
+ throw new Error(`invalid SootSim websocket proxy page URL: ${input.href}`);
113
+ }
114
+ let targetUrl;
115
+ try {
116
+ targetUrl = new URL(input.targetUrl);
117
+ } catch {
118
+ throw new Error(`invalid SootSim websocket proxy target URL: ${input.targetUrl}`);
119
+ }
120
+ if (targetUrl.protocol !== "ws:" && targetUrl.protocol !== "wss:") {
121
+ throw new Error(`invalid SootSim websocket proxy target URL: ${input.targetUrl}`);
112
122
  }
113
123
  const proxyUrl = new URL("/__websocket-proxy", pageUrl);
114
124
  proxyUrl.protocol = pageUrl.protocol === "https:" ? "wss:" : "ws:";
115
- proxyUrl.searchParams.set("url", `ws://localhost:${input.bridgePort}`);
125
+ proxyUrl.searchParams.set("url", input.targetUrl);
116
126
  return proxyUrl.href;
117
127
  }
128
+ function resolveSootsimBridgeWebSocketUrl(input) {
129
+ return resolveSootsimWebSocketProxyUrl({
130
+ targetUrl: `ws://localhost:${input.bridgePort}`,
131
+ href: input.href
132
+ });
133
+ }
118
134
  var SOOTSIM_BRIDGE_SIM_CLOSE_CODE = 4001;
119
135
  var SOOTSIM_BRIDGE_SIM_CLOSE_REASON = "sootsim close";
120
136
  // Annotate the CommonJS export names for ESM import in node:
@@ -125,5 +141,6 @@ var SOOTSIM_BRIDGE_SIM_CLOSE_REASON = "sootsim close";
125
141
  resolveSootsimBridgePort,
126
142
  resolveSootsimBridgePortForHttpPort,
127
143
  resolveSootsimBridgePortForRuntimeLocation,
128
- resolveSootsimBridgeWebSocketUrl
144
+ resolveSootsimBridgeWebSocketUrl,
145
+ resolveSootsimWebSocketProxyUrl
129
146
  });
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.268 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.270 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.268 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.270 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.268 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.270 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -2123,7 +2123,7 @@ var device = {
2123
2123
  //
2124
2124
  // returns paths in stage order; actualMs reports when the snapshot
2125
2125
  // actually fired (typically within a few ms of offsetMs).
2126
- async takeScreenshotStagesFast(namePrefix, stages) {
2126
+ async takeScreenshotStagesFast(namePrefix, stages, options) {
2127
2127
  const page = getPage();
2128
2128
  const frames = await page.evaluate(
2129
2129
  async (input) => {
@@ -2133,7 +2133,9 @@ var device = {
2133
2133
  if (typeof screenshot !== "function") {
2134
2134
  throw new Error("SootSim screenshot bridge is not installed");
2135
2135
  }
2136
- await screenshot({ format: "png" });
2136
+ if (!input.skipWarmup) {
2137
+ await screenshot({ format: "png" });
2138
+ }
2137
2139
  const start = performance.now();
2138
2140
  const snaps = await Promise.all(
2139
2141
  input.stages.map(
@@ -2196,7 +2198,7 @@ var device = {
2196
2198
  }
2197
2199
  return out;
2198
2200
  },
2199
- { stages }
2201
+ { stages, skipWarmup: options?.skipWarmup === true }
2200
2202
  );
2201
2203
  ensureScreenshotDir();
2202
2204
  return frames.map((f) => {
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.268 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.270 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.268 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.270 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;